xref: /aosp_15_r20/external/intel-media-driver/cmrtlib/linux/share/cm_def_os.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2017, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 #ifndef CMRTLIB_LINUX_SHARE_CM_DEF_OS_H_
23 #define CMRTLIB_LINUX_SHARE_CM_DEF_OS_H_
24 
25 #include "cm_include.h"
26 #include "cm_common.h"
27 
28 #ifndef ANDROID
29 #include "va/va.h"
30 #else
31 #include <va/va_android.h>
32 #define Display unsigned int
33 #endif
34 
35 #include <cstring>
36 #include "pthread.h"
37 #include <malloc.h>
38 
39 
40 ////////////////////////////////////////////////////////////////////////////////////
41 // MS-specific defines/typedefs, which are absent under Linux but still used
42 ////////////////////////////////////////////////////////////////////////////////////
43 #define _aligned_malloc(size, alignment) memalign(alignment, size)
44 #define _aligned_free(ptr) free(ptr)
45 typedef uint8_t BOOLEAN, *PBOOLEAN;
46 ////////////////////////////////////////////////////////////////////////////////////
47 // MS-specific defines/typedefs, which are absent under Linux but still used (End)
48 ////////////////////////////////////////////////////////////////////////////////////
49 
50 ////////////////////////////////////////////////////////////////////////////////////
51 //      Platform dependent macros (Start)
52 ////////////////////////////////////////////////////////////////////////////////////
53 #define CM_STRCPY(dst, sizeInBytes, src)       strcpy(dst, src)
54 #define CM_STRNCPY(dst, sizeOfDst, src, count) strncpy(dst, src, count)
55 #define CM_STRCAT(dst, sizeOfDst, src)       strcat(dst, src)
56 #define CM_GETENV(dst, name) dst = getenv(name)
57 #define CM_GETENV_FREE(dst)
58 #define CM_FOPEN(pFile, filename, mode) pFile = fopen(filename, mode)
59 
60 #ifdef __cplusplus
61 #   define EXTERN_C     extern "C"
62 #else
63 #   define EXTERN_C
64 #endif
65 
66 #define SUCCEEDED(hr)   (hr == VA_STATUS_SUCCESS)
67 #define FAILED(hr)      (hr != VA_STATUS_SUCCESS)
68 
69 typedef enum _VACMTEXTUREADDRESS {
70     VACMTADDRESS_WRAP            = 1,
71     VACMTADDRESS_MIRROR          = 2,
72     VACMTADDRESS_CLAMP           = 3,
73     VACMTADDRESS_BORDER          = 4,
74     VACMTADDRESS_MIRRORONCE      = 5,
75 
76     VACMTADDRESS_FORCE_DWORD     = 0x7fffffff
77 } VACMTEXTUREADDRESS;
78 
79 typedef enum _VACMTEXTUREFILTERTYPE {
80     VACMTEXF_NONE            = 0,
81     VACMTEXF_POINT           = 1,
82     VACMTEXF_LINEAR          = 2,
83     VACMTEXF_ANISOTROPIC     = 3,
84     VACMTEXF_FLATCUBIC       = 4,
85     VACMTEXF_GAUSSIANCUBIC   = 5,
86     VACMTEXF_PYRAMIDALQUAD   = 6,
87     VACMTEXF_GAUSSIANQUAD    = 7,
88     VACMTEXF_CONVOLUTIONMONO = 8,    // Convolution filter for monochrome textures
89     VACMTEXF_FORCE_DWORD     = 0x7fffffff
90 } VACMTEXTUREFILTERTYPE;
91 ////////////////////////////////////////////////////////////////////////////////////
92 //      Platform dependent macros (End)
93 ////////////////////////////////////////////////////////////////////////////////////
94 
95 ////////////////////////////////////////////////////////////////////////////////////
96 //      Platform dependent definitions (Start)
97 ////////////////////////////////////////////////////////////////////////////////////
98 
99 #define VAExtModuleCMRT 2
100 #define CM_MAX_SURFACE2D_FORMAT_COUNT 47
101 
CM_ALIGNED_MALLOC(size_t size,size_t alignment)102 inline void * CM_ALIGNED_MALLOC(size_t size, size_t alignment)
103 {
104   return memalign(alignment, size);
105 }
106 
CM_ALIGNED_FREE(void * memory)107 inline void CM_ALIGNED_FREE(void * memory)
108 {
109   free(memory);
110 }
111 
112 // max resolution for surface 2D
113 #define CM_MAX_2D_SURF_WIDTH  16384
114 #define CM_MAX_2D_SURF_HEIGHT 16384
115 
116 typedef enum _VA_CM_FORMAT {
117 
118     VA_CM_FMT_UNKNOWN              =   0,
119 
120     VA_CM_FMT_A8R8G8B8             =  21,
121     VA_CM_FMT_X8R8G8B8             =  22,
122     VA_CM_FMT_A8                   =  28,
123     VA_CM_FMT_A2B10G10R10          =  31,
124     VA_CM_FMT_A8B8G8R8             =  32,
125     VA_CM_FMT_R16G16UN             =  35,
126     VA_CM_FMT_A16B16G16R16         =  36,
127     VA_CM_FMT_A8P8                 =  40,
128     VA_CM_FMT_P8                   =  41,
129     VA_CM_FMT_R32U                 =  42,
130     VA_CM_FMT_R8G8UN               =  49,
131     VA_CM_FMT_L8                   =  50,
132     VA_CM_FMT_A8L8                 =  51,
133     VA_CM_FMT_R16UN                =  56,
134     VA_CM_FMT_R16U                 =  57,
135     VA_CM_FMT_V8U8                 =  60,
136     VA_CM_FMT_R8UN                 =  61,
137     VA_CM_FMT_R8U                  =  62,
138     VA_CM_FMT_R32S                 =  71,
139     VA_CM_FMT_D16                  =  80,
140     VA_CM_FMT_L16                  =  81,
141     VA_CM_FMT_R16F                 = 111,
142     VA_CM_FMT_IA44                 = 112,
143     VA_CM_FMT_A16B16G16R16F        = 113,
144     VA_CM_FMT_R32F                 = 114,
145     VA_CM_FMT_R32G32B32A32F        = 115,
146     VA_CM_FMT_I420                 = VA_FOURCC('I','4','2','0'),
147     VA_CM_FMT_P216                 = VA_FOURCC('P','2','1','6'),
148     VA_CM_FMT_400P                 = VA_FOURCC('4','0','0','P'),
149     VA_CM_FMT_Y8UN                 = VA_FOURCC('Y','8','U','N'),
150     VA_CM_FMT_NV12                 = VA_FOURCC_NV12,
151     VA_CM_FMT_UYVY                 = VA_FOURCC_UYVY,
152     VA_CM_FMT_YUY2                 = VA_FOURCC_YUY2,
153     VA_CM_FMT_444P                 = VA_FOURCC_444P,
154     VA_CM_FMT_411P                 = VA_FOURCC_411P,
155     VA_CM_FMT_422H                 = VA_FOURCC_422H,
156     VA_CM_FMT_422V                 = VA_FOURCC_422V,
157     VA_CM_FMT_411R                 = VA_FOURCC_411R,
158     VA_CM_FMT_RGBP                 = VA_FOURCC_RGBP,
159     VA_CM_FMT_BGRP                 = VA_FOURCC_BGRP,
160     VA_CM_FMT_IMC3                 = VA_FOURCC_IMC3,
161     VA_CM_FMT_YV12                 = VA_FOURCC_YV12,
162     VA_CM_FMT_P010                 = VA_FOURCC_P010,
163     VA_CM_FMT_P012                 = VA_FOURCC_P012,
164     VA_CM_FMT_P016                 = VA_FOURCC_P016,
165     VA_CM_FMT_P208                 = VA_FOURCC_P208,
166     VA_CM_FMT_AYUV                 = VA_FOURCC_AYUV,
167 #if VA_CHECK_VERSION(1, 13, 0)
168     VA_CM_FMT_XYUV                 = VA_FOURCC_XYUV,
169 #endif
170     VA_CM_FMT_Y210                 = VA_FOURCC_Y210,
171 #if VA_CHECK_VERSION(1, 9, 0)
172     VA_CM_FMT_Y212                 = VA_FOURCC_Y212,
173 #endif
174     VA_CM_FMT_Y410                 = VA_FOURCC_Y410,
175 #if VA_CHECK_VERSION(1, 9, 0)
176     VA_CM_FMT_Y412                 = VA_FOURCC_Y412,
177 #endif
178     VA_CM_FMT_Y216                 = VA_FOURCC_Y216,
179     VA_CM_FMT_Y416                 = VA_FOURCC_Y416,
180     VA_CM_FMT_AI44                 = VA_FOURCC_AI44,
181 
182     VA_CM_FMT_MAX                   = 0xFFFFFFFF
183 
184 } VA_CM_FORMAT;
185 
186 #define CM_SURFACE_FORMAT                       VA_CM_FORMAT
187 #define CM_SURFACE_FORMAT_UNKNOWN               VA_CM_FMT_UNKNOWN
188 #define CM_SURFACE_FORMAT_A8R8G8B8              VA_CM_FMT_A8R8G8B8
189 #define CM_SURFACE_FORMAT_X8R8G8B8              VA_CM_FMT_X8R8G8B8
190 #define CM_SURFACE_FORMAT_A8B8G8R8              VA_CM_FMT_A8B8G8R8
191 #define CM_SURFACE_FORMAT_A8                    VA_CM_FMT_A8
192 #define CM_SURFACE_FORMAT_P8                    VA_CM_FMT_P8
193 #define CM_SURFACE_FORMAT_R32F                  VA_CM_FMT_R32F
194 #define CM_SURFACE_FORMAT_NV12                  VA_CM_FMT_NV12
195 #define CM_SURFACE_FORMAT_UYVY                  VA_CM_FMT_UYVY
196 #define CM_SURFACE_FORMAT_YUY2                  VA_CM_FMT_YUY2
197 #define CM_SURFACE_FORMAT_V8U8                  VA_CM_FMT_V8U8
198 
199 #define CM_SURFACE_FORMAT_R8_UINT               VA_CM_FMT_R8U
200 #define CM_SURFACE_FORMAT_R16_SINT              VA_CM_FMT_A8L8
201 #define CM_SURFACE_FORMAT_R16_UINT              VA_CM_FMT_R16U
202 #define CM_SURFACE_FORMAT_D16                   VA_CM_FMT_D16
203 #define CM_SURFACE_FORMAT_L16                   VA_CM_FMT_L16
204 #define CM_SURFACE_FORMAT_A16B16G16R16          VA_CM_FMT_A16B16G16R16
205 #define CM_SURFACE_FORMAT_R10G10B10A2           VA_CM_FMT_A2B10G10R10
206 #define CM_SURFACE_FORMAT_A16B16G16R16F         VA_CM_FMT_A16B16G16R16F
207 #define CM_SURFACE_FORMAT_R32G32B32A32F         VA_CM_FMT_R32G32B32A32F
208 
209 #define CM_SURFACE_FORMAT_444P                  VA_CM_FMT_444P
210 #define CM_SURFACE_FORMAT_422H                  VA_CM_FMT_422H
211 #define CM_SURFACE_FORMAT_422V                  VA_CM_FMT_422V
212 #define CM_SURFACE_FORMAT_411P                  VA_CM_FMT_411P
213 #define CM_SURFACE_FORMAT_411R                  VA_CM_FMT_411R
214 #define CM_SURFACE_FORMAT_RGBP                  VA_CM_FMT_RGBP
215 #define CM_SURFACE_FORMAT_BGRP                  VA_CM_FMT_BGRP
216 #define CM_SURFACE_FORMAT_IMC3                  VA_CM_FMT_IMC3
217 #define CM_SURFACE_FORMAT_YV12                  VA_CM_FMT_YV12
218 #define CM_SURFACE_FORMAT_P010                  VA_CM_FMT_P010
219 #define CM_SURFACE_FORMAT_P016                  VA_CM_FMT_P016
220 #define CM_SURFACE_FORMAT_P208                  VA_CM_FMT_P208
221 #define CM_SURFACE_FORMAT_AYUV                  VA_CM_FMT_AYUV
222 #define CM_SURFACE_FORMAT_Y210                  VA_CM_FMT_Y210
223 #define CM_SURFACE_FORMAT_Y410                  VA_CM_FMT_Y410
224 #define CM_SURFACE_FORMAT_Y216                  VA_CM_FMT_Y216
225 #define CM_SURFACE_FORMAT_Y416                  VA_CM_FMT_Y416
226 
227 #define CM_SURFACE_FORMAT_IA44                  VA_CM_FMT_IA44
228 #define CM_SURFACE_FORMAT_AI44                  VA_CM_FMT_AI44
229 #define CM_SURFACE_FORMAT_I420                  VA_CM_FMT_I420
230 #define CM_SURFACE_FORMAT_P216                  VA_CM_FMT_P216
231 #define CM_SURFACE_FORMAT_400P                  VA_CM_FMT_400P
232 #define CM_SURFACE_FORMAT_R16_FLOAT             VA_CM_FMT_R16F
233 #define CM_SURFACE_FORMAT_Y8_UNORM              VA_CM_FMT_Y8UN
234 #define CM_SURFACE_FORMAT_A8P8                  VA_CM_FMT_A8P8
235 #define CM_SURFACE_FORMAT_R32_SINT              VA_CM_FMT_R32S
236 #define CM_SURFACE_FORMAT_R32_UINT              VA_CM_FMT_R32U
237 #define CM_SURFACE_FORMAT_R8G8_UNORM            VA_CM_FMT_R8G8UN
238 #define CM_SURFACE_FORMAT_R8_UNORM              VA_CM_FMT_R8UN
239 #define CM_SURFACE_FORMAT_R16G16_UNORM          VA_CM_FMT_R16G16UN
240 #define CM_SURFACE_FORMAT_R16_UNORM             VA_CM_FMT_R16UN
241 
242 
243 #define CM_TEXTURE_ADDRESS_TYPE                 VACMTEXTUREADDRESS
244 #define CM_TEXTURE_ADDRESS_WRAP                 VACMTADDRESS_WRAP
245 #define CM_TEXTURE_ADDRESS_MIRROR               VACMTADDRESS_MIRROR
246 #define CM_TEXTURE_ADDRESS_CLAMP                VACMTADDRESS_CLAMP
247 #define CM_TEXTURE_ADDRESS_BORDER               VACMTADDRESS_BORDER
248 #define CM_TEXTURE_ADDRESS_MIRRORONCE           VACMTADDRESS_MIRRORONCE
249 
250 #define CM_TEXTURE_FILTER_TYPE                  VACMTEXTUREFILTERTYPE
251 #define CM_TEXTURE_FILTER_TYPE_NONE             VACMTEXF_NONE
252 #define CM_TEXTURE_FILTER_TYPE_POINT            VACMTEXF_POINT
253 #define CM_TEXTURE_FILTER_TYPE_LINEAR           VACMTEXF_LINEAR
254 #define CM_TEXTURE_FILTER_TYPE_ANISOTROPIC      VACMTEXF_ANISOTROPIC
255 #define CM_TEXTURE_FILTER_TYPE_FLATCUBIC        VACMTEXF_FLATCUBIC
256 #define CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC    VACMTEXF_GAUSSIANCUBIC
257 #define CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD    VACMTEXF_PYRAMIDALQUAD
258 #define CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD     VACMTEXF_GAUSSIANQUAD
259 #define CM_TEXTURE_FILTER_TYPE_CONVOLUTIONMONO  VACMTEXF_CONVOLUTIONMONO
260 ////////////////////////////////////////////////////////////////////////////////////
261 //      Platform dependent definitions (End)
262 ////////////////////////////////////////////////////////////////////////////////////
263 
264 typedef enum _AdapterInfoType
265 {
266     Description,                    //    char Description[ 256 ];
267     VendorId,                       //    uint32_t VendorId;
268     DeviceId,                       //    uint32_t DeviceId;
269     SubSysId,                       //    uint32_t SubSysId;
270     Revision,                       //    uint32_t Revision;
271     DedicatedVideoMemory,           //    uint32_t DedicatedVideoMemory;
272     DedicatedSystemMemory,          //    uint32_t DedicatedSystemMemory;
273     SharedSystemMemory,             //    uint32_t SharedSystemMemory;
274     MaxThread,                      //    uint32_t hardware thread count
275     EuNumber,                       //    uint32_t EU count
276     TileNumber,                     //    uint32_t Tile count
277     Reserved                        //    uint32_t
278 } AdapterInfoType;
279 
280 typedef enum _REGISTRATION_OP
281 {
282     REG_IGNORE          = 0,
283     REG_REGISTER        = 1,
284     REG_UNREGISTER      = 2,
285     REG_REGISTER_INDEX  = 3     // Register surface for Cm
286 } REGISTRATION_OP;
287 
288 class CSync
289 {
290 public:
CSync()291     CSync() { pthread_mutex_init(&m_criticalSection, nullptr); }
~CSync()292     ~CSync() { pthread_mutex_destroy(&m_criticalSection); }
Acquire()293     void Acquire() {  pthread_mutex_lock(&m_criticalSection); }
Release()294     void Release() {pthread_mutex_unlock(&m_criticalSection); }
295 
296 private:
297     pthread_mutex_t m_criticalSection;
298 };
299 
300 //The communication function for CM to call into UMD,  get function pointer by libVA::vaGetLibFunc()
301 typedef VAStatus (__cdecl *pvaCmExtSendReqMsg)(VADisplay dpy, void *moduleType,
302                                              uint32_t *inputFunId,  void *inputData,  uint32_t *inputDataLen,
303                          uint32_t *outputFunId, void *outputData, uint32_t *outputDataLen);
304 
305 typedef struct _CM_CREATESURFACE2D_PARAM
306 {
307     uint32_t    width;                     // [in] width of 2D texture in pixel
308     uint32_t    height;                    // [in] height of 2D texture in pixel
309     CM_SURFACE_FORMAT   format;             // [in] DXGI format of 2D texture
310     union
311     {
312         uint32_t index2DinLookupTable;       // [in] surface 2d's index in look up table.
313         uint32_t vaSurfaceID;              // [in] libva-surface 2d's index in media driver
314     };
315     VASurfaceID *vaSurface;                  // [in] Pointer to a Libva Surface.
316     void        *cmSurface2DHandle;         // [out] pointer of CmSurface2D used in driver
317     bool        isCmCreated;
318     int32_t     returnValue;               // [out] the return value from driver
319     bool        isLibvaCreated;            // [in] if the surface created via libva
320     void        *vaDpy;                     // [in] VaDisplay used to free va sruface
321 }CM_CREATESURFACE2D_PARAM, *PCM_CREATESURFACE2D_PARAM;
322 
323 //The communication function for CM to call into UMD,  get function pointer by libVA::vaGetLibFunc()
324 typedef VAStatus (__cdecl *pvaCmExtSendReqMsg)(
325                             VADisplay dpy,
326                             void *moduleType,
327                             uint32_t *inputFunId,
328                             void *inputData,
329                             uint32_t *inputDataLen,
330                             uint32_t *outputFunId,
331                             void *outputData,
332                             uint32_t *outputDataLen);
333 
334 typedef VADisplay (*pfVAGetDisplayDRM) (int32_t fd);    //vaGetDisplayDRM from libva-drm.so
335 
336 #ifndef CMRT_NOINLINE
337 #define CMRT_NOINLINE __attribute__((noinline))
338 #endif
339 
340 #ifdef _DEBUG
341 #define CmAssert(expr)        \
342     if( !(expr) )             \
343     {                         \
344     __builtin_trap();         \
345     }
346 #else
347 #define CmAssert(expr)
348 #endif
349 
350 typedef void *HMODULE;
351 
352 #endif  // #ifndef CMRTLIB_LINUX_SHARE_CM_DEF_OS_H_
353