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