1 /*
2 * Copyright (c) 2009-2021, 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     vphal_common.h
24 //! \brief    clarify common utilities for vphal
25 //! \details  clarify common utilities for vphal including:
26 //!           some marcro, enum, union, structure, function
27 //!
28 #ifndef __VPHAL_COMMON_H__
29 #define __VPHAL_COMMON_H__
30 
31 #if EMUL || VPHAL_LIB
32 
33 #include "support.h"
34 
35 #endif  // EMUL || VPHAL_LIB
36 
37 #include "mos_os.h"
38 #include "vphal_common_hdr.h"
39 #include "media_common_defs.h"
40 
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44 
45 //!
46 //! \def DBG_TEXT(txt)
47 //! Allow certain \a txt fields to be present only on DEBUG builds.
48 //!
49 #if _DEBUG
50 #define DBG_TEXT(txt) txt
51 #else
52 #define DBG_TEXT(txt) ""
53 #endif
54 
55 #ifndef ABS
56 //!
57 //! \def ABS( x )
58 //! Calcualte absolute value of \a x.
59 //!
60 #define ABS(a)      (((a) < 0) ? (-(a)) : (a))
61 #endif
62 
63 //!
64 //! \def OUT_OF_BOUNDS(a, min, max)
65 //! Calcualte if \a a out the range of  [\a min, \a max].
66 //!
67 #define OUT_OF_BOUNDS(a, min, max) ( ((a) < (min)) || ((a) > (max)) )
68 
69 //!
70 //! \def WITHIN_BOUNDS(a, min, max)
71 //! Calcualte if \a a within the range of  [\a min, \a max].
72 //!
73 #define WITHIN_BOUNDS(a, min, max) ( ((a) >= (min)) && ((a) <= (max)) )
74 
75 //!
76 //! \def VPHAL_ABS(x)
77 //! Calcualte the Abslute value of \a x.
78 //!
79 #define VPHAL_ABS(x)               (((x) > 0) ? (x) : -(x))
80 
81 #define VPHAL_PI                   3.14159265358979324f //!< Definition the const pi
82 
83 //!
84 //! \def SAME_SIZE_RECT(rect1, rect2)
85 //! Compare if the size of two rectangles is the same
86 //!
87 #define SAME_SIZE_RECT(rect1, rect2)                                            \
88     (((rect1).right  - (rect1).left == (rect2).right  - (rect2).left) &&        \
89      ((rect1).bottom - (rect1).top  == (rect2).bottom - (rect2).top))
90 
91 //!
92 //! \def RECT1_EQUALS_RECT2(rect1, rect2)
93 //! Compare if two rectangles has the same coordinate
94 //!
95 #define RECT1_EQUALS_RECT2(rect1, rect2)                                        \
96     (((rect1).left  == (rect2).left)  && ((rect1).top    == (rect2).top) &&     \
97      ((rect1).right == (rect2).right) && ((rect1).bottom == (rect2).bottom))
98 
99 //!
100 //! \def RECT1_CONTAINS_RECT2(rect1, rect2)
101 //! Compare if rectangle \a rect1 contains rectangle \a rect2 in coordinate
102 //!
103 #define RECT1_CONTAINS_RECT2(rect1, rect2)                                      \
104     (((rect1).left  <= (rect2).left)  && ((rect1).top    <= (rect2).top) &&     \
105      ((rect1).right >= (rect2).right) && ((rect1).bottom >= (rect2).bottom))
106 
107 //!
108 //! \def RECT1_CONTAINS_RECT2_ONEPIXELBIAS(rect1, rect2)
109 //! Compare if rectangle \a rect1 contains rectangle \a rect2 in coordinate, One pixel bias is allowed
110 //!
111 #define RECT1_CONTAINS_RECT2_ONEPIXELBIAS(rect1, rect2)                                    \
112     (((rect1).left  <= ((rect2).left + 1))  && ((rect1).top    <= ((rect2).top + 1)) &&  \
113      (((rect1).right + 1) >= (rect2).right) && (((rect1).bottom + 1) >= (rect2).bottom))
114 
115 //!
116 //! \def RECT1_OUTSIDE_RECT2(rect1, rect2)
117 //! Compare if the rectangle \a rect1 is outside the rectangle \a rect2 at least partly in coordinate
118 //!
119 #define RECT1_OUTSIDE_RECT2(rect1, rect2)                                       \
120     (((rect1).left  >= (rect2).right) || ((rect1).top    >= (rect2).bottom) ||  \
121      ((rect1).right <= (rect2).left)  || ((rect1).bottom <= (rect2).top))
122 
123 //!
124 // \def DEGREE_TO_RADIAN(degree)
125 // Convert a degree value \a degree to radian.
126 //!
127 #define DEGREE_TO_RADIAN(degree)   (degree) * (VPHAL_PI) / 180
128 #define AVS_TBL_COEF_PREC         6           //!< Table coef precision (after decimal point
129 #define SAME_SAMPLE_THRESHOLD     1000        //!< When checking whether 2 timestamps are the same, leave room for some error
130 
131 //!
132 //! \def MEDIA_IS_HDCONTENT(dwWidth, dwHeight)
133 //! Determine if the size of content is HD
134 //!
135 #define MEDIA_SDCONTENT_MAX_WIDTH        720
136 #define MEDIA_SDCONTENT_MAX_PAL_HEIGHT   576
137 #define MEDIA_SDCONTENT_MAX_SW_WIDTH     768
138 #define MEDIA_IS_HDCONTENT(dwWidth, dwHeight)    ((dwWidth > MEDIA_SDCONTENT_MAX_SW_WIDTH) || (dwHeight > MEDIA_SDCONTENT_MAX_PAL_HEIGHT))
139 
140 //! \brief  Surface cache attributes
141 //!
142 #define VPHAL_SET_SURF_MEMOBJCTL(VpField, GmmUsageEnum)                                                         \
143     {                                                                                                           \
144         Usage = GmmUsageEnum;                                                                                   \
145         MemObjCtrl = pOsInterface->pfnCachePolicyGetMemoryObject(Usage, pOsInterface->pfnGetGmmClientContext(pOsInterface));                                        \
146         VpField = MemObjCtrl.DwordValue;                                                                        \
147     }
148 
149 #define VPHAL_MEMORY_OBJECT_CONTROL     uint32_t
150 
151 // ProcAmp Default Values
152 #define PROCAMP_BRIGHTNESS_MIN     -100.0F
153 #define PROCAMP_BRIGHTNESS_MAX      100.0F
154 #define PROCAMP_BRIGHTNESS_DEFAULT    0.0F
155 #define PROCAMP_BRIGHTNESS_STEP       0.1F
156 #define PROCAMP_CONTRAST_MIN          0.0F
157 #define PROCAMP_CONTRAST_MAX         10.0F
158 #define PROCAMP_CONTRAST_DEFAULT      1.0F
159 #define PROCAMP_CONTRAST_STEP         0.01F
160 #define PROCAMP_HUE_MIN            -180.0F
161 #define PROCAMP_HUE_MAX             180.0F
162 #define PROCAMP_HUE_DEFAULT           0.0F
163 #define PROCAMP_HUE_STEP              0.1F
164 #define PROCAMP_SATURATION_MIN        0.0F
165 #define PROCAMP_SATURATION_MAX       10.0F
166 #define PROCAMP_SATURATION_DEFAULT    1.0F
167 #define PROCAMP_SATURATION_STEP       0.01F
168 
169 // Denoise Default Values
170 #define NOISEREDUCTION_MIN            0.0F
171 #define NOISEREDUCTION_MAX           64.0F
172 #define NOISEREDUCTION_DEFAULT        0.0F
173 #define NOISEREDUCTION_STEP           1.0F
174 
175 // Sharpness Values
176 #define EDGEENHANCEMENT_MIN           0.0F
177 #define EDGEENHANCEMENT_MAX          64.0F
178 #define EDGEENHANCEMENT_DEFAULT      44.0F
179 #define EDGEENHANCEMENT_STEP          1.0F
180 #define IEF_STRONG_EDGE_WEIGHT          7
181 #define IEF_REGULAR_WEIGHT              2
182 #define IEF_STRONG_EDGE_THRESHOLD       8
183 
184 // Skin Tone Detection/Enhancement  values
185 #define STE_MIN                       0.0F
186 #define STE_MAX                       9.0F
187 #define STE_DEFAULT                   3.0F
188 #define STE_STEP                      1.0F
189 
190 // Total Color Correction values
191 #define TCC_MIN                       0.0F
192 #define TCC_MAX                     255.0F
193 #define TCC_DEFAULT                 160.0F
194 #define TCC_STEP                      1.0F
195 
196 // Adaptive Contrast Enhancement values
197 #define ACE_LEVEL_DEFAULT               5
198 #define ACE_STRENGTH_DEFAULT            1
199 
200 // Compositing Block size
201 #define VPHAL_COMP_BLOCK_WIDTH  16
202 #define VPHAL_COMP_BLOCK_HEIGHT 16
203 
204 // NLAS Default Values
205 #define NLAS_VERTICALCROP_MIN         0.0F
206 #define NLAS_VERTICALCROP_MAX         1.0F
207 #define NLAS_VERTICALCROP_DEFAULT     0.0F
208 #define NLAS_VERTICALCROP_STEP        0.001F
209 #define NLAS_HLINEARREGION_MIN        0.0F
210 #define NLAS_HLINEARREGION_MAX        1.0F
211 #define NLAS_HLINEARREGION_DEFAULT    1.0F
212 #define NLAS_HLINEARREGION_STEP       0.001F
213 #define NLAS_NONLINEARCROP_MIN        0.0F
214 #define NLAS_NONLINEARCROP_MAX        1.0F
215 #define NLAS_NONLINEARCROP_DEFAULT    0.0F
216 #define NLAS_NONLINEARCROP_STEP       0.001F
217 
218 #define VPHAL_MAX_SOURCES               65       //!< worst case: 64 sub-streams + 1 pri video
219 #define VPHAL_MAX_CHANNELS              2
220 #define VPHAL_MAX_TARGETS               8        //!< multi output support
221 #define VPHAL_MAX_FUTURE_FRAMES         18       //!< maximum future frames supported in VPHAL
222 
223 #define VPHAL_TOP_FIELD           0
224 #define VPHAL_BOTTOM_FIELD        1
225 #define VPHAL_TOP_FIELD_FIRST     0
226 #define VPHAL_BOTTOM_FIELD_FIRST  1
227 
228 typedef struct _VPHAL_COMPOSITE_CACHE_CNTL
229 {
230     bool                           bL3CachingEnabled;
231     VPHAL_MEMORY_OBJECT_CONTROL    PrimaryInputSurfMemObjCtl;
232     VPHAL_MEMORY_OBJECT_CONTROL    InputSurfMemObjCtl;
233     VPHAL_MEMORY_OBJECT_CONTROL    TargetSurfMemObjCtl;
234 } VPHAL_COMPOSITE_CACHE_CNTL, *PVPHAL_COMPOSITE_CACHE_CNTL;
235 
236 typedef struct _VPHAL_DNDI_CACHE_CNTL
237 {
238     bool                            bL3CachingEnabled;
239     VPHAL_MEMORY_OBJECT_CONTROL     CurrentInputSurfMemObjCtl;
240     VPHAL_MEMORY_OBJECT_CONTROL     PreviousInputSurfMemObjCtl;
241     VPHAL_MEMORY_OBJECT_CONTROL     STMMInputSurfMemObjCtl;
242     VPHAL_MEMORY_OBJECT_CONTROL     STMMOutputSurfMemObjCtl;
243     VPHAL_MEMORY_OBJECT_CONTROL     DnOutSurfMemObjCtl;
244     VPHAL_MEMORY_OBJECT_CONTROL     CurrentOutputSurfMemObjCtl;
245     VPHAL_MEMORY_OBJECT_CONTROL     StatisticsOutputSurfMemObjCtl;
246     VPHAL_MEMORY_OBJECT_CONTROL     LaceOrAceOrRgbHistogramSurfCtrl;
247     VPHAL_MEMORY_OBJECT_CONTROL     AlphaOrVignetteSurfMemObjCtl;
248     VPHAL_MEMORY_OBJECT_CONTROL     SkinScoreSurfMemObjCtl;
249     VPHAL_MEMORY_OBJECT_CONTROL     LaceLookUpTablesSurfMemObjCtl;
250     VPHAL_MEMORY_OBJECT_CONTROL     Vebox3DLookUpTablesSurfMemObjCtl;
251 } VPHAL_DNDI_CACHE_CNTL, *PVPHAL_DNDI_CACHE_CNTL;
252 
253 typedef struct _VPHAL_LACE_CACHE_CNTL
254 {
255     // LACE would reuse the bL3CachingEnabled of VEBOX's cache control
256     VPHAL_MEMORY_OBJECT_CONTROL    FrameHistogramSurfaceMemObjCtl;
257     VPHAL_MEMORY_OBJECT_CONTROL    AggregatedHistogramSurfaceMemObjCtl;
258     VPHAL_MEMORY_OBJECT_CONTROL    StdStatisticsSurfaceMemObjCtl;
259     VPHAL_MEMORY_OBJECT_CONTROL    PwlfInSurfaceMemObjCtl;
260     VPHAL_MEMORY_OBJECT_CONTROL    PwlfOutSurfaceMemObjCtl;
261     VPHAL_MEMORY_OBJECT_CONTROL    WeitCoefSurfaceMemObjCtl;
262     VPHAL_MEMORY_OBJECT_CONTROL    GlobalToneMappingCurveLUTSurfaceMemObjCtl;
263 } VPHAL_LACE_CACHE_CNTL, *PVPHAL_LACE_CACHE_CNTL;
264 
265 typedef struct _VPHAL_16_ALIGN_CACHE_CNTL
266 {
267     bool                           bL3CachingEnabled;
268     VPHAL_MEMORY_OBJECT_CONTROL    SourceSurfMemObjCtl;
269     VPHAL_MEMORY_OBJECT_CONTROL    TargetSurfMemObjCtl;
270     VPHAL_MEMORY_OBJECT_CONTROL    SamplerParamsSurfMemObjCtl;
271     VPHAL_MEMORY_OBJECT_CONTROL    SamplerParamsStatsSurfMemObjCtl;
272 }VPHAL_16_ALIGN_CACHE_CNTL, *PVPHAL_16_ALIGN_CACHE_CNTL;
273 
274 typedef struct _VPHAL_FAST1TON_CACHE_CNTL
275 {
276     bool                           bL3CachingEnabled;
277     VPHAL_MEMORY_OBJECT_CONTROL    SourceSurfMemObjCtl;
278     VPHAL_MEMORY_OBJECT_CONTROL    TargetSurfMemObjCtl;
279     VPHAL_MEMORY_OBJECT_CONTROL    SamplerParamsSurfMemObjCtl;
280     VPHAL_MEMORY_OBJECT_CONTROL    SamplerParamsStatsSurfMemObjCtl;
281 }VPHAL_FAST1TON_CACHE_CNTL, *PVPHAL_FAST1TON_CACHE_CNTL;
282 
283 typedef struct _VPHAL_HDR_CACHE_CNTL
284 {
285     bool                           bL3CachingEnabled;
286     VPHAL_MEMORY_OBJECT_CONTROL    SourceSurfMemObjCtl;
287     VPHAL_MEMORY_OBJECT_CONTROL    TargetSurfMemObjCtl;
288     VPHAL_MEMORY_OBJECT_CONTROL    Lut2DSurfMemObjCtl;
289     VPHAL_MEMORY_OBJECT_CONTROL    Lut3DSurfMemObjCtl;
290     VPHAL_MEMORY_OBJECT_CONTROL    CoeffSurfMemObjCtl;
291 } VPHAL_HDR_CACHE_CNTL, *PVPHAL_HDR_CACHE_CNTL;
292 
293 //!
294 //! \brief  Feature specific cache control settings
295 //!
296 typedef struct _VPHAL_RENDER_CACHE_CNTL
297 {
298     // Input
299     bool                        bDnDi;
300     bool                        bCompositing;
301     bool                        bLace;
302 
303     // Output
304     VPHAL_DNDI_CACHE_CNTL        DnDi;
305     VPHAL_COMPOSITE_CACHE_CNTL   Composite;
306     VPHAL_LACE_CACHE_CNTL        Lace;
307 } VPHAL_RENDER_CACHE_CNTL, *PVPHAL_RENDER_CACHE_CNTL;
308 
309 //!
310 //! \brief Vphal Rotation Mode enum
311 //!
312 typedef enum _VPHAL_ROTATION
313 {
314     VPHAL_ROTATION_IDENTITY             = ROTATION_IDENTITY             ,   //!< Rotation 0 degrees
315     VPHAL_ROTATION_90                   = ROTATION_90                   ,   //!< Rotation 90 degrees
316     VPHAL_ROTATION_180                  = ROTATION_180                  ,   //!< Rotation 180 degrees
317     VPHAL_ROTATION_270                  = ROTATION_270                  ,   //!< Rotation 270 degrees
318     VPHAL_MIRROR_HORIZONTAL             = ROTATION_MIRROR_HORIZONTAL    ,   //!< Horizontal Mirror
319     VPHAL_MIRROR_VERTICAL               = ROTATION_MIRROR_VERTICAL      ,   //!< Vertical Mirror
320     VPHAL_ROTATE_90_MIRROR_VERTICAL     = ROTATION_90_MIRROR_VERTICAL   ,   //!< 90 + V Mirror
321     VPHAL_ROTATE_90_MIRROR_HORIZONTAL   = ROTATION_90_MIRROR_HORIZONTAL     //!< 90 + H Mirror
322 } VPHAL_ROTATION;
323 
324 //!
325 //! \brief Vphal Palette Type Mode enum
326 //!
327 typedef enum _VPHAL_PALETTE_TYPE
328 {
329     VPHAL_PALETTE_NONE    = 0,
330     VPHAL_PALETTE_YCbCr_8,                    //!< 8-bit depth - AYUV palette
331     VPHAL_PALETTE_ARGB_8,                     //!< 8-bit depth - ARGB palette
332     VPHAL_PALETTE_AVYU_8                      //!< 8-bit depth - YUY2 palette
333 } VPHAL_PALETTE_TYPE;
334 
335 //!
336 //! \brief Vphal Chroma Siting enum
337 //!
338 typedef enum _VPHAL_CHROMA_SITING
339 {
340     CHROMA_SITING_NONE          = 0,
341     CHROMA_SITING_HORZ_LEFT     = 1 << 0,
342     CHROMA_SITING_HORZ_CENTER   = 1 << 1,
343     CHROMA_SITING_HORZ_RIGHT    = 1 << 2,
344     CHROMA_SITING_VERT_TOP      = 1 << 4,
345     CHROMA_SITING_VERT_CENTER   = 1 << 5,
346     CHROMA_SITING_VERT_BOTTOM   = 1 << 6,
347 } VPHAL_CHROMA_SITING;
348 
349 //!
350 //! \brief Vphal Output chroma configuration enum
351 //!
352 typedef enum _VPHAL_CHROMA_SUBSAMPLING
353 {
354     CHROMA_SUBSAMPLING_TOP_CENTER       = 0,
355     CHROMA_SUBSAMPLING_CENTER_CENTER,
356     CHROMA_SUBSAMPLING_BOTTOM_CENTER,
357     CHROMA_SUBSAMPLING_TOP_LEFT,
358     CHROMA_SUBSAMPLING_CENTER_LEFT,
359     CHROMA_SUBSAMPLING_BOTTOM_LEFT
360 } VPHAL_CHROMA_SUBSAMPLING;
361 
362 //!
363 //! \brief Vphal Gamma Values configuration enum
364 //!
365 typedef enum _VPHAL_GAMMA_VALUE
366 {
367     GAMMA_1P0 = 0,
368     GAMMA_2P2,
369     GAMMA_2P6
370 } VPHAL_GAMMA_VALUE;
371 
372 typedef enum _VPHAL_DP_ROTATION_MODE
373 {
374     VPHAL_DP_ROTATION_NV12_AVG            = 0,   //!< nv12 -> yuy2 by chroma average
375     VPHAL_DP_ROTATION_NV12_NV12              ,   //!< nv12 -> nv12
376     VPHAL_DP_ROTATION_NV12_REP               ,   //!< nv12 -> yuy2 by chroma repeat
377     VPHAL_DP_ROTATION_NV12_YUY2_NOT_SET          //!< nv12 -> yuy2 by chroma average or repeat, decided by scaling mode
378 } VPHAL_DP_ROTATION_MODE;
379 
380 //!
381 //! \brief Surface types enum
382 //!        IMPORTANT : SurfaceType_Layer[] must be updated to match this enum type
383 //!
384 typedef enum _VPHAL_SURFACE_TYPE
385 {
386     SURF_NONE = 0,
387     SURF_IN_BACKGROUND,
388     SURF_IN_PRIMARY,
389     SURF_IN_SUBSTREAM,
390     SURF_IN_REFERENCE,
391     SURF_OUT_RENDERTARGET,
392     SURF_TYPE_COUNT                 //!< Keep this line at the end
393 } VPHAL_SURFACE_TYPE;
394 C_ASSERT(SURF_TYPE_COUNT == 6);     //!< When adding, update assert & vphal_solo_scenario.cpp
395 
396 //!
397 //! \brief Color Spaces enum
398 //!
399 typedef MEDIA_CSPACE VPHAL_CSPACE;
400 
401 //!
402 //! Structure VPHAL_GAMMA_TYPE
403 //! \brief GAMMA Function type
404 //!
405 typedef enum _VPHAL_GAMMA_TYPE
406 {
407     VPHAL_GAMMA_NONE = 0,
408     VPHAL_GAMMA_TRADITIONAL_GAMMA,
409     VPHAL_GAMMA_SMPTE_ST2084,
410     VPHAL_GAMMA_BT1886,
411     VPHAL_GAMMA_SRGB,
412     VPHAL_GAMMA_Count
413 } VPHAL_GAMMA_TYPE;
414 C_ASSERT(VPHAL_GAMMA_Count == 5);       //!< When adding, update assert
415 
416 //!
417 //! \def IS_COLOR_SPACE_BT2020_YUV(_a)
418 //! Check if the color space is BT2020 YUV
419 //!
420 #define IS_COLOR_SPACE_BT2020_YUV(_a)          (_a == CSpace_BT2020           || \
421                                                 _a == CSpace_BT2020_FullRange)
422 
423 //!
424 //! \def IS_COLOR_SPACE_BT2020_RGB(_a)
425 //! Check if the color space is BT2020 RGB
426 //!
427 #define IS_COLOR_SPACE_BT2020_RGB(_a)          (_a == CSpace_BT2020_RGB       || \
428                                                 _a == CSpace_BT2020_stRGB)
429 
430 //!
431 //! \def IS_COLOR_SPACE_BT2020(_a)
432 //! Check if the color space is BT2020
433 //!
434 #define IS_COLOR_SPACE_BT2020(_a)              (IS_COLOR_SPACE_BT2020_YUV(_a) || \
435                                                 IS_COLOR_SPACE_BT2020_RGB(_a))
436 
437 //!
438 //! \def IS_RGB_LIMITED_RANGE(_a)
439 //! Check if RGB limited range
440 //!
441 #define IS_RGB_LIMITED_RANGE(_a)               (_a == CSpace_stRGB       || \
442                                                 _a == CSpace_BT2020_stRGB)
443 
444 //!
445 //! \def IS_RGB_FULL_RANGE(_a)
446 //! Check if RGB full range
447 //!
448 #define IS_RGB_FULL_RANGE(_a)                  (_a == CSpace_sRGB       || \
449                                                 _a == CSpace_BT2020_sRGB)
450 
451 //!
452 //! \def IS_YUV_LIMITED_RANGE(_a)
453 //! Check if YUV limited range
454 //!
455 #define IS_YUV_LIMITED_RANGE(_a)               (_a == CSpace_BT601       || \
456                                                 _a == CSpace_BT709       || \
457                                                 _a == CSpace_BT601Gray   || \
458                                                 _a == CSpace_BT2020)
459 
460 //!
461 //! \def IS_YUV_FULL_RANGE(_a)
462 //! Check if YUV full range
463 //!
464 #define IS_YUV_FULL_RANGE(_a)                  (_a == CSpace_BT601_FullRange       || \
465                                                 _a == CSpace_BT709_FullRange       || \
466                                                 _a == CSpace_BT601Gray_FullRange   || \
467                                                 _a == CSpace_BT2020_FullRange)
468 
469 //!
470 //! \brief Sample Type enum
471 //!
472 typedef enum _VPHAL_SAMPLE_TYPE
473 {
474     SAMPLE_PROGRESSIVE,
475     SAMPLE_SINGLE_TOP_FIELD,
476     SAMPLE_SINGLE_BOTTOM_FIELD,
477     SAMPLE_INTERLEAVED_EVEN_FIRST_TOP_FIELD,
478     SAMPLE_INTERLEAVED_EVEN_FIRST_BOTTOM_FIELD,
479     SAMPLE_INTERLEAVED_ODD_FIRST_TOP_FIELD,
480     SAMPLE_INTERLEAVED_ODD_FIRST_BOTTOM_FIELD,
481     SAMPLE_INVALID
482 } VPHAL_SAMPLE_TYPE;
483 C_ASSERT(SAMPLE_INVALID == 7);      //!< When adding, update assert & vphal_solo_scenario.cpp
484 
485 //!
486 //! \brief Frame Format enum
487 //!
488 typedef enum _VPHAL_FRAME_FORMAT
489 {
490     FRAME_FORMAT_PROGRESSIVE,
491     FRAME_FORMAT_INTERLEAVED,
492     FRAME_FORMAT_FIELD
493 } VPHAL_FRAME_FORMAT;
494 
495 //!
496 //! \brief Interlaced Scaling Mode enum
497 //!
498 typedef enum _VPHAL_ISCALING_TYPE
499 {
500     ISCALING_NONE,
501     ISCALING_INTERLEAVED_TO_INTERLEAVED,
502     ISCALING_INTERLEAVED_TO_FIELD,
503     ISCALING_FIELD_TO_INTERLEAVED,
504     ISCALING_FIELD_TO_FIELD
505 } VPHAL_ISCALING_TYPE;
506 C_ASSERT(ISCALING_FIELD_TO_FIELD == 4);
507 
508 //!
509 //! \brief DI Mode enum
510 //!
511 typedef enum _VPHAL_DI_MODE
512 {
513     DI_MODE_BOB,
514     DI_MODE_ADI
515 } VPHAL_DI_MODE;
516 C_ASSERT(DI_MODE_ADI == 1);         //!< When adding, update assert & vphal_solo_scenario.cpp
517 
518 //!
519 //! \ brief HVS DN Mode enum
520 //!
521 typedef enum _VPHAL_HVSDN_MODE
522 {
523     HVSDENOISE_AUTO_BDRATE = 0,
524     HVSDENOISE_AUTO_SUBJECTIVE,
525     HVSDENOISE_MANUAL
526 } VPHAL_HVSDN_MODE;
527 
528 //!
529 //! \brief Blend Type enum
530 //!
531 typedef enum _VPHAL_BLEND_TYPE
532 {
533     BLEND_NONE = 0,
534     BLEND_SOURCE,
535     BLEND_PARTIAL,
536     BLEND_CONSTANT,
537     BLEND_CONSTANT_SOURCE,
538     BLEND_CONSTANT_PARTIAL,
539     BLEND_XOR_MONO
540 } VPHAL_BLEND_TYPE;
541 C_ASSERT(BLEND_CONSTANT == 3);      //!< When adding, update assert & vphal_solo_scenario.cpp
542 
543 //!
544 //! \brief Scaling Mode enum
545 //!
546 typedef enum _VPHAL_SCALING_MODE
547 {
548     VPHAL_SCALING_NEAREST = 0,
549     VPHAL_SCALING_BILINEAR,
550     VPHAL_SCALING_AVS,
551     VPHAL_SCALING_ADV_QUALITY        // !< Advance Perf mode
552 } VPHAL_SCALING_MODE;
553 C_ASSERT(VPHAL_SCALING_ADV_QUALITY == 3);   //!< When adding, update assert & vphal_solo_scenario.cpp
554 
555 typedef enum _VPHAL_SCALING_PREFERENCE
556 {
557     VPHAL_SCALING_PREFER_SFC = 0,      // SFC is default
558     VPHAL_SCALING_PREFER_COMP,         // For Gen9/10, Composition AVS get better quality than SFC AVS
559     VPHAL_SCALING_PREFER_SFC_FOR_VEBOX // if VEBOX is required, use VEBOX + SFC, otherwise use Composistion
560 } VPHAL_SCALING_PREFERENCE;
561 C_ASSERT(VPHAL_SCALING_PREFER_SFC_FOR_VEBOX == 2);   //!< When adding, update assert & vphal_solo_scenario.cpp
562 
563 //!
564 //! \brief Gamut Mode enum
565 //!
566 typedef enum _VPHAL_GAMUT_MODE
567 {
568     GAMUT_MODE_NONE,
569     GAMUT_MODE_BASIC,
570     GAMUT_MODE_ADVANCED
571 } VPHAL_GAMUT_MODE;
572 C_ASSERT(GAMUT_MODE_ADVANCED == 2); //!< When adding, update assert & vphal_solo_scenario.cpp
573 
574 //!
575 //! \brief Composition Report Mode enum
576 //!
577 typedef enum _VPHAL_COMPOSITION_REPORT_MODE
578 {
579     VPHAL_NO_COMPOSITION,                        //!< No composition , Error Reporting cases
580     VPHAL_INPLACE_COMPOSITION,                   //!< Inplace Composition
581     VPHAL_LEGACY_COMPOSITION                     //!< Legacy Composition
582 } VPHAL_COMPOSITION_REPORT_MODE;
583 //!
584 //! \brief DI Report Mode enum
585 //!
586 typedef enum _VPHAL_DI_REPORT_MODE
587 {
588     VPHAL_DI_REPORT_PROGRESSIVE,                        //!< Progressive output
589     VPHAL_DI_REPORT_BOB,                                //!< True BOB output
590     VPHAL_DI_REPORT_ADI_BOB,                            //!< DNDI BOB output
591     VPHAL_DI_REPORT_ADI,                                //!< ADI output
592     VPHAL_DI_REPORT_FMD                                 //!< FMD output
593 } VPHAL_DI_REPORT_MODE;
594 
595 //!
596 //! \brief Colorpack enum
597 //!
598 typedef enum _VPHAL_COLORPACK
599 {
600     VPHAL_COLORPACK_400 = 0,
601     VPHAL_COLORPACK_420,
602     VPHAL_COLORPACK_411,
603     VPHAL_COLORPACK_422,
604     VPHAL_COLORPACK_444,
605     VPHAL_COLORPACK_UNKNOWN
606 } VPHAL_COLORPACK, *PVPHAL_COLORPACK;
607 
608 //!
609 //! \brief   Output Pipe Mode enum
610 //! \details The output pipe that writes the RenderTarget surface
611 //!
612 typedef enum _VPHAL_OUTPUT_PIPE_MODE
613 {
614     VPHAL_OUTPUT_PIPE_MODE_INVALID = -1,                //!< None output pipe selected. This is an invalid state
615     VPHAL_OUTPUT_PIPE_MODE_COMP    = 0,                 //!< Composition output pipe. RenderTarget will be written by Composition
616     VPHAL_OUTPUT_PIPE_MODE_SFC     = 1,                 //!< SFC output pipe. RenderTarget will be written by SFC
617     VPHAL_OUTPUT_PIPE_MODE_VEBOX   = 2                  //!< Vebox output pipe. RenderTarget will be written by Vebox
618 } VPHAL_OUTPUT_PIPE_MODE, *PVPHAL_OUTPUT_PIPE_MODE;
619 
620 //!
621 //! \def SET_VPHAL_OUTPUT_PIPE(_a, _Pipe)
622 //! Set the output pipe
623 //!
624 #define SET_VPHAL_OUTPUT_PIPE(_a, _Pipe)                           \
625     {                                                              \
626         (_a->OutputPipe = _Pipe);                                  \
627         VPHAL_RENDER_NORMALMESSAGE("VPHAL_OUTPUT_PIPE %d", _Pipe); \
628     }
629 
630 //!
631 //! \def IS_VPHAL_OUTPUT_PIPE_INVALID(_a)
632 //! Sheck if the output pipe is invalid
633 //!
634 #define IS_VPHAL_OUTPUT_PIPE_INVALID(_a)              (_a->OutputPipe == VPHAL_OUTPUT_PIPE_MODE_INVALID)
635 
636 //!
637 //! \def IS_VPHAL_OUTPUT_PIPE_COMP(_a)
638 //! Check if the output pipe is Composition
639 //!
640 #define IS_VPHAL_OUTPUT_PIPE_COMP(_a)                 (_a->OutputPipe == VPHAL_OUTPUT_PIPE_MODE_COMP)
641 
642 //!
643 //! \def IS_VPHAL_OUTPUT_PIPE_SFC(_a)
644 //! Check if the output pipe is SFC
645 //!
646 #define IS_VPHAL_OUTPUT_PIPE_SFC(_a)                  (_a->OutputPipe == VPHAL_OUTPUT_PIPE_MODE_SFC)
647 
648 //!
649 //! \def IS_VPHAL_OUTPUT_PIPE_VEBOX(_a)
650 //! Check if the output pipe is Vebox
651 //!
652 #define IS_VPHAL_OUTPUT_PIPE_VEBOX(_a)                (_a->OutputPipe == VPHAL_OUTPUT_PIPE_MODE_VEBOX)
653 
654 //!
655 //! \def SET_VPHAL_COMPONENT(_a, _Component)
656 //! Set the Component
657 //!
658 #define SET_VPHAL_COMPONENT(_a, _Component)           (_a->Component  =  _Component)                     // Set the Component
659 
660 //!
661 //! \def SET_VPHAL_MMC_STATE(_a, _bEnableMMC)
662 //! Set the Component
663 //!
664 #define SET_VPHAL_MMC_STATE(_a, _bEnableMMC)          (_a->bEnableMMC =  _bEnableMMC)                    // Set the Component
665 
666 //-----------------------------------------------------------------------------
667 // Forward declaration -
668 // IMPORTANT - DDI interfaces are NOT to access internal VPHAL states
669 //-----------------------------------------------------------------------------
670 typedef struct _RENDERHAL_INTERFACE     *PRENDERHAL_INTERFACE;
671 typedef class MhwVeboxInterface         *PMHW_VEBOX_INTERFACE;
672 typedef class MhwSfcInterface           *PMHW_SFC_INTERFACE;
673 typedef struct VPHAL_SURFACE            *PVPHAL_SURFACE;
674 
675 class VphalRenderer;
676 
677 class MhwCpInterface;
678 
679 //!
680 //! Union   VPHAL_COLOR_SAMPLE_8
681 //! \brief  Vphal Color Sample 8 bit
682 //!
683 typedef union _VPHAL_COLOR_SAMPLE_8
684 {
685     // ARGB
686     struct
687     {
688         uint8_t    B;
689         uint8_t    G;
690         uint8_t    R;
691         uint8_t    A;
692     };
693 
694     // AVYU (YUY2 samples)
695     struct
696     {
697         uint8_t    U;
698         uint8_t    Y;
699         uint8_t    V;
700         uint8_t    a;
701     };
702 
703     // AYCbCr (NV12 samples)
704     struct
705     {
706         uint8_t    Cr;      //!< V
707         uint8_t    Cb;      //!< U
708         uint8_t    YY;      //!< Y
709         uint8_t    Alpha;
710     };
711 
712     uint32_t       dwValue;
713 } VPHAL_COLOR_SAMPLE_8, *PVPHAL_COLOR_SAMPLE_8;
714 
715 //!
716 //! Union   VPHAL_COLOR_SAMPLE_16
717 //! \brief  Vphal Color Sample 16 bit
718 //!
719 typedef union _VPHAL_COLOR_SAMPLE_16
720 {
721     // ARGB
722     struct
723     {
724         int16_t      B;
725         int16_t      G;
726         int16_t      R;
727         int16_t      A;
728     };
729 
730     // AVYU
731     struct
732     {
733         int16_t      U;
734         int16_t      Y;
735         int16_t      V;
736         int16_t      a;
737     };
738 
739     // AYCbCr
740     struct
741     {
742         int16_t      Cr;      //!< V
743         int16_t      Cb;      //!< U
744         int16_t      YY;      //!< Y
745         int16_t      Alpha;
746     };
747 
748     uint32_t   Value;
749 } VPHAL_COLOR_SAMPLE_16, *PVPHAL_COLOR_SAMPLE_16;
750 
751 //!
752 //! Structure VPHAL_PLANE_OFFSET
753 //! \brief  Vphal Plane OffSet
754 //!
755 typedef struct _VPHAL_PLANE_OFFSET
756 {
757     int    iLockSurfaceOffset;//!< Locked surface offset
758     int    iSurfaceOffset;    //!< Plane surface offset
759     int    iXOffset;          //!< X offset - horizontal offset in pixels
760     int    iYOffset;          //!< Y offset - vertical offset in pixels
761 } VPHAL_PLANE_OFFSET, *PVPHAL_PLANE_OFFSET;
762 
763 //!
764 //! Structure VPHAL_PALETTE
765 //! \brief    Vphal Palette
766 //! \details  Palette entries:
767 //!           - 0 : empty palette
768 //!           - -1 : palette allocated but not loaded
769 //!           - >0 : palette in use
770 //!
771 typedef struct _VPHAL_PALETTE
772 {
773     VPHAL_PALETTE_TYPE      PaletteType;        //!< Type of palette
774     VPHAL_CSPACE            ColorSpace;         //!< ColorSpace of Palette
775     bool                    bHasAlpha;          //!< Alpha is valid
776     int32_t                 iTotalEntries;      //!< Palette entries allocated
777     int32_t                 iNumEntries;        //!< Palette entries in use
778     union
779     {
780         PVPHAL_COLOR_SAMPLE_8   pPalette8;
781         PVPHAL_COLOR_SAMPLE_16  pPalette16;
782     };
783 } VPHAL_PALETTE, *PVPHAL_PALETTE;
784 
785 //!
786 //! Union   VPHAL_HALF_PRECISION_FLOAT
787 //! \brief  Vphal half precision float type
788 //!
789 typedef union _VPHAL_HALF_PRECISION_FLOAT
790 {
791     struct
792     {
793         uint16_t      Mantissa : 10;
794         uint16_t      Exponent : 5;
795         uint16_t      Sign     : 1;
796     };
797 
798     uint16_t value;
799 } VPHAL_HALF_PRECISION_FLOAT, PVPHAL_HALF_PRECISION_FLOAT;
800 
801 //!
802 //! Structure VPHAL_BLENDING_PARAMS
803 //! \brief Layer Blending parameters
804 //!
805 typedef struct _VPHAL_BLENDING_PARAMS
806 {
807     VPHAL_BLEND_TYPE        BlendType;
808     float                   fAlpha;
809 } VPHAL_BLENDING_PARAMS, *PVPHAL_BLENDING_PARAMS;
810 
811 //!
812 //! Structure VPHAL_LUMAKEY_PARAMS
813 //! \brief Luma Keying parameters
814 //!
815 typedef struct _VPHAL_LUMAKEY_PARAMS
816 {
817     int16_t               LumaLow;
818     int16_t               LumaHigh;
819 } VPHAL_LUMAKEY_PARAMS, *PVPHAL_LUMAKEY_PARAMS;
820 
821 //!
822 //! Structure VPHAL_PROCAMP_PARAMS
823 //! \brief Procamp parameters
824 //!
825 typedef struct _VPHAL_PROCAMP_PARAMS
826 {
827     bool                bEnabled;
828     float               fBrightness;
829     float               fContrast;
830     float               fHue;
831     float               fSaturation;
832 } VPHAL_PROCAMP_PARAMS, *PVPHAL_PROCAMP_PARAMS;
833 
834 //!
835 //! Structure VPHAL_IEF_PARAMS
836 //! \brief IEF parameters - Image Enhancement (Detail) Filter
837 //!
838 typedef struct _VPHAL_IEF_PARAMS
839 {
840     bool                bEnabled;
841     bool                bSmoothMode;
842     bool                bSkintoneTuned;
843     bool                bEmphasizeSkinDetail;
844     float               fIEFFactor;
845     uint16_t            StrongEdgeWeight;
846     uint16_t            RegularWeight;
847     uint16_t            StrongEdgeThreshold;
848     void*               pExtParam;
849 } VPHAL_IEF_PARAMS, *PVPHAL_IEF_PARAMS;
850 
851 //!
852 //! Structure VPHAL_DI_PARAMS
853 //! \brief Deinterlacing parameters
854 //!
855 typedef struct _VPHAL_DI_PARAMS
856 {
857     VPHAL_DI_MODE       DIMode;            //!< DeInterlacing mode
858     bool                bEnableFMD;        //!< FMD
859     bool                bSingleField;      //!< Used in frame Recon - if 30fps (one call per sample pair)
860     bool                bSCDEnable;        //!< Scene change detection
861 } VPHAL_DI_PARAMS, *PVPHAL_DI_PARAMS;
862 
863 //!
864 //! \brief Noise Level Enumeration
865 //!
866 typedef enum _VPHAL_NOISELEVEL
867 {
868     NOISELEVEL_DEFAULT,
869     NOISELEVEL_VC1_HD
870 } VPHAL_NOISELEVEL;
871 C_ASSERT(NOISELEVEL_VC1_HD == 1); //!< When adding, update assert & vphal_solo_scenario.cpp
872 
873 //!
874 //! Structure VPHAL_HVSDENOISE_PARAMS
875 //! \brief HVS Denoise Parameters - Human Vision System Based Denoise
876 //!
877 typedef struct _VPHAL_HVSDENOISE_PARAMS
878 {
879     uint16_t            QP                  = 0;
880     uint16_t            Strength            = 0;
881     VPHAL_HVSDN_MODE    Mode                = HVSDENOISE_AUTO_BDRATE;
882     void*               pHVSDenoiseParam    = nullptr;
883     uint32_t            dwDenoiseParamSize  = 0;
884     uint32_t            dwGlobalNoiseLevel  = 0;  //!< Global Noise Level for Y
885     uint32_t            dwGlobalNoiseLevelU = 0;  //!< Global Noise Level for U
886     uint32_t            dwGlobalNoiseLevelV = 0;  //!< Global Noise Level for V
887     uint16_t            TgneEnable          = 0;
888     uint16_t            FirstFrame          = 0;
889     uint16_t            TgneFirstFrame      = 0;
890     uint16_t            Fallback            = 0;
891     uint16_t            EnableChroma        = 0;
892     uint16_t            EnableTemporalGNE   = 0;
893 } VPHAL_HVSDENOISE_PARAMS, *PVPHAL_HVSDENOISE_PARAMS;
894 
895 //!
896 //! Structure VPHAL_SLIMIPU_DENOISE_PARAM
897 //! \brief SLIMIPU Denoise Parameters
898 //!
899 typedef struct _VPHAL_SLIMIPU_DENOISE_PARAM
900 {
901     uint32_t            MemSizeInBytes;
902     void *              pSystemMem;
903 } VPHAL_SLIMIPU_DENOISE_PARAM, *PVPHAL_SLIMIPU_DENOISE_PARAM;
904 
905 //!
906 //! Structure VPHAL_DENOISE_PARAMS
907 //! \brief Denoise parameters
908 //!
909 typedef struct _VPHAL_DENOISE_PARAMS
910 {
911     bool                                bEnableChroma  = false;
912     bool                                bEnableLuma    = false;
913     bool                                bAutoDetect    = false;
914     float                               fDenoiseFactor = 0.0;
915     VPHAL_NOISELEVEL                    NoiseLevel     = NOISELEVEL_DEFAULT;
916     bool                                bEnableHVSDenoise = false;
917     VPHAL_HVSDENOISE_PARAMS             HVSDenoise        = {};
918     bool                                bEnableSlimIPUDenoise = false;
919     VPHAL_SLIMIPU_DENOISE_PARAM         SlimIPUDenoise        = {};
920 } VPHAL_DENOISE_PARAMS, *PVPHAL_DENOISE_PARAMS;
921 
922 //!
923 //! Structure VPHAL_STE_PARAMS
924 //! \brief STE parameters - Skin Tone Enhancement
925 //!
926 typedef struct _VPHAL_STE_PARAMS
927 {
928     uint32_t            dwSTEFactor;
929 } VPHAL_STE_PARAMS, *PVPHAL_STE_PARAMS;
930 
931 //!
932 //! Structure VPHAL_TCC_PARAMS
933 //! \brief TCC parameters - Total Color Control
934 //!
935 typedef struct _VPHAL_TCC_PARAMS
936 {
937     uint8_t             Red;
938     uint8_t             Green;
939     uint8_t             Blue;
940     uint8_t             Cyan;
941     uint8_t             Magenta;
942     uint8_t             Yellow;
943 } VPHAL_TCC_PARAMS, *PVPHAL_TCC_PARAMS;
944 
945 //!
946 //! Structure VPHAL_COLORPIPE_PARAMS
947 //! \brief IECP Parameters - Color Pipe
948 //!
949 typedef struct _VPHAL_COLORPIPE_PARAMS
950 {
951     bool                bEnableACE;
952     bool                bEnableSTE;
953     bool                bEnableTCC;
954     bool                bAceLevelChanged;
955     uint32_t            dwAceLevel;
956     uint32_t            dwAceStrength;
957     VPHAL_STE_PARAMS    SteParams;
958     VPHAL_TCC_PARAMS    TccParams;
959 } VPHAL_COLORPIPE_PARAMS, *PVPHAL_COLORPIPE_PARAMS;
960 
961 //!
962 //! \brief Vphal 3DLUT Channel Mapping enum
963 //!
964 typedef enum _VPHAL_3DLUT_CHANNEL_MAPPING
965 {
966     CHANNEL_MAPPING_RGB_RGB          = 0,
967     CHANNEL_MAPPING_YUV_RGB          = 1 << 0,
968     CHANNEL_MAPPING_VUY_RGB          = 1 << 1,
969 } VPHAL_3DLUT_CHANNEL_MAPPING;
970 
971 //!
972 //! Structure VPHAL_3DLUT_PARAMS
973 //! \brief 3DLUT parameters - 3DLUT
974 //!
975 typedef struct _VPHAL_3DLUT_PARAMS
976 {
977     PVPHAL_SURFACE             pExt3DLutSurface;          // Pointer to the 3DLUT surface which app passes to driver.
978     uint32_t                   LutSize;                   // Size of 3DLUT, i.e, how many entries LUT has.
979     uint32_t                   ChannelMapping;            // Channel Mapping for the 3DLUT input to 3DLUT output.
980     uint16_t                   BitDepthPerChannel;        // Bit Depth Per Channel(4 channels for 3DLUT).
981     uint16_t                   ByteCountPerEntry;         // Byte Count Per Entry including reserved bytes.
982 } VPHAL_3DLUT_PARAMS, * PVPHAL_3DLUT_PARAMS;
983 
984 //!
985 //! Structure VPHAL_SURFACE
986 //! \brief DDI-VPHAL surface definition
987 //!
988 struct VPHAL_SURFACE
989 {
990     // Color Information
991     VPHAL_CSPACE                ColorSpace = CSpace_None;         //!<Color Space
992     bool                        ExtendedGamut = false;            //!<Extended Gamut Flag
993     int32_t                     iPalette = 0;                     //!<Palette Allocation
994     VPHAL_PALETTE               Palette = {};                     //!<Palette data
995 
996     // Rendering parameters
997     RECT                        rcSrc = { 0, 0, 0, 0 };           //!< Source rectangle
998     RECT                        rcDst = { 0, 0, 0, 0 };           //!< Destination rectangle
999     RECT                        rcMaxSrc = { 0, 0, 0, 0 };        //!< Max source rectangle
1000     PVPHAL_BLENDING_PARAMS      pBlendingParams = nullptr;        //!< Blending parameters
1001     PVPHAL_LUMAKEY_PARAMS       pLumaKeyParams = nullptr;         //!< Luma keying parameters
1002     PVPHAL_PROCAMP_PARAMS       pProcampParams  = nullptr;;       //!< Procamp parameters
1003     PVPHAL_IEF_PARAMS           pIEFParams = nullptr;             //!< IEF parameters
1004     bool                        bCalculatingAlpha = false;        //!< Alpha calculation parameters
1005     bool                        bQueryVariance = false;           //!< enable variance query
1006     bool                        bDirectionalScalar = false;       //!< Vebox Directional Scalar
1007     bool                        bFastColorFill = false;           //!< enable fast color fill without copy surface
1008     bool                        bMaxRectChanged = false;          //!< indicate rcMaxSrc been updated
1009     bool                        b16UsrPtr = false;                //!< is 16 byte aligned system linear memory.
1010     bool                        bVEBOXCroppingUsed = false;       //!< Vebox crop case need use rcSrc as vebox input.
1011     bool                        bXORComp = false;                 //!< is mono-chroma composite mode.
1012 
1013     // Interlaced Scaling
1014     bool                        bInterlacedScaling = false;            //!< Interlaced scaling
1015     bool                        bFieldWeaving = false;                 //!< Field Weaving
1016     VPHAL_ISCALING_TYPE         InterlacedScalingType = ISCALING_NONE; //!< Interlaced scaling type for new interlaced scaling mode
1017 
1018     // Advanced Processing
1019     PVPHAL_DI_PARAMS            pDeinterlaceParams = nullptr;
1020     PVPHAL_DENOISE_PARAMS       pDenoiseParams = nullptr;     //!< Denoise
1021     PVPHAL_COLORPIPE_PARAMS     pColorPipeParams = nullptr;   //!< ColorPipe
1022 
1023     // Frame ID and reference samples -> for advanced processing
1024     int32_t                     FrameID = 0;
1025     uint32_t                    uFwdRefCount = 0;
1026     uint32_t                    uBwdRefCount = 0;
1027     PVPHAL_SURFACE              pFwdRef = nullptr;
1028     PVPHAL_SURFACE              pBwdRef = nullptr;
1029 
1030     // VPHAL_SURFACE Linked list
1031     PVPHAL_SURFACE              pNext = nullptr;
1032 
1033     //--------------------------------------
1034     // FIELDS TO BE SETUP BY VPHAL int32_tERNALLY
1035     //--------------------------------------
1036     uint32_t                    dwWidth = 0;                                  //!<  Surface width
1037     uint32_t                    dwHeight = 0;                                 //!<  Surface height
1038     uint32_t                    dwPitch = 0;                                  //!<  Surface pitch
1039     MOS_TILE_TYPE               TileType = MOS_TILE_X;                        //!<  Tile Type
1040     MOS_TILE_MODE_GMM           TileModeGMM = MOS_TILE_LINEAR_GMM;            //!<  Tile Mode from GMM Definition
1041     bool                        bGMMTileEnabled = false;                      //!<  GMM Tile Mode Flag
1042     bool                        bOverlay= false;                              //!<  Overlay Surface
1043     bool                        bFlipChain = false;                           //!<  FlipChain Surface
1044     VPHAL_PLANE_OFFSET          YPlaneOffset =  { 0, 0, 0, 0 };               //!<  Y surface plane offset
1045     VPHAL_PLANE_OFFSET          UPlaneOffset =  { 0, 0, 0, 0 };               //!<  U surface plane offset
1046     VPHAL_PLANE_OFFSET          VPlaneOffset =  { 0, 0, 0, 0 };               //!<  V surface plane offset
1047     int32_t                     iLayerID = 0;                                 //!<  Layer index (0-based index)
1048     VPHAL_SCALING_MODE          ScalingMode = VPHAL_SCALING_NEAREST;          //!<  Scaling Mode
1049     VPHAL_SCALING_PREFERENCE    ScalingPreference = VPHAL_SCALING_PREFER_SFC; //!<  Scaling preference
1050     bool                        bIEF = false;                                 //!<  IEF flag
1051     uint32_t                    dwSlicePitch = 0;                             //!<  SlicePitch of a 3D surface(GT-PIN support)
1052 
1053     //--------------------------------------
1054     // FIELDS TO BE PROVIDED BY DDI
1055     //--------------------------------------
1056     // Sample information
1057     MOS_FORMAT                  Format = Format_None;               //!<  Surface format
1058     VPHAL_SURFACE_TYPE          SurfType = SURF_NONE;               //!<  Surface type (context)
1059     VPHAL_SAMPLE_TYPE           SampleType = SAMPLE_PROGRESSIVE;    //!<  Interlaced/Progressive sample type
1060     uint32_t                    dwDepth = 0;                        //!<  Surface depth
1061     MOS_S3D_CHANNEL             Channel = MOS_S3D_NONE;             //!<  Channel
1062     uint32_t                    dwOffset = 0;                       //!<  Surface Offset (Y/Base)
1063     MOS_RESOURCE                OsResource = {};                    //!<  Surface resource
1064     VPHAL_ROTATION              Rotation = VPHAL_ROTATION_IDENTITY; //!<  0: 0 degree, 1: 90 degree, 2: 180 degree, 3: 270 degreee
1065 
1066     // Chroma siting
1067     uint32_t                    ChromaSiting = CHROMA_SITING_NONE;
1068     bool                        bChromaSiting = false;      //!<  Chromasiting flag
1069 
1070     // Surface compression mode, enable flags
1071     bool                        bCompressible = false;      // The surface is compressible, means there are additional 128 bit for MMC no matter it is compressed or not
1072     // The bIsCompressed in surface allocation structure should use this flag to initialize to allocate a compressible surface
1073     bool                        bIsCompressed = false;      // The surface is compressed, VEBox output can only support horizontal mode, but input can be horizontal / vertical
1074     MOS_RESOURCE_MMC_MODE       CompressionMode = MOS_MMC_DISABLED;
1075     uint32_t                    CompressionFormat = 0;
1076 
1077     bool                        bUseSampleUnorm = false;    //!<  true: sample unorm is used, false: DScaler or AVS is used.
1078     bool                        bUseSamplerLumakey = false; //!<  true: sampler lumakey is used, false: lumakey is disabled or EU computed lumakey is used.
1079     //------------------------------------------
1080     // HDR related parameters, provided by DDI
1081     //------------------------------------------
1082     PVPHAL_HDR_PARAMS           pHDRParams = nullptr;
1083     VPHAL_GAMMA_TYPE            GammaType = VPHAL_GAMMA_NONE;    //!<Gamma Type
1084     bool                        bPreAPGWorkloadEnable = false;   //!< Previous Surface Execution Path
1085 
1086     // 3DLUT parameters
1087     PVPHAL_3DLUT_PARAMS         p3DLutParams = nullptr;          //!< 3DLut Mapping Params
1088 };
1089 
1090 //!
1091 //! Structure VPHAL_GAMUT_PARAMS
1092 //! \brief IECP Gamut Mapping Parameters
1093 //!
1094 typedef struct _VPHAL_GAMUT_PARAMS
1095 {
1096     VPHAL_GAMUT_MODE    GCompMode;
1097     VPHAL_GAMUT_MODE    GExpMode;
1098     VPHAL_GAMMA_VALUE   GammaValue;
1099     uint32_t            dwAttenuation;       //!< U2.10 [0, 1024] 0 = No down scaling, 1024 = Full down scaling
1100     float               displayRGBW_x[4];
1101     float               displayRGBW_y[4];
1102 } VPHAL_GAMUT_PARAMS, *PVPHAL_GAMUT_PARAMS;
1103 
1104 //!
1105 //! Structure VPHAL_NLAS_PARAMS
1106 //! \brief NLAS parameters - Non-Anamorphic Scaling
1107 //!
1108 typedef struct _VPHAL_NLAS_PARAMS
1109 {
1110     float               fVerticalCrop;
1111     float               fHLinearRegion;
1112     float               fNonLinearCrop;
1113 } VPHAL_NLAS_PARAMS, *PVPHAL_NLAS_PARAMS;
1114 
1115 //!
1116 //! Structure VPHAL_COLORFILL_PARAMS
1117 //! \brief ColorFill parameters
1118 //!
1119 typedef struct _VPHAL_COLORFILL_PARAMS
1120 {
1121     bool                bYCbCr;
1122     uint32_t            Color;
1123     VPHAL_CSPACE        CSpace;
1124     bool                bDisableColorfillinSFC;
1125     bool                bOnePixelBiasinSFC;
1126 } VPHAL_COLORFILL_PARAMS, *PVPHAL_COLORFILL_PARAMS;
1127 
1128 //!
1129 //! Structure VPHAL_ALPHA_FILL_MODE
1130 //! \brief Alpha mode
1131 //!
1132 typedef enum _VPHAL_ALPHA_FILL_MODE
1133 {
1134     VPHAL_ALPHA_FILL_MODE_NONE = 0,
1135     VPHAL_ALPHA_FILL_MODE_OPAQUE,
1136     VPHAL_ALPHA_FILL_MODE_BACKGROUND,
1137     VPHAL_ALPHA_FILL_MODE_SOURCE_STREAM,
1138 } VPHAL_ALPHA_FILL_MODE;
1139 
1140 //!
1141 //! Structure VPHAL_ALPHA_PARAMS
1142 //! \brief Alpha parameters
1143 //!
1144 typedef struct _VPHAL_ALPHA_PARAMS
1145 {
1146     float                     fAlpha;
1147     VPHAL_ALPHA_FILL_MODE     AlphaMode;
1148 } VPHAL_ALPHA_PARAMS, *PVPHAL_ALPHA_PARAMS;
1149 
1150 //!
1151 //! Structure VPHAL_CONSTRICTION_PARAMS
1152 //! \brief Constriction parameters
1153 //!
1154 typedef struct _VPHAL_CONSTRICTION_PARAMS
1155 {
1156     RECT                rcConstriction;
1157 } VPHAL_CONSTRICTION_PARAMS, *PVPHAL_CONSTRICTION_PARAMS;
1158 
1159 //!
1160 //! Structure VPHAL_SPLIT_SCREEN_DEMO_POSITION
1161 //! \brief Split-Screen Demo Mode Position
1162 //!
1163 typedef enum _VPHAL_SPLIT_SCREEN_DEMO_POSITION
1164 {
1165     SPLIT_SCREEN_DEMO_DISABLED = 0,
1166     SPLIT_SCREEN_DEMO_LEFT,
1167     SPLIT_SCREEN_DEMO_RIGHT,
1168     SPLIT_SCREEN_DEMO_TOP,
1169     SPLIT_SCREEN_DEMO_BOTTOM,
1170     SPLIT_SCREEN_DEMO_END_POS_LIST
1171 } VPHAL_SPLIT_SCREEN_DEMO_POSITION;
1172 
1173 //!
1174 //! Structure VPHAL_SPLIT_SCREEN_DEMO_MODE_PARAMS
1175 //! \brief Split-Screen Demo Mode Parameters
1176 //!
1177 typedef struct _VPHAL_SPLIT_SCREEN_DEMO_MODE_PARAMS
1178 {
1179     VPHAL_SPLIT_SCREEN_DEMO_POSITION        Position;            //!< Position of split mode area (disable features)
1180     bool                                    bDisableACE : 1; //!< Disable ACE
1181     bool                                    bDisableAVS : 1; //!< Disable AVS
1182     bool                                    bDisableDN : 1; //!< Disable DN
1183     bool                                    bDisableFMD : 1; //!< Disable FMD
1184     bool                                    bDisableIEF : 1; //!< Disable IEF
1185     bool                                    bDisableProcamp : 1; //!< Disable Procamp
1186     bool                                    bDisableSTE : 1; //!< Disable STE
1187     bool                                    bDisableTCC : 1; //!< Disable TCC
1188     bool                                    bDisableIS : 1; //!< Disable IS
1189     bool                                    bDisableDrDb : 1; //!< Disable DRDB
1190     bool                                    bDisableDNUV : 1; //!< Disable DNUV
1191     bool                                    bDisableFRC : 1; //!< Disable FRC
1192     bool                                    bDisableLACE : 1; //!< Disable LACE
1193 } VPHAL_SPLIT_SCREEN_DEMO_MODE_PARAMS, *PVPHAL_SPLIT_SCREEN_DEMO_MODE_PARAMS;
1194 
1195 //!
1196 //! Structure VPHAL_RENDER_PARAMS
1197 //! \brief VPHAL Rendering Parameters
1198 //!
1199 struct VPHAL_RENDER_PARAMS
1200 {
1201     // Input/output surfaces
1202     uint32_t                                uSrcCount;                  //!< Num sources
1203     VPHAL_SURFACE                           *pSrc[VPHAL_MAX_SOURCES];   //!< Source Samples
1204     uint32_t                                uDstCount;                  //!< Num Targets
1205     VPHAL_SURFACE                           *pTarget[VPHAL_MAX_TARGETS];//!< Render Target
1206 
1207                                                                         // Additional parameters not included in PVPHAL_SURFACE
1208     PRECT                                   pConstriction;              //!< Constriction rectangle
1209     PVPHAL_COLORFILL_PARAMS                 pColorFillParams;           //!< ColorFill - BG only
1210     bool                                    bTurboMode;                 //!< Enable Media Turbo Mode
1211     bool                                    bStereoMode;                //!< Stereo BLT mode
1212     PVPHAL_ALPHA_PARAMS                     pCompAlpha;                 //!< Alpha for composited surfaces
1213     bool                                    bDisableDemoMode;           //!< Enable/Disable demo mode function calls
1214     PVPHAL_SPLIT_SCREEN_DEMO_MODE_PARAMS    pSplitScreenDemoModeParams; //!< Split-screen demo mode for VP features
1215     bool                                    bIsDefaultStream;           //!< Identifier to differentiate default stream
1216 
1217                                                                         // Debugging parameters
1218     MOS_COMPONENT                           Component;                  //!< DDI component (for DEBUGGING only)
1219 
1220                                                                         // Status Report
1221     bool                                    bReportStatus;              //!< Report current media BB status (Pre-Processing)
1222     uint32_t                                StatusFeedBackID;           //!< Unique Staus ID;
1223 #if (_DEBUG || _RELEASE_INTERNAL)
1224     bool                                    bTriggerGPUHang;            //!< Trigger GPU HANG
1225 #endif
1226 
1227     bool                                    bCalculatingAlpha;          //!< Alpha calculation parameters
1228 
1229                                                                         // extension parameters
1230     void                                    *pExtensionData;            //!< Extension data
1231 
1232     bool                                    bPathKernel;                // HDR path config if use kernel
1233     bool                                    bAPGWorkloadEnable = false;         //!< Identify Whether APG workload Enabled or not
1234 
1235     bool                                    bDisableVeboxFor8K = false;
1236     bool                                    bUseVEHdrSfc       = false;  // use SFC for to perform CSC/Scaling/RGBSwap of HDR streaming; if false, use composite render.
1237     bool                                    bNonFirstFrame     = false;  // first frame or not: first frame false, otherwise true considering zeromemory parameters.
1238     bool                                    bOptimizeCpuTiming = false;  //!< Optimize Cpu Timing
1239 
VPHAL_RENDER_PARAMSVPHAL_RENDER_PARAMS1240     VPHAL_RENDER_PARAMS() :
1241         uSrcCount(0),
1242         pSrc(),
1243         uDstCount(0),
1244         pTarget(),
1245         pConstriction(nullptr),
1246         pColorFillParams(nullptr),
1247         bTurboMode(false),
1248         bStereoMode(false),
1249         pCompAlpha(nullptr),
1250         bDisableDemoMode(false),
1251         pSplitScreenDemoModeParams(nullptr),
1252         bIsDefaultStream(false),
1253         Component(),
1254         bReportStatus(false),
1255         StatusFeedBackID(0),
1256 #if (_DEBUG || _RELEASE_INTERNAL)
1257         bTriggerGPUHang(false),
1258 #endif
1259         bCalculatingAlpha(false),
1260         pExtensionData(nullptr),
1261         bPathKernel(false),
1262         bUseVEHdrSfc(false),
1263         bNonFirstFrame(false)
1264     {
1265     }
1266 
1267 };
1268 
1269 typedef VPHAL_RENDER_PARAMS *PVPHAL_RENDER_PARAMS;
1270 typedef const VPHAL_RENDER_PARAMS  *PCVPHAL_RENDER_PARAMS;
1271 
1272 //!
1273 //! \brief    Performs Color Space Convert for Sample 8 bit
1274 //! \details  Performs Color Space Convert from Src Color Spase to Dst Color Spase
1275 //! \param    [out] pOutput
1276 //!           Pointer to VPHAL_COLOR_SAMPLE_8
1277 //! \param    [in] pInput
1278 //!           Pointer to VPHAL_COLOR_SAMPLE_8
1279 //! \param    [in] srcCspace
1280 //!           Source Color Space
1281 //! \param    [in] dstCspace
1282 //!           Dest Color Space
1283 //! \return   bool
1284 //!           Return true if successful, otherwise false
1285 //!
1286 bool VpHal_CSC_8(
1287     VPHAL_COLOR_SAMPLE_8    *pOutput,
1288     VPHAL_COLOR_SAMPLE_8    *pInput,
1289     VPHAL_CSPACE            srcCspace,
1290     VPHAL_CSPACE            dstCspace);
1291 
1292 //!
1293 //! \brief
1294 //! \details  Get CSC matrix in a form usable by Vebox, SFC and IECP kernels
1295 //! \param    [in] SrcCspace
1296 //!           Source Cspace
1297 //! \param    [in] DstCspace
1298 //!           Destination Cspace
1299 //! \param    [out] pfCscCoeff
1300 //!           [3x3] Coefficients matrix
1301 //! \param    [out] pfCscInOffset
1302 //!           [3x1] Input Offset matrix
1303 //! \param    [out] pfCscOutOffset
1304 //!           [3x1] Output Offset matrix
1305 //! \return   void
1306 //!
1307 void VpHal_GetCscMatrix(
1308     VPHAL_CSPACE                        SrcCspace,
1309     VPHAL_CSPACE                        DstCspace,
1310     float*                              pfCscCoeff,
1311     float*                              pfCscInOffset,
1312     float*                              pfCscOutOffset);
1313 
1314 //!
1315 //! \brief    sinc
1316 //! \details  Calculate sinc(x)
1317 //! \param    [in] x
1318 //!           float
1319 //! \return   float
1320 //!           sinc(x)
1321 //!
1322 float VpHal_Sinc(float x);
1323 
1324 //!
1325 //! \brief    Lanczos
1326 //! \details  Calculate lanczos(x)
1327 //!           Basic formula is:  lanczos(x)= VpHal_Sinc(x) * VpHal_Sinc(x / fLanczosT)
1328 //! \param    [in] x
1329 //!           float
1330 //! \param    [in] dwNumEntries
1331 //!           dword
1332 //! \param    [in] fLanczosT
1333 //!
1334 //! \return   float
1335 //!           lanczos(x)
1336 //!
1337 float VpHal_Lanczos(
1338     float        x,
1339     uint32_t    dwNumEntries,
1340     float        fLanczosT);
1341 
1342 //!
1343 //! Structure VPHAL_GET_SURFACE_INFO
1344 //! \brief VPHAL Get Surface Infomation Parameters
1345 //!
1346 
1347 typedef struct VPHAL_GET_SURFACE_INFO  *PVPHAL_GET_SURFACE_INFO;
1348 struct VPHAL_GET_SURFACE_INFO
1349 {
1350   uint32_t          ArraySlice;
1351   uint32_t          MipSlice;
1352   MOS_S3D_CHANNEL   S3dChannel;
1353 };
1354 
1355 //!
1356 //! \brief    Get Surface Info from OsResource
1357 //! \details  Update surface info in PVPHAL_SURFACE based on allocated OsResource
1358 //! \param    [in] pOsInterface
1359 //!           Pointer to MOS_INTERFACE
1360 //! \param    [in] pInfo
1361 //!           Pointer to VPHAL_GET_SURFACE_INFO
1362 //! \param    [in,out] pSurface
1363 //!           Pointer to VPHAL_SURFACE
1364 //! \return   MOS_STATUS
1365 //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
1366 //!
1367 MOS_STATUS VpHal_GetSurfaceInfo(
1368     PMOS_INTERFACE           pOsInterface,
1369     PVPHAL_GET_SURFACE_INFO  pInfo,
1370     PVPHAL_SURFACE           pSurface);
1371 
1372 //!
1373 //! \brief    Allocates the Surface
1374 //! \details  Allocates the Surface
1375 //!           - if the surface is not already allocated OR
1376 //!           - resource dimenisions OR format changed
1377 //! \param    [in] pOsInterface
1378 //!           Pointer to MOS_INTERFACE
1379 //! \param    [in,out] pSurface
1380 //!           Pointer to VPHAL_SURFACE
1381 //! \param    [in] pSurfaceName
1382 //!           Pointer to surface name
1383 //! \param    [in] Format
1384 //!           Expected MOS_FORMAT
1385 //! \param    [in] DefaultResType
1386 //!           Expected Resource Type
1387 //! \param    [in] DefaultTileType
1388 //!           Expected Surface Tile Type
1389 //! \param    [in] dwWidth
1390 //!           Expected Surface Width
1391 //! \param    [in] dwHeight
1392 //!           Expected Surface Height
1393 //! \param    [in] bCompressible
1394 //!           Surface being compressible or not
1395 //! \param    [in] CompressionMode
1396 //!           Compression Mode
1397 //! \param    [out] pbAllocated
1398 //!           true if allocated, false for not
1399 //! \param    [in] resUsageType
1400 //!           resource usage type for caching
1401 //! \param    [in] tileModeByForce
1402 //!           Forced tile mode
1403 //! \param    [in] memType
1404 //!           vidoe memory location
1405 //! \return   MOS_STATUS
1406 //!           MOS_STATUS_SUCCESS if success. Error code otherwise
1407 //!
1408 MOS_STATUS VpHal_ReAllocateSurface(
1409     PMOS_INTERFACE          pOsInterface,                                       // [in]    Pointer to OS Interface
1410     PVPHAL_SURFACE          pSurface,                                           // [in/out]Pointer to surface
1411     PCCHAR                  pSurfaceName,                                       // [in]    Pointer to surface name
1412     MOS_FORMAT              Format,                                             // [in]    Surface Format
1413     MOS_GFXRES_TYPE         DefaultResType,                                     // [in]    Default Resource Type to use if resource has not be allocated yet
1414     MOS_TILE_TYPE           DefaultTileType,                                    // [in]    Default Resource Tile Type to use if resource has not be allocated yet
1415     uint32_t                dwWidth,                                            // [in]    Resource Width
1416     uint32_t                dwHeight,                                           // [in]    Resource Height
1417     bool                    bCompressible,                                      // [in]    Flag indaicated reource is compressible or not
1418     MOS_RESOURCE_MMC_MODE   CompressionMode,                                    // [in]    Compression mode
1419     bool*                   pbAllocated,                                        // [out]   Flag indicating new allocation
1420     MOS_HW_RESOURCE_DEF     resUsageType = MOS_HW_RESOURCE_DEF_MAX,             // [in]    resource usage type
1421     MOS_TILE_MODE_GMM       tileModeByForce = MOS_TILE_UNSET_GMM,               // [in]    Flag to indicate if GMM flag tile64 need set
1422     Mos_MemPool             memType = MOS_MEMPOOL_VIDEOMEMORY,                  // [in]    Flag to indicate the memType
1423     bool                    isNotLockable = false);                             // [in]    Flag to indicate whether resource being not lockable
1424 
1425 //!
1426 //! \brief    Reads the Surface contents and copy to the Dst Buffer
1427 //! \details  Reads the Surface contents and copy to the Dst Buffer
1428 //!           - 1 lock surface
1429 //!           - 2 copy surface data to pDst
1430 //!           - 3 unlock surface
1431 //! \param    [in] pOsInterface
1432 //!           Pointer to MOS_INTERFACE
1433 //! \param    [in] pSurface
1434 //!           Pointer to VPHAL_SURFACE
1435 //! \param    [in] uBpp
1436 //!           bit per pixel of surface contents
1437 //! \param    [out] pDst
1438 //!           output buffer to store Surface contents
1439 //! \return   MOS_STATUS
1440 //!           MOS_STATUS_SUCCESS if success. Error code otherwise
1441 //!
1442 MOS_STATUS VpHal_ReadSurface (
1443     PMOS_INTERFACE              pOsInterface,
1444     PVPHAL_SURFACE              pSurface,
1445     uint32_t                    uBpp,
1446     uint8_t*                    pDst);
1447 
1448 //!
1449 //! \brief    Copy Data from input Buffer to the Surface contents
1450 //! \details  Copy Data from input Buffer to the Surface contents
1451 //!           - 1 lock surface
1452 //!           - 2 copy data from pSrc to Surface
1453 //!           - 3 unlock surface
1454 //! \param    [in] pOsInterface
1455 //!           Pointer to MOS_INTERFACE
1456 //! \param    [out] pSurface
1457 //!           Pointer to VPHAL_SURFACE
1458 //! \param    [in] uBpp
1459 //!           bit per pixel of input buffer
1460 //! \param    [in] pSrc
1461 //!           Input buffer to store Surface contents
1462 //! \return   MOS_STATUS
1463 //!           MOS_STATUS_SUCCESS if success. Error code otherwise
1464 //!
1465 MOS_STATUS VpHal_WriteSurface (
1466     PMOS_INTERFACE              pOsInterface,
1467     PVPHAL_SURFACE              pSurface,
1468     uint32_t                    uBpp,
1469     const uint8_t*              pSrc);
1470 
1471 //!
1472 //! \brief    Get the color pack type of a surface
1473 //! \details  Map mos surface format to color pack format and return.
1474 //!           For unknown format return VPHAL_COLORPACK_UNKNOWN
1475 //! \param    [in] Format
1476 //!           MOS_FORMAT of a surface
1477 //! \return   VPHAL_COLORPACK
1478 //!           Color pack type of the surface
1479 //!
1480 VPHAL_COLORPACK VpHal_GetSurfaceColorPack (
1481     MOS_FORMAT                  Format);
1482 
1483 //!
1484 //! \brief    Decide whether Chroma up sampling is needed
1485 //! \param    [in] pSource
1486 //!           Pointer to Source Surface
1487 //! \param    [in] pTarget
1488 //!           Pointer to Target Surface
1489 //! \return   bool
1490 //!           Return true if Chroma up sampling is needed, otherwise false
1491 //!
1492 bool VpHal_IsChromaUpSamplingNeeded(
1493     PVPHAL_SURFACE          pSource,
1494     PVPHAL_SURFACE          pTarget);
1495 
1496 //!
1497 //! \brief    Decide whether Chroma down sampling is needed
1498 //! \param    [in] pSource
1499 //!           Pointer to Source Surface
1500 //! \param    [in] pTarget
1501 //!           Pointer to Target Surface
1502 //! \return   bool
1503 //!           Return true if Chroma down sampling is needed, otherwise false
1504 //!
1505 bool VpHal_IsChromaDownSamplingNeeded(
1506     PVPHAL_SURFACE          pSource,
1507     PVPHAL_SURFACE          pTarget);
1508 
1509 //! \brief    Get the bit depth of a surface
1510 //! \details  Get bit depth of input mos surface format and return.
1511 //!           For unknown format return 0
1512 //! \param    [in] Format
1513 //!           MOS_FORMAT of a surface
1514 //! \return   uint32_t
1515 //!           Bit depth of the surface
1516 //!
1517 uint32_t VpHal_GetSurfaceBitDepth(
1518     MOS_FORMAT      Format);
1519 
1520 //!
1521 //! \brief      Get the scale ratio
1522 //! \details    Get the scale ratio from input surface to output surface
1523 //! \param      [in] pSource
1524 //!             Pointer to input Surface
1525 //! \param      [in] pTarget
1526 //!             Pointer to output Surface
1527 //! \param      [out] pfScaleX
1528 //!             Pointer to scaling ratio x
1529 //! \param      [out] pfScaleY
1530 //!             Pointer to scaling ratio y
1531 //! \return     void
1532 //!
1533 void VpHal_GetScalingRatio(
1534     PVPHAL_SURFACE              pSource,
1535     PVPHAL_SURFACE              pTarget,
1536     float*                      pfScaleX,
1537     float*                      pfScaleY);
1538 
1539 //! \brief    Transfer float type to half precision float type
1540 //! \details  Transfer float type to half precision float (16bit) type
1541 //! \param    [in] fInput
1542 //!           input FP32 number
1543 //! \return   uint16_t
1544 //!           half precision float value in bit
1545 //!
1546 uint16_t VpHal_FloatToHalfFloat(
1547     float     fInput);
1548 
1549 //!
1550 //! \brief    Initial the Type/TileType fields in Alloc Params structure
1551 //! \details  Initial the Type/TileType fields in Alloc Params structure
1552 //!           - Use the last type from GMM resource
1553 //! \param    [in, out] pAllocParams
1554 //!           Pointer to MOS_ALLOC_GFXRES_PARAMS
1555 //! \param    [in] pSurface
1556 //!           Pointer to VPHAL_SURFACE
1557 //! \param    [in] DefaultResType
1558 //!           Expected Resource Type
1559 //! \param    [in] DefaultTileType
1560 //!           Expected Surface Tile Type
1561 //!
1562 void VpHal_AllocParamsInitType(
1563     PMOS_ALLOC_GFXRES_PARAMS    pAllocParams,
1564     PVPHAL_SURFACE              pSurface,
1565     MOS_GFXRES_TYPE             DefaultResType,
1566     MOS_TILE_TYPE               DefaultTileType);
1567 
1568 MOS_SURFACE VpHal_ConvertVphalSurfaceToMosSurface(
1569     PVPHAL_SURFACE pSurface);
1570 
1571 bool IsSyncFreeNeededForMMCSurface(PVPHAL_SURFACE pSurface, PMOS_INTERFACE pOsInterface);
1572 
1573 //!
1574 //! \brief  VEBOX IECP parameters
1575 //!
1576 class VPHAL_VEBOX_IECP_PARAMS
1577 {
1578 public:
1579     PVPHAL_COLORPIPE_PARAMS         pColorPipeParams;
1580     PVPHAL_PROCAMP_PARAMS           pProcAmpParams;
1581     MOS_FORMAT                      dstFormat;
1582     MOS_FORMAT                      srcFormat;
1583 
1584     // CSC params
1585     bool                            bCSCEnable;                                 // Enable CSC transform
1586     float*                          pfCscCoeff;                                 // [3x3] CSC Coeff matrix
1587     float*                          pfCscInOffset;                              // [3x1] CSC Input Offset matrix
1588     float*                          pfCscOutOffset;                             // [3x1] CSC Output Offset matrix
1589     bool                            bAlphaEnable;                               // Alpha Enable Param
1590     uint16_t                        wAlphaValue;                                // Color Pipe Alpha Value
1591 
1592     // Front End CSC params
1593     bool                            bFeCSCEnable;                               // Enable Front End CSC transform
1594     float*                          pfFeCscCoeff;                               // [3x3] Front End CSC Coeff matrix
1595     float*                          pfFeCscInOffset;                            // [3x1] Front End CSC Input Offset matrix
1596     float*                          pfFeCscOutOffset;                           // [3x1] Front End CSC Output Offset matrix
1597 
VPHAL_VEBOX_IECP_PARAMS()1598     VPHAL_VEBOX_IECP_PARAMS()
1599     {
1600         pColorPipeParams    = nullptr;
1601         pProcAmpParams      = nullptr;
1602         dstFormat           = Format_Any;
1603         srcFormat           = Format_Any;
1604         bCSCEnable          = false;
1605         pfCscCoeff          = nullptr;
1606         pfCscInOffset       = nullptr;
1607         pfCscOutOffset      = nullptr;
1608         bAlphaEnable        = false;
1609         wAlphaValue         = 0;
1610 
1611         bFeCSCEnable        = false;
1612         pfFeCscCoeff        = nullptr;
1613         pfFeCscInOffset     = nullptr;
1614         pfFeCscOutOffset    = nullptr;
1615     }
~VPHAL_VEBOX_IECP_PARAMS()1616     virtual ~VPHAL_VEBOX_IECP_PARAMS()
1617     {
1618         pColorPipeParams    = nullptr;
1619         pProcAmpParams      = nullptr;
1620     }
Init()1621     virtual void Init()
1622     {
1623         pColorPipeParams    = nullptr;
1624         pProcAmpParams      = nullptr;
1625 
1626         dstFormat           = Format_Any;
1627         srcFormat           = Format_Any;
1628 
1629         bCSCEnable          = false;
1630         pfCscCoeff          = nullptr;
1631         pfCscInOffset       = nullptr;
1632         pfCscOutOffset      = nullptr;
1633         bAlphaEnable        = false;
1634         wAlphaValue         = 0;
1635     }
GetExtParams()1636     virtual void   *GetExtParams() { return nullptr; }
1637 };
1638 #ifdef __cplusplus
1639 }
1640 #endif
1641 
1642 #endif  // __VPHAL_COMMON_H__
1643