1 /*
2 * Copyright (c) 2007-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 //!
23 //! \file cm_def_os.h
24 //! \brief Contains CM definitions
25 //!
26 #pragma once
27
28 #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor"
29 #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
30
31 #include <assert.h>
32 #include <stdarg.h>
33 #include <stdio.h>
34 #include <iostream>
35 #include <exception>
36 #include <string.h>
37 #include <math.h>
38 #include <errno.h>
39 #include <cstring>
40 #include "dlfcn.h"
41 #include "media_libva_cm.h"
42
43 #ifndef SUCCEEDED
44 #define SUCCEEDED(hr) (hr == VA_STATUS_SUCCESS)
45 #endif // !SUCCEEDED
46
47 #ifndef FAILED
48 #define FAILED(hr) (hr != VA_STATUS_SUCCESS)
49 #endif // !FAILED
50
51 #define CM_DRIVER_EXPOSED __attribute__ ((visibility ("default")))
52
53 #ifdef __cplusplus
54 #define EXTERN_C extern "C"
55 #else
56 #define EXTERN_C
57 #endif
58
59 static inline char *
strtok_s(char * strToken,const char * strDelimit,char ** context)60 strtok_s(char *strToken, const char *strDelimit, char **context)
61 {
62 return strtok_r(strToken, strDelimit, context);
63 }
64
memcpy_s(void * dst,size_t numberOfElements,const void * src,size_t count)65 inline int memcpy_s(void *dst, size_t numberOfElements, const void *src, size_t count)
66 {
67 if ((dst == nullptr) || (src == nullptr))
68 {
69 return EINVAL;
70 }
71 if (numberOfElements < count)
72 {
73 return ERANGE;
74 }
75 std::memcpy(dst, src, count);
76 return 0;
77 }
78
79 #define CM_CONTEXT_DATA CM_CONTEXT
80 #define PCM_CONTEXT_DATA PCM_CONTEXT
81
82 #define CM_MAX_SURFACE2D_FORMAT_COUNT 29
83 #define CM_MAX_SURFACE2D_FORMAT_COUNT_INTERNAL (CM_MAX_SURFACE2D_FORMAT_COUNT-1)
84
85 // max resolution for surface 2D
86 #define CM_MAX_2D_SURF_WIDTH 16384
87 #define CM_MAX_2D_SURF_HEIGHT 16384
88
89 typedef enum _CM_TEXTURE_ADDRESS_TYPE
90 {
91 CM_TEXTURE_ADDRESS_WRAP = 1,
92 CM_TEXTURE_ADDRESS_MIRROR = 2,
93 CM_TEXTURE_ADDRESS_CLAMP = 3,
94 CM_TEXTURE_ADDRESS_BORDER = 4,
95 CM_TEXTURE_ADDRESS_MIRRORONCE = 5
96 } CM_TEXTURE_ADDRESS_TYPE;
97
98 typedef enum _CM_TEXTURE_FILTER_TYPE
99 {
100 CM_TEXTURE_FILTER_TYPE_NONE = 0,
101 CM_TEXTURE_FILTER_TYPE_POINT = 1,
102 CM_TEXTURE_FILTER_TYPE_LINEAR = 2,
103 CM_TEXTURE_FILTER_TYPE_ANISOTROPIC = 3,
104 CM_TEXTURE_FILTER_TYPE_FLATCUBIC = 4,
105 CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC = 5,
106 CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD = 6,
107 CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD = 7
108 } CM_TEXTURE_FILTER_TYPE;
109
110 // From Compiler
111 #define CM_NOINLINE __attribute__((noinline))
112
113 namespace CMRT_UMD
114 {
115 class SurfaceIndex
116 {
117 public:
SurfaceIndex()118 CM_NOINLINE SurfaceIndex() { index = 0; extraByte = 0; };
SurfaceIndex(const SurfaceIndex & src)119 CM_NOINLINE SurfaceIndex(const SurfaceIndex& src) { index = src.index; extraByte = src.extraByte; };
SurfaceIndex(const unsigned int & n)120 CM_NOINLINE SurfaceIndex(const unsigned int& n) { index = n; extraByte = 0; };
121 CM_NOINLINE SurfaceIndex& operator = (const unsigned int& n) { this->index = n; return *this; };
122 CM_NOINLINE SurfaceIndex& operator + (const unsigned int& n) { this->index += n; return *this; };
123 CM_NOINLINE SurfaceIndex& operator= (const SurfaceIndex& other) { this->index = other.index; return *this; };
get_data(void)124 virtual unsigned int get_data(void) { return index; };
125
126 //g++ warning: class has virtual functions but non-virtual destructor
~SurfaceIndex()127 virtual ~SurfaceIndex() {};
128
129 private:
130 unsigned int index;
131
132 /*
133 * Do not delete this line:
134 * SurfaceIndex is commonly used as CM kernel function's parameter.
135 * It has virutal table and has copy constructor, so GNU calling convention will pass the object's pointer to kernel function.
136 * This is different from MSVC, which always copies the entire object transferred on the callee's stack.
137 *
138 * Depending on the special object size after adding below "extraByte",
139 * SetKernelArg and SetThreadArg can recognize this object and follow GNU's convention to construct kernel function's stack.
140 */
141 unsigned char extraByte;
142 };
143
144 class SamplerIndex
145 {
146 public:
SamplerIndex()147 CM_NOINLINE SamplerIndex() { index = 0; extraByte = 0;};
SamplerIndex(SamplerIndex & src)148 CM_NOINLINE SamplerIndex(SamplerIndex& src) { index = src.get_data(); extraByte = src.extraByte; };
SamplerIndex(const unsigned int & n)149 CM_NOINLINE SamplerIndex(const unsigned int& n) { index = n; extraByte = 0; };
150 CM_NOINLINE SamplerIndex& operator = (const unsigned int& n) { this->index = n; return *this; };
get_data(void)151 virtual unsigned int get_data(void) { return index; };
~SamplerIndex()152 virtual ~SamplerIndex(){};
153
154 private:
155 unsigned int index;
156
157 /*
158 * Do not delete this line:
159 * Same reason as SurfaceIndex.
160 */
161 unsigned char extraByte;
162 SamplerIndex& operator= (const SamplerIndex& other);
163 };
164 }
165
166 #ifndef _SYSTEMTIME_DEFINE_PROTECTOR_
167 #define _SYSTEMTIME_DEFINE_PROTECTOR_
168 typedef struct _SYSTEMTIME
169 {
170 uint16_t wYear;
171 uint16_t wMonth;
172 uint16_t wDayOfWeek;
173 uint16_t wDay;
174 uint16_t wHour;
175 uint16_t wMinute;
176 uint16_t wSecond;
177 uint16_t wMilliseconds;
178 } SYSTEMTIME, *PSYSTEMTIME;
179
GetLocalTime(PSYSTEMTIME sysTime)180 inline void GetLocalTime(PSYSTEMTIME sysTime)
181 {
182 time_t temp;
183 struct tm *localTime;
184 time(&temp);
185 localTime=localtime(&temp);
186 sysTime->wYear = localTime->tm_year;
187 sysTime->wMonth = localTime->tm_mon;
188 sysTime->wDayOfWeek = localTime->tm_wday;
189 sysTime->wDay = localTime->tm_mday;
190 sysTime->wHour = localTime->tm_hour;
191 sysTime->wMinute = localTime->tm_min;
192 sysTime->wSecond = localTime->tm_sec;
193 sysTime->wMilliseconds = 0;
194 }
195 #endif
196
197