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 <cstdlib>
36 #include <cstring>
37 #include "pthread.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 aligned_alloc(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_P016                 = VA_FOURCC_P016,
164     VA_CM_FMT_P208                 = VA_FOURCC_P208,
165     VA_CM_FMT_AYUV                 = VA_FOURCC_AYUV,
166     VA_CM_FMT_Y210                 = VA_FOURCC_Y210,
167     VA_CM_FMT_Y410                 = VA_FOURCC_Y410,
168     VA_CM_FMT_Y216                 = VA_FOURCC_Y216,
169     VA_CM_FMT_Y416                 = VA_FOURCC_Y416,
170     VA_CM_FMT_AI44                 = VA_FOURCC_AI44,
171 
172     VA_CM_FMT_MAX                   = 0xFFFFFFFF
173 
174 } VA_CM_FORMAT;
175 
176 #define CM_SURFACE_FORMAT                       VA_CM_FORMAT
177 #define CM_SURFACE_FORMAT_UNKNOWN               VA_CM_FMT_UNKNOWN
178 #define CM_SURFACE_FORMAT_A8R8G8B8              VA_CM_FMT_A8R8G8B8
179 #define CM_SURFACE_FORMAT_X8R8G8B8              VA_CM_FMT_X8R8G8B8
180 #define CM_SURFACE_FORMAT_A8B8G8R8              VA_CM_FMT_A8B8G8R8
181 #define CM_SURFACE_FORMAT_A8                    VA_CM_FMT_A8
182 #define CM_SURFACE_FORMAT_P8                    VA_CM_FMT_P8
183 #define CM_SURFACE_FORMAT_R32F                  VA_CM_FMT_R32F
184 #define CM_SURFACE_FORMAT_NV12                  VA_CM_FMT_NV12
185 #define CM_SURFACE_FORMAT_UYVY                  VA_CM_FMT_UYVY
186 #define CM_SURFACE_FORMAT_YUY2                  VA_CM_FMT_YUY2
187 #define CM_SURFACE_FORMAT_V8U8                  VA_CM_FMT_V8U8
188 
189 #define CM_SURFACE_FORMAT_R8_UINT               VA_CM_FMT_R8U
190 #define CM_SURFACE_FORMAT_R16_SINT              VA_CM_FMT_A8L8
191 #define CM_SURFACE_FORMAT_R16_UINT              VA_CM_FMT_R16U
192 #define CM_SURFACE_FORMAT_D16                   VA_CM_FMT_D16
193 #define CM_SURFACE_FORMAT_L16                   VA_CM_FMT_L16
194 #define CM_SURFACE_FORMAT_A16B16G16R16          VA_CM_FMT_A16B16G16R16
195 #define CM_SURFACE_FORMAT_R10G10B10A2           VA_CM_FMT_A2B10G10R10
196 #define CM_SURFACE_FORMAT_A16B16G16R16F         VA_CM_FMT_A16B16G16R16F
197 #define CM_SURFACE_FORMAT_R32G32B32A32F         VA_CM_FMT_R32G32B32A32F
198 
199 #define CM_SURFACE_FORMAT_444P                  VA_CM_FMT_444P
200 #define CM_SURFACE_FORMAT_422H                  VA_CM_FMT_422H
201 #define CM_SURFACE_FORMAT_422V                  VA_CM_FMT_422V
202 #define CM_SURFACE_FORMAT_411P                  VA_CM_FMT_411P
203 #define CM_SURFACE_FORMAT_411R                  VA_CM_FMT_411R
204 #define CM_SURFACE_FORMAT_RGBP                  VA_CM_FMT_RGBP
205 #define CM_SURFACE_FORMAT_BGRP                  VA_CM_FMT_BGRP
206 #define CM_SURFACE_FORMAT_IMC3                  VA_CM_FMT_IMC3
207 #define CM_SURFACE_FORMAT_YV12                  VA_CM_FMT_YV12
208 #define CM_SURFACE_FORMAT_P010                  VA_CM_FMT_P010
209 #define CM_SURFACE_FORMAT_P016                  VA_CM_FMT_P016
210 #define CM_SURFACE_FORMAT_P208                  VA_CM_FMT_P208
211 #define CM_SURFACE_FORMAT_AYUV                  VA_CM_FMT_AYUV
212 #define CM_SURFACE_FORMAT_Y210                  VA_CM_FMT_Y210
213 #define CM_SURFACE_FORMAT_Y410                  VA_CM_FMT_Y410
214 #define CM_SURFACE_FORMAT_Y216                  VA_CM_FMT_Y216
215 #define CM_SURFACE_FORMAT_Y416                  VA_CM_FMT_Y416
216 
217 #define CM_SURFACE_FORMAT_IA44                  VA_CM_FMT_IA44
218 #define CM_SURFACE_FORMAT_AI44                  VA_CM_FMT_AI44
219 #define CM_SURFACE_FORMAT_I420                  VA_CM_FMT_I420
220 #define CM_SURFACE_FORMAT_P216                  VA_CM_FMT_P216
221 #define CM_SURFACE_FORMAT_400P                  VA_CM_FMT_400P
222 #define CM_SURFACE_FORMAT_R16_FLOAT             VA_CM_FMT_R16F
223 #define CM_SURFACE_FORMAT_Y8_UNORM              VA_CM_FMT_Y8UN
224 #define CM_SURFACE_FORMAT_A8P8                  VA_CM_FMT_A8P8
225 #define CM_SURFACE_FORMAT_R32_SINT              VA_CM_FMT_R32S
226 #define CM_SURFACE_FORMAT_R32_UINT              VA_CM_FMT_R32U
227 #define CM_SURFACE_FORMAT_R8G8_UNORM            VA_CM_FMT_R8G8UN
228 #define CM_SURFACE_FORMAT_R8_UNORM              VA_CM_FMT_R8UN
229 #define CM_SURFACE_FORMAT_R16G16_UNORM          VA_CM_FMT_R16G16UN
230 #define CM_SURFACE_FORMAT_R16_UNORM             VA_CM_FMT_R16UN
231 
232 
233 #define CM_TEXTURE_ADDRESS_TYPE                 VACMTEXTUREADDRESS
234 #define CM_TEXTURE_ADDRESS_WRAP                 VACMTADDRESS_WRAP
235 #define CM_TEXTURE_ADDRESS_MIRROR               VACMTADDRESS_MIRROR
236 #define CM_TEXTURE_ADDRESS_CLAMP                VACMTADDRESS_CLAMP
237 #define CM_TEXTURE_ADDRESS_BORDER               VACMTADDRESS_BORDER
238 #define CM_TEXTURE_ADDRESS_MIRRORONCE           VACMTADDRESS_MIRRORONCE
239 
240 #define CM_TEXTURE_FILTER_TYPE                  VACMTEXTUREFILTERTYPE
241 #define CM_TEXTURE_FILTER_TYPE_NONE             VACMTEXF_NONE
242 #define CM_TEXTURE_FILTER_TYPE_POINT            VACMTEXF_POINT
243 #define CM_TEXTURE_FILTER_TYPE_LINEAR           VACMTEXF_LINEAR
244 #define CM_TEXTURE_FILTER_TYPE_ANISOTROPIC      VACMTEXF_ANISOTROPIC
245 #define CM_TEXTURE_FILTER_TYPE_FLATCUBIC        VACMTEXF_FLATCUBIC
246 #define CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC    VACMTEXF_GAUSSIANCUBIC
247 #define CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD    VACMTEXF_PYRAMIDALQUAD
248 #define CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD     VACMTEXF_GAUSSIANQUAD
249 #define CM_TEXTURE_FILTER_TYPE_CONVOLUTIONMONO  VACMTEXF_CONVOLUTIONMONO
250 ////////////////////////////////////////////////////////////////////////////////////
251 //      Platform dependent definitions (End)
252 ////////////////////////////////////////////////////////////////////////////////////
253 
254 typedef enum _REGISTRATION_OP
255 {
256     REG_IGNORE          = 0,
257     REG_REGISTER        = 1,
258     REG_UNREGISTER      = 2,
259     REG_REGISTER_INDEX  = 3     // Register surface for Cm
260 } REGISTRATION_OP;
261 
262 class CSync
263 {
264 public:
CSync()265     CSync() { pthread_mutex_init(&m_criticalSection, nullptr); }
~CSync()266     ~CSync() { pthread_mutex_destroy(&m_criticalSection); }
Acquire()267     void Acquire() {  pthread_mutex_lock(&m_criticalSection); }
Release()268     void Release() {pthread_mutex_unlock(&m_criticalSection); }
269 
270 private:
271     pthread_mutex_t m_criticalSection;
272 };
273 
274 //The communication function for CM to call into UMD,  get function pointer by libVA::vaGetLibFunc()
275 typedef VAStatus (__cdecl *pvaCmExtSendReqMsg)(VADisplay dpy, void *moduleType,
276                                              uint32_t *inputFunId,  void *inputData,  uint32_t *inputDataLen,
277                          uint32_t *outputFunId, void *outputData, uint32_t *outputDataLen);
278 
279 typedef struct _CM_CREATESURFACE2D_PARAM
280 {
281     uint32_t    width;                     // [in] width of 2D texture in pixel
282     uint32_t    height;                    // [in] height of 2D texture in pixel
283     CM_SURFACE_FORMAT   format;             // [in] DXGI format of 2D texture
284     union
285     {
286         uint32_t index2DinLookupTable;       // [in] surface 2d's index in look up table.
287         uint32_t vaSurfaceID;              // [in] libva-surface 2d's index in media driver
288     };
289     VASurfaceID *vaSurface;                  // [in] Pointer to a Libva Surface.
290     void        *cmSurface2DHandle;         // [out] pointer of CmSurface2D used in driver
291     bool        isCmCreated;
292     int32_t     returnValue;               // [out] the return value from driver
293     bool        isLibvaCreated;            // [in] if the surface created via libva
294     void        *vaDpy;                     // [in] VaDisplay used to free va sruface
295 }CM_CREATESURFACE2D_PARAM, *PCM_CREATESURFACE2D_PARAM;
296 
297 //The communication function for CM to call into UMD,  get function pointer by libVA::vaGetLibFunc()
298 typedef VAStatus (__cdecl *pvaCmExtSendReqMsg)(
299                             VADisplay dpy,
300                             void *moduleType,
301                             uint32_t *inputFunId,
302                             void *inputData,
303                             uint32_t *inputDataLen,
304                             uint32_t *outputFunId,
305                             void *outputData,
306                             uint32_t *outputDataLen);
307 
308 typedef VADisplay (*pfVAGetDisplayDRM) (int32_t fd);    //vaGetDisplayDRM from libva-drm.so
309 
310 #ifndef CMRT_NOINLINE
311 #define CMRT_NOINLINE __attribute__((noinline))
312 #endif
313 
314 #ifdef _DEBUG
315 #define CmAssert(expr)        \
316     if( !(expr) )             \
317     {                         \
318     __builtin_trap();         \
319     }
320 #else
321 #define CmAssert(expr)
322 #endif
323 
324 typedef void *HMODULE;
325 
326 #endif  // #ifndef CMRTLIB_LINUX_SHARE_CM_DEF_OS_H_
327