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(¶ms->srcHDRParams[0], ¶ms->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 }