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_AGNOSTIC_SHARE_CM_DEF_H_
23 #define CMRTLIB_AGNOSTIC_SHARE_CM_DEF_H_
24 
25 #include "cm_include.h"
26 #include "cm_def_os.h"
27 
28 //CM runtime version returning to user
29 #define CM_1_0 100
30 #define CM_2_0 200
31 #define CM_2_1 201
32 #define CM_2_2 202
33 #define CM_2_3 203
34 #define CM_2_4 204
35 #define CM_3_0 300
36 #define CM_4_0 400
37 #define CM_5_0 500
38 #define CM_6_0 600
39 #define CM_7_0 700
40 #define CM_7_2 702 //for MDFRT API refreshment.
41 #define CURRENT_CM_VERSION  (CM_7_2)
42 
43 //CM DDI version in UMD layer
44 #define CM_DDI_1_0 100
45 #define CM_DDI_1_1 101
46 #define CM_DDI_1_2 102
47 #define CM_DDI_1_3 103
48 #define CM_DDI_1_4 104
49 #define CM_DDI_2_0 200
50 #define CM_DDI_2_1 201
51 #define CM_DDI_2_2 202
52 #define CM_DDI_2_3 203
53 #define CM_DDI_2_4 204
54 #define CM_DDI_3_0 300
55 #define CM_DDI_4_0 400
56 #define CM_DDI_5_0 500
57 #define CM_DDI_6_0 600
58 #define CM_DDI_7_0 700
59 #define CM_DDI_7_2 702 //for MDFRT API refreshment.
60 
61 //Error code definition
62 typedef enum _CM_RETURN_CODE
63 {
64     CM_SUCCESS                                  = 0,
65     /*
66      * RANGE -1 ~ -9999 FOR EXTERNAL ERROR CODE
67      */
68     CM_FAILURE                                  = -1,
69     CM_NOT_IMPLEMENTED                          = -2,
70     CM_SURFACE_ALLOCATION_FAILURE               = -3,
71     CM_OUT_OF_HOST_MEMORY                       = -4,
72     CM_SURFACE_FORMAT_NOT_SUPPORTED             = -5,
73     CM_EXCEED_SURFACE_AMOUNT                    = -6,
74     CM_EXCEED_KERNEL_ARG_AMOUNT                 = -7,
75     CM_EXCEED_KERNEL_ARG_SIZE_IN_BYTE           = -8,
76     CM_INVALID_ARG_INDEX                        = -9,
77     CM_INVALID_ARG_VALUE                        = -10,
78     CM_INVALID_ARG_SIZE                         = -11,
79     CM_INVALID_THREAD_INDEX                     = -12,
80     CM_INVALID_WIDTH                            = -13,
81     CM_INVALID_HEIGHT                           = -14,
82     CM_INVALID_DEPTH                            = -15,
83     CM_INVALID_COMMON_ISA                       = -16,
84     CM_OPEN_VIDEO_DEVICE_FAILURE                = -17,
85     CM_VIDEO_DEVICE_LOCKED                      = -18,  // Video device is already locked.
86     CM_LOCK_VIDEO_DEVICE_FAILURE                = -19,  // Video device is not locked but can't be locked.
87     CM_EXCEED_SAMPLER_AMOUNT                    = -20,
88     CM_EXCEED_MAX_KERNEL_PER_ENQUEUE            = -21,
89     CM_EXCEED_MAX_KERNEL_SIZE_IN_BYTE           = -22,
90     CM_EXCEED_MAX_THREAD_AMOUNT_PER_ENQUEUE     = -23,
91     CM_EXCEED_VME_STATE_G6_AMOUNT               = -24,
92     CM_INVALID_THREAD_SPACE                     = -25,
93     CM_EXCEED_MAX_TIMEOUT                       = -26,
94     CM_JITDLL_LOAD_FAILURE                      = -27,
95     CM_JIT_COMPILE_FAILURE                      = -28,
96     CM_JIT_COMPILESIM_FAILURE                   = -29,
97     CM_INVALID_THREAD_GROUP_SPACE               = -30,
98     CM_THREAD_ARG_NOT_ALLOWED                   = -31,
99     CM_INVALID_GLOBAL_BUFFER_INDEX              = -32,
100     CM_INVALID_BUFFER_HANDLER                   = -33,
101     CM_EXCEED_MAX_SLM_SIZE                      = -34,
102     CM_JITDLL_OLDER_THAN_ISA                    = -35,
103     CM_INVALID_HARDWARE_THREAD_NUMBER           = -36,
104     CM_GTPIN_INVOKE_FAILURE                     = -37,
105     CM_INVALIDE_L3_CONFIGURATION                = -38,
106     CM_INVALID_TEXTURE2D_USAGE                  = -39,
107     CM_INTEL_GFX_NOTFOUND                       = -40,
108     CM_GPUCOPY_INVALID_SYSMEM                   = -41,
109     CM_GPUCOPY_INVALID_WIDTH                    = -42,
110     CM_GPUCOPY_INVALID_STRIDE                   = -43,
111     CM_EVENT_DRIVEN_FAILURE                     = -44,
112     CM_LOCK_SURFACE_FAIL                        = -45, // Lock surface failed
113     CM_INVALID_GENX_BINARY                      = -46,
114     CM_FEATURE_NOT_SUPPORTED_IN_DRIVER          = -47, // driver out-of-sync
115     CM_QUERY_DLL_VERSION_FAILURE                = -48, //Fail in getting DLL file version
116     CM_KERNELPAYLOAD_PERTHREADARG_MUTEX_FAIL    = -49,
117     CM_KERNELPAYLOAD_PERKERNELARG_MUTEX_FAIL    = -50,
118     CM_KERNELPAYLOAD_SETTING_FAILURE            = -51,
119     CM_KERNELPAYLOAD_SURFACE_INVALID_BTINDEX    = -52,
120     CM_NOT_SET_KERNEL_ARGUMENT                  = -53,
121     CM_GPUCOPY_INVALID_SURFACES                 = -54,
122     CM_GPUCOPY_INVALID_SIZE                     = -55,
123     CM_GPUCOPY_OUT_OF_RESOURCE                  = -56,
124     CM_INVALID_VIDEO_DEVICE                     = -57,
125     CM_SURFACE_DELAY_DESTROY                    = -58,
126     CM_INVALID_VEBOX_STATE                      = -59,
127     CM_INVALID_VEBOX_SURFACE                    = -60,
128     CM_FEATURE_NOT_SUPPORTED_BY_HARDWARE        = -61,
129     CM_RESOURCE_USAGE_NOT_SUPPORT_READWRITE     = -62,
130     CM_MULTIPLE_MIPLEVELS_NOT_SUPPORTED         = -63,
131     CM_INVALID_UMD_CONTEXT                      = -64,
132     CM_INVALID_LIBVA_SURFACE                    = -65,
133     CM_INVALID_LIBVA_INITIALIZE                 = -66,
134     CM_KERNEL_THREADSPACE_NOT_SET               = -67,
135     CM_INVALID_KERNEL_THREADSPACE               = -68,
136     CM_KERNEL_THREADSPACE_THREADS_NOT_ASSOCIATED= -69,
137     CM_KERNEL_THREADSPACE_INTEGRITY_FAILED      = -70,
138     CM_INVALID_USERPROVIDED_GENBINARY           = -71,
139     CM_INVALID_PRIVATE_DATA                     = -72,
140     CM_INVALID_MOS_RESOURCE_HANDLE              = -73,
141     CM_SURFACE_CACHED                           = -74,
142     CM_SURFACE_IN_USE                           = -75,
143     CM_INVALID_GPUCOPY_KERNEL                   = -76,
144     CM_INVALID_DEPENDENCY_WITH_WALKING_PATTERN  = -77,
145     CM_INVALID_MEDIA_WALKING_PATTERN            = -78,
146     CM_FAILED_TO_ALLOCATE_SVM_BUFFER            = -79,
147     CM_EXCEED_MAX_POWER_OPTION_FOR_PLATFORM     = -80,
148     CM_INVALID_KERNEL_THREADGROUPSPACE          = -81,
149     CM_INVALID_KERNEL_SPILL_CODE                = -82,
150     CM_UMD_DRIVER_NOT_SUPPORTED                 = -83,
151     CM_INVALID_GPU_FREQUENCY_VALUE              = -84,
152     CM_SYSTEM_MEMORY_NOT_4KPAGE_ALIGNED         = -85,
153     CM_KERNEL_ARG_SETTING_FAILED                = -86,
154     CM_NO_AVAILABLE_SURFACE                     = -87,
155     CM_VA_SURFACE_NOT_SUPPORTED                 = -88,
156     CM_TOO_MUCH_THREADS                         = -89,
157     CM_NULL_POINTER                             = -90,
158     CM_EXCEED_MAX_NUM_2D_ALIASES                = -91,
159     CM_INVALID_PARAM_SIZE                       = -92,
160     CM_GT_UNSUPPORTED                           = -93,
161     CM_GTPIN_FLAG_NO_LONGER_SUPPORTED           = -94,
162     CM_PLATFORM_UNSUPPORTED_FOR_API             = -95,
163     CM_TASK_MEDIA_RESET                         = -96,
164     CM_KERNELPAYLOAD_SAMPLER_INVALID_BTINDEX    = -97,
165     CM_EXCEED_MAX_NUM_BUFFER_ALIASES            = -98,
166     CM_SYSTEM_MEMORY_NOT_4PIXELS_ALIGNED        = -99,
167     CM_FAILED_TO_CREATE_CURBE_SURFACE           = -100,
168     CM_INVALID_CAP_NAME                         = -101,
169     CM_INVALID_PARAM_FOR_CREATE_QUEUE_EX        = -102,
170     CM_INVALID_CREATE_OPTION_FOR_BUFFER_STATELESS = -103,
171     CM_INVALID_KERNEL_ARG_POINTER                 = -104,
172     CM_LOAD_LIBRARY_FAILED                        = -105,
173     CM_NO_SUPPORTED_ADAPTER                       = -106,
174 
175     /*
176      * RANGE -10000 ~ -19999 FOR INTERNAL ERROR CODE
177      */
178     CM_INTERNAL_ERROR_CODE_OFFSET               = -10000,
179 
180     /*
181      * RANGE <=-20000 AREAD FOR MOST STATUS CONVERSION
182      */
183     CM_MOS_STATUS_CONVERTED_CODE_OFFSET         = -20000
184 } CM_RETURN_CODE;
185 
186 #define __CODEGEN_UNIQUE(name)                  _NAME_LABEL_(name, __LINE__)
187 #define BITFIELD_RANGE( startbit, endbit )     ((endbit)-(startbit)+1)
188 #define BITFIELD_BIT(bit)                        1
189 
190 #define CM_MIN_SURF_WIDTH       1
191 #define CM_MIN_SURF_HEIGHT      1
192 #define CM_MIN_SURF_DEPTH       2
193 #define CM_MAX_1D_SURF_WIDTH    0x80000000 // 2^31 2 GB
194 
195 #define CM_MAX_3D_SURF_WIDTH 2048
196 #define CM_MAX_3D_SURF_HEIGHT 2048
197 #define CM_MAX_3D_SURF_DEPTH 2048
198 
199 // hard ceiling
200 #define CM_MAX_OPTION_SIZE_IN_BYTE 512
201 #define CM_MAX_KERNEL_NAME_SIZE_IN_BYTE 256
202 #define CM_MAX_ISA_FILE_NAME_SIZE_IN_BYTE 256
203 
204 #define CM_BUFFER_STATELESS_CREATE_OPTION_GFX_MEM 0
205 #define CM_BUFFER_STATELESS_CREATE_OPTION_SYS_MEM 1
206 #define CM_BUFFER_STATELESS_CREATE_OPTION_DEGAULT CM_BUFFER_STATELESS_CREATE_OPTION_GFX_MEM
207 
208 struct CM_HAL_MAX_VALUES
209 {
210     uint32_t maxTasks;                          // [in] Max Tasks
211     uint32_t maxKernelsPerTask;                 // [in] Max kernels per task
212     uint32_t maxKernelBinarySize;               // [in] Max kernel binary size
213     uint32_t maxSpillSizePerHwThread;           // [in] Max spill size per thread
214     uint32_t maxSamplerTableSize;               // [in] Max sampler table size
215     uint32_t maxBufferTableSize;                // [in] Buffer table Size
216     uint32_t max2DSurfaceTableSize;             // [in] Buffer table Size
217     uint32_t max3DSurfaceTableSize;             // [in] Buffer table Size
218     uint32_t maxArgsPerKernel;                  // [in] Max arguments per kernel
219     uint32_t maxArgByteSizePerKernel;           // [in] Max argument size in byte per kernel
220     uint32_t maxSurfacesPerKernel;              // [in] Max Surfaces Per Kernel
221     uint32_t maxSamplersPerKernel;              // [in] Max Samplers per kernel
222     uint32_t maxHwThreads;                      // [in] Max HW threads
223     uint32_t maxUserThreadsPerTask;             // [in] Max user threads per task
224     uint32_t maxUserThreadsPerTaskNoThreadArg;  // [in] Max user threads per task without a thread arg
225 };
226 typedef CM_HAL_MAX_VALUES *PCM_HAL_MAX_VALUES;
227 
228 //---------------------------------------------------------------------------
229 //! HAL CM Max Values extention which has more entries which are not included
230 //! in CM_HAL_MAX_VALUES
231 //---------------------------------------------------------------------------
232 struct CM_HAL_MAX_VALUES_EX
233 {
234     uint32_t max2DUPSurfaceTableSize;       // [in] Max 2D UP surface table Size
235     uint32_t maxSampler8x8TableSize;        // [in] Max sampler 8x8 table size
236     uint32_t maxCURBESizePerKernel;         // [in] Max CURBE size per kernel
237     uint32_t maxCURBESizePerTask;           // [in] Max CURBE size per task
238     uint32_t maxIndirectDataSizePerKernel;  // [in] Max indirect data size per kernel
239     uint32_t maxUserThreadsPerMediaWalker;  // [in] Max user threads per media walker
240     uint32_t maxUserThreadsPerThreadGroup;  // [in] Max user threads per thread group
241 };
242 typedef CM_HAL_MAX_VALUES_EX *PCM_HAL_MAX_VALUES_EX;
243 
244 class CLock
245 {
246 public:
CLock(CSync & refSync)247     CLock(CSync &refSync) : m_refSync(refSync) { Lock(); }
~CLock()248     ~CLock() { Unlock(); }
249 
250 private:
251     CSync &m_refSync;                     // Synchronization object
252 
253     CLock(const CLock &refcSource);
254     CLock &operator=(const CLock &refcSource);
Lock()255     void Lock() { m_refSync.Acquire(); }
Unlock()256     void Unlock() { m_refSync.Release(); }
257 };
258 
259 typedef struct _CM_SAMPLER_STATE
260 {
261     CM_TEXTURE_FILTER_TYPE minFilterType;
262     CM_TEXTURE_FILTER_TYPE magFilterType;
263     CM_TEXTURE_ADDRESS_TYPE addressU;
264     CM_TEXTURE_ADDRESS_TYPE addressV;
265     CM_TEXTURE_ADDRESS_TYPE addressW;
266 } CM_SAMPLER_STATE;
267 
268 typedef enum _CM_PIXEL_TYPE
269 {
270     CM_PIXEL_UINT,
271     CM_PIXEL_SINT,
272     CM_PIXEL_OTHER
273 } CM_PIXEL_TYPE;
274 
275 typedef struct _CM_SAMPLER_STATE_EX
276 {
277     CM_TEXTURE_FILTER_TYPE minFilterType;
278     CM_TEXTURE_FILTER_TYPE magFilterType;
279     CM_TEXTURE_ADDRESS_TYPE addressU;
280     CM_TEXTURE_ADDRESS_TYPE addressV;
281     CM_TEXTURE_ADDRESS_TYPE addressW;
282 
283     CM_PIXEL_TYPE surfaceFormat;
284     union
285     {
286         uint32_t borderColorRedU;
287         int32_t borderColorRedS;
288         float borderColorRedF;
289     };
290     union
291     {
292         uint32_t borderColorGreenU;
293         int32_t borderColorGreenS;
294         float borderColorGreenF;
295     };
296     union
297     {
298         uint32_t borderColorBlueU;
299         int32_t borderColorBlueS;
300         float borderColorBlueF;
301     };
302     union
303     {
304         uint32_t borderColorAlphaU;
305         int32_t borderColorAlphaS;
306         float borderColorAlphaF;
307     };
308 } CM_SAMPLER_STATE_EX;
309 
310 //struct used by both CmDevice and CmSampler8x8
311 typedef struct _CM_AVS_COEFF_TABLE
312 {
313     float   filterCoeff_0_0;
314     float   filterCoeff_0_1;
315     float   filterCoeff_0_2;
316     float   filterCoeff_0_3;
317     float   filterCoeff_0_4;
318     float   filterCoeff_0_5;
319     float   filterCoeff_0_6;
320     float   filterCoeff_0_7;
321 } CM_AVS_COEFF_TABLE;
322 
323 #define CM_NUM_COEFF_ROWS 17
324 #define CM_NUM_COEFF_ROWS_SKL 32
325 typedef struct _CM_AVS_NONPIPLINED_STATE
326 {
327     bool bypassXAF;
328     bool bypassYAF;
329     uint8_t defaultSharpLvl;
330     uint8_t maxDerivative4Pixels;
331     uint8_t maxDerivative8Pixels;
332     uint8_t transitionArea4Pixels;
333     uint8_t transitionArea8Pixels;
334     CM_AVS_COEFF_TABLE Tbl0X[ CM_NUM_COEFF_ROWS_SKL ];
335     CM_AVS_COEFF_TABLE Tbl0Y[ CM_NUM_COEFF_ROWS_SKL ];
336     CM_AVS_COEFF_TABLE Tbl1X[ CM_NUM_COEFF_ROWS_SKL ];
337     CM_AVS_COEFF_TABLE Tbl1Y[ CM_NUM_COEFF_ROWS_SKL ];
338     bool enableRgbAdaptive;
339     bool adaptiveFilterAllChannels;
340 } CM_AVS_NONPIPLINED_STATE;
341 
342 enum CM_SAMPLER_STATE_TYPE {
343     CM_SAMPLER8X8_AVS = 0,
344     CM_SAMPLER8X8_CONV = 1,
345     CM_SAMPLER8X8_MISC = 3,
346     CM_SAMPLER8X8_CONV1DH = 4,
347     CM_SAMPLER8X8_CONV1DV = 5,
348     CM_SAMPLER8X8_AVS_EX = 6,
349     CM_SAMPLER8X8_NONE
350 };
351 
352 typedef struct _CM_AVS_STATE_MSG
353 {
354     bool avsType; //true nearest, false adaptive
355     bool eightTapAFEnable; //HSW+
356     bool bypassIEF; //ignored for BWL, moved to sampler8x8 payload.
357     bool shuffleOutputWriteback; //SKL mode only to be set when AVS msg sequence is 4x4 or 8x4
358     bool hdcDirectWriteEnable;
359     unsigned short gainFactor;
360     unsigned char globalNoiseEstm;
361     unsigned char strongEdgeThr;
362     unsigned char weakEdgeThr;
363     unsigned char strongEdgeWght;
364     unsigned char regularWght;
365     unsigned char nonEdgeWght;
366     unsigned short r3xCoefficient;
367     unsigned short r3cCoefficient;
368     unsigned short r5xCoefficient;
369     unsigned short r5cxCoefficient;
370     unsigned short r5cCoefficient;
371     //For Non-piplined states
372     unsigned short stateID;
373     CM_AVS_NONPIPLINED_STATE * avsState;
374 } CM_AVS_STATE_MSG;
375 
376 //*-----------------------------------------------------------------------------
377 //| CM Convolve type for SKL+
378 //*-----------------------------------------------------------------------------
379 typedef enum _CM_CONVOLVE_SKL_TYPE
380 {
381     CM_CONVOLVE_SKL_TYPE_2D = 0,
382     CM_CONVOLVE_SKL_TYPE_1D = 1,
383     CM_CONVOLVE_SKL_TYPE_1P = 2
384 } CM_CONVOLVE_SKL_TYPE;
385 
386 typedef struct _CM_CONVOLVE_COEFF_TABLE
387 {
388     float   filterCoeff_0_0;
389     float   filterCoeff_0_1;
390     float   filterCoeff_0_2;
391     float   filterCoeff_0_3;
392     float   filterCoeff_0_4;
393     float   filterCoeff_0_5;
394     float   filterCoeff_0_6;
395     float   filterCoeff_0_7;
396     float   filterCoeff_0_8;
397     float   filterCoeff_0_9;
398     float   filterCoeff_0_10;
399     float   filterCoeff_0_11;
400     float   filterCoeff_0_12;
401     float   filterCoeff_0_13;
402     float   filterCoeff_0_14;
403     float   filterCoeff_0_15;
404     float   filterCoeff_0_16;
405     float   filterCoeff_0_17;
406     float   filterCoeff_0_18;
407     float   filterCoeff_0_19;
408     float   filterCoeff_0_20;
409     float   filterCoeff_0_21;
410     float   filterCoeff_0_22;
411     float   filterCoeff_0_23;
412     float   filterCoeff_0_24;
413     float   filterCoeff_0_25;
414     float   filterCoeff_0_26;
415     float   filterCoeff_0_27;
416     float   filterCoeff_0_28;
417     float   filterCoeff_0_29;
418     float   filterCoeff_0_30;
419     float   filterCoeff_0_31;
420 } CM_CONVOLVE_COEFF_TABLE;
421 
422 #define CM_NUM_CONVOLVE_ROWS 16
423 #define CM_NUM_CONVOLVE_ROWS_SKL 32
424 typedef struct _CM_CONVOLVE_STATE_MSG
425 {
426     bool coeffSize; //true 16-bit, false 8-bit
427     int8_t sclDwnValue; //Scale down value
428     int8_t width; //Kernel Width
429     int8_t height; //Kernel Height
430     //SKL mode
431     bool isVertical32Mode;
432     bool isHorizontal32Mode;
433     CM_CONVOLVE_SKL_TYPE nConvolveType;
434     CM_CONVOLVE_COEFF_TABLE table[CM_NUM_CONVOLVE_ROWS_SKL];
435 } CM_CONVOLVE_STATE_MSG;
436 
437 struct CM_AVS_STATE_MSG_EX
438 {
439     CM_RT_API CM_AVS_STATE_MSG_EX();
440 
441     bool enableAllChannelAdaptiveFilter;  // adaptive filter for all channels. validValues => [true..false]
442     bool enableRgbAdaptiveFilter;          // adaptive filter for all channels. validValues => [true..false]
443     bool enable8TapAdaptiveFilter;        // enable 8-tap filter. validValues => [true..false]
444     bool enableUV8TapFilter;              // enable 8-tap filter on UV/RB channels. validValues => [true..false]
445     bool writebackFormat;                    // true sampleunorm, false standard. validValues => [true..false]
446     bool writebackMode;                      // true avs, false ief. validValues => [true..false]
447     uint8_t stateSelection;                     // 0=>first,1=>second scaler8x8 state. validValues => [0..1]
448 
449     // Image enhancement filter settings.
450     bool enableIef;        // image enhancement filter enable. validValues => [true..false]
451     bool iefType;          // true "basic" or false "advanced". validValues => [true..false]
452     bool enableIefSmooth; // true based on 3x3, false based on 5x5 validValues => [true..false]
453     float r3cCoefficient;  // smoothing coeffient. Valid values => [0.0..0.96875]
454     float r3xCoefficient;  // smoothing coeffient. Valid values => [0.0..0.96875]
455     float r5cCoefficient;  // smoothing coeffient. validValues => [0.0..0.96875]
456     float r5cxCoefficient; // smoothing coeffient. validValues => [0.0..0.96875]
457     float r5xCoefficient;  // smoothing coeffient. validValues => [0.0..0.96875]
458 
459     // Edge processing settings.
460     uint8_t strongEdgeThreshold; // validValues => [0..64]
461     uint8_t strongEdgeWeight;    // Sharpening strength when a strong edge. validValues => [0..7]
462     uint8_t weakEdgeThreshold;   // validValues => [0..64]
463     uint8_t regularEdgeWeight;   // Sharpening strength when a weak edge. validValues => [0..7]
464     uint8_t nonEdgeWeight;       // Sharpening strength when no edge. validValues => [0..7]
465 
466     // Chroma key.
467     bool enableChromaKey; // Chroma keying be performed. validValues => [true..false]
468     uint8_t chromaKeyIndex;  // ChromaKey Table entry. validValues => [0..3]
469 
470     // Skin tone settings.
471     bool enableSkinTone;              // SkinToneTunedIEF_Enable. validValues => [true..false]
472     bool enableVySkinToneDetection; // Enables STD in the VY subspace. validValues => [true..false]
473     bool skinDetailFactor;            // validValues => [true..false]
474     uint8_t skinTypesMargin;             // validValues => [0..255]
475     uint8_t skinTypesThreshold;          // validValues => [0..255]
476 
477     // Miscellaneous settings.
478     uint8_t gainFactor;             // validValues => [0..63]
479     uint8_t globalNoiseEstimation; // validValues => [0..255]
480     bool mrBoost;                // validValues => [true..false]
481     uint8_t mrSmoothThreshold;     // validValues => [0..3]
482     uint8_t mrThreshold;
483     bool steepnessBoost;         // validValues => [true..false]
484     uint8_t steepnessThreshold;     // validValues => [0..15]
485     bool textureCoordinateMode; // true: clamp, false: mirror. validValues => [true..false]
486     uint8_t maxHue;                 // Rectangle half width. validValued => [0..63]
487     uint8_t maxSaturation;          // Rectangle half length. validValued => [0..63]
488     int angles;                   // validValued => [0..360]
489     uint8_t diamondMargin ;         // validValues => [0..7]
490     char diamondDu;              // Rhombus center shift in the sat-direction. validValues => [-64..63]
491     char diamondDv;              // Rhombus center shift in the hue-direction. validValues => [-64..63]
492     float diamondAlpha;          // validValues => [0.0..4.0]
493     uint8_t diamondThreshold;       // validValues => [0..63]
494     uint8_t rectangleMargin;        // validValues => [0..7]
495     uint8_t rectangleMidpoint[2];   // validValues => [[0..255, 0..255]]
496     float vyInverseMargin[2];   // validValues => [[0.0..1.0, 0.0..1.0]]
497 
498     // Piecewise linear function settings.
499     uint8_t piecewiseLinearYPoints[4];      // validValues => [[0..255, 0..255, 0..255, 0..255]]
500     float piecewiseLinearYSlopes[2];     // validValues => [[-4.0...4.0, -4.0...4.0]]
501     uint8_t piecewiseLinearPointsLower[4];  // validValues => [[0..255, 0..255, 0..255, 0..255]]
502     uint8_t piecewiseLinearPointsUpper[4];  // validValues => [[0..255, 0..255, 0..255, 0..255]]
503     float piecewiseLinearSlopesLower[4]; // validValues => [[-4.0...4.0, -4.0...4.0, -4.0...4.0, -4.0...4.0]]
504     float piecewiseLinearSlopesUpper[4]; // validValues => [[-4.0...4.0, -4.0...4.0, -4.0...4.0, -4.0...4.0]]
505     uint8_t piecewiseLinearBiasesLower[4];  // validValues => [[0..255, 0..255, 0..255, 0..255]]
506     uint8_t piecewiseLinearBiasesUpper[4];  // validValues => [[0..255, 0..255, 0..255, 0..255]]
507 
508     // AVS non-pipelined states.
509     uint8_t defaultSharpnessLevel;   // default coefficient between smooth and sharp filtering. validValues => [0..255]
510     bool enableXAdaptiveFilter;  // validValues => [true, false]
511     bool enableYAdaptiveFilter;  // validValues => [true, false]
512     uint8_t maxDerivative4Pixels;   // lower boundary of the smooth 4 pixel area. validValues => [0..255]
513     uint8_t maxDerivative8Pixels;   // lower boundary of the smooth 8 pixel area. validValues => [0..255]
514     uint8_t transitionArea4Pixels;  // used in adaptive filtering to specify the width of the transition area for the 4 pixel calculation. validValues => [0..8]
515     uint8_t transitionArea8Pixels;  // Used in adaptive filtering to specify the width of the transition area for the 8 pixel calculation. validValues => [0..8]
516     CM_AVS_COEFF_TABLE table0X[CM_NUM_COEFF_ROWS_SKL];
517     CM_AVS_COEFF_TABLE table0Y[CM_NUM_COEFF_ROWS_SKL];
518     CM_AVS_COEFF_TABLE table1X[CM_NUM_COEFF_ROWS_SKL];
519     CM_AVS_COEFF_TABLE table1Y[CM_NUM_COEFF_ROWS_SKL];
520 };
521 
522 /*
523  *   MISC SAMPLER8x8 State
524  */
525 typedef struct _CM_MISC_STATE
526 {
527     //uint32_t 1
528     union
529     {
530         struct
531         {
532             uint32_t Row0      : 16;
533             uint32_t Reserved  : 8;
534             uint32_t Width     : 4;
535             uint32_t Height    : 4;
536         };
537         struct
538         {
539             uint32_t value;
540         };
541     } DW0;
542 
543     //uint32_t 1
544     union
545     {
546         struct
547         {
548             uint32_t Row1      : 16;
549             uint32_t Row2      : 16;
550         };
551         struct
552         {
553             uint32_t value;
554         };
555     } DW1;
556 
557     //uint32_t 2
558     union
559     {
560         struct
561         {
562             uint32_t Row3      : 16;
563             uint32_t Row4      : 16;
564         };
565         struct
566         {
567             uint32_t value;
568         };
569     } DW2;
570 
571     //uint32_t 3
572     union
573     {
574         struct
575         {
576             uint32_t Row5      : 16;
577             uint32_t Row6      : 16;
578         };
579         struct
580         {
581             uint32_t value;
582         };
583     } DW3;
584 
585     //uint32_t 4
586     union
587     {
588         struct
589         {
590             uint32_t Row7      : 16;
591             uint32_t Row8      : 16;
592         };
593         struct
594         {
595             uint32_t value;
596         };
597     } DW4;
598 
599     //uint32_t 5
600     union
601     {
602         struct
603         {
604             uint32_t Row9       : 16;
605             uint32_t Row10      : 16;
606         };
607         struct
608         {
609             uint32_t value;
610         };
611     } DW5;
612 
613     //uint32_t 6
614     union
615     {
616         struct
617         {
618             uint32_t Row11      : 16;
619             uint32_t Row12      : 16;
620         };
621         struct
622         {
623             uint32_t value;
624         };
625     } DW6;
626 
627     //uint32_t 7
628     union
629     {
630         struct
631         {
632             uint32_t Row13      : 16;
633             uint32_t Row14      : 16;
634         };
635         struct
636         {
637             uint32_t value;
638         };
639     } DW7;
640 } CM_MISC_STATE;
641 
642 /*
643  *  CONVOLVE STATE DATA STRUCTURES
644  */
645 typedef struct _CM_MISC_STATE_MSG
646 {
647     //uint32_t 0
648     union
649     {
650         struct
651         {
652             uint32_t Row0      : 16;
653             uint32_t Reserved  : 8;
654             uint32_t Width     : 4;
655             uint32_t Height    : 4;
656         };
657         struct
658         {
659             uint32_t value;
660         };
661     }DW0;
662 
663     //uint32_t 1
664     union
665     {
666         struct
667         {
668             uint32_t Row1      : 16;
669             uint32_t Row2      : 16;
670         };
671         struct
672         {
673             uint32_t value;
674         };
675     } DW1;
676 
677     //uint32_t 2
678     union
679     {
680         struct
681         {
682             uint32_t Row3      : 16;
683             uint32_t Row4      : 16;
684         };
685         struct
686         {
687             uint32_t value;
688         };
689     } DW2;
690 
691     //uint32_t 3
692     union
693     {
694         struct
695         {
696             uint32_t Row5      : 16;
697             uint32_t Row6      : 16;
698         };
699         struct
700         {
701             uint32_t value;
702         };
703     } DW3;
704 
705     //uint32_t 4
706     union
707     {
708         struct
709         {
710             uint32_t Row7      : 16;
711             uint32_t Row8      : 16;
712         };
713         struct
714         {
715             uint32_t value;
716         };
717     } DW4;
718 
719     //uint32_t 5
720     union
721     {
722         struct
723         {
724             uint32_t Row9      : 16;
725             uint32_t Row10      : 16;
726         };
727         struct
728         {
729             uint32_t value;
730         };
731     } DW5;
732 
733     //uint32_t 6
734     union
735     {
736         struct
737         {
738             uint32_t Row11      : 16;
739             uint32_t Row12      : 16;
740         };
741         struct
742         {
743             uint32_t value;
744         };
745     } DW6;
746 
747     //uint32_t 7
748     union
749     {
750         struct
751         {
752             uint32_t Row13      : 16;
753             uint32_t Row14      : 16;
754         };
755         struct
756         {
757             uint32_t value;
758         };
759     } DW7;
760 } CM_MISC_STATE_MSG;
761 
762 struct CM_SAMPLER_8X8_DESCR
763 {
764     CM_SAMPLER_STATE_TYPE stateType;
765     union
766     {
767         CM_AVS_STATE_MSG *avs;
768         CM_AVS_STATE_MSG_EX *avsEx;
769         CM_CONVOLVE_STATE_MSG *conv;
770         CM_MISC_STATE_MSG *misc; //ERODE/DILATE/MINMAX
771     };
772 };
773 #endif  // #ifndef CMRTLIB_AGNOSTIC_SHARE_CM_DEF_H_
774