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