1 /*
2 * Copyright (c) 2017, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file  cm_global_api.cpp
24 //! \brief Contains implementations of gloabl CM APIs which are OS-agnostic.
25 //!
26 
27 #include "cm_def.h"
28 #include "cm_buffer.h"
29 #include "cm_surface_2d.h"
30 #include "cm_surface_3d.h"
31 #include "cm_kernel.h"
32 #include "cm_task.h"
33 #include "cm_event.h"
34 #include "cm_debug.h"
35 
36 //!
37 //! \brief      Returns the corresponding CM_RETURN_CODE error string.
38 //! \param      [in] errCode
39 //!             CM error code.
40 //! \return     Corresponding error string if valid Code. \n
41 //!             "Internal Error" if invalid.
42 //!
GetCmErrorString(int errCode)43 CM_RT_API const char* GetCmErrorString(int errCode)
44 {
45     if (errCode == CM_SUCCESS)
46     {
47         return nullptr;
48     }
49 
50     static const char *errorStrings[] = {
51 #define ENUM_STRING(e)  #e
52         ENUM_STRING(CM_SUCCESS),
53         ENUM_STRING(CM_FAILURE),
54         ENUM_STRING(CM_NOT_IMPLEMENTED),
55         ENUM_STRING(CM_SURFACE_ALLOCATION_FAILURE),
56         ENUM_STRING(CM_OUT_OF_HOST_MEMORY),
57         ENUM_STRING(CM_SURFACE_FORMAT_NOT_SUPPORTED),
58         ENUM_STRING(CM_EXCEED_SURFACE_AMOUNT),
59         ENUM_STRING(CM_EXCEED_KERNEL_ARG_AMOUNT),
60         ENUM_STRING(CM_EXCEED_KERNEL_ARG_SIZE_IN_BYTE),
61         ENUM_STRING(CM_INVALID_ARG_INDEX),
62         ENUM_STRING(CM_INVALID_ARG_VALUE),
63         ENUM_STRING(CM_INVALID_ARG_SIZE),
64         ENUM_STRING(CM_INVALID_THREAD_INDEX),
65         ENUM_STRING(CM_INVALID_WIDTH),
66         ENUM_STRING(CM_INVALID_HEIGHT),
67         ENUM_STRING(CM_INVALID_DEPTH),
68         ENUM_STRING(CM_INVALID_COMMON_ISA),
69         ENUM_STRING(CM_OPEN_VIDEO_DEVICE_HANDLE_FAILURE),
70         ENUM_STRING( CM_VIDEO_DEVICE_LOCKED),
71         ENUM_STRING(CM_LOCK_VIDEO_DEVICE_FAILURE),
72         ENUM_STRING(CM_EXCEED_SAMPLER_AMOUNT),
73         ENUM_STRING(CM_EXCEED_MAX_KERNEL_PER_ENQUEUE),
74         ENUM_STRING(CM_EXCEED_MAX_KERNEL_SIZE_IN_BYTE),
75         ENUM_STRING(CM_EXCEED_MAX_THREAD_AMOUNT_PER_ENQUEUE),
76         ENUM_STRING(CM_EXCEED_VME_STATE_G6_AMOUNT),
77         ENUM_STRING(CM_INVALID_THREAD_SPACE),
78         ENUM_STRING(CM_EXCEED_MAX_TIMEOUT),
79         ENUM_STRING(CM_JITDLL_LOAD_FAILURE),
80         ENUM_STRING(CM_JIT_COMPILE_FAILURE),
81         ENUM_STRING(CM_JIT_COMPILESIM_FAILURE),
82         ENUM_STRING(CM_INVALID_THREAD_GROUP_SPACE),
83         ENUM_STRING(CM_THREAD_ARG_NOT_ALLOWED),
84         ENUM_STRING(CM_INVALID_GLOBAL_BUFFER_INDEX),
85         ENUM_STRING(CM_INVALID_BUFFER_HANDLER),
86         ENUM_STRING(CM_EXCEED_MAX_SLM_SIZE),
87         ENUM_STRING(CM_JITDLL_OLDER_THAN_ISA),
88         ENUM_STRING(CM_INVALID_HARDWARE_THREAD_NUMBER),
89         ENUM_STRING(CM_GTPIN_INVOKE_FAILURE),
90         ENUM_STRING(CM_INVALIDE_L3_CONFIGURATION),
91         ENUM_STRING(CM_INVALID_TEXTURE2D_USAGE),
92         ENUM_STRING(CM_INTEL_GFX_NOTFOUND),
93         ENUM_STRING(CM_GPUCOPY_INVALID_SYSMEM),
94         ENUM_STRING(CM_GPUCOPY_INVALID_WIDTH),
95         ENUM_STRING(CM_GPUCOPY_INVALID_STRIDE),
96         ENUM_STRING(CM_EVENT_DRIVEN_FAILURE),
97         ENUM_STRING(CM_LOCK_SURFACE_FAIL),
98         ENUM_STRING(CM_INVALID_GENX_BINARY),
99         ENUM_STRING(CM_FEATURE_NOT_SUPPORTED_IN_DRIVER),
100         ENUM_STRING(CM_QUERY_DLL_VERSION_FAILURE),
101         ENUM_STRING(CM_KERNELPAYLOAD_PERTHREADARG_MUTEX_FAIL),
102         ENUM_STRING(CM_KERNELPAYLOAD_PERKERNELARG_MUTEX_FAIL),
103         ENUM_STRING(CM_KERNELPAYLOAD_SETTING_FAILURE),
104         ENUM_STRING(CM_KERNELPAYLOAD_SURFACE_INVALID_BTINDEX),
105         ENUM_STRING(CM_NOT_SET_KERNEL_ARGUMENT),
106         ENUM_STRING(CM_GPUCOPY_INVALID_SURFACES),
107         ENUM_STRING(CM_GPUCOPY_INVALID_SIZE),
108         ENUM_STRING(CM_GPUCOPY_OUT_OF_RESOURCE),
109         ENUM_STRING(CM_INVALID_VIDEO_DEVICE),
110         ENUM_STRING(CM_SURFACE_DELAY_DESTROY),
111         ENUM_STRING(CM_INVALID_VEBOX_STATE),
112         ENUM_STRING(CM_INVALID_VEBOX_SURFACE),
113         ENUM_STRING(CM_FEATURE_NOT_SUPPORTED_BY_HARDWARE),
114         ENUM_STRING(CM_RESOURCE_USAGE_NOT_SUPPORT_READWRITE),
115         ENUM_STRING(CM_MULTIPLE_MIPLEVELS_NOT_SUPPORTED),
116         ENUM_STRING(CM_INVALID_UMD_CONTEXT),
117         ENUM_STRING(CM_INVALID_LIBVA_SURFACE),
118         ENUM_STRING(CM_INVALID_LIBVA_INITIALIZE),
119         ENUM_STRING(CM_KERNEL_THREADSPACE_NOT_SET),
120         ENUM_STRING(CM_INVALID_KERNEL_THREADSPACE),
121         ENUM_STRING(CM_KERNEL_THREADSPACE_THREADS_NOT_ASSOCIATED),
122         ENUM_STRING(CM_KERNEL_THREADSPACE_INTEGRITY_FAILED),
123         ENUM_STRING(CM_INVALID_USERPROVIDED_GENBINARY),
124         ENUM_STRING(CM_INVALID_PRIVATE_DATA),
125         ENUM_STRING(CM_INVALID_MOS_RESOURCE_HANDLE),
126         ENUM_STRING(CM_SURFACE_CACHED),
127         ENUM_STRING(CM_SURFACE_IN_USE),
128         ENUM_STRING(CM_INVALID_GPUCOPY_KERNEL),
129         ENUM_STRING(CM_INVALID_DEPENDENCY_WITH_WALKING_PATTERN),
130         ENUM_STRING(CM_INVALID_MEDIA_WALKING_PATTERN),
131         ENUM_STRING(CM_FAILED_TO_ALLOCATE_SVM_BUFFER),
132         ENUM_STRING(CM_EXCEED_MAX_POWER_OPTION_FOR_PLATFORM),
133         ENUM_STRING(CM_INVALID_KERNEL_THREADGROUPSPACE),
134         ENUM_STRING(CM_INVALID_KERNEL_SPILL_CODE),
135         ENUM_STRING(CM_UMD_DRIVER_NOT_SUPPORTED),
136         ENUM_STRING(CM_INVALID_GPU_FREQUENCY_VALUE),
137         ENUM_STRING(CM_SYSTEM_MEMORY_NOT_4KPAGE_ALIGNED),
138         ENUM_STRING(CM_KERNEL_ARG_SETTING_FAILED),
139         ENUM_STRING(CM_NO_AVAILABLE_SURFACE),
140         ENUM_STRING(CM_VA_SURFACE_NOT_SUPPORTED),
141         ENUM_STRING(CM_TOO_MUCH_THREADS),
142         ENUM_STRING(CM_NULL_POINTER),
143         ENUM_STRING(CM_EXCEED_MAX_NUM_2D_ALIASES),
144         ENUM_STRING(CM_INVALID_PARAM_SIZE),
145         ENUM_STRING(CM_GT_UNSUPPORTED),
146         ENUM_STRING(CM_GTPIN_FLAG_NO_LONGER_SUPPORTED),
147         ENUM_STRING(CM_PLATFORM_UNSUPPORTED_FOR_API),
148         ENUM_STRING(CM_TASK_MEDIA_RESET),
149         ENUM_STRING(CM_KERNELPAYLOAD_SAMPLER_INVALID_BTINDEX),
150         ENUM_STRING(CM_EXCEED_MAX_NUM_BUFFER_ALIASES),
151         ENUM_STRING(CM_SYSTEM_MEMORY_NOT_4PIXELS_ALIGNED),
152         ENUM_STRING(CM_FAILED_TO_CREATE_CURBE_SURFACE),
153         ENUM_STRING(CM_INVALID_CAP_NAME),
154         ENUM_STRING(CM_INVALID_USER_GPU_CONTEXT_FOR_QUEUE_EX),
155         ENUM_STRING(CM_INVALID_CREATE_OPTION_FOR_BUFFER_STATELESS),
156         ENUM_STRING(CM_INVALID_KERNEL_ARG_POINTER),
157 #undef ENUM_STRING
158     };
159 
160     const char *errorString = "Internal Error";
161     if ((errCode >= CM_INVALID_KERNEL_ARG_POINTER) && (errCode <= CM_SUCCESS))
162     {
163         errorString = errorStrings[MOS_ABS(errCode)];
164     }
165 
166     return errorString;
167 }
168 
169 using namespace CMRT_UMD;
170 // Surface::GetIndex
CMRT_GetBufferIndex(CmBuffer * pSurface,SurfaceIndex * & pIndex)171 EXTERN_C CM_DRIVER_EXPOSED int CMRT_GetBufferIndex(CmBuffer* pSurface, SurfaceIndex*& pIndex)
172 {
173     CM_CHK_NULL_RETURN_CMERROR(pSurface);
174     return pSurface->GetIndex(pIndex);
175 }
CMRT_GetSurface2DIndex(CmSurface2D * pSurface,SurfaceIndex * & pIndex)176 EXTERN_C CM_DRIVER_EXPOSED int CMRT_GetSurface2DIndex(CmSurface2D* pSurface, SurfaceIndex*& pIndex)
177 {
178     CM_CHK_NULL_RETURN_CMERROR(pSurface);
179     return pSurface->GetIndex(pIndex);
180 }
CMRT_GetSurface3DIndex(CmSurface3D * pSurface,SurfaceIndex * & pIndex)181 EXTERN_C CM_DRIVER_EXPOSED int CMRT_GetSurface3DIndex(CmSurface3D* pSurface, SurfaceIndex*& pIndex)
182 {
183     CM_CHK_NULL_RETURN_CMERROR(pSurface);
184     return pSurface->GetIndex(pIndex);
185 }
186 
187 /// surface read API
CMRT_ReadBuffer(CmBuffer * pBuffer,unsigned char * pSysMem,CmEvent * pEvent,uint64_t sysMemSize=0xFFFFFFFFFFFFFFFFULL)188 EXTERN_C CM_DRIVER_EXPOSED int CMRT_ReadBuffer(CmBuffer* pBuffer, unsigned char* pSysMem, CmEvent* pEvent, uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL)
189 {
190     CM_CHK_NULL_RETURN_CMERROR(pBuffer);
191     return pBuffer->ReadSurface(pSysMem, pEvent, sysMemSize);
192 }
CMRT_ReadSurface2D(CmSurface2D * pSurface,unsigned char * pSysMem,CmEvent * pEvent,uint64_t sysMemSize=0xFFFFFFFFFFFFFFFFULL)193 EXTERN_C CM_DRIVER_EXPOSED int CMRT_ReadSurface2D(CmSurface2D* pSurface, unsigned char* pSysMem, CmEvent* pEvent, uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL)
194 {
195     CM_CHK_NULL_RETURN_CMERROR(pSurface);
196     return pSurface->ReadSurface(pSysMem, pEvent, sysMemSize);
197 }
CMRT_ReadSurface3D(CmSurface3D * pSurface,unsigned char * pSysMem,CmEvent * pEvent,uint64_t sysMemSize=0xFFFFFFFFFFFFFFFFULL)198 EXTERN_C CM_DRIVER_EXPOSED int CMRT_ReadSurface3D(CmSurface3D* pSurface, unsigned char* pSysMem, CmEvent* pEvent, uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL)
199 {
200     CM_CHK_NULL_RETURN_CMERROR(pSurface);
201     return pSurface->ReadSurface(pSysMem, pEvent, sysMemSize);
202 }
203 /// surface write API
CMRT_WriteBuffer(CmBuffer * pBuffer,const unsigned char * pSysMem,CmEvent * pEvent,uint64_t sysMemSize=0xFFFFFFFFFFFFFFFFULL)204 EXTERN_C CM_DRIVER_EXPOSED int CMRT_WriteBuffer(CmBuffer* pBuffer, const unsigned char* pSysMem, CmEvent* pEvent, uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL)
205 {
206     CM_CHK_NULL_RETURN_CMERROR(pBuffer);
207     return pBuffer->WriteSurface(pSysMem, pEvent, sysMemSize);
208 }
CMRT_WriteSurface2D(CmSurface2D * pSurface,unsigned char * pSysMem,CmEvent * pEvent,uint64_t sysMemSize=0xFFFFFFFFFFFFFFFFULL)209 EXTERN_C CM_DRIVER_EXPOSED int CMRT_WriteSurface2D(CmSurface2D* pSurface, unsigned char* pSysMem, CmEvent* pEvent, uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL)
210 {
211     CM_CHK_NULL_RETURN_CMERROR(pSurface);
212     return pSurface->WriteSurface(pSysMem, pEvent, sysMemSize);
213 }
CMRT_WriteSurface3D(CmSurface2D * pSurface,unsigned char * pSysMem,CmEvent * pEvent,uint64_t sysMemSize=0xFFFFFFFFFFFFFFFFULL)214 EXTERN_C CM_DRIVER_EXPOSED int CMRT_WriteSurface3D(CmSurface2D* pSurface, unsigned char* pSysMem, CmEvent* pEvent, uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL)
215 {
216     CM_CHK_NULL_RETURN_CMERROR(pSurface);
217     return pSurface->WriteSurface(pSysMem, pEvent, sysMemSize);
218 }
219 
CMRT_SetKernelArgument(CmKernel * pKernel,uint32_t index,size_t size,const void * pValue)220 EXTERN_C CM_DRIVER_EXPOSED int CMRT_SetKernelArgument(CmKernel* pKernel, uint32_t index, size_t size, const void *pValue)
221 {
222     CM_CHK_NULL_RETURN_CMERROR(pKernel);
223     return pKernel->SetKernelArg(index, size, pValue);
224 }
225 
CMRT_AddKernel(CmTask * pTask,CmKernel * pKernel)226 EXTERN_C CM_DRIVER_EXPOSED int CMRT_AddKernel(CmTask* pTask, CmKernel* pKernel)
227 {
228     CM_CHK_NULL_RETURN_CMERROR(pTask);
229     return pTask->AddKernel(pKernel);
230 }
231 
232 // sync
CMRT_WaitForTaskFinished(CmEvent * pEvent,uint32_t TimeOutMs=2000UL)233 EXTERN_C CM_DRIVER_EXPOSED int CMRT_WaitForTaskFinished(CmEvent* pEvent, uint32_t TimeOutMs = 2000UL)
234 {
235     CM_CHK_NULL_RETURN_CMERROR(pEvent);
236     return pEvent->WaitForTaskFinished(TimeOutMs);
237 }
238 
239