1 // Copyright (c) 2018-2020 Intel Corporation
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in all
11 // copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 // SOFTWARE.
20
21
22 #ifndef __CMRT_CROSS_PLATFORM_H__
23 #define __CMRT_CROSS_PLATFORM_H__
24
25 #include "mfx_common.h"
26
27
28 /* Applicable for old and new CMAPI */
29
30 #define CM_LINUX
31
32 #ifndef CM_NOINLINE
33 #ifndef CM_EMU
34 #ifndef __GNUC__
35 #define CM_NOINLINE __declspec(noinline)
36 #else
37 #define CM_NOINLINE __attribute__((noinline))
38 #endif
39 #else
40 #define CM_NOINLINE
41 #endif /* CM_EMU */
42 #endif
43
44 #ifndef CM_INLINE
45 #ifndef __GNUC__
46 #define CM_INLINE __forceinline
47 #else
48 #define CM_INLINE inline __attribute__((always_inline))
49 #endif
50 #endif
51
52 #if defined(__clang__)
53 #pragma clang diagnostic push
54 #pragma clang diagnostic ignored "-Wnon-virtual-dtor"
55
56 #pragma clang diagnostic push
57 #pragma clang diagnostic ignored "-Wunused-private-field"
58 #elif defined(__GNUC__)
59 #pragma GCC diagnostic push
60 #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
61 #endif
62
63 class SurfaceIndex
64 {
65 public:
SurfaceIndex()66 CM_NOINLINE SurfaceIndex() { index = 0; };
SurfaceIndex(const SurfaceIndex & _src)67 CM_NOINLINE SurfaceIndex(const SurfaceIndex& _src) { index = _src.index; };
SurfaceIndex(const unsigned int & _n)68 CM_NOINLINE SurfaceIndex(const unsigned int& _n) { index = _n; };
69 CM_NOINLINE SurfaceIndex& operator = (const unsigned int& _n) { this->index = _n; return *this; };
70 CM_NOINLINE SurfaceIndex& operator + (const unsigned int& _n) { this->index += _n; return *this; };
get_data(void)71 virtual unsigned int get_data(void) { return index; };
72
73 private:
74 unsigned int index;
75 #ifdef CM_LINUX
76 /*
77 * Do not delete this line:
78 * SurfaceIndex is commonly used as CM kernel function's parameter.
79 * It has virutal table and has copy constructor, so GNU calling convetion will pass the object's pointer to kernel function.
80 * This is different with Windows VC++, which always copies the entire object transferred on the callee's stack.
81 *
82 * Depending on the special object size after adding below "extra_byte",
83 * SetKernelArg and SetThreadArg can recognize this object and follow GNU's convention to construct kernel function's stack.
84 */
85 unsigned char extra_byte;
86 #endif
87 };
88
89 class SamplerIndex
90 {
91 public:
SamplerIndex()92 CM_NOINLINE SamplerIndex() { index = 0; };
SamplerIndex(SamplerIndex & _src)93 CM_NOINLINE SamplerIndex(SamplerIndex& _src) { index = _src.get_data(); };
SamplerIndex(const unsigned int & _n)94 CM_NOINLINE SamplerIndex(const unsigned int& _n) { index = _n; };
95 CM_NOINLINE SamplerIndex& operator = (const unsigned int& _n) { this->index = _n; return *this; };
get_data(void)96 virtual unsigned int get_data(void) { return index; };
97
98 private:
99 unsigned int index;
100 #ifdef CM_LINUX
101 /*
102 * Do not delete this line:
103 * Same reason as SurfaceIndex.
104 */
105 unsigned char extra_byte;
106 #endif
107 };
108
109 #if defined(__clang__)
110 #pragma clang diagnostic pop // "-Wunused-private-field"
111 #endif
112
113 #ifdef _MSVC_LANG
114 #pragma warning(push)
115 #pragma warning(disable: 4100)
116 #pragma warning(disable: 4201)
117 #endif
118
119 typedef void * AbstractSurfaceHandle;
120 typedef void * AbstractDeviceHandle;
121
122 struct IDirect3DSurface9;
123 struct IDirect3DDeviceManager9;
124 struct ID3D11Texture2D;
125 struct ID3D11Device;
126
127 //Using CM_DX9 by default
128
129 #ifdef __cplusplus
130 # define EXTERN_C extern "C"
131 #else
132 # define EXTERN_C
133 #endif
134
135 #ifdef CM_LINUX
136 #define LONG INCORRECT_64BIT_LONG
137 #define ULONG INCORRECT_64BIT_ULONG
138 #ifdef __int64
139 #undef __int64
140 #endif
141
142 #include <time.h>
143 #include <va/va.h>
144
145 #define _tmain main
146
147 #include <stdio.h>
148 #include <stdlib.h>
149 #include <stdint.h>
150 #include <math.h>
151 #include <string.h>
152 #include <sys/time.h>
153 #include <pthread.h>
154 #include <x86intrin.h>
155 #include <iostream>
156
157 typedef int BOOL;
158
159 #ifndef FALSE
160 #define FALSE 0
161 #endif
162 #ifndef TRUE
163 #define TRUE 1
164 #endif
165
166 typedef char byte;
167 typedef unsigned char BYTE;
168 typedef unsigned int UINT32;
169 typedef UINT32 DWORD;
170 typedef int INT;
171 typedef unsigned int UINT;
172 typedef signed char INT8;
173 typedef unsigned char UINT8;
174 typedef signed short INT16;
175 typedef unsigned short UINT16;
176 typedef signed int INT32;
177 typedef signed long long INT64;
178 typedef unsigned long long UINT64;
179
180 typedef enum _VACMTEXTUREADDRESS {
181 VACMTADDRESS_WRAP = 1,
182 VACMTADDRESS_MIRROR = 2,
183 VACMTADDRESS_CLAMP = 3,
184 VACMTADDRESS_BORDER = 4,
185 VACMTADDRESS_MIRRORONCE = 5,
186
187 VACMTADDRESS_FORCE_DWORD = 0x7fffffff
188 } VACMTEXTUREADDRESS;
189
190 typedef enum _VACMTEXTUREFILTERTYPE {
191 VACMTEXF_NONE = 0,
192 VACMTEXF_POINT = 1,
193 VACMTEXF_LINEAR = 2,
194 VACMTEXF_ANISOTROPIC = 3,
195 VACMTEXF_FLATCUBIC = 4,
196 VACMTEXF_GAUSSIANCUBIC = 5,
197 VACMTEXF_PYRAMIDALQUAD = 6,
198 VACMTEXF_GAUSSIANQUAD = 7,
199 VACMTEXF_CONVOLUTIONMONO = 8, // Convolution filter for monochrome textures
200 VACMTEXF_FORCE_DWORD = 0x7fffffff
201 } VACMTEXTUREFILTERTYPE;
202
203 #define CM_MAX_TIMEOUT 2
204
205 #define CM_ATTRIBUTE(attribute) __attribute__((attribute))
206
207 typedef enum _VA_CM_FORMAT {
208
209 VA_CM_FMT_UNKNOWN = 0,
210
211 VA_CM_FMT_A8R8G8B8 = 21,
212 VA_CM_FMT_X8R8G8B8 = 22,
213 VA_CM_FMT_A8 = 28,
214 VA_CM_FMT_A2B10G10R10 = 31,
215 VA_CM_FMT_A8B8G8R8 = 32,
216 VA_CM_FMT_A16B16G16R16 = 36,
217 VA_CM_FMT_P8 = 41,
218 VA_CM_FMT_L8 = 50,
219 VA_CM_FMT_A8L8 = 51,
220 VA_CM_FMT_R16U = 57,
221 VA_CM_FMT_V8U8 = 60,
222 VA_CM_FMT_R8U = 62,
223 VA_CM_FMT_D16 = 80,
224 VA_CM_FMT_L16 = 81,
225 VA_CM_FMT_A16B16G16R16F = 113,
226 VA_CM_FMT_R32F = 114,
227 VA_CM_FMT_NV12 = VA_FOURCC_NV12,
228 VA_CM_FMT_UYVY = VA_FOURCC_UYVY,
229 VA_CM_FMT_YUY2 = VA_FOURCC_YUY2,
230 VA_CM_FMT_444P = VA_FOURCC_444P,
231 VA_CM_FMT_411P = VA_FOURCC_411P,
232 VA_CM_FMT_422H = VA_FOURCC_422H,
233 VA_CM_FMT_422V = VA_FOURCC_422V,
234 VA_CM_FMT_IMC3 = VA_FOURCC_IMC3,
235 VA_CM_FMT_YV12 = VA_FOURCC_YV12,
236 VA_CM_FMT_P010 = VA_FOURCC_P010,
237 VA_CM_FMT_P016 = VA_FOURCC_P016,
238
239 VA_CM_FMT_MAX = 0xFFFFFFFF
240 } VA_CM_FORMAT;
241
242 // FIXME temp solution to have same type name as generated by VC++
243 template<typename T>
244 inline const char * CM_TYPE_NAME_UNMANGLED();
245
246 // FIXME need inline below functions, otherwise it will cause multiple definition when ld
247 template<> inline const char * CM_TYPE_NAME_UNMANGLED<char>() { return "char"; }
248 template<> inline const char * CM_TYPE_NAME_UNMANGLED<signed char>() { return "signed char"; }
249 template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned char>() { return "unsigned char"; }
250 template<> inline const char * CM_TYPE_NAME_UNMANGLED<short>() { return "short"; }
251 template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned short>() { return "unsigned short"; }
252 template<> inline const char * CM_TYPE_NAME_UNMANGLED<int>() { return "int"; }
253 template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned int>() { return "unsigned int"; }
254 template<> inline const char * CM_TYPE_NAME_UNMANGLED<long>() { return "long"; }
255 template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned long>() { return "unsigned long"; }
256 template<> inline const char * CM_TYPE_NAME_UNMANGLED<float>() { return "float"; }
257 template<> inline const char * CM_TYPE_NAME_UNMANGLED<double>() { return "double"; }
258
259 #define CM_TYPE_NAME(type) CM_TYPE_NAME_UNMANGLED<type>()
260
CM_ALIGNED_MALLOC(size_t size,size_t alignment)261 inline void * CM_ALIGNED_MALLOC(size_t size, size_t alignment)
262 {
263 return aligned_alloc(alignment, size);
264 }
265
CM_ALIGNED_FREE(void * memory)266 inline void CM_ALIGNED_FREE(void * memory)
267 {
268 free(memory);
269 }
270
271 //multi-thread API:
272 #define THREAD_HANDLE pthread_t
CM_THREAD_CREATE(THREAD_HANDLE * handle,void * start_routine,void * arg)273 inline void CM_THREAD_CREATE(THREAD_HANDLE *handle, void * start_routine, void * arg)
274 {
275 int err = 0;
276 err = pthread_create(handle, NULL, (void * (*)(void *))start_routine, arg);
277 if (err) {
278 printf(" cm create thread failed! \n");
279 exit(-1);
280 }
281 }
CM_THREAD_EXIT(void * retval)282 inline void CM_THREAD_EXIT(void * retval)
283 {
284 pthread_exit(retval);
285 }
286
CM_THREAD_JOIN(THREAD_HANDLE * handle_array,int thread_cnt)287 inline int CM_THREAD_JOIN(THREAD_HANDLE *handle_array, int thread_cnt)
288 {
289 void *tret;
290 for (int i = 0; i < thread_cnt; i++)
291 {
292 pthread_join(handle_array[i], &tret);
293 }
294 return 0;
295 }
296
297 #define CM_SURFACE_FORMAT VA_CM_FORMAT
298
299 #define CM_SURFACE_FORMAT_UNKNOWN VA_CM_FMT_UNKNOWN
300 #define CM_SURFACE_FORMAT_A8R8G8B8 VA_CM_FMT_A8R8G8B8
301 #define CM_SURFACE_FORMAT_X8R8G8B8 VA_CM_FMT_X8R8G8B8
302 #define CM_SURFACE_FORMAT_A8B8G8R8 VA_CM_FMT_A8B8G8R8
303 #define CM_SURFACE_FORMAT_A8 VA_CM_FMT_A8
304 #define CM_SURFACE_FORMAT_P8 VA_CM_FMT_P8
305 #define CM_SURFACE_FORMAT_R32F VA_CM_FMT_R32F
306 #define CM_SURFACE_FORMAT_NV12 VA_CM_FMT_NV12
307 #define CM_SURFACE_FORMAT_UYVY VA_CM_FMT_UYVY
308 #define CM_SURFACE_FORMAT_YUY2 VA_CM_FMT_YUY2
309 #define CM_SURFACE_FORMAT_V8U8 VA_CM_FMT_V8U8
310
311 #define CM_SURFACE_FORMAT_R8_UINT VA_CM_FMT_R8U
312 #define CM_SURFACE_FORMAT_R16_UINT VA_CM_FMT_R16U
313 #define CM_SURFACE_FORMAT_R16_SINT VA_CM_FMT_A8L8
314 #define CM_SURFACE_FORMAT_D16 VA_CM_FMT_D16
315 #define CM_SURFACE_FORMAT_L16 VA_CM_FMT_L16
316 #define CM_SURFACE_FORMAT_A16B16G16R16 VA_CM_FMT_A16B16G16R16
317 #define CM_SURFACE_FORMAT_R10G10B10A2 VA_CM_FMT_A2B10G10R10
318 #define CM_SURFACE_FORMAT_A16B16G16R16F VA_CM_FMT_A16B16G16R16F
319
320 #define CM_SURFACE_FORMAT_444P VA_CM_FMT_444P
321 #define CM_SURFACE_FORMAT_422H VA_CM_FMT_422H
322 #define CM_SURFACE_FORMAT_422V VA_CM_FMT_422V
323 #define CM_SURFACE_FORMAT_411P VA_CM_FMT_411P
324 #define CM_SURFACE_FORMAT_IMC3 VA_CM_FMT_IMC3
325 #define CM_SURFACE_FORMAT_YV12 VA_CM_FMT_YV12
326 #define CM_SURFACE_FORMAT_P010 VA_CM_FMT_P010
327 #define CM_SURFACE_FORMAT_P016 VA_CM_FMT_P016
328
329
330 #define CM_TEXTURE_ADDRESS_TYPE VACMTEXTUREADDRESS
331 #define CM_TEXTURE_ADDRESS_WRAP VACMTADDRESS_WRAP
332 #define CM_TEXTURE_ADDRESS_MIRROR VACMTADDRESS_MIRROR
333 #define CM_TEXTURE_ADDRESS_CLAMP VACMTADDRESS_CLAMP
334 #define CM_TEXTURE_ADDRESS_BORDER VACMTADDRESS_BORDER
335 #define CM_TEXTURE_ADDRESS_MIRRORONCE VACMTADDRESS_MIRRORONCE
336
337 #define CM_TEXTURE_FILTER_TYPE VACMTEXTUREFILTERTYPE
338 #define CM_TEXTURE_FILTER_TYPE_NONE VACMTEXF_NONE
339 #define CM_TEXTURE_FILTER_TYPE_POINT VACMTEXF_POINT
340 #define CM_TEXTURE_FILTER_TYPE_LINEAR VACMTEXF_LINEAR
341 #define CM_TEXTURE_FILTER_TYPE_ANISOTROPIC VACMTEXF_ANISOTROPIC
342 #define CM_TEXTURE_FILTER_TYPE_FLATCUBIC VACMTEXF_FLATCUBIC
343 #define CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC VACMTEXF_GAUSSIANCUBIC
344 #define CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD VACMTEXF_PYRAMIDALQUAD
345 #define CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD VACMTEXF_GAUSSIANQUAD
346 #define CM_TEXTURE_FILTER_TYPE_CONVOLUTIONMONO VACMTEXF_CONVOLUTIONMONO
347
348 /* Surrport for common-used data type */
349 #define _TCHAR char
350 #define __cdecl
351 #ifndef TRUE
352 #define TRUE 1
353 #endif
354
355 typedef int HKEY;
356
357 typedef unsigned int uint;
358 typedef unsigned int* PUINT;
359
360 typedef float FLOAT;
361 typedef unsigned long long DWORDLONG;
362 #ifndef ULONG_PTR
363 #define ULONG_PTR unsigned long
364 #endif
365
366 /* Handle Type */
367 typedef void *HMODULE;
368 typedef void *HINSTANCE;
369 typedef int HANDLE;
370 typedef void *PVOID;
371 typedef int WINBOOL;
372 typedef BOOL *PBOOL;
373 typedef unsigned long ULONG;
374 typedef ULONG *PULONG;
375 typedef unsigned short USHORT;
376 typedef USHORT *PUSHORT;
377 typedef unsigned char UCHAR;
378 typedef UCHAR *PUCHAR;
379 typedef char CHAR;
380 typedef short SHORT;
381 typedef long LONG;
382 typedef double DOUBLE;
383
384 #define __int8 char
385 #define __int16 short
386 #define __int32 int
387 #define __int64 long long
388
389 typedef unsigned short WORD;
390 typedef float FLOAT;
391 typedef FLOAT *PFLOAT;
392 typedef BYTE *PBYTE;
393 typedef int *PINT;
394 typedef WORD *PWORD;
395 typedef DWORD *PDWORD;
396 typedef unsigned int *PUINT;
397 typedef LONG HRESULT;
398 typedef long long LONGLONG;
399
400 typedef union _LARGE_INTEGER {
401 struct {
402 uint32_t LowPart;
403 int32_t HighPart;
404 } u;
405 int64_t QuadPart;
406 } LARGE_INTEGER;
407
408 //Performance
409 EXTERN_C INT QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
410 EXTERN_C INT QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
411
412 struct BITMAPFILEHEADER
413 {
414 WORD bfType;
415 DWORD bfSize;
416 WORD bfReserved1;
417 WORD bfReserved2;
418 DWORD bfOffBits;
419 } __attribute__((packed));
420
421 struct BITMAPINFOHEADER
422 {
423 DWORD biSize;
424 DWORD biWidth;
425 DWORD biHeight;
426 WORD biPlanes;
427 WORD biBitCount;
428 DWORD biCompression;
429 DWORD biSizeImage;
430 DWORD biXPelsPerMeter;
431 DWORD biYPelsPerMeter;
432 DWORD biClrUsed;
433 DWORD biClrImportant;
434 };
435
436 struct RGBQUAD
437 {
438 BYTE rgbBlue;
439 BYTE rgbGreen;
440 BYTE rgbRed;
441 BYTE rgbReserved;
442 };
443
444
445 #ifdef CMRT_EMU
446 // below macro definition is to workaround a bug in g++4.4
447 template<typename kernelFunctionTy>
CM_KERNEL_FUNCTION_TO_POINTER(kernelFunctionTy kernelFunction)448 inline void * CM_KERNEL_FUNCTION_TO_POINTER(kernelFunctionTy kernelFunction)
449 {
450 return (void *)kernelFunction;
451 }
452 #define CM_KERNEL_FUNCTION2(...) #__VA_ARGS__, CM_KERNEL_FUNCTION_TO_POINTER(__VA_ARGS__)
453 #else
454 #define CM_KERNEL_FUNCTION2(...) #__VA_ARGS__
455 #endif
456
457 #ifdef CMRT_EMU
458 // below macro definition is to workaround a bug in g++4.4
459 template<typename kernelFunctionTy>
CM_KERNEL_FUNCTION_POINTER(kernelFunctionTy kernelFunction)460 inline void * CM_KERNEL_FUNCTION_POINTER(kernelFunctionTy kernelFunction)
461 {
462 return (void *)kernelFunction;
463 }
464 #define _NAME(...) #__VA_ARGS__, CM_KERNEL_FUNCTION_POINTER(__VA_ARGS__)
465 #else
466 #define _NAME(...) #__VA_ARGS__
467 #endif
468
469 #else // ifdef CM_LINUX
470
471 #define CM_ATTRIBUTE(attribute) __declspec(attribute)
472 #define CM_TYPE_NAME(type) typeid(type).name()
473
CM_ALIGNED_MALLOC(size_t size,size_t alignment)474 inline void * CM_ALIGNED_MALLOC(size_t size, size_t alignment)
475 {
476 return _aligned_malloc(size, alignment);
477 }
478
CM_ALIGNED_FREE(void * memory)479 inline void CM_ALIGNED_FREE(void * memory)
480 {
481 _aligned_free(memory);
482 }
483
484 #if !CM_METRO
485 //multi-thread API:
486 #define THREAD_HANDLE HANDLE
CM_THREAD_CREATE(THREAD_HANDLE * handle,void * start_routine,void * arg)487 inline void CM_THREAD_CREATE(THREAD_HANDLE *handle, void * start_routine, void * arg)
488 {
489 handle[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, (LPVOID)arg, 0, NULL);
490 }
CM_THREAD_EXIT(void * retval)491 inline void CM_THREAD_EXIT(void * retval)
492 {
493 ExitThread(0);
494 }
495
CM_THREAD_JOIN(THREAD_HANDLE * handle_array,int thread_cnt)496 inline int CM_THREAD_JOIN(THREAD_HANDLE *handle_array, int thread_cnt)
497 {
498 DWORD ret = WaitForMultipleObjects(thread_cnt, handle_array, true, INFINITE);
499 return ret;
500 }
501 #endif
502
503 #define CM_SURFACE_FORMAT D3DFORMAT
504
505 #define CM_SURFACE_FORMAT_UNKNOWN D3DFMT_UNKNOWN
506 #define CM_SURFACE_FORMAT_A8R8G8B8 D3DFMT_A8R8G8B8
507 #define CM_SURFACE_FORMAT_X8R8G8B8 D3DFMT_X8R8G8B8
508 #define CM_SURFACE_FORMAT_A8B8G8R8 D3DFMT_A8B8G8R8
509 #define CM_SURFACE_FORMAT_A8 D3DFMT_A8
510 #define CM_SURFACE_FORMAT_P8 D3DFMT_P8
511 #define CM_SURFACE_FORMAT_R32F D3DFMT_R32F
512 #define CM_SURFACE_FORMAT_NV12 (D3DFORMAT)MAKEFOURCC('N','V','1','2')
513 #define CM_SURFACE_FORMAT_P016 (D3DFORMAT)MAKEFOURCC('P','0','1','6')
514 #define CM_SURFACE_FORMAT_P010 (D3DFORMAT)MAKEFOURCC('P','0','1','0')
515 #define CM_SURFACE_FORMAT_UYVY D3DFMT_UYVY
516 #define CM_SURFACE_FORMAT_YUY2 D3DFMT_YUY2
517 #define CM_SURFACE_FORMAT_V8U8 D3DFMT_V8U8
518 #define CM_SURFACE_FORMAT_A8L8 D3DFMT_A8L8
519 #define CM_SURFACE_FORMAT_D16 D3DFMT_D16
520 #define CM_SURFACE_FORMAT_L16 D3DFMT_L16
521 #define CM_SURFACE_FORMAT_A16B16G16R16 D3DFMT_A16B16G16R16
522 #define CM_SURFACE_FORMAT_A16B16G16R16F D3DFMT_A16B16G16R16F
523 #define CM_SURFACE_FORMAT_R10G10B10A2 D3DFMT_A2B10G10R10
524 #define CM_SURFACE_FORMAT_IRW0 (D3DFORMAT)MAKEFOURCC('I','R','W','0')
525 #define CM_SURFACE_FORMAT_IRW1 (D3DFORMAT)MAKEFOURCC('I','R','W','1')
526 #define CM_SURFACE_FORMAT_IRW2 (D3DFORMAT)MAKEFOURCC('I','R','W','2')
527 #define CM_SURFACE_FORMAT_IRW3 (D3DFORMAT)MAKEFOURCC('I','R','W','3')
528 #define CM_SURFACE_FORMAT_R16_FLOAT D3DFMT_R16F //beryl
529 #define CM_SURFACE_FORMAT_A8P8 D3DFMT_A8P8
530 #define CM_SURFACE_FORMAT_I420 (D3DFORMAT)MAKEFOURCC('I','4','2','0')
531 #define CM_SURFACE_FORMAT_IMC3 (D3DFORMAT)MAKEFOURCC('I','M','C','3')
532 #define CM_SURFACE_FORMAT_IA44 (D3DFORMAT)MAKEFOURCC('I','A','4','4')
533 #define CM_SURFACE_FORMAT_AI44 (D3DFORMAT)MAKEFOURCC('A','I','4','4')
534 #define CM_SURFACE_FORMAT_P216 (D3DFORMAT)MAKEFOURCC('P','2','1','6')
535 #define CM_SURFACE_FORMAT_Y410 (D3DFORMAT)MAKEFOURCC('Y','4','1','0')
536 #define CM_SURFACE_FORMAT_Y416 (D3DFORMAT)MAKEFOURCC('Y','4','1','6')
537 #define CM_SURFACE_FORMAT_Y210 (D3DFORMAT)MAKEFOURCC('Y','2','1','0')
538 #define CM_SURFACE_FORMAT_Y216 (D3DFORMAT)MAKEFOURCC('Y','2','1','6')
539 #define CM_SURFACE_FORMAT_AYUV (D3DFORMAT)MAKEFOURCC('A','Y','U','V')
540 #define CM_SURFACE_FORMAT_YV12 (D3DFORMAT)MAKEFOURCC('Y','V','1','2')
541 #define CM_SURFACE_FORMAT_400P (D3DFORMAT)MAKEFOURCC('4','0','0','P')
542 #define CM_SURFACE_FORMAT_411P (D3DFORMAT)MAKEFOURCC('4','1','1','P')
543 #define CM_SURFACE_FORMAT_411R (D3DFORMAT)MAKEFOURCC('4','1','1','R')
544 #define CM_SURFACE_FORMAT_422H (D3DFORMAT)MAKEFOURCC('4','2','2','H')
545 #define CM_SURFACE_FORMAT_422V (D3DFORMAT)MAKEFOURCC('4','2','2','V')
546 #define CM_SURFACE_FORMAT_444P (D3DFORMAT)MAKEFOURCC('4','4','4','P')
547 #define CM_SURFACE_FORMAT_RGBP (D3DFORMAT)MAKEFOURCC('R','G','B','P')
548 #define CM_SURFACE_FORMAT_BGRP (D3DFORMAT)MAKEFOURCC('B','G','R','P')
549
550 #define CM_TEXTURE_ADDRESS_TYPE D3DTEXTUREADDRESS
551
552 #define CM_TEXTURE_ADDRESS_WRAP D3DTADDRESS_WRAP
553 #define CM_TEXTURE_ADDRESS_MIRROR D3DTADDRESS_MIRROR
554 #define CM_TEXTURE_ADDRESS_CLAMP D3DTADDRESS_CLAMP
555 #define CM_TEXTURE_ADDRESS_BORDER D3DTADDRESS_BORDER
556 #define CM_TEXTURE_ADDRESS_MIRRORONCE D3DTADDRESS_MIRRORONCE
557
558 #define CM_TEXTURE_FILTER_TYPE D3DTEXTUREFILTERTYPE
559
560 #define CM_TEXTURE_FILTER_TYPE_NONE D3DTEXF_NONE
561 #define CM_TEXTURE_FILTER_TYPE_POINT D3DTEXF_POINT
562 #define CM_TEXTURE_FILTER_TYPE_LINEAR D3DTEXF_LINEAR
563 #define CM_TEXTURE_FILTER_TYPE_ANISOTROPIC D3DTEXF_ANISOTROPIC
564 #define CM_TEXTURE_FILTER_TYPE_FLATCUBIC D3DTEXF_FLATCUBIC
565 #define CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC D3DTEXF_GAUSSIANCUBIC
566 #define CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD D3DTEXF_PYRAMIDALQUAD
567 #define CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD D3DTEXF_GAUSSIANQUAD
568 #define CM_TEXTURE_FILTER_TYPE_CONVOLUTIONMONO D3DTEXF_CONVOLUTIONMONO
569
570
571 #ifdef CMRT_EMU
572 // FIXME CM_KERNEL_FUNCTION macro provides wrong kernel name w/ unexplicit template like CM_KERNEL_FUNCTION(kernel<T>)
573 #define CM_KERNEL_FUNCTION2(...) #__VA_ARGS__, (void *)(void (__cdecl *) (void))__VA_ARGS__
574 #else
575 #define CM_KERNEL_FUNCTION2(...) #__VA_ARGS__
576 #endif
577
578 #ifdef CMRT_EMU
579 #define _NAME(...) #__VA_ARGS__, (void (__cdecl *)(void))__VA_ARGS__
580 #else
581 #define _NAME(...) #__VA_ARGS__
582 #endif
583
584 #endif
585
586 #define CM_RT_API
587
588 #define CM_KERNEL_FUNCTION(...) CM_KERNEL_FUNCTION2(__VA_ARGS__)
589
590 #define CM_1_0 100
591 #define CM_2_0 200
592 #define CM_2_1 201
593 #define CM_2_2 202
594 #define CM_2_3 203
595 #define CM_2_4 204
596 #define CM_3_0 300
597 #define CM_4_0 400
598 #define CM_5_0 500
599 #define CM_6_0 600
600 #define CM_7_0 700
601
602 /* Return codes */
603
604 #define CM_SUCCESS 0
605 #define CM_FAILURE -1
606 #define CM_NOT_IMPLEMENTED -2
607 #define CM_SURFACE_ALLOCATION_FAILURE -3
608 #define CM_OUT_OF_HOST_MEMORY -4
609 #define CM_SURFACE_FORMAT_NOT_SUPPORTED -5
610 #define CM_EXCEED_SURFACE_AMOUNT -6
611 #define CM_EXCEED_KERNEL_ARG_AMOUNT -7
612 #define CM_EXCEED_KERNEL_ARG_SIZE_IN_BYTE -8
613 #define CM_INVALID_ARG_INDEX -9
614 #define CM_INVALID_ARG_VALUE -10
615 #define CM_INVALID_ARG_SIZE -11
616 #define CM_INVALID_THREAD_INDEX -12
617 #define CM_INVALID_WIDTH -13
618 #define CM_INVALID_HEIGHT -14
619 #define CM_INVALID_DEPTH -15
620 #define CM_INVALID_COMMON_ISA -16
621 #define CM_D3DDEVICEMGR_OPEN_HANDLE_FAIL -17 // IDirect3DDeviceManager9::OpenDeviceHandle fail
622 #define CM_D3DDEVICEMGR_DXVA2_E_NEW_VIDEO_DEVICE -18 // IDirect3DDeviceManager9::LockDevice return DXVA2_E_VIDEO_DEVICE_LOCKED
623 #define CM_D3DDEVICEMGR_LOCK_DEVICE_FAIL -19 // IDirect3DDeviceManager9::LockDevice return other fail than DXVA2_E_VIDEO_DEVICE_LOCKED
624 #define CM_EXCEED_SAMPLER_AMOUNT -20
625 #define CM_EXCEED_MAX_KERNEL_PER_ENQUEUE -21
626 #define CM_EXCEED_MAX_KERNEL_SIZE_IN_BYTE -22
627 #define CM_EXCEED_MAX_THREAD_AMOUNT_PER_ENQUEUE -23
628 #define CM_EXCEED_VME_STATE_G6_AMOUNT -24
629 #define CM_INVALID_THREAD_SPACE -25
630 #define CM_EXCEED_MAX_TIMEOUT -26
631 #define CM_JITDLL_LOAD_FAILURE -27
632 #define CM_JIT_COMPILE_FAILURE -28
633 #define CM_JIT_COMPILESIM_FAILURE -29
634 #define CM_INVALID_THREAD_GROUP_SPACE -30
635 #define CM_THREAD_ARG_NOT_ALLOWED -31
636 #define CM_INVALID_GLOBAL_BUFFER_INDEX -32
637 #define CM_INVALID_BUFFER_HANDLER -33
638 #define CM_EXCEED_MAX_SLM_SIZE -34
639 #define CM_JITDLL_OLDER_THAN_ISA -35
640 #define CM_INVALID_HARDWARE_THREAD_NUMBER -36
641 #define CM_GTPIN_INVOKE_FAILURE -37
642 #define CM_INVALIDE_L3_CONFIGURATION -38
643 #define CM_INVALID_D3D11_TEXTURE2D_USAGE -39
644 #define CM_INTEL_GFX_NOTFOUND -40
645 #define CM_GPUCOPY_INVALID_SYSMEM -41
646 #define CM_GPUCOPY_INVALID_WIDTH -42
647 #define CM_GPUCOPY_INVALID_STRIDE -43
648 #define CM_EVENT_DRIVEN_FAILURE -44
649 #define CM_LOCK_SURFACE_FAIL -45 // Lock surface failed
650 #define CM_INVALID_GENX_BINARY -46
651 #define CM_FEATURE_NOT_SUPPORTED_IN_DRIVER -47 // driver out-of-sync
652 #define CM_QUERY_DLL_VERSION_FAILURE -48 //Fail in getting DLL file version
653 #define CM_KERNELPAYLOAD_PERTHREADARG_MUTEX_FAIL -49
654 #define CM_KERNELPAYLOAD_PERKERNELARG_MUTEX_FAIL -50
655 #define CM_KERNELPAYLOAD_SETTING_FAILURE -51
656 #define CM_KERNELPAYLOAD_SURFACE_INVALID_BTINDEX -52
657 #define CM_NOT_SET_KERNEL_ARGUMENT -53
658 #define CM_GPUCOPY_INVALID_SURFACES -54
659 #define CM_GPUCOPY_INVALID_SIZE -55
660 #define CM_GPUCOPY_OUT_OF_RESOURCE -56
661 #define CM_DEVICE_INVALID_D3DDEVICE -57
662 #define CM_SURFACE_DELAY_DESTROY -58
663 #define CM_INVALID_VEBOX_STATE -59
664 #define CM_INVALID_VEBOX_SURFACE -60
665 #define CM_FEATURE_NOT_SUPPORTED_BY_HARDWARE -61
666 #define CM_RESOURCE_USAGE_NOT_SUPPORT_READWRITE -62
667 #define CM_MULTIPLE_MIPLEVELS_NOT_SUPPORTED -63
668 #define CM_INVALID_UMD_CONTEXT -64
669 #define CM_INVALID_LIBVA_SURFACE -65
670 #define CM_INVALID_LIBVA_INITIALIZE -66
671 #define CM_KERNEL_THREADSPACE_NOT_SET -67
672 #define CM_INVALID_KERNEL_THREADSPACE -68
673 #define CM_KERNEL_THREADSPACE_THREADS_NOT_ASSOCIATED -69
674 #define CM_KERNEL_THREADSPACE_INTEGRITY_FAILED -70
675 #define CM_INVALID_USERPROVIDED_GENBINARY -71
676 #define CM_INVALID_PRIVATE_DATA -72
677 #define CM_INVALID_MOS_RESOURCE_HANDLE -73
678 #define CM_SURFACE_CACHED -74
679 #define CM_SURFACE_IN_USE -75
680 #define CM_INVALID_GPUCOPY_KERNEL -76
681 #define CM_INVALID_DEPENDENCY_WITH_WALKING_PATTERN -77
682 #define CM_INVALID_MEDIA_WALKING_PATTERN -78
683 #define CM_FAILED_TO_ALLOCATE_SVM_BUFFER -79
684 #define CM_EXCEED_MAX_POWER_OPTION_FOR_PLATFORM -80
685 #define CM_INVALID_KERNEL_THREADGROUPSPACE -81
686 #define CM_INVALID_KERNEL_SPILL_CODE -82
687 #define CM_UMD_DRIVER_NOT_SUPPORTED -83
688 #define CM_INVALID_GPU_FREQUENCY_VALUE -84
689 #define CM_SYSTEM_MEMORY_NOT_4KPAGE_ALIGNED -85
690 #define CM_KERNEL_ARG_SETTING_FAILED -86
691 #define CM_NO_AVAILABLE_SURFACE -87
692 #define CM_VA_SURFACE_NOT_SUPPORTED -88
693 #define CM_TOO_MUCH_THREADS -89
694 #define CM_NULL_POINTER -90
695 #define CM_EXCEED_MAX_NUM_2D_ALIASES -91
696 #define CM_INVALID_PARAM_SIZE -92
697 #define CM_GT_UNSUPPORTED -93
698 #define CM_GTPIN_FLAG_NO_LONGER_SUPPORTED -94
699 #define CM_PLATFORM_UNSUPPORTED_FOR_API -95
700 #define CM_TASK_MEDIA_RESET -96
701 #define CM_KERNELPAYLOAD_SAMPLER_INVALID_BTINDEX -97
702 #define CM_EXCEED_MAX_NUM_BUFFER_ALIASES -98
703 #define CM_SYSTEM_MEMORY_NOT_4PIXELS_ALIGNED -99
704 #define CM_FAILED_TO_CREATE_CURBE_SURFACE -100
705 #define CM_INVALID_CAP_NAME -101
706
707 /* End of return codes */
708
709 typedef enum _GPU_PLATFORM {
710 PLATFORM_INTEL_UNKNOWN = 0,
711 PLATFORM_INTEL_SNB = 1, //Sandy Bridge
712 PLATFORM_INTEL_IVB = 2, //Ivy Bridge
713 PLATFORM_INTEL_HSW = 3, //Haswell
714 PLATFORM_INTEL_BDW = 4, //Broadwell
715 PLATFORM_INTEL_VLV = 5, //ValleyView
716 PLATFORM_INTEL_CHV = 6, //CherryView
717 PLATFORM_INTEL_SKL = 7, //SKL
718 PLATFORM_INTEL_BXT = 8, //Broxton
719 PLATFORM_INTEL_CNL = 9, //Cannonlake
720 PLATFORM_INTEL_ICL = 10, //Icelake
721 PLATFORM_INTEL_KBL = 11, //Kabylake
722 PLATFORM_INTEL_GLV = 12, //Glenview
723 PLATFORM_INTEL_ICLLP = 13, //IcelakeLP
724 PLATFORM_INTEL_TGLLP = 15,//TigerLakeLP
725 PLATFORM_INTEL_GLK = 16, //GeminiLake
726 PLATFORM_INTEL_CFL = 17, //CofeeLake
727 PLATFORM_INTEL_RKL = 19, //RocketLake
728 PLATFORM_INTEL_DG1 = 20, //DG1
729 } GPU_PLATFORM;
730
731 //Time in seconds before kernel should timeout
732 #define CM_MAX_TIMEOUT 2
733 //Time in milliseconds before kernel should timeout
734 #define CM_MAX_TIMEOUT_MS CM_MAX_TIMEOUT*1000
735 #define CM_MAX_TIMEOUT_SIM 600000
736
737 typedef enum _CM_STATUS
738 {
739 CM_STATUS_QUEUED = 0,
740 CM_STATUS_FLUSHED = 1,
741 CM_STATUS_FINISHED = 2,
742 CM_STATUS_STARTED = 3
743 } CM_STATUS;
744
745 enum CM_QUEUE_TYPE
746 {
747 CM_QUEUE_TYPE_NONE = 0,
748 CM_QUEUE_TYPE_RENDER = 1,
749 CM_QUEUE_TYPE_COMPUTE = 2,
750 CM_QUEUE_TYPE_VEBOX = 3
751 };
752
753 enum CM_QUEUE_SSEU_USAGE_HINT_TYPE
754 {
755 CM_QUEUE_SSEU_USAGE_HINT_DEFAULT = 0,
756 CM_QUEUE_SSEU_USAGE_HINT_VME = 1
757 };
758 struct CM_QUEUE_CREATE_OPTION
759 {
760 CM_QUEUE_TYPE QueueType : 3;
761 bool RunAloneMode : 1;
762 unsigned int Reserved0 : 3;
763 bool UserGPUContext : 1;
764 unsigned int GPUContext : 8; // 11 - MOS_GPU_CONTEXT_RENDER3 for default, 12 - MOS_GPU_CONTEXT_RENDER4 for second render context handle.
765 CM_QUEUE_SSEU_USAGE_HINT_TYPE SseuUsageHint : 3;
766 unsigned int Reserved2 : 13;
767 };
768 //**********************************************************************
769 // Constants
770 //**********************************************************************
771 const CM_QUEUE_CREATE_OPTION CM_DEFAULT_QUEUE_CREATE_OPTION = { CM_QUEUE_TYPE_RENDER, false, 0x0, false, 11, CM_QUEUE_SSEU_USAGE_HINT_DEFAULT, 0x0 };
772 const CM_QUEUE_CREATE_OPTION CM_VME_QUEUE_CREATE_OPTION = { CM_QUEUE_TYPE_RENDER, false, 0x0, false, 12, CM_QUEUE_SSEU_USAGE_HINT_VME, 0x0 };
773
774
775 typedef struct _CM_SAMPLER_STATE
776 {
777 CM_TEXTURE_FILTER_TYPE minFilterType;
778 CM_TEXTURE_FILTER_TYPE magFilterType;
779 CM_TEXTURE_ADDRESS_TYPE addressU;
780 CM_TEXTURE_ADDRESS_TYPE addressV;
781 CM_TEXTURE_ADDRESS_TYPE addressW;
782 } CM_SAMPLER_STATE;
783
784 typedef enum _CM_DEVICE_CAP_NAME
785 {
786 CAP_KERNEL_COUNT_PER_TASK,
787 CAP_KERNEL_BINARY_SIZE,
788 CAP_SAMPLER_COUNT,
789 CAP_SAMPLER_COUNT_PER_KERNEL,
790 CAP_BUFFER_COUNT,
791 CAP_SURFACE2D_COUNT,
792 CAP_SURFACE3D_COUNT,
793 CAP_SURFACE_COUNT_PER_KERNEL,
794 CAP_ARG_COUNT_PER_KERNEL,
795 CAP_ARG_SIZE_PER_KERNEL,
796 CAP_USER_DEFINED_THREAD_COUNT_PER_TASK,
797 CAP_HW_THREAD_COUNT,
798 CAP_SURFACE2D_FORMAT_COUNT,
799 CAP_SURFACE2D_FORMATS,
800 CAP_SURFACE3D_FORMAT_COUNT,
801 CAP_SURFACE3D_FORMATS,
802 CAP_VME_STATE_COUNT,
803 CAP_GPU_PLATFORM,
804 CAP_GT_PLATFORM,
805 CAP_MIN_FREQUENCY,
806 CAP_MAX_FREQUENCY,
807 CAP_L3_CONFIG,
808 CAP_GPU_CURRENT_FREQUENCY,
809 CAP_USER_DEFINED_THREAD_COUNT_PER_TASK_NO_THREAD_ARG,
810 CAP_USER_DEFINED_THREAD_COUNT_PER_MEDIA_WALKER,
811 CAP_USER_DEFINED_THREAD_COUNT_PER_THREAD_GROUP,
812 CAP_SURFACE2DUP_COUNT,
813 CAP_PLATFORM_INFO,
814 CAP_MAX_BUFFER_SIZE
815 } CM_DEVICE_CAP_NAME;
816
817
818 typedef enum _CM_DEPENDENCY_PATTERN
819 {
820 CM_NONE_DEPENDENCY = 0, //All threads run parallel, scanline dispatch
821 CM_WAVEFRONT = 1,
822 CM_WAVEFRONT26 = 2,
823 CM_VERTICAL_DEPENDENCY = 3,
824 CM_HORIZONTAL_DEPENDENCY = 4,
825 } CM_DEPENDENCY_PATTERN;
826
827 typedef enum _CM_SAMPLER8x8_SURFACE_
828 {
829 CM_AVS_SURFACE = 0,
830 CM_VA_SURFACE = 1
831 }CM_SAMPLER8x8_SURFACE;
832
833 typedef enum _CM_SURFACE_ADDRESS_CONTROL_MODE_
834 {
835 CM_SURFACE_CLAMP = 0,
836 CM_SURFACE_MIRROR = 1
837 }CM_SURFACE_ADDRESS_CONTROL_MODE;
838
839 typedef struct _CM_SURFACE_DETAILS {
840 UINT width;
841 UINT height;
842 UINT depth;
843 CM_SURFACE_FORMAT format;
844 UINT planeIndex;
845 UINT pitch;
846 UINT slicePitch;
847 UINT SurfaceBaseAddress;
848 UINT8 TiledSurface;
849 UINT8 TileWalk;
850 UINT XOffset;
851 UINT YOffset;
852
853 }CM_SURFACE_DETAILS;
854
855 typedef struct _CM_AVS_COEFF_TABLE {
856 float FilterCoeff_0_0;
857 float FilterCoeff_0_1;
858 float FilterCoeff_0_2;
859 float FilterCoeff_0_3;
860 float FilterCoeff_0_4;
861 float FilterCoeff_0_5;
862 float FilterCoeff_0_6;
863 float FilterCoeff_0_7;
864 }CM_AVS_COEFF_TABLE;
865
866 typedef struct _CM_AVS_INTERNEL_COEFF_TABLE {
867 BYTE FilterCoeff_0_0;
868 BYTE FilterCoeff_0_1;
869 BYTE FilterCoeff_0_2;
870 BYTE FilterCoeff_0_3;
871 BYTE FilterCoeff_0_4;
872 BYTE FilterCoeff_0_5;
873 BYTE FilterCoeff_0_6;
874 BYTE FilterCoeff_0_7;
875 }CM_AVS_INTERNEL_COEFF_TABLE;
876
877 typedef struct _CM_CONVOLVE_COEFF_TABLE {
878 float FilterCoeff_0_0;
879 float FilterCoeff_0_1;
880 float FilterCoeff_0_2;
881 float FilterCoeff_0_3;
882 float FilterCoeff_0_4;
883 float FilterCoeff_0_5;
884 float FilterCoeff_0_6;
885 float FilterCoeff_0_7;
886 float FilterCoeff_0_8;
887 float FilterCoeff_0_9;
888 float FilterCoeff_0_10;
889 float FilterCoeff_0_11;
890 float FilterCoeff_0_12;
891 float FilterCoeff_0_13;
892 float FilterCoeff_0_14;
893 float FilterCoeff_0_15;
894 float FilterCoeff_0_16;
895 float FilterCoeff_0_17;
896 float FilterCoeff_0_18;
897 float FilterCoeff_0_19;
898 float FilterCoeff_0_20;
899 float FilterCoeff_0_21;
900 float FilterCoeff_0_22;
901 float FilterCoeff_0_23;
902 float FilterCoeff_0_24;
903 float FilterCoeff_0_25;
904 float FilterCoeff_0_26;
905 float FilterCoeff_0_27;
906 float FilterCoeff_0_28;
907 float FilterCoeff_0_29;
908 float FilterCoeff_0_30;
909 float FilterCoeff_0_31;
910 }CM_CONVOLVE_COEFF_TABLE;
911
912 /*
913 * MISC SAMPLER8x8 State
914 */
915 typedef struct _CM_MISC_STATE {
916 //DWORD 0
917 union {
918 struct {
919 DWORD Row0 : 16;
920 DWORD Reserved : 8;
921 DWORD Width : 4;
922 DWORD Height : 4;
923 };
924 struct {
925 DWORD value;
926 };
927 } DW0;
928
929 //DWORD 1
930 union {
931 struct {
932 DWORD Row1 : 16;
933 DWORD Row2 : 16;
934 };
935 struct {
936 DWORD value;
937 };
938 } DW1;
939
940 //DWORD 2
941 union {
942 struct {
943 DWORD Row3 : 16;
944 DWORD Row4 : 16;
945 };
946 struct {
947 DWORD value;
948 };
949 } DW2;
950
951 //DWORD 3
952 union {
953 struct {
954 DWORD Row5 : 16;
955 DWORD Row6 : 16;
956 };
957 struct {
958 DWORD value;
959 };
960 } DW3;
961
962 //DWORD 4
963 union {
964 struct {
965 DWORD Row7 : 16;
966 DWORD Row8 : 16;
967 };
968 struct {
969 DWORD value;
970 };
971 } DW4;
972
973 //DWORD 5
974 union {
975 struct {
976 DWORD Row9 : 16;
977 DWORD Row10 : 16;
978 };
979 struct {
980 DWORD value;
981 };
982 } DW5;
983
984 //DWORD 6
985 union {
986 struct {
987 DWORD Row11 : 16;
988 DWORD Row12 : 16;
989 };
990 struct {
991 DWORD value;
992 };
993 } DW6;
994
995 //DWORD 7
996 union {
997 struct {
998 DWORD Row13 : 16;
999 DWORD Row14 : 16;
1000 };
1001 struct {
1002 DWORD value;
1003 };
1004 } DW7;
1005 } CM_MISC_STATE;
1006
1007 typedef struct _CM_MISC_STATE_MSG {
1008 //DWORD 0
1009 union {
1010 struct {
1011 DWORD Row0 : 16;
1012 DWORD Reserved : 8;
1013 DWORD Width : 4;
1014 DWORD Height : 4;
1015 };
1016 struct {
1017 DWORD value;
1018 };
1019 }DW0;
1020
1021 //DWORD 1
1022 union {
1023 struct {
1024 DWORD Row1 : 16;
1025 DWORD Row2 : 16;
1026 };
1027 struct {
1028 DWORD value;
1029 };
1030 }DW1;
1031
1032 //DWORD 2
1033 union {
1034 struct {
1035 DWORD Row3 : 16;
1036 DWORD Row4 : 16;
1037 };
1038 struct {
1039 DWORD value;
1040 };
1041 }DW2;
1042
1043 //DWORD 3
1044 union {
1045 struct {
1046 DWORD Row5 : 16;
1047 DWORD Row6 : 16;
1048 };
1049 struct {
1050 DWORD value;
1051 };
1052 }DW3;
1053
1054 //DWORD 4
1055 union {
1056 struct {
1057 DWORD Row7 : 16;
1058 DWORD Row8 : 16;
1059 };
1060 struct {
1061 DWORD value;
1062 };
1063 }DW4;
1064
1065 //DWORD 5
1066 union {
1067 struct {
1068 DWORD Row9 : 16;
1069 DWORD Row10 : 16;
1070 };
1071 struct {
1072 DWORD value;
1073 };
1074 }DW5;
1075
1076 //DWORD 6
1077 union {
1078 struct {
1079 DWORD Row11 : 16;
1080 DWORD Row12 : 16;
1081 };
1082 struct {
1083 DWORD value;
1084 };
1085 }DW6;
1086
1087 //DWORD 7
1088 union {
1089 struct {
1090 DWORD Row13 : 16;
1091 DWORD Row14 : 16;
1092 };
1093 struct {
1094 DWORD value;
1095 };
1096 }DW7;
1097 } CM_MISC_STATE_MSG;
1098
1099 typedef enum _CM_FASTCOPY_OPTION
1100 {
1101 CM_FASTCOPY_OPTION_NONBLOCKING = 0x00,
1102 CM_FASTCOPY_OPTION_BLOCKING = 0x01
1103 } CM_FASTCOPY_OPTION;
1104
1105 /* End of Applicable for old and new CMAPI */
1106
1107
1108 #ifdef CMAPIUPDATE
1109
1110 #include <cstdint>
1111 #include <cstddef>
1112
1113 #define CM_MIN_SURF_WIDTH 1
1114 #define CM_MIN_SURF_HEIGHT 1
1115 #define CM_MIN_SURF_DEPTH 2
1116
1117 #define CM_MAX_1D_SURF_WIDTH 0X40000000 // 2^30
1118
1119 //IVB+
1120 #define CM_MAX_2D_SURF_WIDTH 16384
1121 #define CM_MAX_2D_SURF_HEIGHT 16384
1122
1123 #define CM_MAX_3D_SURF_WIDTH 2048
1124 #define CM_MAX_3D_SURF_HEIGHT 2048
1125 #define CM_MAX_3D_SURF_DEPTH 2048
1126
1127 #define CM_MAX_OPTION_SIZE_IN_BYTE 512
1128 #define CM_MAX_KERNEL_NAME_SIZE_IN_BYTE 256
1129 #define CM_MAX_ISA_FILE_NAME_SIZE_IN_BYTE 256
1130
1131 #define CM_MAX_THREADSPACE_WIDTH_FOR_MW 511
1132 #define CM_MAX_THREADSPACE_HEIGHT_FOR_MW 511
1133 #define CM_MAX_THREADSPACE_WIDTH_FOR_MO 512
1134 #define CM_MAX_THREADSPACE_HEIGHT_FOR_MO 512
1135 #define CM_MAX_THREADSPACE_WIDTH_SKLUP_FOR_MW 2047
1136 #define CM_MAX_THREADSPACE_HEIGHT_SKLUP_FOR_MW 2047
1137
1138 class CmEvent;
1139 #define CM_CALLBACK __cdecl
1140 typedef void (CM_CALLBACK *callback_function)(CmEvent*, void *);
1141
1142 extern class CmEvent *CM_NO_EVENT;
1143
1144 struct CM_SAMPLER_STATE_EX;
1145
1146 // Cm Device Create Option
1147 #define CM_DEVICE_CREATE_OPTION_DEFAULT 0
1148 #define CM_DEVICE_CREATE_OPTION_SCRATCH_SPACE_DISABLE 1
1149 #define CM_DEVICE_CREATE_OPTION_TDR_DISABLE 64 //Work only for DX11 so far
1150
1151 #define CM_DEVICE_CREATE_OPTION_SURFACE_REUSE_ENABLE 1024
1152
1153 #define CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_OFFSET 22
1154 #define CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_DISENABLE (1 << CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_OFFSET)
1155
1156 struct CM_VME_SURFACE_STATE_PARAM;
1157
1158 #define CM_MAX_DEPENDENCY_COUNT 8
1159 #define CM_NUM_DWORD_FOR_MW_PARAM 16
1160
1161 /**************** L3/Cache ***************/
1162 typedef enum _MEMORY_OBJECT_CONTROL
1163 {
1164 MEMORY_OBJECT_CONTROL_SKL_DEFAULT = 0,
1165 MEMORY_OBJECT_CONTROL_SKL_NO_L3,
1166 MEMORY_OBJECT_CONTROL_SKL_NO_LLC_ELLC,
1167 MEMORY_OBJECT_CONTROL_SKL_NO_LLC,
1168 MEMORY_OBJECT_CONTROL_SKL_NO_ELLC,
1169 MEMORY_OBJECT_CONTROL_SKL_NO_LLC_L3,
1170 MEMORY_OBJECT_CONTROL_SKL_NO_ELLC_L3,
1171 MEMORY_OBJECT_CONTROL_SKL_NO_CACHE,
1172 MEMORY_OBJECT_CONTROL_SKL_COUNT,
1173
1174 MEMORY_OBJECT_CONTROL_CNL_DEFAULT = 0,
1175 MEMORY_OBJECT_CONTROL_CNL_NO_L3,
1176 MEMORY_OBJECT_CONTROL_CNL_NO_LLC_ELLC,
1177 MEMORY_OBJECT_CONTROL_CNL_NO_LLC,
1178 MEMORY_OBJECT_CONTROL_CNL_NO_ELLC,
1179 MEMORY_OBJECT_CONTROL_CNL_NO_LLC_L3,
1180 MEMORY_OBJECT_CONTROL_CNL_NO_ELLC_L3,
1181 MEMORY_OBJECT_CONTROL_CNL_NO_CACHE,
1182 MEMORY_OBJECT_CONTROL_CNL_COUNT,
1183
1184 MEMORY_OBJECT_CONTROL_ICL_DEFAULT = 0,
1185 MEMORY_OBJECT_CONTROL_ICL_COUNT,
1186
1187 MEMORY_OBJECT_CONTROL_UNKNOWN = 0xff
1188 } MEMORY_OBJECT_CONTROL;
1189
1190 typedef enum _MEMORY_TYPE {
1191 CM_USE_PTE,
1192 CM_UN_CACHEABLE,
1193 CM_WRITE_THROUGH,
1194 CM_WRITE_BACK,
1195
1196 // BDW
1197 MEMORY_TYPE_BDW_UC_WITH_FENCE = 0,
1198 MEMORY_TYPE_BDW_UC,
1199 MEMORY_TYPE_BDW_WT,
1200 MEMORY_TYPE_BDW_WB
1201
1202 } MEMORY_TYPE;
1203
1204 struct L3ConfigRegisterValues
1205 {
1206 unsigned int config_register0;
1207 unsigned int config_register1;
1208 unsigned int config_register2;
1209 unsigned int config_register3;
1210 };
1211
1212 typedef enum _L3_SUGGEST_CONFIG
1213 {
1214 BDW_L3_PLANE_DEFAULT = 0,
1215 BDW_L3_PLANE_1,
1216 BDW_L3_PLANE_2,
1217 BDW_L3_PLANE_3,
1218 BDW_L3_PLANE_4,
1219 BDW_L3_PLANE_5,
1220 BDW_L3_PLANE_6,
1221 BDW_L3_PLANE_7,
1222 BDW_L3_CONFIG_COUNT,
1223
1224 SKL_L3_PLANE_DEFAULT = 0,
1225 SKL_L3_PLANE_1,
1226 SKL_L3_PLANE_2,
1227 SKL_L3_PLANE_3,
1228 SKL_L3_PLANE_4,
1229 SKL_L3_PLANE_5,
1230 SKL_L3_PLANE_6,
1231 SKL_L3_PLANE_7,
1232 SKL_L3_CONFIG_COUNT,
1233
1234 CNL_L3_PLANE_DEFAULT = 0,
1235 CNL_L3_PLANE_1,
1236 CNL_L3_PLANE_2,
1237 CNL_L3_PLANE_3,
1238 CNL_L3_PLANE_4,
1239 CNL_L3_PLANE_5,
1240 CNL_L3_PLANE_6,
1241 CNL_L3_PLANE_7,
1242 CNL_L3_PLANE_8,
1243 CNL_L3_CONFIG_COUNT,
1244
1245 ICL_L3_PLANE_DEFAULT = 0,
1246 ICL_L3_PLANE_1,
1247 ICL_L3_PLANE_2,
1248 ICL_L3_PLANE_3,
1249 ICL_L3_PLANE_4,
1250 ICL_L3_PLANE_5,
1251 ICL_L3_CONFIG_COUNT, // ICL and CNL have the same recommended L3 settings, with ICL not supporting SLM directly.
1252
1253 ICLLP_L3_PLANE_DEFAULT = 0,
1254 ICLLP_L3_PLANE_1,
1255 ICLLP_L3_PLANE_2,
1256 ICLLP_L3_PLANE_3,
1257 ICLLP_L3_PLANE_4,
1258 ICLLP_L3_PLANE_5,
1259 ICLLP_L3_PLANE_6,
1260 ICLLP_L3_PLANE_7,
1261 ICLLP_L3_PLANE_8,
1262 ICLLP_L3_CONFIG_COUNT,
1263
1264 BDW_SLM_PLANE_DEFAULT = BDW_L3_PLANE_5,
1265 SKL_SLM_PLANE_DEFAULT = SKL_L3_PLANE_5
1266 } L3_SUGGEST_CONFIG;
1267
1268 /*
1269 * AVS SAMPLER8x8 STATE
1270 */
1271 #define CM_NUM_COEFF_ROWS 17
1272 #define CM_NUM_COEFF_ROWS_SKL 32
1273 typedef struct _CM_AVS_NONPIPLINED_STATE {
1274 bool BypassXAF;
1275 bool BypassYAF;
1276 BYTE DefaultSharpLvl;
1277 BYTE maxDerivative4Pixels;
1278 BYTE maxDerivative8Pixels;
1279 BYTE transitionArea4Pixels;
1280 BYTE transitionArea8Pixels;
1281 CM_AVS_COEFF_TABLE Tbl0X[CM_NUM_COEFF_ROWS_SKL];
1282 CM_AVS_COEFF_TABLE Tbl0Y[CM_NUM_COEFF_ROWS_SKL];
1283 CM_AVS_COEFF_TABLE Tbl1X[CM_NUM_COEFF_ROWS_SKL];
1284 CM_AVS_COEFF_TABLE Tbl1Y[CM_NUM_COEFF_ROWS_SKL];
1285 bool bEnableRGBAdaptive;
1286 bool bAdaptiveFilterAllChannels;
1287 }CM_AVS_NONPIPLINED_STATE;
1288
1289 typedef struct _CM_AVS_INTERNEL_NONPIPLINED_STATE {
1290 bool BypassXAF;
1291 bool BypassYAF;
1292 BYTE DefaultSharpLvl;
1293 BYTE maxDerivative4Pixels;
1294 BYTE maxDerivative8Pixels;
1295 BYTE transitionArea4Pixels;
1296 BYTE transitionArea8Pixels;
1297 CM_AVS_INTERNEL_COEFF_TABLE Tbl0X[CM_NUM_COEFF_ROWS_SKL];
1298 CM_AVS_INTERNEL_COEFF_TABLE Tbl0Y[CM_NUM_COEFF_ROWS_SKL];
1299 CM_AVS_INTERNEL_COEFF_TABLE Tbl1X[CM_NUM_COEFF_ROWS_SKL];
1300 CM_AVS_INTERNEL_COEFF_TABLE Tbl1Y[CM_NUM_COEFF_ROWS_SKL];
1301 bool bEnableRGBAdaptive;
1302 bool bAdaptiveFilterAllChannels;
1303 }CM_AVS_INTERNEL_NONPIPLINED_STATE;
1304
1305 typedef struct _CM_AVS_STATE_MSG {
1306 bool AVSTYPE; //true nearest, false adaptive
1307 bool EightTapAFEnable; //HSW+
1308 bool BypassIEF; //ignored for BWL, moved to sampler8x8 payload.
1309 bool ShuffleOutputWriteback; //SKL mode only to be set when AVS msg sequence is 4x4 or 8x4
1310 bool HDCDirectWriteEnable;
1311 unsigned short GainFactor;
1312 unsigned char GlobalNoiseEstm;
1313 unsigned char StrongEdgeThr;
1314 unsigned char WeakEdgeThr;
1315 unsigned char StrongEdgeWght;
1316 unsigned char RegularWght;
1317 unsigned char NonEdgeWght;
1318 unsigned short wR3xCoefficient;
1319 unsigned short wR3cCoefficient;
1320 unsigned short wR5xCoefficient;
1321 unsigned short wR5cxCoefficient;
1322 unsigned short wR5cCoefficient;
1323 //For Non-piplined states
1324 unsigned short stateID;
1325 CM_AVS_NONPIPLINED_STATE * AvsState;
1326 } CM_AVS_STATE_MSG;
1327
1328 typedef BYTE CM_AVS_STATE_MSG_EX[4244];
1329 /*
1330 * CONVOLVE STATE DATA STRUCTURES
1331 */
1332
1333 //*-----------------------------------------------------------------------------
1334 //| CM Convolve type for SKL+
1335 //*-----------------------------------------------------------------------------
1336 typedef enum _CM_CONVOLVE_SKL_TYPE
1337 {
1338 CM_CONVOLVE_SKL_TYPE_2D = 0,
1339 CM_CONVOLVE_SKL_TYPE_1D = 1,
1340 CM_CONVOLVE_SKL_TYPE_1P = 2
1341 } CM_CONVOLVE_SKL_TYPE;
1342
1343 #define CM_NUM_CONVOLVE_ROWS 16
1344 #define CM_NUM_CONVOLVE_ROWS_SKL 32
1345 typedef struct _CM_CONVOLVE_STATE_MSG {
1346 bool CoeffSize; //true 16-bit, false 8-bit
1347 byte SclDwnValue; //Scale down value
1348 byte Width; //Kernel Width
1349 byte Height; //Kernel Height
1350 //SKL mode
1351 bool isVertical32Mode;
1352 bool isHorizontal32Mode;
1353 CM_CONVOLVE_SKL_TYPE nConvolveType;
1354 CM_CONVOLVE_COEFF_TABLE Table[CM_NUM_CONVOLVE_ROWS_SKL];
1355 } CM_CONVOLVE_STATE_MSG;
1356
1357 enum CM_SAMPLER_STATE_TYPE {
1358 CM_SAMPLER8X8_AVS = 0,
1359 CM_SAMPLER8X8_CONV = 1,
1360 CM_SAMPLER8X8_MISC = 3,
1361 CM_SAMPLER8X8_CONV1DH = 4,
1362 CM_SAMPLER8X8_CONV1DV = 5,
1363 CM_SAMPLER8X8_AVS_EX = 6,
1364 CM_SAMPLER8X8_NONE
1365 };
1366
1367 struct CM_SAMPLER_8X8_DESCR {
1368 CM_SAMPLER_STATE_TYPE stateType;
1369 union {
1370 CM_AVS_STATE_MSG *avs;
1371 CM_AVS_STATE_MSG_EX *avs_ex;
1372 CM_CONVOLVE_STATE_MSG *conv;
1373 CM_MISC_STATE_MSG *misc; //ERODE/DILATE/MINMAX
1374 };
1375 };
1376
1377
1378 struct CM_FLAG;
1379
1380 #define CM_NULL_SURFACE 0xFFFF
1381
1382 //!
1383 //! CM Sampler8X8
1384 //!
1385 class CmSampler8x8
1386 {
1387 public:
1388 CM_RT_API virtual INT GetIndex(SamplerIndex* & pIndex) = 0;
1389
1390 };
1391 /***********END SAMPLER8X8********************/
1392
1393 class CmEvent
1394 {
1395 public:
1396 CM_RT_API virtual INT GetStatus(CM_STATUS& status) = 0;
1397 CM_RT_API virtual INT GetExecutionTime(UINT64& time) = 0;
1398 CM_RT_API virtual INT WaitForTaskFinished(DWORD dwTimeOutMs = CM_MAX_TIMEOUT_MS) = 0;
1399 };
1400
1401 class CmThreadSpace;
1402 class CmThreadGroupSpace;
1403
1404 class CmKernel
1405 {
1406 public:
1407 CM_RT_API virtual INT SetThreadCount(UINT count) = 0;
1408 CM_RT_API virtual INT SetKernelArg(UINT index, size_t size, const void * pValue) = 0;
1409
1410 CM_RT_API virtual INT SetThreadArg(UINT threadId, UINT index, size_t size, const void * pValue) = 0;
1411 CM_RT_API virtual INT SetStaticBuffer(UINT index, const void * pValue) = 0;
1412 CM_RT_API virtual INT SetSurfaceBTI(SurfaceIndex* pSurface, UINT BTIndex) = 0;
1413 CM_RT_API virtual INT AssociateThreadSpace(CmThreadSpace* & pTS) = 0;
1414 };
1415
1416 class CmTask
1417 {
1418 public:
1419 CM_RT_API virtual INT AddKernel(CmKernel *pKernel) = 0;
1420 CM_RT_API virtual INT Reset(void) = 0;
1421 CM_RT_API virtual INT AddSync(void) = 0;
1422 };
1423
1424 class CmProgram;
1425 class SurfaceIndex;
1426 class SamplerIndex;
1427
1428 class CmBuffer
1429 {
1430 public:
1431 CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0;
1432 CM_RT_API virtual INT ReadSurface(unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
1433 CM_RT_API virtual INT WriteSurface(const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
1434 CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0;
1435 CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0;
1436 };
1437
1438 class CmBufferUP
1439 {
1440 public:
1441 CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0;
1442 CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0;
1443 };
1444
1445 class CmBufferSVM;
1446
1447 typedef void * CmAbstractSurfaceHandle;
1448
1449 class CmSurface2D
1450 {
1451 public:
1452 CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0;
1453 CM_RT_API virtual INT ReadSurface(unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
1454 CM_RT_API virtual INT WriteSurface(const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
1455 CM_RT_API virtual INT ReadSurfaceStride(unsigned char* pSysMem, CmEvent* pEvent, const UINT stride, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
1456 CM_RT_API virtual INT WriteSurfaceStride(const unsigned char* pSysMem, CmEvent* pEvent, const UINT stride, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
1457 CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0;
1458 #ifdef CM_LINUX
1459 CM_RT_API virtual INT GetVaSurfaceID(VASurfaceID &iVASurface) = 0;
1460 #endif
1461 };
1462
1463 class CmSurface2DUP
1464 {
1465 public:
1466 CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0;
1467 CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0;
1468 };
1469
1470 class CmSurface3D
1471 {
1472 public:
1473 CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0;
1474 CM_RT_API virtual INT ReadSurface(unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
1475 CM_RT_API virtual INT WriteSurface(const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
1476 CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0;
1477 CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0;
1478 };
1479
1480 class CmSampler
1481 {
1482 public:
1483 CM_RT_API virtual INT GetIndex(SamplerIndex* & pIndex) = 0;
1484 };
1485
1486 class CmThreadSpace
1487 {
1488 public:
1489 CM_RT_API virtual INT AssociateThread(UINT x, UINT y, CmKernel* pKernel, UINT threadId) = 0;
1490 CM_RT_API virtual INT SelectThreadDependencyPattern(CM_DEPENDENCY_PATTERN pattern) = 0;
1491 };
1492
1493 class CmThreadGroupSpace;
1494
1495 class CmVebox;
1496
1497 class CmQueue
1498 {
1499 public:
1500 CM_RT_API virtual INT Enqueue(CmTask* pTask, CmEvent* & pEvent, const CmThreadSpace* pTS = NULL) = 0;
1501 CM_RT_API virtual INT DestroyEvent(CmEvent* & pEvent) = 0;
1502 CM_RT_API virtual INT EnqueueWithGroup(CmTask* pTask, CmEvent* & pEvent, const CmThreadGroupSpace* pTGS = NULL) = 0;
1503 CM_RT_API virtual INT EnqueueCopyCPUToGPU(CmSurface2D* pSurface, const unsigned char* pSysMem, CmEvent* & pEvent) = 0;
1504 CM_RT_API virtual INT EnqueueCopyGPUToCPU(CmSurface2D* pSurface, unsigned char* pSysMem, CmEvent* & pEvent) = 0;
1505 CM_RT_API virtual INT EnqueueInitSurface2D(CmSurface2D* pSurface, const DWORD initValue, CmEvent* &pEvent) = 0;
1506 CM_RT_API virtual INT EnqueueCopyGPUToGPU(CmSurface2D* pOutputSurface, CmSurface2D* pInputSurface, UINT option, CmEvent* & pEvent) = 0;
1507 CM_RT_API virtual INT EnqueueCopyCPUToCPU(unsigned char* pDstSysMem, unsigned char* pSrcSysMem, UINT size, UINT option, CmEvent* & pEvent) = 0;
1508
1509 CM_RT_API virtual INT EnqueueCopyCPUToGPUFullStride(CmSurface2D* pSurface, const unsigned char* pSysMem, const UINT widthStride, const UINT heightStride, const UINT option, CmEvent* & pEvent) = 0;
1510 CM_RT_API virtual INT EnqueueCopyGPUToCPUFullStride(CmSurface2D* pSurface, unsigned char* pSysMem, const UINT widthStride, const UINT heightStride, const UINT option, CmEvent* & pEvent) = 0;
1511
1512 CM_RT_API virtual INT EnqueueWithHints(CmTask* pTask, CmEvent* & pEvent, UINT hints = 0) = 0;
1513 CM_RT_API virtual INT EnqueueVebox(CmVebox* pVebox, CmEvent* & pEvent) = 0;
1514
1515 CM_RT_API virtual INT EnqueueFast(CmTask *task,
1516 CmEvent *&event,
1517 const CmThreadSpace *threadSpace = nullptr) = 0;
1518 CM_RT_API virtual INT DestroyEventFast(CmEvent *&event) = 0;
1519 CM_RT_API virtual INT EnqueueWithGroupFast(CmTask *task,
1520 CmEvent *&event,
1521 const CmThreadGroupSpace *threadGroupSpace = nullptr) = 0;
1522 };
1523
1524 class CmDevice;
1525
1526 typedef void(*IMG_WALKER_FUNTYPE)(void* img, void* arg);
1527
1528 EXTERN_C CM_RT_API INT CMRT_GetSurfaceDetails(CmEvent* pEvent, UINT kernIndex, UINT surfBTI, CM_SURFACE_DETAILS& outDetails);
1529 EXTERN_C CM_RT_API void CMRT_PrepareGTPinBuffers(void* ptr0, int size0InBytes, void* ptr1, int size1InBytes, void* ptr2, int size2InBytes);
1530 EXTERN_C CM_RT_API void CMRT_SetGTPinArguments(char* commandLine, void* gtpinInvokeStruct);
1531 EXTERN_C CM_RT_API void CMRT_EnableGTPinMarkers(void);
1532
1533 EXTERN_C CM_RT_API INT DestroyCmDevice(CmDevice* &pD);
1534
1535
1536
1537 EXTERN_C CM_RT_API UINT CMRT_GetKernelCount(CmEvent *pEvent);
1538 EXTERN_C CM_RT_API INT CMRT_GetKernelName(CmEvent *pEvent, UINT index, char** KernelName);
1539 EXTERN_C CM_RT_API INT CMRT_GetKernelThreadSpace(CmEvent *pEvent, UINT index, UINT* localWidth, UINT* localHeight, UINT* globalWidth, UINT* globalHeight);
1540 EXTERN_C CM_RT_API INT CMRT_GetSubmitTime(CmEvent *pEvent, LARGE_INTEGER* time);
1541 EXTERN_C CM_RT_API INT CMRT_GetHWStartTime(CmEvent *pEvent, LARGE_INTEGER* time);
1542 EXTERN_C CM_RT_API INT CMRT_GetHWEndTime(CmEvent *pEvent, LARGE_INTEGER* time);
1543 EXTERN_C CM_RT_API INT CMRT_GetCompleteTime(CmEvent *pEvent, LARGE_INTEGER* time);
1544 EXTERN_C CM_RT_API INT CMRT_SetEventCallback(CmEvent* pEvent, callback_function function, void* user_data);
1545 EXTERN_C CM_RT_API INT CMRT_Enqueue(CmQueue* pQueue, CmTask* pTask, CmEvent** pEvent, const CmThreadSpace* pTS = NULL);
1546
1547 EXTERN_C CM_RT_API INT CMRT_GetEnqueueTime(CmEvent *pEvent, LARGE_INTEGER* time);
1548
1549 EXTERN_C CM_RT_API const char* GetCmErrorString(int Code);
1550
1551 #if defined(CM_LINUX)
1552 namespace CmLinux
1553 {
1554 class CmDevice
1555 {
1556 public:
1557
1558 CM_RT_API virtual INT CreateBuffer(UINT size, CmBuffer* & pSurface) = 0;
1559 CM_RT_API virtual INT CreateSurface2D(UINT width, UINT height, CM_SURFACE_FORMAT format, CmSurface2D* & pSurface) = 0;
1560 CM_RT_API virtual INT CreateSurface3D(UINT width, UINT height, UINT depth, CM_SURFACE_FORMAT format, CmSurface3D* & pSurface) = 0;
1561
1562 CM_RT_API virtual INT CreateSurface2D(VASurfaceID iVASurface, CmSurface2D* & pSurface) = 0;
1563 CM_RT_API virtual INT CreateSurface2D(VASurfaceID* iVASurface, const UINT surfaceCount, CmSurface2D** pSurface) = 0;
1564
1565 CM_RT_API virtual INT DestroySurface(CmBuffer* & pSurface) = 0;
1566 CM_RT_API virtual INT DestroySurface(CmSurface2D* & pSurface) = 0;
1567 CM_RT_API virtual INT DestroySurface(CmSurface3D* & pSurface) = 0;
1568
1569 CM_RT_API virtual INT CreateQueue(CmQueue* & pQueue) = 0;
1570 CM_RT_API virtual INT LoadProgram(void* pCommonISACode, const UINT size, CmProgram*& pProgram, const char* options = NULL) = 0;
1571 CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, CmKernel* & pKernel, const char* options = NULL) = 0;
1572 CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, const void * fncPnt, CmKernel* & pKernel, const char* options = NULL) = 0;
1573 CM_RT_API virtual INT CreateSampler(const CM_SAMPLER_STATE & sampleState, CmSampler* & pSampler) = 0;
1574
1575 CM_RT_API virtual INT DestroyKernel(CmKernel*& pKernel) = 0;
1576 CM_RT_API virtual INT DestroySampler(CmSampler*& pSampler) = 0;
1577 CM_RT_API virtual INT DestroyProgram(CmProgram*& pProgram) = 0;
1578 CM_RT_API virtual INT DestroyThreadSpace(CmThreadSpace* & pTS) = 0;
1579
1580 CM_RT_API virtual INT CreateTask(CmTask *& pTask) = 0;
1581 CM_RT_API virtual INT DestroyTask(CmTask*& pTask) = 0;
1582
1583 CM_RT_API virtual INT GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void* pCapValue) = 0;
1584
1585 CM_RT_API virtual INT CreateThreadSpace(UINT width, UINT height, CmThreadSpace* & pTS) = 0;
1586
1587 CM_RT_API virtual INT CreateBufferUP(UINT size, void* pSystMem, CmBufferUP* & pSurface) = 0;
1588 CM_RT_API virtual INT DestroyBufferUP(CmBufferUP* & pSurface) = 0;
1589
1590 CM_RT_API virtual INT GetSurface2DInfo(UINT width, UINT height, CM_SURFACE_FORMAT format, UINT & pitch, UINT & physicalSize) = 0;
1591 CM_RT_API virtual INT CreateSurface2DUP(UINT width, UINT height, CM_SURFACE_FORMAT format, void* pSysMem, CmSurface2DUP* & pSurface) = 0;
1592 CM_RT_API virtual INT DestroySurface2DUP(CmSurface2DUP* & pSurface) = 0;
1593
1594 CM_RT_API virtual INT CreateVmeSurfaceG7_5(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0;
1595 CM_RT_API virtual INT DestroyVmeSurfaceG7_5(SurfaceIndex* & pVmeIndex) = 0;
1596 CM_RT_API virtual INT CreateSampler8x8(const CM_SAMPLER_8X8_DESCR & smplDescr, CmSampler8x8*& psmplrState) = 0;
1597 CM_RT_API virtual INT DestroySampler8x8(CmSampler8x8*& pSampler) = 0;
1598 CM_RT_API virtual INT CreateSampler8x8Surface(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP) = 0;
1599 CM_RT_API virtual INT DestroySampler8x8Surface(SurfaceIndex* & pDIIndex) = 0;
1600
1601 CM_RT_API virtual INT CreateThreadGroupSpace(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT grpSpaceWidth, UINT grpSpaceHeight, CmThreadGroupSpace*& pTGS) = 0;
1602 CM_RT_API virtual INT DestroyThreadGroupSpace(CmThreadGroupSpace*& pTGS) = 0;
1603 CM_RT_API virtual INT SetL3Config(const L3ConfigRegisterValues *l3_c) = 0;
1604 CM_RT_API virtual INT SetSuggestedL3Config(L3_SUGGEST_CONFIG l3_s_c) = 0;
1605
1606 CM_RT_API virtual INT SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* pCapValue) = 0;
1607
1608 CM_RT_API virtual INT CreateSamplerSurface2D(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
1609 CM_RT_API virtual INT CreateSamplerSurface3D(CmSurface3D* p3DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
1610 CM_RT_API virtual INT DestroySamplerSurface(SurfaceIndex* & pSamplerSurfaceIndex) = 0;
1611
1612 CM_RT_API virtual INT InitPrintBuffer(size_t printbufsize = 1048576) = 0;
1613 CM_RT_API virtual INT FlushPrintBuffer() = 0;
1614
1615 CM_RT_API virtual INT CreateVebox(CmVebox* & pVebox) = 0; //HSW
1616 CM_RT_API virtual INT DestroyVebox(CmVebox* & pVebox) = 0; //HSW
1617
1618 CM_RT_API virtual INT GetVaDpy(VADisplay* & pva_dpy) = 0;
1619 CM_RT_API virtual INT CreateVaSurface2D(UINT width, UINT height, CM_SURFACE_FORMAT format, VASurfaceID & iVASurface, CmSurface2D* & pSurface) = 0;
1620
1621 CM_RT_API virtual INT CreateBufferSVM(UINT size, void* & pSystMem, uint32_t access_flag, CmBufferSVM* & pSurface) = 0;
1622 CM_RT_API virtual INT DestroyBufferSVM(CmBufferSVM* & pSurface) = 0;
1623 CM_RT_API virtual INT CreateSamplerSurface2DUP(CmSurface2DUP* p2DUPSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
1624
1625 CM_RT_API virtual INT CloneKernel(CmKernel * &pKernelDest, CmKernel * pKernelSrc) = 0;
1626
1627 CM_RT_API virtual INT CreateSurface2DAlias(CmSurface2D* p2DSurface, SurfaceIndex* &aliasSurfaceIndex) = 0;
1628
1629 CM_RT_API virtual INT CreateHevcVmeSurfaceG10(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0;
1630 CM_RT_API virtual INT DestroyHevcVmeSurfaceG10(SurfaceIndex* & pVmeIndex) = 0;
1631 CM_RT_API virtual INT CreateSamplerEx(const CM_SAMPLER_STATE_EX & sampleState, CmSampler* & pSampler) = 0;
1632 CM_RT_API virtual INT FlushPrintBufferIntoFile(const char *filename) = 0;
1633 CM_RT_API virtual INT CreateThreadGroupSpaceEx(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT thrdSpaceDepth, UINT grpSpaceWidth, UINT grpSpaceHeight, UINT grpSpaceDepth, CmThreadGroupSpace*& pTGS) = 0;
1634
1635 CM_RT_API virtual INT CreateSampler8x8SurfaceEx(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP, CM_FLAG* pFlag = NULL) = 0;
1636 CM_RT_API virtual INT CreateSamplerSurface2DEx(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex, CM_FLAG* pFlag = NULL) = 0;
1637 CM_RT_API virtual INT CreateBufferAlias(CmBuffer *pBuffer, SurfaceIndex* &pAliasIndex) = 0;
1638
1639 CM_RT_API virtual INT SetVmeSurfaceStateParam(SurfaceIndex* pVmeIndex, CM_VME_SURFACE_STATE_PARAM *pSSParam) = 0;
1640
1641 CM_RT_API virtual int32_t GetVISAVersion(uint32_t& majorVersion, uint32_t& minorVersion) = 0;
1642 CM_RT_API virtual int32_t CreateQueueEx(CmQueue *&pQueue, CM_QUEUE_CREATE_OPTION QueueCreateOption = CM_DEFAULT_QUEUE_CREATE_OPTION) = 0;
1643 //adding new functions in the bottom is a must
1644 };
1645 }
1646 #endif
1647
1648 typedef void * AbstractSurfaceHandle;
1649 typedef void * AbstractDeviceHandle;
1650 typedef L3ConfigRegisterValues L3_CONFIG_REGISTER_VALUES;
1651
1652 class CmDevice
1653 {
1654 public:
1655 CM_RT_API virtual INT GetDevice(AbstractDeviceHandle & pDevice) = 0;
1656 CM_RT_API virtual INT CreateBuffer(UINT size, CmBuffer* & pSurface) = 0;
1657 CM_RT_API virtual INT CreateSurface2D(UINT width, UINT height, CM_SURFACE_FORMAT format, CmSurface2D* & pSurface) = 0;
1658 CM_RT_API virtual INT CreateSurface3D(UINT width, UINT height, UINT depth, CM_SURFACE_FORMAT format, CmSurface3D* & pSurface) = 0;
1659 CM_RT_API virtual INT CreateSurface2D(mfxHDLPair D3DSurfPair, CmSurface2D* & pSurface) = 0;
1660 CM_RT_API virtual INT CreateSurface2D(AbstractSurfaceHandle pD3DSurf, CmSurface2D* & pSurface) = 0;
1661 //CM_RT_API virtual INT CreateSurface2D( AbstractSurfaceHandle * pD3DSurf, const UINT surfaceCount, CmSurface2D** pSpurface ) = 0;
1662 CM_RT_API virtual INT DestroySurface(CmBuffer* & pSurface) = 0;
1663 CM_RT_API virtual INT DestroySurface(CmSurface2D* & pSurface) = 0;
1664 CM_RT_API virtual INT DestroySurface(CmSurface3D* & pSurface) = 0;
1665 CM_RT_API virtual INT CreateQueue(CmQueue* & pQueue) = 0;
1666 CM_RT_API virtual INT LoadProgram(void* pCommonISACode, const UINT size, CmProgram*& pProgram, const char* options = NULL) = 0;
1667 CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, CmKernel* & pKernel, const char* options = NULL) = 0;
1668 CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, const void * fncPnt, CmKernel* & pKernel, const char* options = NULL) = 0;
1669 CM_RT_API virtual INT CreateSampler(const CM_SAMPLER_STATE & sampleState, CmSampler* & pSampler) = 0;
1670 CM_RT_API virtual INT DestroyKernel(CmKernel*& pKernel) = 0;
1671 CM_RT_API virtual INT DestroySampler(CmSampler*& pSampler) = 0;
1672 CM_RT_API virtual INT DestroyProgram(CmProgram*& pProgram) = 0;
1673 CM_RT_API virtual INT DestroyThreadSpace(CmThreadSpace* & pTS) = 0;
1674 CM_RT_API virtual INT CreateTask(CmTask *& pTask) = 0;
1675 CM_RT_API virtual INT DestroyTask(CmTask*& pTask) = 0;
1676 CM_RT_API virtual INT GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void* pCapValue) = 0;
1677 CM_RT_API virtual INT CreateThreadSpace(UINT width, UINT height, CmThreadSpace* & pTS) = 0;
1678 CM_RT_API virtual INT CreateBufferUP(UINT size, void* pSystMem, CmBufferUP* & pSurface) = 0;
1679 CM_RT_API virtual INT DestroyBufferUP(CmBufferUP* & pSurface) = 0;
1680 CM_RT_API virtual INT GetSurface2DInfo(UINT width, UINT height, CM_SURFACE_FORMAT format, UINT & pitch, UINT & physicalSize) = 0;
1681 CM_RT_API virtual INT CreateSurface2DUP(UINT width, UINT height, CM_SURFACE_FORMAT format, void* pSysMem, CmSurface2DUP* & pSurface) = 0;
1682 CM_RT_API virtual INT DestroySurface2DUP(CmSurface2DUP* & pSurface) = 0;
1683 CM_RT_API virtual INT CreateVmeSurfaceG7_5(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0;
1684 CM_RT_API virtual INT DestroyVmeSurfaceG7_5(SurfaceIndex* & pVmeIndex) = 0;
1685 CM_RT_API virtual INT CreateSampler8x8(const CM_SAMPLER_8X8_DESCR & smplDescr, CmSampler8x8*& psmplrState) = 0;
1686 CM_RT_API virtual INT DestroySampler8x8(CmSampler8x8*& pSampler) = 0;
1687 CM_RT_API virtual INT CreateSampler8x8Surface(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP) = 0;
1688 CM_RT_API virtual INT DestroySampler8x8Surface(SurfaceIndex* & pDIIndex) = 0;
1689 CM_RT_API virtual INT CreateThreadGroupSpace(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT grpSpaceWidth, UINT grpSpaceHeight, CmThreadGroupSpace*& pTGS) = 0;
1690 CM_RT_API virtual INT DestroyThreadGroupSpace(CmThreadGroupSpace*& pTGS) = 0;
1691 CM_RT_API virtual INT SetL3Config(const L3_CONFIG_REGISTER_VALUES *l3_c) = 0;
1692 CM_RT_API virtual INT SetSuggestedL3Config(L3_SUGGEST_CONFIG l3_s_c) = 0;
1693 CM_RT_API virtual INT SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* pCapValue) = 0;
1694 CM_RT_API virtual INT CreateSamplerSurface2D(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
1695 CM_RT_API virtual INT CreateSamplerSurface3D(CmSurface3D* p3DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
1696 CM_RT_API virtual INT DestroySamplerSurface(SurfaceIndex* & pSamplerSurfaceIndex) = 0;
1697 CM_RT_API virtual INT InitPrintBuffer(size_t printbufsize = 1048576) = 0;
1698 CM_RT_API virtual INT FlushPrintBuffer() = 0;
1699 CM_RT_API virtual INT CreateSurface2DSubresource(AbstractSurfaceHandle pD3D11Texture2D, UINT subresourceCount, CmSurface2D** ppSurfaces, UINT& createdSurfaceCount, UINT option = 0) = 0;
1700 CM_RT_API virtual INT CreateSurface2DbySubresourceIndex(AbstractSurfaceHandle pD3D11Texture2D, UINT FirstArraySlice, UINT FirstMipSlice, CmSurface2D* &pSurface) = 0;
1701 CM_RT_API virtual INT CreateQueueEx(CmQueue *&pQueue, CM_QUEUE_CREATE_OPTION QueueCreateOption = CM_DEFAULT_QUEUE_CREATE_OPTION) = 0;
1702 };
1703
1704 INT CreateCmDevice(CmDevice* &pD, UINT& version, VADisplay va_dpy = NULL, UINT mode = CM_DEVICE_CREATE_OPTION_DEFAULT);
1705 INT CreateCmDeviceEmu(CmDevice* &pDevice, UINT& version, VADisplay va_dpy = NULL);
1706 INT CreateCmDeviceSim(CmDevice* &pDevice, UINT& version);
1707
1708 INT DestroyCmDevice(CmDevice* &pDevice);
1709 INT DestroyCmDeviceEmu(CmDevice* &pDevice);
1710 INT DestroyCmDeviceSim(CmDevice* &pDevice);
1711
1712 int ReadProgram(CmDevice * device, CmProgram *& program, const unsigned char * buffer, unsigned int len);
1713 int ReadProgramJit(CmDevice * device, CmProgram *& program, const unsigned char * buffer, unsigned int len);
1714 int CreateKernel(CmDevice * device, CmProgram * program, const char * kernelName, const void * fncPnt, CmKernel *& kernel, const char * options = NULL);
1715
1716 #ifdef _MSVC_LANG
1717 #pragma warning(pop)
1718 #endif
1719
1720 #undef LONG
1721 #undef ULONG
1722
1723 #else //if CMAPIUPDATE
1724
1725 #define CM_1_0 100
1726 #define CM_2_0 200
1727 #define CM_2_1 201
1728 #define CM_2_2 202
1729 #define CM_2_3 203
1730 #define CM_2_4 204
1731 #define CM_3_0 300
1732 #define CM_4_0 400
1733
1734
1735 #define CM_MAX_1D_SURF_WIDTH 0X8000000 // 2^27
1736
1737 #define CM_DEVICE_CREATE_OPTION_DEFAULT 0
1738 #define CM_DEVICE_CREATE_OPTION_SCRATCH_SPACE_DISABLE 1
1739 #define CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_OFFSET 22
1740 #define CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_DISENABLE (1 << CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_OFFSET)
1741
1742 extern class CmEvent *CM_NO_EVENT;
1743
1744
1745 // CM RT DLL File Version
1746 typedef struct _CM_DLL_FILE_VERSION
1747 {
1748 WORD wMANVERSION;
1749 WORD wMANREVISION;
1750 WORD wSUBREVISION;
1751 WORD wBUILD_NUMBER;
1752 //Version constructed as : "wMANVERSION.wMANREVISION.wSUBREVISION.wBUILD_NUMBER"
1753 } CM_DLL_FILE_VERSION, *PCM_DLL_FILE_VERSION;
1754
1755 #define NUM_SEARCH_PATH_STATES_G6 14
1756 #define NUM_MBMODE_SETS_G6 4
1757
1758 typedef struct _VME_SEARCH_PATH_LUT_STATE_G6
1759 {
1760 // DWORD 0
1761 union
1762 {
1763 struct
1764 {
1765 DWORD SearchPathLocation_X_0 : 4;
1766 DWORD SearchPathLocation_Y_0 : 4;
1767 DWORD SearchPathLocation_X_1 : 4;
1768 DWORD SearchPathLocation_Y_1 : 4;
1769 DWORD SearchPathLocation_X_2 : 4;
1770 DWORD SearchPathLocation_Y_2 : 4;
1771 DWORD SearchPathLocation_X_3 : 4;
1772 DWORD SearchPathLocation_Y_3 : 4;
1773 };
1774 struct
1775 {
1776 DWORD Value;
1777 };
1778 };
1779 } VME_SEARCH_PATH_LUT_STATE_G6, *PVME_SEARCH_PATH_LUT_STATE_G6;
1780
1781 typedef struct _VME_RD_LUT_SET_G6
1782 {
1783 // DWORD 0
1784 union
1785 {
1786 struct
1787 {
1788 DWORD LUT_MbMode_0 : 8;
1789 DWORD LUT_MbMode_1 : 8;
1790 DWORD LUT_MbMode_2 : 8;
1791 DWORD LUT_MbMode_3 : 8;
1792 };
1793 struct
1794 {
1795 DWORD Value;
1796 };
1797 } DW0;
1798
1799 // DWORD 1
1800 union
1801 {
1802 struct
1803 {
1804 DWORD LUT_MbMode_4 : 8;
1805 DWORD LUT_MbMode_5 : 8;
1806 DWORD LUT_MbMode_6 : 8;
1807 DWORD LUT_MbMode_7 : 8;
1808 };
1809 struct
1810 {
1811 DWORD Value;
1812 };
1813 } DW1;
1814
1815 // DWORD 2
1816 union
1817 {
1818 struct
1819 {
1820 DWORD LUT_MV_0 : 8;
1821 DWORD LUT_MV_1 : 8;
1822 DWORD LUT_MV_2 : 8;
1823 DWORD LUT_MV_3 : 8;
1824 };
1825 struct
1826 {
1827 DWORD Value;
1828 };
1829 } DW2;
1830
1831 // DWORD 3
1832 union
1833 {
1834 struct
1835 {
1836 DWORD LUT_MV_4 : 8;
1837 DWORD LUT_MV_5 : 8;
1838 DWORD LUT_MV_6 : 8;
1839 DWORD LUT_MV_7 : 8;
1840 };
1841 struct
1842 {
1843 DWORD Value;
1844 };
1845 } DW3;
1846 } VME_RD_LUT_SET_G6, *PVME_RD_LUT_SET_G6;
1847
1848
1849 typedef struct _VME_STATE_G6
1850 {
1851 // DWORD 0 - DWORD 13
1852 VME_SEARCH_PATH_LUT_STATE_G6 SearchPath[NUM_SEARCH_PATH_STATES_G6];
1853
1854 // DWORD 14
1855 union
1856 {
1857 struct
1858 {
1859 DWORD LUT_MbMode_8_0 : 8;
1860 DWORD LUT_MbMode_9_0 : 8;
1861 DWORD LUT_MbMode_8_1 : 8;
1862 DWORD LUT_MbMode_9_1 : 8;
1863 };
1864 struct
1865 {
1866 DWORD Value;
1867 };
1868 } DW14;
1869
1870 // DWORD 15
1871 union
1872 {
1873 struct
1874 {
1875 DWORD LUT_MbMode_8_2 : 8;
1876 DWORD LUT_MbMode_9_2 : 8;
1877 DWORD LUT_MbMode_8_3 : 8;
1878 DWORD LUT_MbMode_9_3 : 8;
1879 };
1880 struct
1881 {
1882 DWORD Value;
1883 };
1884 } DW15;
1885
1886 // DWORD 16 - DWORD 31
1887 VME_RD_LUT_SET_G6 RdLutSet[NUM_MBMODE_SETS_G6];
1888 } VME_STATE_G6, *PVME_STATE_G6;
1889
1890 #define CM_MAX_DEPENDENCY_COUNT 8
1891
1892 typedef enum _CM_BOUNDARY_PIXEL_MODE
1893 {
1894 CM_BOUNDARY_NORMAL = 0x0,
1895 CM_BOUNDARY_PROGRESSIVE_FRAME = 0x2,
1896 CM_BOUNARY_INTERLACED_FRAME = 0x3
1897 }CM_BOUNDARY_PIXEL_MODE;
1898
1899 /**************** L3/Cache ***************/
1900 typedef enum _MEMORY_OBJECT_CONTROL {
1901 // SNB
1902 MEMORY_OBJECT_CONTROL_USE_GTT_ENTRY,
1903 MEMORY_OBJECT_CONTROL_NEITHER_LLC_NOR_MLC,
1904 MEMORY_OBJECT_CONTROL_LLC_NOT_MLC,
1905 MEMORY_OBJECT_CONTROL_LLC_AND_MLC,
1906
1907 // IVB
1908 MEMORY_OBJECT_CONTROL_FROM_GTT_ENTRY = MEMORY_OBJECT_CONTROL_USE_GTT_ENTRY, // Caching dependent on pte
1909 MEMORY_OBJECT_CONTROL_L3, // Cached in L3$
1910 MEMORY_OBJECT_CONTROL_LLC, // Cached in LLC
1911 MEMORY_OBJECT_CONTROL_LLC_L3, // Cached in LLC & L3$
1912
1913 // HSW
1914 #ifdef CMRT_SIM
1915 MEMORY_OBJECT_CONTROL_USE_PTE, // Caching dependent on pte
1916 #else
1917 MEMORY_OBJECT_CONTROL_USE_PTE = MEMORY_OBJECT_CONTROL_FROM_GTT_ENTRY, // Caching dependent on pte
1918 #endif
1919 MEMORY_OBJECT_CONTROL_UC, // Uncached
1920 MEMORY_OBJECT_CONTROL_LLC_ELLC,
1921 MEMORY_OBJECT_CONTROL_ELLC,
1922 MEMORY_OBJECT_CONTROL_L3_USE_PTE,
1923 MEMORY_OBJECT_CONTROL_L3_UC,
1924 MEMORY_OBJECT_CONTROL_L3_LLC_ELLC,
1925 MEMORY_OBJECT_CONTROL_L3_ELLC,
1926
1927 MEMORY_OBJECT_CONTROL_UNKNOWN = 0xff
1928 } MEMORY_OBJECT_CONTROL;
1929
1930 typedef enum _MEMORY_TYPE {
1931 CM_USE_PTE,
1932 CM_UN_CACHEABLE,
1933 CM_WRITE_THROUGH,
1934 CM_WRITE_BACK
1935 } MEMORY_TYPE;
1936
1937 #define BDW_L3_CONFIG_NUM 8
1938 #define HSW_L3_CONFIG_NUM 12
1939 #define IVB_2_L3_CONFIG_NUM 12
1940 #define IVB_1_L3_CONFIG_NUM 12
1941
1942 typedef struct _L3_CONFIG_REGISTER_VALUES {
1943 UINT SQCREG1_VALUE;
1944 UINT CNTLREG2_VALUE;
1945 UINT CNTLREG3_VALUE;
1946 } L3_CONFIG_REGISTER_VALUES;
1947
1948 typedef enum _L3_SUGGEST_CONFIG
1949 {
1950 IVB_L3_PLANE_DEFAULT,
1951 IVB_L3_PLANE_1,
1952 IVB_L3_PLANE_2,
1953 IVB_L3_PLANE_3,
1954 IVB_L3_PLANE_4,
1955 IVB_L3_PLANE_5,
1956 IVB_L3_PLANE_6,
1957 IVB_L3_PLANE_7,
1958 IVB_L3_PLANE_8,
1959 IVB_L3_PLANE_9,
1960 IVB_L3_PLANE_10,
1961 IVB_L3_PLANE_11,
1962
1963 HSW_L3_PLANE_DEFAULT = IVB_L3_PLANE_DEFAULT,
1964 HSW_L3_PLANE_1,
1965 HSW_L3_PLANE_2,
1966 HSW_L3_PLANE_3,
1967 HSW_L3_PLANE_4,
1968 HSW_L3_PLANE_5,
1969 HSW_L3_PLANE_6,
1970 HSW_L3_PLANE_7,
1971 HSW_L3_PLANE_8,
1972 HSW_L3_PLANE_9,
1973 HSW_L3_PLANE_10,
1974 HSW_L3_PLANE_11,
1975
1976 IVB_SLM_PLANE_DEFAULT = IVB_L3_PLANE_9,
1977 HSW_SLM_PLANE_DEFAULT = HSW_L3_PLANE_9
1978 } L3_SUGGEST_CONFIG;
1979
1980
1981 /*
1982 * AVS SAMPLER8x8 STATE
1983 */
1984
1985 #define CM_NUM_COEFF_ROWS 17
1986 typedef struct _CM_AVS_NONPIPLINED_STATE {
1987 bool BypassXAF;
1988 bool BypassYAF;
1989 BYTE DefaultSharpLvl;
1990 BYTE maxDerivative4Pixels;
1991 BYTE maxDerivative8Pixels;
1992 BYTE transitionArea4Pixels;
1993 BYTE transitionArea8Pixels;
1994 CM_AVS_COEFF_TABLE Tbl0X[CM_NUM_COEFF_ROWS];
1995 CM_AVS_COEFF_TABLE Tbl0Y[CM_NUM_COEFF_ROWS];
1996 CM_AVS_COEFF_TABLE Tbl1X[CM_NUM_COEFF_ROWS];
1997 CM_AVS_COEFF_TABLE Tbl1Y[CM_NUM_COEFF_ROWS];
1998 }CM_AVS_NONPIPLINED_STATE;
1999
2000 typedef struct _CM_AVS_INTERNEL_NONPIPLINED_STATE {
2001 bool BypassXAF;
2002 bool BypassYAF;
2003 BYTE DefaultSharpLvl;
2004 BYTE maxDerivative4Pixels;
2005 BYTE maxDerivative8Pixels;
2006 BYTE transitionArea4Pixels;
2007 BYTE transitionArea8Pixels;
2008 CM_AVS_INTERNEL_COEFF_TABLE Tbl0X[CM_NUM_COEFF_ROWS];
2009 CM_AVS_INTERNEL_COEFF_TABLE Tbl0Y[CM_NUM_COEFF_ROWS];
2010 CM_AVS_INTERNEL_COEFF_TABLE Tbl1X[CM_NUM_COEFF_ROWS];
2011 CM_AVS_INTERNEL_COEFF_TABLE Tbl1Y[CM_NUM_COEFF_ROWS];
2012 }CM_AVS_INTERNEL_NONPIPLINED_STATE;
2013
2014 typedef struct _CM_AVS_STATE_MSG {
2015 bool AVSTYPE; //true nearest, false adaptive
2016 bool EightTapAFEnable; //HSW+
2017 bool BypassIEF; //ignored for BWL, moved to sampler8x8 payload.
2018 bool ShuffleOutputWriteback; //SKL mode only to be set when AVS msg sequence is 4x4 or 8x4
2019 unsigned short GainFactor;
2020 unsigned char GlobalNoiseEstm;
2021 unsigned char StrongEdgeThr;
2022 unsigned char WeakEdgeThr;
2023 unsigned char StrongEdgeWght;
2024 unsigned char RegularWght;
2025 unsigned char NonEdgeWght;
2026 //For Non-piplined states
2027 unsigned short stateID;
2028 CM_AVS_NONPIPLINED_STATE * AvsState;
2029 } CM_AVS_STATE_MSG;
2030
2031 /*
2032 * CONVOLVE STATE DATA STRUCTURES
2033 */
2034
2035 #define CM_NUM_CONVOLVE_ROWS 16
2036 #define CM_NUM_CONVOLVE_ROWS_SKL 32
2037 typedef struct _CM_CONVOLVE_STATE_MSG {
2038 bool CoeffSize; //true 16-bit, false 8-bit
2039 byte SclDwnValue; //Scale down value
2040 byte Width; //Kernel Width
2041 byte Height; //Kernel Height
2042 //SKL mode
2043 bool isVertical32Mode;
2044 bool isHorizontal32Mode;
2045 CM_CONVOLVE_COEFF_TABLE Table[CM_NUM_CONVOLVE_ROWS_SKL];
2046 } CM_CONVOLVE_STATE_MSG;
2047
2048
2049 typedef enum _CM_SAMPLER_STATE_TYPE_
2050 {
2051 CM_SAMPLER8X8_AVS = 0,
2052 CM_SAMPLER8X8_CONV = 1,
2053 CM_SAMPLER8X8_MISC = 3,
2054 CM_SAMPLER8X8_NONE
2055 }CM_SAMPLER_STATE_TYPE;
2056
2057 typedef struct _CM_SAMPLER_8X8_DESCR {
2058 CM_SAMPLER_STATE_TYPE stateType;
2059 union
2060 {
2061 CM_AVS_STATE_MSG * avs;
2062 CM_CONVOLVE_STATE_MSG * conv;
2063 CM_MISC_STATE_MSG * misc; //ERODE/DILATE/MINMAX
2064 };
2065 } CM_SAMPLER_8X8_DESCR;
2066
2067 //!
2068 //! CM Sampler8X8
2069 //!
2070 class CmSampler8x8
2071 {
2072 public:
2073 CM_RT_API virtual INT GetIndex(SamplerIndex* & pIndex) = 0;
2074
2075 };
2076 /***********END SAMPLER8X8********************/
2077 class CmEvent
2078 {
2079 public:
2080 CM_RT_API virtual INT GetStatus(CM_STATUS& status) = 0;
2081 CM_RT_API virtual INT GetExecutionTime(UINT64& time) = 0;
2082 CM_RT_API virtual INT WaitForTaskFinished(DWORD dwTimeOutMs = CM_MAX_TIMEOUT_MS) = 0;
2083 };
2084
2085 class CmThreadSpace;
2086
2087 class CmKernel
2088 {
2089 public:
2090 CM_RT_API virtual INT SetThreadCount(UINT count) = 0;
2091 CM_RT_API virtual INT SetKernelArg(UINT index, size_t size, const void * pValue) = 0;
2092
2093 CM_RT_API virtual INT SetThreadArg(UINT threadId, UINT index, size_t size, const void * pValue) = 0;
2094 CM_RT_API virtual INT SetStaticBuffer(UINT index, const void * pValue) = 0;
2095
2096 CM_RT_API virtual INT SetKernelPayloadData(size_t size, const void *pValue) = 0;
2097 CM_RT_API virtual INT SetKernelPayloadSurface(UINT surfaceCount, SurfaceIndex** pSurfaces) = 0;
2098 CM_RT_API virtual INT SetSurfaceBTI(SurfaceIndex* pSurface, UINT BTIndex) = 0;
2099
2100 CM_RT_API virtual INT AssociateThreadSpace(CmThreadSpace* & pTS) = 0;
2101 };
2102
2103 class CmTask
2104 {
2105 public:
2106 CM_RT_API virtual INT AddKernel(CmKernel *pKernel) = 0;
2107 CM_RT_API virtual INT Reset(void) = 0;
2108 CM_RT_API virtual INT AddSync(void) = 0;
2109 };
2110
2111 class CmProgram;
2112 class SurfaceIndex;
2113 class SamplerIndex;
2114
2115 class CmBuffer
2116 {
2117 public:
2118 CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0;
2119 CM_RT_API virtual INT ReadSurface(unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
2120 CM_RT_API virtual INT WriteSurface(const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
2121 CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0;
2122 CM_RT_API virtual INT SetMemoryObjectControl(MEMORY_OBJECT_CONTROL mem_ctrl, MEMORY_TYPE mem_type, UINT age) = 0;
2123 };
2124
2125 class CmBufferUP
2126 {
2127 public:
2128 CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0;
2129 CM_RT_API virtual INT SetMemoryObjectControl(MEMORY_OBJECT_CONTROL mem_ctrl, MEMORY_TYPE mem_type, UINT age) = 0;
2130 };
2131
2132 class CmSurface2D
2133 {
2134 public:
2135 CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0;
2136 CM_RT_API virtual INT ReadSurface(unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
2137 CM_RT_API virtual INT WriteSurface(const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
2138 CM_RT_API virtual INT ReadSurfaceStride(unsigned char* pSysMem, CmEvent* pEvent, const UINT stride, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
2139 CM_RT_API virtual INT WriteSurfaceStride(const unsigned char* pSysMem, CmEvent* pEvent, const UINT stride, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
2140 CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0;
2141 CM_RT_API virtual INT SetMemoryObjectControl(MEMORY_OBJECT_CONTROL mem_ctrl, MEMORY_TYPE mem_type, UINT age) = 0;
2142 CM_RT_API virtual INT SetSurfaceState(UINT iWidth, UINT iHeight, CM_SURFACE_FORMAT Format, CM_BOUNDARY_PIXEL_MODE boundaryMode) = 0;
2143 #ifdef CM_LINUX
2144 CM_RT_API virtual INT GetVaSurfaceID(VASurfaceID &iVASurface) = 0;
2145 #endif
2146 };
2147
2148 class CmSurface2DUP
2149 {
2150 public:
2151 CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0;
2152 CM_RT_API virtual INT SetMemoryObjectControl(MEMORY_OBJECT_CONTROL mem_ctrl, MEMORY_TYPE mem_type, UINT age) = 0;
2153 };
2154
2155 class CmSurface3D
2156 {
2157 public:
2158 CM_RT_API virtual INT GetIndex(SurfaceIndex*& pIndex) = 0;
2159 CM_RT_API virtual INT ReadSurface(unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
2160 CM_RT_API virtual INT WriteSurface(const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
2161 CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0;
2162 CM_RT_API virtual INT SetMemoryObjectControl(MEMORY_OBJECT_CONTROL mem_ctrl, MEMORY_TYPE mem_type, UINT age) = 0;
2163 };
2164
2165 class CmSampler
2166 {
2167 public:
2168 CM_RT_API virtual INT GetIndex(SamplerIndex* & pIndex) = 0;
2169 };
2170
2171 class CmThreadSpace
2172 {
2173 public:
2174 CM_RT_API virtual INT AssociateThread(UINT x, UINT y, CmKernel* pKernel, UINT threadId) = 0;
2175 CM_RT_API virtual INT SelectThreadDependencyPattern(CM_DEPENDENCY_PATTERN pattern) = 0;
2176 };
2177
2178 class CmThreadGroupSpace;
2179 class CmVebox_G75;
2180
2181 class CmQueue
2182 {
2183 public:
2184 CM_RT_API virtual INT Enqueue(CmTask* pTask, CmEvent* & pEvent, const CmThreadSpace* pTS = NULL) = 0;
2185 CM_RT_API virtual INT DestroyEvent(CmEvent* & pEvent) = 0;
2186 CM_RT_API virtual INT EnqueueWithGroup(CmTask* pTask, CmEvent* & pEvent, const CmThreadGroupSpace* pTGS = NULL) = 0;
2187 CM_RT_API virtual INT EnqueueCopyCPUToGPU(CmSurface2D* pSurface, const unsigned char* pSysMem, CmEvent* & pEvent) = 0;
2188 CM_RT_API virtual INT EnqueueCopyGPUToCPU(CmSurface2D* pSurface, unsigned char* pSysMem, CmEvent* & pEvent) = 0;
2189 CM_RT_API virtual INT EnqueueCopyCPUToGPUStride(CmSurface2D* pSurface, const unsigned char* pSysMem, const UINT stride, CmEvent* & pEvent) = 0;
2190 CM_RT_API virtual INT EnqueueCopyGPUToCPUStride(CmSurface2D* pSurface, unsigned char* pSysMem, const UINT stride, CmEvent* & pEvent) = 0;
2191 CM_RT_API virtual INT EnqueueInitSurface2D(CmSurface2D* pSurface, const DWORD initValue, CmEvent* &pEvent) = 0;
2192 CM_RT_API virtual INT EnqueueCopyGPUToGPU(CmSurface2D* pOutputSurface, CmSurface2D* pInputSurface, CmEvent* & pEvent) = 0;
2193 CM_RT_API virtual INT EnqueueCopyCPUToCPU(unsigned char* pDstSysMem, unsigned char* pSrcSysMem, UINT size, CmEvent* & pEvent) = 0;
2194
2195 CM_RT_API virtual INT EnqueueCopyCPUToGPUFullStride(CmSurface2D* pSurface, const unsigned char* pSysMem, const UINT widthStride, const UINT heightStride, const UINT option, CmEvent* & pEvent) = 0;
2196 CM_RT_API virtual INT EnqueueCopyGPUToCPUFullStride(CmSurface2D* pSurface, unsigned char* pSysMem, const UINT widthStride, const UINT heightStride, const UINT option, CmEvent* & pEvent) = 0;
2197 };
2198
2199 class VmeIndex
2200 {
2201 public:
VmeIndex()2202 CM_NOINLINE VmeIndex() { index = 0; };
VmeIndex(VmeIndex & _src)2203 CM_NOINLINE VmeIndex(VmeIndex& _src) { index = _src.get_data(); };
VmeIndex(const unsigned int & _n)2204 CM_NOINLINE VmeIndex(const unsigned int& _n) { index = _n; };
2205 CM_NOINLINE VmeIndex & operator = (const unsigned int& _n) { this->index = _n; return *this; };
get_data(void)2206 virtual unsigned int get_data(void) { return index; };
2207 private:
2208 unsigned int index;
2209 #ifdef CM_LINUX
2210 unsigned char extra_byte;
2211 #endif
2212 };
2213
2214 class CmVmeState
2215 {
2216 public:
2217 CM_RT_API virtual INT GetIndex(VmeIndex* & pIndex) = 0;
2218 };
2219
2220 namespace CmLinux
2221 {
2222 class CmDevice
2223 {
2224 public:
2225 CM_RT_API virtual INT CreateBuffer(UINT size, CmBuffer* & pSurface) = 0;
2226 CM_RT_API virtual INT CreateSurface2D(UINT width, UINT height, CM_SURFACE_FORMAT format, CmSurface2D* & pSurface) = 0;
2227 CM_RT_API virtual INT CreateSurface3D(UINT width, UINT height, UINT depth, CM_SURFACE_FORMAT format, CmSurface3D* & pSurface) = 0;
2228 CM_RT_API virtual INT CreateSurface2D(VASurfaceID iVASurface, CmSurface2D *& pSurface) = 0;
2229 CM_RT_API virtual INT CreateSurface2D(VASurfaceID * iVASurface, const UINT surfaceCount, CmSurface2D ** pSurface) = 0;
2230 CM_RT_API virtual INT DestroySurface(CmBuffer* & pSurface) = 0;
2231 CM_RT_API virtual INT DestroySurface(CmSurface2D* & pSurface) = 0;
2232 CM_RT_API virtual INT DestroySurface(CmSurface3D* & pSurface) = 0;
2233 CM_RT_API virtual INT CreateQueue(CmQueue* & pQueue) = 0;
2234 CM_RT_API virtual INT LoadProgram(void* pCommonISACode, const UINT size, CmProgram*& pProgram, const char* options = NULL) = 0;
2235 CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, CmKernel* & pKernel, const char* options = NULL) = 0;
2236 CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, const void * fncPnt, CmKernel* & pKernel, const char* options = NULL) = 0;
2237 CM_RT_API virtual INT CreateSampler(const CM_SAMPLER_STATE & sampleState, CmSampler* & pSampler) = 0;
2238 CM_RT_API virtual INT DestroyKernel(CmKernel*& pKernel) = 0;
2239 CM_RT_API virtual INT DestroySampler(CmSampler*& pSampler) = 0;
2240 CM_RT_API virtual INT DestroyProgram(CmProgram*& pProgram) = 0;
2241 CM_RT_API virtual INT DestroyThreadSpace(CmThreadSpace* & pTS) = 0;
2242 CM_RT_API virtual INT CreateTask(CmTask *& pTask) = 0;
2243 CM_RT_API virtual INT DestroyTask(CmTask*& pTask) = 0;
2244 CM_RT_API virtual INT GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void* pCapValue) = 0;
2245 CM_RT_API virtual INT CreateVmeStateG6(const VME_STATE_G6 & vmeState, CmVmeState* & pVmeState) = 0;
2246 CM_RT_API virtual INT DestroyVmeStateG6(CmVmeState*& pVmeState) = 0;
2247 CM_RT_API virtual INT CreateVmeSurfaceG6(CmSurface2D* pCurSurface, CmSurface2D* pForwardSurface, CmSurface2D* pBackwardSurface, SurfaceIndex* & pVmeIndex) = 0;
2248 CM_RT_API virtual INT DestroyVmeSurfaceG6(SurfaceIndex* & pVmeIndex) = 0;
2249 CM_RT_API virtual INT CreateThreadSpace(UINT width, UINT height, CmThreadSpace* & pTS) = 0;
2250 CM_RT_API virtual INT CreateBufferUP(UINT size, void* pSystMem, CmBufferUP* & pSurface) = 0;
2251 CM_RT_API virtual INT DestroyBufferUP(CmBufferUP* & pSurface) = 0;
2252 CM_RT_API virtual INT GetSurface2DInfo(UINT width, UINT height, CM_SURFACE_FORMAT format, UINT & pitch, UINT & physicalSize) = 0;
2253 CM_RT_API virtual INT CreateSurface2DUP(UINT width, UINT height, CM_SURFACE_FORMAT format, void* pSysMem, CmSurface2DUP* & pSurface) = 0;
2254 CM_RT_API virtual INT DestroySurface2DUP(CmSurface2DUP* & pSurface) = 0;
2255 CM_RT_API virtual INT CreateVmeSurfaceG7_5(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0;
2256 CM_RT_API virtual INT DestroyVmeSurfaceG7_5(SurfaceIndex* & pVmeIndex) = 0;
2257 CM_RT_API virtual INT CreateSampler8x8(const CM_SAMPLER_8X8_DESCR & smplDescr, CmSampler8x8*& psmplrState) = 0;
2258 CM_RT_API virtual INT DestroySampler8x8(CmSampler8x8*& pSampler) = 0;
2259 CM_RT_API virtual INT CreateSampler8x8Surface(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP) = 0;
2260 CM_RT_API virtual INT DestroySampler8x8Surface(SurfaceIndex* & pDIIndex) = 0;
2261 CM_RT_API virtual INT CreateThreadGroupSpace(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT grpSpaceWidth, UINT grpSpaceHeight, CmThreadGroupSpace*& pTGS) = 0;
2262 CM_RT_API virtual INT DestroyThreadGroupSpace(CmThreadGroupSpace*& pTGS) = 0;
2263 CM_RT_API virtual INT SetL3Config(L3_CONFIG_REGISTER_VALUES *l3_c) = 0;
2264 CM_RT_API virtual INT SetSuggestedL3Config(L3_SUGGEST_CONFIG l3_s_c) = 0;
2265 CM_RT_API virtual INT SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* pCapValue) = 0;
2266 CM_RT_API virtual INT CreateGroupedVAPlusSurface(CmSurface2D* p2DSurface1, CmSurface2D* p2DSurface2, SurfaceIndex* & pDIIndex, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP) = 0;
2267 CM_RT_API virtual INT DestroyGroupedVAPlusSurface(SurfaceIndex* & pDIIndex) = 0;
2268 CM_RT_API virtual INT CreateSamplerSurface2D(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
2269 CM_RT_API virtual INT CreateSamplerSurface3D(CmSurface3D* p3DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
2270 CM_RT_API virtual INT DestroySamplerSurface(SurfaceIndex* & pSamplerSurfaceIndex) = 0;
2271 CM_RT_API virtual INT GetRTDllVersion(CM_DLL_FILE_VERSION* pFileVersion) = 0;
2272 CM_RT_API virtual INT GetJITDllVersion(CM_DLL_FILE_VERSION* pFileVersion) = 0;
2273 CM_RT_API virtual INT InitPrintBuffer(size_t printbufsize = 1048576) = 0;
2274 CM_RT_API virtual INT FlushPrintBuffer() = 0;
2275 };
2276 };
2277
2278 class CmDevice
2279 {
2280 public:
2281 CM_RT_API virtual INT GetDevice(AbstractDeviceHandle & pDevice) = 0;
2282 CM_RT_API virtual INT CreateBuffer(UINT size, CmBuffer* & pSurface) = 0;
2283 CM_RT_API virtual INT CreateSurface2D(UINT width, UINT height, CM_SURFACE_FORMAT format, CmSurface2D* & pSurface) = 0;
2284 CM_RT_API virtual INT CreateSurface3D(UINT width, UINT height, UINT depth, CM_SURFACE_FORMAT format, CmSurface3D* & pSurface) = 0;
2285 CM_RT_API virtual INT CreateSurface2D(mfxHDLPair D3DSurfPair, CmSurface2D* & pSurface) = 0;
2286 CM_RT_API virtual INT CreateSurface2D(AbstractSurfaceHandle pD3DSurf, CmSurface2D* & pSurface) = 0;
2287 //CM_RT_API virtual INT CreateSurface2D( AbstractSurfaceHandle * pD3DSurf, const UINT surfaceCount, CmSurface2D** pSpurface ) = 0;
2288 CM_RT_API virtual INT DestroySurface(CmBuffer* & pSurface) = 0;
2289 CM_RT_API virtual INT DestroySurface(CmSurface2D* & pSurface) = 0;
2290 CM_RT_API virtual INT DestroySurface(CmSurface3D* & pSurface) = 0;
2291 CM_RT_API virtual INT CreateQueue(CmQueue* & pQueue) = 0;
2292 CM_RT_API virtual INT LoadProgram(void* pCommonISACode, const UINT size, CmProgram*& pProgram, const char* options = NULL) = 0;
2293 CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, CmKernel* & pKernel, const char* options = NULL) = 0;
2294 CM_RT_API virtual INT CreateKernel(CmProgram* pProgram, const char* kernelName, const void * fncPnt, CmKernel* & pKernel, const char* options = NULL) = 0;
2295 CM_RT_API virtual INT CreateSampler(const CM_SAMPLER_STATE & sampleState, CmSampler* & pSampler) = 0;
2296 CM_RT_API virtual INT DestroyKernel(CmKernel*& pKernel) = 0;
2297 CM_RT_API virtual INT DestroySampler(CmSampler*& pSampler) = 0;
2298 CM_RT_API virtual INT DestroyProgram(CmProgram*& pProgram) = 0;
2299 CM_RT_API virtual INT DestroyThreadSpace(CmThreadSpace* & pTS) = 0;
2300 CM_RT_API virtual INT CreateTask(CmTask *& pTask) = 0;
2301 CM_RT_API virtual INT DestroyTask(CmTask*& pTask) = 0;
2302 CM_RT_API virtual INT GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void* pCapValue) = 0;
2303 CM_RT_API virtual INT CreateVmeStateG6(const VME_STATE_G6 & vmeState, CmVmeState* & pVmeState) = 0;
2304 CM_RT_API virtual INT DestroyVmeStateG6(CmVmeState*& pVmeState) = 0;
2305 CM_RT_API virtual INT CreateVmeSurfaceG6(CmSurface2D* pCurSurface, CmSurface2D* pForwardSurface, CmSurface2D* pBackwardSurface, SurfaceIndex* & pVmeIndex) = 0;
2306 CM_RT_API virtual INT DestroyVmeSurfaceG6(SurfaceIndex* & pVmeIndex) = 0;
2307 CM_RT_API virtual INT CreateThreadSpace(UINT width, UINT height, CmThreadSpace* & pTS) = 0;
2308 CM_RT_API virtual INT CreateBufferUP(UINT size, void* pSystMem, CmBufferUP* & pSurface) = 0;
2309 CM_RT_API virtual INT DestroyBufferUP(CmBufferUP* & pSurface) = 0;
2310 CM_RT_API virtual INT GetSurface2DInfo(UINT width, UINT height, CM_SURFACE_FORMAT format, UINT & pitch, UINT & physicalSize) = 0;
2311 CM_RT_API virtual INT CreateSurface2DUP(UINT width, UINT height, CM_SURFACE_FORMAT format, void* pSysMem, CmSurface2DUP* & pSurface) = 0;
2312 CM_RT_API virtual INT DestroySurface2DUP(CmSurface2DUP* & pSurface) = 0;
2313 CM_RT_API virtual INT CreateVmeSurfaceG7_5(CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex) = 0;
2314 CM_RT_API virtual INT DestroyVmeSurfaceG7_5(SurfaceIndex* & pVmeIndex) = 0;
2315 CM_RT_API virtual INT CreateSampler8x8(const CM_SAMPLER_8X8_DESCR & smplDescr, CmSampler8x8*& psmplrState) = 0;
2316 CM_RT_API virtual INT DestroySampler8x8(CmSampler8x8*& pSampler) = 0;
2317 CM_RT_API virtual INT CreateSampler8x8Surface(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP) = 0;
2318 CM_RT_API virtual INT DestroySampler8x8Surface(SurfaceIndex* & pDIIndex) = 0;
2319 CM_RT_API virtual INT CreateThreadGroupSpace(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT grpSpaceWidth, UINT grpSpaceHeight, CmThreadGroupSpace*& pTGS) = 0;
2320 CM_RT_API virtual INT DestroyThreadGroupSpace(CmThreadGroupSpace*& pTGS) = 0;
2321 CM_RT_API virtual INT SetL3Config(L3_CONFIG_REGISTER_VALUES *l3_c) = 0;
2322 CM_RT_API virtual INT SetSuggestedL3Config(L3_SUGGEST_CONFIG l3_s_c) = 0;
2323 CM_RT_API virtual INT SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* pCapValue) = 0;
2324 CM_RT_API virtual INT CreateGroupedVAPlusSurface(CmSurface2D* p2DSurface1, CmSurface2D* p2DSurface2, SurfaceIndex* & pDIIndex, CM_SURFACE_ADDRESS_CONTROL_MODE = CM_SURFACE_CLAMP) = 0;
2325 CM_RT_API virtual INT DestroyGroupedVAPlusSurface(SurfaceIndex* & pDIIndex) = 0;
2326 CM_RT_API virtual INT CreateSamplerSurface2D(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
2327 CM_RT_API virtual INT CreateSamplerSurface3D(CmSurface3D* p3DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
2328 CM_RT_API virtual INT DestroySamplerSurface(SurfaceIndex* & pSamplerSurfaceIndex) = 0;
2329 CM_RT_API virtual INT GetRTDllVersion(CM_DLL_FILE_VERSION* pFileVersion) = 0;
2330 CM_RT_API virtual INT GetJITDllVersion(CM_DLL_FILE_VERSION* pFileVersion) = 0;
2331 CM_RT_API virtual INT InitPrintBuffer(size_t printbufsize = 1048576) = 0;
2332 CM_RT_API virtual INT FlushPrintBuffer() = 0;
2333 CM_RT_API virtual INT CreateSurface2DSubresource(AbstractSurfaceHandle pD3D11Texture2D, UINT subresourceCount, CmSurface2D** ppSurfaces, UINT& createdSurfaceCount, UINT option = 0) = 0;
2334 CM_RT_API virtual INT CreateSurface2DbySubresourceIndex(AbstractSurfaceHandle pD3D11Texture2D, UINT FirstArraySlice, UINT FirstMipSlice, CmSurface2D* &pSurface) = 0;
2335 };
2336
2337
2338 typedef void(*IMG_WALKER_FUNTYPE)(void* img, void* arg);
2339
2340 EXTERN_C CM_RT_API void CMRT_SetHwDebugStatus(bool bInStatus);
2341 EXTERN_C CM_RT_API bool CMRT_GetHwDebugStatus();
2342 EXTERN_C CM_RT_API INT CMRT_GetSurfaceDetails(CmEvent* pEvent, UINT kernIndex, UINT surfBTI, CM_SURFACE_DETAILS& outDetails);
2343 EXTERN_C CM_RT_API void CMRT_PrepareGTPinBuffers(void* ptr0, int size0InBytes, void* ptr1, int size1InBytes, void* ptr2, int size2InBytes);
2344 EXTERN_C CM_RT_API void CMRT_SetGTPinArguments(char* commandLine, void* gtpinInvokeStruct);
2345 EXTERN_C CM_RT_API void CMRT_EnableGTPinMarkers(void);
2346
2347 #define CM_CALLBACK __cdecl
2348 typedef void (CM_CALLBACK *callback_function)(CmEvent*, void *);
2349
2350 EXTERN_C CM_RT_API UINT CMRT_GetKernelCount(CmEvent *pEvent);
2351 EXTERN_C CM_RT_API INT CMRT_GetKernelName(CmEvent *pEvent, UINT index, char** KernelName);
2352 EXTERN_C CM_RT_API INT CMRT_GetKernelThreadSpace(CmEvent *pEvent, UINT index, UINT* localWidth, UINT* localHeight, UINT* globalWidth, UINT* globalHeight);
2353 EXTERN_C CM_RT_API INT CMRT_GetSubmitTime(CmEvent *pEvent, LARGE_INTEGER* time);
2354 EXTERN_C CM_RT_API INT CMRT_GetHWStartTime(CmEvent *pEvent, LARGE_INTEGER* time);
2355 EXTERN_C CM_RT_API INT CMRT_GetHWEndTime(CmEvent *pEvent, LARGE_INTEGER* time);
2356 EXTERN_C CM_RT_API INT CMRT_GetCompleteTime(CmEvent *pEvent, LARGE_INTEGER* time);
2357 EXTERN_C CM_RT_API INT CMRT_WaitForEventCallback(CmEvent *pEvent);
2358 EXTERN_C CM_RT_API INT CMRT_SetEventCallback(CmEvent* pEvent, callback_function function, void* user_data);
2359 EXTERN_C CM_RT_API INT CMRT_Enqueue(CmQueue* pQueue, CmTask* pTask, CmEvent** pEvent, const CmThreadSpace* pTS = NULL);
2360
2361 INT CreateCmDevice(CmDevice* &pD, UINT& version, VADisplay va_dpy = NULL, UINT mode = CM_DEVICE_CREATE_OPTION_DEFAULT);
2362 INT CreateCmDeviceEmu(CmDevice* &pDevice, UINT& version, VADisplay va_dpy = NULL);
2363 INT CreateCmDeviceSim(CmDevice* &pDevice, UINT& version);
2364
2365 INT DestroyCmDevice(CmDevice* &pDevice);
2366 INT DestroyCmDeviceEmu(CmDevice* &pDevice);
2367 INT DestroyCmDeviceSim(CmDevice* &pDevice);
2368
2369 int ReadProgram(CmDevice * device, CmProgram *& program, const unsigned char * buffer, unsigned int len);
2370 int ReadProgramJit(CmDevice * device, CmProgram *& program, const unsigned char * buffer, unsigned int len);
2371 int CreateKernel(CmDevice * device, CmProgram * program, const char * kernelName, const void * fncPnt, CmKernel *& kernel, const char * options = NULL);
2372
2373 #ifdef _MSVC_LANG
2374 #pragma warning(pop)
2375 #endif
2376
2377 #undef LONG
2378 #undef ULONG
2379
2380 #endif
2381
2382 #if defined(__clang__)
2383 #pragma clang diagnostic pop
2384 #elif defined(__GNUC__)
2385 #pragma GCC diagnostic pop
2386 #endif
2387
2388 #endif // __CMRT_CROSS_PLATFORM_H__
2389