xref: /aosp_15_r20/external/intel-media-driver/cmrtlib/agnostic/share/cm_rt_helpers.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
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 #include <cstdio>
24 #include <cstdlib>
25 #include "cm_include.h"
26 #include "cm_def.h"
27 #include "cm_device_base.h"
28 #include "cm_queue_base_hw.h"
29 #include "cm_debug.h"
30 
31 //!
32 //! \brief      Returns the corresponding CM_RETURN_CODE error string
33 //! \param      [in] code
34 //!             CM error code
35 //! \return     Corresponding error string if valid code \n
36 //!             "Internal Error" if invalid
37 //!
GetCmErrorString(int code)38 extern "C" CM_RT_API const char* GetCmErrorString(int code)
39 {
40     if (code == CM_SUCCESS)
41         return nullptr;
42 
43     static const char *errorStrings[] = {
44 #define ENUM_STRING(e)  #e
45         ENUM_STRING(CM_SUCCESS),
46         ENUM_STRING(CM_FAILURE),
47         ENUM_STRING(CM_NOT_IMPLEMENTED),
48         ENUM_STRING(CM_SURFACE_ALLOCATION_FAILURE),
49         ENUM_STRING(CM_OUT_OF_HOST_MEMORY),
50         ENUM_STRING(CM_SURFACE_FORMAT_NOT_SUPPORTED),
51         ENUM_STRING(CM_EXCEED_SURFACE_AMOUNT),
52         ENUM_STRING(CM_EXCEED_KERNEL_ARG_AMOUNT),
53         ENUM_STRING(CM_EXCEED_KERNEL_ARG_SIZE_IN_BYTE),
54         ENUM_STRING(CM_INVALID_ARG_INDEX),
55         ENUM_STRING(CM_INVALID_ARG_VALUE),
56         ENUM_STRING(CM_INVALID_ARG_SIZE),
57         ENUM_STRING(CM_INVALID_THREAD_INDEX),
58         ENUM_STRING(CM_INVALID_WIDTH),
59         ENUM_STRING(CM_INVALID_HEIGHT),
60         ENUM_STRING(CM_INVALID_DEPTH),
61         ENUM_STRING(CM_INVALID_COMMON_ISA),
62         ENUM_STRING(CM_OPEN_VIDEO_DEVICE_FAILURE),
63         ENUM_STRING(CM_VIDEO_DEVICE_LOCKED),
64         ENUM_STRING(CM_LOCK_VIDEO_DEVICE_FAILURE),
65         ENUM_STRING(CM_EXCEED_SAMPLER_AMOUNT),
66         ENUM_STRING(CM_EXCEED_MAX_KERNEL_PER_ENQUEUE),
67         ENUM_STRING(CM_EXCEED_MAX_KERNEL_SIZE_IN_BYTE),
68         ENUM_STRING(CM_EXCEED_MAX_THREAD_AMOUNT_PER_ENQUEUE),
69         ENUM_STRING(CM_EXCEED_VME_STATE_G6_AMOUNT),
70         ENUM_STRING(CM_INVALID_THREAD_SPACE),
71         ENUM_STRING(CM_EXCEED_MAX_TIMEOUT),
72         ENUM_STRING(CM_JITDLL_LOAD_FAILURE),
73         ENUM_STRING(CM_JIT_COMPILE_FAILURE),
74         ENUM_STRING(CM_JIT_COMPILESIM_FAILURE),
75         ENUM_STRING(CM_INVALID_THREAD_GROUP_SPACE),
76         ENUM_STRING(CM_THREAD_ARG_NOT_ALLOWED),
77         ENUM_STRING(CM_INVALID_GLOBAL_BUFFER_INDEX),
78         ENUM_STRING(CM_INVALID_BUFFER_HANDLER),
79         ENUM_STRING(CM_EXCEED_MAX_SLM_SIZE),
80         ENUM_STRING(CM_JITDLL_OLDER_THAN_ISA),
81         ENUM_STRING(CM_INVALID_HARDWARE_THREAD_NUMBER),
82         ENUM_STRING(CM_GTPIN_INVOKE_FAILURE),
83         ENUM_STRING(CM_INVALIDE_L3_CONFIGURATION),
84         ENUM_STRING(CM_INVALID_TEXTURE2D_USAGE),
85         ENUM_STRING(CM_INTEL_GFX_NOTFOUND),
86         ENUM_STRING(CM_GPUCOPY_INVALID_SYSMEM),
87         ENUM_STRING(CM_GPUCOPY_INVALID_WIDTH),
88         ENUM_STRING(CM_GPUCOPY_INVALID_STRIDE),
89         ENUM_STRING(CM_EVENT_DRIVEN_FAILURE),
90         ENUM_STRING(CM_LOCK_SURFACE_FAIL),
91         ENUM_STRING(CM_INVALID_GENX_BINARY),
92         ENUM_STRING(CM_FEATURE_NOT_SUPPORTED_IN_DRIVER),
93         ENUM_STRING(CM_QUERY_DLL_VERSION_FAILURE),
94         ENUM_STRING(CM_KERNELPAYLOAD_PERTHREADARG_MUTEX_FAIL),
95         ENUM_STRING(CM_KERNELPAYLOAD_PERKERNELARG_MUTEX_FAIL),
96         ENUM_STRING(CM_KERNELPAYLOAD_SETTING_FAILURE),
97         ENUM_STRING(CM_KERNELPAYLOAD_SURFACE_INVALID_BTINDEX),
98         ENUM_STRING(CM_NOT_SET_KERNEL_ARGUMENT),
99         ENUM_STRING(CM_GPUCOPY_INVALID_SURFACES),
100         ENUM_STRING(CM_GPUCOPY_INVALID_SIZE),
101         ENUM_STRING(CM_GPUCOPY_OUT_OF_RESOURCE),
102         ENUM_STRING(CM_DEVICE_INVALID_VIDEO_DEVICE),
103         ENUM_STRING(CM_SURFACE_DELAY_DESTROY),
104         ENUM_STRING(CM_INVALID_VEBOX_STATE),
105         ENUM_STRING(CM_INVALID_VEBOX_SURFACE),
106         ENUM_STRING(CM_FEATURE_NOT_SUPPORTED_BY_HARDWARE),
107         ENUM_STRING(CM_RESOURCE_USAGE_NOT_SUPPORT_READWRITE),
108         ENUM_STRING(CM_MULTIPLE_MIPLEVELS_NOT_SUPPORTED),
109         ENUM_STRING(CM_INVALID_UMD_CONTEXT),
110         ENUM_STRING(CM_INVALID_LIBVA_SURFACE),
111         ENUM_STRING(CM_INVALID_LIBVA_INITIALIZE),
112         ENUM_STRING(CM_KERNEL_THREADSPACE_NOT_SET),
113         ENUM_STRING(CM_INVALID_KERNEL_THREADSPACE),
114         ENUM_STRING(CM_KERNEL_THREADSPACE_THREADS_NOT_ASSOCIATED),
115         ENUM_STRING(CM_KERNEL_THREADSPACE_INTEGRITY_FAILED),
116         ENUM_STRING(CM_INVALID_USERPROVIDED_GENBINARY),
117         ENUM_STRING(CM_INVALID_PRIVATE_DATA),
118         ENUM_STRING(CM_INVALID_MOS_RESOURCE_HANDLE),
119         ENUM_STRING(CM_SURFACE_CACHED),
120         ENUM_STRING(CM_SURFACE_IN_USE),
121         ENUM_STRING(CM_INVALID_GPUCOPY_KERNEL),
122         ENUM_STRING(CM_INVALID_DEPENDENCY_WITH_WALKING_PATTERN),
123         ENUM_STRING(CM_INVALID_MEDIA_WALKING_PATTERN),
124         ENUM_STRING(CM_FAILED_TO_ALLOCATE_SVM_BUFFER),
125         ENUM_STRING(CM_EXCEED_MAX_POWER_OPTION_FOR_PLATFORM),
126         ENUM_STRING(CM_INVALID_KERNEL_THREADGROUPSPACE),
127         ENUM_STRING(CM_INVALID_KERNEL_SPILL_CODE),
128         ENUM_STRING(CM_UMD_DRIVER_NOT_SUPPORTED),
129         ENUM_STRING(CM_INVALID_GPU_FREQUENCY_VALUE),
130         ENUM_STRING(CM_SYSTEM_MEMORY_NOT_4KPAGE_ALIGNED),
131         ENUM_STRING(CM_KERNEL_ARG_SETTING_FAILED),
132         ENUM_STRING(CM_NO_AVAILABLE_SURFACE),
133         ENUM_STRING(CM_VA_SURFACE_NOT_SUPPORTED),
134         ENUM_STRING(CM_TOO_MUCH_THREADS),
135         ENUM_STRING(CM_NULL_POINTER),
136         ENUM_STRING(CM_EXCEED_MAX_NUM_2D_ALIASES),
137         ENUM_STRING(CM_INVALID_PARAM_SIZE),
138         ENUM_STRING(CM_GT_UNSUPPORTED),
139         ENUM_STRING(CM_GTPIN_FLAG_NO_LONGER_SUPPORTED),
140         ENUM_STRING(CM_PLATFORM_UNSUPPORTED_FOR_API),
141         ENUM_STRING(CM_TASK_MEDIA_RESET),
142         ENUM_STRING(CM_KERNELPAYLOAD_SAMPLER_INVALID_BTINDEX),
143         ENUM_STRING(CM_EXCEED_MAX_NUM_BUFFER_ALIASES),
144         ENUM_STRING(CM_SYSTEM_MEMORY_NOT_4PIXELS_ALIGNED),
145         ENUM_STRING(CM_FAILED_TO_CREATE_CURBE_SURFACE),
146         ENUM_STRING(CM_INVALID_CAP_NAME),
147         ENUM_STRING(CM_INVALID_PARAM_FOR_CREATE_QUEUE_EX),
148         ENUM_STRING(CM_INVALID_CREATE_OPTION_FOR_BUFFER_STATELESS),
149         ENUM_STRING(CM_INVALID_KERNEL_ARG_POINTER),
150         ENUM_STRING(CM_LOAD_LIBRARY_FAILED),
151 #undef ENUM_STRING
152     };
153 
154     const char *errorString = "Internal Error";
155     if (code >= CM_LOAD_LIBRARY_FAILED && code <= CM_SUCCESS)
156     {
157         errorString = errorStrings[-code];
158     }
159 
160     return errorString;
161 
162 }
163 
164 /// CreateCmDevice and DestroyCmDevice are implemented in other files.
165 /// CMRT_Enqueue is also implemented in another file.
166 
167 /// program and kernel API
CMRT_LoadProgram(CmDevice * pDevice,void * pCommonISACode,const uint32_t size,CmProgram * & pProgram,const char * options)168 EXTERN_C CM_RT_API int CMRT_LoadProgram(CmDevice* pDevice, void* pCommonISACode, const uint32_t size, CmProgram*& pProgram, const char* options)
169 {
170     CHK_NULL_RETURN(pDevice);
171     return pDevice->LoadProgram(pCommonISACode, size, pProgram, options);
172 }
173 
CMRT_CreateKernel(CmDevice * pDevice,CmProgram * pProgram,const char * kernelName,CmKernel * & pKernel,const char * options)174 EXTERN_C CM_RT_API int CMRT_CreateKernel(CmDevice* pDevice, CmProgram* pProgram, const char* kernelName, CmKernel*& pKernel, const char* options)
175 {
176     CHK_NULL_RETURN(pDevice);
177     return pDevice->CreateKernel(pProgram, kernelName, pKernel, options);
178 }
179 
180 /// surface API
CMRT_CreateBuffer(CmDevice * pDevice,uint32_t size,CmBuffer * & pSurface)181 EXTERN_C CM_RT_API int CMRT_CreateBuffer(CmDevice* pDevice, uint32_t size, CmBuffer* & pSurface)
182 {
183     CHK_NULL_RETURN(pDevice);
184     return pDevice->CreateBuffer(size, pSurface);
185 }
186 
CMRT_CreateSurface2D(CmDevice * pDevice,uint32_t width,uint32_t height,CM_SURFACE_FORMAT format,CmSurface2D * & pSurface)187 EXTERN_C CM_RT_API int CMRT_CreateSurface2D(CmDevice* pDevice, uint32_t width, uint32_t height, CM_SURFACE_FORMAT format, CmSurface2D*& pSurface)
188 {
189     CHK_NULL_RETURN(pDevice);
190     return pDevice->CreateSurface2D(width, height, format, pSurface);
191 }
192 
CMRT_CreateSurface3D(CmDevice * pDevice,uint32_t width,uint32_t height,uint32_t depth,CM_SURFACE_FORMAT format,CmSurface3D * & pSurface)193 EXTERN_C CM_RT_API int CMRT_CreateSurface3D(CmDevice* pDevice, uint32_t width, uint32_t height, uint32_t depth, CM_SURFACE_FORMAT format, CmSurface3D*& pSurface)
194 {
195     CHK_NULL_RETURN(pDevice);
196     return pDevice->CreateSurface3D(width, height, depth, format, pSurface);
197 }
198 
CMRT_DestroyBuffer(CmDevice * pDevice,CmBuffer * & pSurface)199 EXTERN_C CM_RT_API int CMRT_DestroyBuffer(CmDevice* pDevice, CmBuffer*& pSurface)
200 {
201     CHK_NULL_RETURN(pDevice);
202     return pDevice->DestroySurface(pSurface);
203 }
204 
CMRT_DestroySurface2D(CmDevice * pDevice,CmSurface2D * & pSurface)205 EXTERN_C CM_RT_API int CMRT_DestroySurface2D(CmDevice* pDevice, CmSurface2D*& pSurface)
206 {
207     CHK_NULL_RETURN(pDevice);
208     return pDevice->DestroySurface(pSurface);
209 }
210 
CMRT_DestroySurface3D(CmDevice * pDevice,CmSurface3D * & pSurface)211 EXTERN_C CM_RT_API int CMRT_DestroySurface3D(CmDevice* pDevice, CmSurface3D*& pSurface)
212 {
213     CHK_NULL_RETURN(pDevice);
214     return pDevice->DestroySurface(pSurface);
215 }
216 
217 // queue, task, threadspace, and event API
CMRT_CreateQueue(CmDevice * pDevice,CmQueue * & pQueue)218 EXTERN_C CM_RT_API int CMRT_CreateQueue(CmDevice* pDevice, CmQueue*& pQueue)
219 {
220     CHK_NULL_RETURN(pDevice);
221     return pDevice->CreateQueue(pQueue);
222 }
223 
CMRT_CreateTask(CmDevice * pDevice,CmTask * & pTask)224 EXTERN_C CM_RT_API int CMRT_CreateTask(CmDevice* pDevice, CmTask*& pTask)
225 {
226     CHK_NULL_RETURN(pDevice);
227     return pDevice->CreateTask(pTask);
228 }
229 
CMRT_CreateThreadSpace(CmDevice * pDevice,uint32_t width,uint32_t height,CmThreadSpace * & pTS)230 EXTERN_C CM_RT_API int CMRT_CreateThreadSpace(CmDevice* pDevice, uint32_t width, uint32_t height, CmThreadSpace*& pTS)
231 {
232     CHK_NULL_RETURN(pDevice);
233     return pDevice->CreateThreadSpace(width, height, pTS);
234 }
235 
CMRT_DestroyProgram(CmDevice * pDevice,CmProgram * & pProgram)236 EXTERN_C CM_RT_API int CMRT_DestroyProgram(CmDevice *pDevice, CmProgram*& pProgram)
237 {
238     CHK_NULL_RETURN(pDevice);
239     return pDevice->DestroyProgram(pProgram);
240 }
241 
CMRT_DestroyTask(CmDevice * pDevice,CmTask * & pTask)242 EXTERN_C CM_RT_API int CMRT_DestroyTask(CmDevice *pDevice, CmTask*& pTask)
243 {
244     CHK_NULL_RETURN(pDevice);
245     return pDevice->DestroyTask(pTask);
246 }
247 
CMRT_DestroyThreadSpace(CmDevice * pDevice,CmThreadSpace * & pTS)248 EXTERN_C CM_RT_API int CMRT_DestroyThreadSpace(CmDevice *pDevice, CmThreadSpace*& pTS)
249 {
250     CHK_NULL_RETURN(pDevice);
251     return pDevice->DestroyThreadSpace(pTS);
252 }
253 
CMRT_DestroyEvent(CmQueue * pQueue,CmEvent * & pEvent)254 EXTERN_C CM_RT_API int CMRT_DestroyEvent(CmQueue *pQueue, CmEvent*& pEvent)
255 {
256     CHK_NULL_RETURN(pQueue);
257     return pQueue->DestroyEvent(pEvent);
258 }
259