| /* |
| * Copyright (c) 2017, Intel Corporation |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| #include "cm_device.h" |
| #include <cstdarg> |
| #include "cm_debug.h" |
| #include "cm_mem.h" |
| #if USE_EXTENSION_CODE |
| #include "cm_gtpin_external_interface.h" |
| #endif |
| #include "cm_printf_host.h" |
| #include "cm_surface_manager.h" |
| #include "cm_queue.h" |
| #include "cm_perf_statistics.h" |
| #include "cm_timer.h" |
| |
| class CmBuffer; |
| class CmBufferUP; |
| class CmBufferSVM; |
| class CmBufferStateless; |
| |
| #if MDF_PROFILER_ENABLED |
| CmPerfStatistics gCmPerfStatistics; // global instance to record API's perf |
| #endif |
| |
| CM_RT_API int32_t CmDevice_RT::CreateBuffer(uint32_t size, CmBuffer* &buffer) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->CreateBuffer(size, buffer); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateBufferUP(uint32_t size, void* sysMem, CmBufferUP* &buffer) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->CreateBufferUP( size, sysMem, buffer); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroySurface(CmBuffer* &buffer) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->DestroyBuffer(buffer); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroyBufferUP(CmBufferUP* &buffer) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->DestroyBufferUP(buffer); |
| } |
| |
| //! |
| //! Create a CmSurface2D |
| //! Input : |
| //! Surface width, height and format; |
| //! Reference to the pointer to the CmSurface2D . |
| //! Output: |
| //! CM_SUCCESS if the CmSurface2D is successfully created; |
| //! CM_OUT_OF_HOST_MEMORY if out of system memory; |
| //! CM_SURFACE_ALLOCATION_FAILURE if surface creation fails; |
| //! CM_FAILURE otherwise; |
| //!NOTES: general API |
| CM_RT_API int32_t CmDevice_RT::CreateSurface2D(uint32_t width, uint32_t height, CM_SURFACE_FORMAT format, CmSurface2D* & surface ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->CreateSurface2D( width, height, format, surface);; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSurface2DUP( uint32_t width, uint32_t height, CM_SURFACE_FORMAT format, void* sysMem, CmSurface2DUP* &surface ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->CreateSurface2DUP( width, height, format, sysMem, surface); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroySurface2DUP( CmSurface2DUP* &surface) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->DestroySurface2DUP(surface); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroySurface( CmSurface2D* &surface2d) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->DestroySurface(surface2d); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::GetSurface2DInfo( uint32_t width, uint32_t height, CM_SURFACE_FORMAT format, uint32_t & pitch, uint32_t & physicalSize) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_GETSURFACE2DINFO_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_GETSURFACE2DINFO_PARAM ) ); |
| inParam.width = width; |
| inParam.height = height; |
| inParam.format = format; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_GETSURFACE2DINFO, |
| &inParam, sizeof(inParam)); |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| |
| pitch = inParam.pitch; |
| physicalSize = inParam.physicalSize; |
| return CM_SUCCESS; |
| } |
| |
| //! |
| //! Load the code of one or more kernels in common ISA. |
| //! Jit-ting of the common ISA code can happen either in LoadProgram or CreateKernel. |
| //! Jit options set in LoadProgram are for all kernels within the code. |
| //! Jit options set in CreateKernel are for the specific kernel, overwriting the jit options set in program level. LoadProgram can be called multiple times for the same code. |
| //! Jit options is a null terminated string. string length ( excluding the null terminater )shoudl be |
| //! less than 512 (CM_MAX_OPTION_SIZE_IN_BYTE ). Otherwise the option is ignored. |
| //! Each time a now CmProgram object is generated. |
| //! |
| //! Input: |
| //! 1) Pointer pointing to the common ISA code |
| //! 2) code size in byte |
| //! 3) Reference to the pointer to the CmProgram. |
| //! 4) Jit options. This argument is optional. |
| //! Output: |
| //! CM_SUCCESS if the CmProgram is successfully created; |
| //! CM_INVALID_KERNELS if any kernel is invalid; |
| //! CM_OUT_OF_HOST_MEMORY if out of system memory; |
| //! CM_FAILURE otherwise; |
| //! |
| |
| CM_RT_API int32_t CmDevice_RT::LoadProgram( void* commonISACode, const uint32_t size, CmProgram*& program, const char* options ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| if( (commonISACode == nullptr) || (size == 0) ) |
| { |
| CmAssert( 0 ); |
| return CM_INVALID_COMMON_ISA; |
| } |
| |
| return CreateProgram(commonISACode, size, program, options); |
| } |
| |
| int32_t CmDevice_RT::CreateProgram(void* commonISACode, |
| const uint32_t size, |
| CmProgram*& program, |
| const char* options) |
| { |
| CM_LOADPROGRAM_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_LOADPROGRAM_PARAM ) ); |
| inParam.cisaCode = commonISACode; |
| inParam.cisaCodeSize = size; |
| inParam.options = (char *)options; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_LOADPROGRAM, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| |
| program = (CmProgram *)inParam.cmProgramHandle; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroyProgram(CmProgram* & program ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| if( program == nullptr ) |
| { |
| return CM_FAILURE; |
| } |
| |
| CM_DESTROYPROGRAM_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_DESTROYPROGRAM_PARAM ) ); |
| inParam.cmProgramHandle = program; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_DESTROYPROGRAM, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| |
| program = nullptr; |
| |
| return CM_SUCCESS; |
| } |
| |
| //! |
| //! Create a CmKernel_RT. Each kernel can run in multiple threads. |
| //! If CreateKernel is called multiple times using the same CmProgram, |
| //! the same kernel name, and the same options, only in the first time a new CmKernel_RT is generated, |
| //! all following calls only return the existing CmKernel_RT. |
| //! Otherwise, each time a new CmKernel_RT is generated. |
| //! Input : |
| //! 1) CM Program from which the kernel is created |
| //! 2) CM kernel function (genx_main) name |
| //! 3) Reference to the pointer to the CmKernel_RT . |
| //! 4) Jit options for this kernel, overwriting the jit options in |
| //! CmProgram level for this specific kernel. This argument is optional. |
| //! Output: |
| //! CM_SUCCESS if the CmKernel_RT is successfully created; |
| //! CM_OUT_OF_HOST_MEMORY if out of system memory; |
| //! CM_FAILURE otherwise; |
| //! |
| CM_RT_API int32_t CmDevice_RT::CreateKernel( CmProgram* program, const char* kernelName, CmKernel* & kernel, const char* options ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| if(program == nullptr) |
| { |
| CmAssert( 0 ); |
| return CM_INVALID_ARG_VALUE; |
| } |
| |
| CM_CREATEKERNEL_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATEKERNEL_PARAM ) ); |
| inParam.cmProgramHandle = program; |
| inParam.kernelName = (char*)kernelName; |
| inParam.options = (char *)options; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_CREATEKERNEL, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| kernel = (CmKernel *)inParam.cmKernelHandle; // Got Object from CMRT@UMD directly. |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroyKernel( CmKernel*& kernel) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DESTROYKERNEL_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_DESTROYKERNEL_PARAM ) ); |
| inParam.cmKernelHandle = kernel; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_DESTROYKERNEL, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| kernel = nullptr; |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateTask(CmTask *& task) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_CREATETASK_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATETASK_PARAM ) ); |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_CREATETASK, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| task = (CmTask *)inParam.cmTaskHandle; |
| |
| #if USE_EXTENSION_CODE |
| GTPIN_MAKER_FUNCTION(CmrtCodeMarkerForGTPin_CreateTask(this, task)); |
| #endif |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroyTask( CmTask*& task) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| #if USE_EXTENSION_CODE |
| GTPIN_MAKER_FUNCTION(CmrtCodeMarkerForGTPin_DestroyTask(this, task)); |
| #endif |
| |
| CM_DESTROYTASK_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_DESTROYTASK_PARAM ) ); |
| inParam.cmTaskHandle = task; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_DESTROYTASK, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| task = nullptr; |
| |
| return CM_SUCCESS; |
| |
| } |
| |
| //! |
| //! Create a task queue, CmQueue_RT. It is an in-order queue of tasks. Each task can |
| //! have multiple kernels running concurrently, each kernel can run in multiple threads. |
| //! For now only one CmQueue_RT is supported. Trying to create a second CmQueue_RT will fail. |
| //! Input : |
| //! Reference to the pointer to the CmQueue_RT . |
| //! Output: |
| //! CM_SUCCESS if the CmQueue_RT is successfully created; |
| //! CM_OUT_OF_HOST_MEMORY if out of system memory; |
| //! CM_FAILURE otherwise; |
| //! |
| CM_RT_API int32_t CmDevice_RT::CreateQueue(CmQueue* &queue) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_QUEUE_CREATE_OPTION option = CM_DEFAULT_QUEUE_CREATE_OPTION; |
| int32_t result = CreateQueueEx(queue, option); |
| |
| #if USE_EXTENSION_CODE |
| GTPIN_MAKER_FUNCTION(CmrtCodeMarkerForGTPin_CreateQueue(this, queue)); |
| #endif |
| |
| return result; |
| } |
| |
| CM_RT_API int32_t |
| CmDevice_RT::CreateQueueEx(CmQueue* &queue, |
| CM_QUEUE_CREATE_OPTION queueCreateOption) |
| { |
| INSERT_PROFILER_RECORD(); |
| m_criticalSectionQueue.Acquire(); |
| |
| CmQueue_RT *queueRT = nullptr; |
| if (CM_QUEUE_TYPE_RENDER == queueCreateOption.QueueType) |
| { |
| for (auto iter = m_queue.begin(); iter != m_queue.end(); ++iter) |
| { |
| CM_QUEUE_TYPE queueType = (*iter)->GetQueueOption().QueueType; |
| unsigned int gpuContext = (*iter)->GetQueueOption().GPUContext; |
| if (queueType == CM_QUEUE_TYPE_RENDER |
| && gpuContext == queueCreateOption.GPUContext) |
| { |
| queue = (*iter); |
| m_criticalSectionQueue.Release(); |
| return CM_SUCCESS; |
| } |
| } |
| } |
| |
| int32_t result = CmQueue_RT::Create(this, queueRT, queueCreateOption); |
| if (CM_SUCCESS != result || nullptr == queueRT) |
| { |
| CmAssert(0); |
| CmDebugMessage(("Failed to create queue!")); |
| m_criticalSectionQueue.Release(); |
| return result; |
| } |
| m_queue.push_back(queueRT); |
| queue = queueRT; |
| m_criticalSectionQueue.Release(); |
| |
| return result; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateThreadSpace( uint32_t width, uint32_t height, CmThreadSpace* &threadSpace) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_CREATETHREADSPACE_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATETHREADSPACE_PARAM ) ); |
| inParam.tsWidth = width; |
| inParam.tsHeight = height; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_CREATETHREADSPACE, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| threadSpace = (CmThreadSpace *)inParam.cmTsHandle; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroyThreadSpace( CmThreadSpace* &threadSpace) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DESTROYTHREADSPACE_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_DESTROYTHREADSPACE_PARAM ) ); |
| inParam.cmTsHandle = threadSpace; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_DESTROYTHREADSPACE, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| threadSpace = nullptr; |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateVmeSurfaceG7_5( CmSurface2D* currentSurface, |
| CmSurface2D **forwardSurfaceArray, |
| CmSurface2D **backwardSurfaceArray, |
| const uint32_t surfaceCountForward, |
| const uint32_t surfaceCountBackward, |
| SurfaceIndex* & vmeSurfaceIndex ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return CreateVmeSurface( currentSurface, forwardSurfaceArray, backwardSurfaceArray, surfaceCountForward, surfaceCountBackward, vmeSurfaceIndex, CM_FN_CMDEVICE_CREATEVMESURFACEG7_5 ); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroyVmeSurfaceG7_5( SurfaceIndex* & vmeSurfaceIndex ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return DestroyVmeSurface( vmeSurfaceIndex ); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::SetVmeSurfaceStateParam(SurfaceIndex* vmeIndex, CM_VME_SURFACE_STATE_PARAM *surfStateParam) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| if(vmeIndex == nullptr || surfStateParam == nullptr) |
| { |
| CmAssert( 0 ); |
| return CM_INVALID_ARG_VALUE; |
| } |
| |
| CM_CONFIGVMESURFACEDIMENSION_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CONFIGVMESURFACEDIMENSION_PARAM ) ); |
| inParam.cmVmeSurfHandle = (void *)vmeIndex; |
| inParam.surfDimPara = surfStateParam; |
| |
| int32_t result |
| = OSALExtensionExecute(CM_FN_CMDEVICE_CONFIGVMESURFACEDIMENSION, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| |
| return inParam.returnValue; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSampler( const CM_SAMPLER_STATE& samplerState, CmSampler* &sampler ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_CREATESAMPLER_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATESAMPLER_PARAM ) ); |
| inParam.samplerState = samplerState; |
| |
| int32_t result = OSALExtensionExecute(CM_FN_CMDEVICE_CREATESAMPLER, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| sampler = (CmSampler *)inParam.cmSamplerHandle; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSamplerEx( const CM_SAMPLER_STATE_EX& samplerState, CmSampler* &sampler ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_CREATESAMPLER_PARAM_EX inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATESAMPLER_PARAM_EX ) ); |
| inParam.samplerState = samplerState; |
| |
| int32_t result = OSALExtensionExecute(CM_FN_CMDEVICE_CREATESAMPLER_EX, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| sampler = (CmSampler *)inParam.cmSamplerHandle; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroySampler( CmSampler* &sampler ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DESTROYSAMPLER_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_DESTROYSAMPLER_PARAM ) ); |
| inParam.cmSamplerHandle = sampler; |
| |
| int32_t result = OSALExtensionExecute(CM_FN_CMDEVICE_DESTROYSAMPLER, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| sampler = nullptr; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateThreadGroupSpace( uint32_t threadSpaceWidth, uint32_t threadSpaceHeight, uint32_t groupSpaceWidth, uint32_t groupSpaceHeight, CmThreadGroupSpace* &threadGroupSpace) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_CREATETGROUPSPACE_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATETGROUPSPACE_PARAM ) ); |
| inParam.thrdSpaceWidth = threadSpaceWidth; |
| inParam.thrdSpaceHeight = threadSpaceHeight; |
| inParam.thrdSpaceDepth = 1; |
| inParam.grpSpaceWidth = groupSpaceWidth; |
| inParam.grpSpaceHeight = groupSpaceHeight; |
| inParam.grpSpaceDepth = 1; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_CREATETHREADGROUPSPACE, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| threadGroupSpace = (CmThreadGroupSpace *)inParam.cmGrpSpaceHandle; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateThreadGroupSpaceEx(uint32_t threadSpaceWidth, uint32_t threadSpaceHeight, uint32_t threadSpaceDepth, uint32_t groupSpaceWidth, uint32_t groupSpaceHeight, uint32_t groupSpaceDepth, CmThreadGroupSpace* &threadGroupSpace) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_CREATETGROUPSPACE_PARAM inParam; |
| CmSafeMemSet(&inParam, 0, sizeof(CM_CREATETGROUPSPACE_PARAM)); |
| inParam.thrdSpaceWidth = threadSpaceWidth; |
| inParam.thrdSpaceHeight = threadSpaceHeight; |
| inParam.thrdSpaceDepth = threadSpaceDepth; |
| inParam.grpSpaceWidth = groupSpaceWidth; |
| inParam.grpSpaceHeight = groupSpaceHeight; |
| inParam.grpSpaceDepth = groupSpaceDepth; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_CREATETHREADGROUPSPACE, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| threadGroupSpace = (CmThreadGroupSpace *)inParam.cmGrpSpaceHandle; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroyThreadGroupSpace(CmThreadGroupSpace* &threadGroupSpace) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DESTROYTGROPUSPACE_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_DESTROYTGROPUSPACE_PARAM ) ); |
| inParam.cmGrpSpaceHandle = threadGroupSpace; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_DESTROYTHREADGROUPSPACE, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| threadGroupSpace = nullptr; |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void* capValue ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_GETCAPS_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_GETCAPS_PARAM ) ); |
| inParam.capName = capName; |
| inParam.capValueSize = (uint32_t)capValueSize; |
| inParam.capValue = capValue; |
| |
| int32_t result = OSALExtensionExecute(CM_FN_CMDEVICE_GETCAPS, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSurface3D(uint32_t width, uint32_t height, uint32_t depth, CM_SURFACE_FORMAT format, CmSurface3D* & surface ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->CreateSurface3D( width, height, depth, format, surface); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSampler8x8(const CM_SAMPLER_8X8_DESCR &samplerDescriptor, CmSampler8x8* &sampler) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| if((samplerDescriptor.stateType == CM_SAMPLER8X8_AVS && samplerDescriptor.avs == nullptr) || |
| (samplerDescriptor.stateType == CM_SAMPLER8X8_CONV && samplerDescriptor.conv == nullptr) || |
| (samplerDescriptor.stateType == CM_SAMPLER8X8_CONV1DH && samplerDescriptor.conv == nullptr) || |
| (samplerDescriptor.stateType == CM_SAMPLER8X8_CONV1DV && samplerDescriptor.conv == nullptr) || |
| (samplerDescriptor.stateType == CM_SAMPLER8X8_MISC && samplerDescriptor.misc == nullptr) || |
| (samplerDescriptor.stateType == CM_SAMPLER8X8_NONE && samplerDescriptor.conv != nullptr) || |
| sampler != nullptr) |
| { |
| CmAssert( 0 ); |
| return CM_INVALID_ARG_VALUE; |
| } |
| |
| CM_CREATESAMPLER8x8_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATESAMPLER8x8_PARAM ) ); |
| inParam.sampler8x8Desc = samplerDescriptor; |
| |
| int32_t result = OSALExtensionExecute(CM_FN_CMDEVICE_CREATESAMPLER8X8, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| sampler = (CmSampler8x8 *)inParam.cmSampler8x8Handle; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroySampler8x8( CmSampler8x8 *& sampler8x8 ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DESTROYSAMPLER8x8_PARAM inParam; |
| |
| CmSafeMemSet( &inParam, 0, sizeof( CM_DESTROYSAMPLER8x8_PARAM ) ); |
| inParam.cmSampler8x8Handle = sampler8x8; |
| |
| int32_t result = OSALExtensionExecute(CM_FN_CMDEVICE_DESTROYSAMPLER8X8, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| sampler8x8 = nullptr; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSampler8x8Surface(CmSurface2D* surface2d, SurfaceIndex* &sampler8x8SurfaceIndex, CM_SAMPLER8x8_SURFACE surfaceType, CM_SURFACE_ADDRESS_CONTROL_MODE addressControl) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CmSurface2D* currentRT = static_cast< CmSurface2D* >( surface2d ); |
| if( ! currentRT ) { |
| CmAssert( 0 ); |
| return CM_FAILURE; |
| } |
| |
| CM_CREATESAMPLER8x8SURF_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATESAMPLER8x8SURF_PARAM ) ); |
| inParam.cmSurf2DHandle = currentRT; |
| inParam.cmSampler8x8Type = surfaceType; |
| inParam.sampler8x8Mode = addressControl; |
| |
| int32_t result |
| = OSALExtensionExecute(CM_FN_CMDEVICE_CREATESAMPLER8X8SURFACE, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| sampler8x8SurfaceIndex = inParam.cmSurfIndexHandle; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSampler8x8SurfaceEx(CmSurface2D* surface2d, SurfaceIndex* &sampler8x8SurfaceIndex, CM_SAMPLER8x8_SURFACE surfaceType, CM_SURFACE_ADDRESS_CONTROL_MODE addressControl, CM_FLAG* flag) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CmSurface2D* currentRT = static_cast< CmSurface2D* >(surface2d); |
| if (!currentRT) { |
| CmAssert(0); |
| return CM_FAILURE; |
| } |
| |
| CM_CREATESAMPLER8x8SURFEX_PARAM inParam; |
| CmSafeMemSet(&inParam, 0, sizeof(inParam)); |
| inParam.cmSurf2DHandle = currentRT; |
| inParam.cmSampler8x8Type = surfaceType; |
| inParam.sampler8x8Mode = addressControl; |
| inParam.flag = flag; |
| |
| int32_t result |
| = OSALExtensionExecute(CM_FN_CMDEVICE_CREATESAMPLER8X8SURFACE_EX, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| sampler8x8SurfaceIndex = inParam.cmSurfIndexHandle; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSamplerSurface2DEx(CmSurface2D* surface2d, SurfaceIndex* & samplerSurface2dIndex, CM_FLAG* flag) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CmSurface2D* surface2dRT = static_cast< CmSurface2D* >(surface2d); |
| if (!surface2dRT) { |
| CmAssert(0); |
| return CM_INVALID_ARG_VALUE; |
| } |
| |
| CM_CREATESAMPLER2DEX_PARAM inParam; |
| CmSafeMemSet(&inParam, 0, sizeof(inParam)); |
| inParam.cmSurface2DHandle = surface2dRT; |
| inParam.flag = flag; |
| |
| int32_t result |
| = OSALExtensionExecute(CM_FN_CMDEVICE_CREATESAMPLERSURFACE2D_EX, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| samplerSurface2dIndex = (SurfaceIndex*)inParam.samplerSurfIndexHandle; |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroySampler8x8Surface(SurfaceIndex* &sampler8x8SurfaceIndex) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DESTROYSAMPLER8x8SURF_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_DESTROYSAMPLER8x8SURF_PARAM ) ); |
| inParam.cmSurfIndexHandle = sampler8x8SurfaceIndex; |
| |
| int32_t result |
| = OSALExtensionExecute(CM_FN_CMDEVICE_DESTROYSAMPLER8X8SURFACE, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| sampler8x8SurfaceIndex = nullptr; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::SetL3Config(const L3ConfigRegisterValues *registerValues) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| m_l3Config = *registerValues; |
| |
| SetCapsInternal(CAP_L3_CONFIG, sizeof(L3ConfigRegisterValues), &m_l3Config); |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::SetSuggestedL3Config( L3_SUGGEST_CONFIG configIndex) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| //Call into UMD |
| CM_DEVICE_SETSUGGESTEDL3_PARAM setL3IndexParam; |
| CmSafeMemSet(&setL3IndexParam, 0 , sizeof(CM_DEVICE_SETSUGGESTEDL3_PARAM)); |
| setL3IndexParam.l3SuggestConfig = configIndex; |
| |
| int32_t result = OSALExtensionExecute(CM_FN_CMDEVICE_SETSUGGESTEDL3CONFIG, |
| &setL3IndexParam, |
| sizeof(setL3IndexParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(setL3IndexParam.returnValue); |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* capValue ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| switch(capName) |
| { |
| case CAP_HW_THREAD_COUNT: |
| return SetCapsInternal(capName, capValueSize, capValue); |
| |
| default: |
| return CM_INVALID_CAP_NAME; |
| } |
| } |
| |
| int32_t CmDevice_RT::SetCapsInternal(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* capValue) |
| { |
| |
| //Call into UMD |
| CM_DEVICE_SETCAP_PARAM setCapParam; |
| CmSafeMemSet(&setCapParam, 0 , sizeof(setCapParam)); |
| setCapParam.capName = capName; |
| setCapParam.capValueSize = capValueSize; |
| setCapParam.capValue = capValue; |
| |
| int32_t result = OSALExtensionExecute(CM_FN_CMDEVICE_SETCAPS, |
| &setCapParam, sizeof(setCapParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(setCapParam.returnValue); |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSamplerSurface2D(CmSurface2D* surface2d, SurfaceIndex* & samplerSurface2dIndex) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CmSurface2D* surface2dRT = static_cast< CmSurface2D* >( surface2d ); |
| if( ! surface2dRT ) { |
| CmAssert( 0 ); |
| return CM_FAILURE; |
| } |
| |
| CM_CREATESAMPLER2D_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATESAMPLER2D_PARAM ) ); |
| inParam.cmSurface2DHandle = surface2dRT; |
| |
| int32_t result |
| = OSALExtensionExecute(CM_FN_CMDEVICE_CREATESAMPLERSURFACE2D, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| samplerSurface2dIndex = (SurfaceIndex* )inParam.samplerSurfIndexHandle; |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSamplerSurface2DUP(CmSurface2DUP* surface2dUP, SurfaceIndex* & samplerSurface2dUPIndex) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_CREATESAMPLER2DUP_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATESAMPLER2DUP_PARAM ) ); |
| inParam.cmSurface2DHandle = surface2dUP; |
| |
| int32_t result |
| = OSALExtensionExecute(CM_FN_CMDEVICE_CREATESAMPLERSURFACE2DUP, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| samplerSurface2dUPIndex = (SurfaceIndex* )inParam.samplerSurfIndexHandle; |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSamplerSurface3D(CmSurface3D* surface3d, SurfaceIndex* & samplerSurface3dIndex) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_CREATESAMPLER3D_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATESAMPLER3D_PARAM ) ); |
| inParam.cmSurface3DHandle = surface3d; |
| |
| int32_t result |
| = OSALExtensionExecute(CM_FN_CMDEVICE_CREATESAMPLERSURFACE3D, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| samplerSurface3dIndex = (SurfaceIndex* )inParam.samplerSurfIndexHandle; |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroySamplerSurface(SurfaceIndex* & samplerSurfaceIndex) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DESTROYSAMPLERSURF_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_DESTROYSAMPLERSURF_PARAM ) ); |
| inParam.samplerSurfIndexHandle = samplerSurfaceIndex; |
| |
| int32_t result = OSALExtensionExecute(CM_FN_CMDEVICE_DESTROYSAMPLERSURFACE, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT:: DestroySurface( CmSurface3D* &surface3d) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->DestroySurface3D(surface3d); |
| } |
| |
| int32_t CmDevice_RT::CheckDdiVersionSupported(const uint32_t ddiVersion) |
| { |
| if( ( ddiVersion >= CM_DDI_7_2 )) |
| { |
| return CM_SUCCESS; |
| } |
| else |
| { |
| return CM_UMD_DRIVER_NOT_SUPPORTED; |
| } |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::InitPrintBuffer(size_t size) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DEVICE_INIT_PRINT_BUFFER_PARAM initPrintBufferParam; |
| CmSafeMemSet(&initPrintBufferParam, 0, sizeof(CM_DEVICE_INIT_PRINT_BUFFER_PARAM)); |
| initPrintBufferParam.printBufferSize = (uint32_t)size; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_INIT_PRINT_BUFFER, |
| &initPrintBufferParam, |
| sizeof(initPrintBufferParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(initPrintBufferParam.returnValue); |
| |
| return CM_SUCCESS; |
| } |
| |
| //*----------------------------------------------------------------------------- |
| //| Purpose: Flush the print buffer and dump it on the file |
| //| Returns: result of operation. |
| //*----------------------------------------------------------------------------- |
| CM_RT_API int32_t CmDevice_RT::FlushPrintBufferIntoFile(const char *filename) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return FlushPrintBufferInternal(filename); |
| } |
| |
| //*----------------------------------------------------------------------------- |
| //| Purpose: Flush the print buffer and dump it on stdout |
| //| Returns: result of operation. |
| //*----------------------------------------------------------------------------- |
| CM_RT_API int32_t CmDevice_RT::FlushPrintBuffer() |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return FlushPrintBufferInternal(nullptr); |
| } |
| |
| //*----------------------------------------------------------------------------- |
| //| Purpose: Internal function to flush print buffer on stdout or file. |
| //| Returns: result of operation. |
| //*----------------------------------------------------------------------------- |
| int32_t CmDevice_RT::FlushPrintBufferInternal(const char *filename) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DEVICE_FLUSH_PRINT_BUFFER_PARAM flushPrintBufferParam; |
| CmSafeMemSet(&flushPrintBufferParam, 0, sizeof(CM_DEVICE_FLUSH_PRINT_BUFFER_PARAM)); |
| flushPrintBufferParam.fileName = filename; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_FLUSH_PRINT_BUFFER, |
| &flushPrintBufferParam, |
| sizeof(flushPrintBufferParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(flushPrintBufferParam.returnValue); |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateVebox( CmVebox* & vebox ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_CREATEVEBOX_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATEVEBOX_PARAM ) ); |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_CREATEVEBOX, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| vebox = (CmVebox *)inParam.cmVeboxHandle; |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroyVebox( CmVebox* & vebox ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DESTROYVEBOX_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( inParam ) ); |
| inParam.cmVeboxHandle = vebox; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_DESTROYVEBOX, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| vebox = nullptr; |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateBufferSVM(uint32_t size, void* &sysMem, uint32_t accessFlag, CmBufferSVM* & buffer) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->CreateBufferSVM(size, sysMem, accessFlag, buffer); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroyBufferSVM( CmBufferSVM* &buffer) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->DestroyBufferSVM(buffer); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateBufferStateless(size_t size, |
| uint32_t option, |
| void *sysMem, |
| CmBufferStateless *&buffer) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->CreateBufferStateless(size, option, sysMem, buffer); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroyBufferStateless(CmBufferStateless* &buffer) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return m_surfaceManager->DestroyBufferStateless(buffer); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateSurface2DAlias(CmSurface2D* originalSurface, SurfaceIndex* &aliasIndex) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DEVICE_CREATE_SURF2D_ALIAS_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof(inParam) ); |
| |
| inParam.cmSurface2DHandle = originalSurface; |
| inParam.surfaceIndexHandle = aliasIndex; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_CREATESURFACE2D_ALIAS, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| aliasIndex = (SurfaceIndex*)inParam.surfaceIndexHandle; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateBufferAlias(CmBuffer *originalBuffer, SurfaceIndex* &aliasIndex) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DEVICE_CREATE_BUFFER_ALIAS_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof(inParam) ); |
| |
| inParam.cmBufferHandle = originalBuffer; |
| inParam.surfaceIndexHandle = aliasIndex; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_CREATEBUFFER_ALIAS, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| aliasIndex = (SurfaceIndex*)inParam.surfaceIndexHandle; |
| |
| return CM_SUCCESS; |
| } |
| |
| //*----------------------------------------------------------------------------- |
| //| Purpose: Duplicate the kernel member values |
| //| Arguments : |
| //| destKernel [in/out] pointer to output kernel, must be nullptr |
| //| srcKernel [in] pointer to input kernel |
| //| |
| //| Returns: Result of the operation. |
| //*----------------------------------------------------------------------------- |
| CM_RT_API int32_t CmDevice_RT::CloneKernel( CmKernel * &destKernel, CmKernel *srcKernel ) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_CLONE_KERNEL_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CLONE_KERNEL_PARAM ) ); |
| inParam.cmKernelHandleSrc = srcKernel; |
| inParam.cmKernelHandleDest = destKernel; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_CLONEKERNEL, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| destKernel = (CmKernel *)inParam.cmKernelHandleDest; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::CreateHevcVmeSurfaceG10(CmSurface2D* currentSurface, CmSurface2D** forwardSurfaceArray, CmSurface2D** backwardSurfaceArray, const uint32_t surfaceCountForward, const uint32_t surfaceCountBackward, SurfaceIndex* & vmeSurfaceIndex) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return CreateVmeSurface( currentSurface, forwardSurfaceArray, backwardSurfaceArray, surfaceCountForward, surfaceCountBackward, vmeSurfaceIndex, CM_FN_CMDEVICE_CREATEHEVCVMESURFACEG10 ); |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroyHevcVmeSurfaceG10(SurfaceIndex* & vmeSurfaceIndex) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| return DestroyVmeSurface( vmeSurfaceIndex ); |
| } |
| |
| int32_t CmDevice_RT::CreateVmeSurface( CmSurface2D* currentSurface, CmSurface2D** forwardSurfaceArray, CmSurface2D** backwardSurfaceArray, const uint32_t surfaceCountForward, const uint32_t surfaceCountBackward, SurfaceIndex* & vmeSurfaceIndex, CM_FUNCTION_ID functionName) |
| { |
| if ( currentSurface == nullptr ) |
| { |
| CmAssert( 0 ); |
| return CM_NULL_POINTER; |
| } |
| |
| CM_CREATEVMESURFACE_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_CREATEVMESURFACE_PARAM ) ); |
| inParam.cmCurSurfHandle = currentSurface; |
| inParam.cmForwardSurfArray = forwardSurfaceArray; |
| inParam.cmBackwardSurfArray = backwardSurfaceArray; |
| inParam.forwardSurfCount = surfaceCountForward; |
| inParam.backwardSurfCount = surfaceCountBackward; |
| |
| int32_t result = OSALExtensionExecute(functionName, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(result); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| |
| vmeSurfaceIndex = ( SurfaceIndex* )inParam.cmVmeSurfIndexHandle; |
| |
| return CM_SUCCESS; |
| } |
| |
| int32_t CmDevice_RT::DestroyVmeSurface( SurfaceIndex* & vmeSurfaceIndex ) |
| { |
| //Call into driver |
| CM_DESTROYVMESURFACE_PARAM inParam; |
| CmSafeMemSet( &inParam, 0, sizeof( CM_DESTROYVMESURFACE_PARAM ) ); |
| inParam.cmVmeSurfIndexHandle = ( void *)vmeSurfaceIndex; |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_DESTROYVMESURFACE, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| vmeSurfaceIndex = nullptr; |
| |
| return CM_SUCCESS; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::GetVISAVersion(uint32_t& majorVersion, uint32_t& minorVersion) |
| { |
| INSERT_PROFILER_RECORD(); |
| |
| CM_DEVICE_GET_VISA_VERSION_PARAM inParam; |
| CmSafeMemSet(&inParam, 0, sizeof(CM_DEVICE_GET_VISA_VERSION_PARAM)); |
| |
| int32_t hr = OSALExtensionExecute(CM_FN_CMDEVICE_GETVISAVERSION, |
| &inParam, sizeof(inParam)); |
| |
| CHK_FAILURE_RETURN(hr); |
| CHK_FAILURE_RETURN(inParam.returnValue); |
| majorVersion = inParam.majorVersion; |
| minorVersion = inParam.minorVersion; |
| return CM_SUCCESS; |
| } |
| |
| |
| CM_RT_API int32_t |
| CmDevice_RT::CreateSurface2DStateless(uint32_t width, |
| uint32_t height, |
| uint32_t &pitch, |
| CmSurface2DStateless *&pSurface) |
| { |
| return CM_NOT_IMPLEMENTED; |
| } |
| |
| CM_RT_API int32_t CmDevice_RT::DestroySurface2DStateless(CmSurface2DStateless *&pSurface) |
| { |
| return CM_NOT_IMPLEMENTED; |
| } |