1 /*
2 * Copyright (c) 2022-2023, 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     vp_render_hdr_kernel.cpp
24 //! \brief    render packet which used in by mediapipline.
25 //! \details  render packet provide the structures and generate the cmd buffer which mediapipline will used.
26 //!
27 #include "vp_render_hdr_kernel.h"
28 #include "vp_render_kernel_obj.h"
29 #include "hal_kerneldll_next.h"
30 #include "hal_oca_interface_next.h"
31 #include "vp_user_feature_control.h"
32 #include "vp_hal_ddi_utils.h"
33 
34 using namespace vp;
35 
36 #define VP_COMP_SOURCE_DEPTH          16
37 #define VP_COMP_P010_DEPTH            0
38 
39 // Compositing surface binding table index
40 #define VP_COMP_BTINDEX_LAYER0          0
41 #define VP_COMP_BTINDEX_LAYER0_FIELD0   0
42 #define VP_COMP_BTINDEX_LAYER1          3
43 #define VP_COMP_BTINDEX_LAYER2          6
44 #define VP_COMP_BTINDEX_LAYER3          9
45 #define VP_COMP_BTINDEX_LAYER4         12
46 #define VP_COMP_BTINDEX_LAYER5         15
47 #define VP_COMP_BTINDEX_LAYER6         18
48 #define VP_COMP_BTINDEX_LAYER7         21
49 #define VP_COMP_BTINDEX_RENDERTARGET   24
50 #define VP_COMP_BTINDEX_RT_SECOND      27    // Pre-SKL
51 #define VP_COMP_BTINDEX_L0_FIELD1_DUAL 48    // Pre-SKL
52 #define VP_HDR_SAMPLER_STATE_NUM       16
53 
54 // CMFC macro
55 #define VP_COMP_BTINDEX_CSC_COEFF      34
56 
57 #define VP_MAX_HDR_INPUT_LAYER 8
58 #define VP_MAX_HDR_OUTPUT_LAYER 1
59 
60 #define DETAIL_STRONG_EDGE_WEIGHT 7
61 #define DETAIL_NON_EDGE_WEIGHT 1
62 #define DETAIL_REGULAR_EDGE_WEIGHT 2
63 #define DETAIL_WEAK_EDGE_THRESHOLD 1
64 #define DETAIL_STRONG_EDGE_THRESHOLD 8
65 
66 #define VP_SAMPLER_INDEX_Y_NEAREST 1
67 #define VP_SAMPLER_INDEX_U_NEAREST 2
68 #define VP_SAMPLER_INDEX_V_NEAREST 3
69 
70 #define VP_SAMPLER_INDEX_Y_BILINEAR 4
71 #define VP_SAMPLER_INDEX_U_BILINEAR 5
72 #define VP_SAMPLER_INDEX_V_BILINEAR 6
73 
74 #define VP_HDR_DUMP_INPUT_LAYER0                         "InputLayer0"
75 #define VP_HDR_DUMP_OETF1DLUT_SURFACE0                   "OETF1DLUTSurfacce0"
76 #define VP_HDR_DUMP_COEFF_SURFACE                        "CoeffSurfacce"
77 #define VP_HDR_DUMP_TARGET_SURFACE0                      "TargetSurface0"
78 #define VP_HDR_DUMP_RENDER_INPUT                         "RenderInput"
79 
80 MEDIA_WALKER_HDR_STATIC_DATA g_cInit_MEDIA_STATIC_HDR =
81 {
82     // DWORD 0
83     {
84         { 0.0 }
85     },
86 
87     // DWORD 1
88     {
89         { 0.0 }
90     },
91 
92     // DWORD 2
93     {
94         { 0.0 }
95     },
96 
97     // DWORD 3
98     {
99         { 0.0 }
100     },
101 
102     // DWORD 4
103     {
104         { 0.0 }
105     },
106 
107     // DWORD 5
108     {
109         { 0.0 }
110     },
111 
112     // DWORD 6
113     {
114         { 0.0 }
115     },
116 
117     // DWORD 7
118     {
119         { 0.0 }
120     },
121 
122     // DWORD 8
123     {
124         { 0.0 }
125     },
126 
127     // DWORD 9
128     {
129         { 0.0 }
130     },
131 
132     // DWORD 10
133     {
134         { 0.0 }
135     },
136 
137     // DWORD 11
138     {
139         { 0.0 }
140     },
141 
142     // DWORD 12
143     {
144         { 0.0 }
145     },
146 
147     // DWORD 13
148     {
149         { 0.0 }
150     },
151 
152     // DWORD 14
153     {
154         { 0.0 }
155     },
156 
157     // DWORD 15
158     {
159         { 0.0 }
160     },
161 
162     // DWORD 16
163     {
164         { 0.0 }
165     },
166 
167     // DWORD 17
168     {
169         { 0.0 }
170     },
171 
172     // DWORD 18
173     {
174         { 0.0 }
175     },
176 
177     // DWORD 19
178     {
179         { 0.0 }
180     },
181 
182     // DWORD 20
183     {
184         { 0.0 }
185     },
186 
187     // DWORD 21
188     {
189         { 0.0 }
190     },
191 
192     // DWORD 22
193     {
194         { 0.0 }
195     },
196 
197     // DWORD 23
198     {
199         { 0.0 }
200     },
201 
202     // DWORD 24
203     {
204         { 0.0 }
205     },
206 
207     // DWORD 25
208     {
209         { 0.0 }
210     },
211 
212     // DWORD 26
213     {
214         { 0.0 }
215     },
216 
217     // DWORD 27
218     {
219         { 0.0 }
220     },
221 
222     // DWORD 28
223     {
224         { 0.0 }
225     },
226 
227     // DWORD 29
228     {
229         { 0.0 }
230     },
231 
232     // DWORD 30
233     {
234         { 0.0 }
235     },
236 
237     // DWORD 31
238     {
239         { 0.0 }
240     },
241 
242     // DWORD 32
243     {
244         { 0, 0 }
245     },
246 
247     // DWORD 33
248     {
249         { 0, 0 }
250     },
251 
252     // DWORD 34
253     {
254         { 0, 0 }
255     },
256 
257     // DWORD 35
258     {
259         { 0, 0 }
260     },
261 
262     // DWORD 36
263     {
264         { 0, 0 }
265     },
266 
267     // DWORD 37
268     {
269         { 0, 0 }
270     },
271 
272     // DWORD 38
273     {
274         { 0, 0 }
275     },
276 
277     // DWORD 39
278     {
279         { 0, 0 }
280     },
281 
282     // DWORD 40
283     {
284         { 0, 0 }
285     },
286 
287     // DWORD 41
288     {
289         { 0, 0 }
290     },
291 
292     // DWORD 42
293     {
294         { 0, 0 }
295     },
296 
297     // DWORD 43
298     {
299         { 0, 0 }
300     },
301 
302     // DWORD 44
303     {
304         { 0, 0 }
305     },
306 
307     // DWORD 45
308     {
309         { 0, 0 }
310     },
311 
312     // DWORD 46
313     {
314         { 0, 0 }
315     },
316 
317     // DWORD 47
318     {
319         { 0, 0 }
320     },
321 
322     // DWORD 48
323     {
324         {
325             0,      // FormatDescriptorLayer0
326             0,      // ChromaSittingLocationLayer0
327             0,      // ChannelSwapEnablingFlagLayer0
328             0,      // IEFBypassEnablingFlagLayer0
329             0,      // RotationAngleMirrorDirectionLayer0
330             0,      // SamplerIndexFirstPlaneLayer0
331             0,      // SamplerIndexSecondThirdPlaneLayer0
332             0,      // Reserved
333             0,      // PriorCSCEnablingFlagLayer0
334             0,      // EOTF1DLUTEnablingFlagLayer0
335             0,      // CCMEnablingFlagLayer0
336             0,      // OETF1DLUTEnablingFlagLayer0
337             0,      // PostCSCEnablingFlagLayer0
338             0       // Enabling3DLUTFlagLayer0
339         }
340     },
341 
342     // DWORD 49
343     {
344         {
345             0,      // FormatDescriptorLayer1
346             0,      // ChromaSittingLocationLayer1
347             0,      // ChannelSwapEnablingFlagLayer1
348             0,      // IEFBypassEnablingFlagLayer1
349             0,      // RotationAngleMirrorDirectionLayer1
350             0,      // SamplerIndexFirstPlaneLayer1
351             0,      // SamplerIndexSecondThirdPlaneLayer1
352             0,      // Reserved
353             0,      // PriorCSCEnablingFlagLayer1
354             0,      // EOTF1DLUTEnablingFlagLayer1
355             0,      // CCMEnablingFlagLayer1
356             0,      // OETF1DLUTEnablingFlagLayer1
357             0,      // PostCSCEnablingFlagLayer1
358             0       // Enabling3DLUTFlagLayer1
359         }
360     },
361 
362     // DWORD 50
363     {
364         {
365             0,      // FormatDescriptorLayer2
366             0,      // ChromaSittingLocationLayer2
367             0,      // ChannelSwapEnablingFlagLayer2
368             0,      // IEFBypassEnablingFlagLayer2
369             0,      // RotationAngleMirrorDirectionLayer2
370             0,      // SamplerIndexFirstPlaneLayer2
371             0,      // SamplerIndexSecondThirdPlaneLayer2
372             0,      // Reserved
373             0,      // PriorCSCEnablingFlagLayer2
374             0,      // EOTF1DLUTEnablingFlagLayer2
375             0,      // CCMEnablingFlagLayer2
376             0,      // OETF1DLUTEnablingFlagLayer2
377             0,      // PostCSCEnablingFlagLayer2
378             0       // Enabling3DLUTFlagLayer2
379         }
380     },
381 
382     // DWORD 51
383     {
384         {
385             0,      // FormatDescriptorLayer3
386             0,      // ChromaSittingLocationLayer3
387             0,      // ChannelSwapEnablingFlagLayer3
388             0,      // IEFBypassEnablingFlagLayer3
389             0,      // RotationAngleMirrorDirectionLayer3
390             0,      // SamplerIndexFirstPlaneLayer3
391             0,      // SamplerIndexSecondThirdPlaneLayer3
392             0,      // Reserved
393             0,      // PriorCSCEnablingFlagLayer3
394             0,      // EOTF1DLUTEnablingFlagLayer3
395             0,      // CCMEnablingFlagLayer3
396             0,      // OETF1DLUTEnablingFlagLayer3
397             0,      // PostCSCEnablingFlagLayer3
398             0       // Enabling3DLUTFlagLayer3
399         }
400     },
401 
402     // DWORD 52
403     {
404         {
405             0,      // FormatDescriptorLayer4
406             0,      // ChromaSittingLocationLayer4
407             0,      // ChannelSwapEnablingFlagLayer4
408             0,      // IEFBypassEnablingFlagLayer4
409             0,      // RotationAngleMirrorDirectionLayer4
410             0,      // SamplerIndexFirstPlaneLayer4
411             0,      // SamplerIndexSecondThirdPlaneLayer4
412             0,      // Reserved
413             0,      // PriorCSCEnablingFlagLayer4
414             0,      // EOTF1DLUTEnablingFlagLayer4
415             0,      // CCMEnablingFlagLayer4
416             0,      // OETF1DLUTEnablingFlagLayer4
417             0,      // PostCSCEnablingFlagLayer4
418             0       // Enabling3DLUTFlagLayer4
419         }
420     },
421 
422     // DWORD 53
423     {
424         {
425             0,      // FormatDescriptorLayer5
426             0,      // ChromaSittingLocationLayer5
427             0,      // ChannelSwapEnablingFlagLayer5
428             0,      // IEFBypassEnablingFlagLayer5
429             0,      // RotationAngleMirrorDirectionLayer5
430             0,      // SamplerIndexFirstPlaneLayer5
431             0,      // SamplerIndexSecondThirdPlaneLayer5
432             0,      // Reserved
433             0,      // PriorCSCEnablingFlagLayer5
434             0,      // EOTF1DLUTEnablingFlagLayer5
435             0,      // CCMEnablingFlagLayer5
436             0,      // OETF1DLUTEnablingFlagLayer5
437             0,      // PostCSCEnablingFlagLayer5
438             0       // Enabling3DLUTFlagLayer5
439         }
440     },
441 
442     // DWORD 54
443     {
444         {
445             0,      // FormatDescriptorLayer6
446             0,      // ChromaSittingLocationLayer6
447             0,      // ChannelSwapEnablingFlagLayer6
448             0,      // IEFBypassEnablingFlagLayer6
449             0,      // RotationAngleMirrorDirectionLayer6
450             0,      // SamplerIndexFirstPlaneLayer6
451             0,      // SamplerIndexSecondThirdPlaneLayer6
452             0,      // Reserved
453             0,      // PriorCSCEnablingFlagLayer6
454             0,      // EOTF1DLUTEnablingFlagLayer6
455             0,      // CCMEnablingFlagLayer6
456             0,      // OETF1DLUTEnablingFlagLayer6
457             0,      // PostCSCEnablingFlagLayer6
458             0       // Enabling3DLUTFlagLayer6
459         }
460     },
461 
462     // DWORD 55
463     {
464         {
465             0,      // FormatDescriptorLayer7
466             0,      // ChromaSittingLocationLayer7
467             0,      // ChannelSwapEnablingFlagLayer7
468             0,      // IEFBypassEnablingFlagLayer7
469             0,      // RotationAngleMirrorDirectionLayer7
470             0,      // SamplerIndexFirstPlaneLayer7
471             0,      // SamplerIndexSecondThirdPlaneLayer7
472             0,      // Reserved
473             0,      // PriorCSCEnablingFlagLayer7
474             0,      // EOTF1DLUTEnablingFlagLayer7
475             0,      // CCMEnablingFlagLayer7
476             0,      // OETF1DLUTEnablingFlagLayer7
477             0,      // PostCSCEnablingFlagLayer7
478             0       // Enabling3DLUTFlagLayer7
479         }
480     },
481 
482     // DWORD 56
483     {
484         { 0, 0, 0, 0 }
485     },
486 
487     // DWORD 57
488     {
489         { 0, 0, 0, 0 }
490     },
491 
492     // DWORD 58
493     {
494         {
495             0,      // TwoLayerOperationLayer0
496             0,      // TwoLayerOperationLayer1
497             0,      // TwoLayerOperationLayer2
498             0       // TwoLayerOperationLayer3
499         }
500     },
501 
502     // DWORD 59
503     {
504         {
505             0,      // TwoLayerOperationLayer4
506             0,      // TwoLayerOperationLayer5
507             0,      // TwoLayerOperationLayer6
508             0       // TwoLayerOperationLayer7
509         }
510     },
511 
512     // DWORD 60
513     {
514         { 0, 0 }
515     },
516 
517     // DWORD 61
518     {
519         { 0, 0 }
520     },
521 
522     // DWORD 62
523     {
524         { 0, 0 }
525     },
526 
527     // DWORD 63
528     {
529         { 0, 0, 0, 0, 0, 0, 0 }
530     },
531 };
532 
533 
534 const int32_t VpRenderHdrKernel::s_bindingTableIndex[] =
535 {
536     VP_COMP_BTINDEX_LAYER0,
537     VP_COMP_BTINDEX_LAYER1,
538     VP_COMP_BTINDEX_LAYER2,
539     VP_COMP_BTINDEX_LAYER3,
540     VP_COMP_BTINDEX_LAYER4,
541     VP_COMP_BTINDEX_LAYER5,
542     VP_COMP_BTINDEX_LAYER6,
543     VP_COMP_BTINDEX_LAYER7
544 };
545 
546 const int32_t VpRenderHdrKernel::s_bindingTableIndexField[] =
547 {
548     VP_COMP_BTINDEX_L0_FIELD1_DUAL,
549     VP_COMP_BTINDEX_L0_FIELD1_DUAL + 1,
550     VP_COMP_BTINDEX_L0_FIELD1_DUAL + 2,
551     VP_COMP_BTINDEX_L0_FIELD1_DUAL + 3,
552     VP_COMP_BTINDEX_L0_FIELD1_DUAL + 4,
553     VP_COMP_BTINDEX_L0_FIELD1_DUAL + 5,
554     VP_COMP_BTINDEX_L0_FIELD1_DUAL + 6,
555     VP_COMP_BTINDEX_L0_FIELD1_DUAL + 7
556 };
557 
VpRenderHdrKernel(PVP_MHWINTERFACE hwInterface,PVpAllocator allocator)558 VpRenderHdrKernel::VpRenderHdrKernel(PVP_MHWINTERFACE hwInterface, PVpAllocator allocator) :
559     VpRenderKernelObj(hwInterface, (VpKernelID)kernelHdrMandatory, 0, VpRenderKernel::s_kernelNameNonAdvKernels, allocator)
560 {
561     VP_FUNC_CALL();
562 
563     renderHal = hwInterface ? hwInterface->m_renderHal : nullptr;
564 
565     m_kernelBinaryID = IDR_VP_HDR_mandatory;
566 
567     m_renderHal = m_hwInterface ? m_hwInterface->m_renderHal : nullptr;
568     if (m_renderHal)
569     {
570         m_renderHal->bEnableP010SinglePass = false;
571         VP_RENDER_NORMALMESSAGE("m_renderHal->bEnableP010SinglePass %d", m_renderHal->bEnableP010SinglePass);
572     }
573 }
574 
ConvertVpSurfaceTypeToRenderSurfType(VPHAL_SURFACE_TYPE vpSurfType)575 static inline RENDERHAL_SURFACE_TYPE ConvertVpSurfaceTypeToRenderSurfType(VPHAL_SURFACE_TYPE vpSurfType)
576 {
577     switch (vpSurfType)
578     {
579         case SURF_IN_BACKGROUND:
580             return RENDERHAL_SURF_IN_BACKGROUND;
581 
582         case SURF_IN_PRIMARY:
583             return RENDERHAL_SURF_IN_PRIMARY;
584 
585         case SURF_IN_SUBSTREAM:
586             return RENDERHAL_SURF_IN_SUBSTREAM;
587 
588         case SURF_IN_REFERENCE:
589             return RENDERHAL_SURF_IN_REFERENCE;
590 
591         case SURF_OUT_RENDERTARGET:
592             return RENDERHAL_SURF_OUT_RENDERTARGET;
593 
594         case SURF_NONE:
595         default:
596             return RENDERHAL_SURF_NONE;
597     }
598 }
599 
ConvertVpScalingModeToRenderScalingMode(VPHAL_SCALING_MODE vpScalingMode)600 static inline RENDERHAL_SCALING_MODE ConvertVpScalingModeToRenderScalingMode(VPHAL_SCALING_MODE vpScalingMode)
601 {
602     switch (vpScalingMode)
603     {
604         case VPHAL_SCALING_NEAREST:
605             return RENDERHAL_SCALING_NEAREST;
606 
607         case VPHAL_SCALING_BILINEAR:
608             return RENDERHAL_SCALING_BILINEAR;
609 
610         case VPHAL_SCALING_AVS:
611             return RENDERHAL_SCALING_AVS;
612 
613         default:
614             VP_RENDER_VERBOSEMESSAGE("Invalid VPHAL_SCALING_MODE %d, force to nearest mode.", vpScalingMode);
615             return RENDERHAL_SCALING_NEAREST;
616     }
617 }
618 
ConvertVpSampleTypeToRenderSampleType(VPHAL_SAMPLE_TYPE SampleType)619 static inline RENDERHAL_SAMPLE_TYPE ConvertVpSampleTypeToRenderSampleType(VPHAL_SAMPLE_TYPE SampleType)
620 {
621     switch (SampleType)
622     {
623         case SAMPLE_PROGRESSIVE:
624             return RENDERHAL_SAMPLE_PROGRESSIVE;
625 
626         case SAMPLE_SINGLE_TOP_FIELD:
627             return RENDERHAL_SAMPLE_SINGLE_TOP_FIELD;
628 
629         case SAMPLE_SINGLE_BOTTOM_FIELD:
630             return RENDERHAL_SAMPLE_SINGLE_BOTTOM_FIELD;
631 
632         case SAMPLE_INTERLEAVED_EVEN_FIRST_TOP_FIELD:
633             return RENDERHAL_SAMPLE_INTERLEAVED_EVEN_FIRST_TOP_FIELD;
634 
635         case SAMPLE_INTERLEAVED_EVEN_FIRST_BOTTOM_FIELD:
636             return RENDERHAL_SAMPLE_INTERLEAVED_EVEN_FIRST_BOTTOM_FIELD;
637 
638         case SAMPLE_INTERLEAVED_ODD_FIRST_TOP_FIELD:
639             return RENDERHAL_SAMPLE_INTERLEAVED_ODD_FIRST_TOP_FIELD;
640 
641         case SAMPLE_INTERLEAVED_ODD_FIRST_BOTTOM_FIELD:
642             return RENDERHAL_SAMPLE_INTERLEAVED_ODD_FIRST_BOTTOM_FIELD;
643 
644         case SAMPLE_INVALID:
645         default:
646             VP_RENDER_VERBOSEMESSAGE("Invalid VPHAL_SAMPLE_TYPE %d.\n", SampleType);
647             return RENDERHAL_SAMPLE_INVALID;
648     }
649 }
650 
VpRotationModeToRenderRotationMode(VPHAL_ROTATION Rotation)651 static inline MHW_ROTATION VpRotationModeToRenderRotationMode(VPHAL_ROTATION Rotation)
652 {
653     MHW_ROTATION    Mode = MHW_ROTATION_IDENTITY;
654 
655     switch (Rotation)
656     {
657         case VPHAL_ROTATION_IDENTITY:
658             Mode = MHW_ROTATION_IDENTITY;
659             break;
660 
661         case VPHAL_ROTATION_90:
662             Mode = MHW_ROTATION_90;
663             break;
664 
665         case VPHAL_ROTATION_180:
666             Mode = MHW_ROTATION_180;
667             break;
668 
669         case VPHAL_ROTATION_270:
670             Mode = MHW_ROTATION_270;
671             break;
672 
673         case VPHAL_MIRROR_HORIZONTAL:
674             Mode = MHW_MIRROR_HORIZONTAL;
675             break;
676 
677         case VPHAL_MIRROR_VERTICAL:
678             Mode = MHW_MIRROR_VERTICAL;
679             break;
680 
681         case VPHAL_ROTATE_90_MIRROR_VERTICAL:
682             Mode = MHW_ROTATE_90_MIRROR_VERTICAL;
683             break;
684 
685         case VPHAL_ROTATE_90_MIRROR_HORIZONTAL:
686             Mode = MHW_ROTATE_90_MIRROR_HORIZONTAL;
687             break;
688 
689         default:
690             VP_RENDER_VERBOSEMESSAGE("Invalid Rotation Angle.");
691             break;
692     }
693 
694     return Mode;
695 }
696 
Mat3MultiplyVec3(const Mat3 input,const Vec3 vec,Vec3 output)697 static void Mat3MultiplyVec3(const Mat3 input, const Vec3 vec, Vec3 output)
698 {
699     output[0] = input[0][0] * vec[0] + input[0][1] * vec[1] + input[0][2] * vec[2];
700     output[1] = input[1][0] * vec[0] + input[1][1] * vec[1] + input[1][2] * vec[2];
701     output[2] = input[2][0] * vec[0] + input[2][1] * vec[1] + input[2][2] * vec[2];
702 }
703 
Mat3Inverse(const Mat3 input,Mat3 output)704 static void Mat3Inverse(const Mat3 input, Mat3 output)
705 {
706     const float a0 = input[0][0];
707     const float a1 = input[0][1];
708     const float a2 = input[0][2];
709 
710     const float b0 = input[1][0];
711     const float b1 = input[1][1];
712     const float b2 = input[1][2];
713 
714     const float c0 = input[2][0];
715     const float c1 = input[2][1];
716     const float c2 = input[2][2];
717 
718     float det = a0 * (b1 * c2 - b2 * c1) + a1 * (b2 * c0 - b0 * c2) + a2 * (b0 * c1 - b1 * c0);
719 
720     if (det != 0.0f)
721     {
722         float det_recip = 1.0f / det;
723 
724         output[0][0] = (b1 * c2 - b2 * c1) * det_recip;
725         output[0][1] = (a2 * c1 - a1 * c2) * det_recip;
726         output[0][2] = (a1 * b2 - a2 * b1) * det_recip;
727 
728         output[1][0] = (b2 * c0 - b0 * c2) * det_recip;
729         output[1][1] = (a0 * c2 - a2 * c0) * det_recip;
730         output[1][2] = (a2 * b0 - a0 * b2) * det_recip;
731 
732         output[2][0] = (b0 * c1 - b1 * c0) * det_recip;
733         output[2][1] = (a1 * c0 - a0 * c1) * det_recip;
734         output[2][2] = (a0 * b1 - a1 * b0) * det_recip;
735     }
736     else
737     {
738         // irreversible
739         output[0][0] = 1.0f;
740         output[0][1] = 0.0f;
741         output[0][2] = 0.0f;
742         output[1][0] = 0.0f;
743         output[1][1] = 1.0f;
744         output[1][2] = 0.0f;
745         output[2][0] = 0.0f;
746         output[2][1] = 0.0f;
747         output[2][2] = 1.0f;
748     }
749 }
750 
RGB2CIEXYZMatrix(const float xr,const float yr,const float xg,const float yg,const float xb,const float yb,const float xn,const float yn,Mat3 output)751 static void RGB2CIEXYZMatrix(
752     const float xr, const float yr, const float xg, const float yg, const float xb, const float yb, const float xn, const float yn, Mat3 output)
753 {
754     const float zr = 1.0f - xr - yr;
755     const float zg = 1.0f - xg - yg;
756     const float zb = 1.0f - xb - yb;
757     const float zn = 1.0f - xn - yn;
758 
759     // m * [ar, ag, ab]T = [xn / yn, 1.0f, zn / yn]T;
760     const Mat3 m =
761         {
762             xr, xg, xb, yr, yg, yb, zr, zg, zb};
763 
764     Mat3 inversed_m;
765 
766     Mat3Inverse(m, inversed_m);
767 
768     const Vec3 XYZWithUnityY = {xn / yn, 1.0f, zn / yn};
769     float      aragab[3];
770 
771     Mat3MultiplyVec3(inversed_m, XYZWithUnityY, aragab);
772 
773     output[0][0] = m[0][0] * aragab[0];
774     output[1][0] = m[1][0] * aragab[0];
775     output[2][0] = m[2][0] * aragab[0];
776     output[0][1] = m[0][1] * aragab[1];
777     output[1][1] = m[1][1] * aragab[1];
778     output[2][1] = m[2][1] * aragab[1];
779     output[0][2] = m[0][2] * aragab[2];
780     output[1][2] = m[1][2] * aragab[2];
781     output[2][2] = m[2][2] * aragab[2];
782 }
783 
Mat3MultiplyMat3(const Mat3 left,const Mat3 right,Mat3 output)784 static void Mat3MultiplyMat3(const Mat3 left, const Mat3 right, Mat3 output)
785 {
786     output[0][0] = left[0][0] * right[0][0] + left[0][1] * right[1][0] + left[0][2] * right[2][0];
787     output[0][1] = left[0][0] * right[0][1] + left[0][1] * right[1][1] + left[0][2] * right[2][1];
788     output[0][2] = left[0][0] * right[0][2] + left[0][1] * right[1][2] + left[0][2] * right[2][2];
789     output[1][0] = left[1][0] * right[0][0] + left[1][1] * right[1][0] + left[1][2] * right[2][0];
790     output[1][1] = left[1][0] * right[0][1] + left[1][1] * right[1][1] + left[1][2] * right[2][1];
791     output[1][2] = left[1][0] * right[0][2] + left[1][1] * right[1][2] + left[1][2] * right[2][2];
792     output[2][0] = left[2][0] * right[0][0] + left[2][1] * right[1][0] + left[2][2] * right[2][0];
793     output[2][1] = left[2][0] * right[0][1] + left[2][1] * right[1][1] + left[2][2] * right[2][1];
794     output[2][2] = left[2][0] * right[0][2] + left[2][1] * right[1][2] + left[2][2] * right[2][2];
795 }
796 
797 //!
798 //! \brief    Calculate Yuv To Rgb Matrix
799 //! \details  Calculate Yuv To Rgb Matrix
800 //! \param    VPHAL_CSPACE src
801 //!           [in] Source color space
802 //! \param    VPHAL_CSPACE dst
803 //!           [in] Dest color space
804 //! \param    float* pTransferMatrix
805 //!           [in] Pointer to input transfer matrix
806 //! \param    float* pOutMatrix
807 //!           [out] Pointer to output transfer matrix for curbe
808 //! \return   MOS_STATUS
809 //!
VpHal_HdrCalcYuvToRgbMatrix(VPHAL_CSPACE src,VPHAL_CSPACE dst,float * pTransferMatrix,float * pOutMatrix)810 MOS_STATUS VpRenderHdrKernel::VpHal_HdrCalcYuvToRgbMatrix(
811     VPHAL_CSPACE src,
812     VPHAL_CSPACE dst,
813     float       *pTransferMatrix,
814     float       *pOutMatrix)
815 {
816     VP_FUNC_CALL();
817 
818     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
819     float      Y_o = 0.0f, Y_e = 0.0f, C_z = 0.0f, C_e = 0.0f;
820     float      R_o = 0.0f, R_e = 0.0f;
821 
822     VP_PUBLIC_CHK_NULL_RETURN(pTransferMatrix);
823     VP_PUBLIC_CHK_NULL_RETURN(pOutMatrix);
824 
825     VpHal_HdrGetRgbRangeAndOffset(dst, &R_o, &R_e);
826     VpHal_HdrGetYuvRangeAndOffset(src, &Y_o, &Y_e, &C_z, &C_e);
827 
828     // after + (3x3)(3x3)
829     pOutMatrix[0]  = pTransferMatrix[0] * R_e / Y_e;
830     pOutMatrix[4]  = pTransferMatrix[4] * R_e / Y_e;
831     pOutMatrix[8]  = pTransferMatrix[8] * R_e / Y_e;
832     pOutMatrix[1]  = pTransferMatrix[1] * R_e / C_e;
833     pOutMatrix[5]  = pTransferMatrix[5] * R_e / C_e;
834     pOutMatrix[9]  = pTransferMatrix[9] * R_e / C_e;
835     pOutMatrix[2]  = pTransferMatrix[2] * R_e / C_e;
836     pOutMatrix[6]  = pTransferMatrix[6] * R_e / C_e;
837     pOutMatrix[10] = pTransferMatrix[10] * R_e / C_e;
838 
839     // (3x1) - (3x3)(3x3)(3x1)
840     pOutMatrix[3]  = R_o - (pOutMatrix[0] * Y_o + pOutMatrix[1] * C_z + pOutMatrix[2] * C_z);
841     pOutMatrix[7]  = R_o - (pOutMatrix[4] * Y_o + pOutMatrix[5] * C_z + pOutMatrix[6] * C_z);
842     pOutMatrix[11] = R_o - (pOutMatrix[8] * Y_o + pOutMatrix[9] * C_z + pOutMatrix[10] * C_z);
843 
844     return eStatus;
845 }
846 
847 //!
848 //! \brief    Calculate Yuv Range and Offest
849 //! \details  Calculate Yuv Range and Offest
850 //! \param    VPHAL_CSPACE cspace
851 //!           [in] Source color space
852 //! \param    float* pLumaOffset
853 //!           [out] Pointer to Luma Offset
854 //! \param    float* pLumaExcursion
855 //!           [out] Pointer to Luma Excursion
856 //! \param    float* pChromaZero
857 //!           [out] Pointer to Chroma Offset
858 //! \param    float* pChromaExcursion
859 //!           [out] Pointer to Chroma Excursion
860 //! \return   MOS_STATUS
861 //!
VpHal_HdrGetYuvRangeAndOffset(VPHAL_CSPACE cspace,float * pLumaOffset,float * pLumaExcursion,float * pChromaZero,float * pChromaExcursion)862 MOS_STATUS VpRenderHdrKernel::VpHal_HdrGetYuvRangeAndOffset(
863     VPHAL_CSPACE cspace,
864     float       *pLumaOffset,
865     float       *pLumaExcursion,
866     float       *pChromaZero,
867     float       *pChromaExcursion)
868 {
869     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
870     VP_FUNC_CALL();
871     VP_PUBLIC_CHK_NULL_RETURN(pLumaOffset);
872     VP_PUBLIC_CHK_NULL_RETURN(pLumaExcursion);
873     VP_PUBLIC_CHK_NULL_RETURN(pChromaZero);
874     VP_PUBLIC_CHK_NULL_RETURN(pChromaExcursion);
875 
876     switch (cspace)
877     {
878     case CSpace_BT601_FullRange:
879     case CSpace_BT709_FullRange:
880     case CSpace_BT601Gray_FullRange:
881     case CSpace_BT2020_FullRange:
882         *pLumaOffset      = 0.0f;
883         *pLumaExcursion   = 255.0f;
884         *pChromaZero      = 128.0f;
885         *pChromaExcursion = 255.0f;
886         break;
887 
888     case CSpace_BT601:
889     case CSpace_BT709:
890     case CSpace_xvYCC601:  // since matrix is the same as 601, use the same range
891     case CSpace_xvYCC709:  // since matrix is the same as 709, use the same range
892     case CSpace_BT601Gray:
893     case CSpace_BT2020:
894         *pLumaOffset      = 16.0f;
895         *pLumaExcursion   = 219.0f;
896         *pChromaZero      = 128.0f;
897         *pChromaExcursion = 224.0f;
898         break;
899 
900     default:
901         *pLumaOffset      = 0.0f;
902         *pLumaExcursion   = 255.0f;
903         *pChromaZero      = 128.0f;
904         *pChromaExcursion = 255.0f;
905         break;
906     }
907 
908     *pLumaOffset /= 255.0f;
909     *pLumaExcursion /= 255.0f;
910     *pChromaZero /= 255.0f;
911     *pChromaExcursion /= 255.0f;
912 
913     return eStatus;
914 }
915 
916 //!
917 //! \brief    Calculate Rgb Range and Offest
918 //! \details  Calculate Rgb Range and Offest
919 //! \param    VPHAL_CSPACE cspace
920 //!           [in] Source color space
921 //! \param    float* pLumaOffset
922 //!           [out] Pointer to Rgb Offset
923 //! \param    float* pLumaExcursion
924 //!           [out] Pointer to Rgb Excursion
925 //! \return   MOS_STATUS
926 //!
VpHal_HdrGetRgbRangeAndOffset(VPHAL_CSPACE cspace,float * pRgbOffset,float * pRgbExcursion)927 MOS_STATUS VpRenderHdrKernel::VpHal_HdrGetRgbRangeAndOffset(
928     VPHAL_CSPACE cspace,
929     float       *pRgbOffset,
930     float       *pRgbExcursion)
931 {
932     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
933     VP_FUNC_CALL();
934     VP_PUBLIC_CHK_NULL_RETURN(pRgbOffset);
935     VP_PUBLIC_CHK_NULL_RETURN(pRgbExcursion);
936 
937     switch (cspace)
938     {
939     case CSpace_sRGB:
940     case CSpace_BT2020_RGB:
941         *pRgbOffset    = 0.0f;
942         *pRgbExcursion = 255.0f;
943         break;
944 
945     case CSpace_stRGB:
946     case CSpace_BT2020_stRGB:
947         *pRgbOffset    = 16.0f;
948         *pRgbExcursion = 219.0f;
949         break;
950 
951     default:
952         *pRgbOffset    = 0.0f;
953         *pRgbExcursion = 255.0f;
954         break;
955     }
956 
957     *pRgbOffset /= 255.0f;
958     *pRgbExcursion /= 255.0f;
959 
960     return eStatus;
961 }
962 
963 //!
964 //! \brief    Calculate Rgb To Yuv Matrix
965 //! \details  Calculate Rgb To Yuv Matrix
966 //! \param    VPHAL_CSPACE src
967 //!           [in] Source color space
968 //! \param    VPHAL_CSPACE dst
969 //!           [in] Dest color space
970 //! \param    float* pTransferMatrix
971 //!           [in] Pointer to input transfer matrix
972 //! \param    float* pOutMatrix
973 //!           [out] Pointer to output transfer matrix for curbe
974 //! \return   MOS_STATUS
975 //!
VpHal_HdrCalcRgbToYuvMatrix(VPHAL_CSPACE src,VPHAL_CSPACE dst,float * pTransferMatrix,float * pOutMatrix)976 MOS_STATUS VpRenderHdrKernel::VpHal_HdrCalcRgbToYuvMatrix(
977     VPHAL_CSPACE src,
978     VPHAL_CSPACE dst,
979     float       *pTransferMatrix,
980     float       *pOutMatrix)
981 {
982     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
983     float      Y_o = 0.0f, Y_e = 0.0f, C_z = 0.0f, C_e = 0.0f;
984     float      R_o = 0.0f, R_e = 0.0f;
985     VP_FUNC_CALL();
986     VP_PUBLIC_CHK_NULL_RETURN(pTransferMatrix);
987     VP_PUBLIC_CHK_NULL_RETURN(pOutMatrix);
988 
989     VpHal_HdrGetRgbRangeAndOffset(src, &R_o, &R_e);
990     VpHal_HdrGetYuvRangeAndOffset(dst, &Y_o, &Y_e, &C_z, &C_e);
991 
992     // multiplication of + onwards
993     pOutMatrix[0]  = pTransferMatrix[0] * Y_e / R_e;
994     pOutMatrix[1]  = pTransferMatrix[1] * Y_e / R_e;
995     pOutMatrix[2]  = pTransferMatrix[2] * Y_e / R_e;
996     pOutMatrix[4]  = pTransferMatrix[4] * C_e / R_e;
997     pOutMatrix[5]  = pTransferMatrix[5] * C_e / R_e;
998     pOutMatrix[6]  = pTransferMatrix[6] * C_e / R_e;
999     pOutMatrix[8]  = pTransferMatrix[8] * C_e / R_e;
1000     pOutMatrix[9]  = pTransferMatrix[9] * C_e / R_e;
1001     pOutMatrix[10] = pTransferMatrix[10] * C_e / R_e;
1002 
1003     pOutMatrix[7]  = Y_o - Y_e * R_o / R_e;
1004     pOutMatrix[3]  = C_z;
1005     pOutMatrix[11] = C_z;
1006 
1007     return eStatus;
1008 }
1009 
1010 //!
1011 //! \brief    Calculate CCM Matrix
1012 //! \details  Calculate CCM Matrix
1013 //! \param    float* pTransferMatrix
1014 //!           [in] Pointer to input transfer matrix
1015 //! \param    float* pOutMatrix
1016 //!           [out] Pointer to output transfer matrix for curbe
1017 //! \return   MOS_STATUS
1018 //!
VpHal_HdrCalcCCMMatrix(float * pTransferMatrix,float * pOutMatrix)1019 MOS_STATUS VpRenderHdrKernel::VpHal_HdrCalcCCMMatrix(
1020     float *pTransferMatrix,
1021     float *pOutMatrix)
1022 {
1023     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
1024     VP_FUNC_CALL();
1025     VP_PUBLIC_CHK_NULL_RETURN(pTransferMatrix);
1026     VP_PUBLIC_CHK_NULL_RETURN(pOutMatrix);
1027 
1028     // multiplication of + onwards
1029     pOutMatrix[0]  = pTransferMatrix[1];
1030     pOutMatrix[1]  = pTransferMatrix[2];
1031     pOutMatrix[2]  = pTransferMatrix[0];
1032     pOutMatrix[4]  = pTransferMatrix[5];
1033     pOutMatrix[5]  = pTransferMatrix[6];
1034     pOutMatrix[6]  = pTransferMatrix[4];
1035     pOutMatrix[8]  = pTransferMatrix[9];
1036     pOutMatrix[9]  = pTransferMatrix[10];
1037     pOutMatrix[10] = pTransferMatrix[8];
1038 
1039     pOutMatrix[3]  = pTransferMatrix[11];
1040     pOutMatrix[7]  = pTransferMatrix[3];
1041     pOutMatrix[11] = pTransferMatrix[7];
1042 
1043     return eStatus;
1044 }
1045 
HdrCalculateCCMWithMonitorGamut(VPHAL_HDR_CCM_TYPE CCMType,HDR_PARAMS Target,float TempMatrix[12])1046 void VpRenderHdrKernel::HdrCalculateCCMWithMonitorGamut(
1047     VPHAL_HDR_CCM_TYPE CCMType,
1048     HDR_PARAMS         Target,
1049     float              TempMatrix[12])
1050 {
1051     float src_xr = 1.0f, src_yr = 1.0f;
1052     float src_xg = 1.0f, src_yg = 1.0f;
1053     float src_xb = 1.0f, src_yb = 1.0f;
1054     float src_xn = 1.0f, src_yn = 1.0f;
1055 
1056     float dst_xr = 1.0f, dst_yr = 1.0f;
1057     float dst_xg = 1.0f, dst_yg = 1.0f;
1058     float dst_xb = 1.0f, dst_yb = 1.0f;
1059     float dst_xn = 1.0f, dst_yn = 1.0f;
1060 
1061     Mat3 SrcMatrix        = {1.0f};
1062     Mat3 DstMatrix        = {1.0f};
1063     Mat3 DstMatrixInverse = {1.0f};
1064     Mat3 SrcToDstMatrix   = {1.0f};
1065 
1066     Mat3 BT709ToBT2020Matrix = {1.0f};
1067     Mat3 BT2020ToBT709Matrix = {1.0f};
1068 
1069     if (CCMType == VPHAL_HDR_CCM_BT2020_TO_MONITOR_MATRIX)
1070     {
1071         src_xr = 0.708f;
1072         src_yr = 0.292f;
1073         src_xg = 0.170f;
1074         src_yg = 0.797f;
1075         src_xb = 0.131f;
1076         src_yb = 0.046f;
1077         src_xn = 0.3127f;
1078         src_yn = 0.3290f;
1079 
1080         dst_xr = Target.display_primaries_x[2] / 50000.0f;
1081         dst_yr = Target.display_primaries_y[2] / 50000.0f;
1082         dst_xg = Target.display_primaries_x[0] / 50000.0f;
1083         dst_yg = Target.display_primaries_y[0] / 50000.0f;
1084         dst_xb = Target.display_primaries_x[1] / 50000.0f;
1085         dst_yb = Target.display_primaries_y[1] / 50000.0f;
1086         dst_xn = Target.white_point_x / 50000.0f;
1087         dst_yn = Target.white_point_y / 50000.0f;
1088     }
1089     else if (CCMType == VPHAL_HDR_CCM_MONITOR_TO_BT2020_MATRIX)
1090     {
1091         src_xr = Target.display_primaries_x[2] / 50000.0f;
1092         src_yr = Target.display_primaries_y[2] / 50000.0f;
1093         src_xg = Target.display_primaries_x[0] / 50000.0f;
1094         src_yg = Target.display_primaries_y[0] / 50000.0f;
1095         src_xb = Target.display_primaries_x[1] / 50000.0f;
1096         src_yb = Target.display_primaries_y[1] / 50000.0f;
1097         src_xn = Target.white_point_x / 50000.0f;
1098         src_yn = Target.white_point_y / 50000.0f;
1099 
1100         dst_xr = 0.708f;
1101         dst_yr = 0.292f;
1102         dst_xg = 0.170f;
1103         dst_yg = 0.797f;
1104         dst_xb = 0.131f;
1105         dst_yb = 0.046f;
1106         dst_xn = 0.3127f;
1107         dst_yn = 0.3290f;
1108     }
1109     else
1110     {
1111         // VPHAL_HDR_CCM_MONITOR_TO_BT2020_MATRIX
1112         src_xr = Target.display_primaries_x[2] / 50000.0f;
1113         src_yr = Target.display_primaries_y[2] / 50000.0f;
1114         src_xg = Target.display_primaries_x[0] / 50000.0f;
1115         src_yg = Target.display_primaries_y[0] / 50000.0f;
1116         src_xb = Target.display_primaries_x[1] / 50000.0f;
1117         src_yb = Target.display_primaries_y[1] / 50000.0f;
1118         src_xn = Target.white_point_x / 50000.0f;
1119         src_yn = Target.white_point_y / 50000.0f;
1120 
1121         dst_xr = 0.64f;
1122         dst_yr = 0.33f;
1123         dst_xg = 0.30f;
1124         dst_yg = 0.60f;
1125         dst_xb = 0.15f;
1126         dst_yb = 0.06f;
1127         dst_xn = 0.3127f;
1128         dst_yn = 0.3290f;
1129     }
1130 
1131     RGB2CIEXYZMatrix(
1132         src_xr, src_yr, src_xg, src_yg, src_xb, src_yb, src_xn, src_yn, SrcMatrix);
1133 
1134     RGB2CIEXYZMatrix(
1135         dst_xr, dst_yr, dst_xg, dst_yg, dst_xb, dst_yb, dst_xn, dst_yn, DstMatrix);
1136 
1137     Mat3Inverse(DstMatrix, DstMatrixInverse);
1138     Mat3MultiplyMat3(DstMatrixInverse, SrcMatrix, SrcToDstMatrix);
1139 
1140     TempMatrix[0]  = SrcToDstMatrix[0][0];
1141     TempMatrix[1]  = SrcToDstMatrix[0][1];
1142     TempMatrix[2]  = SrcToDstMatrix[0][2];
1143     TempMatrix[3]  = 0.0f;
1144     TempMatrix[4]  = SrcToDstMatrix[1][0];
1145     TempMatrix[5]  = SrcToDstMatrix[1][1];
1146     TempMatrix[6]  = SrcToDstMatrix[1][2];
1147     TempMatrix[7]  = 0.0f;
1148     TempMatrix[8]  = SrcToDstMatrix[2][0];
1149     TempMatrix[9]  = SrcToDstMatrix[2][1];
1150     TempMatrix[10] = SrcToDstMatrix[2][2];
1151     TempMatrix[11] = 0.0f;
1152 
1153     return;
1154 }
1155 
HdrConvert_CSC_Coeff_To_Register_Format(double coeff)1156 CSC_COEFF_FORMAT HdrConvert_CSC_Coeff_To_Register_Format(double coeff)
1157 {
1158     VP_FUNC_CALL();
1159 
1160     CSC_COEFF_FORMAT outVal       = {0};
1161     uint32_t         shift_factor = 0;
1162 
1163     if (coeff < 0)
1164     {
1165         outVal.sign = 1;
1166         coeff       = -coeff;
1167     }
1168 
1169     // range check
1170     if (coeff > MAX_CSC_COEFF_VAL_ICL)
1171         coeff = MAX_CSC_COEFF_VAL_ICL;
1172 
1173     if (coeff < 0.125)  //0.000bbbbbbbbb
1174     {
1175         outVal.exponent = 3;
1176         shift_factor    = 12;
1177     }
1178     else if (coeff >= 0.125 && coeff < 0.25)  //0.00bbbbbbbbb
1179     {
1180         outVal.exponent = 2;
1181         shift_factor    = 11;
1182     }
1183     else if (coeff >= 0.25 && coeff < 0.5)  //0.0bbbbbbbbb
1184     {
1185         outVal.exponent = 1;
1186         shift_factor    = 10;
1187     }
1188     else if (coeff >= 0.5 && coeff < 1.0)  // 0.bbbbbbbbb
1189     {
1190         outVal.exponent = 0;
1191         shift_factor    = 9;
1192     }
1193     else if (coeff >= 1.0 && coeff < 2.0)  //b.bbbbbbbb
1194     {
1195         outVal.exponent = 7;
1196         shift_factor    = 8;
1197     }
1198     else if (coeff >= 2.0)  // bb.bbbbbbb
1199     {
1200         outVal.exponent = 6;
1201         shift_factor    = 7;
1202     }
1203 
1204     //Convert float to integer
1205     outVal.mantissa = static_cast<uint32_t>(round(coeff * (double)(1 << (int)shift_factor)));
1206 
1207     return outVal;
1208 }
1209 
HdrConvert_CSC_Coeff_Register_Format_To_Double(CSC_COEFF_FORMAT regVal)1210 double HdrConvert_CSC_Coeff_Register_Format_To_Double(CSC_COEFF_FORMAT regVal)
1211 {
1212     VP_FUNC_CALL();
1213 
1214     double outVal = 0;
1215 
1216     switch (regVal.exponent)
1217     {
1218     case 0:
1219         outVal = (double)regVal.mantissa / 512.0;
1220         break;
1221     case 1:
1222         outVal = (double)regVal.mantissa / 1024.0;
1223         break;
1224     case 2:
1225         outVal = (double)regVal.mantissa / 2048.0;
1226         break;
1227     case 3:
1228         outVal = (double)regVal.mantissa / 4096.0;
1229         break;
1230     case 6:
1231         outVal = (double)regVal.mantissa / 128.0;
1232         break;
1233     case 7:
1234         outVal = (double)regVal.mantissa / 256.0;
1235         break;
1236     }
1237 
1238     if (regVal.sign)
1239     {
1240         outVal = -outVal;
1241     }
1242 
1243     return outVal;
1244 }
1245 
HdrLimitFP32PrecisionToF3_9(float fp)1246 float HdrLimitFP32PrecisionToF3_9(float fp)
1247 {
1248     VP_FUNC_CALL();
1249 
1250     double dbInput  = static_cast<double>(fp);
1251     double dbOutput = HdrConvert_CSC_Coeff_Register_Format_To_Double(HdrConvert_CSC_Coeff_To_Register_Format(dbInput));
1252     return static_cast<float>(dbOutput);
1253 }
1254 
HdrLimitFP32ArrayPrecisionToF3_9(float fps[],size_t size)1255 void VpRenderHdrKernel::HdrLimitFP32ArrayPrecisionToF3_9(float fps[], size_t size)
1256 {
1257     VP_FUNC_CALL();
1258 
1259     for (size_t i = 0; i < size; i++)
1260     {
1261         fps[i] = HdrLimitFP32PrecisionToF3_9(fps[i]);
1262     }
1263 }
1264 
1265 typedef float (*pfnOETFFunc)(float radiance);
1266 
HdrOETF2084(float c)1267 float HdrOETF2084(float c)
1268 {
1269     static const double C1 = 0.8359375;
1270     static const double C2 = 18.8515625;
1271     static const double C3 = 18.6875;
1272     static const double M1 = 0.1593017578125;
1273     static const double M2 = 78.84375;
1274 
1275     double tmp         = c;
1276     double numerator   = pow(tmp, M1);
1277     double denominator = numerator;
1278 
1279     denominator = 1.0 + C3 * denominator;
1280     numerator   = C1 + C2 * numerator;
1281     numerator   = numerator / denominator;
1282 
1283     return (float)pow(numerator, M2);
1284 }
1285 
HdrOETFBT709(float c)1286 float HdrOETFBT709(float c)
1287 {
1288     static const double E0 = 0.45;
1289     static const double C1 = 0.099;
1290     static const double C2 = 4.5;
1291     static const double P0 = 0.018;
1292 
1293     double tmp = c;
1294     double result;
1295 
1296     if (tmp <= P0)
1297     {
1298         result = C2 * tmp;
1299     }
1300     else
1301     {
1302         result = (C1 + 1.0) * pow(tmp, E0) - C1;
1303     }
1304     return (float)result;
1305 }
1306 
HdrOETFsRGB(float c)1307 float HdrOETFsRGB(float c)
1308 {
1309     static const double E1 = 2.4;
1310     static const double C1 = 0.055;
1311     static const double C2 = 12.92;
1312     static const double P0 = 0.0031308;
1313 
1314     double tmp = c;
1315     double result;
1316 
1317     if (tmp <= P0)
1318     {
1319         result = C2 * tmp;
1320     }
1321     else
1322     {
1323         result = (C1 + 1.0) * pow(tmp, 1.0 / E1) - C1;
1324     }
1325     return (float)result;
1326 }
1327 
1328 // Non-uniform OETF LUT generator.
HdrGenerate2SegmentsOETFLUT(float fStretchFactor,pfnOETFFunc oetfFunc,uint16_t * lut)1329 void HdrGenerate2SegmentsOETFLUT(float fStretchFactor, pfnOETFFunc oetfFunc, uint16_t *lut)
1330 {
1331     int i = 0, j = 0;
1332 
1333     for (i = 0; i < VPHAL_HDR_OETF_1DLUT_HEIGHT; ++i)
1334     {
1335         for (j = 0; j < VPHAL_HDR_OETF_1DLUT_WIDTH; ++j)
1336         {
1337             int   idx = j + i * (VPHAL_HDR_OETF_1DLUT_WIDTH - 1);
1338             float a   = (idx < 32) ? ((1.0f / 1024.0f) * idx) : ((1.0f / 32.0f) * (idx - 31));
1339 
1340             if (a > 1.0f)
1341                 a = 1.0f;
1342 
1343             a *= fStretchFactor;
1344             lut[i * VPHAL_HDR_OETF_1DLUT_WIDTH + j] = VpHal_FloatToHalfFloat(oetfFunc(a));
1345         }
1346     }
1347 }
1348 
1349 //!
1350 //! \brief    Color Transfer for Hdr 3d Lut
1351 //! \details  Color Transfer for Hdr 3d Lut
1352 //! \param    PVPHAL_HDR_STATE pHdrState
1353 //!           [in] Pointer to Hdr State
1354 //! \param    int32_t iIndex
1355 //!           [in] Input Surface index
1356 //! \param    float fInputX
1357 //!           [in] Input color for x axis of 3D Lut
1358 //! \param    float fInputY
1359 //!           [in] Input color for y axis of 3D Lut
1360 //! \param    float fInputZ
1361 //!           [in] Input color for z axis of 3D Lut
1362 //! \param    uint16_t *puOutputX
1363 //!           [in] Output color for x axis of 3D Lut
1364 //! \param    uint16_t *puOutputX
1365 //!           [in] Output color for y axis of 3D Lut
1366 //! \param    uint16_t *puOutputX
1367 //!           [in] Output color for z axis of 3D Lut
1368 //! \return   MOS_STATUS
1369 //!
VpHal_HdrColorTransfer3dLut(PRENDER_HDR_PARAMS params,int32_t iIndex,float fInputX,float fInputY,float fInputZ,uint16_t * puOutputX,uint16_t * puOutputY,uint16_t * puOutputZ)1370 MOS_STATUS VpRenderHdrKernel::VpHal_HdrColorTransfer3dLut(
1371     PRENDER_HDR_PARAMS params,
1372     int32_t          iIndex,
1373     float            fInputX,
1374     float            fInputY,
1375     float            fInputZ,
1376     uint16_t        *puOutputX,
1377     uint16_t        *puOutputY,
1378     uint16_t        *puOutputZ)
1379 {
1380     VP_FUNC_CALL();
1381 
1382     float                PriorCscMatrix[12] = {}, PostCscMatrix[12] = {};
1383     float                TempMatrix[12] = {};
1384     double               fTempX = 0, fTempY = 0, fTempZ = 0;
1385     double               fTemp1X = 0, fTemp1Y = 0, fTemp1Z = 0;
1386     double               fTemp = 0;
1387     double               m1        = 0.1593017578125;  // SMPTE ST2084 EOTF parameters
1388     double               m2        = 78.84375;         // SMPTE ST2084 EOTF parameters
1389     double               c2        = 18.8515625;       // SMPTE ST2084 EOTF parameters
1390     double               c3        = 18.6875;          // SMPTE ST2084 EOTF parameters
1391     double               c1        = c3 - c2 + 1;      // SMPTE ST2084 EOTF parameters
1392 
1393     VP_PUBLIC_CHK_NULL_RETURN(params);
1394     VP_PUBLIC_CHK_NULL_RETURN(puOutputX);
1395     VP_PUBLIC_CHK_NULL_RETURN(puOutputX);
1396     VP_PUBLIC_CHK_NULL_RETURN(puOutputX);
1397 
1398     fTempX = (double)fInputX;
1399     fTempY = (double)fInputY;
1400     fTempZ = (double)fInputZ;
1401 
1402 #define SET_MATRIX(_c0, _c1, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c10, _c11) \
1403     {                                                                            \
1404         TempMatrix[0]  = _c0;                                                    \
1405         TempMatrix[1]  = _c1;                                                    \
1406         TempMatrix[2]  = _c2;                                                    \
1407         TempMatrix[3]  = _c3;                                                    \
1408         TempMatrix[4]  = _c4;                                                    \
1409         TempMatrix[5]  = _c5;                                                    \
1410         TempMatrix[6]  = _c6;                                                    \
1411         TempMatrix[7]  = _c7;                                                    \
1412         TempMatrix[8]  = _c8;                                                    \
1413         TempMatrix[9]  = _c9;                                                    \
1414         TempMatrix[10] = _c10;                                                   \
1415         TempMatrix[11] = _c11;                                                   \
1416     }
1417 
1418 #define CLAMP_MIN_MAX(_a, _min, _max) \
1419     {                                 \
1420         if (_a < _min)                \
1421         {                             \
1422             _a = _min;                \
1423         }                             \
1424         if (_a > _max)                \
1425         {                             \
1426             _a = _max;                \
1427         }                             \
1428     }
1429 
1430     auto        inputSurface = m_surfaceGroup->find(SurfaceType(SurfaceTypeHdrInputLayer0 + iIndex));
1431     VP_SURFACE *input        = (m_surfaceGroup->end() != inputSurface) ? inputSurface->second : nullptr;
1432     // EOTF/CCM/Tone Mapping/OETF require RGB input
1433     // So if prior CSC is needed, it will always be YUV to RGB conversion
1434     if (params->StageEnableFlags[iIndex].PriorCSCEnable)
1435     {
1436         if (params->PriorCSC[iIndex] == VPHAL_HDR_CSC_YUV_TO_RGB_BT601)
1437         {
1438             SET_MATRIX(1.000000f, 0.000000f, 1.402000f, 0.000000f, 1.000000f, -0.344136f, -0.714136f, 0.000000f, 1.000000f, 1.772000f, 0.000000f, 0.000000f);
1439             VpHal_HdrCalcYuvToRgbMatrix(CSpace_BT601, CSpace_sRGB, TempMatrix, PriorCscMatrix);
1440         }
1441         else if (params->PriorCSC[iIndex] == VPHAL_HDR_CSC_YUV_TO_RGB_BT709)
1442         {
1443             SET_MATRIX(1.000000f, 0.000000f, 1.574800f, 0.000000f, 1.000000f, -0.187324f, -0.468124f, 0.000000f, 1.000000f, 1.855600f, 0.000000f, 0.000000f);
1444             VpHal_HdrCalcYuvToRgbMatrix(CSpace_BT709, CSpace_sRGB, TempMatrix, PriorCscMatrix);
1445         }
1446         else if (params->PriorCSC[iIndex] == VPHAL_HDR_CSC_YUV_TO_RGB_BT2020)
1447         {
1448             SET_MATRIX(1.000000f, 0.000000f, 1.474600f, 0.000000f, 1.000000f, -0.164550f, -0.571350f, 0.000000f, 1.000000f, 1.881400f, 0.000000f, 0.000000f);
1449             VpHal_HdrCalcYuvToRgbMatrix(CSpace_BT2020, CSpace_sRGB, TempMatrix, PriorCscMatrix);
1450         }
1451         else
1452         {
1453             VP_RENDER_ASSERTMESSAGE("Invalid Prior CSC parameter.");
1454             VP_RENDER_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
1455         }
1456 
1457         fTemp1X = fTempX;
1458         fTemp1Y = fTempY;
1459         fTemp1Z = fTempZ;
1460 
1461         if (input && (input->osSurface->Format == Format_AYUV))
1462         {
1463             fTempX = PriorCscMatrix[0] * fTemp1Y + PriorCscMatrix[1] * fTemp1Z + PriorCscMatrix[2] * fTemp1X + PriorCscMatrix[3];
1464             fTempY = PriorCscMatrix[4] * fTemp1Y + PriorCscMatrix[5] * fTemp1Z + PriorCscMatrix[6] * fTemp1X + PriorCscMatrix[7];
1465             fTempZ = PriorCscMatrix[8] * fTemp1Y + PriorCscMatrix[9] * fTemp1Z + PriorCscMatrix[10] * fTemp1X + PriorCscMatrix[11];
1466         }
1467         else
1468         {
1469             fTempX = PriorCscMatrix[0] * fTemp1Z + PriorCscMatrix[1] * fTemp1Y + PriorCscMatrix[2] * fTemp1X + PriorCscMatrix[3];
1470             fTempY = PriorCscMatrix[4] * fTemp1Z + PriorCscMatrix[5] * fTemp1Y + PriorCscMatrix[6] * fTemp1X + PriorCscMatrix[7];
1471             fTempZ = PriorCscMatrix[8] * fTemp1Z + PriorCscMatrix[9] * fTemp1Y + PriorCscMatrix[10] * fTemp1X + PriorCscMatrix[11];
1472         }
1473 
1474         CLAMP_MIN_MAX(fTempX, 0.0f, 1.0f);
1475         CLAMP_MIN_MAX(fTempY, 0.0f, 1.0f);
1476         CLAMP_MIN_MAX(fTempZ, 0.0f, 1.0f);
1477     }
1478 
1479     if (params->StageEnableFlags[iIndex].EOTFEnable)
1480     {
1481         if (params->EOTFGamma[iIndex] == VPHAL_GAMMA_TRADITIONAL_GAMMA)
1482         {
1483             if (fTempX < 0.081)
1484             {
1485                 fTempX = fTempX / 4.5;
1486             }
1487             else
1488             {
1489                 fTempX = (fTempX + 0.099) / 1.099;
1490                 fTempX = pow(fTempX, 1.0 / 0.45);
1491             }
1492 
1493             if (fTempY < 0.081)
1494             {
1495                 fTempY = fTempY / 4.5;
1496             }
1497             else
1498             {
1499                 fTempY = (fTempY + 0.099) / 1.099;
1500                 fTempY = pow(fTempY, 1.0 / 0.45);
1501             }
1502 
1503             if (fTempZ < 0.081)
1504             {
1505                 fTempZ = fTempZ / 4.5;
1506             }
1507             else
1508             {
1509                 fTempZ = (fTempZ + 0.099) / 1.099;
1510                 fTempZ = pow(fTempZ, 1.0 / 0.45);
1511             }
1512         }
1513         else if (params->EOTFGamma[iIndex] == VPHAL_GAMMA_SMPTE_ST2084)
1514         {
1515             fTempX = pow(fTempX, 1.0f / m2);
1516             fTemp  = c2 - c3 * fTempX;
1517             fTempX = fTempX > c1 ? fTempX - c1 : 0;
1518             fTempX = fTempX / fTemp;
1519             fTempX = pow(fTempX, 1.0f / m1);
1520 
1521             fTempY = pow(fTempY, 1.0f / m2);
1522             fTemp  = c2 - c3 * fTempY;
1523             fTempY = fTempY > c1 ? fTempY - c1 : 0;
1524             fTempY = fTempY / fTemp;
1525             fTempY = pow(fTempY, 1.0f / m1);
1526 
1527             fTempZ = pow(fTempZ, 1.0f / m2);
1528             fTemp  = c2 - c3 * fTempZ;
1529             fTempZ = fTempZ > c1 ? fTempZ - c1 : 0;
1530             fTempZ = fTempZ / fTemp;
1531             fTempZ = pow(fTempZ, 1.0f / m1);
1532         }
1533         else if (params->EOTFGamma[iIndex] == VPHAL_GAMMA_BT1886)
1534         {
1535             if (fTempX < -0.0f)
1536             {
1537                 fTempX = 0;
1538             }
1539             else
1540             {
1541                 fTempX = pow(fTempX, 2.4);
1542             }
1543 
1544             if (fTempY < -0.0f)
1545             {
1546                 fTempY = 0;
1547             }
1548             else
1549             {
1550                 fTempY = pow(fTempY, 2.4);
1551             }
1552 
1553             if (fTempZ < -0.0f)
1554             {
1555                 fTempZ = 0;
1556             }
1557             else
1558             {
1559                 fTempZ = pow(fTempZ, 2.4);
1560             }
1561         }
1562         else
1563         {
1564             VP_RENDER_ASSERTMESSAGE("Invalid EOTF setting for tone mapping");
1565             VP_RENDER_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
1566         }
1567 
1568         CLAMP_MIN_MAX(fTempX, 0.0f, 1.0f);
1569         CLAMP_MIN_MAX(fTempY, 0.0f, 1.0f);
1570         CLAMP_MIN_MAX(fTempZ, 0.0f, 1.0f);
1571     }
1572 
1573     if (params->StageEnableFlags[iIndex].CCMEnable)
1574     {
1575         // BT709 to BT2020 CCM
1576         if (params->CCM[iIndex] == VPHAL_HDR_CCM_BT601_BT709_TO_BT2020_MATRIX)
1577         {
1578             SET_MATRIX(0.627404078626f, 0.329282097415f, 0.043313797587f, 0.000000f, 0.069097233123f, 0.919541035593f, 0.011361189924f, 0.000000f, 0.016391587664f, 0.088013255546f, 0.895595009604f, 0.000000f);
1579         }
1580         // BT2020 to BT709 CCM
1581         else if (params->CCM[iIndex] == VPHAL_HDR_CCM_BT2020_TO_BT601_BT709_MATRIX)
1582         {
1583             SET_MATRIX(1.660490254890140f, -0.587638564717282f, -0.072851975229213f, 0.000000f, -0.124550248621850f, 1.132898753013895f, -0.008347895599309f, 0.000000f, -0.018151059958635f, -0.100578696221493f, 1.118729865913540f, 0.000000f);
1584         }
1585         else
1586         {
1587             SET_MATRIX(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
1588         }
1589 
1590         fTemp1X = fTempX;
1591         fTemp1Y = fTempY;
1592         fTemp1Z = fTempZ;
1593 
1594         fTempX = TempMatrix[0] * fTemp1X + TempMatrix[1] * fTemp1Y + TempMatrix[2] * fTemp1Z + TempMatrix[3];
1595         fTempY = TempMatrix[4] * fTemp1X + TempMatrix[5] * fTemp1Y + TempMatrix[6] * fTemp1Z + TempMatrix[7];
1596         fTempZ = TempMatrix[8] * fTemp1X + TempMatrix[9] * fTemp1Y + TempMatrix[10] * fTemp1Z + TempMatrix[11];
1597 
1598         CLAMP_MIN_MAX(fTempX, 0.0f, 1.0f);
1599         CLAMP_MIN_MAX(fTempY, 0.0f, 1.0f);
1600         CLAMP_MIN_MAX(fTempZ, 0.0f, 1.0f);
1601     }
1602 
1603     if (params->StageEnableFlags[iIndex].PWLFEnable)
1604     {
1605         VpHal_HdrToneMapping3dLut(params->HdrMode[iIndex], fTempX, fTempY, fTempZ, &fTempX, &fTempY, &fTempZ);
1606 
1607         CLAMP_MIN_MAX(fTempX, 0.0f, 1.0f);
1608         CLAMP_MIN_MAX(fTempY, 0.0f, 1.0f);
1609         CLAMP_MIN_MAX(fTempZ, 0.0f, 1.0f);
1610     }
1611 
1612     if (params->StageEnableFlags[iIndex].CCMExt1Enable)
1613     {
1614         // BT709 to BT2020 CCM
1615         if (params->CCMExt1[iIndex] == VPHAL_HDR_CCM_BT601_BT709_TO_BT2020_MATRIX)
1616         {
1617             SET_MATRIX(0.627404078626f, 0.329282097415f, 0.043313797587f, 0.000000f, 0.069097233123f, 0.919541035593f, 0.011361189924f, 0.000000f, 0.016391587664f, 0.088013255546f, 0.895595009604f, 0.000000f);
1618         }
1619         // BT2020 to BT709 CCM
1620         else if (params->CCMExt1[iIndex] == VPHAL_HDR_CCM_BT2020_TO_BT601_BT709_MATRIX)
1621         {
1622             SET_MATRIX(1.660490254890140f, -0.587638564717282f, -0.072851975229213f, 0.000000f, -0.124550248621850f, 1.132898753013895f, -0.008347895599309f, 0.000000f, -0.018151059958635f, -0.100578696221493f, 1.118729865913540f, 0.000000f);
1623         }
1624         else if (params->CCMExt1[iIndex] == VPHAL_HDR_CCM_BT2020_TO_MONITOR_MATRIX ||
1625                  params->CCMExt1[iIndex] == VPHAL_HDR_CCM_MONITOR_TO_BT2020_MATRIX ||
1626                  params->CCMExt1[iIndex] == VPHAL_HDR_CCM_MONITOR_TO_BT709_MATRIX)
1627         {
1628             HdrCalculateCCMWithMonitorGamut(params->CCMExt1[iIndex], params->targetHDRParams[0], TempMatrix);
1629         }
1630         else
1631         {
1632             SET_MATRIX(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
1633         }
1634 
1635         fTemp1X = fTempX;
1636         fTemp1Y = fTempY;
1637         fTemp1Z = fTempZ;
1638 
1639         fTempX = TempMatrix[0] * fTemp1X + TempMatrix[1] * fTemp1Y + TempMatrix[2] * fTemp1Z + TempMatrix[3];
1640         fTempY = TempMatrix[4] * fTemp1X + TempMatrix[5] * fTemp1Y + TempMatrix[6] * fTemp1Z + TempMatrix[7];
1641         fTempZ = TempMatrix[8] * fTemp1X + TempMatrix[9] * fTemp1Y + TempMatrix[10] * fTemp1Z + TempMatrix[11];
1642 
1643         CLAMP_MIN_MAX(fTempX, 0.0f, 1.0f);
1644         CLAMP_MIN_MAX(fTempY, 0.0f, 1.0f);
1645         CLAMP_MIN_MAX(fTempZ, 0.0f, 1.0f);
1646     }
1647 
1648     if (params->StageEnableFlags[iIndex].CCMExt2Enable)
1649     {
1650         // BT709 to BT2020 CCM
1651         if (params->CCMExt2[iIndex] == VPHAL_HDR_CCM_BT601_BT709_TO_BT2020_MATRIX)
1652         {
1653             SET_MATRIX(0.627404078626f, 0.329282097415f, 0.043313797587f, 0.000000f, 0.069097233123f, 0.919541035593f, 0.011361189924f, 0.000000f, 0.016391587664f, 0.088013255546f, 0.895595009604f, 0.000000f);
1654         }
1655         // BT2020 to BT709 CCM
1656         else if (params->CCMExt2[iIndex] == VPHAL_HDR_CCM_BT2020_TO_BT601_BT709_MATRIX)
1657         {
1658             SET_MATRIX(1.660490254890140f, -0.587638564717282f, -0.072851975229213f, 0.000000f, -0.124550248621850f, 1.132898753013895f, -0.008347895599309f, 0.000000f, -0.018151059958635f, -0.100578696221493f, 1.118729865913540f, 0.000000f);
1659         }
1660         else if (params->CCMExt2[iIndex] == VPHAL_HDR_CCM_BT2020_TO_MONITOR_MATRIX ||
1661                  params->CCMExt2[iIndex] == VPHAL_HDR_CCM_MONITOR_TO_BT2020_MATRIX ||
1662                  params->CCMExt2[iIndex] == VPHAL_HDR_CCM_MONITOR_TO_BT709_MATRIX)
1663         {
1664             HdrCalculateCCMWithMonitorGamut(params->CCMExt2[iIndex], params->targetHDRParams[0], TempMatrix);
1665         }
1666         else
1667         {
1668             SET_MATRIX(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
1669         }
1670 
1671         fTemp1X = fTempX;
1672         fTemp1Y = fTempY;
1673         fTemp1Z = fTempZ;
1674 
1675         fTempX = TempMatrix[0] * fTemp1X + TempMatrix[1] * fTemp1Y + TempMatrix[2] * fTemp1Z + TempMatrix[3];
1676         fTempY = TempMatrix[4] * fTemp1X + TempMatrix[5] * fTemp1Y + TempMatrix[6] * fTemp1Z + TempMatrix[7];
1677         fTempZ = TempMatrix[8] * fTemp1X + TempMatrix[9] * fTemp1Y + TempMatrix[10] * fTemp1Z + TempMatrix[11];
1678 
1679         CLAMP_MIN_MAX(fTempX, 0.0f, 1.0f);
1680         CLAMP_MIN_MAX(fTempY, 0.0f, 1.0f);
1681         CLAMP_MIN_MAX(fTempZ, 0.0f, 1.0f);
1682     }
1683 
1684     if (params->OETFGamma[iIndex] != VPHAL_GAMMA_NONE)
1685     {
1686         if (params->OETFGamma[iIndex] == VPHAL_GAMMA_TRADITIONAL_GAMMA)
1687         {
1688             if (fTempX < 0.018)
1689             {
1690                 fTempX = 4.5 * fTempX;
1691             }
1692             else
1693             {
1694                 fTempX = pow(fTempX, 0.45);
1695                 fTempX = 1.099 * fTempX - 0.099;
1696             }
1697 
1698             if (fTempY < 0.018)
1699             {
1700                 fTempY = 4.5 * fTempY;
1701             }
1702             else
1703             {
1704                 fTempY = pow(fTempY, 0.45);
1705                 fTempY = 1.099 * fTempY - 0.099;
1706             }
1707 
1708             if (fTempZ < 0.018)
1709             {
1710                 fTempZ = 4.5 * fTempZ;
1711             }
1712             else
1713             {
1714                 fTempZ = pow(fTempZ, 0.45);
1715                 fTempZ = 1.099 * fTempZ - 0.099;
1716             }
1717         }
1718         else if (params->OETFGamma[iIndex] == VPHAL_GAMMA_SMPTE_ST2084)
1719         {
1720             fTempX = pow(fTempX, m1);
1721             fTempX = (c1 + c2 * fTempX) / (1 + c3 * fTempX);
1722             fTempX = pow(fTempX, m2);
1723 
1724             fTempY = pow(fTempY, m1);
1725             fTempY = (c1 + c2 * fTempY) / (1 + c3 * fTempY);
1726             fTempY = pow(fTempY, m2);
1727 
1728             fTempZ = pow(fTempZ, m1);
1729             fTempZ = (c1 + c2 * fTempZ) / (1 + c3 * fTempZ);
1730             fTempZ = pow(fTempZ, m2);
1731         }
1732         else if (params->OETFGamma[iIndex] == VPHAL_GAMMA_SRGB)
1733         {
1734             if (fTempX < 0.0031308f)
1735             {
1736                 fTempX = 12.92 * fTempX;
1737             }
1738             else
1739             {
1740                 fTempX = pow(fTempX, (double)(1.0f / 2.4f));
1741                 fTempX = 1.055 * fTempX - 0.055;
1742             }
1743 
1744             if (fTempY < 0.0031308f)
1745             {
1746                 fTempY = 12.92 * fTempY;
1747             }
1748             else
1749             {
1750                 fTempY = pow(fTempY, (double)(1.0f / 2.4f));
1751                 fTempY = 1.055 * fTempY - 0.055;
1752             }
1753 
1754             if (fTempZ < 0.0031308f)
1755             {
1756                 fTempZ = 12.92 * fTempZ;
1757             }
1758             else
1759             {
1760                 fTempZ = pow(fTempZ, (double)(1.0f / 2.4f));
1761                 fTempZ = 1.055 * fTempZ - 0.055;
1762             }
1763         }
1764         else
1765         {
1766             VP_RENDER_ASSERTMESSAGE("Invalid EOTF setting for tone mapping");
1767             VP_RENDER_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
1768         }
1769 
1770         CLAMP_MIN_MAX(fTempX, 0.0f, 1.0f);
1771         CLAMP_MIN_MAX(fTempY, 0.0f, 1.0f);
1772         CLAMP_MIN_MAX(fTempZ, 0.0f, 1.0f);
1773     }
1774 
1775     // OETF will output RGB surface
1776     // So if post CSC is needed, it will always be RGB to YUV conversion
1777     if (params->PostCSC[iIndex] != VPHAL_HDR_CSC_NONE)
1778     {
1779         if (params->PostCSC[iIndex] == VPHAL_HDR_CSC_RGB_TO_YUV_BT601)
1780         {
1781             SET_MATRIX(-0.331264f, -0.168736f, 0.500000f, 0.000000f, 0.587000f, 0.299000f, 0.114000f, 0.000000f, -0.418688f, 0.500000f, -0.081312f, 0.000000f);
1782 
1783             SET_MATRIX(0.500000f, -0.418688f, -0.081312f, 0.000000f, 0.299000f, 0.587000f, 0.114000f, 0.000000f, -0.168736f, -0.331264f, 0.500000f, 0.000000f);
1784 
1785             VpHal_HdrCalcRgbToYuvMatrix(CSpace_sRGB, CSpace_BT601, TempMatrix, PostCscMatrix);
1786         }
1787         else if (params->PostCSC[iIndex] == VPHAL_HDR_CSC_RGB_TO_YUV_BT709)
1788         {
1789             SET_MATRIX(-0.385428f, -0.114572f, 0.500000f, 0.000000f, 0.715200f, 0.212600f, 0.072200f, 0.000000f, -0.454153f, 0.500000f, -0.045847f, 0.000000f);
1790 
1791             SET_MATRIX(0.500000f, -0.454153f, -0.045847f, 0.000000f, 0.212600f, 0.715200f, 0.072200f, 0.000000f, -0.114572f, -0.385428f, 0.500000f, 0.000000f);
1792 
1793             VpHal_HdrCalcRgbToYuvMatrix(CSpace_sRGB, CSpace_BT709, TempMatrix, PostCscMatrix);
1794         }
1795         else if (params->PostCSC[iIndex] == VPHAL_HDR_CSC_RGB_TO_YUV_BT2020)
1796         {
1797             SET_MATRIX(-0.360370f, -0.139630f, 0.500000f, 0.000000f, 0.678000f, 0.262700f, 0.059300f, 0.000000f, -0.459786f, 0.500000f, -0.040214f, 0.000000f);
1798 
1799             SET_MATRIX(0.500000f, -0.459786f, -0.040214f, 0.000000f, 0.262700f, 0.678000f, 0.059300f, 0.000000f, -0.139630f, -0.360370f, 0.500000f, 0.000000f);
1800 
1801             VpHal_HdrCalcRgbToYuvMatrix(CSpace_sRGB, CSpace_BT2020, TempMatrix, PostCscMatrix);
1802         }
1803         else
1804         {
1805             VP_RENDER_ASSERTMESSAGE("Color Space Not found.");
1806             VP_RENDER_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
1807         }
1808 
1809         fTemp1X = fTempX;
1810         fTemp1Y = fTempY;
1811         fTemp1Z = fTempZ;
1812 
1813         fTempX = PostCscMatrix[0] * fTemp1X + PostCscMatrix[1] * fTemp1Y + PostCscMatrix[2] * fTemp1Z + PostCscMatrix[3];
1814         fTempY = PostCscMatrix[4] * fTemp1X + PostCscMatrix[5] * fTemp1Y + PostCscMatrix[6] * fTemp1Z + PostCscMatrix[7];
1815         fTempZ = PostCscMatrix[8] * fTemp1X + PostCscMatrix[9] * fTemp1Y + PostCscMatrix[10] * fTemp1Z + PostCscMatrix[11];
1816 
1817         CLAMP_MIN_MAX(fTempX, 0.0f, 1.0f);
1818         CLAMP_MIN_MAX(fTempY, 0.0f, 1.0f);
1819         CLAMP_MIN_MAX(fTempZ, 0.0f, 1.0f);
1820     }
1821 
1822 #undef SET_MATRIX
1823 #undef CLAMP_MIN_MAX
1824 
1825     if (params->bGpuGenerate3DLUT)
1826     {
1827         params->f3DLUTNormalizationFactor = 1023.0f;
1828     }
1829     else
1830     {
1831         params->f3DLUTNormalizationFactor = 65535.0f;
1832     }
1833 
1834     // Convert and round up the [0, 1] float color value to 16 bit integer value
1835     *puOutputX = (uint16_t)(fTempX * params->f3DLUTNormalizationFactor + 0.5f);
1836     *puOutputY = (uint16_t)(fTempY * params->f3DLUTNormalizationFactor + 0.5f);
1837     *puOutputZ = (uint16_t)(fTempZ * params->f3DLUTNormalizationFactor + 0.5f);
1838 
1839     return MOS_STATUS_SUCCESS;
1840 }
1841 
1842 //!
1843 //! \brief    Color Transfer for Hdr 3d Lut
1844 //! \details  Color Transfer for Hdr 3d Lut
1845 //! \param    VPHAL_HDR_MODE HdrMode
1846 //!           [in] Hdr mode
1847 //! \param    double fInputX
1848 //!           [in] Input color for Tone Mapping
1849 //! \param    double fInputY
1850 //!           [in] Input color for Tone Mapping
1851 //! \param    double fInputZ
1852 //!           [in] Input color for Tone Mapping
1853 //! \param    double * pfOutputX
1854 //!           [in/out] Output color for Tone Mapping
1855 //! \param    double * pfOutputY
1856 //!           [in/out] Output color for Tone Mapping
1857 //! \param    double * pfOutputZ
1858 //!           [in/out] Output color for Tone Mapping
1859 //! \return   MOS_STATUS
1860 //!
VpHal_HdrToneMapping3dLut(VPHAL_HDR_MODE HdrMode,double fInputX,double fInputY,double fInputZ,double * pfOutputX,double * pfOutputY,double * pfOutputZ)1861 MOS_STATUS VpRenderHdrKernel::VpHal_HdrToneMapping3dLut(
1862     VPHAL_HDR_MODE HdrMode,
1863     double         fInputX,
1864     double         fInputY,
1865     double         fInputZ,
1866     double        *pfOutputX,
1867     double        *pfOutputY,
1868     double        *pfOutputZ)
1869 {
1870     VP_FUNC_CALL();
1871 
1872     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
1873     double     fPivot[5] = {};
1874     double     fSlope[6] = {};
1875     double     fIntercept[6] = {};
1876 
1877     VP_PUBLIC_CHK_NULL_RETURN(pfOutputX);
1878     VP_PUBLIC_CHK_NULL_RETURN(pfOutputX);
1879     VP_PUBLIC_CHK_NULL_RETURN(pfOutputX);
1880 
1881 #define TONE_MAPPING(Input, Output)                     \
1882     {                                                   \
1883         if (Input < fPivot[0])                          \
1884         {                                               \
1885             Output = Input * fSlope[0] + fIntercept[0]; \
1886         }                                               \
1887         else if (Input < fPivot[1])                     \
1888         {                                               \
1889             Output = Input * fSlope[1] + fIntercept[1]; \
1890         }                                               \
1891         else if (Input < fPivot[2])                     \
1892         {                                               \
1893             Output = Input * fSlope[2] + fIntercept[2]; \
1894         }                                               \
1895         else if (Input < fPivot[3])                     \
1896         {                                               \
1897             Output = Input * fSlope[3] + fIntercept[3]; \
1898         }                                               \
1899         else if (Input < fPivot[4])                     \
1900         {                                               \
1901             Output = Input * fSlope[4] + fIntercept[4]; \
1902         }                                               \
1903         else                                            \
1904         {                                               \
1905             Output = Input * fSlope[5] + fIntercept[5]; \
1906         }                                               \
1907         if (Output > 1.0f)                              \
1908         {                                               \
1909             Output = 1.0f;                              \
1910         }                                               \
1911     }
1912 
1913     if (HdrMode == VPHAL_HDR_MODE_TONE_MAPPING || HdrMode == VPHAL_HDR_MODE_TONE_MAPPING_AUTO_MODE)
1914     {
1915         // TODO: add auto mode support, i.e. read back the coeffs from audo mode output surface.
1916         fPivot[0]     = VPHAL_HDR_TONE_MAPPING_PIVOT_POINT_X1;
1917         fPivot[1]     = VPHAL_HDR_TONE_MAPPING_PIVOT_POINT_X2;
1918         fPivot[2]     = VPHAL_HDR_TONE_MAPPING_PIVOT_POINT_X3;
1919         fPivot[3]     = VPHAL_HDR_TONE_MAPPING_PIVOT_POINT_X4;
1920         fPivot[4]     = VPHAL_HDR_TONE_MAPPING_PIVOT_POINT_X5;
1921         fSlope[0]     = VPHAL_HDR_TONE_MAPPING_SLOPE0;
1922         fSlope[1]     = VPHAL_HDR_TONE_MAPPING_SLOPE1;
1923         fSlope[2]     = VPHAL_HDR_TONE_MAPPING_SLOPE2;
1924         fSlope[3]     = VPHAL_HDR_TONE_MAPPING_SLOPE3;
1925         fSlope[4]     = VPHAL_HDR_TONE_MAPPING_SLOPE4;
1926         fSlope[5]     = VPHAL_HDR_TONE_MAPPING_SLOPE5;
1927         fIntercept[0] = VPHAL_HDR_TONE_MAPPING_INTERCEPT0;
1928         fIntercept[1] = VPHAL_HDR_TONE_MAPPING_INTERCEPT1;
1929         fIntercept[2] = VPHAL_HDR_TONE_MAPPING_INTERCEPT2;
1930         fIntercept[3] = VPHAL_HDR_TONE_MAPPING_INTERCEPT3;
1931         fIntercept[4] = VPHAL_HDR_TONE_MAPPING_INTERCEPT4;
1932         fIntercept[5] = VPHAL_HDR_TONE_MAPPING_INTERCEPT5;
1933 
1934         TONE_MAPPING(fInputX, *pfOutputX);
1935         TONE_MAPPING(fInputY, *pfOutputY);
1936         TONE_MAPPING(fInputZ, *pfOutputZ);
1937     }
1938     else if (HdrMode == VPHAL_HDR_MODE_INVERSE_TONE_MAPPING)
1939     {
1940         // For inverse tone mapping in 3D LUT
1941         // PWLF function should not be applied
1942         // A simple / 100 devision should be performed
1943         *pfOutputX = fInputX / 100.0f;
1944         *pfOutputY = fInputY / 100.0f;
1945         *pfOutputZ = fInputZ / 100.0f;
1946     }
1947     else if (HdrMode == VPHAL_HDR_MODE_H2H)
1948     {
1949         // TODO: port the H2H mapping algorithm
1950         *pfOutputX = fInputX;
1951         *pfOutputY = fInputY;
1952         *pfOutputZ = fInputZ;
1953     }
1954 
1955 #undef TONE_MAPPING
1956 
1957     return eStatus;
1958 }
1959 
1960 
1961 //!
1962 //! \brief    Initiate EOTF Surface for HDR
1963 //! \details  Initiate EOTF Surface for HDR
1964 //! \param    PVPHAL_HDR_STATE paramse
1965 //!           [in] Pointer to HDR state
1966 //! \param    int32_t iIndex
1967 //!           [in] input surface index
1968 //! \param    PVPHAL_SURFACE pOETF1DLUTSurface
1969 //!           [in] Pointer to OETF 1D LUT Surface
1970 //! \return   MOS_STATUS
1971 //!
InitOETF1DLUT(PRENDER_HDR_PARAMS params,int32_t iIndex,VP_SURFACE * pOETF1DLUTSurface)1972 MOS_STATUS VpRenderHdrKernel::InitOETF1DLUT(
1973     PRENDER_HDR_PARAMS params,
1974     int32_t            iIndex,
1975     VP_SURFACE         *pOETF1DLUTSurface)
1976 {
1977     VP_FUNC_CALL();
1978 
1979     MOS_STATUS      eStatus     = MOS_STATUS_SUCCESS;
1980     uint32_t        i           = 0;
1981     uint16_t       *pSrcOetfLut = nullptr;
1982     uint8_t        *pDstOetfLut = nullptr;
1983     MOS_LOCK_PARAMS LockFlags   = {};
1984 
1985     VP_PUBLIC_CHK_NULL_RETURN(pOETF1DLUTSurface);
1986     VP_PUBLIC_CHK_NULL_RETURN(pOETF1DLUTSurface->osSurface);
1987 
1988     MOS_ZeroMemory(&LockFlags, sizeof(MOS_LOCK_PARAMS));
1989 
1990     LockFlags.WriteOnly = 1;
1991 
1992     // Lock the surface for writing
1993     pDstOetfLut = (uint8_t *)m_allocator->Lock(
1994         &(pOETF1DLUTSurface->osSurface->OsResource),
1995         &LockFlags);
1996 
1997     VP_PUBLIC_CHK_NULL_RETURN(pDstOetfLut);
1998 
1999     // Hdr kernel require 0 to 1 floating point color value
2000     // To transfer the value of 16bit integer OETF table to 0 to 1 floating point
2001     // We need to divide the table with 2^16 - 1
2002     if ((params->targetHDRParams[0].EOTF == VPHAL_HDR_EOTF_TRADITIONAL_GAMMA_SDR ||
2003             params->targetHDRParams[0].EOTF == VPHAL_HDR_EOTF_TRADITIONAL_GAMMA_HDR))
2004     {
2005         if (params->OETFGamma[iIndex] == VPHAL_GAMMA_SRGB)
2006         {
2007             pSrcOetfLut = (uint16_t *)g_Hdr_ColorCorrect_OETF_sRGB_FP16;
2008         }
2009         else
2010         {
2011             pSrcOetfLut = (uint16_t *)g_Hdr_ColorCorrect_OETF_BT709_FP16;
2012         }
2013 
2014         for (i = 0;
2015              i < pOETF1DLUTSurface->osSurface->dwHeight;
2016              i++, pDstOetfLut += pOETF1DLUTSurface->osSurface->dwPitch, pSrcOetfLut += pOETF1DLUTSurface->osSurface->dwWidth)
2017         {
2018             MOS_SecureMemcpy(pDstOetfLut, sizeof(uint16_t) * pOETF1DLUTSurface->osSurface->dwWidth, pSrcOetfLut, sizeof(uint16_t) * pOETF1DLUTSurface->osSurface->dwWidth);
2019         }
2020     }
2021     else if (params->targetHDRParams[0].EOTF == VPHAL_HDR_EOTF_SMPTE_ST2084)
2022     {
2023         if (params->HdrMode[iIndex] == VPHAL_HDR_MODE_INVERSE_TONE_MAPPING)
2024         {
2025             const float fStretchFactor = 0.01f;
2026             HdrGenerate2SegmentsOETFLUT(fStretchFactor, HdrOETF2084, params->OetfSmpteSt2084);
2027             pSrcOetfLut = params->OetfSmpteSt2084;
2028         }
2029         else  // params->HdrMode[iIndex] == VPHAL_HDR_MODE_H2H
2030         {
2031             pSrcOetfLut = (uint16_t *)g_Hdr_ColorCorrect_OETF_SMPTE_ST2084_3Segs_FP16;
2032         }
2033 
2034         for (i = 0;
2035              i < pOETF1DLUTSurface->osSurface->dwHeight;
2036              i++, pDstOetfLut += pOETF1DLUTSurface->osSurface->dwPitch, pSrcOetfLut += pOETF1DLUTSurface->osSurface->dwWidth)
2037         {
2038             MOS_SecureMemcpy(pDstOetfLut, sizeof(uint16_t) * pOETF1DLUTSurface->osSurface->dwWidth, pSrcOetfLut, sizeof(uint16_t) * pOETF1DLUTSurface->osSurface->dwWidth);
2039         }
2040     }
2041     else
2042     {
2043         VP_RENDER_ASSERTMESSAGE("Invalid EOTF setting for tone mapping");
2044         return MOS_STATUS_INVALID_PARAMETER;
2045     }
2046 
2047     VP_PUBLIC_CHK_STATUS_RETURN(m_allocator->UnLock(&pOETF1DLUTSurface->osSurface->OsResource));
2048 
2049     eStatus = MOS_STATUS_SUCCESS;
2050 
2051     return eStatus;
2052 }
2053 
2054 //!
2055 //! \brief    Initiate Cri 3D Lut Surface for HDR
2056 //! \details  Initiate Cri 3D Lut Surface for HDR
2057 //! \param    PVPHAL_HDR_STATE pHdrStatee
2058 //!           [in] Pointer to HDR state
2059 //! \param    int32_t iIndex
2060 //!           [in] input surface index
2061 //! \param    PVPHAL_SURFACE pCRI3DLUTSurface
2062 //!           [in/out] Pointer to Cri 3D Lut Surface
2063 //! \return   MOS_STATUS
2064 //!
InitCri3DLUT(PRENDER_HDR_PARAMS params,int32_t iIndex,VP_SURFACE * pCRI3DLUTSurface)2065 MOS_STATUS VpRenderHdrKernel::InitCri3DLUT(
2066     PRENDER_HDR_PARAMS params,
2067     int32_t          iIndex,
2068     VP_SURFACE       *pCRI3DLUTSurface)
2069 {
2070     VP_FUNC_CALL();
2071 
2072     MOS_STATUS      eStatus = MOS_STATUS_SUCCESS;
2073     uint32_t        i = 0, j = 0, k = 0;
2074     uint16_t        u3dLutOutputX = 0, u3dLutOutputY = 0, u3dLutOutputZ = 0;
2075     uint16_t       *pwDst3dLut = nullptr;
2076     uint32_t       *puiDst3dLut = nullptr;
2077     uint8_t        *pByte = nullptr;
2078     MOS_LOCK_PARAMS LockFlags     = {};
2079     uint8_t         bBytePerPixel = 0;
2080 
2081     VP_PUBLIC_CHK_NULL_RETURN(pCRI3DLUTSurface);
2082     VP_PUBLIC_CHK_NULL_RETURN(pCRI3DLUTSurface->osSurface);
2083 
2084     MOS_ZeroMemory(&LockFlags, sizeof(MOS_LOCK_PARAMS));
2085 
2086     LockFlags.WriteOnly = 1;
2087 
2088     // Lock the surface for writing
2089     pByte = (uint8_t *)m_allocator->Lock(
2090         &(pCRI3DLUTSurface->osSurface->OsResource),
2091         &LockFlags);
2092 
2093     VP_PUBLIC_CHK_NULL_RETURN(pByte);
2094 
2095     if (pCRI3DLUTSurface->osSurface->Format == Format_A16B16G16R16)
2096     {
2097         bBytePerPixel = 8;
2098 
2099         for (i = 0; i < params->Cri3DLUTSize; i++)
2100         {
2101             for (j = 0; j < params->Cri3DLUTSize; j++)
2102             {
2103                 for (k = 0; k < params->Cri3DLUTSize; k++)
2104                 {
2105                     pwDst3dLut = (uint16_t *)(pByte +
2106                                               i * params->Cri3DLUTSize * pCRI3DLUTSurface->osSurface->dwPitch +
2107                                               j * pCRI3DLUTSurface->osSurface->dwPitch +
2108                                               k * bBytePerPixel);
2109 
2110                     u3dLutOutputX = u3dLutOutputY = u3dLutOutputZ = 0;
2111 
2112                     VpHal_HdrColorTransfer3dLut(params,
2113                         iIndex,
2114                         (float)k / (float)(params->Cri3DLUTSize - 1),
2115                         (float)j / (float)(params->Cri3DLUTSize - 1),
2116                         (float)i / (float)(params->Cri3DLUTSize - 1),
2117                         &u3dLutOutputX,
2118                         &u3dLutOutputY,
2119                         &u3dLutOutputZ);
2120 
2121                     *pwDst3dLut++ = u3dLutOutputX;
2122                     *pwDst3dLut++ = u3dLutOutputY;
2123                     *pwDst3dLut++ = u3dLutOutputZ;
2124                 }
2125             }
2126         }
2127 
2128         eStatus = MOS_STATUS_SUCCESS;
2129     }
2130     else if (pCRI3DLUTSurface->osSurface->Format == Format_R10G10B10A2)
2131     {
2132         bBytePerPixel = 4;
2133 
2134         for (i = 0; i < params->Cri3DLUTSize; i++)
2135         {
2136             for (j = 0; j < params->Cri3DLUTSize; j++)
2137             {
2138                 for (k = 0; k < params->Cri3DLUTSize; k++)
2139                 {
2140                     puiDst3dLut = (uint32_t *)(pByte +
2141                                                i * params->Cri3DLUTSize * pCRI3DLUTSurface->osSurface->dwPitch +
2142                                                j * pCRI3DLUTSurface->osSurface->dwPitch +
2143                                                k * bBytePerPixel);
2144 
2145                     u3dLutOutputX = u3dLutOutputY = u3dLutOutputZ = 0;
2146 
2147                     VpHal_HdrColorTransfer3dLut(params,
2148                         iIndex,
2149                         (float)k / (float)(params->Cri3DLUTSize - 1),
2150                         (float)j / (float)(params->Cri3DLUTSize - 1),
2151                         (float)i / (float)(params->Cri3DLUTSize - 1),
2152                         &u3dLutOutputX,
2153                         &u3dLutOutputY,
2154                         &u3dLutOutputZ);
2155 
2156                     *puiDst3dLut = (uint32_t)u3dLutOutputX +
2157                                    ((uint32_t)u3dLutOutputY << 10) +
2158                                    ((uint32_t)u3dLutOutputZ << 20);
2159                 }
2160             }
2161         }
2162 
2163         eStatus = MOS_STATUS_SUCCESS;
2164     }
2165     else
2166     {
2167         VP_RENDER_ASSERTMESSAGE("Unexpected HDR 3DLUT format.");
2168         eStatus = MOS_STATUS_INVALID_PARAMETER;
2169     }
2170 
2171     VP_PUBLIC_CHK_STATUS_RETURN(m_allocator->UnLock(&pCRI3DLUTSurface->osSurface->OsResource));
2172 
2173     return eStatus;
2174 }
2175 
2176 //!
2177 //! \brief    Calculate H2H PWLF Coefficients
2178 //! \details  Calculate H2H PWLF Coefficients
2179 //! \param    PVPHAL_HDR_PARAMS pSource
2180 //!           [in] Pointer to source surface HDR params
2181 //! \param    PVPHAL_HDR_PARAMS pTarget
2182 //!           [in] Pointer to target surface HDR params
2183 //! \param    FLOAT* pTarget
2184 //!           [in] Pointer to target surface
2185 //! \param    float* pPivotPoint
2186 //!           [out] Pointer to output pivot positions.
2187 //! \param    uint16_t* pSlopeIntercept
2188 //!           [out] Pointer to output slope and intercepts.
2189 //! \param    PMOS_INTERFACE pOsInterface
2190 //!           [in] Pointer to MOS interface for HDR key report.
2191 //! \return   void
2192 //!
CalculateH2HPWLFCoefficients(HDR_PARAMS * pSource,HDR_PARAMS * pTarget,float * pPivotPoint,uint16_t * pSlopeIntercept,PMOS_INTERFACE pOsInterface)2193 void VpRenderHdrKernel::CalculateH2HPWLFCoefficients(
2194     HDR_PARAMS    *pSource,
2195     HDR_PARAMS    *pTarget,
2196     float         *pPivotPoint,
2197     uint16_t      *pSlopeIntercept,
2198     PMOS_INTERFACE pOsInterface)
2199 {
2200     VP_FUNC_CALL();
2201 
2202     float pivot0_x;
2203     float pivot1_x;
2204     float pivot2_x;
2205     float pivot3_x;
2206     float pivot4_x;
2207     float pivot5_x;
2208 
2209     float pivot0_y;
2210     float pivot1_y;
2211     float pivot2_y;
2212     float pivot3_y;
2213     float pivot4_y;
2214     float pivot5_y;
2215 
2216     float sf1;
2217     float sf2;
2218     float sf3;
2219     float sf4;
2220     float sf5;
2221 
2222     float in1f;
2223     float in2f;
2224     float in3f;
2225     float in4f;
2226     float in5f;
2227 
2228     const float minLumDisp = pTarget->min_display_mastering_luminance / 10000.0f / 10000.0f;
2229     const float maxLumDisp = pTarget->max_display_mastering_luminance / 10000.0f;
2230     const bool  align33Lut = true;
2231     const int   lutEntries = 32;
2232     const float lutStep    = 1.0f / lutEntries;
2233     const float split      = 0.7f;
2234 
2235     pivot0_x = 0.0f;
2236     pivot1_x = 0.0313f;
2237     pivot5_x = pSource->MaxCLL / 10000.0f;
2238 
2239     //pivot0_y = minLumDisp;
2240     pivot0_y = 0.0f;  // Force Y0 to zero to workaround a green bar issue.
2241     pivot1_y = 0.0313f;
2242     pivot5_y = maxLumDisp;
2243 
2244     if (pTarget->max_display_mastering_luminance >= pSource->MaxCLL)
2245     {
2246         pivot2_x = pivot3_x = pivot4_x = pivot5_x = pivot2_y = pivot3_y = pivot4_y = maxLumDisp;
2247     }
2248     else
2249     {
2250         if (align33Lut)
2251         {
2252             pivot5_x = ceil(pivot5_x / lutStep) * lutStep;
2253         }
2254 
2255         pivot2_x = pivot1_x + (pivot5_x - pivot1_x) / 5.0f;
2256         pivot3_x = pivot1_x + (pivot5_x - pivot1_x) * 2.0f / 5.0f;
2257         pivot4_x = pivot1_x + (pivot5_x - pivot1_x) * 3.0f / 5.0f;
2258 
2259         if (align33Lut)
2260         {
2261             pivot2_x = floor(pivot2_x / lutStep) * lutStep;
2262             pivot3_x = floor(pivot3_x / lutStep) * lutStep;
2263             pivot4_x = floor(pivot4_x / lutStep) * lutStep;
2264         }
2265 
2266         pivot4_y = pivot5_y * 0.95f;
2267         if (pivot4_y > pivot4_x)
2268         {
2269             pivot4_y = pivot4_x;
2270         }
2271 
2272         pivot2_y = pivot1_y + (pivot4_y - pivot1_y) * split;
2273         if (pivot2_y > pivot2_x)
2274         {
2275             pivot2_y = pivot2_x;
2276         }
2277 
2278         pivot3_y = pivot2_y + (pivot4_y - pivot2_y) * split;
2279         if (pivot3_y > pivot3_x)
2280         {
2281             pivot3_y = pivot3_x;
2282         }
2283     }
2284 
2285 
2286     // Calculate Gradient and Intercepts
2287     sf1      = (pivot1_x - pivot0_x) > 0.0f ? (float)(pivot1_y - pivot0_y) / (pivot1_x - pivot0_x) : 0.0f;
2288     pivot1_y = sf1 * (pivot1_x - pivot0_x) + pivot0_y;
2289 
2290     sf2      = (pivot2_x - pivot1_x) > 0.0f ? (float)(pivot2_y - pivot1_y) / (pivot2_x - pivot1_x) : 0.0f;
2291     pivot2_y = sf2 * (pivot2_x - pivot1_x) + pivot1_y;
2292 
2293     sf3      = (pivot3_x - pivot2_x) > 0.0f ? (float)(pivot3_y - pivot2_y) / (pivot3_x - pivot2_x) : 0.0f;
2294     pivot3_y = sf3 * (pivot3_x - pivot2_x) + pivot2_y;
2295 
2296     sf4      = (pivot4_x - pivot3_x) > 0.0f ? (float)(pivot4_y - pivot3_y) / (pivot4_x - pivot3_x) : 0.0f;
2297     pivot4_y = sf4 * (pivot4_x - pivot3_x) + pivot3_y;
2298 
2299     sf5      = (pivot5_x - pivot4_x) > 0.0f ? (float)(pivot5_y - pivot4_y) / (pivot5_x - pivot4_x) : 0.0f;
2300     pivot5_y = sf5 * (pivot5_x - pivot4_x) + pivot4_y;
2301 
2302     // Calculating Intercepts
2303     in1f = pivot0_y;
2304     in2f = pivot1_y - (sf2 * pivot1_x);
2305     in3f = pivot2_y - (sf3 * pivot2_x);
2306     in4f = pivot3_y - (sf4 * pivot3_x);
2307     in5f = pivot4_y - (sf5 * pivot4_x);
2308 
2309     pPivotPoint[0] = pivot1_x;
2310     pPivotPoint[1] = pivot2_x;
2311     pPivotPoint[2] = pivot3_x;
2312     pPivotPoint[3] = pivot4_x;
2313     pPivotPoint[4] = pivot5_x;
2314 
2315     pSlopeIntercept[0]  = VpHal_FloatToHalfFloat(sf1);
2316     pSlopeIntercept[1]  = VpHal_FloatToHalfFloat(in1f);
2317     pSlopeIntercept[2]  = VpHal_FloatToHalfFloat(sf2);
2318     pSlopeIntercept[3]  = VpHal_FloatToHalfFloat(in2f);
2319     pSlopeIntercept[4]  = VpHal_FloatToHalfFloat(sf3);
2320     pSlopeIntercept[5]  = VpHal_FloatToHalfFloat(in3f);
2321     pSlopeIntercept[6]  = VpHal_FloatToHalfFloat(sf4);
2322     pSlopeIntercept[7]  = VpHal_FloatToHalfFloat(in4f);
2323     pSlopeIntercept[8]  = VpHal_FloatToHalfFloat(sf5);
2324     pSlopeIntercept[9]  = VpHal_FloatToHalfFloat(in5f);
2325     pSlopeIntercept[10] = VpHal_FloatToHalfFloat(0.0f);  // Saturation
2326     pSlopeIntercept[11] = VpHal_FloatToHalfFloat(pivot5_y);
2327 }
2328 //!
2329 
2330 //!
2331 //! \brief    Initiate EOTF Surface for HDR
2332 //! \details  Initiate EOTF Surface for HDR
2333 //! \param    PVPHAL_HDR_STATE pHdrStatee
2334 //!           [in] Pointer to HDR state
2335 //! \param    PVPHAL_SURFACE pCoeffSurface
2336 //!           [in] Pointer to CSC/CCM Surface
2337 //! \return   MOS_STATUS
2338 //!
HdrInitCoeff(PRENDER_HDR_PARAMS params,VP_SURFACE * pCoeffSurface)2339 MOS_STATUS VpRenderHdrKernel::HdrInitCoeff(
2340     PRENDER_HDR_PARAMS         params,
2341     VP_SURFACE                *pCoeffSurface)
2342 {
2343     VP_FUNC_CALL();
2344 
2345     MOS_STATUS      eStatus            = MOS_STATUS_SUCCESS;
2346     MOS_INTERFACE  *pOsInterface       = nullptr;
2347     uint32_t        i                  = 0;
2348     float          *pFloat             = nullptr;
2349     float          *pCoeff             = nullptr;
2350     uint32_t       *pEOTFType          = nullptr;
2351     float          *pEOTFCoeff         = nullptr;
2352     float          *pPivotPoint        = nullptr;
2353     uint32_t       *pTMType            = nullptr;
2354     float          *pFP16Normalizer    = nullptr;
2355     uint32_t       *pOETFNeqType       = nullptr;
2356     uint32_t       *pCCMEnable         = nullptr;
2357     float          *pPWLFStretch       = nullptr;
2358     float          *pCoeffR            = nullptr;
2359     float          *pCoeffG            = nullptr;
2360     float          *pCoeffB            = nullptr;
2361     uint16_t       *pSlopeIntercept    = nullptr;
2362     MOS_LOCK_PARAMS LockFlags          = {};
2363     float           PriorCscMatrix[12] = {};
2364     float           PostCscMatrix[12]  = {};
2365     float           CcmMatrix[12]      = {};
2366     float           TempMatrix[12]     = {};
2367     uint8_t        *pByte              = nullptr;
2368 
2369     MediaUserSettingSharedPtr userSettingPtr = nullptr;
2370     uint32_t                  coeffR = 0, coeffG = 0, coeffB = 0;
2371     uint32_t                  pivot0x = 0, pivot1x = 0, pivot2x = 0, pivot3x = 0, pivot4x = 0, pivot5x = 0;
2372     uint32_t                  pivot0y = 0, pivot1y = 0, pivot2y = 0, pivot3y = 0, pivot4y = 0, pivot5y = 0;
2373 
2374     VP_PUBLIC_CHK_NULL_RETURN(params);
2375     VP_PUBLIC_CHK_NULL_RETURN(pCoeffSurface);
2376     VP_PUBLIC_CHK_NULL_RETURN(pCoeffSurface->osSurface);
2377 
2378     eStatus = MOS_STATUS_SUCCESS;
2379     pOsInterface = m_hwInterface->m_osInterface;
2380     VP_PUBLIC_CHK_NULL_RETURN(pOsInterface);
2381 
2382     MOS_ZeroMemory(&LockFlags, sizeof(MOS_LOCK_PARAMS));
2383 
2384     LockFlags.WriteOnly = 1;
2385 
2386     pFloat = (float *)m_allocator->Lock(
2387         &pCoeffSurface->osSurface->OsResource,
2388         &LockFlags);
2389     VP_PUBLIC_CHK_NULL_RETURN(pFloat);
2390 
2391 #define SET_MATRIX(_c0, _c1, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c10, _c11) \
2392     {                                                                            \
2393         TempMatrix[0]  = _c0;                                                    \
2394         TempMatrix[1]  = _c1;                                                    \
2395         TempMatrix[2]  = _c2;                                                    \
2396         TempMatrix[3]  = _c3;                                                    \
2397         TempMatrix[4]  = _c4;                                                    \
2398         TempMatrix[5]  = _c5;                                                    \
2399         TempMatrix[6]  = _c6;                                                    \
2400         TempMatrix[7]  = _c7;                                                    \
2401         TempMatrix[8]  = _c8;                                                    \
2402         TempMatrix[9]  = _c9;                                                    \
2403         TempMatrix[10] = _c10;                                                   \
2404         TempMatrix[11] = _c11;                                                   \
2405     }
2406 
2407 #define SET_EOTF_COEFF(_c1, _c2, _c3, _c4, _c5)                          \
2408     {                                                                    \
2409         *pEOTFCoeff = _c1;                                               \
2410         pEOTFCoeff += pCoeffSurface->osSurface->dwPitch / sizeof(float); \
2411         *pEOTFCoeff = _c2;                                               \
2412         pEOTFCoeff += pCoeffSurface->osSurface->dwPitch / sizeof(float); \
2413         *pEOTFCoeff = _c3;                                               \
2414         pEOTFCoeff += pCoeffSurface->osSurface->dwPitch / sizeof(float); \
2415         *pEOTFCoeff = _c4;                                               \
2416         pEOTFCoeff += pCoeffSurface->osSurface->dwPitch / sizeof(float); \
2417         *pEOTFCoeff = _c5;                                               \
2418     }
2419 
2420 #define WRITE_MATRIX(Matrix)                                             \
2421     {                                                                    \
2422         *pCoeff++ = Matrix[0];                                           \
2423         *pCoeff++ = Matrix[1];                                           \
2424         *pCoeff++ = Matrix[2];                                           \
2425         *pCoeff++ = Matrix[3];                                           \
2426         *pCoeff++ = Matrix[4];                                           \
2427         *pCoeff++ = Matrix[5];                                           \
2428         pCoeff += pCoeffSurface->osSurface->dwPitch / sizeof(float) - 6; \
2429         *pCoeff++ = Matrix[6];                                           \
2430         *pCoeff++ = Matrix[7];                                           \
2431         *pCoeff++ = Matrix[8];                                           \
2432         *pCoeff++ = Matrix[9];                                           \
2433         *pCoeff++ = Matrix[10];                                          \
2434         *pCoeff++ = Matrix[11];                                          \
2435         pCoeff += pCoeffSurface->osSurface->dwPitch / sizeof(float) - 6; \
2436     }
2437 
2438     for (i = 0; i < VPHAL_MAX_HDR_INPUT_LAYER; i++, pFloat += VPHAL_HDR_COEF_LINES_PER_LAYER_BASIC * pCoeffSurface->osSurface->dwPitch / (sizeof(float)))
2439     {
2440         if (params->InputSrc[i] == false)
2441         {
2442             continue;
2443         }
2444 
2445         pCoeff = pFloat;
2446 
2447         // EOTF/CCM/Tone Mapping/OETF require RGB input
2448         // So if prior CSC is needed, it will always be YUV to RGB conversion
2449         if (params->StageEnableFlags[i].PriorCSCEnable)
2450         {
2451             if (params->PriorCSC[i] == VPHAL_HDR_CSC_YUV_TO_RGB_BT601)
2452             {
2453                 SET_MATRIX(1.000000f, 0.000000f, 1.402000f, 0.000000f, 1.000000f, -0.344136f, -0.714136f, 0.000000f, 1.000000f, 1.772000f, 0.000000f, 0.000000f);
2454 
2455                 VpHal_HdrCalcYuvToRgbMatrix(CSpace_BT601, CSpace_sRGB, TempMatrix, PriorCscMatrix);
2456             }
2457             else if (params->PriorCSC[i] == VPHAL_HDR_CSC_YUV_TO_RGB_BT709)
2458             {
2459                 SET_MATRIX(1.000000f, 0.000000f, 1.574800f, 0.000000f, 1.000000f, -0.187324f, -0.468124f, 0.000000f, 1.000000f, 1.855600f, 0.000000f, 0.000000f);
2460                 VpHal_HdrCalcYuvToRgbMatrix(CSpace_BT709, CSpace_sRGB, TempMatrix, PriorCscMatrix);
2461             }
2462             else if (params->PriorCSC[i] == VPHAL_HDR_CSC_YUV_TO_RGB_BT2020)
2463             {
2464                 SET_MATRIX(1.000000f, 0.000000f, 1.474600f, 0.000000f, 1.000000f, -0.164550f, -0.571350f, 0.000000f, 1.000000f, 1.881400f, 0.000000f, 0.000000f);
2465                 VpHal_HdrCalcYuvToRgbMatrix(CSpace_BT2020, CSpace_sRGB, TempMatrix, PriorCscMatrix);
2466             }
2467             else
2468             {
2469                 VP_RENDER_ASSERTMESSAGE("Color Space Not found.");
2470                 return MOS_STATUS_INVALID_PARAMETER;
2471             }
2472             HdrLimitFP32ArrayPrecisionToF3_9(PriorCscMatrix, ARRAY_SIZE(PriorCscMatrix));
2473             WRITE_MATRIX(PriorCscMatrix);
2474         }
2475         else
2476         {
2477             pCoeff += pCoeffSurface->osSurface->dwPitch / sizeof(float) * 2;
2478         }
2479 
2480         if (params->StageEnableFlags[i].CCMEnable)
2481         {
2482             // BT709 to BT2020 CCM
2483             if (params->CCM[i] == VPHAL_HDR_CCM_BT601_BT709_TO_BT2020_MATRIX)
2484             {
2485                 SET_MATRIX(0.627404078626f, 0.329282097415f, 0.043313797587f, 0.000000f, 0.069097233123f, 0.919541035593f, 0.011361189924f, 0.000000f, 0.016391587664f, 0.088013255546f, 0.895595009604f, 0.000000f);
2486             }
2487             // BT2020 to BT709 CCM
2488             else if (params->CCM[i] == VPHAL_HDR_CCM_BT2020_TO_BT601_BT709_MATRIX)
2489             {
2490                 SET_MATRIX(1.660490254890140f, -0.587638564717282f, -0.072851975229213f, 0.000000f, -0.124550248621850f, 1.132898753013895f, -0.008347895599309f, 0.000000f, -0.018151059958635f, -0.100578696221493f, 1.118729865913540f, 0.000000f);
2491             }
2492             else
2493             {
2494                 SET_MATRIX(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
2495             }
2496 
2497             VpHal_HdrCalcCCMMatrix(TempMatrix, CcmMatrix);
2498             HdrLimitFP32ArrayPrecisionToF3_9(CcmMatrix, ARRAY_SIZE(CcmMatrix));
2499             WRITE_MATRIX(CcmMatrix);
2500         }
2501         else
2502         {
2503             pCoeff += pCoeffSurface->osSurface->dwPitch / sizeof(float) * 2;
2504         }
2505 
2506         // OETF will output RGB surface
2507         // So if post CSC is needed, it will always be RGB to YUV conversion
2508         if (params->StageEnableFlags[i].PostCSCEnable)
2509         {
2510             if (params->PostCSC[i] == VPHAL_HDR_CSC_RGB_TO_YUV_BT601)
2511             {
2512                 SET_MATRIX(-0.331264f, -0.168736f, 0.500000f, 0.000000f, 0.587000f, 0.299000f, 0.114000f, 0.000000f, -0.418688f, 0.500000f, -0.081312f, 0.000000f);
2513                 VpHal_HdrCalcRgbToYuvMatrix(CSpace_sRGB, CSpace_BT601, TempMatrix, PostCscMatrix);
2514             }
2515             else if (params->PostCSC[i] == VPHAL_HDR_CSC_RGB_TO_YUV_BT709)
2516             {
2517                 SET_MATRIX(-0.385428f, -0.114572f, 0.500000f, 0.000000f, 0.715200f, 0.212600f, 0.072200f, 0.000000f, -0.454153f, 0.500000f, -0.045847f, 0.000000f);
2518                 VpHal_HdrCalcRgbToYuvMatrix(CSpace_sRGB, CSpace_BT709, TempMatrix, PostCscMatrix);
2519             }
2520             else if (params->PostCSC[i] == VPHAL_HDR_CSC_RGB_TO_YUV_BT709_FULLRANGE)
2521             {
2522                 SET_MATRIX(-0.385428f, -0.114572f, 0.500000f, 0.000000f, 0.715200f, 0.212600f, 0.072200f, 0.000000f, -0.454153f, 0.500000f, -0.045847f, 0.000000f);
2523                 VpHal_HdrCalcRgbToYuvMatrix(CSpace_sRGB, CSpace_BT709_FullRange, TempMatrix, PostCscMatrix);
2524             }
2525             else if (params->PostCSC[i] == VPHAL_HDR_CSC_RGB_TO_YUV_BT2020)
2526             {
2527                 SET_MATRIX(-0.360370f, -0.139630f, 0.500000f, 0.000000f, 0.678000f, 0.262700f, 0.059300f, 0.000000f, -0.459786f, 0.500000f, -0.040214f, 0.000000f);
2528                 VpHal_HdrCalcRgbToYuvMatrix(CSpace_sRGB, CSpace_BT2020, TempMatrix, PostCscMatrix);
2529             }
2530             else
2531             {
2532                 VP_RENDER_ASSERTMESSAGE("Color Space Not found.");
2533                 return MOS_STATUS_INVALID_PARAMETER;
2534             }
2535             HdrLimitFP32ArrayPrecisionToF3_9(PostCscMatrix, ARRAY_SIZE(PostCscMatrix));
2536             WRITE_MATRIX(PostCscMatrix);
2537         }
2538         else
2539         {
2540             pCoeff += pCoeffSurface->osSurface->dwPitch / sizeof(float) * 2;
2541         }
2542 
2543         pEOTFType  = (uint32_t *)(pFloat + VPHAL_HDR_COEF_EOTF_OFFSET);
2544         pEOTFCoeff = pFloat + pCoeffSurface->osSurface->dwPitch / sizeof(float) + VPHAL_HDR_COEF_EOTF_OFFSET;
2545 
2546         if (params->StageEnableFlags[i].EOTFEnable)
2547         {
2548             if (params->EOTFGamma[i] == VPHAL_GAMMA_TRADITIONAL_GAMMA)
2549             {
2550                 *pEOTFType = VPHAL_HDR_KERNEL_EOTF_TRADITIONAL_GAMMA;
2551                 SET_EOTF_COEFF(VPHAL_HDR_EOTF_COEFF1_TRADITIONNAL_GAMMA,
2552                     VPHAL_HDR_EOTF_COEFF2_TRADITIONNAL_GAMMA,
2553                     VPHAL_HDR_EOTF_COEFF3_TRADITIONNAL_GAMMA,
2554                     VPHAL_HDR_EOTF_COEFF4_TRADITIONNAL_GAMMA,
2555                     VPHAL_HDR_EOTF_COEFF5_TRADITIONNAL_GAMMA);
2556             }
2557             else if (params->EOTFGamma[i] == VPHAL_GAMMA_SMPTE_ST2084)
2558             {
2559                 *pEOTFType = VPHAL_HDR_KERNEL_SMPTE_ST2084;
2560                 SET_EOTF_COEFF(VPHAL_HDR_EOTF_COEFF1_SMPTE_ST2084,
2561                     VPHAL_HDR_EOTF_COEFF2_SMPTE_ST2084,
2562                     VPHAL_HDR_EOTF_COEFF3_SMPTE_ST2084,
2563                     VPHAL_HDR_EOTF_COEFF4_SMPTE_ST2084,
2564                     VPHAL_HDR_EOTF_COEFF5_SMPTE_ST2084);
2565             }
2566             else if (params->EOTFGamma[i] == VPHAL_GAMMA_BT1886)
2567             {
2568                 *pEOTFType = VPHAL_HDR_KERNEL_EOTF_TRADITIONAL_GAMMA;
2569                 SET_EOTF_COEFF(VPHAL_HDR_EOTF_COEFF1_TRADITIONNAL_GAMMA_BT1886,
2570                     VPHAL_HDR_EOTF_COEFF2_TRADITIONNAL_GAMMA_BT1886,
2571                     VPHAL_HDR_EOTF_COEFF3_TRADITIONNAL_GAMMA_BT1886,
2572                     VPHAL_HDR_EOTF_COEFF4_TRADITIONNAL_GAMMA_BT1886,
2573                     VPHAL_HDR_EOTF_COEFF5_TRADITIONNAL_GAMMA_BT1886);
2574             }
2575             else if (params->EOTFGamma[i] == VPHAL_GAMMA_SRGB)
2576             {
2577                 *pEOTFType = VPHAL_HDR_KERNEL_EOTF_TRADITIONAL_GAMMA;
2578                 SET_EOTF_COEFF(VPHAL_HDR_EOTF_COEFF1_TRADITIONNAL_GAMMA_SRGB,
2579                     VPHAL_HDR_EOTF_COEFF2_TRADITIONNAL_GAMMA_SRGB,
2580                     VPHAL_HDR_EOTF_COEFF3_TRADITIONNAL_GAMMA_SRGB,
2581                     VPHAL_HDR_EOTF_COEFF4_TRADITIONNAL_GAMMA_SRGB,
2582                     VPHAL_HDR_EOTF_COEFF5_TRADITIONNAL_GAMMA_SRGB);
2583             }
2584             else
2585             {
2586                 VP_RENDER_ASSERTMESSAGE("Invalid EOTF setting for tone mapping");
2587                 return MOS_STATUS_INVALID_PARAMETER;
2588             }
2589         }
2590 
2591         pEOTFType++;
2592         pEOTFCoeff = pFloat + pCoeffSurface->osSurface->dwPitch / sizeof(float) + VPHAL_HDR_COEF_EOTF_OFFSET + 1;
2593 
2594         if (params->StageEnableFlags[i].OETFEnable)
2595         {
2596             if (params->OETFGamma[i] == VPHAL_GAMMA_TRADITIONAL_GAMMA)
2597             {
2598                 *pEOTFType = VPHAL_HDR_KERNEL_EOTF_TRADITIONAL_GAMMA;
2599                 SET_EOTF_COEFF(VPHAL_HDR_OETF_COEFF1_TRADITIONNAL_GAMMA,
2600                     VPHAL_HDR_OETF_COEFF2_TRADITIONNAL_GAMMA,
2601                     VPHAL_HDR_OETF_COEFF3_TRADITIONNAL_GAMMA,
2602                     VPHAL_HDR_OETF_COEFF4_TRADITIONNAL_GAMMA,
2603                     VPHAL_HDR_OETF_COEFF5_TRADITIONNAL_GAMMA);
2604             }
2605             else if (params->OETFGamma[i] == VPHAL_GAMMA_SRGB)
2606             {
2607                 *pEOTFType = VPHAL_HDR_KERNEL_EOTF_TRADITIONAL_GAMMA;
2608                 SET_EOTF_COEFF(VPHAL_HDR_OETF_COEFF1_TRADITIONNAL_GAMMA_SRGB,
2609                     VPHAL_HDR_OETF_COEFF2_TRADITIONNAL_GAMMA_SRGB,
2610                     VPHAL_HDR_OETF_COEFF3_TRADITIONNAL_GAMMA_SRGB,
2611                     VPHAL_HDR_OETF_COEFF4_TRADITIONNAL_GAMMA_SRGB,
2612                     VPHAL_HDR_OETF_COEFF5_TRADITIONNAL_GAMMA_SRGB);
2613             }
2614             else if (params->OETFGamma[i] == VPHAL_GAMMA_SMPTE_ST2084)
2615             {
2616                 *pEOTFType = VPHAL_HDR_KERNEL_SMPTE_ST2084;
2617                 SET_EOTF_COEFF(VPHAL_HDR_OETF_COEFF1_SMPTE_ST2084,
2618                     VPHAL_HDR_OETF_COEFF2_SMPTE_ST2084,
2619                     VPHAL_HDR_OETF_COEFF3_SMPTE_ST2084,
2620                     VPHAL_HDR_OETF_COEFF4_SMPTE_ST2084,
2621                     VPHAL_HDR_OETF_COEFF5_SMPTE_ST2084);
2622             }
2623             else
2624             {
2625                 VP_RENDER_ASSERTMESSAGE("Invalid EOTF setting for tone mapping");
2626                 return MOS_STATUS_INVALID_PARAMETER;
2627             }
2628         }
2629 
2630         // NOTE:
2631         // Pitch is not equal to width usually. So please be careful when using pointer addition.
2632         // Only do this when operands are in the same row.
2633         pPivotPoint     = pFloat + pCoeffSurface->osSurface->dwPitch / sizeof(float) * VPHAL_HDR_COEF_PIVOT_POINT_LINE_OFFSET;
2634         pSlopeIntercept = (uint16_t *)(pFloat + pCoeffSurface->osSurface->dwPitch / sizeof(float) * VPHAL_HDR_COEF_SLOPE_INTERCEPT_LINE_OFFSET);
2635         pPWLFStretch    = pFloat + pCoeffSurface->osSurface->dwPitch / sizeof(float) * VPHAL_HDR_COEF_PIVOT_POINT_LINE_OFFSET + 5;
2636         pTMType         = (uint32_t *)(pPWLFStretch);
2637         pCoeffR         = pPWLFStretch + 1;
2638         pCoeffG         = pCoeffR + 1;
2639         pCoeffB         = pFloat + pCoeffSurface->osSurface->dwPitch / sizeof(float) * VPHAL_HDR_COEF_SLOPE_INTERCEPT_LINE_OFFSET + 6;
2640         pOETFNeqType    = (uint32_t *)(pFloat + pCoeffSurface->osSurface->dwPitch / sizeof(float) * VPHAL_HDR_COEF_SLOPE_INTERCEPT_LINE_OFFSET + 7);
2641 
2642         if (params->HdrMode[i] == VPHAL_HDR_MODE_TONE_MAPPING)
2643         {
2644             *pTMType      = 1;                  // TMtype
2645             *pOETFNeqType = 0 | (10000 << 16);  // OETFNEQ
2646             *pCoeffR      = 0.25f;
2647             *pCoeffG      = 0.625f;
2648             *pCoeffB      = 0.125f;
2649 
2650             float pivot0_x = 0.0f, pivot1_x = 0.03125f, pivot2_x = 0.09375f, pivot3_x = 0.125f, pivot4_x = 0.21875f, pivot5_x = 0.40625f;
2651             float pivot0_y = 0.0f, pivot1_y = 0.7f, pivot2_y = 0.9f, pivot3_y = 0.95f, pivot4_y = 0.99f, pivot5_y = 1.0f;
2652             float sf1, sf2, sf3, sf4, sf5;
2653             float in1f, in2f, in3f, in4f, in5f;
2654 
2655             pivot0_x = 0.0f;
2656             pivot0_y = 0.0f;
2657 
2658             // Calculate Gradient and Intercepts
2659             sf1      = (pivot1_x - pivot0_x) > 0.0f ? (float)(pivot1_y - pivot0_y) / (pivot1_x - pivot0_x) : 0.0f;
2660             pivot1_y = sf1 * (pivot1_x - pivot0_x) + pivot0_y;
2661 
2662             sf2      = (pivot2_x - pivot1_x) > 0.0f ? (float)(pivot2_y - pivot1_y) / (pivot2_x - pivot1_x) : 0.0f;
2663             pivot2_y = sf2 * (pivot2_x - pivot1_x) + pivot1_y;
2664 
2665             sf3      = (pivot3_x - pivot2_x) > 0.0f ? (float)(pivot3_y - pivot2_y) / (pivot3_x - pivot2_x) : 0.0f;
2666             pivot3_y = sf3 * (pivot3_x - pivot2_x) + pivot2_y;
2667 
2668             sf4      = (pivot4_x - pivot3_x) > 0.0f ? (float)(pivot4_y - pivot3_y) / (pivot4_x - pivot3_x) : 0.0f;
2669             pivot4_y = sf4 * (pivot4_x - pivot3_x) + pivot3_y;
2670 
2671             sf5      = (pivot5_x - pivot4_x) > 0.0f ? (float)(pivot5_y - pivot4_y) / (pivot5_x - pivot4_x) : 0.0f;
2672             pivot5_y = sf5 * (pivot5_x - pivot4_x) + pivot4_y;
2673 
2674             // Calculating Intercepts
2675             in1f = pivot0_y;
2676             in2f = pivot1_y - (sf2 * pivot1_x);
2677             in3f = pivot2_y - (sf3 * pivot2_x);
2678             in4f = pivot3_y - (sf4 * pivot3_x);
2679             in5f = pivot4_y - (sf5 * pivot4_x);
2680 
2681             // Pivot Point
2682             *pPivotPoint++ = pivot1_x;
2683             *pPivotPoint++ = pivot2_x;
2684             *pPivotPoint++ = pivot3_x;
2685             *pPivotPoint++ = pivot4_x;
2686             *pPivotPoint++ = pivot5_x;
2687 
2688             // Slope and Intercept
2689             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(sf1);
2690             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(in1f);
2691             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(sf2);
2692             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(in2f);
2693             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(sf3);
2694             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(in3f);
2695             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(sf4);
2696             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(in4f);
2697             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(sf5);
2698             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(in5f);
2699             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(0.0f);
2700             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(pivot5_y);
2701         }
2702         else if (params->HdrMode[i] == VPHAL_HDR_MODE_INVERSE_TONE_MAPPING)
2703         {
2704             *pPWLFStretch = 0.01f;                      // Stretch
2705             *pOETFNeqType = 1 | ((uint32_t)100 << 16);  // OETFNEQ
2706             *pCoeffR      = 0.0f;
2707             *pCoeffG      = 0.0f;
2708             *pCoeffB      = 0.0f;
2709 
2710             // Pivot Point
2711             *pPivotPoint++ = VPHAL_HDR_INVERSE_TONE_MAPPING_PIVOT_POINT_X1;
2712             *pPivotPoint++ = VPHAL_HDR_INVERSE_TONE_MAPPING_PIVOT_POINT_X2;
2713             *pPivotPoint++ = VPHAL_HDR_INVERSE_TONE_MAPPING_PIVOT_POINT_X3;
2714             *pPivotPoint++ = VPHAL_HDR_INVERSE_TONE_MAPPING_PIVOT_POINT_X4;
2715             *pPivotPoint++ = VPHAL_HDR_INVERSE_TONE_MAPPING_PIVOT_POINT_X5;
2716 
2717             // Slope and Intercept
2718             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_SLOPE0);
2719             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_INTERCEPT0);
2720             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_SLOPE1);
2721             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_INTERCEPT1);
2722             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_SLOPE2);
2723             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_INTERCEPT2);
2724             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_SLOPE3);
2725             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_INTERCEPT3);
2726             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_SLOPE4);
2727             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_INTERCEPT4);
2728             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_SLOPE5);
2729             *pSlopeIntercept++ = VpHal_FloatToHalfFloat(VPHAL_HDR_INVERSE_TONE_MAPPING_INTERCEPT5);
2730         }
2731         else if (params->HdrMode[i] == VPHAL_HDR_MODE_H2H ||
2732                  params->HdrMode[i] == VPHAL_HDR_MODE_H2H_AUTO_MODE)
2733         {
2734             *pTMType      = 1;                                                 // TMtype
2735             *pOETFNeqType = 2 | (((uint32_t)(params->uiMaxDisplayLum)) << 16);  // OETFNEQ
2736             *pCoeffR      = 0.25f;
2737             *pCoeffG      = 0.625f;
2738             *pCoeffB      = 0.125f;
2739 
2740             CalculateH2HPWLFCoefficients(&params->srcHDRParams[0], &params->targetHDRParams[0], pPivotPoint, pSlopeIntercept, pOsInterface);
2741 
2742         }
2743         else
2744         {
2745             *pPivotPoint  = 0.0f;
2746             *pTMType      = 0;  // TMtype
2747             *pOETFNeqType = 0;  // OETFNEQ
2748         }
2749     }
2750 
2751     // Coef[64][7] is to normalize the fp16 input value
2752     pFP16Normalizer  = pFloat + 7;
2753     *pFP16Normalizer = 1.0f / 125.0f;
2754 
2755     // Skip the Dst CSC area
2756     pFloat += 2 * pCoeffSurface->osSurface->dwPitch / sizeof(float);
2757 
2758     for (i = 0; i < VPHAL_MAX_HDR_INPUT_LAYER; i++, pFloat += VPHAL_HDR_COEF_LINES_PER_LAYER_EXT * pCoeffSurface->osSurface->dwPitch / (sizeof(float)))
2759     {
2760         pCCMEnable                                   = (uint32_t *)pFloat;
2761         *(pCCMEnable + VPHAL_HDR_COEF_CCMEXT_OFFSET) = params->StageEnableFlags[i].CCMExt1Enable;
2762         *(pCCMEnable + VPHAL_HDR_COEF_CLAMP_OFFSET)  = params->StageEnableFlags[i].GamutClamp1Enable;
2763 
2764         pCCMEnable += pCoeffSurface->osSurface->dwPitch / sizeof(float) * 2;
2765         *(pCCMEnable + VPHAL_HDR_COEF_CCMEXT_OFFSET) = params->StageEnableFlags[i].CCMExt2Enable;
2766         *(pCCMEnable + VPHAL_HDR_COEF_CLAMP_OFFSET)  = params->StageEnableFlags[i].GamutClamp2Enable;
2767 
2768         if (params->InputSrc[i] == false)
2769         {
2770             continue;
2771         }
2772 
2773         pCoeff = pFloat;
2774         if (params->StageEnableFlags[i].CCMExt1Enable)
2775         {
2776             // BT709 to BT2020 CCM
2777             if (params->CCMExt1[i] == VPHAL_HDR_CCM_BT601_BT709_TO_BT2020_MATRIX)
2778             {
2779                 SET_MATRIX(0.627404078626f, 0.329282097415f, 0.043313797587f, 0.000000f, 0.069097233123f, 0.919541035593f, 0.011361189924f, 0.000000f, 0.016391587664f, 0.088013255546f, 0.895595009604f, 0.000000f);
2780             }
2781             // BT2020 to BT709 CCM
2782             else if (params->CCMExt1[i] == VPHAL_HDR_CCM_BT2020_TO_BT601_BT709_MATRIX)
2783             {
2784                 SET_MATRIX(1.660490254890140f, -0.587638564717282f, -0.072851975229213f, 0.000000f, -0.124550248621850f, 1.132898753013895f, -0.008347895599309f, 0.000000f, -0.018151059958635f, -0.100578696221493f, 1.118729865913540f, 0.000000f);
2785             }
2786             else if (params->CCMExt1[i] == VPHAL_HDR_CCM_BT2020_TO_MONITOR_MATRIX ||
2787                      params->CCMExt1[i] == VPHAL_HDR_CCM_MONITOR_TO_BT2020_MATRIX ||
2788                      params->CCMExt1[i] == VPHAL_HDR_CCM_MONITOR_TO_BT709_MATRIX)
2789             {
2790                 HdrCalculateCCMWithMonitorGamut(params->CCMExt1[i], params->targetHDRParams[0], TempMatrix);
2791             }
2792             else
2793             {
2794                 SET_MATRIX(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
2795             }
2796 
2797             VpHal_HdrCalcCCMMatrix(TempMatrix, CcmMatrix);
2798             HdrLimitFP32ArrayPrecisionToF3_9(CcmMatrix, ARRAY_SIZE(CcmMatrix));
2799             WRITE_MATRIX(CcmMatrix);
2800         }
2801         else
2802         {
2803             pCoeff += pCoeffSurface->osSurface->dwPitch / sizeof(float) * 2;
2804         }
2805 
2806         if (params->StageEnableFlags[i].CCMExt2Enable)
2807         {
2808             // BT709 to BT2020 CCM
2809             if (params->CCMExt2[i] == VPHAL_HDR_CCM_BT601_BT709_TO_BT2020_MATRIX)
2810             {
2811                 SET_MATRIX(0.627404078626f, 0.329282097415f, 0.043313797587f, 0.000000f, 0.069097233123f, 0.919541035593f, 0.011361189924f, 0.000000f, 0.016391587664f, 0.088013255546f, 0.895595009604f, 0.000000f);
2812             }
2813             // BT2020 to BT709 CCM
2814             else if (params->CCMExt2[i] == VPHAL_HDR_CCM_BT2020_TO_BT601_BT709_MATRIX)
2815             {
2816                 SET_MATRIX(1.660490254890140f, -0.587638564717282f, -0.072851975229213f, 0.000000f, -0.124550248621850f, 1.132898753013895f, -0.008347895599309f, 0.000000f, -0.018151059958635f, -0.100578696221493f, 1.118729865913540f, 0.000000f);
2817             }
2818             else if (params->CCMExt2[i] == VPHAL_HDR_CCM_BT2020_TO_MONITOR_MATRIX ||
2819                      params->CCMExt2[i] == VPHAL_HDR_CCM_MONITOR_TO_BT2020_MATRIX ||
2820                      params->CCMExt2[i] == VPHAL_HDR_CCM_MONITOR_TO_BT709_MATRIX)
2821             {
2822                 HdrCalculateCCMWithMonitorGamut(params->CCMExt2[i], params->targetHDRParams[0], TempMatrix);
2823             }
2824             else
2825             {
2826                 SET_MATRIX(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
2827             }
2828 
2829             VpHal_HdrCalcCCMMatrix(TempMatrix, CcmMatrix);
2830             HdrLimitFP32ArrayPrecisionToF3_9(CcmMatrix, ARRAY_SIZE(CcmMatrix));
2831             WRITE_MATRIX(CcmMatrix);
2832         }
2833         else
2834         {
2835             pCoeff += pCoeffSurface->osSurface->dwPitch / sizeof(float) * 2;
2836         }
2837     }
2838 
2839     VP_PUBLIC_CHK_STATUS_RETURN(m_allocator->UnLock(&pCoeffSurface->osSurface->OsResource));
2840 
2841     eStatus = MOS_STATUS_SUCCESS;
2842 
2843 #undef SET_MATRIX
2844 #undef SET_EOTF_COEFF
2845 #undef WRITE_MATRIX
2846 
2847     return eStatus;
2848 }
2849 
2850 //!
2851 //! \brief    Assemble the HDR kernel per layer stages
2852 //! \details  Contruct a case id from the input information, and look up the configuration entry in the table.
2853 //! \param    HDRStageConfigEntry *pConfigEntry
2854 //!           [out] Pointer to configuration entry
2855 //! \return   bool
2856 //!           True if find proper configuration entry, otherwise false
2857 //!
ToneMappingStagesAssemble(HDR_PARAMS * srcHDRParams,HDR_PARAMS * targetHDRParams,HDRStageConfigEntry * pConfigEntry,uint32_t index)2858 bool VpRenderHdrKernel::ToneMappingStagesAssemble(
2859     HDR_PARAMS          *srcHDRParams,
2860     HDR_PARAMS          *targetHDRParams,
2861     HDRStageConfigEntry *pConfigEntry,
2862     uint32_t index)
2863 {
2864     HDRCaseID id = {0};
2865     VP_FUNC_CALL();
2866     VP_RENDER_ASSERT(pConfigEntry);
2867     VP_RENDER_ASSERT(m_hdrParams);
2868     VP_RENDER_ASSERT(srcHDRParams);
2869     VP_RENDER_ASSERT(targetHDRParams);
2870 
2871     auto        inputSurface = m_surfaceGroup->find(SurfaceType(SurfaceTypeHdrInputLayer0 + index));
2872     VP_SURFACE *input = (m_surfaceGroup->end() != inputSurface) ? inputSurface->second : nullptr;
2873     if (input == nullptr)
2874     {
2875         VP_RENDER_ASSERTMESSAGE("input surface creat failed, skip process");
2876         return false;
2877     }
2878     if (input->osSurface == nullptr)
2879     {
2880         VP_RENDER_ASSERTMESSAGE("input surface creat failed, skip process");
2881         return false;
2882     }
2883 
2884     auto        targetSurface = m_surfaceGroup->find(SurfaceTypeHdrTarget0);
2885     VP_SURFACE *target = (m_surfaceGroup->end() != targetSurface) ? targetSurface->second : nullptr;
2886     if (target == nullptr)
2887     {
2888         VP_RENDER_ASSERTMESSAGE("target surface creat failed, skip process");
2889         return false;
2890     }
2891     if (target->osSurface == nullptr)
2892     {
2893         VP_RENDER_ASSERTMESSAGE("input surface creat failed, skip process");
2894         return false;
2895     }
2896 
2897     // Because FP16 format can represent both SDR or HDR, we need do judgement here.
2898     // We need this information because we dont have unified tone mapping algorithm for various scenarios(H2S/H2H).
2899     // To do this, we make two assumptions:
2900     // 1. This colorspace will be set to BT709/Gamma1.0 from APP, so such information can NOT be used to check HDR.
2901     // 2. If APP pass any HDR metadata, it indicates this is HDR.
2902     id.InputXDR     = (srcHDRParams &&
2903                       ((srcHDRParams->EOTF == VPHAL_HDR_EOTF_SMPTE_ST2084) || IS_RGB64_FLOAT_FORMAT(input->osSurface->Format)))
2904                           ? 1
2905                           : 0;
2906     id.InputGamut   = IS_COLOR_SPACE_BT2020(input->ColorSpace);
2907     id.OutputXDR    = (targetHDRParams &&
2908                        ((targetHDRParams->EOTF == VPHAL_HDR_EOTF_SMPTE_ST2084) || IS_RGB64_FLOAT_FORMAT(target->osSurface->Format)))
2909                           ? 1
2910                           : 0;
2911     id.OutputGamut  = IS_COLOR_SPACE_BT2020(target->ColorSpace);
2912     id.OutputLinear = IS_RGB64_FLOAT_FORMAT(target->osSurface->Format) ? 1 : 0;
2913 
2914     if (m_hdrParams->pHDRStageConfigTable)
2915     {
2916         pConfigEntry->value = m_hdrParams->pHDRStageConfigTable[id.index];
2917     }
2918     else
2919     {
2920         pConfigEntry->Invalid = 1;
2921     }
2922 
2923     if (pConfigEntry->Invalid == 1)
2924     {
2925         VP_RENDER_ASSERTMESSAGE(
2926             "Tone mapping stages assembling failed, please reexamine the usage case(case id %d)! "
2927             "If it is definitely a correct usage, please add an entry in HDRStageEnableTable.",
2928             id.index);
2929     }
2930 
2931     return (pConfigEntry->Invalid != 1);
2932 }
2933 
2934 
2935 //!
2936 //! \brief    Update per layer pipeline states and return update mask for each layer
2937 //! \details  Update per layer pipeline states and return update mask for each layer
2938 //! \param    uint32_t* pdwUpdateMask
2939 //!           [out] Pointer to update mask
2940 //! \return   MOS_STATUS
2941 //!
UpdatePerLayerPipelineStates(uint32_t * pdwUpdateMask)2942 MOS_STATUS VpRenderHdrKernel::UpdatePerLayerPipelineStates(
2943     uint32_t           *pdwUpdateMask)
2944 {
2945     MOS_STATUS           eStatus              = MOS_STATUS_UNKNOWN;
2946     uint32_t             i                    = 0;
2947     PVPHAL_SURFACE       pSrc                 = nullptr;
2948     PVPHAL_SURFACE       pTarget              = nullptr;
2949     VPHAL_HDR_LUT_MODE   CurrentLUTMode       = VPHAL_HDR_LUT_MODE_NONE;
2950     VPHAL_GAMMA_TYPE     CurrentEOTF          = VPHAL_GAMMA_NONE;            //!< EOTF
2951     VPHAL_GAMMA_TYPE     CurrentOETF          = VPHAL_GAMMA_NONE;            //!< OETF
2952     VPHAL_HDR_MODE       CurrentHdrMode       = VPHAL_HDR_MODE_NONE;      //!< Hdr Mode
2953     VPHAL_HDR_CCM_TYPE   CurrentCCM           = VPHAL_HDR_CCM_NONE;           //!< CCM Mode
2954     VPHAL_HDR_CCM_TYPE   CurrentCCMExt1       = VPHAL_HDR_CCM_NONE;       //!< CCM Ext1 Mode
2955     VPHAL_HDR_CCM_TYPE   CurrentCCMExt2       = VPHAL_HDR_CCM_NONE;       //!< CCM Ext2 Mode
2956     VPHAL_HDR_CSC_TYPE   CurrentPriorCSC      = VPHAL_HDR_CSC_NONE;      //!< Prior CSC Mode
2957     VPHAL_HDR_CSC_TYPE   CurrentPostCSC       = VPHAL_HDR_CSC_NONE;       //!< Post CSC Mode
2958     HDRStageConfigEntry  ConfigEntry          = { 0 };
2959     HDRStageEnables      StageEnables         = { 0 };
2960 
2961     VP_FUNC_CALL();
2962     VP_RENDER_CHK_NULL_RETURN(pdwUpdateMask);
2963     VP_RENDER_CHK_NULL_RETURN(m_hdrParams);
2964 
2965     //VP_PUBLIC_CHK_NULL(m_hdrParams->pTarget[0]);
2966 
2967     *pdwUpdateMask = 0;
2968 
2969     auto        targetSurface = m_surfaceGroup->find(SurfaceTypeHdrTarget0);
2970     VP_SURFACE *target = (m_surfaceGroup->end() != targetSurface) ? targetSurface->second : nullptr;
2971     if (target == nullptr)
2972     {
2973         VP_RENDER_ASSERTMESSAGE("target surface creat failed, skip process");
2974         return MOS_STATUS_NULL_POINTER;
2975     }
2976     VP_RENDER_CHK_NULL_RETURN(target->osSurface);
2977 
2978     for (i = 0; i < m_hdrParams->uSourceCount; i++)
2979     {
2980         auto        inputSurface = m_surfaceGroup->find(SurfaceType(SurfaceTypeHdrInputLayer0 + i));
2981         VP_SURFACE *input        = (m_surfaceGroup->end() != inputSurface) ? inputSurface->second : nullptr;
2982         if (input == nullptr)
2983         {
2984             VP_RENDER_ASSERTMESSAGE("input surface creat failed, skip process");
2985             return MOS_STATUS_NULL_POINTER;
2986         }
2987         VP_RENDER_CHK_NULL_RETURN(input->osSurface);
2988         if (m_hdrParams->InputSrc[i] == false)
2989         {
2990             m_hdrParams->LUTMode[i]        = VPHAL_HDR_LUT_MODE_NONE;
2991             m_hdrParams->EOTFGamma[i] = VPHAL_GAMMA_NONE;
2992             m_hdrParams->OETFGamma[i] = VPHAL_GAMMA_NONE;
2993             m_hdrParams->CCM[i]       = VPHAL_HDR_CCM_NONE;
2994             m_hdrParams->CCMExt1[i]   = VPHAL_HDR_CCM_NONE;
2995             m_hdrParams->CCMExt2[i]   = VPHAL_HDR_CCM_NONE;
2996             m_hdrParams->HdrMode[i]   = VPHAL_HDR_MODE_NONE;
2997             m_hdrParams->PriorCSC[i]  = VPHAL_HDR_CSC_NONE;
2998             m_hdrParams->PostCSC[i]   = VPHAL_HDR_CSC_NONE;
2999 
3000             m_hdrParams->StageEnableFlags[i].value = 0;
3001             MOS_ZeroMemory(&m_hdrParams->HDRLastFrameSourceParams[i], sizeof(VPHAL_HDR_PARAMS));
3002 
3003             continue;
3004         }
3005 
3006         //pSrc = (PVPHAL_SURFACE)m_hdrParams->pSrc[i];
3007 
3008         CurrentLUTMode  = VPHAL_HDR_LUT_MODE_NONE;
3009         CurrentEOTF     = VPHAL_GAMMA_NONE;
3010         CurrentOETF     = VPHAL_GAMMA_NONE;
3011         CurrentHdrMode  = VPHAL_HDR_MODE_NONE;
3012         CurrentCCM      = VPHAL_HDR_CCM_NONE;
3013         CurrentCCMExt1  = VPHAL_HDR_CCM_NONE;
3014         CurrentCCMExt2  = VPHAL_HDR_CCM_NONE;
3015         CurrentPriorCSC = VPHAL_HDR_CSC_NONE;
3016         CurrentPostCSC  = VPHAL_HDR_CSC_NONE;
3017 
3018         m_hdrParams->Cri3DLUTSize = VPHAL_HDR_CRI_3DLUT_SIZE;
3019 
3020         if (!ToneMappingStagesAssemble(&m_hdrParams->srcHDRParams[i], &m_hdrParams->targetHDRParams[0], &ConfigEntry, i))
3021         {
3022             eStatus = MOS_STATUS_INVALID_PARAMETER;
3023             return eStatus;
3024         }
3025 
3026         CurrentHdrMode = (VPHAL_HDR_MODE)ConfigEntry.PWLF;
3027         CurrentCCM     = (VPHAL_HDR_CCM_TYPE)ConfigEntry.CCM;
3028         CurrentCCMExt1 = (VPHAL_HDR_CCM_TYPE)ConfigEntry.CCMExt1;
3029         CurrentCCMExt2 = (VPHAL_HDR_CCM_TYPE)ConfigEntry.CCMExt2;
3030 
3031         // So far only enable auto mode in H2S cases.
3032         if (CurrentHdrMode == VPHAL_HDR_MODE_TONE_MAPPING &&
3033             m_hdrParams->srcHDRParams[i].bAutoMode                   &&
3034             input->SurfType == SURF_IN_PRIMARY)
3035         {
3036             CurrentHdrMode = VPHAL_HDR_MODE_TONE_MAPPING_AUTO_MODE;
3037         }
3038 
3039         StageEnables.value             = 0;
3040         StageEnables.CCMEnable         = (CurrentCCM     != VPHAL_HDR_CCM_NONE ) ? 1 : 0;
3041         StageEnables.PWLFEnable        = (CurrentHdrMode != VPHAL_HDR_MODE_NONE) ? 1 : 0;
3042         StageEnables.CCMExt1Enable     = (CurrentCCMExt1 != VPHAL_HDR_CCM_NONE ) ? 1 : 0;
3043         StageEnables.CCMExt2Enable     = (CurrentCCMExt2 != VPHAL_HDR_CCM_NONE ) ? 1 : 0;
3044         StageEnables.GamutClamp1Enable = ConfigEntry.GamutClamp1;
3045         StageEnables.GamutClamp2Enable = ConfigEntry.GamutClamp2;
3046 
3047         if (IS_YUV_FORMAT(input->osSurface->Format) || IS_ALPHA_YUV_FORMAT(input->osSurface->Format))
3048         {
3049             StageEnables.PriorCSCEnable = 1;
3050         }
3051 
3052         if (!IS_RGB64_FLOAT_FORMAT(input->osSurface->Format) &&
3053             (StageEnables.CCMEnable || StageEnables.PWLFEnable || StageEnables.CCMExt1Enable || StageEnables.CCMExt2Enable))
3054         {
3055             StageEnables.EOTFEnable = 1;
3056         }
3057 
3058         if (!IS_RGB64_FLOAT_FORMAT(target->osSurface->Format) && (StageEnables.EOTFEnable || IS_RGB64_FLOAT_FORMAT(input->osSurface->Format)))
3059         {
3060             StageEnables.OETFEnable = 1;
3061         }
3062 
3063         if (IS_YUV_FORMAT(target->osSurface->Format))
3064         {
3065             StageEnables.PostCSCEnable = 1;
3066         }
3067 
3068         if (input->SurfType == SURF_IN_PRIMARY && m_hdrParams->GlobalLutMode != VPHAL_HDR_LUT_MODE_3D)
3069         {
3070             CurrentLUTMode = VPHAL_HDR_LUT_MODE_2D;
3071         }
3072         else
3073         {
3074             CurrentLUTMode = VPHAL_HDR_LUT_MODE_3D;
3075         }
3076 
3077         // Neither 1D nor 3D LUT is needed in linear output case.
3078         if (IS_RGB64_FLOAT_FORMAT(target->osSurface->Format))
3079         {
3080             CurrentLUTMode = VPHAL_HDR_LUT_MODE_NONE;
3081         }
3082 
3083         // EOTF/CCM/Tone Mapping/OETF require RGB input
3084         // So if prior CSC is needed, it will always be YUV to RGB conversion
3085         if (StageEnables.PriorCSCEnable)
3086         {
3087             if (input->ColorSpace == CSpace_BT601)
3088             {
3089                 CurrentPriorCSC = VPHAL_HDR_CSC_YUV_TO_RGB_BT601;
3090             }
3091             else if (input->ColorSpace == CSpace_BT709)
3092             {
3093                 CurrentPriorCSC = VPHAL_HDR_CSC_YUV_TO_RGB_BT709;
3094             }
3095             else if (input->ColorSpace == CSpace_BT2020)
3096             {
3097                 CurrentPriorCSC = VPHAL_HDR_CSC_YUV_TO_RGB_BT2020;
3098             }
3099             else if (input->ColorSpace == CSpace_BT2020_FullRange)
3100             {
3101                 CurrentPriorCSC = VPHAL_HDR_CSC_YUV_TO_RGB_BT2020;
3102             }
3103             else
3104             {
3105                 VP_RENDER_ASSERTMESSAGE("Color Space %d Not found.", input->ColorSpace);
3106                 eStatus = MOS_STATUS_INVALID_PARAMETER;
3107                 return eStatus;
3108             }
3109         }
3110 
3111         if (StageEnables.EOTFEnable)
3112         {
3113             if (m_hdrParams->srcHDRParams[i].EOTF == VPHAL_HDR_EOTF_TRADITIONAL_GAMMA_SDR ||
3114                 m_hdrParams->srcHDRParams[i].EOTF == VPHAL_HDR_EOTF_TRADITIONAL_GAMMA_HDR)
3115             {
3116                 // Mark tranditional HDR/SDR gamma as the same type
3117                 CurrentEOTF = VPHAL_GAMMA_TRADITIONAL_GAMMA;
3118             }
3119             else if (m_hdrParams->srcHDRParams[i].EOTF == VPHAL_HDR_EOTF_SMPTE_ST2084)
3120             {
3121                 CurrentEOTF = VPHAL_GAMMA_SMPTE_ST2084;
3122             }
3123             else if (m_hdrParams->srcHDRParams[i].EOTF == VPHAL_HDR_EOTF_BT1886)
3124             {
3125                 CurrentEOTF = VPHAL_GAMMA_BT1886;
3126             }
3127             else
3128             {
3129                 VP_RENDER_ASSERTMESSAGE("Invalid EOTF setting for tone mapping");
3130                 eStatus = MOS_STATUS_INVALID_PARAMETER;
3131                 return eStatus;
3132             }
3133         }
3134 
3135         if (StageEnables.OETFEnable)
3136         {
3137             if (m_hdrParams->targetHDRParams[0].EOTF == VPHAL_HDR_EOTF_TRADITIONAL_GAMMA_SDR ||
3138                 m_hdrParams->targetHDRParams[0].EOTF == VPHAL_HDR_EOTF_TRADITIONAL_GAMMA_HDR)
3139             {
3140                 CurrentOETF = VPHAL_GAMMA_SRGB;
3141             }
3142             else if (m_hdrParams->targetHDRParams[0].EOTF == VPHAL_HDR_EOTF_SMPTE_ST2084)
3143             {
3144                 CurrentOETF = VPHAL_GAMMA_SMPTE_ST2084;
3145             }
3146             else
3147             {
3148                 VP_RENDER_ASSERTMESSAGE("Invalid EOTF setting for tone mapping");
3149                 eStatus = MOS_STATUS_INVALID_PARAMETER;
3150                 return eStatus;
3151             }
3152         }
3153 
3154         // OETF will output RGB surface
3155         // So if post CSC is needed, it will always be RGB to YUV conversion
3156         if (StageEnables.PostCSCEnable)
3157         {
3158             if (target->ColorSpace == CSpace_BT601)
3159             {
3160                 CurrentPostCSC = VPHAL_HDR_CSC_RGB_TO_YUV_BT601;
3161             }
3162             else if (target->ColorSpace == CSpace_BT709)
3163             {
3164                 CurrentPostCSC = VPHAL_HDR_CSC_RGB_TO_YUV_BT709;
3165             }
3166             else if (target->ColorSpace == CSpace_BT709_FullRange)
3167             {
3168                 // CSC for target BT709_FULLRANGE is only exposed to Vebox Preprocessed HDR cases.
3169                 CurrentPostCSC = VPHAL_HDR_CSC_RGB_TO_YUV_BT709_FULLRANGE;
3170             }
3171             else if (target->ColorSpace == CSpace_BT2020 ||
3172                      target->ColorSpace == CSpace_BT2020_FullRange)
3173             {
3174                 CurrentPostCSC = VPHAL_HDR_CSC_RGB_TO_YUV_BT2020;
3175             }
3176             else
3177             {
3178                 VP_RENDER_ASSERTMESSAGE("Color Space %d Not found.", target->ColorSpace);
3179                 eStatus = MOS_STATUS_INVALID_PARAMETER;
3180                 return eStatus;
3181             }
3182         }
3183 
3184         if (m_hdrParams->LUTMode[i]   != CurrentLUTMode ||
3185             m_hdrParams->EOTFGamma[i] != CurrentEOTF    ||
3186             m_hdrParams->OETFGamma[i] != CurrentOETF    ||
3187             m_hdrParams->CCM[i]       != CurrentCCM     ||
3188             m_hdrParams->CCMExt1[i]  != CurrentCCMExt1  ||
3189             m_hdrParams->CCMExt2[i]  != CurrentCCMExt2  ||
3190             m_hdrParams->HdrMode[i]  != CurrentHdrMode  ||
3191             m_hdrParams->PriorCSC[i] != CurrentPriorCSC ||
3192             m_hdrParams->PostCSC[i]  != CurrentPostCSC)
3193         {
3194             *pdwUpdateMask |= (1 << i);
3195         }
3196 
3197         if (memcmp(&m_hdrParams->srcHDRParams[i], &m_hdrParams->HDRLastFrameSourceParams[i], sizeof(HDR_PARAMS)))
3198         {
3199             *pdwUpdateMask |= (1 << i);
3200             m_hdrParams->HDRLastFrameSourceParams[i] = m_hdrParams->srcHDRParams[i];
3201         }
3202 
3203         m_hdrParams->LUTMode[i]         = CurrentLUTMode;
3204         m_hdrParams->EOTFGamma[i]       = CurrentEOTF;
3205         m_hdrParams->OETFGamma[i]       = CurrentOETF;
3206         m_hdrParams->CCM[i]             = CurrentCCM;
3207         m_hdrParams->CCMExt1[i]         = CurrentCCMExt1;
3208         m_hdrParams->CCMExt2[i]         = CurrentCCMExt2;
3209         m_hdrParams->HdrMode[i]         = CurrentHdrMode;
3210         m_hdrParams->PriorCSC[i]        = CurrentPriorCSC;
3211         m_hdrParams->PostCSC[i]        = CurrentPostCSC;
3212         m_hdrParams->StageEnableFlags[i] = StageEnables;
3213     }
3214 
3215     if (memcmp(&m_hdrParams->targetHDRParams[0], &m_hdrParams->HDRLastFrameTargetParams, sizeof(HDR_PARAMS)))
3216     {
3217         *pdwUpdateMask |= (1 << VPHAL_MAX_HDR_INPUT_LAYER);
3218         m_hdrParams->HDRLastFrameTargetParams = m_hdrParams->targetHDRParams[0];
3219     }
3220 
3221     m_hdrParams->dwUpdateMask = *pdwUpdateMask;
3222     eStatus = MOS_STATUS_SUCCESS;
3223 
3224     return eStatus;
3225 }
3226 
SetCacheCntl(PVP_RENDER_CACHE_CNTL surfMemCacheCtl)3227 MOS_STATUS VpRenderHdrKernel::SetCacheCntl(PVP_RENDER_CACHE_CNTL surfMemCacheCtl)
3228 {
3229     VP_FUNC_CALL();
3230     VP_RENDER_CHK_NULL_RETURN(surfMemCacheCtl);
3231 
3232     if (!surfMemCacheCtl->bHdr)
3233     {
3234         VP_RENDER_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
3235     }
3236     m_surfMemCacheCtl = surfMemCacheCtl->Hdr;
3237 
3238     return MOS_STATUS_SUCCESS;
3239 }
3240 
InitRenderHalSurface(VP_SURFACE * surf,PRENDERHAL_SURFACE renderHalSurface)3241 MOS_STATUS VpRenderHdrKernel::InitRenderHalSurface(
3242     VP_SURFACE               *surf,
3243     PRENDERHAL_SURFACE      renderHalSurface)
3244 {
3245     MOS_STATUS              eStatus = MOS_STATUS_SUCCESS;
3246     //---------------------------------------
3247     VP_RENDER_CHK_NULL_RETURN(surf);
3248     VP_RENDER_CHK_NULL_RETURN(surf->osSurface);
3249     VP_RENDER_CHK_NULL_RETURN(renderHalSurface);
3250     VP_RENDER_CHK_NULL_RETURN(m_hwInterface);
3251     //---------------------------------------
3252 
3253     auto osInterface = m_hwInterface->m_osInterface;
3254 
3255     VP_RENDER_CHK_NULL_RETURN(osInterface);
3256     VP_RENDER_CHK_NULL_RETURN(osInterface->pfnGetMemoryCompressionMode);
3257     VP_RENDER_CHK_NULL_RETURN(osInterface->pfnGetMemoryCompressionFormat);
3258 
3259     MOS_ZeroMemory(renderHalSurface, sizeof(*renderHalSurface));
3260 
3261     renderHalSurface->OsSurface  = *surf->osSurface;
3262 
3263     if (0 == renderHalSurface->OsSurface.dwQPitch)
3264     {
3265         renderHalSurface->OsSurface.dwQPitch = renderHalSurface->OsSurface.dwHeight;
3266     }
3267 
3268     VP_RENDER_CHK_STATUS_RETURN(osInterface->pfnGetMemoryCompressionMode(osInterface,
3269         &surf->osSurface->OsResource, &renderHalSurface->OsSurface.MmcState));
3270 
3271     if (m_hwInterface->m_waTable && MEDIA_IS_WA(m_hwInterface->m_waTable, Wa_16023363837))
3272     {
3273         VP_RENDER_CHK_STATUS_RETURN(InitRenderHalSurfaceCMF(surf->osSurface, renderHalSurface));
3274     }
3275     else
3276     {
3277         VP_RENDER_CHK_STATUS_RETURN(osInterface->pfnGetMemoryCompressionFormat(osInterface,
3278             &surf->osSurface->OsResource, &renderHalSurface->OsSurface.CompressionFormat));
3279     }
3280 
3281     renderHalSurface->rcSrc                        = surf->rcSrc;
3282     renderHalSurface->rcDst                        = surf->rcDst;
3283     renderHalSurface->rcMaxSrc                     = surf->rcMaxSrc;
3284     renderHalSurface->SurfType                     =
3285                     ConvertVpSurfaceTypeToRenderSurfType(surf->SurfType);
3286     renderHalSurface->ScalingMode                  =
3287         ConvertVpScalingModeToRenderScalingMode(m_hdrParams->ScalingMode);
3288     renderHalSurface->ChromaSiting                 = surf->ChromaSiting;
3289     renderHalSurface->SampleType                   =
3290                     ConvertVpSampleTypeToRenderSampleType(surf->SampleType);
3291 
3292     return eStatus;
3293 }
3294 
InitRenderHalSurface(SurfaceType type,VP_SURFACE * surf,PRENDERHAL_SURFACE renderHalSurface)3295 MOS_STATUS VpRenderHdrKernel::InitRenderHalSurface(
3296     SurfaceType             type,
3297     VP_SURFACE              *surf,
3298     PRENDERHAL_SURFACE      renderHalSurface)
3299 {
3300     MOS_STATUS              eStatus = MOS_STATUS_SUCCESS;
3301 
3302     VP_RENDER_CHK_NULL_RETURN(surf);
3303     VP_RENDER_CHK_NULL_RETURN(m_hdrParams);
3304 
3305     if (type >= SurfaceTypeHdrInputLayer0 && type <= SurfaceTypeHdrInputLayerMax)
3306     {
3307         VP_RENDER_CHK_STATUS_RETURN(InitRenderHalSurface(surf, renderHalSurface));
3308         return MOS_STATUS_SUCCESS;
3309     }
3310     else if (SurfaceTypeHdrTarget0 == type)
3311     {
3312         auto       outputputSurface = m_surfaceGroup->find(SurfaceTypeHdrTarget0);
3313         VP_SURFACE *outputSrc       = (m_surfaceGroup->end() != outputputSurface) ? outputputSurface->second : nullptr;
3314         if (outputSrc == nullptr)
3315         {
3316             VP_RENDER_ASSERTMESSAGE("input surface creat failed, skip process");
3317             return MOS_STATUS_NULL_POINTER;
3318         }
3319 
3320         VP_RENDER_CHK_STATUS_RETURN(InitRenderHalSurface(outputSrc, renderHalSurface));
3321         return MOS_STATUS_SUCCESS;
3322     }
3323 
3324     return MOS_STATUS_UNIMPLEMENTED;
3325 }
3326 
GetScoreboardParams(PMHW_VFE_SCOREBOARD & scoreboardParams)3327 MOS_STATUS VpRenderHdrKernel::GetScoreboardParams(PMHW_VFE_SCOREBOARD &scoreboardParams)
3328 {
3329     VP_FUNC_CALL();
3330 
3331     MOS_ZeroMemory(&m_scoreboardParams, sizeof(MHW_VFE_SCOREBOARD));
3332     m_scoreboardParams.ScoreboardMask = 0;
3333     m_scoreboardParams.ScoreboardType = 1;
3334     scoreboardParams                  = &m_scoreboardParams;
3335     return MOS_STATUS_SUCCESS;
3336 }
3337 
SetSurfaceParams(KERNEL_SURFACE_STATE_PARAM & surfParam,VP_SURFACE * layer,bool is32MWColorFillKern)3338 MOS_STATUS VpRenderHdrKernel::SetSurfaceParams(KERNEL_SURFACE_STATE_PARAM &surfParam, VP_SURFACE *layer, bool is32MWColorFillKern)
3339 {
3340     VP_FUNC_CALL();
3341     VP_RENDER_CHK_NULL_RETURN(layer);
3342 
3343     auto &renderSurfParams = surfParam.surfaceOverwriteParams.renderSurfaceParams;
3344     MOS_ZeroMemory(&renderSurfParams, sizeof(renderSurfParams));
3345 
3346     surfParam.surfaceOverwriteParams.updatedRenderSurfaces = true;
3347 
3348     // Render target or private surface
3349     if (layer->SurfType == SURF_OUT_RENDERTARGET)
3350     {
3351         // Set flags for RT
3352         surfParam.isOutput                  = true;
3353         renderSurfParams.isOutput           = true;
3354         renderSurfParams.bWidthInDword_Y    = true;
3355         renderSurfParams.bWidthInDword_UV   = true;
3356         renderSurfParams.Boundary           = RENDERHAL_SS_BOUNDARY_DSTRECT;
3357     }
3358     // other surfaces
3359     else
3360     {
3361         surfParam.isOutput                  = false;
3362         renderSurfParams.isOutput           = false;
3363         renderSurfParams.bWidthInDword_Y    = false;
3364         renderSurfParams.bWidthInDword_UV   = false;
3365         renderSurfParams.Boundary           = RENDERHAL_SS_BOUNDARY_SRCRECT;
3366     }
3367 
3368     renderSurfParams.b32MWColorFillKern = is32MWColorFillKern;
3369     renderSurfParams.Type               = m_hwInterface->m_renderHal->SurfaceTypeDefault;
3370     renderSurfParams.bAVS               = false;
3371 
3372     // Set interlacing flags
3373     switch (layer->SampleType)
3374     {
3375     case SAMPLE_INTERLEAVED_EVEN_FIRST_TOP_FIELD:
3376     case SAMPLE_INTERLEAVED_ODD_FIRST_TOP_FIELD:
3377         renderSurfParams.bVertStride     = true;
3378         renderSurfParams.bVertStrideOffs = 0;
3379         break;
3380     case SAMPLE_INTERLEAVED_EVEN_FIRST_BOTTOM_FIELD:
3381     case SAMPLE_INTERLEAVED_ODD_FIRST_BOTTOM_FIELD:
3382         renderSurfParams.bVertStride     = true;
3383         renderSurfParams.bVertStrideOffs = 1;
3384         break;
3385     default:
3386         renderSurfParams.bVertStride     = false;
3387         renderSurfParams.bVertStrideOffs = 0;
3388         break;
3389     }
3390 
3391     renderSurfParams.b2PlaneNV12NeededByKernel = true;
3392 
3393     VP_RENDER_NORMALMESSAGE("SurfaceTYpe %d, bAVS %d, b2PlaneNV12NeededByKernel %d",
3394         renderSurfParams.Type,
3395         renderSurfParams.bAVS,
3396         renderSurfParams.b2PlaneNV12NeededByKernel);
3397 
3398     return MOS_STATUS_SUCCESS;
3399 }
3400 
SetupSurfaceState()3401 MOS_STATUS VpRenderHdrKernel::SetupSurfaceState()
3402 {
3403     VP_FUNC_CALL();
3404 
3405     PRENDERHAL_INTERFACE  renderHal = nullptr;
3406     int32_t               iBTentry  = 0;
3407     bool                  bHasAutoModeLayer = false;
3408     uint32_t              i                 = 0;
3409     uint32_t              dwUpdateMask      = 0;
3410 
3411     VP_RENDER_CHK_NULL_RETURN(m_hwInterface);
3412     VP_RENDER_CHK_NULL_RETURN(m_hwInterface->m_renderHal);
3413     renderHal = m_hwInterface->m_renderHal;
3414     m_surfaceBindingIndex.clear();
3415     m_surfaceState.clear();
3416     UpdatePerLayerPipelineStates(&dwUpdateMask);
3417 
3418     for (i = 0; i < m_hdrParams->uSourceCount && i < VPHAL_MAX_HDR_INPUT_LAYER; i++)
3419     {
3420         KERNEL_SURFACE_STATE_PARAM surfParam = {};
3421         auto                       inputSrc  = m_surfaceGroup->find(SurfaceType(SurfaceTypeHdrInputLayer0 + i));
3422         VP_SURFACE *layer = (m_surfaceGroup->end() != inputSrc) ? inputSrc->second : nullptr;
3423         VP_RENDER_CHK_NULL_RETURN(layer);
3424 
3425         // Only need to specify binding index in surface parameters.
3426         surfParam.surfaceOverwriteParams.updatedSurfaceParams = true;
3427         surfParam.surfaceOverwriteParams.bindedKernel = true;
3428 
3429         UpdateCurbeBindingIndex(SurfaceType(SurfaceTypeHdrInputLayer0 + i), m_hdrParams->uSourceBindingTableIndex[i]);
3430         iBTentry                                   = m_hdrParams->uSourceBindingTableIndex[i];
3431 
3432         SetSurfaceParams(surfParam, layer, false);
3433 
3434         surfParam.surfaceOverwriteParams.renderSurfaceParams.MemObjCtl = m_surfMemCacheCtl.SourceSurfMemObjCtl;
3435 
3436         m_surfaceState.insert(std::make_pair(SurfaceType(SurfaceTypeHdrInputLayer0 + i), surfParam));
3437 
3438         auto OETF1DLUT = m_surfaceGroup->find(SurfaceType(SurfaceTypeHdrOETF1DLUTSurface0 + i));
3439         VP_SURFACE *OETF1DLUTSrc = (m_surfaceGroup->end() != OETF1DLUT) ? OETF1DLUT->second : nullptr;
3440 
3441         if (OETF1DLUTSrc && (m_hdrParams->OETF1DLUTAllocated || (dwUpdateMask & (1 << i)) || (dwUpdateMask & (1 << VPHAL_MAX_HDR_INPUT_LAYER))))
3442         {
3443             InitOETF1DLUT(m_hdrParams, i, OETF1DLUTSrc);
3444         }
3445 
3446         auto        Cri3DLUT     = m_surfaceGroup->find(SurfaceType(SurfaceTypeHdrCRI3DLUTSurface0 + i));
3447         VP_SURFACE *Cri3DLUTSrc = (m_surfaceGroup->end() != Cri3DLUT) ? Cri3DLUT->second : nullptr;
3448 
3449         if (Cri3DLUTSrc && (m_hdrParams->Cri3DLUTAllocated || (dwUpdateMask & (1 << i)) || (dwUpdateMask & (1 << VPHAL_MAX_HDR_INPUT_LAYER))) ||
3450             m_hdrParams->HdrMode[i] == VPHAL_HDR_MODE_TONE_MAPPING_AUTO_MODE)
3451         {
3452             InitCri3DLUT(m_hdrParams, i, Cri3DLUTSrc);
3453         }
3454 
3455         KERNEL_SURFACE_STATE_PARAM surfaceResource = {};
3456         surfaceResource.surfaceOverwriteParams.updatedSurfaceParams                         = true;
3457         surfaceResource.surfaceOverwriteParams.updatedRenderSurfaces                        = true;
3458         surfaceResource.surfaceOverwriteParams.bufferResource                               = false;
3459         surfaceResource.surfaceOverwriteParams.bindedKernel                                 = true;
3460 
3461         surfaceResource.surfaceOverwriteParams.renderSurfaceParams.MemObjCtl                = false;
3462         surfaceResource.surfaceOverwriteParams.renderSurfaceParams.Type                     = RENDERHAL_SURFACE_TYPE_G10;
3463         surfaceResource.surfaceOverwriteParams.renderSurfaceParams.isOutput                 = false;
3464         surfaceResource.surfaceOverwriteParams.renderSurfaceParams.bWidth16Align            = false;
3465         surfaceResource.surfaceOverwriteParams.renderSurfaceParams.Boundary                 = RENDERHAL_SS_BOUNDARY_ORIGINAL;
3466 
3467         if (m_hdrParams->LUTMode[i] == VPHAL_HDR_LUT_MODE_2D)
3468         {
3469             surfaceResource.surfaceOverwriteParams.renderSurfaceParams.MemObjCtl                = m_surfMemCacheCtl.Lut2DSurfMemObjCtl;
3470             UpdateCurbeBindingIndex(SurfaceType(SurfaceTypeHdrOETF1DLUTSurface0 + i), iBTentry + VPHAL_HDR_BTINDEX_OETF1DLUT_OFFSET);
3471             m_surfaceState.insert(std::make_pair(SurfaceType(SurfaceTypeHdrOETF1DLUTSurface0 + i), surfaceResource));
3472         }
3473         else if (m_hdrParams->LUTMode[i] == VPHAL_HDR_LUT_MODE_3D)
3474         {
3475             surfaceResource.surfaceOverwriteParams.renderSurfaceParams.MemObjCtl                = m_surfMemCacheCtl.Lut3DSurfMemObjCtl;
3476             UpdateCurbeBindingIndex(SurfaceType(SurfaceTypeHdrCRI3DLUTSurface0 + i), iBTentry + VPHAL_HDR_BTINDEX_CRI3DLUT_OFFSET);
3477             surfaceResource.surfaceOverwriteParams.renderSurfaceParams.bWidthInDword_Y          = false;
3478             surfaceResource.surfaceOverwriteParams.renderSurfaceParams.bWidthInDword_UV         = false;
3479             m_surfaceState.insert(std::make_pair(SurfaceType(SurfaceTypeHdrCRI3DLUTSurface0 + i), surfaceResource));
3480         }
3481     }
3482 
3483     for (i = 0; i < m_hdrParams->uTargetCount; ++i)
3484     {
3485         KERNEL_SURFACE_STATE_PARAM surfParam = {};
3486 
3487         surfParam.surfaceOverwriteParams.updatedSurfaceParams = true;
3488 
3489         // Only need to specify binding index in surface parameters.
3490         surfParam.surfaceOverwriteParams.bindedKernel = true;
3491         UpdateCurbeBindingIndex(SurfaceType(SurfaceTypeHdrTarget0 + i), m_hdrParams->uTargetBindingTableIndex[i]);
3492 
3493         iBTentry = m_hdrParams->uTargetBindingTableIndex[i];
3494         auto    outputSrc = m_surfaceGroup->find(SurfaceTypeHdrTarget0);
3495         VP_SURFACE *layer = (m_surfaceGroup->end() != outputSrc) ? outputSrc->second : nullptr;
3496         VP_RENDER_CHK_NULL_RETURN(layer);
3497         VP_RENDER_CHK_NULL_RETURN(layer->osSurface);
3498 
3499         layer->SurfType = SURF_OUT_RENDERTARGET;
3500 
3501         // Used for 32x32 Media walker kernel + Color fill kernel
3502         // Not valid for media object.
3503         bool is32MWColorFillKern =
3504             (m_hdrParams->pColorFillParams != nullptr &&
3505                 m_hdrParams->uSourceCount == 0 &&
3506                 m_renderHal->pHwSizes->dwSizeMediaWalkerBlock == 32);
3507 
3508         SetSurfaceParams(surfParam, layer, is32MWColorFillKern);
3509 
3510         surfParam.surfaceOverwriteParams.renderSurfaceParams.MemObjCtl = m_surfMemCacheCtl.TargetSurfMemObjCtl;
3511 
3512         m_surfaceState.insert(std::make_pair(SurfaceType(SurfaceTypeHdrTarget0 + i), surfParam));
3513 
3514         //update render GMM resource usage type
3515         m_allocator->UpdateResourceUsageType(&layer->osSurface->OsResource, MOS_HW_RESOURCE_USAGE_VP_OUTPUT_PICTURE_RENDER);
3516     }
3517 
3518     if (m_hdrParams->HdrMode[i] == VPHAL_HDR_MODE_TONE_MAPPING_AUTO_MODE)
3519     {
3520         bHasAutoModeLayer = true;
3521     }
3522 
3523     auto coeff = m_surfaceGroup->find(SurfaceTypeHdrCoeff);
3524     VP_SURFACE *coeffSrc = (m_surfaceGroup->end() != coeff) ? coeff->second : nullptr;
3525     VP_RENDER_CHK_NULL_RETURN(coeffSrc);
3526 
3527     if (dwUpdateMask || m_hdrParams->coeffAllocated)
3528     {
3529         HdrInitCoeff(m_hdrParams, coeffSrc);
3530     }
3531 
3532     KERNEL_SURFACE_STATE_PARAM surfCoeffParam = {};
3533 
3534     surfCoeffParam.surfaceOverwriteParams.updatedSurfaceParams = true;
3535     // Only need to specify binding index in surface parameters.
3536     surfCoeffParam.surfaceOverwriteParams.bindedKernel = true;
3537 
3538     surfCoeffParam.surfaceOverwriteParams.updatedRenderSurfaces        = true;
3539     surfCoeffParam.surfaceOverwriteParams.renderSurfaceParams.Type     = RENDERHAL_SURFACE_TYPE_G10;
3540     surfCoeffParam.surfaceOverwriteParams.renderSurfaceParams.isOutput      = false;
3541     surfCoeffParam.surfaceOverwriteParams.renderSurfaceParams.Boundary      = RENDERHAL_SS_BOUNDARY_ORIGINAL;
3542     surfCoeffParam.surfaceOverwriteParams.renderSurfaceParams.bWidth16Align = false;
3543     surfCoeffParam.surfaceOverwriteParams.renderSurfaceParams.MemObjCtl     = m_surfMemCacheCtl.CoeffSurfMemObjCtl;
3544 
3545     if (m_hdrParams->bUsingAutoModePipe && bHasAutoModeLayer)
3546     {
3547         UpdateCurbeBindingIndex(SurfaceTypeHdrAutoModeCoeff, VPHAL_HDR_BTINDEX_COEFF);
3548         m_surfaceState.insert(std::make_pair(SurfaceTypeHdrAutoModeCoeff, surfCoeffParam));
3549     }
3550     else
3551     {
3552         UpdateCurbeBindingIndex(SurfaceTypeHdrCoeff, VPHAL_HDR_BTINDEX_COEFF);
3553         m_surfaceState.insert(std::make_pair(SurfaceTypeHdrCoeff, surfCoeffParam));
3554     }
3555 
3556     return MOS_STATUS_SUCCESS;
3557 }
3558 
GetCurbeState(void * & curbe,uint32_t & curbeLength)3559 MOS_STATUS VpRenderHdrKernel::GetCurbeState(void *&curbe, uint32_t &curbeLength)
3560 {
3561     VP_FUNC_CALL();
3562 
3563     MOS_STATUS                      eStatus             = MOS_STATUS_SUCCESS;
3564     PRENDERHAL_INTERFACE            pRenderHal          = nullptr;
3565     PVP_SURFACE                     pSource             = nullptr;
3566     VPHAL_HDR_FORMAT_DESCRIPTOR  FormatDescriptor    = VPHAL_HDR_FORMAT_DESCRIPTOR_UNKNOW;
3567     VPHAL_HDR_ROTATION           HdrRotation         = VPHAL_HDR_LAYER_ROTATION_0;
3568     VPHAL_HDR_TWO_LAYER_OPTION   HdrTwoLayerOp       = VPHAL_HDR_TWO_LAYER_OPTION_SBLEND;
3569     uint32_t                        ChromaSiting        = 0;
3570     bool                            bChannelSwap        = false;
3571     bool                            bBypassIEF          = true;
3572     bool                            b3dLut              = false;
3573     uint32_t                        uiSamplerStateIndex = 0;
3574     uint32_t                        uiSamplerStateIndex2= 0;
3575     uint16_t                        wAlpha              = 0;
3576     uint32_t                        i                   = 0;
3577     uint32_t                        dwDestRectWidth     = 0;
3578     uint32_t                        dwDestRectHeight    = 0;  // Target rectangle Width Height
3579 
3580     float                           fScaleX = 0.0f, fScaleY = 0.0f;         // x,y scaling factor
3581     float                           fStepX = 0.0f, fStepY = 0.0f;           // x,y scaling steps
3582     float                           fOriginX = 0.0f, fOriginY = 0.0f;       // x,y layer origin
3583     float                           fShiftX = 0.0f, fShiftY = 0.0f;         // x,y shift
3584 
3585     m_hdrCurbe    = g_cInit_MEDIA_STATIC_HDR;
3586     HdrTwoLayerOp = VPHAL_HDR_TWO_LAYER_OPTION_SBLEND;
3587     HdrRotation   = VPHAL_HDR_LAYER_ROTATION_0;
3588     wAlpha        = 0x0ff;
3589     uiSamplerStateIndex = uiSamplerStateIndex2 = 0;
3590 
3591     auto        target         = m_surfaceGroup->find(SurfaceTypeHdrTarget0);
3592     VP_SURFACE *targetSurf = (m_surfaceGroup->end() != target) ? target->second : nullptr;
3593     VP_RENDER_CHK_NULL_RETURN(targetSurf);
3594     VP_RENDER_CHK_NULL_RETURN(targetSurf->osSurface);
3595 
3596     for (i = 0; i < m_hdrParams->uSourceCount; i++)
3597     {
3598         if (i >= VPHAL_MAX_HDR_INPUT_LAYER)
3599         {
3600             return MOS_STATUS_INVALID_PARAMETER;
3601         }
3602         auto it = m_surfaceGroup->find(SurfaceType(SurfaceTypeHdrInputLayer0 + i));
3603         pSource = (m_surfaceGroup->end() != it) ? it->second : nullptr;
3604         VP_RENDER_CHK_NULL_RETURN(pSource);
3605         VP_RENDER_CHK_NULL_RETURN(pSource->osSurface);
3606 
3607         bChannelSwap  = false;
3608         bBypassIEF    = true;
3609 
3610         fShiftX = 0;
3611         fShiftY = 0;
3612 
3613         // Source rectangle is pre-rotated, destination rectangle is post-rotated.
3614         if (m_hdrParams->Rotation == VPHAL_ROTATION_IDENTITY    ||
3615             m_hdrParams->Rotation == VPHAL_ROTATION_180         ||
3616             m_hdrParams->Rotation == VPHAL_MIRROR_HORIZONTAL    ||
3617             m_hdrParams->Rotation == VPHAL_MIRROR_VERTICAL)
3618         {
3619             fScaleX      = (float)(pSource->rcDst.right  - pSource->rcDst.left) /
3620                            (float)(pSource->rcSrc.right  - pSource->rcSrc.left);
3621             fScaleY      = (float)(pSource->rcDst.bottom - pSource->rcDst.top) /
3622                            (float)(pSource->rcSrc.bottom - pSource->rcSrc.top);
3623         }
3624         else
3625         {
3626             // VPHAL_ROTATION_90 || VPHAL_ROTATION_270 ||
3627             // VPHAL_ROTATE_90_MIRROR_HORIZONTAL || VPHAL_ROTATE_90_MIRROR_VERTICAL
3628             fScaleX      = (float)(pSource->rcDst.right  - pSource->rcDst.left) /
3629                            (float)(pSource->rcSrc.bottom - pSource->rcSrc.top);
3630             fScaleY      = (float)(pSource->rcDst.bottom - pSource->rcDst.top) /
3631                            (float)(pSource->rcSrc.right  - pSource->rcSrc.left);
3632         }
3633 
3634         if (fScaleX == 1.0f && fScaleY == 1.0f && m_hdrParams->ScalingMode == VPHAL_SCALING_BILINEAR)
3635         {
3636             m_hdrParams->ScalingMode = VPHAL_SCALING_NEAREST;
3637         }
3638 
3639         if (m_hdrParams->ScalingMode == VPHAL_SCALING_AVS)
3640         {
3641             uiSamplerStateIndex = VPHAL_HDR_AVS_SAMPLER_STATE_ADAPTIVE;
3642 
3643             if (pSource->osSurface->Format == Format_P010 ||
3644                 pSource->osSurface->Format == Format_P016)
3645             {
3646                 uiSamplerStateIndex2 = VPHAL_HDR_AVS_SAMPLER_STATE_ADAPTIVE;
3647             }
3648         }
3649         else if (m_hdrParams->ScalingMode == VPHAL_SCALING_BILINEAR)
3650         {
3651             uiSamplerStateIndex = VPHAL_HDR_3D_SAMPLER_STATE_BILINEAR;
3652 
3653             if (pSource->osSurface->Format == Format_P010 ||
3654                 pSource->osSurface->Format == Format_P016)
3655             {
3656                 uiSamplerStateIndex2 = VPHAL_HDR_3D_SAMPLER_STATE_BILINEAR;
3657             }
3658 
3659             fShiftX = VP_HW_LINEAR_SHIFT;
3660             fShiftY = VP_HW_LINEAR_SHIFT;
3661         }
3662         else
3663         {
3664             uiSamplerStateIndex = VPHAL_HDR_3D_SAMPLER_STATE_NEAREST;
3665 
3666             if (pSource->osSurface->Format == Format_P010 ||
3667                 pSource->osSurface->Format == Format_P016)
3668             {
3669                 uiSamplerStateIndex2 = VPHAL_HDR_3D_SAMPLER_STATE_BILINEAR;
3670             }
3671 
3672             fShiftX = VP_HW_LINEAR_SHIFT;
3673             fShiftY = VP_HW_LINEAR_SHIFT;
3674         }
3675 
3676         // Normalize source co-ordinates using the width and height programmed
3677         // in surface state. step X, Y pre-rotated
3678         // Source rectangle is pre-rotated, destination rectangle is post-rotated.
3679         if (m_hdrParams->Rotation == VPHAL_ROTATION_IDENTITY ||
3680             m_hdrParams->Rotation == VPHAL_ROTATION_180 ||
3681             m_hdrParams->Rotation == VPHAL_MIRROR_HORIZONTAL ||
3682             m_hdrParams->Rotation == VPHAL_MIRROR_VERTICAL)
3683         {
3684             fStepX = ((pSource->rcSrc.right - pSource->rcSrc.left) * 1.0f) /
3685                       ((pSource->rcDst.right - pSource->rcDst.left) > 0 ?
3686                        (pSource->rcDst.right - pSource->rcDst.left) : 1);
3687             fStepY = ((float)(pSource->rcSrc.bottom - pSource->rcSrc.top)) /
3688                       ((pSource->rcDst.bottom - pSource->rcDst.top) > 0 ?
3689                        (float)(pSource->rcDst.bottom - pSource->rcDst.top) : 1.0f);
3690         }
3691         else
3692         {
3693             // VPHAL_ROTATION_90 || VPHAL_ROTATION_270 ||
3694             // VPHAL_ROTATE_90_MIRROR_HORIZONTAL || VPHAL_ROTATE_90_MIRROR_VERTICAL
3695             fStepX = ((pSource->rcSrc.right - pSource->rcSrc.left) * 1.0f) /
3696                       ((pSource->rcDst.bottom - pSource->rcDst.top) > 0 ?
3697                        (pSource->rcDst.bottom - pSource->rcDst.top) : 1);
3698             fStepY = ((float)(pSource->rcSrc.bottom - pSource->rcSrc.top)) /
3699                       ((pSource->rcDst.right - pSource->rcDst.left) > 0 ?
3700                        (float)(pSource->rcDst.right - pSource->rcDst.left) : 1.0f);
3701         }
3702 
3703         dwDestRectWidth  = targetSurf->osSurface->dwWidth;
3704         dwDestRectHeight = targetSurf->osSurface->dwHeight;
3705 
3706         switch (m_hdrParams->Rotation)
3707         {
3708             case VPHAL_ROTATION_IDENTITY:
3709                 // Coordinate adjustment for render target coordinates (0,0)
3710                 fShiftX  -= pSource->rcDst.left;
3711                 fShiftY  -= pSource->rcDst.top;
3712                 break;
3713             case VPHAL_ROTATION_90:
3714                 // Coordinate adjustment for 90 degree rotation
3715                 fShiftX  -= (float)pSource->rcDst.top;
3716                 fShiftY  -= (float)dwDestRectWidth -
3717                             (float)(pSource->rcSrc.bottom - pSource->rcSrc.top) * fScaleX -
3718                             (float)pSource->rcDst.left;
3719                 break;
3720             case VPHAL_ROTATION_180:
3721                 // Coordinate adjustment for 180 degree rotation
3722                 fShiftX  -= (float)dwDestRectWidth -
3723                             (float)(pSource->rcSrc.right - pSource->rcSrc.left) * fScaleX -
3724                             (float)pSource->rcDst.left;
3725                 fShiftY  -= (float)dwDestRectHeight -
3726                             (float)(pSource->rcSrc.bottom - pSource->rcSrc.top) * fScaleY -
3727                             (float)pSource->rcDst.top;
3728                 break;
3729             case VPHAL_ROTATION_270:
3730                 // Coordinate adjustment for 270 degree rotation
3731                 fShiftX  -= (float)dwDestRectHeight -
3732                             (float)(pSource->rcSrc.right - pSource->rcSrc.left) * fScaleY -
3733                             (float)pSource->rcDst.top;
3734                 fShiftY  -= (float)pSource->rcDst.left;
3735                 break;
3736             case VPHAL_MIRROR_HORIZONTAL:
3737                 // Coordinate adjustment for horizontal mirroring
3738                 fShiftX  -= (float)dwDestRectWidth -
3739                             (float)(pSource->rcSrc.right - pSource->rcSrc.left) * fScaleX -
3740                             (float)pSource->rcDst.left;
3741                 fShiftY  -= pSource->rcDst.top;
3742                 break;
3743             case VPHAL_MIRROR_VERTICAL:
3744                 // Coordinate adjustment for vertical mirroring
3745                 fShiftX  -= pSource->rcDst.left;
3746                 fShiftY  -= (float)dwDestRectHeight -
3747                             (float)(pSource->rcSrc.bottom - pSource->rcSrc.top) * fScaleY -
3748                             (float)pSource->rcDst.top;
3749                 break;
3750             case VPHAL_ROTATE_90_MIRROR_HORIZONTAL:
3751                 // Coordinate adjustment for rotating 90 and horizontal mirroring
3752                 fShiftX  -= (float)pSource->rcDst.top;
3753                 fShiftY  -= (float)pSource->rcDst.left;
3754                 break;
3755             case VPHAL_ROTATE_90_MIRROR_VERTICAL:
3756             default:
3757                 // Coordinate adjustment for rotating 90 and vertical mirroring
3758                 fShiftX  -= (float)dwDestRectHeight -
3759                             (float)(pSource->rcSrc.right - pSource->rcSrc.left) * fScaleY -
3760                             (float)pSource->rcDst.top;
3761                 fShiftY  -= (float)dwDestRectWidth -
3762                             (float)(pSource->rcSrc.bottom - pSource->rcSrc.top) * fScaleX -
3763                             (float)pSource->rcDst.left;
3764                 break;
3765         } // switch
3766 
3767         fOriginX = ((float)pSource->rcSrc.left + fShiftX * fStepX) / (float)MOS_MIN(pSource->osSurface->dwWidth, (uint32_t)pSource->rcSrc.right);
3768         fOriginY = ((float)pSource->rcSrc.top + fShiftY * fStepY) / (float)MOS_MIN(pSource->osSurface->dwHeight, (uint32_t)pSource->rcSrc.bottom);
3769 
3770         fStepX /= MOS_MIN(pSource->osSurface->dwWidth, (uint32_t)pSource->rcSrc.right);
3771         fStepY /= MOS_MIN(pSource->osSurface->dwHeight, (uint32_t)pSource->rcSrc.bottom);
3772 
3773         FormatDescriptor = GetFormatDescriptor(pSource->osSurface->Format);
3774 
3775         if (FormatDescriptor == VPHAL_HDR_FORMAT_DESCRIPTOR_UNKNOW)
3776         {
3777             VP_RENDER_VERBOSEMESSAGE("Unsupported hdr input format");
3778             return MOS_STATUS_INVALID_PARAMETER;
3779         }
3780 
3781         // Chroma siting setting in curbe data will only take effect in 1x scaling case when 3D sampler is being used
3782         // For other cases, Chroma siting will be performed by AVS coefficients, and the here will be ignored by kernel
3783         ChromaSiting = GetHdrChromaSiting(pSource->ChromaSiting);
3784 
3785         if (pSource->osSurface->Format == Format_B10G10R10A2 ||
3786             pSource->osSurface->Format == Format_A8R8G8B8 ||
3787             pSource->osSurface->Format == Format_X8R8G8B8 ||
3788             pSource->osSurface->Format == Format_A16R16G16B16F)
3789         {
3790             bChannelSwap = true;
3791         }
3792 
3793         if (m_hdrParams->pIEFParams)
3794         {
3795             if (m_hdrParams->pIEFParams->bEnabled)
3796             {
3797                 bBypassIEF = false;
3798             }
3799         }
3800 
3801         HdrRotation = GetHdrRotation(m_hdrParams->Rotation);
3802 
3803         b3dLut = (m_hdrParams->LUTMode[i] == VPHAL_HDR_LUT_MODE_3D ? true : false);
3804 
3805         switch (i)
3806         {
3807         case 0:
3808             m_hdrCurbe.DW0.HorizontalFrameOriginLayer0       = fOriginX;
3809             m_hdrCurbe.DW8.VerticalFrameOriginLayer0         = fOriginY;
3810             m_hdrCurbe.DW16.HorizontalScalingStepRatioLayer0 = fStepX;
3811             m_hdrCurbe.DW24.VerticalScalingStepRatioLayer0   = fStepY;
3812             m_hdrCurbe.DW32.LeftCoordinateRectangleLayer0    = pSource->rcDst.left;
3813             m_hdrCurbe.DW32.TopCoordinateRectangleLayer0     = pSource->rcDst.top;
3814             m_hdrCurbe.DW40.RightCoordinateRectangleLayer0   = pSource->rcDst.right - 1;
3815             m_hdrCurbe.DW40.BottomCoordinateRectangleLayer0  = pSource->rcDst.bottom - 1;
3816             m_hdrCurbe.DW48.FormatDescriptorLayer0           = FormatDescriptor;
3817             m_hdrCurbe.DW48.ChromaSittingLocationLayer0      = ChromaSiting;
3818             m_hdrCurbe.DW48.ChannelSwapEnablingFlagLayer0    = bChannelSwap;
3819             m_hdrCurbe.DW48.IEFBypassEnablingFlagLayer0      = bBypassIEF;
3820             m_hdrCurbe.DW48.RotationAngleMirrorDirectionLayer0 = HdrRotation;
3821             m_hdrCurbe.DW48.SamplerIndexFirstPlaneLayer0       = uiSamplerStateIndex;
3822             if (pSource->osSurface->Format == Format_P010 ||
3823                 pSource->osSurface->Format == Format_P016)
3824             {
3825                 m_hdrCurbe.DW48.SamplerIndexSecondThirdPlaneLayer0 = uiSamplerStateIndex2;
3826             }
3827             m_hdrCurbe.DW48.CCMExtensionEnablingFlagLayer0     = m_hdrParams->StageEnableFlags[i].CCMExt1Enable ||
3828                                                                 m_hdrParams->StageEnableFlags[i].CCMExt2Enable;
3829             m_hdrCurbe.DW48.ToneMappingEnablingFlagLayer0      = m_hdrParams->StageEnableFlags[i].PWLFEnable;
3830             m_hdrCurbe.DW48.PriorCSCEnablingFlagLayer0         = m_hdrParams->StageEnableFlags[i].PriorCSCEnable;
3831             m_hdrCurbe.DW48.EOTF1DLUTEnablingFlagLayer0        = m_hdrParams->StageEnableFlags[i].EOTFEnable;
3832             m_hdrCurbe.DW48.CCMEnablingFlagLayer0              = m_hdrParams->StageEnableFlags[i].CCMEnable;
3833             m_hdrCurbe.DW48.OETF1DLUTEnablingFlagLayer0        = m_hdrParams->StageEnableFlags[i].OETFEnable;
3834             m_hdrCurbe.DW48.PostCSCEnablingFlagLayer0          = m_hdrParams->StageEnableFlags[i].PostCSCEnable;
3835             m_hdrCurbe.DW48.Enabling3DLUTFlagLayer0            = b3dLut;
3836             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND ||
3837                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND ||
3838                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND)
3839             {
3840                 m_hdrCurbe.DW56.ConstantBlendingAlphaFillColorLayer0 = wAlpha;
3841             }
3842             m_hdrCurbe.DW58.TwoLayerOperationLayer0              = VPHAL_HDR_TWO_LAYER_OPTION_COMP;
3843             if (pSource->SurfType == SURF_IN_PRIMARY                &&
3844                 m_hdrParams->pBlendingParams                        &&
3845                 m_hdrParams->pBlendingParams->BlendType == BLEND_SOURCE &&
3846                 (IS_RGB_CSPACE(pSource->ColorSpace) || IS_COLOR_SPACE_BT2020_RGB(pSource->ColorSpace)))
3847             {
3848                 // For PDVD alpha blending issue:
3849                 // If first frame is sRGB/stRGB/BT2020RGB format delivered as primary layer
3850                 // (which means main video content is in the first layer)
3851                 // and blend-type set as source blending,
3852                 // do source blending w/ bg, instead of setting as composite.
3853                 m_hdrCurbe.DW58.TwoLayerOperationLayer0 = VPHAL_HDR_TWO_LAYER_OPTION_SBLEND;
3854             }
3855             break;
3856         case 1:
3857             m_hdrCurbe.DW1.HorizontalFrameOriginLayer1       = fOriginX;
3858             m_hdrCurbe.DW9.VerticalFrameOriginLayer1         = fOriginY;
3859             m_hdrCurbe.DW17.HorizontalScalingStepRatioLayer1 = fStepX;
3860             m_hdrCurbe.DW25.VerticalScalingStepRatioLayer1   = fStepY;
3861             m_hdrCurbe.DW33.LeftCoordinateRectangleLayer1    = pSource->rcDst.left;
3862             m_hdrCurbe.DW33.TopCoordinateRectangleLayer1     = pSource->rcDst.top;
3863             m_hdrCurbe.DW41.RightCoordinateRectangleLayer1   = pSource->rcDst.right - 1;
3864             m_hdrCurbe.DW41.BottomCoordinateRectangleLayer1  = pSource->rcDst.bottom - 1;
3865             m_hdrCurbe.DW49.FormatDescriptorLayer1           = FormatDescriptor;
3866             m_hdrCurbe.DW49.ChromaSittingLocationLayer1      = ChromaSiting;
3867             m_hdrCurbe.DW49.ChannelSwapEnablingFlagLayer1    = bChannelSwap;
3868             m_hdrCurbe.DW49.IEFBypassEnablingFlagLayer1      = bBypassIEF;
3869             m_hdrCurbe.DW49.RotationAngleMirrorDirectionLayer1 = HdrRotation;
3870             m_hdrCurbe.DW49.SamplerIndexFirstPlaneLayer1       = uiSamplerStateIndex;
3871             if (pSource->osSurface->Format == Format_P010 ||
3872                 pSource->osSurface->Format == Format_P016)
3873             {
3874                 m_hdrCurbe.DW49.SamplerIndexSecondThirdPlaneLayer1 = uiSamplerStateIndex2;
3875             }
3876             m_hdrCurbe.DW49.CCMExtensionEnablingFlagLayer1     = m_hdrParams->StageEnableFlags[i].CCMExt1Enable ||
3877                                                                 m_hdrParams->StageEnableFlags[i].CCMExt2Enable;
3878             m_hdrCurbe.DW49.ToneMappingEnablingFlagLayer1      = m_hdrParams->StageEnableFlags[i].PWLFEnable;
3879             m_hdrCurbe.DW49.PriorCSCEnablingFlagLayer1         = m_hdrParams->StageEnableFlags[i].PriorCSCEnable;
3880             m_hdrCurbe.DW49.EOTF1DLUTEnablingFlagLayer1        = m_hdrParams->StageEnableFlags[i].EOTFEnable;
3881             m_hdrCurbe.DW49.CCMEnablingFlagLayer1              = m_hdrParams->StageEnableFlags[i].CCMEnable;
3882             m_hdrCurbe.DW49.OETF1DLUTEnablingFlagLayer1        = m_hdrParams->StageEnableFlags[i].OETFEnable;
3883             m_hdrCurbe.DW49.PostCSCEnablingFlagLayer1          = m_hdrParams->StageEnableFlags[i].PostCSCEnable;
3884             m_hdrCurbe.DW49.Enabling3DLUTFlagLayer1            = b3dLut;
3885             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND ||
3886                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND ||
3887                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND)
3888             {
3889                 m_hdrCurbe.DW56.ConstantBlendingAlphaFillColorLayer1 = wAlpha;
3890             }
3891             m_hdrCurbe.DW58.TwoLayerOperationLayer1              = HdrTwoLayerOp;
3892             break;
3893         case 2:
3894             m_hdrCurbe.DW2.HorizontalFrameOriginLayer2       = fOriginX;
3895             m_hdrCurbe.DW10.VerticalFrameOriginLayer2        = fOriginY;
3896             m_hdrCurbe.DW18.HorizontalScalingStepRatioLayer2 = fStepX;
3897             m_hdrCurbe.DW26.VerticalScalingStepRatioLayer2   = fStepY;
3898             m_hdrCurbe.DW34.LeftCoordinateRectangleLayer2    = pSource->rcDst.left;
3899             m_hdrCurbe.DW34.TopCoordinateRectangleLayer2     = pSource->rcDst.top;
3900             m_hdrCurbe.DW42.RightCoordinateRectangleLayer2   = pSource->rcDst.right - 1;
3901             m_hdrCurbe.DW42.BottomCoordinateRectangleLayer2  = pSource->rcDst.bottom - 1;
3902             m_hdrCurbe.DW50.FormatDescriptorLayer2           = FormatDescriptor;
3903             m_hdrCurbe.DW50.ChromaSittingLocationLayer2      = ChromaSiting;
3904             m_hdrCurbe.DW50.ChannelSwapEnablingFlagLayer2    = bChannelSwap;
3905             m_hdrCurbe.DW50.IEFBypassEnablingFlagLayer2      = bBypassIEF;
3906             m_hdrCurbe.DW50.RotationAngleMirrorDirectionLayer2 = HdrRotation;
3907             m_hdrCurbe.DW50.SamplerIndexFirstPlaneLayer2       = uiSamplerStateIndex;
3908             if (pSource->osSurface->Format == Format_P010 ||
3909                 pSource->osSurface->Format == Format_P016)
3910             {
3911                 m_hdrCurbe.DW50.SamplerIndexSecondThirdPlaneLayer2 = uiSamplerStateIndex2;
3912             }
3913             m_hdrCurbe.DW50.CCMExtensionEnablingFlagLayer2     = m_hdrParams->StageEnableFlags[i].CCMExt1Enable ||
3914                                                                 m_hdrParams->StageEnableFlags[i].CCMExt2Enable;
3915             m_hdrCurbe.DW50.ToneMappingEnablingFlagLayer2      = m_hdrParams->StageEnableFlags[i].PWLFEnable;
3916             m_hdrCurbe.DW50.PriorCSCEnablingFlagLayer2         = m_hdrParams->StageEnableFlags[i].PriorCSCEnable;
3917             m_hdrCurbe.DW50.EOTF1DLUTEnablingFlagLayer2        = m_hdrParams->StageEnableFlags[i].EOTFEnable;
3918             m_hdrCurbe.DW50.CCMEnablingFlagLayer2              = m_hdrParams->StageEnableFlags[i].CCMEnable;
3919             m_hdrCurbe.DW50.OETF1DLUTEnablingFlagLayer2        = m_hdrParams->StageEnableFlags[i].OETFEnable;
3920             m_hdrCurbe.DW50.PostCSCEnablingFlagLayer2          = m_hdrParams->StageEnableFlags[i].PostCSCEnable;
3921             m_hdrCurbe.DW50.Enabling3DLUTFlagLayer2            = b3dLut;
3922             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND ||
3923                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND ||
3924                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND)
3925             {
3926                 m_hdrCurbe.DW56.ConstantBlendingAlphaFillColorLayer2 = wAlpha;
3927             }
3928             m_hdrCurbe.DW58.TwoLayerOperationLayer2              = HdrTwoLayerOp;
3929             break;
3930         case 3:
3931             m_hdrCurbe.DW3.HorizontalFrameOriginLayer3       = fOriginX;
3932             m_hdrCurbe.DW11.VerticalFrameOriginLayer3        = fOriginY;
3933             m_hdrCurbe.DW19.HorizontalScalingStepRatioLayer3 = fStepX;
3934             m_hdrCurbe.DW27.VerticalScalingStepRatioLayer3   = fStepY;
3935             m_hdrCurbe.DW35.LeftCoordinateRectangleLayer3    = pSource->rcDst.left;
3936             m_hdrCurbe.DW35.TopCoordinateRectangleLayer3     = pSource->rcDst.top;
3937             m_hdrCurbe.DW43.RightCoordinateRectangleLayer3   = pSource->rcDst.right - 1;
3938             m_hdrCurbe.DW43.BottomCoordinateRectangleLayer3  = pSource->rcDst.bottom - 1;
3939             m_hdrCurbe.DW51.FormatDescriptorLayer3           = FormatDescriptor;
3940             m_hdrCurbe.DW51.ChromaSittingLocationLayer3      = ChromaSiting;
3941             m_hdrCurbe.DW51.ChannelSwapEnablingFlagLayer3    = bChannelSwap;
3942             m_hdrCurbe.DW51.IEFBypassEnablingFlagLayer3      = bBypassIEF;
3943             m_hdrCurbe.DW51.RotationAngleMirrorDirectionLayer3 = HdrRotation;
3944             m_hdrCurbe.DW51.SamplerIndexFirstPlaneLayer3       = uiSamplerStateIndex;
3945             if (pSource->osSurface->Format == Format_P010 ||
3946                 pSource->osSurface->Format == Format_P016)
3947             {
3948                 m_hdrCurbe.DW51.SamplerIndexSecondThirdPlaneLayer3 = uiSamplerStateIndex2;
3949             }
3950             m_hdrCurbe.DW51.CCMExtensionEnablingFlagLayer3     = m_hdrParams->StageEnableFlags[i].CCMExt1Enable ||
3951                                                                 m_hdrParams->StageEnableFlags[i].CCMExt2Enable;
3952             m_hdrCurbe.DW51.ToneMappingEnablingFlagLayer3      = m_hdrParams->StageEnableFlags[i].PWLFEnable;
3953             m_hdrCurbe.DW51.PriorCSCEnablingFlagLayer3         = m_hdrParams->StageEnableFlags[i].PriorCSCEnable;
3954             m_hdrCurbe.DW51.EOTF1DLUTEnablingFlagLayer3        = m_hdrParams->StageEnableFlags[i].EOTFEnable;
3955             m_hdrCurbe.DW51.CCMEnablingFlagLayer3              = m_hdrParams->StageEnableFlags[i].CCMEnable;
3956             m_hdrCurbe.DW51.OETF1DLUTEnablingFlagLayer3        = m_hdrParams->StageEnableFlags[i].OETFEnable;
3957             m_hdrCurbe.DW51.PostCSCEnablingFlagLayer3          = m_hdrParams->StageEnableFlags[i].PostCSCEnable;
3958             m_hdrCurbe.DW51.Enabling3DLUTFlagLayer3            = b3dLut;
3959             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND ||
3960                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND ||
3961                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND)
3962             {
3963                 m_hdrCurbe.DW56.ConstantBlendingAlphaFillColorLayer3 = wAlpha;
3964             }
3965             m_hdrCurbe.DW58.TwoLayerOperationLayer3              = HdrTwoLayerOp;
3966             break;
3967         case 4:
3968             m_hdrCurbe.DW4.HorizontalFrameOriginLayer4       = fOriginX;
3969             m_hdrCurbe.DW12.VerticalFrameOriginLayer4        = fOriginY;
3970             m_hdrCurbe.DW20.HorizontalScalingStepRatioLayer4 = fStepX;
3971             m_hdrCurbe.DW28.VerticalScalingStepRatioLayer4   = fStepY;
3972             m_hdrCurbe.DW36.LeftCoordinateRectangleLayer4    = pSource->rcDst.left;
3973             m_hdrCurbe.DW36.TopCoordinateRectangleLayer4     = pSource->rcDst.top;
3974             m_hdrCurbe.DW44.RightCoordinateRectangleLayer4   = pSource->rcDst.right - 1;
3975             m_hdrCurbe.DW44.BottomCoordinateRectangleLayer4  = pSource->rcDst.bottom - 1;
3976             m_hdrCurbe.DW52.FormatDescriptorLayer4           = FormatDescriptor;
3977             m_hdrCurbe.DW52.ChromaSittingLocationLayer4      = ChromaSiting;
3978             m_hdrCurbe.DW52.ChannelSwapEnablingFlagLayer4    = bChannelSwap;
3979             m_hdrCurbe.DW52.IEFBypassEnablingFlagLayer4      = bBypassIEF;
3980             m_hdrCurbe.DW52.RotationAngleMirrorDirectionLayer4 = HdrRotation;
3981             m_hdrCurbe.DW52.SamplerIndexFirstPlaneLayer4       = uiSamplerStateIndex;
3982             if (pSource->osSurface->Format == Format_P010 ||
3983                 pSource->osSurface->Format == Format_P016)
3984             {
3985                 m_hdrCurbe.DW52.SamplerIndexSecondThirdPlaneLayer4 = uiSamplerStateIndex2;
3986             }
3987             m_hdrCurbe.DW52.CCMExtensionEnablingFlagLayer4     = m_hdrParams->StageEnableFlags[i].CCMExt1Enable ||
3988                                                                 m_hdrParams->StageEnableFlags[i].CCMExt2Enable;
3989             m_hdrCurbe.DW52.ToneMappingEnablingFlagLayer4      = m_hdrParams->StageEnableFlags[i].PWLFEnable;
3990             m_hdrCurbe.DW52.PriorCSCEnablingFlagLayer4         = m_hdrParams->StageEnableFlags[i].PriorCSCEnable;
3991             m_hdrCurbe.DW52.EOTF1DLUTEnablingFlagLayer4        = m_hdrParams->StageEnableFlags[i].EOTFEnable;
3992             m_hdrCurbe.DW52.CCMEnablingFlagLayer4              = m_hdrParams->StageEnableFlags[i].CCMEnable;
3993             m_hdrCurbe.DW52.OETF1DLUTEnablingFlagLayer4        = m_hdrParams->StageEnableFlags[i].OETFEnable;
3994             m_hdrCurbe.DW52.PostCSCEnablingFlagLayer4          = m_hdrParams->StageEnableFlags[i].PostCSCEnable;
3995             m_hdrCurbe.DW52.Enabling3DLUTFlagLayer4            = b3dLut;
3996             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND ||
3997                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND ||
3998                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND)
3999             {
4000                 m_hdrCurbe.DW57.ConstantBlendingAlphaFillColorLayer4 = wAlpha;
4001             }
4002             m_hdrCurbe.DW59.TwoLayerOperationLayer4              = HdrTwoLayerOp;
4003             break;
4004         case 5:
4005             m_hdrCurbe.DW5.HorizontalFrameOriginLayer5       = fOriginX;
4006             m_hdrCurbe.DW13.VerticalFrameOriginLayer5        = fOriginY;
4007             m_hdrCurbe.DW21.HorizontalScalingStepRatioLayer5 = fStepX;
4008             m_hdrCurbe.DW29.VerticalScalingStepRatioLayer5   = fStepY;
4009             m_hdrCurbe.DW37.LeftCoordinateRectangleLayer5    = pSource->rcDst.left;
4010             m_hdrCurbe.DW37.TopCoordinateRectangleLayer5     = pSource->rcDst.top;
4011             m_hdrCurbe.DW45.RightCoordinateRectangleLayer5   = pSource->rcDst.right - 1;
4012             m_hdrCurbe.DW45.BottomCoordinateRectangleLayer5  = pSource->rcDst.bottom - 1;
4013             m_hdrCurbe.DW53.FormatDescriptorLayer5           = FormatDescriptor;
4014             m_hdrCurbe.DW53.ChromaSittingLocationLayer5      = ChromaSiting;
4015             m_hdrCurbe.DW53.ChannelSwapEnablingFlagLayer5    = bChannelSwap;
4016             m_hdrCurbe.DW53.IEFBypassEnablingFlagLayer5      = bBypassIEF;
4017             m_hdrCurbe.DW53.RotationAngleMirrorDirectionLayer5 = HdrRotation;
4018             m_hdrCurbe.DW53.SamplerIndexFirstPlaneLayer5       = uiSamplerStateIndex;
4019             if (pSource->osSurface->Format == Format_P010 ||
4020                 pSource->osSurface->Format == Format_P016)
4021             {
4022                 m_hdrCurbe.DW53.SamplerIndexSecondThirdPlaneLayer5 = uiSamplerStateIndex2;
4023             }
4024             m_hdrCurbe.DW53.CCMExtensionEnablingFlagLayer5     = m_hdrParams->StageEnableFlags[i].CCMExt1Enable ||
4025                                                                 m_hdrParams->StageEnableFlags[i].CCMExt2Enable;
4026             m_hdrCurbe.DW53.ToneMappingEnablingFlagLayer5      = m_hdrParams->StageEnableFlags[i].PWLFEnable;
4027             m_hdrCurbe.DW53.PriorCSCEnablingFlagLayer5         = m_hdrParams->StageEnableFlags[i].PriorCSCEnable;
4028             m_hdrCurbe.DW53.EOTF1DLUTEnablingFlagLayer5        = m_hdrParams->StageEnableFlags[i].EOTFEnable;
4029             m_hdrCurbe.DW53.CCMEnablingFlagLayer5              = m_hdrParams->StageEnableFlags[i].CCMEnable;
4030             m_hdrCurbe.DW53.OETF1DLUTEnablingFlagLayer5        = m_hdrParams->StageEnableFlags[i].OETFEnable;
4031             m_hdrCurbe.DW53.PostCSCEnablingFlagLayer5          = m_hdrParams->StageEnableFlags[i].PostCSCEnable;
4032             m_hdrCurbe.DW53.Enabling3DLUTFlagLayer5            = b3dLut;
4033             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND ||
4034                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND ||
4035                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND)
4036             {
4037                 m_hdrCurbe.DW57.ConstantBlendingAlphaFillColorLayer5 = wAlpha;
4038             }
4039             m_hdrCurbe.DW59.TwoLayerOperationLayer5              = HdrTwoLayerOp;
4040             break;
4041         case 6:
4042             m_hdrCurbe.DW6.HorizontalFrameOriginLayer6       = fOriginX;
4043             m_hdrCurbe.DW14.VerticalFrameOriginLayer6        = fOriginY;
4044             m_hdrCurbe.DW22.HorizontalScalingStepRatioLayer6 = fStepX;
4045             m_hdrCurbe.DW30.VerticalScalingStepRatioLayer6   = fStepY;
4046             m_hdrCurbe.DW38.LeftCoordinateRectangleLayer6    = pSource->rcDst.left;
4047             m_hdrCurbe.DW38.TopCoordinateRectangleLayer6     = pSource->rcDst.top;
4048             m_hdrCurbe.DW46.RightCoordinateRectangleLayer6   = pSource->rcDst.right - 1;
4049             m_hdrCurbe.DW46.BottomCoordinateRectangleLayer6  = pSource->rcDst.bottom - 1;
4050             m_hdrCurbe.DW54.FormatDescriptorLayer6           = FormatDescriptor;
4051             m_hdrCurbe.DW54.ChromaSittingLocationLayer6      = ChromaSiting;
4052             m_hdrCurbe.DW54.ChannelSwapEnablingFlagLayer6    = bChannelSwap;
4053             m_hdrCurbe.DW54.IEFBypassEnablingFlagLayer6      = bBypassIEF;
4054             m_hdrCurbe.DW54.RotationAngleMirrorDirectionLayer6 = HdrRotation;
4055             m_hdrCurbe.DW54.SamplerIndexFirstPlaneLayer6       = uiSamplerStateIndex;
4056             if (pSource->osSurface->Format == Format_P010 ||
4057                 pSource->osSurface->Format == Format_P016)
4058             {
4059                 m_hdrCurbe.DW54.SamplerIndexSecondThirdPlaneLayer6 = uiSamplerStateIndex2;
4060             }
4061             m_hdrCurbe.DW54.CCMExtensionEnablingFlagLayer6     = m_hdrParams->StageEnableFlags[i].CCMExt1Enable ||
4062                                                                 m_hdrParams->StageEnableFlags[i].CCMExt2Enable;
4063             m_hdrCurbe.DW54.ToneMappingEnablingFlagLayer6      = m_hdrParams->StageEnableFlags[i].PWLFEnable;
4064             m_hdrCurbe.DW54.PriorCSCEnablingFlagLayer6         = m_hdrParams->StageEnableFlags[i].PriorCSCEnable;
4065             m_hdrCurbe.DW54.EOTF1DLUTEnablingFlagLayer6        = m_hdrParams->StageEnableFlags[i].EOTFEnable;
4066             m_hdrCurbe.DW54.CCMEnablingFlagLayer6              = m_hdrParams->StageEnableFlags[i].CCMEnable;
4067             m_hdrCurbe.DW54.OETF1DLUTEnablingFlagLayer6        = m_hdrParams->StageEnableFlags[i].OETFEnable;
4068             m_hdrCurbe.DW54.PostCSCEnablingFlagLayer6          = m_hdrParams->StageEnableFlags[i].PostCSCEnable;
4069             m_hdrCurbe.DW54.Enabling3DLUTFlagLayer6            = b3dLut;
4070             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND ||
4071                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND ||
4072                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND)
4073             {
4074                 m_hdrCurbe.DW57.ConstantBlendingAlphaFillColorLayer6 = wAlpha;
4075             }
4076             m_hdrCurbe.DW59.TwoLayerOperationLayer6              = HdrTwoLayerOp;
4077             break;
4078         case 7:
4079             m_hdrCurbe.DW7.HorizontalFrameOriginLayer7       = fOriginX;
4080             m_hdrCurbe.DW15.VerticalFrameOriginLayer7        = fOriginY;
4081             m_hdrCurbe.DW23.HorizontalScalingStepRatioLayer7 = fStepX;
4082             m_hdrCurbe.DW31.VerticalScalingStepRatioLayer7   = fStepY;
4083             m_hdrCurbe.DW39.LeftCoordinateRectangleLayer7    = pSource->rcDst.left;
4084             m_hdrCurbe.DW39.TopCoordinateRectangleLayer7     = pSource->rcDst.top;
4085             m_hdrCurbe.DW47.RightCoordinateRectangleLayer7   = pSource->rcDst.right - 1;
4086             m_hdrCurbe.DW47.BottomCoordinateRectangleLayer7  = pSource->rcDst.bottom - 1;
4087             m_hdrCurbe.DW55.FormatDescriptorLayer7           = FormatDescriptor;
4088             m_hdrCurbe.DW55.ChromaSittingLocationLayer7      = ChromaSiting;
4089             m_hdrCurbe.DW55.ChannelSwapEnablingFlagLayer7    = bChannelSwap;
4090             m_hdrCurbe.DW55.IEFBypassEnablingFlagLayer7      = bBypassIEF;
4091             m_hdrCurbe.DW55.RotationAngleMirrorDirectionLayer7 = HdrRotation;
4092             m_hdrCurbe.DW55.SamplerIndexFirstPlaneLayer7       = uiSamplerStateIndex;
4093             if (pSource->osSurface->Format == Format_P010 ||
4094                 pSource->osSurface->Format == Format_P016)
4095             {
4096                 m_hdrCurbe.DW55.SamplerIndexSecondThirdPlaneLayer7 = uiSamplerStateIndex2;
4097             }
4098             m_hdrCurbe.DW55.CCMExtensionEnablingFlagLayer7     = m_hdrParams->StageEnableFlags[i].CCMExt1Enable ||
4099                                                                 m_hdrParams->StageEnableFlags[i].CCMExt2Enable;
4100             m_hdrCurbe.DW55.ToneMappingEnablingFlagLayer7      = m_hdrParams->StageEnableFlags[i].PWLFEnable;
4101             m_hdrCurbe.DW55.PriorCSCEnablingFlagLayer7         = m_hdrParams->StageEnableFlags[i].PriorCSCEnable;
4102             m_hdrCurbe.DW55.EOTF1DLUTEnablingFlagLayer7        = m_hdrParams->StageEnableFlags[i].EOTFEnable;
4103             m_hdrCurbe.DW55.CCMEnablingFlagLayer7              = m_hdrParams->StageEnableFlags[i].CCMEnable;
4104             m_hdrCurbe.DW55.OETF1DLUTEnablingFlagLayer7        = m_hdrParams->StageEnableFlags[i].OETFEnable;
4105             m_hdrCurbe.DW55.PostCSCEnablingFlagLayer7          = m_hdrParams->StageEnableFlags[i].PostCSCEnable;
4106             m_hdrCurbe.DW55.Enabling3DLUTFlagLayer7            = b3dLut;
4107             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND  ||
4108                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND ||
4109                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND)
4110             {
4111                 m_hdrCurbe.DW57.ConstantBlendingAlphaFillColorLayer7 = wAlpha;
4112             }
4113             m_hdrCurbe.DW59.TwoLayerOperationLayer7              = HdrTwoLayerOp;
4114             break;
4115         default:
4116             VP_RENDER_VERBOSEMESSAGE("Invalid input layer number.");
4117             break;
4118         }
4119     }
4120 
4121     FormatDescriptor = GetFormatDescriptor(targetSurf->osSurface->Format);
4122     ChromaSiting     = GetHdrChromaSiting(targetSurf->ChromaSiting);
4123 
4124     if (targetSurf->osSurface->Format == Format_B10G10R10A2 ||
4125         targetSurf->osSurface->Format == Format_A8R8G8B8 ||
4126         targetSurf->osSurface->Format == Format_X8R8G8B8 ||
4127         targetSurf->osSurface->Format == Format_A16R16G16B16F)
4128     {
4129         bChannelSwap = true;
4130     }
4131     else
4132     {
4133         bChannelSwap = false;
4134     }
4135 
4136     m_hdrCurbe.DW62.DestinationWidth                 = targetSurf->osSurface->dwWidth;
4137     m_hdrCurbe.DW62.DestinationHeight      = targetSurf->osSurface->dwHeight;
4138     m_hdrCurbe.DW63.TotalNumberInputLayers           = m_hdrParams->uSourceCount;
4139 
4140     if (0 == m_hdrParams->uSourceCount)
4141     {
4142         m_hdrCurbe.DW32.LeftCoordinateRectangleLayer0    = targetSurf->osSurface->dwWidth + 16;
4143         m_hdrCurbe.DW32.TopCoordinateRectangleLayer0     = targetSurf->osSurface->dwHeight + 16;
4144         m_hdrCurbe.DW40.RightCoordinateRectangleLayer0   = targetSurf->osSurface->dwWidth + 16;
4145         m_hdrCurbe.DW40.BottomCoordinateRectangleLayer0  = targetSurf->osSurface->dwHeight + 16;
4146         m_hdrCurbe.DW58.TwoLayerOperationLayer0          = VPHAL_HDR_TWO_LAYER_OPTION_COMP;
4147     }
4148 
4149     m_hdrCurbe.DW63.FormatDescriptorDestination        = FormatDescriptor;
4150     m_hdrCurbe.DW63.ChromaSittingLocationDestination   = ChromaSiting;
4151     m_hdrCurbe.DW63.ChannelSwapEnablingFlagDestination = bChannelSwap;
4152 
4153     // Set Background color (use cspace of first layer)
4154     if (m_hdrParams->pColorFillParams)
4155     {
4156         VPHAL_COLOR_SAMPLE_8 Src, Dst;
4157         VPHAL_CSPACE         src_cspace, dst_cspace;
4158 
4159         Src.dwValue = m_hdrParams->pColorFillParams->Color;
4160 
4161         // get src and dst colorspaces
4162         src_cspace = m_hdrParams->pColorFillParams->CSpace;
4163         dst_cspace = targetSurf->ColorSpace;
4164 
4165         // Convert BG color only if not done so before. CSC is expensive!
4166         if (VpUtils::GetCscMatrixForRender8Bit(&Dst, &Src, src_cspace, dst_cspace))
4167         {
4168             m_hdrCurbe.DW60.FixedPointFillColorRVChannel     = Dst.R << 8;
4169             m_hdrCurbe.DW60.FixedPointFillColorGYChannel     = Dst.G << 8;
4170             m_hdrCurbe.DW61.FixedPointFillColorBUChannel     = Dst.B << 8;
4171             m_hdrCurbe.DW61.FixedPointFillColorAlphaChannel  = Dst.A << 8;
4172         }
4173         else
4174         {
4175             m_hdrCurbe.DW60.FixedPointFillColorRVChannel     = Src.R << 8;
4176             m_hdrCurbe.DW60.FixedPointFillColorGYChannel     = Src.G << 8;
4177             m_hdrCurbe.DW61.FixedPointFillColorBUChannel     = Src.B << 8;
4178             m_hdrCurbe.DW61.FixedPointFillColorAlphaChannel  = Src.A << 8;
4179         }
4180     }
4181 
4182     curbe = (void*)(&m_hdrCurbe);
4183     curbeLength = (uint32_t)sizeof(MEDIA_WALKER_HDR_STATIC_DATA);
4184 
4185     //DumpCurbe(&m_hdrCurbe, sizeof(MEDIA_WALKER_HDR_STATIC_DATA));
4186 
4187     PrintCurbeData(&m_hdrCurbe);
4188 
4189     return eStatus;
4190 }
4191 
GetInlineDataSize()4192 uint32_t VpRenderHdrKernel::GetInlineDataSize()
4193 {
4194     VP_FUNC_CALL();
4195 
4196     return 0;
4197 }
4198 
GetWalkerSetting(KERNEL_WALKER_PARAMS & walkerParam,KERNEL_PACKET_RENDER_DATA & renderData)4199 MOS_STATUS VpRenderHdrKernel::GetWalkerSetting(KERNEL_WALKER_PARAMS& walkerParam, KERNEL_PACKET_RENDER_DATA &renderData)
4200 {
4201     VP_FUNC_CALL();
4202 
4203     RENDERHAL_KERNEL_PARAM kernelSettings;
4204     int32_t                iBlocksX, iBlocksY;
4205     int32_t                iBlockWd;  // Block width
4206     int32_t                iBlockHt;  // Block Height
4207     uint32_t               uiMediaWalkerBlockSize;
4208     bool                   bVerticalPattern = false;
4209     RECT                   AlignedRect      = {};
4210     uint32_t               dwSrcWidth;
4211     uint32_t               dwSrcHeight;
4212 
4213     walkerParam.iBindingTable = renderData.bindingTable;
4214     walkerParam.iMediaID      = renderData.mediaID;
4215     walkerParam.iCurbeOffset  = renderData.iCurbeOffset;
4216     walkerParam.iCurbeLength  = renderData.iCurbeLength;
4217     // iBlocksX/iBlocksY will be calculated during prepare walker parameters in RenderCmdPacket
4218     walkerParam.calculateBlockXYByAlignedRect = false;
4219 
4220     auto        it   = m_surfaceGroup->find(SurfaceTypeHdrInputLayer0);
4221     VP_SURFACE *surf = (m_surfaceGroup->end() != it) ? it->second : nullptr;
4222     if (surf == nullptr)
4223     {
4224         VP_RENDER_ASSERTMESSAGE("input surf was not found");
4225         return MOS_STATUS_NULL_POINTER;
4226     }
4227     VP_RENDER_CHK_NULL_RETURN(surf->osSurface);
4228 
4229     auto        OutputIt   = m_surfaceGroup->find(SurfaceTypeHdrTarget0);
4230     VP_SURFACE *outputSurf = (m_surfaceGroup->end() != OutputIt) ? OutputIt->second : nullptr;
4231     if (outputSurf == nullptr)
4232     {
4233         VP_RENDER_ASSERTMESSAGE("output surf was not found");
4234         return MOS_STATUS_NULL_POINTER;
4235     }
4236 
4237     if (0 == m_hdrParams->uTargetCount || m_hdrParams->uTargetCount > 1)
4238     {
4239         VP_RENDER_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
4240     }
4241 
4242     walkerParam.alignedRect = outputSurf->rcDst;
4243 
4244     if (m_hdrParams->uSourceCount == 1 &&
4245         surf->osSurface->TileType == MOS_TILE_LINEAR &&
4246         (m_hdrParams->Rotation == VPHAL_ROTATION_90 ||
4247             m_hdrParams->Rotation == VPHAL_ROTATION_270))
4248     {
4249         walkerParam.isVerticalPattern = true;
4250     }
4251 
4252     walkerParam.bSyncFlag                       = 0;
4253     walkerParam.isGroupStartInvolvedInGroupSize = true;
4254 
4255     if (m_hdrParams->uSourceCount == 1 &&
4256         surf->osSurface->TileType == MOS_TILE_LINEAR &&
4257         (m_hdrParams->Rotation == VPHAL_ROTATION_90 || m_hdrParams->Rotation == VPHAL_ROTATION_270))
4258     {
4259         walkerParam.isVerticalPattern = true;
4260     }
4261 
4262     iBlockWd = renderData.KernelParam.block_width;
4263     iBlockHt = renderData.KernelParam.block_height;
4264 
4265     dwSrcWidth           = outputSurf->rcDst.right - outputSurf->rcDst.left;
4266     dwSrcHeight          = outputSurf->rcSrc.bottom - outputSurf->rcDst.top;
4267     iBlocksX             = (dwSrcWidth + iBlockWd - 1) / iBlockWd;
4268     iBlocksY             = (dwSrcHeight + iBlockHt - 1) / iBlockHt;
4269     walkerParam.iBlocksX = iBlocksX;
4270     walkerParam.iBlocksY = iBlocksY;
4271 
4272     return MOS_STATUS_SUCCESS;
4273 }
4274 
SetKernelConfigs(KERNEL_CONFIGS & kernelConfigs)4275 MOS_STATUS VpRenderHdrKernel::SetKernelConfigs(KERNEL_CONFIGS& kernelConfigs)
4276 {
4277     VP_FUNC_CALL();
4278 
4279     if (m_hdrParams == nullptr)
4280     {
4281         m_hdrParams = (RENDER_HDR_PARAMS *)MOS_AllocAndZeroMemory(sizeof(RENDER_HDR_PARAMS));
4282     }
4283     VP_RENDER_CHK_NULL_RETURN(m_hdrParams);
4284 
4285     PRENDER_HDR_PARAMS hdrParams = nullptr;
4286     if (kernelConfigs.find(m_kernelId) != kernelConfigs.end())
4287     {
4288         hdrParams = (PRENDER_HDR_PARAMS)kernelConfigs.find(m_kernelId)->second;
4289     }
4290 
4291     VP_RENDER_CHK_NULL_RETURN(hdrParams);
4292 
4293     MOS_SecureMemcpy(m_hdrParams, sizeof(RENDER_HDR_PARAMS), hdrParams, sizeof(RENDER_HDR_PARAMS));
4294 
4295     return MOS_STATUS_SUCCESS;
4296 
4297 }
4298 
4299 //! \brief    Get the HDR format descriptor of a format
4300 //! \details  Get the HDR format descriptor of a format and return.
4301 //! \param    MOS_FORMAT Format
4302 //!           [in] MOS_FORMAT of a surface
4303 //! \return   VPHAL_HDR_FORMAT_DESCRIPTOR
4304 //!           HDR format descriptor
4305 //!
GetFormatDescriptor(MOS_FORMAT Format)4306 VPHAL_HDR_FORMAT_DESCRIPTOR VpRenderHdrKernel::GetFormatDescriptor(
4307     MOS_FORMAT      Format)
4308 {
4309     VP_FUNC_CALL();
4310 
4311     VPHAL_HDR_FORMAT_DESCRIPTOR FormatDescriptor  = VPHAL_HDR_FORMAT_DESCRIPTOR_UNKNOW;
4312 
4313     switch (Format)
4314     {
4315         case Format_R10G10B10A2:
4316         case Format_B10G10R10A2:
4317             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_R10G10B10A2_UNORM;
4318             break;
4319 
4320         case Format_X8R8G8B8:
4321         case Format_A8R8G8B8:
4322         case Format_A8B8G8R8:
4323         case Format_X8B8G8R8:
4324         case Format_AYUV:
4325             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_R8G8B8A8_UNORM;
4326             break;
4327 
4328         case Format_NV12:
4329         case Format_NV21:
4330             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_NV12;
4331             break;
4332 
4333         case Format_YUY2:
4334             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_YUY2;
4335             break;
4336 
4337         case Format_P010:
4338             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_P010;
4339             break;
4340 
4341         case Format_P016:
4342             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_P016;
4343             break;
4344 
4345         case Format_A16R16G16B16F:
4346         case Format_A16B16G16R16F:
4347             FormatDescriptor = VPHAL_HDR_FORMAT_R16G16B16A16_FLOAT;
4348             break;
4349 
4350         default:
4351             VP_RENDER_ASSERTMESSAGE("Unsupported input format.");
4352             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_UNKNOW;
4353             break;
4354     }
4355 
4356     return FormatDescriptor;
4357 }
4358 
4359 //! \brief    Get the HDR Chroma siting
4360 //! \details  Get the HDR Chroma siting and return.
4361 //! \param    uint32_t ChromaSiting
4362 //!           [in] ChromaSiting of a surface
4363 //! \return   VPHAL_HDR_CHROMA_SITING
4364 //!           HDR Chroma siting
4365 //!
GetHdrChromaSiting(uint32_t ChromaSiting)4366 VPHAL_HDR_CHROMA_SITING VpRenderHdrKernel::GetHdrChromaSiting(
4367     uint32_t      ChromaSiting)
4368 {
4369     VP_FUNC_CALL();
4370 
4371     VPHAL_HDR_CHROMA_SITING HdrChromaSiting = VPHAL_HDR_CHROMA_SITTING_A;
4372 
4373     switch (ChromaSiting)
4374     {
4375     case CHROMA_SITING_HORZ_LEFT :
4376         HdrChromaSiting = VPHAL_HDR_CHROMA_SITTING_A;
4377         break;
4378     default:
4379         HdrChromaSiting = VPHAL_HDR_CHROMA_SITTING_A;
4380         break;
4381     }
4382 
4383     return HdrChromaSiting;
4384 }
4385 
4386 //! \brief    Get the HDR rotation
4387 //! \details  Get the HDR rotation and return.
4388 //! \param    VPHAL_ROTATION Rotation
4389 //!           [in] Rotation of a surface
4390 //! \return   VPHAL_HDR_ROTATION
4391 //!           HDR Chroma siting
4392 //!
GetHdrRotation(VPHAL_ROTATION Rotation)4393 VPHAL_HDR_ROTATION VpRenderHdrKernel::GetHdrRotation(
4394     VPHAL_ROTATION      Rotation)
4395 {
4396     VP_FUNC_CALL();
4397 
4398     VPHAL_HDR_ROTATION HdrRotation  = VPHAL_HDR_LAYER_ROTATION_0;
4399 
4400     switch (Rotation)
4401     {
4402     case VPHAL_ROTATION_IDENTITY :
4403         HdrRotation = VPHAL_HDR_LAYER_ROTATION_0;
4404         break;
4405     case VPHAL_ROTATION_90 :
4406         HdrRotation = VPHAL_HDR_LAYER_ROTATION_90;
4407         break;
4408     case VPHAL_ROTATION_180 :
4409         HdrRotation = VPHAL_HDR_LAYER_ROTATION_180;
4410         break;
4411     case VPHAL_ROTATION_270 :
4412         HdrRotation = VPHAL_HDR_LAYER_ROTATION_270;
4413         break;
4414     case VPHAL_MIRROR_HORIZONTAL :
4415         HdrRotation = VPHAL_HDR_LAYER_MIRROR_H;
4416         break;
4417     case VPHAL_MIRROR_VERTICAL :
4418         HdrRotation = VPHAL_HDR_LAYER_MIRROR_V;
4419         break;
4420     case VPHAL_ROTATE_90_MIRROR_VERTICAL :
4421         HdrRotation = VPHAL_HDR_LAYER_ROT_90_MIR_V;
4422         break;
4423     case VPHAL_ROTATE_90_MIRROR_HORIZONTAL :
4424         HdrRotation = VPHAL_HDR_LAYER_ROT_90_MIR_H;
4425         break;
4426     default:
4427         HdrRotation = VPHAL_HDR_LAYER_ROTATION_0;
4428         break;
4429     }
4430 
4431     return HdrRotation;
4432 }
4433 
4434 //!
4435 //! \brief    Recalculate Sampler Avs 8x8 Horizontal/Vertical scaling table
4436 //! \details  Recalculate Sampler Avs 8x8 Horizontal/Vertical scaling table
4437 //! \param    MOS_FORMAT SrcFormat
4438 //!           [in] Source Format
4439 //! \param    float fScale
4440 //!           [in] Horizontal or Vertical Scale Factor
4441 //! \param    bool bVertical
4442 //!           [in] true if Vertical Scaling, else Horizontal Scaling
4443 //! \param    uint32_t dwChromaSiting
4444 //!           [in] Chroma Siting
4445 //! \param    bool bBalancedFilter
4446 //!           [in] true if Gen9+, balanced filter
4447 //! \param    bool b8TapAdaptiveEnable
4448 //!           [in] true if 8Tap Adaptive Enable
4449 //! \param    PVPHAL_AVS_PARAMS pAvsParams
4450 //!           [in/out] Pointer to AVS Params
4451 //! \return   MOS_STATUS
4452 //!
SamplerAvsCalcScalingTable(MOS_FORMAT SrcFormat,float fScale,bool bVertical,uint32_t dwChromaSiting,bool bBalancedFilter,bool b8TapAdaptiveEnable,PMHW_AVS_PARAMS pAvsParams)4453 MOS_STATUS VpRenderHdrKernel::SamplerAvsCalcScalingTable(
4454     MOS_FORMAT                      SrcFormat,
4455     float                           fScale,
4456     bool                            bVertical,
4457     uint32_t                        dwChromaSiting,
4458     bool                            bBalancedFilter,
4459     bool                            b8TapAdaptiveEnable,
4460     PMHW_AVS_PARAMS                 pAvsParams)
4461 {
4462     VP_FUNC_CALL();
4463 
4464     MOS_STATUS                      eStatus             = MOS_STATUS_SUCCESS;
4465     MHW_PLANE                       Plane               = MHW_GENERIC_PLANE;
4466     int32_t                         iUvPhaseOffset      = 0;
4467     uint32_t                        dwHwPhrase          = 0;
4468     uint32_t                        YCoefTableSize      = 0;
4469     uint32_t                        UVCoefTableSize     = 0;
4470     float                           fScaleParam         = 0.0f;
4471     int32_t*                        piYCoefsParam       = nullptr;
4472     int32_t*                        piUVCoefsParam      = nullptr;
4473     float                           fHPStrength         = 0.0f;
4474 
4475     VP_RENDER_CHK_NULL_RETURN(pAvsParams);
4476     VP_RENDER_CHK_NULL_RETURN(pAvsParams->piYCoefsY);
4477     VP_RENDER_CHK_NULL_RETURN(pAvsParams->piYCoefsX);
4478     VP_RENDER_CHK_NULL_RETURN(pAvsParams->piUVCoefsY);
4479     VP_RENDER_CHK_NULL_RETURN(pAvsParams->piUVCoefsX);
4480 
4481     if (bBalancedFilter)
4482     {
4483         YCoefTableSize      = POLYPHASE_Y_COEFFICIENT_TABLE_SIZE_G9;
4484         UVCoefTableSize     = POLYPHASE_UV_COEFFICIENT_TABLE_SIZE_G9;
4485         dwHwPhrase          = NUM_HW_POLYPHASE_TABLES;
4486     }
4487     else
4488     {
4489         YCoefTableSize      = POLYPHASE_Y_COEFFICIENT_TABLE_SIZE_G8;
4490         UVCoefTableSize     = POLYPHASE_UV_COEFFICIENT_TABLE_SIZE_G8;
4491         dwHwPhrase          = MHW_NUM_HW_POLYPHASE_TABLES;
4492     }
4493 
4494     fHPStrength = 0.0F;
4495     piYCoefsParam   = bVertical ? pAvsParams->piYCoefsY : pAvsParams->piYCoefsX;
4496     piUVCoefsParam  = bVertical ? pAvsParams->piUVCoefsY : pAvsParams->piUVCoefsX;
4497     fScaleParam     = bVertical ? pAvsParams->fScaleY : pAvsParams->fScaleX;
4498 
4499     // Recalculate Horizontal or Vertical scaling table
4500     if (SrcFormat != pAvsParams->Format || fScale != fScaleParam)
4501     {
4502         MOS_ZeroMemory(piYCoefsParam, YCoefTableSize);
4503         MOS_ZeroMemory(piUVCoefsParam, UVCoefTableSize);
4504 
4505         // 4-tap filtering for RGB format G-channel if 8tap adaptive filter is not enabled.
4506         Plane = (IS_RGB32_FORMAT(SrcFormat) && !b8TapAdaptiveEnable) ? MHW_U_PLANE : MHW_Y_PLANE;
4507         if (bVertical)
4508         {
4509             pAvsParams->fScaleY = fScale;
4510         }
4511         else
4512         {
4513             pAvsParams->fScaleX = fScale;
4514         }
4515 
4516         // For 1x scaling in horizontal direction, use special coefficients for filtering
4517         // we don't do this when bForcePolyPhaseCoefs flag is set
4518         if (fScale == 1.0F && !pAvsParams->bForcePolyPhaseCoefs)
4519         {
4520             VP_RENDER_CHK_STATUS_RETURN(Mhw_SetNearestModeTable(
4521                 piYCoefsParam,
4522                 Plane,
4523                 bBalancedFilter));
4524             // If the 8-tap adaptive is enabled for all channel, then UV/RB use the same coefficient as Y/G
4525             // So, coefficient for UV/RB channels caculation can be passed
4526             if (!b8TapAdaptiveEnable)
4527             {
4528                 VP_RENDER_CHK_STATUS_RETURN(Mhw_SetNearestModeTable(
4529                     piUVCoefsParam,
4530                     MHW_U_PLANE,
4531                     bBalancedFilter));
4532             }
4533         }
4534         else
4535         {
4536             // Clamp the Scaling Factor if > 1.0x
4537             fScale = MOS_MIN(1.0F, fScale);
4538 
4539             VP_RENDER_CHK_STATUS_RETURN(Mhw_CalcPolyphaseTablesY(
4540                 piYCoefsParam,
4541                 fScale,
4542                 Plane,
4543                 SrcFormat,
4544                 fHPStrength,
4545                 true,
4546                 dwHwPhrase,
4547                 0));
4548 
4549             // If the 8-tap adaptive is enabled for all channel, then UV/RB use the same coefficient as Y/G
4550             // So, coefficient for UV/RB channels caculation can be passed
4551             if (!b8TapAdaptiveEnable)
4552             {
4553                 if (!bBalancedFilter)
4554                 {
4555                     VP_RENDER_CHK_STATUS_RETURN(Mhw_CalcPolyphaseTablesY(
4556                         piUVCoefsParam,
4557                         fScale,
4558                         MHW_U_PLANE,
4559                         SrcFormat,
4560                         fHPStrength,
4561                         true,
4562                         dwHwPhrase,
4563                         0));
4564                 }
4565                 else
4566                 {
4567                     // If Chroma Siting info is present
4568                     if (dwChromaSiting & (bVertical ? MHW_CHROMA_SITING_VERT_TOP : MHW_CHROMA_SITING_HORZ_LEFT))
4569                     {
4570                         // No Chroma Siting
4571                         VP_RENDER_CHK_STATUS_RETURN(Mhw_CalcPolyphaseTablesUV(
4572                             piUVCoefsParam,
4573                             2.0F,
4574                             fScale));
4575                     }
4576                     else
4577                     {
4578                         // Chroma siting offset needs to be added
4579                         if (dwChromaSiting & (bVertical ? MHW_CHROMA_SITING_VERT_CENTER : MHW_CHROMA_SITING_HORZ_CENTER))
4580                         {
4581                             iUvPhaseOffset = MOS_UF_ROUND(0.5F * 16.0F);   // U0.4
4582                         }
4583                         else //if (ChromaSiting & (bVertical ? MHW_CHROMA_SITING_VERT_BOTTOM : MHW_CHROMA_SITING_HORZ_RIGHT))
4584                         {
4585                             iUvPhaseOffset = MOS_UF_ROUND(1.0F * 16.0F);   // U0.4
4586                         }
4587 
4588                         VP_RENDER_CHK_STATUS_RETURN(Mhw_CalcPolyphaseTablesUVOffset(
4589                             piUVCoefsParam,
4590                             3.0F,
4591                             fScale,
4592                             iUvPhaseOffset));
4593                     }
4594                 }
4595             }
4596         }
4597     }
4598 
4599     return eStatus;
4600 }
4601 
4602 
4603 //!
4604 //! \brief      Set Sampler8x8 Table for Gen9 Hdr AVS
4605 //! \details    Set sampler8x8 table based on format, scale and chroma siting
4606 //! \param      PRENDERHAL_INTERFACE pRenderHal
4607 //!             [in]    Pointer to RenderHal interface
4608 //! \param      PMHW_SAMPLER_STATE_PARAM pSamplerStateParams,
4609 //!             [in]    Pointer to sampler state params
4610 //! \param      PVPHAL_AVS_PARAMS pAvsParams
4611 //!             [in]    Pointer to avs parameters
4612 //! \param      MOS_FORMAT SrcFormat
4613 //!             [in]    source format
4614 //! \param      float   fScaleX
4615 //!             [in]    Scale X
4616 //! \param      float   fScaleY
4617 //!             [in]    Scale Y
4618 //! \param      uint32_t   dwChromaSiting
4619 //!             [in]    Chroma siting
4620 //! \return     void
4621 //!
SetSamplerAvsTableParam(PRENDERHAL_INTERFACE pRenderHal,PMHW_SAMPLER_STATE_PARAM pSamplerStateParams,PMHW_AVS_PARAMS pAvsParams,MOS_FORMAT SrcFormat,float fScaleX,float fScaleY,uint32_t dwChromaSiting)4622 MOS_STATUS VpRenderHdrKernel::SetSamplerAvsTableParam(
4623     PRENDERHAL_INTERFACE            pRenderHal,
4624     PMHW_SAMPLER_STATE_PARAM        pSamplerStateParams,
4625     PMHW_AVS_PARAMS                 pAvsParams,
4626     MOS_FORMAT                      SrcFormat,
4627     float                           fScaleX,
4628     float                           fScaleY,
4629     uint32_t                        dwChromaSiting)
4630 {
4631     VP_FUNC_CALL();
4632 
4633     MOS_STATUS                   eStatus                    = MOS_STATUS_SUCCESS;
4634     bool                         bBalancedFilter            = false;
4635     PMHW_SAMPLER_AVS_TABLE_PARAM pMhwSamplerAvsTableParam   = nullptr;
4636 
4637     VP_RENDER_CHK_NULL_RETURN(pRenderHal);
4638     VP_RENDER_CHK_NULL_RETURN(pSamplerStateParams);
4639     VP_RENDER_CHK_NULL_RETURN(pAvsParams);
4640     VP_RENDER_CHK_NULL_RETURN(pAvsParams->piYCoefsY);
4641     VP_RENDER_CHK_NULL_RETURN(pAvsParams->piYCoefsX);
4642     VP_RENDER_CHK_NULL_RETURN(pAvsParams->piUVCoefsY);
4643     VP_RENDER_CHK_NULL_RETURN(pAvsParams->piUVCoefsX);
4644 
4645     pMhwSamplerAvsTableParam = pSamplerStateParams->Avs.pMhwSamplerAvsTableParam;
4646 
4647     pMhwSamplerAvsTableParam->b8TapAdaptiveEnable         = pSamplerStateParams->Avs.b8TapAdaptiveEnable;
4648     pMhwSamplerAvsTableParam->byteTransitionArea8Pixels   = MEDIASTATE_AVS_TRANSITION_AREA_8_PIXELS;
4649     pMhwSamplerAvsTableParam->byteTransitionArea4Pixels   = MEDIASTATE_AVS_TRANSITION_AREA_4_PIXELS;
4650     pMhwSamplerAvsTableParam->byteMaxDerivative8Pixels    = MEDIASTATE_AVS_MAX_DERIVATIVE_8_PIXELS;
4651     pMhwSamplerAvsTableParam->byteMaxDerivative4Pixels    = MEDIASTATE_AVS_MAX_DERIVATIVE_4_PIXELS;
4652     pMhwSamplerAvsTableParam->byteDefaultSharpnessLevel   = MEDIASTATE_AVS_SHARPNESS_LEVEL_SHARP;
4653 
4654     // Enable Adaptive Filtering, if it is being upscaled
4655     // in either direction. we must check for this before clamping the SF.
4656     if ((IS_YUV_FORMAT(SrcFormat) && (fScaleX > 1.0F || fScaleY > 1.0F)) ||
4657         pMhwSamplerAvsTableParam->b8TapAdaptiveEnable)
4658     {
4659         pMhwSamplerAvsTableParam->bBypassXAdaptiveFiltering = false;
4660         pMhwSamplerAvsTableParam->bBypassYAdaptiveFiltering = false;
4661         if (pMhwSamplerAvsTableParam->b8TapAdaptiveEnable)
4662         {
4663             pMhwSamplerAvsTableParam->bAdaptiveFilterAllChannels = true;
4664 
4665             if (IS_RGB_FORMAT(SrcFormat))
4666             {
4667                 pMhwSamplerAvsTableParam->bEnableRGBAdaptive     = true;
4668             }
4669         }
4670     }
4671     else
4672     {
4673         pMhwSamplerAvsTableParam->bBypassXAdaptiveFiltering = true;
4674         pMhwSamplerAvsTableParam->bBypassYAdaptiveFiltering = true;
4675     }
4676 
4677     // No changes to AVS parameters -> skip
4678     if (SrcFormat == pAvsParams->Format &&
4679         fScaleX == pAvsParams->fScaleX &&
4680         fScaleY == pAvsParams->fScaleY)
4681     {
4682         return MOS_STATUS_SUCCESS;
4683     }
4684 
4685     // AVS Coefficients don't change for Scaling Factors > 1.0x
4686     // Hence recalculation is avoided
4687     if (fScaleX > 1.0F && pAvsParams->fScaleX > 1.0F)
4688     {
4689         pAvsParams->fScaleX = fScaleX;
4690     }
4691 
4692     // AVS Coefficients don't change for Scaling Factors > 1.0x
4693     // Hence recalculation is avoided
4694     if (fScaleY > 1.0F && pAvsParams->fScaleY > 1.0F)
4695     {
4696         pAvsParams->fScaleY = fScaleY;
4697     }
4698 
4699     bBalancedFilter = true;
4700     // Recalculate Horizontal scaling table
4701     VP_RENDER_CHK_STATUS_RETURN(SamplerAvsCalcScalingTable(
4702         SrcFormat,
4703         fScaleX,
4704         false,
4705         dwChromaSiting,
4706         bBalancedFilter,
4707         pMhwSamplerAvsTableParam->b8TapAdaptiveEnable ? true : false,
4708         pAvsParams));
4709 
4710     // Recalculate Vertical scaling table
4711     VP_RENDER_CHK_STATUS_RETURN(SamplerAvsCalcScalingTable(
4712         SrcFormat,
4713         fScaleY,
4714         true,
4715         dwChromaSiting,
4716         bBalancedFilter,
4717         pMhwSamplerAvsTableParam->b8TapAdaptiveEnable ? true : false,
4718         pAvsParams));
4719 
4720     pMhwSamplerAvsTableParam->bIsCoeffExtraEnabled = true;
4721     // Save format used to calculate AVS parameters
4722     pAvsParams->Format                             = SrcFormat;
4723     pMhwSamplerAvsTableParam->b4TapGY              = (IS_RGB32_FORMAT(SrcFormat) && !pMhwSamplerAvsTableParam->b8TapAdaptiveEnable);
4724     pMhwSamplerAvsTableParam->b4TapRBUV            = (!pMhwSamplerAvsTableParam->b8TapAdaptiveEnable);
4725 
4726     return eStatus;
4727 }
4728 
GetSamplerIndex(VPHAL_SCALING_MODE scalingMode,uint32_t yuvPlane,int32_t & samplerIndex,MHW_SAMPLER_TYPE & samplerType)4729 MOS_STATUS VpRenderHdrKernel::GetSamplerIndex(
4730     VPHAL_SCALING_MODE scalingMode,
4731     uint32_t           yuvPlane,
4732     int32_t           &samplerIndex,
4733     MHW_SAMPLER_TYPE  &samplerType)
4734 {
4735     const int32_t samplerindex[2][3] = {{VP_SAMPLER_INDEX_Y_NEAREST, VP_SAMPLER_INDEX_U_NEAREST, VP_SAMPLER_INDEX_V_NEAREST},
4736         {VP_SAMPLER_INDEX_Y_BILINEAR, VP_SAMPLER_INDEX_U_BILINEAR, VP_SAMPLER_INDEX_V_BILINEAR}};
4737 
4738     if (scalingMode == VPHAL_SCALING_AVS)
4739     {
4740         VP_PUBLIC_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
4741     }
4742 
4743     // if Scalingmode is BILINEAR, use the 4,5,6. if NEAREST, use 1,2,3
4744     samplerType  = MHW_SAMPLER_TYPE_3D;
4745     samplerIndex = samplerindex[scalingMode][yuvPlane];
4746 
4747     return MOS_STATUS_SUCCESS;
4748 }
4749 
SetSamplerStates(KERNEL_SAMPLER_STATE_GROUP & samplerStateGroup)4750 MOS_STATUS VpRenderHdrKernel::SetSamplerStates(KERNEL_SAMPLER_STATE_GROUP& samplerStateGroup)
4751 {
4752     MOS_STATUS                  eStatus             = MOS_STATUS_SUCCESS;
4753     MHW_SAMPLER_STATE_PARAM samplerStateParam       = {};
4754     uint32_t                    i                   = 0;
4755     uint32_t                       entryIndex        = 0;
4756     int32_t                        samplerIndex      = 0;
4757     MHW_SAMPLER_TYPE               samplerType       = MHW_SAMPLER_TYPE_INVALID;
4758 
4759     m_samplerStateGroup = &samplerStateGroup;
4760     m_samplerIndexes.clear();
4761     m_samplerIndexes.push_back(0);
4762 
4763     return eStatus;
4764 }
4765 
DumpSurfaces()4766 void VpRenderHdrKernel::DumpSurfaces()
4767 {
4768     VP_FUNC_CALL();
4769 
4770     PMOS_INTERFACE        pOsInterface = m_hwInterface->m_osInterface;
4771 
4772     auto inputSurface = m_surfaceGroup->find(SurfaceTypeHdrInputLayer0);
4773     VP_SURFACE* surf1 = (m_surfaceGroup->end() != inputSurface) ? inputSurface->second : nullptr;
4774 
4775     auto OETF1DLUTSurface = m_surfaceGroup->find(SurfaceTypeHdrOETF1DLUTSurface0);
4776     VP_SURFACE* surf2 = (m_surfaceGroup->end() != OETF1DLUTSurface) ? OETF1DLUTSurface->second : nullptr;
4777 
4778     auto coeffSurface = m_surfaceGroup->find(SurfaceTypeHdrCoeff);
4779     VP_SURFACE* surf3 = (m_surfaceGroup->end() != coeffSurface) ? coeffSurface->second : nullptr;
4780 
4781     auto targetSurface = m_surfaceGroup->find(SurfaceTypeHdrTarget0);
4782     VP_SURFACE* surf4 = (m_surfaceGroup->end() != targetSurface) ? targetSurface->second : nullptr;
4783 
4784     auto        RenderInputSurface = m_surfaceGroup->find(SurfaceTypeHdrInputLayer0);
4785     VP_SURFACE *surf5              = (m_surfaceGroup->end() != RenderInputSurface) ? RenderInputSurface->second : nullptr;
4786 
4787     if (surf1)
4788     {
4789         DumpSurface(surf1,VP_HDR_DUMP_INPUT_LAYER0);
4790     }
4791     if (surf5)
4792     {
4793         DumpSurface(surf5, VP_HDR_DUMP_RENDER_INPUT);
4794     }
4795 
4796     if (surf2)
4797     {
4798        DumpSurface(surf2,VP_HDR_DUMP_OETF1DLUT_SURFACE0);
4799     }
4800     if (surf3)
4801     {
4802         DumpSurface(surf3,VP_HDR_DUMP_COEFF_SURFACE);
4803     }
4804     if (surf4)
4805     {
4806        DumpSurface(surf4,VP_HDR_DUMP_TARGET_SURFACE0);
4807     }
4808 
4809     return;
4810 }
4811 
DumpCurbe(void * pCurbe,int32_t iSize)4812 void VpRenderHdrKernel::DumpCurbe(void *pCurbe, int32_t iSize)
4813 {
4814     VP_FUNC_CALL();
4815     char CurbeName[MAX_PATH];
4816 
4817     MOS_SecureStringPrint(
4818         CurbeName,
4819         sizeof(CurbeName),
4820         sizeof(CurbeName),
4821         "c:\\\\dump\\f[%04d]hdr_Curbe.dat",
4822         1);
4823     MosUtilities::MosWriteFileFromPtr(
4824         (const char *)CurbeName,
4825         pCurbe,
4826         iSize);
4827 }
4828 
PrintCurbeData(PMEDIA_WALKER_HDR_STATIC_DATA curbeData)4829 void VpRenderHdrKernel::PrintCurbeData(PMEDIA_WALKER_HDR_STATIC_DATA curbeData)
4830 {
4831 #if (_DEBUG || _RELEASE_INTERNAL)
4832     if (curbeData == nullptr)
4833     {
4834         VP_RENDER_ASSERTMESSAGE("The curbeData pointer is null");
4835         return;
4836     }
4837     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW0.Value = %x", curbeData->DW0.Value);
4838     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer0 = %x",
4839         curbeData->DW0.HorizontalFrameOriginLayer0);
4840     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW1.Value = %x", curbeData->DW1.Value);
4841     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer1 = %x",
4842         curbeData->DW1.HorizontalFrameOriginLayer1);
4843     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW2.Value = %x", curbeData->DW2.Value);
4844     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer2 = %x",
4845         curbeData->DW2.HorizontalFrameOriginLayer2);
4846     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW3.Value = %x", curbeData->DW3.Value);
4847     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer3 = %x",
4848         curbeData->DW3.HorizontalFrameOriginLayer3);
4849     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW4.Value = %x", curbeData->DW4.Value);
4850     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer4 = %x",
4851         curbeData->DW4.HorizontalFrameOriginLayer4);
4852     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW5.Value = %x", curbeData->DW5.Value);
4853     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer5 = %x",
4854         curbeData->DW5.HorizontalFrameOriginLayer5);
4855     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW6.Value = %x", curbeData->DW6.Value);
4856     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer6 = %x",
4857         curbeData->DW6.HorizontalFrameOriginLayer6);
4858     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW7.Value = %x", curbeData->DW7.Value);
4859     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer7 = %x",
4860         curbeData->DW7.HorizontalFrameOriginLayer7);
4861     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW8.Value = %x", curbeData->DW8.Value);
4862     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer0 = %x",
4863         curbeData->DW8.VerticalFrameOriginLayer0);
4864     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW9.Value = %x", curbeData->DW9.Value);
4865     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer1 = %x",
4866         curbeData->DW9.VerticalFrameOriginLayer1);
4867     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW10.Value = %x", curbeData->DW10.Value);
4868     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer2 = %x",
4869         curbeData->DW10.VerticalFrameOriginLayer2);
4870     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW11.Value = %x", curbeData->DW11.Value);
4871     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer3 = %x",
4872         curbeData->DW11.VerticalFrameOriginLayer3);
4873     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW12.Value = %x", curbeData->DW12.Value);
4874     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer4 = %x",
4875         curbeData->DW12.VerticalFrameOriginLayer4);
4876     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW13.Value = %x", curbeData->DW13.Value);
4877     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer5 = %x",
4878         curbeData->DW13.VerticalFrameOriginLayer5);
4879     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW14.Value = %x", curbeData->DW14.Value);
4880     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer6 = %x",
4881         curbeData->DW14.VerticalFrameOriginLayer6);
4882     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW15.Value = %x", curbeData->DW15.Value);
4883     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer7 = %x",
4884         curbeData->DW15.VerticalFrameOriginLayer7);
4885     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW16.Value = %x", curbeData->DW16.Value);
4886     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer0 = %x",
4887         curbeData->DW16.HorizontalScalingStepRatioLayer0);
4888     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW17.Value = %x", curbeData->DW17.Value);
4889     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer1 = %x",
4890         curbeData->DW17.HorizontalScalingStepRatioLayer1);
4891     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW18.Value = %x", curbeData->DW18.Value);
4892     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer2 = %x",
4893         curbeData->DW18.HorizontalScalingStepRatioLayer2);
4894     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW19.Value = %x", curbeData->DW19.Value);
4895     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer3 = %x",
4896         curbeData->DW19.HorizontalScalingStepRatioLayer3);
4897     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW20.Value = %x", curbeData->DW20.Value);
4898     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer4 = %x",
4899         curbeData->DW20.HorizontalScalingStepRatioLayer4);
4900     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW21.Value = %x", curbeData->DW21.Value);
4901     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer5 = %x",
4902         curbeData->DW21.HorizontalScalingStepRatioLayer5);
4903     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW22.Value = %x", curbeData->DW22.Value);
4904     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer6 = %x",
4905         curbeData->DW22.HorizontalScalingStepRatioLayer6);
4906     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW23.Value = %x", curbeData->DW23.Value);
4907     VP_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer7 = %x",
4908         curbeData->DW23.HorizontalScalingStepRatioLayer7);
4909     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW24.Value = %x", curbeData->DW24.Value);
4910     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer0 = %x",
4911         curbeData->DW24.VerticalScalingStepRatioLayer0);
4912     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW25.Value = %x", curbeData->DW25.Value);
4913     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer1 = %x",
4914         curbeData->DW25.VerticalScalingStepRatioLayer1);
4915     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW26.Value = %x", curbeData->DW26.Value);
4916     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer2 = %x",
4917         curbeData->DW26.VerticalScalingStepRatioLayer2);
4918     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW27.Value = %x", curbeData->DW27.Value);
4919     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer3 = %x",
4920         curbeData->DW27.VerticalScalingStepRatioLayer3);
4921     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW28.Value = %x", curbeData->DW28.Value);
4922     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer4 = %x",
4923         curbeData->DW28.VerticalScalingStepRatioLayer4);
4924     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW29.Value = %x", curbeData->DW29.Value);
4925     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer5 = %x",
4926         curbeData->DW29.VerticalScalingStepRatioLayer5);
4927     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW30.Value = %x", curbeData->DW30.Value);
4928     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer6 = %x",
4929         curbeData->DW30.VerticalScalingStepRatioLayer6);
4930     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW31.Value = %x", curbeData->DW31.Value);
4931     VP_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer7 = %x",
4932         curbeData->DW31.VerticalScalingStepRatioLayer7);
4933     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW32.Value = %d", curbeData->DW32.Value);
4934     VP_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer0 = 0x%d, TopCoordinateRectangleLayer0 = 0x%d",
4935         curbeData->DW32.LeftCoordinateRectangleLayer0,
4936         curbeData->DW32.TopCoordinateRectangleLayer0);
4937     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW33.Value = %d", curbeData->DW33.Value);
4938     VP_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer1 = 0x%d, TopCoordinateRectangleLayer2 = 0x%d",
4939         curbeData->DW33.LeftCoordinateRectangleLayer1,
4940         curbeData->DW33.TopCoordinateRectangleLayer1);
4941     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW34.Value = %d", curbeData->DW34.Value);
4942     VP_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer2 = 0x%d, TopCoordinateRectangleLayer2 = 0x%d",
4943         curbeData->DW34.LeftCoordinateRectangleLayer2,
4944         curbeData->DW34.TopCoordinateRectangleLayer2);
4945     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW35.Value = %d", curbeData->DW35.Value);
4946     VP_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer3 = 0x%d, TopCoordinateRectangleLayer3 = 0x%d",
4947         curbeData->DW35.LeftCoordinateRectangleLayer3,
4948         curbeData->DW35.TopCoordinateRectangleLayer3);
4949     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW36.Value = %d", curbeData->DW36.Value);
4950     VP_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer4 = 0x%d, TopCoordinateRectangleLayer4 = 0x%d",
4951         curbeData->DW36.LeftCoordinateRectangleLayer4,
4952         curbeData->DW36.TopCoordinateRectangleLayer4);
4953     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW37.Value = %d", curbeData->DW37.Value);
4954     VP_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer5 = 0x%d, TopCoordinateRectangleLayer5 = 0x%d",
4955         curbeData->DW37.LeftCoordinateRectangleLayer5,
4956         curbeData->DW37.TopCoordinateRectangleLayer5);
4957     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW38.Value = %d", curbeData->DW38.Value);
4958     VP_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer6 = 0x%d, TopCoordinateRectangleLayer6 = 0x%d",
4959         curbeData->DW38.LeftCoordinateRectangleLayer6,
4960         curbeData->DW38.TopCoordinateRectangleLayer6);
4961     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW39.Value = %d", curbeData->DW39.Value);
4962     VP_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer7 = 0x%d, TopCoordinateRectangleLayer7 = 0x%d",
4963         curbeData->DW39.LeftCoordinateRectangleLayer7,
4964         curbeData->DW39.TopCoordinateRectangleLayer7);
4965     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW40.Value = %d", curbeData->DW40.Value);
4966     VP_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer0 = 0x%d, RightCoordinateRectangleLayer0 = 0x%d",
4967         curbeData->DW40.BottomCoordinateRectangleLayer0,
4968         curbeData->DW40.RightCoordinateRectangleLayer0);
4969     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW41.Value = %d", curbeData->DW41.Value);
4970     VP_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer1 = 0x%d, RightCoordinateRectangleLayer1 = 0x%d",
4971         curbeData->DW41.BottomCoordinateRectangleLayer1,
4972         curbeData->DW41.RightCoordinateRectangleLayer1);
4973     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW42.Value = %d", curbeData->DW42.Value);
4974     VP_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer2 = 0x%d, RightCoordinateRectangleLayer2 = 0x%d",
4975         curbeData->DW42.BottomCoordinateRectangleLayer2,
4976         curbeData->DW42.RightCoordinateRectangleLayer2);
4977     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW43.Value = %d", curbeData->DW43.Value);
4978     VP_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer3 = 0x%d, RightCoordinateRectangleLayer3 = 0x%d",
4979         curbeData->DW43.BottomCoordinateRectangleLayer3,
4980         curbeData->DW43.RightCoordinateRectangleLayer3);
4981     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW44.Value = %d", curbeData->DW44.Value);
4982     VP_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer4 = 0x%d, RightCoordinateRectangleLayer4 = 0x%d",
4983         curbeData->DW44.BottomCoordinateRectangleLayer4,
4984         curbeData->DW44.RightCoordinateRectangleLayer4);
4985     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW45.Value = %d", curbeData->DW45.Value);
4986     VP_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer5 = 0x%d, RightCoordinateRectangleLayer5 = 0x%d",
4987         curbeData->DW45.BottomCoordinateRectangleLayer5,
4988         curbeData->DW45.RightCoordinateRectangleLayer5);
4989     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW46.Value = %d", curbeData->DW46.Value);
4990     VP_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer6 = 0x%d, RightCoordinateRectangleLayer6 = 0x%d",
4991         curbeData->DW46.BottomCoordinateRectangleLayer6,
4992         curbeData->DW46.RightCoordinateRectangleLayer6);
4993     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW47.Value = %d", curbeData->DW47.Value);
4994     VP_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer7 = 0x%d, RightCoordinateRectangleLayer7 = 0x%d",
4995         curbeData->DW47.BottomCoordinateRectangleLayer7,
4996         curbeData->DW47.RightCoordinateRectangleLayer7);
4997     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW48.Value = %d", curbeData->DW48.Value);
4998     VP_RENDER_VERBOSEMESSAGE("CurbeData:     CCMEnablingFlagLayer0 = %d, CCMExtensionEnablingFlagLayer0 = %d, ChannelSwapEnablingFlagLayer0 = %d, ChromaSittingLocationLayer0 = %d, Enabling3DLUTFlagLayer0 = %d, EOTF1DLUTEnablingFlagLayer0 = %d, FormatDescriptorLayer0 = %d, IEFBypassEnablingFlagLayer0 = %d, OETF1DLUTEnablingFlagLayer0 = %d, PostCSCEnablingFlagLayer0 = %d, PriorCSCEnablingFlagLayer0 = %d, RotationAngleMirrorDirectionLayer0 = %d, SamplerIndexFirstPlaneLayer0 = %d, SamplerIndexSecondThirdPlaneLayer0 = %d, ToneMappingEnablingFlagLayer0 = %d",
4999         curbeData->DW48.CCMEnablingFlagLayer0,
5000         curbeData->DW48.CCMExtensionEnablingFlagLayer0,
5001         curbeData->DW48.ChannelSwapEnablingFlagLayer0,
5002         curbeData->DW48.ChromaSittingLocationLayer0,
5003         curbeData->DW48.Enabling3DLUTFlagLayer0,
5004         curbeData->DW48.EOTF1DLUTEnablingFlagLayer0,
5005         curbeData->DW48.FormatDescriptorLayer0,
5006         curbeData->DW48.IEFBypassEnablingFlagLayer0,
5007         curbeData->DW48.OETF1DLUTEnablingFlagLayer0,
5008         curbeData->DW48.PostCSCEnablingFlagLayer0,
5009         curbeData->DW48.PriorCSCEnablingFlagLayer0,
5010         curbeData->DW48.RotationAngleMirrorDirectionLayer0,
5011         curbeData->DW48.SamplerIndexFirstPlaneLayer0,
5012         curbeData->DW48.SamplerIndexSecondThirdPlaneLayer0,
5013         curbeData->DW48.ToneMappingEnablingFlagLayer0);
5014     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW49.Value = %d", curbeData->DW49.Value);
5015     VP_RENDER_VERBOSEMESSAGE("CurbeData:     CCMEnablingFlagLayer1 = %d, CCMExtensionEnablingFlagLayer1 = %d, ChannelSwapEnablingFlagLayer1 = %d, ChromaSittingLocationLayer1 = %d, Enabling3DLUTFlagLayer1 = %d, EOTF1DLUTEnablingFlagLayer1 = %d, FormatDescriptorLayer1 = %d, IEFBypassEnablingFlagLayer1 = %d, OETF1DLUTEnablingFlagLayer0 = %d, PostCSCEnablingFlagLayer1 = %d, PriorCSCEnablingFlagLayer1 = %d, RotationAngleMirrorDirectionLayer1 = %d, SamplerIndexFirstPlaneLayer0 = %d, SamplerIndexSecondThirdPlaneLayer1 = %d, ToneMappingEnablingFlagLayer1 = %d",
5016         curbeData->DW49.CCMEnablingFlagLayer1,
5017         curbeData->DW49.CCMExtensionEnablingFlagLayer1,
5018         curbeData->DW49.ChannelSwapEnablingFlagLayer1,
5019         curbeData->DW49.ChromaSittingLocationLayer1,
5020         curbeData->DW49.Enabling3DLUTFlagLayer1,
5021         curbeData->DW49.EOTF1DLUTEnablingFlagLayer1,
5022         curbeData->DW49.FormatDescriptorLayer1,
5023         curbeData->DW49.IEFBypassEnablingFlagLayer1,
5024         curbeData->DW49.OETF1DLUTEnablingFlagLayer1,
5025         curbeData->DW49.PostCSCEnablingFlagLayer1,
5026         curbeData->DW49.PriorCSCEnablingFlagLayer1,
5027         curbeData->DW49.RotationAngleMirrorDirectionLayer1,
5028         curbeData->DW49.SamplerIndexFirstPlaneLayer1,
5029         curbeData->DW49.SamplerIndexSecondThirdPlaneLayer1,
5030         curbeData->DW49.ToneMappingEnablingFlagLayer1);
5031     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW50.Value = %d", curbeData->DW50.Value);
5032     VP_RENDER_VERBOSEMESSAGE("CurbeData:     CCMEnablingFlagLayer2 = %d, CCMExtensionEnablingFlagLayer2 = %d, ChannelSwapEnablingFlagLayer2 = %d, ChromaSittingLocationLayer2 = %d, Enabling3DLUTFlagLayer2 = %d, EOTF1DLUTEnablingFlagLayer2 = %d, FormatDescriptorLayer2 = %d, IEFBypassEnablingFlagLayer2 = %d, OETF1DLUTEnablingFlagLayer2 = %d, PostCSCEnablingFlagLayer2 = %d, PriorCSCEnablingFlagLayer2 = %d, RotationAngleMirrorDirectionLayer2 = %d, SamplerIndexFirstPlaneLayer2 = %d, SamplerIndexSecondThirdPlaneLayer2 = %d, ToneMappingEnablingFlagLayer2 = %d",
5033         curbeData->DW50.CCMEnablingFlagLayer2,
5034         curbeData->DW50.CCMExtensionEnablingFlagLayer2,
5035         curbeData->DW50.ChannelSwapEnablingFlagLayer2,
5036         curbeData->DW50.ChromaSittingLocationLayer2,
5037         curbeData->DW50.Enabling3DLUTFlagLayer2,
5038         curbeData->DW50.EOTF1DLUTEnablingFlagLayer2,
5039         curbeData->DW50.FormatDescriptorLayer2,
5040         curbeData->DW50.IEFBypassEnablingFlagLayer2,
5041         curbeData->DW50.OETF1DLUTEnablingFlagLayer2,
5042         curbeData->DW50.PostCSCEnablingFlagLayer2,
5043         curbeData->DW50.PriorCSCEnablingFlagLayer2,
5044         curbeData->DW50.RotationAngleMirrorDirectionLayer2,
5045         curbeData->DW50.SamplerIndexFirstPlaneLayer2,
5046         curbeData->DW50.SamplerIndexSecondThirdPlaneLayer2,
5047         curbeData->DW50.ToneMappingEnablingFlagLayer2);
5048     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW51.Value = %d", curbeData->DW51.Value);
5049     VP_RENDER_VERBOSEMESSAGE("CurbeData:     CCMEnablingFlagLayer3 = %d, CCMExtensionEnablingFlagLayer3 = %d, ChannelSwapEnablingFlagLayer3 = %d, ChromaSittingLocationLayer3 = %d, Enabling3DLUTFlagLayer3 = %d, EOTF1DLUTEnablingFlagLayer3 = %d, FormatDescriptorLayer3 = %d, IEFBypassEnablingFlagLayer3 = %d, OETF1DLUTEnablingFlagLayer3 = %d, PostCSCEnablingFlagLayer3 = %d, PriorCSCEnablingFlagLayer3 = %d, RotationAngleMirrorDirectionLayer3 = %d, SamplerIndexFirstPlaneLayer3 = %d, SamplerIndexSecondThirdPlaneLayer3 = %d, ToneMappingEnablingFlagLayer3 = %d",
5050         curbeData->DW51.CCMEnablingFlagLayer3,
5051         curbeData->DW51.CCMExtensionEnablingFlagLayer3,
5052         curbeData->DW51.ChannelSwapEnablingFlagLayer3,
5053         curbeData->DW51.ChromaSittingLocationLayer3,
5054         curbeData->DW51.Enabling3DLUTFlagLayer3,
5055         curbeData->DW51.EOTF1DLUTEnablingFlagLayer3,
5056         curbeData->DW51.FormatDescriptorLayer3,
5057         curbeData->DW51.IEFBypassEnablingFlagLayer3,
5058         curbeData->DW51.OETF1DLUTEnablingFlagLayer3,
5059         curbeData->DW51.PostCSCEnablingFlagLayer3,
5060         curbeData->DW51.PriorCSCEnablingFlagLayer3,
5061         curbeData->DW51.RotationAngleMirrorDirectionLayer3,
5062         curbeData->DW51.SamplerIndexFirstPlaneLayer3,
5063         curbeData->DW51.SamplerIndexSecondThirdPlaneLayer3,
5064         curbeData->DW51.ToneMappingEnablingFlagLayer3);
5065     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW52.Value = %d", curbeData->DW52.Value);
5066     VP_RENDER_VERBOSEMESSAGE("CurbeData:     CCMEnablingFlagLayer4 = %d, CCMExtensionEnablingFlagLayer4 = %d, ChannelSwapEnablingFlagLayer4 = %d, ChromaSittingLocationLayer4 = %d, Enabling3DLUTFlagLayer4 = %d, EOTF1DLUTEnablingFlagLayer4 = %d, FormatDescriptorLayer4 = %d, IEFBypassEnablingFlagLayer4 = %d, OETF1DLUTEnablingFlagLayer4 = %d, PostCSCEnablingFlagLayer4 = %d, PriorCSCEnablingFlagLayer4 = %d, RotationAngleMirrorDirectionLayer4 = %d, SamplerIndexFirstPlaneLayer4 = %d, SamplerIndexSecondThirdPlaneLayer4 = %d, ToneMappingEnablingFlagLayer4 = %d",
5067         curbeData->DW52.CCMEnablingFlagLayer4,
5068         curbeData->DW52.CCMExtensionEnablingFlagLayer4,
5069         curbeData->DW52.ChannelSwapEnablingFlagLayer4,
5070         curbeData->DW52.ChromaSittingLocationLayer4,
5071         curbeData->DW52.Enabling3DLUTFlagLayer4,
5072         curbeData->DW52.EOTF1DLUTEnablingFlagLayer4,
5073         curbeData->DW52.FormatDescriptorLayer4,
5074         curbeData->DW52.IEFBypassEnablingFlagLayer4,
5075         curbeData->DW52.OETF1DLUTEnablingFlagLayer4,
5076         curbeData->DW52.PostCSCEnablingFlagLayer4,
5077         curbeData->DW52.PriorCSCEnablingFlagLayer4,
5078         curbeData->DW52.RotationAngleMirrorDirectionLayer4,
5079         curbeData->DW52.SamplerIndexFirstPlaneLayer4,
5080         curbeData->DW52.SamplerIndexSecondThirdPlaneLayer4,
5081         curbeData->DW52.ToneMappingEnablingFlagLayer4);
5082     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW53.Value = %d", curbeData->DW53.Value);
5083     VP_RENDER_VERBOSEMESSAGE("CurbeData:     CCMEnablingFlagLayer5 = %d, CCMExtensionEnablingFlagLayer5 = %d, ChannelSwapEnablingFlagLayer5 = %d, ChromaSittingLocationLayer5 = %d, Enabling3DLUTFlagLayer5 = %d, EOTF1DLUTEnablingFlagLayer5 = %d, FormatDescriptorLayer5 = %d, IEFBypassEnablingFlagLayer5 = %d, OETF1DLUTEnablingFlagLayer5 = %d, PostCSCEnablingFlagLayer5 = %d, PriorCSCEnablingFlagLayer5 = %d, RotationAngleMirrorDirectionLayer5 = %d, SamplerIndexFirstPlaneLayer5 = %d, SamplerIndexSecondThirdPlaneLayer5 = %d, ToneMappingEnablingFlagLayer5 = %d",
5084         curbeData->DW53.CCMEnablingFlagLayer5,
5085         curbeData->DW53.CCMExtensionEnablingFlagLayer5,
5086         curbeData->DW53.ChannelSwapEnablingFlagLayer5,
5087         curbeData->DW53.ChromaSittingLocationLayer5,
5088         curbeData->DW53.Enabling3DLUTFlagLayer5,
5089         curbeData->DW53.EOTF1DLUTEnablingFlagLayer5,
5090         curbeData->DW53.FormatDescriptorLayer5,
5091         curbeData->DW53.IEFBypassEnablingFlagLayer5,
5092         curbeData->DW53.OETF1DLUTEnablingFlagLayer5,
5093         curbeData->DW53.PostCSCEnablingFlagLayer5,
5094         curbeData->DW53.PriorCSCEnablingFlagLayer5,
5095         curbeData->DW53.RotationAngleMirrorDirectionLayer5,
5096         curbeData->DW53.SamplerIndexFirstPlaneLayer5,
5097         curbeData->DW53.SamplerIndexSecondThirdPlaneLayer5,
5098         curbeData->DW53.ToneMappingEnablingFlagLayer5);
5099     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW54.Value = %d", curbeData->DW54.Value);
5100     VP_RENDER_VERBOSEMESSAGE("CurbeData:     CCMEnablingFlagLayer6 = %d, CCMExtensionEnablingFlagLayer6 = %d, ChannelSwapEnablingFlagLayer6 = %d, ChromaSittingLocationLayer6 = %d, Enabling3DLUTFlagLayer6 = %d, EOTF1DLUTEnablingFlagLayer6 = %d, FormatDescriptorLayer6 = %d, IEFBypassEnablingFlagLayer6 = %d, OETF1DLUTEnablingFlagLayer6 = %d, PostCSCEnablingFlagLayer6 = %d, PriorCSCEnablingFlagLayer6 = %d, RotationAngleMirrorDirectionLayer6 = %d, SamplerIndexFirstPlaneLayer6 = %d, SamplerIndexSecondThirdPlaneLayer6 = %d, ToneMappingEnablingFlagLayer6 = %d",
5101         curbeData->DW54.CCMEnablingFlagLayer6,
5102         curbeData->DW54.CCMExtensionEnablingFlagLayer6,
5103         curbeData->DW54.ChannelSwapEnablingFlagLayer6,
5104         curbeData->DW54.ChromaSittingLocationLayer6,
5105         curbeData->DW54.Enabling3DLUTFlagLayer6,
5106         curbeData->DW54.EOTF1DLUTEnablingFlagLayer6,
5107         curbeData->DW54.FormatDescriptorLayer6,
5108         curbeData->DW54.IEFBypassEnablingFlagLayer6,
5109         curbeData->DW54.OETF1DLUTEnablingFlagLayer6,
5110         curbeData->DW54.PostCSCEnablingFlagLayer6,
5111         curbeData->DW54.PriorCSCEnablingFlagLayer6,
5112         curbeData->DW54.RotationAngleMirrorDirectionLayer6,
5113         curbeData->DW54.SamplerIndexFirstPlaneLayer6,
5114         curbeData->DW54.SamplerIndexSecondThirdPlaneLayer6,
5115         curbeData->DW54.ToneMappingEnablingFlagLayer6);
5116     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW55.Value = %x", curbeData->DW55.Value);
5117     VP_RENDER_VERBOSEMESSAGE("CurbeData:     CCMEnablingFlagLayer7 = %d, CCMExtensionEnablingFlagLayer7 = %d, ChannelSwapEnablingFlagLayer7 = %d, ChromaSittingLocationLayer7 = %d, Enabling3DLUTFlagLayer7 = %d, EOTF1DLUTEnablingFlagLayer7 = %d, FormatDescriptorLayer7 = %d, IEFBypassEnablingFlagLayer7 = %d, OETF1DLUTEnablingFlagLayer7 = %d, PostCSCEnablingFlagLayer7 = %d, PriorCSCEnablingFlagLayer7 = %d, RotationAngleMirrorDirectionLayer7 = %d, SamplerIndexFirstPlaneLayer7 = %d, SamplerIndexSecondThirdPlaneLayer7 = %d, ToneMappingEnablingFlagLayer7 = %d",
5118         curbeData->DW55.CCMEnablingFlagLayer7,
5119         curbeData->DW55.CCMExtensionEnablingFlagLayer7,
5120         curbeData->DW55.ChannelSwapEnablingFlagLayer7,
5121         curbeData->DW55.ChromaSittingLocationLayer7,
5122         curbeData->DW55.Enabling3DLUTFlagLayer7,
5123         curbeData->DW55.EOTF1DLUTEnablingFlagLayer7,
5124         curbeData->DW55.FormatDescriptorLayer7,
5125         curbeData->DW55.IEFBypassEnablingFlagLayer7,
5126         curbeData->DW55.OETF1DLUTEnablingFlagLayer7,
5127         curbeData->DW55.PostCSCEnablingFlagLayer7,
5128         curbeData->DW55.PriorCSCEnablingFlagLayer7,
5129         curbeData->DW55.RotationAngleMirrorDirectionLayer7,
5130         curbeData->DW55.SamplerIndexFirstPlaneLayer7,
5131         curbeData->DW55.SamplerIndexSecondThirdPlaneLayer7,
5132         curbeData->DW55.ToneMappingEnablingFlagLayer7);
5133     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW56.Value = %d", curbeData->DW56.Value);
5134     VP_RENDER_VERBOSEMESSAGE("CurbeData:     ConstantBlendingAlphaFillColorLayer0 = %d, ConstantBlendingAlphaFillColorLayer1 = %d, ConstantBlendingAlphaFillColorLayer2 = %d, ConstantBlendingAlphaFillColorLayer3 = %d",
5135         curbeData->DW56.ConstantBlendingAlphaFillColorLayer0,
5136         curbeData->DW56.ConstantBlendingAlphaFillColorLayer1,
5137         curbeData->DW56.ConstantBlendingAlphaFillColorLayer2,
5138         curbeData->DW56.ConstantBlendingAlphaFillColorLayer3);
5139     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW57.Value = %d", curbeData->DW57.Value);
5140     VP_RENDER_VERBOSEMESSAGE("CurbeData:     ConstantBlendingAlphaFillColorLayer4 = %d, ConstantBlendingAlphaFillColorLayer5 = %d, ConstantBlendingAlphaFillColorLayer6 = %d, ConstantBlendingAlphaFillColorLayer7 = %d",
5141         curbeData->DW57.ConstantBlendingAlphaFillColorLayer4,
5142         curbeData->DW57.ConstantBlendingAlphaFillColorLayer5,
5143         curbeData->DW57.ConstantBlendingAlphaFillColorLayer6,
5144         curbeData->DW57.ConstantBlendingAlphaFillColorLayer7);
5145     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW58.Value = %d", curbeData->DW58.Value);
5146     VP_RENDER_VERBOSEMESSAGE("CurbeData:     TwoLayerOperationLayer0 = %d, TwoLayerOperationLayer1 = %d, TwoLayerOperationLayer2 = %d, TwoLayerOperationLayer3 = %d",
5147         curbeData->DW58.TwoLayerOperationLayer0,
5148         curbeData->DW58.TwoLayerOperationLayer1,
5149         curbeData->DW58.TwoLayerOperationLayer2,
5150         curbeData->DW58.TwoLayerOperationLayer3);
5151     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW59.Value = %d", curbeData->DW59.Value);
5152     VP_RENDER_VERBOSEMESSAGE("CurbeData:     TwoLayerOperationLayer4 = %d, TwoLayerOperationLayer5 = %d, TwoLayerOperationLayer6 = %d, TwoLayerOperationLayer7 = %d",
5153         curbeData->DW59.TwoLayerOperationLayer4,
5154         curbeData->DW59.TwoLayerOperationLayer5,
5155         curbeData->DW59.TwoLayerOperationLayer6,
5156         curbeData->DW59.TwoLayerOperationLayer7);
5157     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW60.Value = %d", curbeData->DW60.Value);
5158     VP_RENDER_VERBOSEMESSAGE("CurbeData:     FixedPointFillColorGYChannel = %d, FixedPointFillColorRVChannel = %d",
5159         curbeData->DW60.FixedPointFillColorGYChannel,
5160         curbeData->DW60.FixedPointFillColorRVChannel);
5161     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW61.Value = %x", curbeData->DW61.Value);
5162     VP_RENDER_VERBOSEMESSAGE("CurbeData:     FixedPointFillColorAlphaChannel = %d, FixedPointFillColorBUChannel = %d",
5163         curbeData->DW61.FixedPointFillColorAlphaChannel,
5164         curbeData->DW61.FixedPointFillColorBUChannel);
5165     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW62.Value = %d", curbeData->DW62.Value);
5166     VP_RENDER_VERBOSEMESSAGE("CurbeData:     DestinationHeight = %d, DestinationWidth = %d",
5167         curbeData->DW62.DestinationHeight,
5168         curbeData->DW62.DestinationWidth);
5169     VP_RENDER_VERBOSEMESSAGE("CurbeData: DW63.Value = %d", curbeData->DW63.Value);
5170     VP_RENDER_VERBOSEMESSAGE("CurbeData:     ChannelSwapEnablingFlagDestination = %d, ChromaSittingLocationDestination = %d, DitherRoundEnablingFlagDestinationSurface = %d, DstCSCEnablingFlagDestination = %d, FormatDescriptorDestination = %d, Reserved = %d, TotalNumberInputLayers = %d",
5171         curbeData->DW63.ChannelSwapEnablingFlagDestination,
5172         curbeData->DW63.ChromaSittingLocationDestination,
5173         curbeData->DW63.DitherRoundEnablingFlagDestinationSurface,
5174         curbeData->DW63.DstCSCEnablingFlagDestination,
5175         curbeData->DW63.FormatDescriptorDestination,
5176         curbeData->DW63.Reserved,
5177         curbeData->DW63.TotalNumberInputLayers);
5178 #endif
5179 }