1 /*
2 * Copyright (c) 2010-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      vphal_render_hdr_g9.cpp
24 //! \brief         Rendering definitions for Unified VP HAL HDR processing
25 //!
26 
27 #include "vphal_render_hdr_base.h"
28 #include "vphal_render_hdr_g9_base.h"
29 #include "vphal_render_composite.h"
30 #include "vp_hal_ddi_utils.h"
31 #include "renderhal_platform_interface.h"
32 
33 #include "vphal_renderer.h"
34 #include "vphal_debug.h"
35 #include <fstream>
36 #include <string>
37 
38 #include "hal_oca_interface.h"
39 #include "vphal_render_ief.h"
40 
41 enum HDR_TMMODE {
42     PREPROCESS_TM_S2H,
43     PREPROCESS_TM_H2S,
44     PREPROCESS_TM_H2S_AUTO,
45     PREPROCESS_TM_H2H,
46     PREPROCESS_TM_MAX
47 };
48 
49 MEDIA_WALKER_HDR_STATIC_DATA_G9 g_cInit_MEDIA_STATIC_HDR_g9 =
50 {
51     // DWORD 0
52     {
53         { 0.0 }
54     },
55 
56     // DWORD 1
57     {
58         { 0.0 }
59     },
60 
61     // DWORD 2
62     {
63         { 0.0 }
64     },
65 
66     // DWORD 3
67     {
68         { 0.0 }
69     },
70 
71     // DWORD 4
72     {
73         { 0.0 }
74     },
75 
76     // DWORD 5
77     {
78         { 0.0 }
79     },
80 
81     // DWORD 6
82     {
83         { 0.0 }
84     },
85 
86     // DWORD 7
87     {
88         { 0.0 }
89     },
90 
91     // DWORD 8
92     {
93         { 0.0 }
94     },
95 
96     // DWORD 9
97     {
98         { 0.0 }
99     },
100 
101     // DWORD 10
102     {
103         { 0.0 }
104     },
105 
106     // DWORD 11
107     {
108         { 0.0 }
109     },
110 
111     // DWORD 12
112     {
113         { 0.0 }
114     },
115 
116     // DWORD 13
117     {
118         { 0.0 }
119     },
120 
121     // DWORD 14
122     {
123         { 0.0 }
124     },
125 
126     // DWORD 15
127     {
128         { 0.0 }
129     },
130 
131     // DWORD 16
132     {
133         { 0.0 }
134     },
135 
136     // DWORD 17
137     {
138         { 0.0 }
139     },
140 
141     // DWORD 18
142     {
143         { 0.0 }
144     },
145 
146     // DWORD 19
147     {
148         { 0.0 }
149     },
150 
151     // DWORD 20
152     {
153         { 0.0 }
154     },
155 
156     // DWORD 21
157     {
158         { 0.0 }
159     },
160 
161     // DWORD 22
162     {
163         { 0.0 }
164     },
165 
166     // DWORD 23
167     {
168         { 0.0 }
169     },
170 
171     // DWORD 24
172     {
173         { 0.0 }
174     },
175 
176     // DWORD 25
177     {
178         { 0.0 }
179     },
180 
181     // DWORD 26
182     {
183         { 0.0 }
184     },
185 
186     // DWORD 27
187     {
188         { 0.0 }
189     },
190 
191     // DWORD 28
192     {
193         { 0.0 }
194     },
195 
196     // DWORD 29
197     {
198         { 0.0 }
199     },
200 
201     // DWORD 30
202     {
203         { 0.0 }
204     },
205 
206     // DWORD 31
207     {
208         { 0.0 }
209     },
210 
211     // DWORD 32
212     {
213         { 0, 0 }
214     },
215 
216     // DWORD 33
217     {
218         { 0, 0 }
219     },
220 
221     // DWORD 34
222     {
223         { 0, 0 }
224     },
225 
226     // DWORD 35
227     {
228         { 0, 0 }
229     },
230 
231     // DWORD 36
232     {
233         { 0, 0 }
234     },
235 
236     // DWORD 37
237     {
238         { 0, 0 }
239     },
240 
241     // DWORD 38
242     {
243         { 0, 0 }
244     },
245 
246     // DWORD 39
247     {
248         { 0, 0 }
249     },
250 
251     // DWORD 40
252     {
253         { 0, 0 }
254     },
255 
256     // DWORD 41
257     {
258         { 0, 0 }
259     },
260 
261     // DWORD 42
262     {
263         { 0, 0 }
264     },
265 
266     // DWORD 43
267     {
268         { 0, 0 }
269     },
270 
271     // DWORD 44
272     {
273         { 0, 0 }
274     },
275 
276     // DWORD 45
277     {
278         { 0, 0 }
279     },
280 
281     // DWORD 46
282     {
283         { 0, 0 }
284     },
285 
286     // DWORD 47
287     {
288         { 0, 0 }
289     },
290 
291     // DWORD 48
292     {
293         {
294             0,      // FormatDescriptorLayer0
295             0,      // ChromaSittingLocationLayer0
296             0,      // ChannelSwapEnablingFlagLayer0
297             0,      // IEFBypassEnablingFlagLayer0
298             0,      // RotationAngleMirrorDirectionLayer0
299             0,      // SamplerIndexFirstPlaneLayer0
300             0,      // SamplerIndexSecondThirdPlaneLayer0
301             0,      // Reserved
302             0,      // PriorCSCEnablingFlagLayer0
303             0,      // EOTF1DLUTEnablingFlagLayer0
304             0,      // CCMEnablingFlagLayer0
305             0,      // OETF1DLUTEnablingFlagLayer0
306             0,      // PostCSCEnablingFlagLayer0
307             0       // Enabling3DLUTFlagLayer0
308         }
309     },
310 
311     // DWORD 49
312     {
313         {
314             0,      // FormatDescriptorLayer1
315             0,      // ChromaSittingLocationLayer1
316             0,      // ChannelSwapEnablingFlagLayer1
317             0,      // IEFBypassEnablingFlagLayer1
318             0,      // RotationAngleMirrorDirectionLayer1
319             0,      // SamplerIndexFirstPlaneLayer1
320             0,      // SamplerIndexSecondThirdPlaneLayer1
321             0,      // Reserved
322             0,      // PriorCSCEnablingFlagLayer1
323             0,      // EOTF1DLUTEnablingFlagLayer1
324             0,      // CCMEnablingFlagLayer1
325             0,      // OETF1DLUTEnablingFlagLayer1
326             0,      // PostCSCEnablingFlagLayer1
327             0       // Enabling3DLUTFlagLayer1
328         }
329     },
330 
331     // DWORD 50
332     {
333         {
334             0,      // FormatDescriptorLayer2
335             0,      // ChromaSittingLocationLayer2
336             0,      // ChannelSwapEnablingFlagLayer2
337             0,      // IEFBypassEnablingFlagLayer2
338             0,      // RotationAngleMirrorDirectionLayer2
339             0,      // SamplerIndexFirstPlaneLayer2
340             0,      // SamplerIndexSecondThirdPlaneLayer2
341             0,      // Reserved
342             0,      // PriorCSCEnablingFlagLayer2
343             0,      // EOTF1DLUTEnablingFlagLayer2
344             0,      // CCMEnablingFlagLayer2
345             0,      // OETF1DLUTEnablingFlagLayer2
346             0,      // PostCSCEnablingFlagLayer2
347             0       // Enabling3DLUTFlagLayer2
348         }
349     },
350 
351     // DWORD 51
352     {
353         {
354             0,      // FormatDescriptorLayer3
355             0,      // ChromaSittingLocationLayer3
356             0,      // ChannelSwapEnablingFlagLayer3
357             0,      // IEFBypassEnablingFlagLayer3
358             0,      // RotationAngleMirrorDirectionLayer3
359             0,      // SamplerIndexFirstPlaneLayer3
360             0,      // SamplerIndexSecondThirdPlaneLayer3
361             0,      // Reserved
362             0,      // PriorCSCEnablingFlagLayer3
363             0,      // EOTF1DLUTEnablingFlagLayer3
364             0,      // CCMEnablingFlagLayer3
365             0,      // OETF1DLUTEnablingFlagLayer3
366             0,      // PostCSCEnablingFlagLayer3
367             0       // Enabling3DLUTFlagLayer3
368         }
369     },
370 
371     // DWORD 52
372     {
373         {
374             0,      // FormatDescriptorLayer4
375             0,      // ChromaSittingLocationLayer4
376             0,      // ChannelSwapEnablingFlagLayer4
377             0,      // IEFBypassEnablingFlagLayer4
378             0,      // RotationAngleMirrorDirectionLayer4
379             0,      // SamplerIndexFirstPlaneLayer4
380             0,      // SamplerIndexSecondThirdPlaneLayer4
381             0,      // Reserved
382             0,      // PriorCSCEnablingFlagLayer4
383             0,      // EOTF1DLUTEnablingFlagLayer4
384             0,      // CCMEnablingFlagLayer4
385             0,      // OETF1DLUTEnablingFlagLayer4
386             0,      // PostCSCEnablingFlagLayer4
387             0       // Enabling3DLUTFlagLayer4
388         }
389     },
390 
391     // DWORD 53
392     {
393         {
394             0,      // FormatDescriptorLayer5
395             0,      // ChromaSittingLocationLayer5
396             0,      // ChannelSwapEnablingFlagLayer5
397             0,      // IEFBypassEnablingFlagLayer5
398             0,      // RotationAngleMirrorDirectionLayer5
399             0,      // SamplerIndexFirstPlaneLayer5
400             0,      // SamplerIndexSecondThirdPlaneLayer5
401             0,      // Reserved
402             0,      // PriorCSCEnablingFlagLayer5
403             0,      // EOTF1DLUTEnablingFlagLayer5
404             0,      // CCMEnablingFlagLayer5
405             0,      // OETF1DLUTEnablingFlagLayer5
406             0,      // PostCSCEnablingFlagLayer5
407             0       // Enabling3DLUTFlagLayer5
408         }
409     },
410 
411     // DWORD 54
412     {
413         {
414             0,      // FormatDescriptorLayer6
415             0,      // ChromaSittingLocationLayer6
416             0,      // ChannelSwapEnablingFlagLayer6
417             0,      // IEFBypassEnablingFlagLayer6
418             0,      // RotationAngleMirrorDirectionLayer6
419             0,      // SamplerIndexFirstPlaneLayer6
420             0,      // SamplerIndexSecondThirdPlaneLayer6
421             0,      // Reserved
422             0,      // PriorCSCEnablingFlagLayer6
423             0,      // EOTF1DLUTEnablingFlagLayer6
424             0,      // CCMEnablingFlagLayer6
425             0,      // OETF1DLUTEnablingFlagLayer6
426             0,      // PostCSCEnablingFlagLayer6
427             0       // Enabling3DLUTFlagLayer6
428         }
429     },
430 
431     // DWORD 55
432     {
433         {
434             0,      // FormatDescriptorLayer7
435             0,      // ChromaSittingLocationLayer7
436             0,      // ChannelSwapEnablingFlagLayer7
437             0,      // IEFBypassEnablingFlagLayer7
438             0,      // RotationAngleMirrorDirectionLayer7
439             0,      // SamplerIndexFirstPlaneLayer7
440             0,      // SamplerIndexSecondThirdPlaneLayer7
441             0,      // Reserved
442             0,      // PriorCSCEnablingFlagLayer7
443             0,      // EOTF1DLUTEnablingFlagLayer7
444             0,      // CCMEnablingFlagLayer7
445             0,      // OETF1DLUTEnablingFlagLayer7
446             0,      // PostCSCEnablingFlagLayer7
447             0       // Enabling3DLUTFlagLayer7
448         }
449     },
450 
451     // DWORD 56
452     {
453         { 0, 0, 0, 0 }
454     },
455 
456     // DWORD 57
457     {
458         { 0, 0, 0, 0 }
459     },
460 
461     // DWORD 58
462     {
463         {
464             0,      // TwoLayerOperationLayer0
465             0,      // TwoLayerOperationLayer1
466             0,      // TwoLayerOperationLayer2
467             0       // TwoLayerOperationLayer3
468         }
469     },
470 
471     // DWORD 59
472     {
473         {
474             0,      // TwoLayerOperationLayer4
475             0,      // TwoLayerOperationLayer5
476             0,      // TwoLayerOperationLayer6
477             0       // TwoLayerOperationLayer7
478         }
479     },
480 
481     // DWORD 60
482     {
483         { 0, 0 }
484     },
485 
486     // DWORD 61
487     {
488         { 0, 0 }
489     },
490 
491     // DWORD 62
492     {
493         { 0, 0 }
494     },
495 
496     // DWORD 63
497     {
498         { 0, 0, 0, 0, 0, 0, 0 }
499     },
500 };
501 
502 const uint32_t g_Hdr_ColorCorrect_OETF_sRGB_FP16_g9[VPHAL_HDR_OETF_1DLUT_POINT_NUMBER] =
503 {
504     0x2ab90000, 0x2f5b2daa, 0x30f7305e, 0x31fb317f, 0x32d5326c, 0x33953338, 0x342133ed, 0x346f3449, 0x3494346f, 0x34db34b8, 0x351d34fc, 0x355b353c, 0x35963579, 0x35ce35b2, 0x360435e9, 0x3637361e,
505     0x36503637, 0x36813669, 0x36b03698, 0x36dd36c6, 0x370936f3, 0x3734371e, 0x375d3749, 0x37853771, 0x37993785, 0x37c037ad, 0x37e637d3, 0x380537f9, 0x3817380e, 0x38293820, 0x383a3832, 0x384b3843,
506     0x3854384b, 0x3864385c, 0x3875386d, 0x3885387d, 0x3894388c, 0x38a4389c, 0x38b338ab, 0x38c238ba, 0x38c938c2, 0x38d838d0, 0x38e638df, 0x38f438ed, 0x390238fb, 0x39103909, 0x391d3917, 0x392b3924,
507     0x3931392b, 0x393e3938, 0x394b3945, 0x39583952, 0x3965395f, 0x3971396b, 0x397e3978, 0x398a3984, 0x3990398a, 0x399c3996, 0x39a839a2, 0x39b439ae, 0x39bf39b9, 0x39cb39c5, 0x39d639d1, 0x39e239dc,
508     0x39e739e2, 0x39f239ed, 0x39fd39f8, 0x3a083a03, 0x3a133a0e, 0x3a1e3a18, 0x3a283a23, 0x3a333a2e, 0x3a383a33, 0x3a433a3d, 0x3a4d3a48, 0x3a573a52, 0x3a613a5c, 0x3a6b3a66, 0x3a753a70, 0x3a7f3a7a,
509     0x3a843a7f, 0x3a8e3a89, 0x3a983a93, 0x3aa13a9c, 0x3aab3aa6, 0x3ab43ab0, 0x3abe3ab9, 0x3ac73ac3, 0x3acc3ac7, 0x3ad53ad0, 0x3ade3ada, 0x3ae73ae3, 0x3af13aec, 0x3afa3af5, 0x3b033afe, 0x3b0b3b07,
510     0x3b103b0b, 0x3b193b14, 0x3b213b1d, 0x3b2a3b26, 0x3b333b2e, 0x3b3b3b37, 0x3b443b40, 0x3b4c3b48, 0x3b513b4c, 0x3b593b55, 0x3b613b5d, 0x3b6a3b66, 0x3b723b6e, 0x3b7a3b76, 0x3b823b7e, 0x3b8b3b87,
511     0x3b8f3b8b, 0x3b973b93, 0x3b9f3b9b, 0x3ba73ba3, 0x3baf3bab, 0x3bb73bb3, 0x3bbe3bba, 0x3bc63bc2, 0x3bca3bc6, 0x3bd23bce, 0x3bda3bd6, 0x3be13bdd, 0x3be93be5, 0x3bf03bed, 0x3bf83bf4, 0x3c003bfc
512 };
513 
514 static const uint32_t g_Hdr_ColorCorrect_OETF_BT709_FP16_g9[VPHAL_HDR_OETF_1DLUT_POINT_NUMBER] =
515 {
516     0x24cc0000, 0x2b3328cc, 0x2dfb2ccc, 0x2fff2f09, 0x30db3071, 0x319d313f, 0x324d31f7, 0x32ee329f, 0x333a32ee, 0x33cb3384, 0x34293408, 0x346a344a, 0x34a73489, 0x34e234c5, 0x351a34fe, 0x35503535,
517     0x356a3550, 0x359d3584, 0x35cf35b6, 0x35ff35e7, 0x362d3616, 0x365a3644, 0x36863671, 0x36b1369c, 0x36c636b1, 0x36f036db, 0x37183704, 0x3740372c, 0x37673753, 0x378d377a, 0x37b2379f, 0x37d637c4,
518     0x37e837d6, 0x380637fa, 0x3817380e, 0x38283820, 0x38393831, 0x384a3842, 0x385a3852, 0x386a3862, 0x3872386a, 0x3882387a, 0x3892388a, 0x38a13899, 0x38b038a9, 0x38bf38b8, 0x38ce38c6, 0x38dc38d5,
519     0x38e438dc, 0x38f238eb, 0x390038f9, 0x390e3907, 0x391c3915, 0x39293923, 0x39373930, 0x3944393e, 0x394b3944, 0x39583952, 0x3965395f, 0x3972396c, 0x397f3978, 0x398b3985, 0x39983992, 0x39a4399e,
520     0x39ab39a4, 0x39b739b1, 0x39c339bd, 0x39cf39c9, 0x39db39d5, 0x39e739e1, 0x39f239ed, 0x39fe39f8, 0x3a0439fe, 0x3a0f3a0a, 0x3a1b3a15, 0x3a263a20, 0x3a313a2c, 0x3a3c3a37, 0x3a473a42, 0x3a523a4d,
521     0x3a583a52, 0x3a633a5d, 0x3a6e3a68, 0x3a783a73, 0x3a833a7e, 0x3a8d3a88, 0x3a983a93, 0x3aa23a9d, 0x3aa73aa2, 0x3ab23aad, 0x3abc3ab7, 0x3ac63ac1, 0x3ad03acb, 0x3ada3ad5, 0x3ae43adf, 0x3aee3ae9,
522     0x3af33aee, 0x3afd3af8, 0x3b073b02, 0x3b103b0c, 0x3b1a3b15, 0x3b243b1f, 0x3b2d3b28, 0x3b373b32, 0x3b3b3b37, 0x3b453b40, 0x3b4e3b4a, 0x3b583b53, 0x3b613b5c, 0x3b6a3b65, 0x3b733b6f, 0x3b7c3b78,
523     0x3b813b7c, 0x3b8a3b85, 0x3b933b8e, 0x3b9c3b97, 0x3ba53ba0, 0x3bad3ba9, 0x3bb63bb2, 0x3bbf3bbb, 0x3bc33bbf, 0x3bcc3bc8, 0x3bd53bd0, 0x3bdd3bd9, 0x3be63be2, 0x3bef3bea, 0x3bf73bf3, 0x3c003bfb
524 };
525 
526 // So far assume max luminance to be 2000 nit, may change in the future.
527 static const uint32_t g_Hdr_ColorCorrect_OETF_SMPTE_ST2084_3Segs_FP16_g9[VPHAL_HDR_OETF_1DLUT_POINT_NUMBER] =
528 {
529     0x2832000c, 0x2ae829c6, 0x2c4a2bd0, 0x2ced2ca0, 0x2d722d33, 0x2de42dad, 0x2e492e18, 0x2ea22e77, 0x2ecc2ea2, 0x2f1a2ef4, 0x2f622f3f, 0x2fa52f84, 0x2fe32fc5, 0x300f3000, 0x302b301d, 0x30453038,
530     0x30523045, 0x306a305e, 0x30813076, 0x3098308d, 0x30ad30a3, 0x30c230b8, 0x31a730cc, 0x32c63247, 0x333132c6, 0x33dd338c, 0x34333413, 0x346d3451, 0x349f3487, 0x34cb34b6, 0x34f234df, 0x35163505,
531     0x35273516, 0x35463537, 0x35633555, 0x357e3571, 0x3598358b, 0x35af35a4, 0x35c635bb, 0x35db35d1, 0x35e535db, 0x35f935ef, 0x360c3603, 0x361e3615, 0x362f3627, 0x36403638, 0x36503648, 0x365f3657,
532     0x3666365f, 0x3675366e, 0x3683367c, 0x3691368a, 0x369e3697, 0x36ab36a4, 0x36b736b1, 0x36c336bd, 0x36c936c3, 0x36d436cf, 0x36e036da, 0x36eb36e5, 0x36f536f0, 0x370036fa, 0x370a3705, 0x3714370f,
533     0x37193714, 0x3722371d, 0x372c3727, 0x379b3730, 0x381c37f1, 0x3856383b, 0x3884386f, 0x38ab3898, 0x38bb38ab, 0x38da38cb, 0x38f538e8, 0x390d3901, 0x39223918, 0x3936392c, 0x3948393f, 0x39593951,
534     0x39613959, 0x39703969, 0x397e3977, 0x398b3985, 0x39983992, 0x39a4399e, 0x39af39aa, 0x39ba39b5, 0x39bf39ba, 0x39c939c4, 0x39d339ce, 0x39dc39d8, 0x39e539e1, 0x39ee39e9, 0x39f639f2, 0x39fe39fa,
535     0x3a0239fe, 0x3a093a06, 0x3a113a0d, 0x3a183a14, 0x3a1f3a1b, 0x3a253a22, 0x3a2c3a28, 0x3a323a2f, 0x3a353a32, 0x3a3b3a38, 0x3a413a3e, 0x3a473a44, 0x3a4c3a49, 0x3a523a4f, 0x3a573a54, 0x3a5c3a59,
536     0x3a5f3a5c, 0x3a643a61, 0x3a693a66, 0x3a6d3a6b, 0x3a723a70, 0x3a773a74, 0x3a7b3a79, 0x3a803a7d, 0x3a823a80, 0x3a863a84, 0x3a8a3a88, 0x3a8e3a8c, 0x3a923a90, 0x3a963a94, 0x3a9a3a98, 0x3a9e3a9c
537 };
538 
DumpDataToFile(const std::string & fileName,const void * data,size_t size)539 inline void DumpDataToFile(const std::string &fileName, const void *data, size_t size)
540 {
541     std::ofstream blob(fileName, std::ofstream::out | std::ifstream::binary);
542 
543     if (!blob.is_open())
544     {
545         VPHAL_RENDER_ASSERTMESSAGE("Error in opening raw data file: %s\n", fileName.c_str());
546         return;
547     }
548 
549     blob.write((const char *)data, size);
550 }
551 
Convert_CSC_Coeff_To_Register_Format(double coeff)552 CSC_COEFF_FORMAT Convert_CSC_Coeff_To_Register_Format(double coeff)
553 {
554     CSC_COEFF_FORMAT outVal = { 0 };
555     uint32_t shift_factor = 0;
556 
557     if (coeff < 0)
558     {
559         outVal.sign = 1;
560         coeff = -coeff;
561     }
562 
563     // range check
564     if (coeff > MAX_CSC_COEFF_VAL_ICL)
565         coeff = MAX_CSC_COEFF_VAL_ICL;
566 
567     if (coeff < 0.125)                       //0.000bbbbbbbbb
568     {
569         outVal.exponent = 3;
570         shift_factor = 12;
571     }
572     else if (coeff >= 0.125 && coeff < 0.25) //0.00bbbbbbbbb
573     {
574         outVal.exponent = 2;
575         shift_factor = 11;
576     }
577     else if (coeff >= 0.25 && coeff < 0.5)  //0.0bbbbbbbbb
578     {
579         outVal.exponent = 1;
580         shift_factor = 10;
581     }
582     else if (coeff >= 0.5 && coeff < 1.0)   // 0.bbbbbbbbb
583     {
584         outVal.exponent = 0;
585         shift_factor = 9;
586     }
587     else if (coeff >= 1.0 && coeff < 2.0)    //b.bbbbbbbb
588     {
589         outVal.exponent = 7;
590         shift_factor = 8;
591     }
592     else if (coeff >= 2.0)  // bb.bbbbbbb
593     {
594         outVal.exponent = 6;
595         shift_factor = 7;
596     }
597 
598     //Convert float to integer
599     outVal.mantissa = static_cast<uint32_t>(round(coeff * (double)(1 << (int)shift_factor)));
600 
601     return outVal;
602 }
603 
Convert_CSC_Coeff_Register_Format_To_Double(CSC_COEFF_FORMAT regVal)604 double Convert_CSC_Coeff_Register_Format_To_Double(CSC_COEFF_FORMAT regVal)
605 {
606     double outVal = 0;
607 
608     switch (regVal.exponent)
609     {
610       case 0: outVal = (double)regVal.mantissa / 512.0; break;
611       case 1: outVal = (double)regVal.mantissa / 1024.0; break;
612       case 2: outVal = (double)regVal.mantissa / 2048.0; break;
613       case 3: outVal = (double)regVal.mantissa / 4096.0; break;
614       case 6: outVal = (double)regVal.mantissa / 128.0; break;
615       case 7: outVal = (double)regVal.mantissa / 256.0; break;
616     }
617 
618   if (regVal.sign)
619   {
620      outVal = -outVal;
621   }
622 
623   return outVal;
624 }
625 
LimitFP32PrecisionToF3_9(float fp)626 float LimitFP32PrecisionToF3_9(float fp)
627 {
628     double dbInput = static_cast<double>(fp);
629     double dbOutput = Convert_CSC_Coeff_Register_Format_To_Double(Convert_CSC_Coeff_To_Register_Format(dbInput));
630     return static_cast<float>(dbOutput);
631 }
632 
LimitFP32ArrayPrecisionToF3_9(float fps[],size_t size)633 void LimitFP32ArrayPrecisionToF3_9(float fps[], size_t size)
634 {
635     for (size_t i = 0; i < size; i++)
636     {
637         fps[i] = LimitFP32PrecisionToF3_9(fps[i]);
638     }
639 }
640 
641 //! \brief    Get the HDR format descriptor of a format
642 //! \details  Get the HDR format descriptor of a format and return.
643 //! \param    MOS_FORMAT Format
644 //!           [in] MOS_FORMAT of a surface
645 //! \return   VPHAL_HDR_FORMAT_DESCRIPTOR_G9
646 //!           HDR format descriptor
647 //!
VpHal_HdrGetFormatDescriptor_g9(MOS_FORMAT Format)648 VPHAL_HDR_FORMAT_DESCRIPTOR_G9 VpHal_HdrGetFormatDescriptor_g9 (
649     MOS_FORMAT      Format)
650 {
651     VPHAL_HDR_FORMAT_DESCRIPTOR_G9 FormatDescriptor  = VPHAL_HDR_FORMAT_DESCRIPTOR_UNKNOW_G9;
652 
653     switch (Format)
654     {
655         case Format_R10G10B10A2:
656         case Format_B10G10R10A2:
657             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_R10G10B10A2_UNORM_G9;
658             break;
659 
660         case Format_X8R8G8B8:
661         case Format_A8R8G8B8:
662         case Format_A8B8G8R8:
663         case Format_X8B8G8R8:
664         case Format_AYUV:
665             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_R8G8B8A8_UNORM_G9;
666             break;
667 
668         case Format_NV12:
669         case Format_NV21:
670             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_NV12_G9;
671             break;
672 
673         case Format_YUY2:
674             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_YUY2_G9;
675             break;
676 
677         case Format_P010:
678             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_P010_G9;
679             break;
680 
681         case Format_P016:
682             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_P016_G9;
683             break;
684 
685         case Format_A16R16G16B16F:
686         case Format_A16B16G16R16F:
687             FormatDescriptor = VPHAL_HDR_FORMAT_R16G16B16A16_FLOAT_G9;
688             break;
689 
690         default:
691             VPHAL_PUBLIC_ASSERTMESSAGE("Unsupported input format.");
692             FormatDescriptor = VPHAL_HDR_FORMAT_DESCRIPTOR_UNKNOW_G9;
693             break;
694     }
695 
696     return FormatDescriptor;
697 }
698 //! \brief    Get the HDR Chroma siting
699 //! \details  Get the HDR Chroma siting and return.
700 //! \param    uint32_t ChromaSiting
701 //!           [in] ChromaSiting of a surface
702 //! \return   VPHAL_HDR_CHROMA_SITING_G9
703 //!           HDR Chroma siting
704 //!
VpHal_HdrGetHdrChromaSiting_g9(uint32_t ChromaSiting)705 VPHAL_HDR_CHROMA_SITING_G9 VpHal_HdrGetHdrChromaSiting_g9 (
706     uint32_t      ChromaSiting)
707 {
708     VPHAL_HDR_CHROMA_SITING_G9 HdrChromaSiting = VPHAL_HDR_CHROMA_SITTING_A_G9;
709 
710     switch (ChromaSiting)
711     {
712     case CHROMA_SITING_HORZ_LEFT :
713         HdrChromaSiting = VPHAL_HDR_CHROMA_SITTING_A_G9;
714         break;
715     default:
716         HdrChromaSiting = VPHAL_HDR_CHROMA_SITTING_A_G9;
717         break;
718     }
719 
720     return HdrChromaSiting;
721 }
722 
723 //! \brief    Get the HDR rotation
724 //! \details  Get the HDR rotation and return.
725 //! \param    VPHAL_ROTATION Rotation
726 //!           [in] Rotation of a surface
727 //! \return   VPHAL_HDR_ROTATION_G9
728 //!           HDR Chroma siting
729 //!
VpHal_HdrGetHdrRotation_g9(VPHAL_ROTATION Rotation)730 VPHAL_HDR_ROTATION_G9 VpHal_HdrGetHdrRotation_g9 (
731     VPHAL_ROTATION      Rotation)
732 {
733     VPHAL_HDR_ROTATION_G9 HdrRotation  = VPHAL_HDR_LAYER_ROTATION_0_G9;
734 
735     switch (Rotation)
736     {
737     case VPHAL_ROTATION_IDENTITY :
738         HdrRotation = VPHAL_HDR_LAYER_ROTATION_0_G9;
739         break;
740     case VPHAL_ROTATION_90 :
741         HdrRotation = VPHAL_HDR_LAYER_ROTATION_90_G9;
742         break;
743     case VPHAL_ROTATION_180 :
744         HdrRotation = VPHAL_HDR_LAYER_ROTATION_180_G9;
745         break;
746     case VPHAL_ROTATION_270 :
747         HdrRotation = VPHAL_HDR_LAYER_ROTATION_270_G9;
748         break;
749     case VPHAL_MIRROR_HORIZONTAL :
750         HdrRotation = VPHAL_HDR_LAYER_MIRROR_H_G9;
751         break;
752     case VPHAL_MIRROR_VERTICAL :
753         HdrRotation = VPHAL_HDR_LAYER_MIRROR_V_G9;
754         break;
755     case VPHAL_ROTATE_90_MIRROR_VERTICAL :
756         HdrRotation = VPHAL_HDR_LAYER_ROT_90_MIR_V_G9;
757         break;
758     case VPHAL_ROTATE_90_MIRROR_HORIZONTAL :
759         HdrRotation = VPHAL_HDR_LAYER_ROT_90_MIR_H_G9;
760         break;
761     default:
762         HdrRotation = VPHAL_HDR_LAYER_ROTATION_0_G9;
763         break;
764     }
765 
766     return HdrRotation;
767 }
768 
769 //! \brief    Get the HDR Two Layer Option
770 //! \details  Get the HDR Two Layer Option and return.
771 //! \param    VPHAL_BLEND_TYPE BlendType
772 //!           [in] Blending type of a surface
773 //! \return   VPHAL_HDR_TWO_LAYER_OPTION_G9
774 //!           HDR Two Layer Option
775 //!
VpHal_HdrGetHdrTwoLayerOption_g9(VPHAL_BLEND_TYPE BlendType)776 VPHAL_HDR_TWO_LAYER_OPTION_G9 VpHal_HdrGetHdrTwoLayerOption_g9(
777     VPHAL_BLEND_TYPE BlendType)
778 {
779     VPHAL_HDR_TWO_LAYER_OPTION_G9 HdrTwoLayerOp = VPHAL_HDR_TWO_LAYER_OPTION_SBLEND_G9;
780 
781     switch (BlendType)
782     {
783     case BLEND_NONE:
784         HdrTwoLayerOp = VPHAL_HDR_TWO_LAYER_OPTION_COMP_G9;
785         break;
786     case BLEND_SOURCE:
787         HdrTwoLayerOp = VPHAL_HDR_TWO_LAYER_OPTION_SBLEND_G9;
788         break;
789     case BLEND_PARTIAL:
790         HdrTwoLayerOp = VPHAL_HDR_TWO_LAYER_OPTION_PBLEND_G9;
791         break;
792     case BLEND_CONSTANT:
793         HdrTwoLayerOp = VPHAL_HDR_TWO_LAYER_OPTION_CBLEND_G9;
794         break;
795     case BLEND_CONSTANT_SOURCE:
796         HdrTwoLayerOp = VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND_G9;
797         break;
798     case BLEND_CONSTANT_PARTIAL:
799         HdrTwoLayerOp = VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND_G9;
800         break;
801     default:
802         HdrTwoLayerOp = VPHAL_HDR_TWO_LAYER_OPTION_SBLEND_G9;
803         break;
804     }
805 
806     return HdrTwoLayerOp;
807 }
808 
809 //!
810 //! \brief    Checks to see if HDR can be enabled for the formats
811 //! \details  Checks to see if HDR can be enabled for the formats
812 //! \param    PVPHAL_SURFACE pSrcSurface
813 //!           [in] Pointer to source surface
814 //! \param    bool* pbSupported
815 //!           [out] true supported false not supported
816 //! \return   MOS_STATUS
817 //!           MOS_STATUS_SUCCESS if successful, otherwise failed
818 //!
VpHal_HdrIsInputFormatSupported_g9(PVPHAL_SURFACE pSrcSurface,bool * pbSupported)819 MOS_STATUS VpHal_HdrIsInputFormatSupported_g9(
820     PVPHAL_SURFACE              pSrcSurface,
821     bool*                       pbSupported)
822 {
823     MOS_STATUS                  eStatus = MOS_STATUS_SUCCESS;
824 
825     VPHAL_PUBLIC_CHK_NULL(pSrcSurface);
826     VPHAL_PUBLIC_CHK_NULL(pbSupported);
827 
828     // HDR supported formats
829     if (pSrcSurface->Format == Format_A8R8G8B8     ||
830         pSrcSurface->Format == Format_X8R8G8B8     ||
831         pSrcSurface->Format == Format_A8B8G8R8     ||
832         pSrcSurface->Format == Format_X8B8G8R8     ||
833         pSrcSurface->Format == Format_R10G10B10A2  ||
834         pSrcSurface->Format == Format_B10G10R10A2  ||
835         pSrcSurface->Format == Format_A16B16G16R16 ||
836         pSrcSurface->Format == Format_A16R16G16B16 ||
837         pSrcSurface->Format == Format_A16B16G16R16F||
838         pSrcSurface->Format == Format_A16R16G16B16F||
839         pSrcSurface->Format == Format_P016         ||
840         pSrcSurface->Format == Format_NV12         ||
841         pSrcSurface->Format == Format_P010         ||
842         pSrcSurface->Format == Format_YUY2         ||
843         pSrcSurface->Format == Format_AYUV)
844     {
845        *pbSupported = true;
846         goto finish;
847     }
848     else
849     {
850         VPHAL_RENDER_ASSERTMESSAGE(
851             "HDR Unsupported Source Format: '0x%08x'\n",
852             pSrcSurface->Format);
853         *pbSupported = false;
854     }
855 
856 finish:
857     return eStatus;
858 }
859 
860 //!
861 //! \brief    Checks to see if HDR can be enabled for the formats
862 //! \details  Checks to see if HDR can be enabled for the formats
863 //! \param    PVPHAL_SURFACE pTargetSurface
864 //!           [in] Pointer to target surface
865 //! \param    bool* pbSupported
866 //!           [out] true supported false not supported
867 //! \return   MOS_STATUS
868 //!           MOS_STATUS_SUCCESS if successful, otherwise failed
869 //!
VpHal_HdrIsOutputFormatSupported_g9(PVPHAL_SURFACE pTargetSurface,bool * pbSupported)870 MOS_STATUS VpHal_HdrIsOutputFormatSupported_g9(
871     PVPHAL_SURFACE              pTargetSurface,
872     bool*                       pbSupported)
873 {
874     MOS_STATUS                  eStatus = MOS_STATUS_SUCCESS;
875 
876     VPHAL_PUBLIC_CHK_NULL(pTargetSurface);
877     VPHAL_PUBLIC_CHK_NULL(pbSupported);
878 
879     // HDR supported formats
880     if (pTargetSurface->Format == Format_A8R8G8B8     ||
881         pTargetSurface->Format == Format_X8R8G8B8     ||
882         pTargetSurface->Format == Format_A8B8G8R8     ||
883         pTargetSurface->Format == Format_X8B8G8R8     ||
884         pTargetSurface->Format == Format_R10G10B10A2  ||
885         pTargetSurface->Format == Format_B10G10R10A2  ||
886         pTargetSurface->Format == Format_A16B16G16R16 ||
887         pTargetSurface->Format == Format_A16R16G16B16 ||
888         pTargetSurface->Format == Format_YUY2         ||
889         pTargetSurface->Format == Format_P016         ||
890         pTargetSurface->Format == Format_NV12         ||
891         pTargetSurface->Format == Format_P010         ||
892         pTargetSurface->Format == Format_P016         ||
893         pTargetSurface->Format == Format_A16R16G16B16F||
894         pTargetSurface->Format == Format_A16B16G16R16F)
895     {
896        *pbSupported = true;
897         goto finish;
898     }
899     else
900     {
901         VPHAL_RENDER_ASSERTMESSAGE(
902             "HDR Unsupported Target Format: '0x%08x'\n",
903             pTargetSurface->Format);
904         *pbSupported = false;
905     }
906 
907 finish:
908     return eStatus;
909 }
910 
911 //!
912 //! \brief    Recalculate Sampler Avs 8x8 Horizontal/Vertical scaling table
913 //! \details  Recalculate Sampler Avs 8x8 Horizontal/Vertical scaling table
914 //! \param    MOS_FORMAT SrcFormat
915 //!           [in] Source Format
916 //! \param    float fScale
917 //!           [in] Horizontal or Vertical Scale Factor
918 //! \param    bool bVertical
919 //!           [in] true if Vertical Scaling, else Horizontal Scaling
920 //! \param    uint32_t dwChromaSiting
921 //!           [in] Chroma Siting
922 //! \param    bool bBalancedFilter
923 //!           [in] true if Gen9+, balanced filter
924 //! \param    bool b8TapAdaptiveEnable
925 //!           [in] true if 8Tap Adaptive Enable
926 //! \param    PVPHAL_AVS_PARAMS pAvsParams
927 //!           [in/out] Pointer to AVS Params
928 //! \return   MOS_STATUS
929 //!
VpHal_HdrSamplerAvsCalcScalingTable_g9(MOS_FORMAT SrcFormat,float fScale,bool bVertical,uint32_t dwChromaSiting,bool bBalancedFilter,bool b8TapAdaptiveEnable,PMHW_AVS_PARAMS pAvsParams)930 static MOS_STATUS VpHal_HdrSamplerAvsCalcScalingTable_g9(
931     MOS_FORMAT                      SrcFormat,
932     float                           fScale,
933     bool                            bVertical,
934     uint32_t                        dwChromaSiting,
935     bool                            bBalancedFilter,
936     bool                            b8TapAdaptiveEnable,
937     PMHW_AVS_PARAMS                 pAvsParams)
938 {
939     MOS_STATUS                      eStatus             = MOS_STATUS_SUCCESS;
940     MHW_PLANE                       Plane               = MHW_GENERIC_PLANE;
941     int32_t                         iUvPhaseOffset      = 0;
942     uint32_t                        dwHwPhrase          = 0;
943     uint32_t                        YCoefTableSize      = 0;
944     uint32_t                        UVCoefTableSize     = 0;
945     float                           fScaleParam         = 0.0f;
946     int32_t*                        piYCoefsParam       = nullptr;
947     int32_t*                        piUVCoefsParam      = nullptr;
948     float                           fHPStrength         = 0.0f;
949 
950     VPHAL_RENDER_CHK_NULL(pAvsParams);
951     VPHAL_RENDER_CHK_NULL(pAvsParams->piYCoefsY);
952     VPHAL_RENDER_CHK_NULL(pAvsParams->piYCoefsX);
953     VPHAL_RENDER_CHK_NULL(pAvsParams->piUVCoefsY);
954     VPHAL_RENDER_CHK_NULL(pAvsParams->piUVCoefsX);
955 
956     if (bBalancedFilter)
957     {
958         YCoefTableSize      = POLYPHASE_Y_COEFFICIENT_TABLE_SIZE_G9;
959         UVCoefTableSize     = POLYPHASE_UV_COEFFICIENT_TABLE_SIZE_G9;
960         dwHwPhrase          = NUM_HW_POLYPHASE_TABLES_G9;
961     }
962     else
963     {
964         YCoefTableSize      = POLYPHASE_Y_COEFFICIENT_TABLE_SIZE_G8;
965         UVCoefTableSize     = POLYPHASE_UV_COEFFICIENT_TABLE_SIZE_G8;
966         dwHwPhrase          = MHW_NUM_HW_POLYPHASE_TABLES;
967     }
968 
969     fHPStrength = 0.0F;
970     piYCoefsParam   = bVertical ? pAvsParams->piYCoefsY : pAvsParams->piYCoefsX;
971     piUVCoefsParam  = bVertical ? pAvsParams->piUVCoefsY : pAvsParams->piUVCoefsX;
972     fScaleParam     = bVertical ? pAvsParams->fScaleY : pAvsParams->fScaleX;
973 
974     // Recalculate Horizontal or Vertical scaling table
975     if (SrcFormat != pAvsParams->Format || fScale != fScaleParam)
976     {
977         MOS_ZeroMemory(piYCoefsParam, YCoefTableSize);
978         MOS_ZeroMemory(piUVCoefsParam, UVCoefTableSize);
979 
980         // 4-tap filtering for RGB format G-channel if 8tap adaptive filter is not enabled.
981         Plane = (IS_RGB32_FORMAT(SrcFormat) && !b8TapAdaptiveEnable) ? MHW_U_PLANE : MHW_Y_PLANE;
982         if (bVertical)
983         {
984             pAvsParams->fScaleY = fScale;
985         }
986         else
987         {
988             pAvsParams->fScaleX = fScale;
989         }
990 
991         // For 1x scaling in horizontal direction, use special coefficients for filtering
992         // we don't do this when bForcePolyPhaseCoefs flag is set
993         if (fScale == 1.0F && !pAvsParams->bForcePolyPhaseCoefs)
994         {
995             VPHAL_RENDER_CHK_STATUS(Mhw_SetNearestModeTable(
996                 piYCoefsParam,
997                 Plane,
998                 bBalancedFilter));
999             // If the 8-tap adaptive is enabled for all channel, then UV/RB use the same coefficient as Y/G
1000             // So, coefficient for UV/RB channels caculation can be passed
1001             if (!b8TapAdaptiveEnable)
1002             {
1003                 VPHAL_RENDER_CHK_STATUS(Mhw_SetNearestModeTable(
1004                     piUVCoefsParam,
1005                     MHW_U_PLANE,
1006                     bBalancedFilter));
1007             }
1008         }
1009         else
1010         {
1011             // Clamp the Scaling Factor if > 1.0x
1012             fScale = MOS_MIN(1.0F, fScale);
1013 
1014             VPHAL_RENDER_CHK_STATUS(Mhw_CalcPolyphaseTablesY(
1015                 piYCoefsParam,
1016                 fScale,
1017                 Plane,
1018                 SrcFormat,
1019                 fHPStrength,
1020                 true,
1021                 dwHwPhrase,
1022                 0));
1023 
1024             // If the 8-tap adaptive is enabled for all channel, then UV/RB use the same coefficient as Y/G
1025             // So, coefficient for UV/RB channels caculation can be passed
1026             if (!b8TapAdaptiveEnable)
1027             {
1028                 if (!bBalancedFilter)
1029                 {
1030                     VPHAL_RENDER_CHK_STATUS(Mhw_CalcPolyphaseTablesY(
1031                         piUVCoefsParam,
1032                         fScale,
1033                         MHW_U_PLANE,
1034                         SrcFormat,
1035                         fHPStrength,
1036                         true,
1037                         dwHwPhrase,
1038                         0));
1039                 }
1040                 else
1041                 {
1042                     // If Chroma Siting info is present
1043                     if (dwChromaSiting & (bVertical ? MHW_CHROMA_SITING_VERT_TOP : MHW_CHROMA_SITING_HORZ_LEFT))
1044                     {
1045                         // No Chroma Siting
1046                         VPHAL_RENDER_CHK_STATUS(Mhw_CalcPolyphaseTablesUV(
1047                             piUVCoefsParam,
1048                             2.0F,
1049                             fScale));
1050                     }
1051                     else
1052                     {
1053                         // Chroma siting offset needs to be added
1054                         if (dwChromaSiting & (bVertical ? MHW_CHROMA_SITING_VERT_CENTER : MHW_CHROMA_SITING_HORZ_CENTER))
1055                         {
1056                             iUvPhaseOffset = MOS_UF_ROUND(0.5F * 16.0F);   // U0.4
1057                         }
1058                         else //if (ChromaSiting & (bVertical ? MHW_CHROMA_SITING_VERT_BOTTOM : MHW_CHROMA_SITING_HORZ_RIGHT))
1059                         {
1060                             iUvPhaseOffset = MOS_UF_ROUND(1.0F * 16.0F);   // U0.4
1061                         }
1062 
1063                         VPHAL_RENDER_CHK_STATUS(Mhw_CalcPolyphaseTablesUVOffset(
1064                             piUVCoefsParam,
1065                             3.0F,
1066                             fScale,
1067                             iUvPhaseOffset));
1068                     }
1069                 }
1070             }
1071         }
1072     }
1073 
1074 finish:
1075     return eStatus;
1076 }
1077 
1078 //!
1079 //! \brief      Set Sampler8x8 Table for Gen9 Hdr AVS
1080 //! \details    Set sampler8x8 table based on format, scale and chroma siting
1081 //! \param      PRENDERHAL_INTERFACE pRenderHal
1082 //!             [in]    Pointer to RenderHal interface
1083 //! \param      PMHW_SAMPLER_STATE_PARAM pSamplerStateParams,
1084 //!             [in]    Pointer to sampler state params
1085 //! \param      PVPHAL_AVS_PARAMS pAvsParams
1086 //!             [in]    Pointer to avs parameters
1087 //! \param      MOS_FORMAT SrcFormat
1088 //!             [in]    source format
1089 //! \param      float   fScaleX
1090 //!             [in]    Scale X
1091 //! \param      float   fScaleY
1092 //!             [in]    Scale Y
1093 //! \param      uint32_t   dwChromaSiting
1094 //!             [in]    Chroma siting
1095 //! \return     void
1096 //!
VpHal_HdrSetSamplerAvsTableParam_g9(PRENDERHAL_INTERFACE pRenderHal,PMHW_SAMPLER_STATE_PARAM pSamplerStateParams,PMHW_AVS_PARAMS pAvsParams,MOS_FORMAT SrcFormat,float fScaleX,float fScaleY,uint32_t dwChromaSiting)1097 MOS_STATUS VpHal_HdrSetSamplerAvsTableParam_g9(
1098     PRENDERHAL_INTERFACE            pRenderHal,
1099     PMHW_SAMPLER_STATE_PARAM        pSamplerStateParams,
1100     PMHW_AVS_PARAMS                 pAvsParams,
1101     MOS_FORMAT                      SrcFormat,
1102     float                           fScaleX,
1103     float                           fScaleY,
1104     uint32_t                        dwChromaSiting)
1105 {
1106     MOS_STATUS                   eStatus                    = MOS_STATUS_SUCCESS;
1107     bool                         bBalancedFilter            = false;
1108     PMHW_SAMPLER_AVS_TABLE_PARAM pMhwSamplerAvsTableParam   = nullptr;
1109 
1110     VPHAL_HW_CHK_NULL(pRenderHal);
1111     VPHAL_HW_CHK_NULL(pSamplerStateParams);
1112     VPHAL_HW_CHK_NULL(pAvsParams);
1113     VPHAL_HW_CHK_NULL(pAvsParams->piYCoefsY);
1114     VPHAL_HW_CHK_NULL(pAvsParams->piYCoefsX);
1115     VPHAL_HW_CHK_NULL(pAvsParams->piUVCoefsY);
1116     VPHAL_HW_CHK_NULL(pAvsParams->piUVCoefsX);
1117 
1118     pMhwSamplerAvsTableParam = pSamplerStateParams->Avs.pMhwSamplerAvsTableParam;
1119 
1120     pMhwSamplerAvsTableParam->b8TapAdaptiveEnable         = pSamplerStateParams->Avs.b8TapAdaptiveEnable;
1121     pMhwSamplerAvsTableParam->byteTransitionArea8Pixels   = MEDIASTATE_AVS_TRANSITION_AREA_8_PIXELS;
1122     pMhwSamplerAvsTableParam->byteTransitionArea4Pixels   = MEDIASTATE_AVS_TRANSITION_AREA_4_PIXELS;
1123     pMhwSamplerAvsTableParam->byteMaxDerivative8Pixels    = MEDIASTATE_AVS_MAX_DERIVATIVE_8_PIXELS;
1124     pMhwSamplerAvsTableParam->byteMaxDerivative4Pixels    = MEDIASTATE_AVS_MAX_DERIVATIVE_4_PIXELS;
1125     pMhwSamplerAvsTableParam->byteDefaultSharpnessLevel   = MEDIASTATE_AVS_SHARPNESS_LEVEL_SHARP;
1126 
1127     // Enable Adaptive Filtering, if it is being upscaled
1128     // in either direction. we must check for this before clamping the SF.
1129     if ((IS_YUV_FORMAT(SrcFormat) && (fScaleX > 1.0F || fScaleY > 1.0F)) ||
1130         pMhwSamplerAvsTableParam->b8TapAdaptiveEnable)
1131     {
1132         pMhwSamplerAvsTableParam->bBypassXAdaptiveFiltering = false;
1133         pMhwSamplerAvsTableParam->bBypassYAdaptiveFiltering = false;
1134         if (pMhwSamplerAvsTableParam->b8TapAdaptiveEnable)
1135         {
1136             pMhwSamplerAvsTableParam->bAdaptiveFilterAllChannels = true;
1137 
1138             if (IS_RGB_FORMAT(SrcFormat))
1139             {
1140                 pMhwSamplerAvsTableParam->bEnableRGBAdaptive     = true;
1141             }
1142         }
1143     }
1144     else
1145     {
1146         pMhwSamplerAvsTableParam->bBypassXAdaptiveFiltering = true;
1147         pMhwSamplerAvsTableParam->bBypassYAdaptiveFiltering = true;
1148     }
1149 
1150     // No changes to AVS parameters -> skip
1151     if (SrcFormat == pAvsParams->Format &&
1152         fScaleX == pAvsParams->fScaleX &&
1153         fScaleY == pAvsParams->fScaleY)
1154     {
1155         goto finish;
1156     }
1157 
1158     // AVS Coefficients don't change for Scaling Factors > 1.0x
1159     // Hence recalculation is avoided
1160     if (fScaleX > 1.0F && pAvsParams->fScaleX > 1.0F)
1161     {
1162         pAvsParams->fScaleX = fScaleX;
1163     }
1164 
1165     // AVS Coefficients don't change for Scaling Factors > 1.0x
1166     // Hence recalculation is avoided
1167     if (fScaleY > 1.0F && pAvsParams->fScaleY > 1.0F)
1168     {
1169         pAvsParams->fScaleY = fScaleY;
1170     }
1171 
1172     bBalancedFilter = true;
1173     // Recalculate Horizontal scaling table
1174     VPHAL_HW_CHK_STATUS(VpHal_HdrSamplerAvsCalcScalingTable_g9(
1175         SrcFormat,
1176         fScaleX,
1177         false,
1178         dwChromaSiting,
1179         bBalancedFilter,
1180         pMhwSamplerAvsTableParam->b8TapAdaptiveEnable ? true : false,
1181         pAvsParams));
1182 
1183     // Recalculate Vertical scaling table
1184     VPHAL_HW_CHK_STATUS(VpHal_HdrSamplerAvsCalcScalingTable_g9(
1185         SrcFormat,
1186         fScaleY,
1187         true,
1188         dwChromaSiting,
1189         bBalancedFilter,
1190         pMhwSamplerAvsTableParam->b8TapAdaptiveEnable ? true : false,
1191         pAvsParams));
1192 
1193     pMhwSamplerAvsTableParam->bIsCoeffExtraEnabled = true;
1194     // Save format used to calculate AVS parameters
1195     pAvsParams->Format                             = SrcFormat;
1196     pMhwSamplerAvsTableParam->b4TapGY              = (IS_RGB32_FORMAT(SrcFormat) && !pMhwSamplerAvsTableParam->b8TapAdaptiveEnable);
1197     pMhwSamplerAvsTableParam->b4TapRBUV            = (!pMhwSamplerAvsTableParam->b8TapAdaptiveEnable);
1198 
1199     VpHal_RenderCommonSetAVSTableParam(pAvsParams, pMhwSamplerAvsTableParam);
1200 
1201 finish:
1202     return eStatus;
1203 }
1204 
1205 
1206 typedef float (*pfnOETFFunc)(float radiance);
1207 
OETF2084(float c)1208 float OETF2084(float c)
1209 {
1210     static const double C1 = 0.8359375;
1211     static const double C2 = 18.8515625;
1212     static const double C3 = 18.6875;
1213     static const double M1 = 0.1593017578125;
1214     static const double M2 = 78.84375;
1215 
1216     double tmp = c;
1217     double numerator = pow(tmp, M1);
1218     double denominator = numerator;
1219 
1220     denominator = 1.0 + C3 * denominator;
1221     numerator   = C1 + C2 * numerator;
1222     numerator   = numerator / denominator;
1223 
1224     return (float)pow(numerator, M2);
1225 }
1226 
OETFBT709(float c)1227 float OETFBT709(float c)
1228 {
1229     static const double E0 = 0.45;
1230     static const double C1 = 0.099;
1231     static const double C2 = 4.5;
1232     static const double P0 = 0.018;
1233 
1234     double tmp = c;
1235     double result;
1236 
1237     if (tmp <= P0)
1238     {
1239         result = C2 * tmp;
1240     }
1241     else
1242     {
1243         result = (C1 + 1.0) * pow(tmp, E0) - C1;
1244     }
1245     return (float)result;
1246 }
1247 
OETFsRGB(float c)1248 float OETFsRGB(float c)
1249 {
1250     static const double E1 = 2.4;
1251     static const double C1 = 0.055;
1252     static const double C2 = 12.92;
1253     static const double P0 = 0.0031308;
1254 
1255     double tmp = c;
1256     double result;
1257 
1258     if (tmp <= P0)
1259     {
1260         result = C2 * tmp;
1261     }
1262     else
1263     {
1264         result = (C1 + 1.0) * pow(tmp, 1.0 / E1) - C1;
1265     }
1266     return (float)result;
1267 }
1268 
1269 // Non-uniform OETF LUT generator.
VpHal_Generate2SegmentsOETFLUT(float fStretchFactor,pfnOETFFunc oetfFunc,uint16_t * lut)1270 void VpHal_Generate2SegmentsOETFLUT(float fStretchFactor, pfnOETFFunc oetfFunc, uint16_t *lut)
1271 {
1272     int i = 0, j = 0;
1273 
1274     for (i = 0; i < VPHAL_HDR_OETF_1DLUT_HEIGHT; ++i)
1275     {
1276         for (j = 0; j < VPHAL_HDR_OETF_1DLUT_WIDTH; ++j)
1277         {
1278             int idx = j + i * (VPHAL_HDR_OETF_1DLUT_WIDTH - 1);
1279             float a = (idx < 32) ? ((1.0f / 1024.0f) * idx) : ((1.0f / 32.0f) * (idx - 31));
1280 
1281             if (a > 1.0f)
1282                 a = 1.0f;
1283 
1284             a *= fStretchFactor;
1285             lut[i * VPHAL_HDR_OETF_1DLUT_WIDTH + j] = VpHal_FloatToHalfFloat(oetfFunc(a));
1286         }
1287     }
1288 }
1289 
1290 typedef float Mat3[3][3];
1291 typedef float Vec3[3];
1292 
Mat3MultiplyMat3(const Mat3 left,const Mat3 right,Mat3 output)1293 static void Mat3MultiplyMat3(const Mat3 left, const Mat3 right, Mat3 output)
1294 {
1295     output[0][0] = left[0][0] * right[0][0] + left[0][1] * right[1][0] + left[0][2] * right[2][0];
1296     output[0][1] = left[0][0] * right[0][1] + left[0][1] * right[1][1] + left[0][2] * right[2][1];
1297     output[0][2] = left[0][0] * right[0][2] + left[0][1] * right[1][2] + left[0][2] * right[2][2];
1298     output[1][0] = left[1][0] * right[0][0] + left[1][1] * right[1][0] + left[1][2] * right[2][0];
1299     output[1][1] = left[1][0] * right[0][1] + left[1][1] * right[1][1] + left[1][2] * right[2][1];
1300     output[1][2] = left[1][0] * right[0][2] + left[1][1] * right[1][2] + left[1][2] * right[2][2];
1301     output[2][0] = left[2][0] * right[0][0] + left[2][1] * right[1][0] + left[2][2] * right[2][0];
1302     output[2][1] = left[2][0] * right[0][1] + left[2][1] * right[1][1] + left[2][2] * right[2][1];
1303     output[2][2] = left[2][0] * right[0][2] + left[2][1] * right[1][2] + left[2][2] * right[2][2];
1304 }
1305 
Mat3MultiplyVec3(const Mat3 input,const Vec3 vec,Vec3 output)1306 static void Mat3MultiplyVec3(const Mat3 input, const Vec3 vec, Vec3 output)
1307 {
1308     output[0] = input[0][0] * vec[0] + input[0][1] * vec[1] + input[0][2] * vec[2];
1309     output[1] = input[1][0] * vec[0] + input[1][1] * vec[1] + input[1][2] * vec[2];
1310     output[2] = input[2][0] * vec[0] + input[2][1] * vec[1] + input[2][2] * vec[2];
1311 }
1312 
Mat3Inverse(const Mat3 input,Mat3 output)1313 static void Mat3Inverse(const Mat3 input, Mat3 output)
1314 {
1315     const float a0 = input[0][0];
1316     const float a1 = input[0][1];
1317     const float a2 = input[0][2];
1318 
1319     const float b0 = input[1][0];
1320     const float b1 = input[1][1];
1321     const float b2 = input[1][2];
1322 
1323     const float c0 = input[2][0];
1324     const float c1 = input[2][1];
1325     const float c2 = input[2][2];
1326 
1327     float det = a0 * (b1 * c2 - b2 * c1) + a1 * (b2 * c0 - b0 * c2) + a2 * ( b0 * c1 - b1 * c0);
1328 
1329     if (det != 0.0f)
1330     {
1331         float det_recip = 1.0f / det;
1332 
1333         output[0][0] = (b1 * c2 - b2 * c1) * det_recip;
1334         output[0][1] = (a2 * c1 - a1 * c2) * det_recip;
1335         output[0][2] = (a1 * b2 - a2 * b1) * det_recip;
1336 
1337         output[1][0] = (b2 * c0 - b0 * c2) * det_recip;
1338         output[1][1] = (a0 * c2 - a2 * c0) * det_recip;
1339         output[1][2] = (a2 * b0 - a0 * b2) * det_recip;
1340 
1341         output[2][0] = (b0 * c1 - b1 * c0) * det_recip;
1342         output[2][1] = (a1 * c0 - a0 * c1) * det_recip;
1343         output[2][2] = (a0 * b1 - a1 * b0) * det_recip;
1344     }
1345     else
1346     {
1347         // irreversible
1348         output[0][0] = 1.0f;
1349         output[0][1] = 0.0f;
1350         output[0][2] = 0.0f;
1351         output[1][0] = 0.0f;
1352         output[1][1] = 1.0f;
1353         output[1][2] = 0.0f;
1354         output[2][0] = 0.0f;
1355         output[2][1] = 0.0f;
1356         output[2][2] = 1.0f;
1357     }
1358 }
1359 
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)1360 static void RGB2CIEXYZMatrix(
1361     const float xr, const float yr,
1362     const float xg, const float yg,
1363     const float xb, const float yb,
1364     const float xn, const float yn,
1365     Mat3   output)
1366 {
1367     const float zr = 1.0f - xr - yr;
1368     const float zg = 1.0f - xg - yg;
1369     const float zb = 1.0f - xb - yb;
1370     const float zn = 1.0f - xn - yn;
1371 
1372     // m * [ar, ag, ab]T = [xn / yn, 1.0f, zn / yn]T;
1373     const Mat3 m =
1374     {
1375         xr, xg, xb,
1376         yr, yg, yb,
1377         zr, zg, zb
1378     };
1379 
1380     Mat3 inversed_m;
1381 
1382     Mat3Inverse(m, inversed_m);
1383 
1384     const Vec3 XYZWithUnityY = {xn / yn, 1.0f, zn / yn};
1385     float aragab[3];
1386 
1387     Mat3MultiplyVec3(inversed_m, XYZWithUnityY, aragab);
1388 
1389     output[0][0] = m[0][0] * aragab[0];
1390     output[1][0] = m[1][0] * aragab[0];
1391     output[2][0] = m[2][0] * aragab[0];
1392     output[0][1] = m[0][1] * aragab[1];
1393     output[1][1] = m[1][1] * aragab[1];
1394     output[2][1] = m[2][1] * aragab[1];
1395     output[0][2] = m[0][2] * aragab[2];
1396     output[1][2] = m[1][2] * aragab[2];
1397     output[2][2] = m[2][2] * aragab[2];
1398 }
1399 
VpHal_CalculateCCMWithMonitorGamut(VPHAL_HDR_CCM_TYPE CCMType,PVPHAL_HDR_PARAMS pTarget,float TempMatrix[12])1400 void VpHal_CalculateCCMWithMonitorGamut(
1401     VPHAL_HDR_CCM_TYPE  CCMType,
1402     PVPHAL_HDR_PARAMS   pTarget,
1403     float TempMatrix[12])
1404 {
1405     float src_xr = 1.0f, src_yr = 1.0f;
1406     float src_xg = 1.0f, src_yg = 1.0f;
1407     float src_xb = 1.0f, src_yb = 1.0f;
1408     float src_xn = 1.0f, src_yn = 1.0f;
1409 
1410     float dst_xr = 1.0f, dst_yr = 1.0f;
1411     float dst_xg = 1.0f, dst_yg = 1.0f;
1412     float dst_xb = 1.0f, dst_yb = 1.0f;
1413     float dst_xn = 1.0f, dst_yn = 1.0f;
1414 
1415     Mat3 SrcMatrix = {1.0f};
1416     Mat3 DstMatrix = {1.0f};
1417     Mat3 DstMatrixInverse = {1.0f};
1418     Mat3 SrcToDstMatrix   = {1.0f};
1419 
1420     Mat3 BT709ToBT2020Matrix = {1.0f};
1421     Mat3 BT2020ToBT709Matrix = {1.0f};
1422 
1423     VPHAL_PUBLIC_CHK_NULL_NO_STATUS(pTarget);
1424 
1425     if (CCMType == VPHAL_HDR_CCM_BT2020_TO_MONITOR_MATRIX)
1426     {
1427         src_xr = 0.708f;
1428         src_yr = 0.292f;
1429         src_xg = 0.170f;
1430         src_yg = 0.797f;
1431         src_xb = 0.131f;
1432         src_yb = 0.046f;
1433         src_xn = 0.3127f;
1434         src_yn = 0.3290f;
1435 
1436         dst_xr = pTarget->display_primaries_x[2] / 50000.0f;
1437         dst_yr = pTarget->display_primaries_y[2] / 50000.0f;
1438         dst_xg = pTarget->display_primaries_x[0] / 50000.0f;
1439         dst_yg = pTarget->display_primaries_y[0] / 50000.0f;
1440         dst_xb = pTarget->display_primaries_x[1] / 50000.0f;
1441         dst_yb = pTarget->display_primaries_y[1] / 50000.0f;
1442         dst_xn = pTarget->white_point_x / 50000.0f;
1443         dst_yn = pTarget->white_point_y / 50000.0f;
1444     }
1445     else if (CCMType == VPHAL_HDR_CCM_MONITOR_TO_BT2020_MATRIX)
1446     {
1447         src_xr = pTarget->display_primaries_x[2] / 50000.0f;
1448         src_yr = pTarget->display_primaries_y[2] / 50000.0f;
1449         src_xg = pTarget->display_primaries_x[0] / 50000.0f;
1450         src_yg = pTarget->display_primaries_y[0] / 50000.0f;
1451         src_xb = pTarget->display_primaries_x[1] / 50000.0f;
1452         src_yb = pTarget->display_primaries_y[1] / 50000.0f;
1453         src_xn = pTarget->white_point_x / 50000.0f;
1454         src_yn = pTarget->white_point_y / 50000.0f;
1455 
1456         dst_xr = 0.708f;
1457         dst_yr = 0.292f;
1458         dst_xg = 0.170f;
1459         dst_yg = 0.797f;
1460         dst_xb = 0.131f;
1461         dst_yb = 0.046f;
1462         dst_xn = 0.3127f;
1463         dst_yn = 0.3290f;
1464     }
1465     else
1466     {
1467         // VPHAL_HDR_CCM_MONITOR_TO_BT2020_MATRIX
1468         src_xr = pTarget->display_primaries_x[2] / 50000.0f;
1469         src_yr = pTarget->display_primaries_y[2] / 50000.0f;
1470         src_xg = pTarget->display_primaries_x[0] / 50000.0f;
1471         src_yg = pTarget->display_primaries_y[0] / 50000.0f;
1472         src_xb = pTarget->display_primaries_x[1] / 50000.0f;
1473         src_yb = pTarget->display_primaries_y[1] / 50000.0f;
1474         src_xn = pTarget->white_point_x / 50000.0f;
1475         src_yn = pTarget->white_point_y / 50000.0f;
1476 
1477         dst_xr = 0.64f;
1478         dst_yr = 0.33f;
1479         dst_xg = 0.30f;
1480         dst_yg = 0.60f;
1481         dst_xb = 0.15f;
1482         dst_yb = 0.06f;
1483         dst_xn = 0.3127f;
1484         dst_yn = 0.3290f;
1485     }
1486 
1487     RGB2CIEXYZMatrix(
1488             src_xr, src_yr,
1489             src_xg, src_yg,
1490             src_xb, src_yb,
1491             src_xn, src_yn,
1492             SrcMatrix);
1493 
1494     RGB2CIEXYZMatrix(
1495             dst_xr, dst_yr,
1496             dst_xg, dst_yg,
1497             dst_xb, dst_yb,
1498             dst_xn, dst_yn,
1499             DstMatrix);
1500 
1501     Mat3Inverse(DstMatrix, DstMatrixInverse);
1502     Mat3MultiplyMat3(DstMatrixInverse, SrcMatrix, SrcToDstMatrix);
1503 
1504     TempMatrix[0]  = SrcToDstMatrix[0][0];
1505     TempMatrix[1]  = SrcToDstMatrix[0][1];
1506     TempMatrix[2]  = SrcToDstMatrix[0][2];
1507     TempMatrix[3]  = 0.0f;
1508     TempMatrix[4]  = SrcToDstMatrix[1][0];
1509     TempMatrix[5]  = SrcToDstMatrix[1][1];
1510     TempMatrix[6]  = SrcToDstMatrix[1][2];
1511     TempMatrix[7]  = 0.0f;
1512     TempMatrix[8]  = SrcToDstMatrix[2][0];
1513     TempMatrix[9]  = SrcToDstMatrix[2][1];
1514     TempMatrix[10] = SrcToDstMatrix[2][2];
1515     TempMatrix[11] = 0.0f;
1516 
1517 finish:
1518     return;
1519 }
1520 
1521 //!
1522 //! \brief    Initiate EOTF Surface for HDR
1523 //! \details  Initiate EOTF Surface for HDR
1524 //! \param    PVPHAL_HDR_STATE pHdrStatee
1525 //!           [in] Pointer to HDR state
1526 //! \param    PVPHAL_SURFACE pCoeffSurface
1527 //!           [in] Pointer to CSC/CCM Surface
1528 //! \return   MOS_STATUS
1529 //!
VpHal_HdrInitCoeff_g9(PVPHAL_HDR_STATE pHdrState,PVPHAL_SURFACE pCoeffSurface)1530 MOS_STATUS VpHal_HdrInitCoeff_g9 (
1531     PVPHAL_HDR_STATE pHdrState,
1532     PVPHAL_SURFACE   pCoeffSurface)
1533 {
1534     MOS_STATUS       eStatus                = MOS_STATUS_SUCCESS;
1535     PMOS_INTERFACE   pOsInterface           = nullptr;
1536     uint32_t         i                      = 0;
1537     float            *pFloat                = nullptr;
1538     float            *pCoeff                = nullptr;
1539     uint32_t         *pEOTFType             = nullptr;
1540     float            *pEOTFCoeff            = nullptr;
1541     float            *pPivotPoint           = nullptr;
1542     uint32_t         *pTMType               = nullptr;
1543     uint32_t         *pOETFNeqType          = nullptr;
1544     uint32_t         *pCCMEnable            = nullptr;
1545     float            *pPWLFStretch          = nullptr;
1546     float            *pCoeffR               = nullptr;
1547     float            *pCoeffG               = nullptr;
1548     float            *pCoeffB               = nullptr;
1549     uint16_t         *pSlopeIntercept       = nullptr;
1550     MOS_LOCK_PARAMS  LockFlags              = {};
1551     float            PriorCscMatrix[12]     = {};
1552     float            PostCscMatrix[12]      = {};
1553     float            CcmMatrix[12]          = {};
1554     float            TempMatrix[12]         = {};
1555     PVPHAL_SURFACE   pSrc                   = nullptr;
1556 
1557     VPHAL_PUBLIC_CHK_NULL(pHdrState);
1558     VPHAL_PUBLIC_CHK_NULL(pCoeffSurface);
1559     VPHAL_PUBLIC_CHK_NULL(pHdrState->pTargetSurf[0]);
1560 
1561     eStatus         = MOS_STATUS_SUCCESS;
1562     pOsInterface    = pHdrState->pOsInterface;
1563 
1564     VPHAL_PUBLIC_CHK_NULL(pOsInterface);
1565 
1566     MOS_ZeroMemory(&LockFlags, sizeof(MOS_LOCK_PARAMS));
1567 
1568     LockFlags.WriteOnly = 1;
1569 
1570     // Lock the surface for writing
1571     pFloat = (float *)pOsInterface->pfnLockResource(
1572         pOsInterface,
1573         &(pCoeffSurface->OsResource),
1574         &LockFlags);
1575 
1576     VPHAL_RENDER_CHK_NULL(pFloat);
1577 
1578     #define SET_MATRIX(_c0, _c1, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c10, _c11) \
1579     { \
1580         TempMatrix[0]          = _c0;              \
1581         TempMatrix[1]          = _c1;              \
1582         TempMatrix[2]          = _c2;              \
1583         TempMatrix[3]          = _c3;              \
1584         TempMatrix[4]          = _c4;              \
1585         TempMatrix[5]          = _c5;              \
1586         TempMatrix[6]          = _c6;              \
1587         TempMatrix[7]          = _c7;              \
1588         TempMatrix[8]          = _c8;              \
1589         TempMatrix[9]          = _c9;              \
1590         TempMatrix[10]         = _c10;             \
1591         TempMatrix[11]         = _c11;             \
1592     }
1593 
1594     #define SET_EOTF_COEFF(_c1, _c2, _c3, _c4, _c5) \
1595     { \
1596         *pEOTFCoeff          = _c1;                 \
1597         pEOTFCoeff += pCoeffSurface->dwPitch / sizeof(float); \
1598         *pEOTFCoeff          = _c2;                 \
1599         pEOTFCoeff += pCoeffSurface->dwPitch / sizeof(float); \
1600         *pEOTFCoeff          = _c3;                 \
1601         pEOTFCoeff += pCoeffSurface->dwPitch / sizeof(float); \
1602         *pEOTFCoeff          = _c4;                 \
1603         pEOTFCoeff += pCoeffSurface->dwPitch / sizeof(float); \
1604         *pEOTFCoeff          = _c5;                 \
1605     }
1606 
1607     #define WRITE_MATRIX(Matrix) \
1608     { \
1609         *pCoeff++          = Matrix[0];             \
1610         *pCoeff++          = Matrix[1];             \
1611         *pCoeff++          = Matrix[2];             \
1612         *pCoeff++          = Matrix[3];             \
1613         *pCoeff++          = Matrix[4];             \
1614         *pCoeff++          = Matrix[5];             \
1615          pCoeff+= pCoeffSurface->dwPitch / sizeof(float) - 6; \
1616         *pCoeff++          = Matrix[6];             \
1617         *pCoeff++          = Matrix[7];             \
1618         *pCoeff++          = Matrix[8];             \
1619         *pCoeff++          = Matrix[9];             \
1620         *pCoeff++          = Matrix[10];            \
1621         *pCoeff++          = Matrix[11];            \
1622          pCoeff+= pCoeffSurface->dwPitch / sizeof(float)  - 6; \
1623     }
1624 
1625     for (i = 0; i < VPHAL_MAX_HDR_INPUT_LAYER; i++, pFloat += VPHAL_HDR_COEF_LINES_PER_LAYER_BASIC_G9 * pCoeffSurface->dwPitch / (sizeof(float)))
1626     {
1627         if (pHdrState->pSrcSurf[i] == nullptr)
1628         {
1629             continue;
1630         }
1631 
1632         pSrc   = pHdrState->pSrcSurf[i];
1633         pCoeff = pFloat;
1634 
1635         if (pHdrState->pSrcSurf[i]->SurfType == SURF_IN_PRIMARY)
1636         {
1637             pHdrState->Reporting.GetFeatures().hdrMode = pHdrState->HdrMode[i];
1638         }
1639 
1640         // EOTF/CCM/Tone Mapping/OETF require RGB input
1641         // So if prior CSC is needed, it will always be YUV to RGB conversion
1642         if (pHdrState->StageEnableFlags[i].PriorCSCEnable)
1643         {
1644             if (pHdrState->PriorCSC[i] == VPHAL_HDR_CSC_YUV_TO_RGB_BT601)
1645             {
1646                 SET_MATRIX( 1.000000f,  0.000000f,  1.402000f,  0.000000f,
1647                             1.000000f, -0.344136f, -0.714136f,  0.000000f,
1648                             1.000000f,  1.772000f,  0.000000f,  0.000000f);
1649 
1650                 VpHal_HdrCalcYuvToRgbMatrix(CSpace_BT601, CSpace_sRGB, TempMatrix, PriorCscMatrix);
1651             }
1652             else if (pHdrState->PriorCSC[i] == VPHAL_HDR_CSC_YUV_TO_RGB_BT709)
1653             {
1654                 SET_MATRIX( 1.000000f,  0.000000f,  1.574800f,  0.000000f,
1655                             1.000000f, -0.187324f, -0.468124f,  0.000000f,
1656                             1.000000f,  1.855600f,  0.000000f,  0.000000f);
1657                 VpHal_HdrCalcYuvToRgbMatrix(CSpace_BT709, CSpace_sRGB, TempMatrix, PriorCscMatrix);
1658             }
1659             else if (pHdrState->PriorCSC[i] == VPHAL_HDR_CSC_YUV_TO_RGB_BT2020)
1660             {
1661                 SET_MATRIX( 1.000000f,  0.000000f,  1.474600f,  0.000000f,
1662                             1.000000f, -0.164550f, -0.571350f,  0.000000f,
1663                             1.000000f,  1.881400f,  0.000000f,  0.000000f);
1664                 VpHal_HdrCalcYuvToRgbMatrix(CSpace_BT2020, CSpace_sRGB, TempMatrix, PriorCscMatrix);
1665             }
1666             else
1667             {
1668                 VPHAL_RENDER_ASSERTMESSAGE("Color Space Not found.");
1669                 eStatus = MOS_STATUS_INVALID_PARAMETER;
1670                 goto finish;
1671             }
1672             LimitFP32ArrayPrecisionToF3_9(PriorCscMatrix, ARRAY_SIZE(PriorCscMatrix));
1673             WRITE_MATRIX(PriorCscMatrix);
1674         }
1675         else
1676         {
1677             pCoeff += pCoeffSurface->dwPitch / sizeof(float) * 2;
1678         }
1679 
1680         if (pHdrState->StageEnableFlags[i].CCMEnable)
1681         {
1682             // BT709 to BT2020 CCM
1683             if (pHdrState->CCM[i] == VPHAL_HDR_CCM_BT601_BT709_TO_BT2020_MATRIX)
1684             {
1685                 SET_MATRIX(0.627404078626f, 0.329282097415f, 0.043313797587f, 0.000000f,
1686                            0.069097233123f, 0.919541035593f, 0.011361189924f, 0.000000f,
1687                            0.016391587664f, 0.088013255546f, 0.895595009604f, 0.000000f);
1688             }
1689             // BT2020 to BT709 CCM
1690             else if (pHdrState->CCM[i] == VPHAL_HDR_CCM_BT2020_TO_BT601_BT709_MATRIX)
1691             {
1692                 SET_MATRIX(1.660490254890140f, -0.587638564717282f, -0.072851975229213f, 0.000000f,
1693                           -0.124550248621850f,  1.132898753013895f, -0.008347895599309f, 0.000000f,
1694                           -0.018151059958635f, -0.100578696221493f,  1.118729865913540f, 0.000000f);
1695             }
1696             else
1697             {
1698                 SET_MATRIX(1.0f, 0.0f, 0.0f, 0.0f,
1699                            0.0f, 1.0f, 0.0f, 0.0f,
1700                            0.0f, 0.0f, 1.0f, 0.0f);
1701             }
1702 
1703             VpHal_HdrCalcCCMMatrix(TempMatrix, CcmMatrix);
1704             LimitFP32ArrayPrecisionToF3_9(CcmMatrix, ARRAY_SIZE(CcmMatrix));
1705             WRITE_MATRIX(CcmMatrix);
1706         }
1707         else
1708         {
1709             pCoeff += pCoeffSurface->dwPitch / sizeof(float) * 2;
1710         }
1711 
1712         // OETF will output RGB surface
1713         // So if post CSC is needed, it will always be RGB to YUV conversion
1714         if (pHdrState->StageEnableFlags[i].PostCSCEnable)
1715         {
1716             if (pHdrState->PostCSC[i] == VPHAL_HDR_CSC_RGB_TO_YUV_BT601)
1717             {
1718                 SET_MATRIX( -0.331264f, -0.168736f,  0.500000f,  0.000000f,
1719                              0.587000f,  0.299000f,  0.114000f,  0.000000f,
1720                             -0.418688f,  0.500000f, -0.081312f,  0.000000f);
1721                 VpHal_HdrCalcRgbToYuvMatrix(CSpace_sRGB, CSpace_BT601, TempMatrix, PostCscMatrix);
1722             }
1723             else if (pHdrState->PostCSC[i] == VPHAL_HDR_CSC_RGB_TO_YUV_BT709)
1724             {
1725                 SET_MATRIX( -0.385428f, -0.114572f,  0.500000f,  0.000000f,
1726                              0.715200f,  0.212600f,  0.072200f,  0.000000f,
1727                             -0.454153f,  0.500000f, -0.045847f,  0.000000f);
1728                 VpHal_HdrCalcRgbToYuvMatrix(CSpace_sRGB, CSpace_BT709, TempMatrix, PostCscMatrix);
1729             }
1730             else if (pHdrState->PostCSC[i] == VPHAL_HDR_CSC_RGB_TO_YUV_BT709_FULLRANGE)
1731             {
1732                 SET_MATRIX( -0.385428f, -0.114572f,  0.500000f,  0.000000f,
1733                              0.715200f,  0.212600f,  0.072200f,  0.000000f,
1734                             -0.454153f,  0.500000f, -0.045847f, 0.000000f);
1735                 VpHal_HdrCalcRgbToYuvMatrix(CSpace_sRGB, CSpace_BT709_FullRange, TempMatrix, PostCscMatrix);
1736             }
1737             else if (pHdrState->PostCSC[i] == VPHAL_HDR_CSC_RGB_TO_YUV_BT2020)
1738             {
1739                 SET_MATRIX( -0.360370f, -0.139630f,  0.500000f,  0.000000f,
1740                              0.678000f,  0.262700f,  0.059300f,  0.000000f,
1741                             -0.459786f,  0.500000f, -0.040214f,  0.000000f);
1742                 VpHal_HdrCalcRgbToYuvMatrix(CSpace_sRGB, CSpace_BT2020, TempMatrix, PostCscMatrix);
1743             }
1744             else
1745             {
1746                 VPHAL_RENDER_ASSERTMESSAGE("Color Space Not found.");
1747                 eStatus = MOS_STATUS_INVALID_PARAMETER;
1748                 goto finish;
1749             }
1750             LimitFP32ArrayPrecisionToF3_9(PostCscMatrix, ARRAY_SIZE(PostCscMatrix));
1751             WRITE_MATRIX(PostCscMatrix);
1752         }
1753         else
1754         {
1755             pCoeff += pCoeffSurface->dwPitch / sizeof(float) * 2;
1756         }
1757 
1758         pEOTFType  = (uint32_t *)(pFloat + VPHAL_HDR_COEF_EOTF_OFFSET);
1759         pEOTFCoeff = pFloat + pCoeffSurface->dwPitch / sizeof(float) + VPHAL_HDR_COEF_EOTF_OFFSET;
1760 
1761         if (pHdrState->StageEnableFlags[i].EOTFEnable)
1762         {
1763             if (pHdrState->EOTFGamma[i] == VPHAL_GAMMA_TRADITIONAL_GAMMA)
1764             {
1765                 *pEOTFType = VPHAL_HDR_KERNEL_EOTF_TRADITIONAL_GAMMA_G9;
1766                 SET_EOTF_COEFF(VPHAL_HDR_EOTF_COEFF1_TRADITIONNAL_GAMMA_G9,
1767                                VPHAL_HDR_EOTF_COEFF2_TRADITIONNAL_GAMMA_G9,
1768                                VPHAL_HDR_EOTF_COEFF3_TRADITIONNAL_GAMMA_G9,
1769                                VPHAL_HDR_EOTF_COEFF4_TRADITIONNAL_GAMMA_G9,
1770                                VPHAL_HDR_EOTF_COEFF5_TRADITIONNAL_GAMMA_G9);
1771             }
1772             else if (pHdrState->EOTFGamma[i] == VPHAL_GAMMA_SMPTE_ST2084)
1773             {
1774                 *pEOTFType = VPHAL_HDR_KERNEL_SMPTE_ST2084_G9;
1775                 SET_EOTF_COEFF(VPHAL_HDR_EOTF_COEFF1_SMPTE_ST2084_G9,
1776                                VPHAL_HDR_EOTF_COEFF2_SMPTE_ST2084_G9,
1777                                VPHAL_HDR_EOTF_COEFF3_SMPTE_ST2084_G9,
1778                                VPHAL_HDR_EOTF_COEFF4_SMPTE_ST2084_G9,
1779                                VPHAL_HDR_EOTF_COEFF5_SMPTE_ST2084_G9);
1780             }
1781             else if (pHdrState->EOTFGamma[i] == VPHAL_GAMMA_BT1886)
1782             {
1783                 *pEOTFType = VPHAL_HDR_KERNEL_EOTF_TRADITIONAL_GAMMA_G9;
1784                 SET_EOTF_COEFF(VPHAL_HDR_EOTF_COEFF1_TRADITIONNAL_GAMMA_BT1886_G9,
1785                                VPHAL_HDR_EOTF_COEFF2_TRADITIONNAL_GAMMA_BT1886_G9,
1786                                VPHAL_HDR_EOTF_COEFF3_TRADITIONNAL_GAMMA_BT1886_G9,
1787                                VPHAL_HDR_EOTF_COEFF4_TRADITIONNAL_GAMMA_BT1886_G9,
1788                                VPHAL_HDR_EOTF_COEFF5_TRADITIONNAL_GAMMA_BT1886_G9);
1789             }
1790             else if (pHdrState->EOTFGamma[i] == VPHAL_GAMMA_SRGB)
1791             {
1792                 *pEOTFType = VPHAL_HDR_KERNEL_EOTF_TRADITIONAL_GAMMA_G9;
1793                 SET_EOTF_COEFF(VPHAL_HDR_EOTF_COEFF1_TRADITIONNAL_GAMMA_SRGB_G9,
1794                                VPHAL_HDR_EOTF_COEFF2_TRADITIONNAL_GAMMA_SRGB_G9,
1795                                VPHAL_HDR_EOTF_COEFF3_TRADITIONNAL_GAMMA_SRGB_G9,
1796                                VPHAL_HDR_EOTF_COEFF4_TRADITIONNAL_GAMMA_SRGB_G9,
1797                                VPHAL_HDR_EOTF_COEFF5_TRADITIONNAL_GAMMA_SRGB_G9);
1798             }
1799             else
1800             {
1801                 VPHAL_RENDER_ASSERTMESSAGE("Invalid EOTF setting for tone mapping");
1802                 eStatus = MOS_STATUS_INVALID_PARAMETER;
1803                 goto finish;
1804             }
1805         }
1806 
1807         pEOTFType ++;
1808         pEOTFCoeff = pFloat + pCoeffSurface->dwPitch / sizeof(float) + VPHAL_HDR_COEF_EOTF_OFFSET + 1;
1809 
1810         if (pHdrState->StageEnableFlags[i].OETFEnable)
1811         {
1812             if (pHdrState->OETFGamma[i] == VPHAL_GAMMA_TRADITIONAL_GAMMA)
1813             {
1814                 *pEOTFType = VPHAL_HDR_KERNEL_EOTF_TRADITIONAL_GAMMA_G9;
1815                 SET_EOTF_COEFF(VPHAL_HDR_OETF_COEFF1_TRADITIONNAL_GAMMA_G9,
1816                                VPHAL_HDR_OETF_COEFF2_TRADITIONNAL_GAMMA_G9,
1817                                VPHAL_HDR_OETF_COEFF3_TRADITIONNAL_GAMMA_G9,
1818                                VPHAL_HDR_OETF_COEFF4_TRADITIONNAL_GAMMA_G9,
1819                                VPHAL_HDR_OETF_COEFF5_TRADITIONNAL_GAMMA_G9);
1820             }
1821             else if (pHdrState->OETFGamma[i] == VPHAL_GAMMA_SRGB)
1822             {
1823                 *pEOTFType = VPHAL_HDR_KERNEL_EOTF_TRADITIONAL_GAMMA_G9;
1824                 SET_EOTF_COEFF(VPHAL_HDR_OETF_COEFF1_TRADITIONNAL_GAMMA_SRGB_G9,
1825                                VPHAL_HDR_OETF_COEFF2_TRADITIONNAL_GAMMA_SRGB_G9,
1826                                VPHAL_HDR_OETF_COEFF3_TRADITIONNAL_GAMMA_SRGB_G9,
1827                                VPHAL_HDR_OETF_COEFF4_TRADITIONNAL_GAMMA_SRGB_G9,
1828                                VPHAL_HDR_OETF_COEFF5_TRADITIONNAL_GAMMA_SRGB_G9);
1829             }
1830             else if (pHdrState->OETFGamma[i] == VPHAL_GAMMA_SMPTE_ST2084)
1831             {
1832                 *pEOTFType = VPHAL_HDR_KERNEL_SMPTE_ST2084_G9;
1833                 SET_EOTF_COEFF(VPHAL_HDR_OETF_COEFF1_SMPTE_ST2084_G9,
1834                                VPHAL_HDR_OETF_COEFF2_SMPTE_ST2084_G9,
1835                                VPHAL_HDR_OETF_COEFF3_SMPTE_ST2084_G9,
1836                                VPHAL_HDR_OETF_COEFF4_SMPTE_ST2084_G9,
1837                                VPHAL_HDR_OETF_COEFF5_SMPTE_ST2084_G9);
1838             }
1839             else
1840             {
1841                 VPHAL_RENDER_ASSERTMESSAGE("Invalid EOTF setting for tone mapping");
1842                 eStatus = MOS_STATUS_INVALID_PARAMETER;
1843                 goto finish;
1844             }
1845         }
1846 
1847         // NOTE:
1848         // Pitch is not equal to width usually. So please be careful when using pointer addition.
1849         // Only do this when operands are in the same row.
1850         pPivotPoint     = pFloat + pCoeffSurface->dwPitch / sizeof(float) * VPHAL_HDR_COEF_PIVOT_POINT_LINE_OFFSET;
1851         pSlopeIntercept = (uint16_t *)(pFloat + pCoeffSurface->dwPitch / sizeof(float) * VPHAL_HDR_COEF_SLOPE_INTERCEPT_LINE_OFFSET);
1852         pPWLFStretch    = pFloat + pCoeffSurface->dwPitch / sizeof(float) * VPHAL_HDR_COEF_PIVOT_POINT_LINE_OFFSET + 5;
1853         pTMType         = (uint32_t *)(pPWLFStretch);
1854         pCoeffR         = pPWLFStretch + 1;
1855         pCoeffG         = pCoeffR + 1;
1856         pCoeffB         = pFloat + pCoeffSurface->dwPitch / sizeof(float) * VPHAL_HDR_COEF_SLOPE_INTERCEPT_LINE_OFFSET + 6;
1857         pOETFNeqType    = (uint32_t *)(pFloat + pCoeffSurface->dwPitch / sizeof(float) * VPHAL_HDR_COEF_SLOPE_INTERCEPT_LINE_OFFSET + 7);
1858 
1859         if (pHdrState->HdrMode[i] == VPHAL_HDR_MODE_TONE_MAPPING)
1860         {
1861             *pTMType       = 1; // TMtype
1862             *pOETFNeqType  = 0 | (10000 << 16); // OETFNEQ
1863             *pCoeffR = 0.25f;
1864             *pCoeffG = 0.625f;
1865             *pCoeffB = 0.125f;
1866         }
1867         else if (pHdrState->HdrMode[i] == VPHAL_HDR_MODE_INVERSE_TONE_MAPPING)
1868         {
1869             *pPWLFStretch = 0.01f; // Stretch
1870             *pOETFNeqType = 1 | ((uint32_t)100 << 16); // OETFNEQ
1871             *pCoeffR = 0.0f;
1872             *pCoeffG = 0.0f;
1873             *pCoeffB = 0.0f;
1874         }
1875         else if (pHdrState->HdrMode[i] == VPHAL_HDR_MODE_H2H ||
1876                  pHdrState->HdrMode[i] == VPHAL_HDR_MODE_H2H_AUTO_MODE)
1877         {
1878             PVPHAL_SURFACE  pTargetSurf  = (PVPHAL_SURFACE)pHdrState->pTargetSurf[0];
1879 
1880             *pTMType      = 1; // TMtype
1881             *pOETFNeqType = 2 | (((uint32_t)(pTargetSurf->pHDRParams->max_display_mastering_luminance)) << 16); // OETFNEQ
1882             *pCoeffR = 0.25f;
1883             *pCoeffG = 0.625f;
1884             *pCoeffB = 0.125f;
1885         }
1886         else
1887         {
1888             *pPivotPoint   = 0.0f;
1889             *pTMType       = 0; // TMtype
1890             *pOETFNeqType  = 0; // OETFNEQ
1891         }
1892     }
1893 
1894     // Skip the Dst CSC area
1895     pFloat += 2 * pCoeffSurface->dwPitch / sizeof(float);
1896 
1897     for (i = 0; i < VPHAL_MAX_HDR_INPUT_LAYER; i++, pFloat += VPHAL_HDR_COEF_LINES_PER_LAYER_EXT_G9 * pCoeffSurface->dwPitch / (sizeof(float)))
1898     {
1899         pCCMEnable = (uint32_t *)pFloat;
1900         *(pCCMEnable + VPHAL_HDR_COEF_CCMEXT_OFFSET) = pHdrState->StageEnableFlags[i].CCMExt1Enable;
1901         *(pCCMEnable + VPHAL_HDR_COEF_CLAMP_OFFSET ) = pHdrState->StageEnableFlags[i].GamutClamp1Enable;
1902 
1903         pCCMEnable += pCoeffSurface->dwPitch / sizeof(float) * 2;
1904         *(pCCMEnable + VPHAL_HDR_COEF_CCMEXT_OFFSET) = pHdrState->StageEnableFlags[i].CCMExt2Enable;
1905         *(pCCMEnable + VPHAL_HDR_COEF_CLAMP_OFFSET ) = pHdrState->StageEnableFlags[i].GamutClamp2Enable;
1906 
1907         if (pHdrState->pSrcSurf[i] == nullptr)
1908         {
1909             continue;
1910         }
1911 
1912         pCoeff = pFloat;
1913         if (pHdrState->StageEnableFlags[i].CCMExt1Enable)
1914         {
1915             // BT709 to BT2020 CCM
1916             if (pHdrState->CCMExt1[i] == VPHAL_HDR_CCM_BT601_BT709_TO_BT2020_MATRIX)
1917             {
1918                 SET_MATRIX(0.627404078626f, 0.329282097415f, 0.043313797587f, 0.000000f,
1919                            0.069097233123f, 0.919541035593f, 0.011361189924f, 0.000000f,
1920                            0.016391587664f, 0.088013255546f, 0.895595009604f, 0.000000f);
1921             }
1922             // BT2020 to BT709 CCM
1923             else if (pHdrState->CCMExt1[i] == VPHAL_HDR_CCM_BT2020_TO_BT601_BT709_MATRIX)
1924             {
1925                 SET_MATRIX(1.660490254890140f, -0.587638564717282f, -0.072851975229213f, 0.000000f,
1926                           -0.124550248621850f,  1.132898753013895f, -0.008347895599309f, 0.000000f,
1927                           -0.018151059958635f, -0.100578696221493f,  1.118729865913540f, 0.000000f);
1928             }
1929             else if (pHdrState->CCMExt1[i] == VPHAL_HDR_CCM_BT2020_TO_MONITOR_MATRIX ||
1930                      pHdrState->CCMExt1[i] == VPHAL_HDR_CCM_MONITOR_TO_BT2020_MATRIX ||
1931                      pHdrState->CCMExt1[i] == VPHAL_HDR_CCM_MONITOR_TO_BT709_MATRIX)
1932             {
1933                 PVPHAL_SURFACE  pTargetSurf = (PVPHAL_SURFACE)pHdrState->pTargetSurf[0];
1934                 VpHal_CalculateCCMWithMonitorGamut(pHdrState->CCMExt1[i], pTargetSurf->pHDRParams, TempMatrix);
1935             }
1936             else
1937             {
1938                 SET_MATRIX(1.0f, 0.0f, 0.0f, 0.0f,
1939                            0.0f, 1.0f, 0.0f, 0.0f,
1940                            0.0f, 0.0f, 1.0f, 0.0f);
1941             }
1942 
1943             VpHal_HdrCalcCCMMatrix(TempMatrix, CcmMatrix);
1944             LimitFP32ArrayPrecisionToF3_9(CcmMatrix, ARRAY_SIZE(CcmMatrix));
1945             WRITE_MATRIX(CcmMatrix);
1946         }
1947         else
1948         {
1949             pCoeff += pCoeffSurface->dwPitch / sizeof(float) * 2;
1950         }
1951 
1952         if (pHdrState->StageEnableFlags[i].CCMExt2Enable)
1953         {
1954             // BT709 to BT2020 CCM
1955             if (pHdrState->CCMExt2[i] == VPHAL_HDR_CCM_BT601_BT709_TO_BT2020_MATRIX)
1956             {
1957                 SET_MATRIX(0.627404078626f, 0.329282097415f, 0.043313797587f, 0.000000f,
1958                            0.069097233123f, 0.919541035593f, 0.011361189924f, 0.000000f,
1959                            0.016391587664f, 0.088013255546f, 0.895595009604f, 0.000000f);
1960             }
1961             // BT2020 to BT709 CCM
1962             else if (pHdrState->CCMExt2[i] == VPHAL_HDR_CCM_BT2020_TO_BT601_BT709_MATRIX)
1963             {
1964                 SET_MATRIX(1.660490254890140f, -0.587638564717282f, -0.072851975229213f, 0.000000f,
1965                           -0.124550248621850f,  1.132898753013895f, -0.008347895599309f, 0.000000f,
1966                           -0.018151059958635f, -0.100578696221493f,  1.118729865913540f, 0.000000f);
1967             }
1968             else if (pHdrState->CCMExt2[i] == VPHAL_HDR_CCM_BT2020_TO_MONITOR_MATRIX ||
1969                      pHdrState->CCMExt2[i] == VPHAL_HDR_CCM_MONITOR_TO_BT2020_MATRIX ||
1970                      pHdrState->CCMExt2[i] == VPHAL_HDR_CCM_MONITOR_TO_BT709_MATRIX)
1971             {
1972                 PVPHAL_SURFACE  pTargetSurf = (PVPHAL_SURFACE)pHdrState->pTargetSurf[0];
1973                 VpHal_CalculateCCMWithMonitorGamut(pHdrState->CCMExt2[i], pTargetSurf->pHDRParams, TempMatrix);
1974             }
1975             else
1976             {
1977                 SET_MATRIX(1.0f, 0.0f, 0.0f, 0.0f,
1978                            0.0f, 1.0f, 0.0f, 0.0f,
1979                            0.0f, 0.0f, 1.0f, 0.0f);
1980             }
1981 
1982             VpHal_HdrCalcCCMMatrix(TempMatrix, CcmMatrix);
1983             LimitFP32ArrayPrecisionToF3_9(CcmMatrix, ARRAY_SIZE(CcmMatrix));
1984             WRITE_MATRIX(CcmMatrix);
1985         }
1986         else
1987         {
1988             pCoeff += pCoeffSurface->dwPitch / sizeof(float) * 2;
1989         }
1990     }
1991 
1992     pOsInterface->pfnUnlockResource(
1993             pOsInterface,
1994             &(pCoeffSurface->OsResource));
1995 
1996     eStatus = MOS_STATUS_SUCCESS;
1997 
1998     #undef SET_MATRIX
1999     #undef SET_EOTF_COEFF
2000     #undef WRITE_MATRIX
2001 
2002 finish:
2003     return eStatus;
2004 }
2005 
2006 
2007 //! \brief    Allocate Resources for HDR
2008 //! \details  Allocate Resources for HDR
2009 //! \param    PVPHAL_HDR_STATE pHdrStatee
2010 //!           [in] Pointer to HDR state
2011 //! \return   MOS_STATUS
2012 //!
VpHal_HdrAllocateResources_g9(PVPHAL_HDR_STATE pHdrState)2013 MOS_STATUS VpHal_HdrAllocateResources_g9(
2014     PVPHAL_HDR_STATE    pHdrState)
2015 {
2016     MOS_STATUS              eStatus            = MOS_STATUS_SUCCESS;
2017     PMOS_INTERFACE          pOsInterface       = nullptr;
2018     uint32_t                dwWidth            = 16;
2019     uint32_t                dwHeight           = 16;
2020     uint32_t                dwDepth            = 8;
2021     bool                    bAllocated         = false;
2022     uint32_t                dwUpdateMask       = 0;
2023     int32_t                 i                  = 0;
2024     VPHAL_GET_SURFACE_INFO  Info               = {};
2025     MOS_ALLOC_GFXRES_PARAMS AllocParams        = {};
2026     VPHAL_HDR_RENDER_DATA   RenderData         = {};
2027 
2028     VPHAL_RENDER_CHK_NULL(pHdrState);
2029     VPHAL_RENDER_CHK_NULL(pHdrState->pOsInterface);
2030 
2031     eStatus         = MOS_STATUS_UNKNOWN;
2032     pOsInterface    = pHdrState->pOsInterface;
2033 
2034     // Allocate CSC CCM Coeff Surface
2035     dwWidth  = VPHAL_HDR_COEF_SURFACE_WIDTH_G9;
2036     dwHeight = VPHAL_HDR_COEF_SURFACE_HEIGHT_G9;
2037 
2038     pHdrState->pHDRStageConfigTable = HDRStageConfigTable_g9;
2039 
2040     VPHAL_RENDER_CHK_STATUS(VpHal_HdrUpdatePerLayerPipelineStates(pHdrState, &dwUpdateMask));
2041 
2042     VPHAL_RENDER_CHK_STATUS(VpHal_ReAllocateSurface(
2043         pOsInterface,
2044         &pHdrState->CoeffSurface,
2045         "CoeffSurface",
2046         Format_A8R8G8B8,
2047         MOS_GFXRES_2D,
2048         MOS_TILE_LINEAR,
2049         dwWidth,
2050         dwHeight,
2051         false,
2052         MOS_MMC_DISABLED,
2053         &bAllocated));
2054 
2055     // Initialize COEF Coeff Surface
2056     if (dwUpdateMask || bAllocated)
2057     {
2058         VPHAL_RENDER_CHK_STATUS(pHdrState->pfnInitCoeff(
2059             pHdrState,
2060             &pHdrState->CoeffSurface));
2061     }
2062 
2063     // Allocate OETF 1D LUT Surface
2064     dwWidth  = pHdrState->dwOetfSurfaceWidth;
2065     dwHeight = pHdrState->dwOetfSurfaceWidth;
2066 
2067     for (i = 0; i < VPHAL_MAX_HDR_INPUT_LAYER; i++)
2068     {
2069         VPHAL_RENDER_CHK_STATUS(VpHal_ReAllocateSurface(
2070                 pOsInterface,
2071                 &pHdrState->OETF1DLUTSurface[i],
2072                 "OETF1DLUTSurface",
2073                 Format_R16F,
2074                 MOS_GFXRES_2D,
2075                 MOS_TILE_LINEAR,
2076                 dwWidth,
2077                 dwHeight,
2078                 false,
2079                 MOS_MMC_DISABLED,
2080                 &bAllocated));
2081 
2082         if (bAllocated || (dwUpdateMask & (1 << i)) || (dwUpdateMask & (1 << VPHAL_MAX_HDR_INPUT_LAYER)))
2083         {
2084             // Initialize OETF 1D LUT Surface
2085             VPHAL_RENDER_CHK_STATUS(pHdrState->pfnInitOETF1DLUT(
2086                     pHdrState,
2087                     i,
2088                     &pHdrState->OETF1DLUTSurface[i]));
2089         }
2090     }
2091 
2092 finish:
2093     return eStatus;
2094 }
2095 
2096 //!
2097 //! \brief    Free Resources for HDR
2098 //! \details  Free Resources for HDR
2099 //! \param    PVPHAL_HDR_STATE pHdrStatee
2100 //!           [in] Pointer to HDR state
2101 //! \return   MOS_STATUS
2102 //!
VpHal_HdrFreeResources_g9(PVPHAL_HDR_STATE pHdrState)2103 MOS_STATUS VpHal_HdrFreeResources_g9(
2104     PVPHAL_HDR_STATE    pHdrState)
2105 {
2106     MOS_STATUS                  eStatus          = MOS_STATUS_SUCCESS;
2107     PMOS_INTERFACE              pOsInterface     = nullptr;
2108     int32_t                     i                = 0;
2109 
2110     VPHAL_RENDER_CHK_NULL(pHdrState);
2111     VPHAL_RENDER_CHK_NULL(pHdrState->pOsInterface);
2112 
2113     eStatus      = MOS_STATUS_SUCCESS;
2114     pOsInterface = pHdrState->pOsInterface;
2115 
2116     for (i = 0; i < VPHAL_MAX_HDR_INPUT_LAYER; i++)
2117     {
2118         pOsInterface->pfnFreeResource(pOsInterface,
2119             &(pHdrState->OETF1DLUTSurface[i].OsResource));
2120     }
2121 
2122     pOsInterface->pfnFreeResource(pOsInterface,
2123             &(pHdrState->CoeffSurface.OsResource));
2124 finish:
2125     return eStatus;
2126 }
2127 
2128 //!
2129 //! \brief    HDR Surface State Setup
2130 //! \details  Set up surface state used in HDR process, and bind the surface to pointed binding table entry.
2131 //! \param    PVPHAL_HDR_STATE pHdrState
2132 //            [in/out] Pointer to HDR state
2133 //! \param    PVPHAL_HDR_RENDER_DATA pRenderData
2134 //!           [in] Pointer to hdr render data.
2135 //! \return   MOS_STATUS
2136 //!           MOS_STATUS_SUCCESS if successful, otherwise failed
2137 //!
VpHal_HdrSetupSurfaceStates_g9(PVPHAL_HDR_STATE pHdrState,PVPHAL_HDR_RENDER_DATA pRenderData)2138 MOS_STATUS VpHal_HdrSetupSurfaceStates_g9(
2139     PVPHAL_HDR_STATE           pHdrState,
2140     PVPHAL_HDR_RENDER_DATA     pRenderData)
2141 {
2142     PRENDERHAL_INTERFACE            pRenderHal                  = nullptr;
2143     PVPHAL_SURFACE                  pSource                     = nullptr;
2144     PVPHAL_SURFACE                  pTarget                     = nullptr;
2145     PRENDERHAL_SURFACE              pRenderHalSource            = nullptr;
2146     PRENDERHAL_SURFACE              pRenderHalTarget            = nullptr;
2147     RENDERHAL_SURFACE_STATE_PARAMS  SurfaceParams               = {};
2148     MOS_STATUS                      eStatus                     = MOS_STATUS_UNKNOWN;
2149     uint32_t                        i                           = 0;
2150     int32_t                         iBTentry                    = 0;
2151     PVPHAL_SURFACE                  pSurfaceTemp                = nullptr;
2152     PRENDERHAL_SURFACE              pRenderHalSurfaceTemp       = nullptr;
2153 
2154     VPHAL_RENDER_CHK_NULL(pHdrState);
2155     VPHAL_RENDER_CHK_NULL(pRenderData);
2156 
2157     pRenderHal   = pHdrState->pRenderHal;
2158     VPHAL_RENDER_CHK_NULL(pRenderHal);
2159 
2160     for (i = 0; i < pHdrState->uSourceCount; i++)
2161     {
2162         if (i >= VPHAL_MAX_HDR_INPUT_LAYER)
2163         {
2164             eStatus = MOS_STATUS_INVALID_PARAMETER;
2165             goto finish;
2166         }
2167 
2168         pSource = pHdrState->pSrcSurf[i];
2169         pRenderHalSource = & pHdrState->RenderHalSrcSurf[i];
2170         VPHAL_RENDER_CHK_NULL(pSource);
2171 
2172         MOS_ZeroMemory(&SurfaceParams, sizeof(SurfaceParams));
2173 
2174         // Render target or private surface
2175         if (pSource->SurfType == SURF_OUT_RENDERTARGET)
2176         {
2177             // Disable AVS, IEF
2178             pSource->ScalingMode = VPHAL_SCALING_BILINEAR;
2179             pSource->bIEF        = false;
2180 
2181             // Set flags for RT
2182             SurfaceParams.isOutput    = true;
2183             SurfaceParams.bWidthInDword_Y  = true;
2184             SurfaceParams.bWidthInDword_UV = true;
2185             SurfaceParams.Boundary         = RENDERHAL_SS_BOUNDARY_DSTRECT;
2186         }
2187         // other surfaces
2188         else
2189         {
2190             SurfaceParams.isOutput    = false;
2191             SurfaceParams.bWidthInDword_Y  = false;
2192             SurfaceParams.bWidthInDword_UV = false;
2193             SurfaceParams.Boundary         = RENDERHAL_SS_BOUNDARY_SRCRECT;
2194         }
2195 
2196         // Set surface type based on scaling mode
2197         if (pSource->ScalingMode == VPHAL_SCALING_AVS || pSource->bIEF)
2198         {
2199             SurfaceParams.Type = pRenderHal->SurfaceTypeAdvanced;
2200             SurfaceParams.bAVS = true;
2201         }
2202         else
2203         {
2204             SurfaceParams.Type = pRenderHal->SurfaceTypeDefault;
2205             SurfaceParams.bAVS = false;
2206         }
2207 
2208         SurfaceParams.MemObjCtl = pHdrState->SurfMemObjCtl.SourceSurfMemObjCtl;
2209         iBTentry = pHdrState->uSourceBindingTableIndex[i];
2210 
2211         if (!Mos_ResourceIsNull(&pSource->OsResource))
2212         {
2213             VPHAL_RENDER_CHK_STATUS(VpHal_CommonSetSurfaceForHwAccess(
2214                 pRenderHal,
2215                 pSource,
2216                 pRenderHalSource,
2217                 &SurfaceParams,
2218                 pRenderData->iBindingTable,
2219                 iBTentry,
2220                 false));
2221         }
2222         else
2223         {
2224             VPHAL_RENDER_ASSERTMESSAGE("Null resource found");
2225             eStatus = MOS_STATUS_NULL_POINTER;
2226             goto finish;
2227         }
2228 
2229         if (pHdrState->LUTMode[i] == VPHAL_HDR_LUT_MODE_2D)
2230         {
2231             MOS_ZeroMemory(&SurfaceParams, sizeof(SurfaceParams));
2232             SurfaceParams.Type          = pRenderHal->SurfaceTypeDefault;
2233             SurfaceParams.isOutput = false;
2234             SurfaceParams.Boundary      = RENDERHAL_SS_BOUNDARY_ORIGINAL;
2235             SurfaceParams.bWidth16Align = false;
2236             SurfaceParams.MemObjCtl     = pHdrState->SurfMemObjCtl.Lut2DSurfMemObjCtl;
2237 
2238             if (!Mos_ResourceIsNull(&pHdrState->OETF1DLUTSurface[i].OsResource))
2239             {
2240                 VPHAL_RENDER_CHK_STATUS(VpHal_CommonSetSurfaceForHwAccess(
2241                     pRenderHal,
2242                     &pHdrState->OETF1DLUTSurface[i],
2243                     &pHdrState->RenderHalOETF1DLUTSurface[i],
2244                     &SurfaceParams,
2245                     pRenderData->iBindingTable,
2246                     iBTentry + VPHAL_HDR_BTINDEX_OETF1DLUT_OFFSET_G9,
2247                     false));
2248             }
2249             else
2250             {
2251                 VPHAL_RENDER_ASSERTMESSAGE("Null resource found");
2252                 eStatus = MOS_STATUS_NULL_POINTER;
2253                 goto finish;
2254             }
2255         }
2256     }
2257 
2258     for (i = 0; i < pHdrState->uTargetCount; i++)
2259     {
2260         if (i >= VPHAL_MAX_HDR_OUTPUT_LAYER)
2261         {
2262             eStatus = MOS_STATUS_INVALID_PARAMETER;
2263             goto finish;
2264         }
2265 
2266         pTarget = pHdrState->pTargetSurf[i];
2267         pRenderHalTarget = &pHdrState->RenderHalTargetSurf[i];
2268         VPHAL_RENDER_CHK_NULL(pTarget);
2269 
2270         MOS_ZeroMemory(&SurfaceParams, sizeof(SurfaceParams));
2271 
2272         // Render target or private surface
2273         if (pTarget->SurfType == SURF_OUT_RENDERTARGET)
2274         {
2275             // Disable AVS, IEF
2276             pTarget->ScalingMode = VPHAL_SCALING_BILINEAR;
2277             pTarget->bIEF        = false;
2278 
2279             // Set flags for RT
2280             SurfaceParams.isOutput    = true;
2281             SurfaceParams.bWidthInDword_Y  = true;
2282             SurfaceParams.bWidthInDword_UV = true;
2283             SurfaceParams.Boundary         = RENDERHAL_SS_BOUNDARY_DSTRECT;
2284         }
2285         // other surfaces
2286         else
2287         {
2288             SurfaceParams.isOutput    = false;
2289             SurfaceParams.bWidthInDword_Y  = false;
2290             SurfaceParams.bWidthInDword_UV = false;
2291             SurfaceParams.Boundary         = RENDERHAL_SS_BOUNDARY_SRCRECT;
2292         }
2293 
2294         // Set surface type based on scaling mode
2295         if (pTarget->ScalingMode == VPHAL_SCALING_AVS || pTarget->bIEF)
2296         {
2297             SurfaceParams.Type = pRenderHal->SurfaceTypeAdvanced;
2298             SurfaceParams.bAVS = true;
2299         }
2300         else
2301         {
2302             SurfaceParams.Type = pRenderHal->SurfaceTypeDefault;
2303             SurfaceParams.bAVS = false;
2304         }
2305 
2306         SurfaceParams.MemObjCtl = pHdrState->SurfMemObjCtl.TargetSurfMemObjCtl;
2307         iBTentry = pHdrState->uTargetBindingTableIndex[i];
2308 
2309         if (!Mos_ResourceIsNull(&pTarget->OsResource))
2310         {
2311             VPHAL_RENDER_CHK_STATUS(VpHal_CommonSetSurfaceForHwAccess(
2312                 pRenderHal,
2313                 pTarget,
2314                 pRenderHalTarget,
2315                 &SurfaceParams,
2316                 pRenderData->iBindingTable,
2317                 iBTentry,
2318                 true));
2319         }
2320         else
2321         {
2322             VPHAL_RENDER_ASSERTMESSAGE("Null resource found");
2323             eStatus = MOS_STATUS_NULL_POINTER;
2324             goto finish;
2325         }
2326     }
2327 
2328     pSurfaceTemp = &pHdrState->CoeffSurface;
2329     pRenderHalSurfaceTemp = &pHdrState->RenderHalCoeffSurface;
2330     MOS_ZeroMemory(&SurfaceParams, sizeof(SurfaceParams));
2331     SurfaceParams.Type = pRenderHal->SurfaceTypeDefault;
2332     SurfaceParams.isOutput = false;
2333     SurfaceParams.Boundary = RENDERHAL_SS_BOUNDARY_ORIGINAL;
2334     SurfaceParams.bWidth16Align = false;
2335     SurfaceParams.MemObjCtl = pHdrState->SurfMemObjCtl.CoeffSurfMemObjCtl;
2336     iBTentry = VPHAL_HDR_BTINDEX_COEFF_G9;
2337 
2338     if (!Mos_ResourceIsNull(&pSurfaceTemp->OsResource))
2339     {
2340         VPHAL_RENDER_CHK_STATUS(VpHal_CommonSetSurfaceForHwAccess(
2341             pRenderHal,
2342             pSurfaceTemp,
2343             pRenderHalSurfaceTemp,
2344             &SurfaceParams,
2345             pRenderData->iBindingTable,
2346             iBTentry,
2347             false));
2348     }
2349     else
2350     {
2351         VPHAL_RENDER_ASSERTMESSAGE("Null resource found");
2352         eStatus = MOS_STATUS_NULL_POINTER;
2353         goto finish;
2354     }
2355 
2356     eStatus = MOS_STATUS_SUCCESS;
2357 
2358 finish:
2359     return eStatus;
2360 }
2361 
2362 //!
2363 //! \brief    Set the Sampler States
2364 //! \details  Set the Sampler States
2365 //! \param    VPHAL_HDR_PHASE pHdrState
2366 //!           [in] pointer to HDR State
2367 //! \param    PVPHAL_HDR_RENDER_DATA
2368 //!           [in] HDR render data
2369 //! \return   MOS_STATUS
2370 //!           MOS_STATUS_SUCCESS if successful, otherwise failed
2371 //!
VpHal_HdrSetSamplerStates_g9(PVPHAL_HDR_STATE pHdrState,PVPHAL_HDR_RENDER_DATA pRenderData)2372 MOS_STATUS VpHal_HdrSetSamplerStates_g9 (
2373     PVPHAL_HDR_STATE            pHdrState,
2374     PVPHAL_HDR_RENDER_DATA      pRenderData)
2375 {
2376     MOS_STATUS                  eStatus             = MOS_STATUS_SUCCESS;
2377     PRENDERHAL_INTERFACE        pRenderHal          = nullptr;
2378     PMHW_SAMPLER_STATE_PARAM    pSamplerStateParams = nullptr;
2379     uint32_t                    i                   = 0;
2380 
2381     VPHAL_PUBLIC_CHK_NULL(pHdrState);
2382     VPHAL_PUBLIC_CHK_NULL(pRenderData);
2383 
2384     pRenderHal = pHdrState->pRenderHal;
2385     VPHAL_PUBLIC_CHK_NULL(pRenderHal);
2386 
2387     for (i = 0; i < VPHAL_HDR_SAMPLER_STATE_NUM; i++)
2388     {
2389         pSamplerStateParams = &pRenderData->SamplerStateParams[i];
2390 
2391         switch (i)
2392         {
2393         case VPHAL_HDR_SAMPLER_STATE_3D_NEAREST_INDEX_G9:
2394             pSamplerStateParams->bInUse = true;
2395             pSamplerStateParams->SamplerType = MHW_SAMPLER_TYPE_3D;
2396             pSamplerStateParams->Unorm.SamplerFilterMode = MHW_SAMPLER_FILTER_NEAREST;
2397             pSamplerStateParams->Unorm.AddressU = MHW_GFX3DSTATE_TEXCOORDMODE_CLAMP;
2398             pSamplerStateParams->Unorm.AddressV = MHW_GFX3DSTATE_TEXCOORDMODE_CLAMP;
2399             pSamplerStateParams->Unorm.AddressW = MHW_GFX3DSTATE_TEXCOORDMODE_CLAMP;
2400             break;
2401         case VPHAL_HDR_SAMPLER_STATE_3D_BILINEAR_INDEX_G9:
2402             pSamplerStateParams->bInUse = true;
2403             pSamplerStateParams->SamplerType = MHW_SAMPLER_TYPE_3D;
2404             pSamplerStateParams->Unorm.SamplerFilterMode = MHW_SAMPLER_FILTER_BILINEAR;
2405             pSamplerStateParams->Unorm.AddressU = MHW_GFX3DSTATE_TEXCOORDMODE_CLAMP;
2406             pSamplerStateParams->Unorm.AddressV = MHW_GFX3DSTATE_TEXCOORDMODE_CLAMP;
2407             pSamplerStateParams->Unorm.AddressW = MHW_GFX3DSTATE_TEXCOORDMODE_CLAMP;
2408             break;
2409         case VPHAL_HDR_SAMPLER_STATE_AVS_NEAREST_INDEX_G9:
2410         case VPHAL_HDR_SAMPLER_STATE_AVS_POLYPHASE_INDEX_G9:
2411             pSamplerStateParams->bInUse        = pHdrState->bNeed3DSampler? false: true;
2412             pSamplerStateParams->SamplerType   = MHW_SAMPLER_TYPE_AVS;
2413             pSamplerStateParams->Avs.bHdcDwEnable  = true;
2414             pSamplerStateParams->Avs.b8TapAdaptiveEnable = false;
2415             pSamplerStateParams->Avs.bEnableAVS         = true;
2416             pSamplerStateParams->Avs.WeakEdgeThr        = DETAIL_WEAK_EDGE_THRESHOLD;
2417             pSamplerStateParams->Avs.StrongEdgeThr      = DETAIL_STRONG_EDGE_THRESHOLD;
2418             pSamplerStateParams->Avs.StrongEdgeWght     = DETAIL_STRONG_EDGE_WEIGHT;
2419             pSamplerStateParams->Avs.RegularWght        = DETAIL_REGULAR_EDGE_WEIGHT;
2420             pSamplerStateParams->Avs.NonEdgeWght        = DETAIL_NON_EDGE_WEIGHT;
2421 
2422             if (pHdrState->pSrcSurf[0]             &&
2423                 pHdrState->pSrcSurf[0]->pIEFParams &&
2424                 pRenderData->pIEFParams            &&
2425                 pRenderData->pIEFParams->bEnabled)
2426             {
2427                 pHdrState->pfnSetIefStates(pHdrState, pRenderData, pSamplerStateParams);
2428             }
2429 
2430             if (i == VPHAL_HDR_SAMPLER_STATE_AVS_NEAREST_INDEX_G9)
2431             {
2432                 pSamplerStateParams->Unorm.SamplerFilterMode      = MHW_SAMPLER_FILTER_NEAREST;
2433                 pSamplerStateParams->Avs.pMhwSamplerAvsTableParam = &pHdrState->mhwSamplerAvsTableParam[0];
2434 
2435                 pHdrState->pfnSetSamplerAvsTable(
2436                     pRenderHal,
2437                     pSamplerStateParams,
2438                     pRenderData->pAVSParameters[0],
2439                     pRenderData->PrimaryLayerFormat,
2440                     1.0f,
2441                     1.0f,
2442                     CHROMA_SITING_HORZ_LEFT | CHROMA_SITING_VERT_TOP);
2443             }
2444 
2445             if (i == VPHAL_HDR_SAMPLER_STATE_AVS_POLYPHASE_INDEX_G9)
2446             {
2447                 pSamplerStateParams->Avs.pMhwSamplerAvsTableParam = &pHdrState->mhwSamplerAvsTableParam[0];
2448 
2449                 pHdrState->pfnSetSamplerAvsTable(
2450                     pRenderHal,
2451                     pSamplerStateParams,
2452                     pRenderData->pAVSParameters[1],
2453                     pRenderData->PrimaryLayerFormat,
2454                     pRenderData->fPrimaryLayerScaleX,
2455                     pRenderData->fPrimaryLayerScaleY,
2456                     CHROMA_SITING_HORZ_LEFT | CHROMA_SITING_VERT_TOP);
2457             }
2458         default:
2459             break;
2460         }
2461     }
2462 
2463     eStatus = pRenderHal->pfnSetSamplerStates(
2464         pRenderHal,
2465         pRenderData->iMediaID,
2466         &pRenderData->SamplerStateParams[0],
2467         VPHAL_HDR_SAMPLER_STATE_NUM);
2468 
2469 finish:
2470     return eStatus;
2471 }
2472 
2473 //!
2474 //! \brief    Setup HDR CURBE data
2475 //! \details  Setup HDR CURBE data
2476 //! \param    PVPHAL_HDR_STATE pHdrState
2477 //!           [in] Poniter to HDR state
2478 //! \param    PVPHAL_HDR_RENDER_DATA pRenderData
2479 //!           [in] Poniter to HDR render data
2480 //! \param    int32_t* piCurbeOffsetOut
2481 //!           [Out] Curbe offset
2482 //! \return   MOS_STATUS
2483 //!           MOS_STATUS_SUCCESS if successful, otherwise
2484 //!
VpHal_HdrLoadStaticData_g9(PVPHAL_HDR_STATE pHdrState,PVPHAL_HDR_RENDER_DATA pRenderData,int32_t * piCurbeOffsetOut)2485 MOS_STATUS VpHal_HdrLoadStaticData_g9(
2486     PVPHAL_HDR_STATE            pHdrState,
2487     PVPHAL_HDR_RENDER_DATA      pRenderData,
2488     int32_t*                    piCurbeOffsetOut)
2489 {
2490     MOS_STATUS                      eStatus             = MOS_STATUS_SUCCESS;
2491     MEDIA_WALKER_HDR_STATIC_DATA_G9 HDRStatic           = g_cInit_MEDIA_STATIC_HDR_g9;
2492     PRENDERHAL_INTERFACE            pRenderHal          = nullptr;
2493     PVPHAL_SURFACE                  pSource             = nullptr;
2494     VPHAL_HDR_FORMAT_DESCRIPTOR_G9  FormatDescriptor    = VPHAL_HDR_FORMAT_DESCRIPTOR_UNKNOW_G9;
2495     VPHAL_HDR_ROTATION_G9           HdrRotation         = VPHAL_HDR_LAYER_ROTATION_0_G9;
2496     VPHAL_HDR_TWO_LAYER_OPTION_G9   HdrTwoLayerOp       = VPHAL_HDR_TWO_LAYER_OPTION_SBLEND_G9;
2497     uint32_t                        ChromaSiting        = 0;
2498     bool                            bChannelSwap        = false;
2499     bool                            bBypassIEF          = true;
2500     bool                            b3dLut              = false;
2501     uint32_t                        uiSamplerStateIndex = 0;
2502     uint32_t                        uiSamplerStateIndex2= 0;
2503     uint16_t                        wAlpha              = 0;
2504     uint32_t                        i                   = 0;
2505     uint32_t                        dwDestRectWidth     = 0;
2506     uint32_t                        dwDestRectHeight    = 0;  // Target rectangle Width Height
2507 
2508     float                           fScaleX = 0.0f, fScaleY = 0.0f;         // x,y scaling factor
2509     float                           fStepX = 0.0f, fStepY = 0.0f;           // x,y scaling steps
2510     float                           fOriginX = 0.0f, fOriginY = 0.0f;       // x,y layer origin
2511     float                           fShiftX = 0.0f, fShiftY = 0.0f;         // x,y shift
2512 
2513     VPHAL_RENDER_CHK_NULL(pHdrState);
2514     VPHAL_RENDER_CHK_NULL(pHdrState->pRenderHal);
2515     VPHAL_RENDER_CHK_NULL(pRenderData);
2516     VPHAL_RENDER_CHK_NULL(piCurbeOffsetOut);
2517 
2518     pRenderHal    = pHdrState->pRenderHal;
2519     HdrTwoLayerOp = VPHAL_HDR_TWO_LAYER_OPTION_SBLEND_G9;
2520     HdrRotation   = VPHAL_HDR_LAYER_ROTATION_0_G9;
2521     wAlpha        = 0x0ff;
2522     uiSamplerStateIndex = uiSamplerStateIndex2 = 0;
2523 
2524     for (i = 0; i < pHdrState->uSourceCount; i++)
2525     {
2526         if (i >= VPHAL_MAX_HDR_INPUT_LAYER)
2527         {
2528             eStatus = MOS_STATUS_INVALID_PARAMETER;
2529             goto finish;
2530         }
2531 
2532         pSource = pHdrState->pSrcSurf[i];
2533         VPHAL_RENDER_CHK_NULL(pSource);
2534 
2535         bChannelSwap  = false;
2536         bBypassIEF    = true;
2537 
2538         fShiftX = 0;
2539         fShiftY = 0;
2540 
2541         // Source rectangle is pre-rotated, destination rectangle is post-rotated.
2542         if (pSource->Rotation == VPHAL_ROTATION_IDENTITY    ||
2543             pSource->Rotation == VPHAL_ROTATION_180         ||
2544             pSource->Rotation == VPHAL_MIRROR_HORIZONTAL    ||
2545             pSource->Rotation == VPHAL_MIRROR_VERTICAL)
2546         {
2547             fScaleX      = (float)(pSource->rcDst.right  - pSource->rcDst.left) /
2548                            (float)(pSource->rcSrc.right  - pSource->rcSrc.left);
2549             fScaleY      = (float)(pSource->rcDst.bottom - pSource->rcDst.top) /
2550                            (float)(pSource->rcSrc.bottom - pSource->rcSrc.top);
2551         }
2552         else
2553         {
2554             // VPHAL_ROTATION_90 || VPHAL_ROTATION_270 ||
2555             // VPHAL_ROTATE_90_MIRROR_HORIZONTAL || VPHAL_ROTATE_90_MIRROR_VERTICAL
2556             fScaleX      = (float)(pSource->rcDst.right  - pSource->rcDst.left) /
2557                            (float)(pSource->rcSrc.bottom - pSource->rcSrc.top);
2558             fScaleY      = (float)(pSource->rcDst.bottom - pSource->rcDst.top) /
2559                            (float)(pSource->rcSrc.right  - pSource->rcSrc.left);
2560         }
2561 
2562         if (fScaleX == 1.0f && fScaleY == 1.0f && pSource->ScalingMode == VPHAL_SCALING_BILINEAR)
2563         {
2564             pSource->ScalingMode = VPHAL_SCALING_NEAREST;
2565         }
2566 
2567         if (pSource->ScalingMode == VPHAL_SCALING_AVS)
2568         {
2569             uiSamplerStateIndex = VPHAL_HDR_AVS_SAMPLER_STATE_ADAPTIVE;
2570 
2571             if (pSource->Format == Format_P010 ||
2572                 pSource->Format == Format_P016)
2573             {
2574                 uiSamplerStateIndex2 = VPHAL_HDR_AVS_SAMPLER_STATE_ADAPTIVE;
2575             }
2576         }
2577         else if (pSource->ScalingMode == VPHAL_SCALING_BILINEAR)
2578         {
2579             uiSamplerStateIndex = VPHAL_HDR_3D_SAMPLER_STATE_BILINEAR;
2580 
2581             if (pSource->Format == Format_P010 ||
2582                 pSource->Format == Format_P016)
2583             {
2584                 uiSamplerStateIndex2 = VPHAL_HDR_3D_SAMPLER_STATE_BILINEAR;
2585             }
2586 
2587             fShiftX = VPHAL_HW_LINEAR_SHIFT;
2588             fShiftY = VPHAL_HW_LINEAR_SHIFT;
2589         }
2590         else
2591         {
2592             uiSamplerStateIndex = VPHAL_HDR_3D_SAMPLER_STATE_NEAREST;
2593 
2594             if (pSource->Format == Format_P010 ||
2595                 pSource->Format == Format_P016)
2596             {
2597                 uiSamplerStateIndex2 = VPHAL_HDR_3D_SAMPLER_STATE_BILINEAR;
2598             }
2599 
2600             fShiftX = VPHAL_HW_LINEAR_SHIFT;
2601             fShiftY = VPHAL_HW_LINEAR_SHIFT;
2602         }
2603 
2604         // Normalize source co-ordinates using the width and height programmed
2605         // in surface state. step X, Y pre-rotated
2606         // Source rectangle is pre-rotated, destination rectangle is post-rotated.
2607         if (pSource->Rotation == VPHAL_ROTATION_IDENTITY    ||
2608             pSource->Rotation == VPHAL_ROTATION_180         ||
2609             pSource->Rotation == VPHAL_MIRROR_HORIZONTAL    ||
2610             pSource->Rotation == VPHAL_MIRROR_VERTICAL)
2611         {
2612             fStepX = ((pSource->rcSrc.right - pSource->rcSrc.left) * 1.0f) /
2613                       ((pSource->rcDst.right - pSource->rcDst.left) > 0 ?
2614                        (pSource->rcDst.right - pSource->rcDst.left) : 1);
2615             fStepY = ((float)(pSource->rcSrc.bottom - pSource->rcSrc.top)) /
2616                       ((pSource->rcDst.bottom - pSource->rcDst.top) > 0 ?
2617                        (float)(pSource->rcDst.bottom - pSource->rcDst.top) : 1.0f);
2618         }
2619         else
2620         {
2621             // VPHAL_ROTATION_90 || VPHAL_ROTATION_270 ||
2622             // VPHAL_ROTATE_90_MIRROR_HORIZONTAL || VPHAL_ROTATE_90_MIRROR_VERTICAL
2623             fStepX = ((pSource->rcSrc.right - pSource->rcSrc.left) * 1.0f) /
2624                       ((pSource->rcDst.bottom - pSource->rcDst.top) > 0 ?
2625                        (pSource->rcDst.bottom - pSource->rcDst.top) : 1);
2626             fStepY = ((float)(pSource->rcSrc.bottom - pSource->rcSrc.top)) /
2627                       ((pSource->rcDst.right - pSource->rcDst.left) > 0 ?
2628                        (float)(pSource->rcDst.right - pSource->rcDst.left) : 1.0f);
2629         }
2630 
2631         dwDestRectWidth  = pHdrState->pTargetSurf[0]->dwWidth;
2632         dwDestRectHeight = pHdrState->pTargetSurf[0]->dwHeight;
2633 
2634         switch (pSource->Rotation)
2635         {
2636             case VPHAL_ROTATION_IDENTITY:
2637                 // Coordinate adjustment for render target coordinates (0,0)
2638                 fShiftX  -= pSource->rcDst.left;
2639                 fShiftY  -= pSource->rcDst.top;
2640                 break;
2641             case VPHAL_ROTATION_90:
2642                 // Coordinate adjustment for 90 degree rotation
2643                 fShiftX  -= (float)pSource->rcDst.top;
2644                 fShiftY  -= (float)dwDestRectWidth -
2645                             (float)(pSource->rcSrc.bottom - pSource->rcSrc.top) * fScaleX -
2646                             (float)pSource->rcDst.left;
2647                 break;
2648             case VPHAL_ROTATION_180:
2649                 // Coordinate adjustment for 180 degree rotation
2650                 fShiftX  -= (float)dwDestRectWidth -
2651                             (float)(pSource->rcSrc.right - pSource->rcSrc.left) * fScaleX -
2652                             (float)pSource->rcDst.left;
2653                 fShiftY  -= (float)dwDestRectHeight -
2654                             (float)(pSource->rcSrc.bottom - pSource->rcSrc.top) * fScaleY -
2655                             (float)pSource->rcDst.top;
2656                 break;
2657             case VPHAL_ROTATION_270:
2658                 // Coordinate adjustment for 270 degree rotation
2659                 fShiftX  -= (float)dwDestRectHeight -
2660                             (float)(pSource->rcSrc.right - pSource->rcSrc.left) * fScaleY -
2661                             (float)pSource->rcDst.top;
2662                 fShiftY  -= (float)pSource->rcDst.left;
2663                 break;
2664             case VPHAL_MIRROR_HORIZONTAL:
2665                 // Coordinate adjustment for horizontal mirroring
2666                 fShiftX  -= (float)dwDestRectWidth -
2667                             (float)(pSource->rcSrc.right - pSource->rcSrc.left) * fScaleX -
2668                             (float)pSource->rcDst.left;
2669                 fShiftY  -= pSource->rcDst.top;
2670                 break;
2671             case VPHAL_MIRROR_VERTICAL:
2672                 // Coordinate adjustment for vertical mirroring
2673                 fShiftX  -= pSource->rcDst.left;
2674                 fShiftY  -= (float)dwDestRectHeight -
2675                             (float)(pSource->rcSrc.bottom - pSource->rcSrc.top) * fScaleY -
2676                             (float)pSource->rcDst.top;
2677                 break;
2678             case VPHAL_ROTATE_90_MIRROR_HORIZONTAL:
2679                 // Coordinate adjustment for rotating 90 and horizontal mirroring
2680                 fShiftX  -= (float)pSource->rcDst.top;
2681                 fShiftY  -= (float)pSource->rcDst.left;
2682                 break;
2683             case VPHAL_ROTATE_90_MIRROR_VERTICAL:
2684             default:
2685                 // Coordinate adjustment for rotating 90 and vertical mirroring
2686                 fShiftX  -= (float)dwDestRectHeight -
2687                             (float)(pSource->rcSrc.right - pSource->rcSrc.left) * fScaleY -
2688                             (float)pSource->rcDst.top;
2689                 fShiftY  -= (float)dwDestRectWidth -
2690                             (float)(pSource->rcSrc.bottom - pSource->rcSrc.top) * fScaleX -
2691                             (float)pSource->rcDst.left;
2692                 break;
2693         } // switch
2694 
2695         fOriginX = ((float) pSource->rcSrc.left + fShiftX * fStepX) / (float)MOS_MIN(pSource->dwWidth, (uint32_t)pSource->rcSrc.right);
2696         fOriginY = ((float) pSource->rcSrc.top + fShiftY * fStepY) / (float)MOS_MIN(pSource->dwHeight, (uint32_t)pSource->rcSrc.bottom);
2697 
2698         fStepX /= MOS_MIN(pSource->dwWidth, (uint32_t)pSource->rcSrc.right);
2699         fStepY /= MOS_MIN(pSource->dwHeight, (uint32_t)pSource->rcSrc.bottom);
2700 
2701         FormatDescriptor = VpHal_HdrGetFormatDescriptor_g9(pSource->Format);
2702 
2703         if (FormatDescriptor == VPHAL_HDR_FORMAT_DESCRIPTOR_UNKNOW_G9)
2704         {
2705             VPHAL_RENDER_ASSERTMESSAGE("Unsupported hdr input format");
2706             eStatus = MOS_STATUS_INVALID_PARAMETER;
2707             goto finish;
2708         }
2709 
2710         // Chroma siting setting in curbe data will only take effect in 1x scaling case when 3D sampler is being used
2711         // For other cases, Chroma siting will be performed by AVS coefficients, and the here will be ignored by kernel
2712         ChromaSiting = VpHal_HdrGetHdrChromaSiting_g9(pSource->ChromaSiting);
2713 
2714         if (pSource->Format == Format_B10G10R10A2 ||
2715             pSource->Format == Format_A8R8G8B8    ||
2716             pSource->Format == Format_X8R8G8B8    ||
2717             pSource->Format == Format_A16R16G16B16F)
2718         {
2719             bChannelSwap = true;
2720         }
2721 
2722         if (pSource->pIEFParams)
2723         {
2724             if (pSource->pIEFParams->bEnabled)
2725             {
2726                 bBypassIEF = false;
2727             }
2728         }
2729 
2730         HdrRotation = VpHal_HdrGetHdrRotation_g9(pSource->Rotation);
2731 
2732         b3dLut = (pHdrState->LUTMode[i] == VPHAL_HDR_LUT_MODE_3D ? true : false);
2733 
2734         if (pSource->SurfType == SURF_IN_PRIMARY)
2735         {
2736             if (b3dLut)
2737             {
2738                 pHdrState->Reporting.GetFeatures().hdrMode = (VPHAL_HDR_MODE)(((uint32_t)pHdrState->Reporting.GetFeatures().hdrMode) | VPHAL_HDR_MODE_3DLUT_MASK);
2739             }
2740         }
2741 
2742         switch (i)
2743         {
2744         case 0:
2745             HDRStatic.DW0.HorizontalFrameOriginLayer0       = fOriginX;
2746             HDRStatic.DW8.VerticalFrameOriginLayer0         = fOriginY;
2747             HDRStatic.DW16.HorizontalScalingStepRatioLayer0 = fStepX;
2748             HDRStatic.DW24.VerticalScalingStepRatioLayer0   = fStepY;
2749             HDRStatic.DW32.LeftCoordinateRectangleLayer0    = pSource->rcDst.left;
2750             HDRStatic.DW32.TopCoordinateRectangleLayer0     = pSource->rcDst.top;
2751             HDRStatic.DW40.RightCoordinateRectangleLayer0   = pSource->rcDst.right - 1;
2752             HDRStatic.DW40.BottomCoordinateRectangleLayer0  = pSource->rcDst.bottom - 1;
2753             HDRStatic.DW48.FormatDescriptorLayer0           = FormatDescriptor;
2754             HDRStatic.DW48.ChromaSittingLocationLayer0      = ChromaSiting;
2755             HDRStatic.DW48.ChannelSwapEnablingFlagLayer0    = bChannelSwap;
2756             HDRStatic.DW48.IEFBypassEnablingFlagLayer0      = bBypassIEF;
2757             HDRStatic.DW48.RotationAngleMirrorDirectionLayer0 = HdrRotation;
2758             HDRStatic.DW48.SamplerIndexFirstPlaneLayer0       = uiSamplerStateIndex;
2759             if (pSource->Format == Format_P010 ||
2760                 pSource->Format == Format_P016)
2761             {
2762                 HDRStatic.DW48.SamplerIndexSecondThirdPlaneLayer0 = uiSamplerStateIndex2;
2763             }
2764             HDRStatic.DW48.CCMExtensionEnablingFlagLayer0     = pHdrState->StageEnableFlags[i].CCMExt1Enable ||
2765                                                                 pHdrState->StageEnableFlags[i].CCMExt2Enable;
2766             HDRStatic.DW48.ToneMappingEnablingFlagLayer0      = pHdrState->StageEnableFlags[i].PWLFEnable;
2767             HDRStatic.DW48.PriorCSCEnablingFlagLayer0         = pHdrState->StageEnableFlags[i].PriorCSCEnable;
2768             HDRStatic.DW48.EOTF1DLUTEnablingFlagLayer0        = pHdrState->StageEnableFlags[i].EOTFEnable;
2769             HDRStatic.DW48.CCMEnablingFlagLayer0              = pHdrState->StageEnableFlags[i].CCMEnable;
2770             HDRStatic.DW48.OETF1DLUTEnablingFlagLayer0        = pHdrState->StageEnableFlags[i].OETFEnable;
2771             HDRStatic.DW48.PostCSCEnablingFlagLayer0          = pHdrState->StageEnableFlags[i].PostCSCEnable;
2772             HDRStatic.DW48.Enabling3DLUTFlagLayer0            = b3dLut;
2773             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND_G9 ||
2774                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND_G9 ||
2775                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND_G9)
2776             {
2777                 HDRStatic.DW56.ConstantBlendingAlphaFillColorLayer0 = wAlpha;
2778             }
2779             HDRStatic.DW58.TwoLayerOperationLayer0              = VPHAL_HDR_TWO_LAYER_OPTION_COMP_G9;
2780             if (pSource->SurfType == SURF_IN_PRIMARY                &&
2781                 pSource->pBlendingParams                            &&
2782                 pSource->pBlendingParams->BlendType == BLEND_SOURCE &&
2783                 (IS_RGB_CSPACE(pSource->ColorSpace) || IS_COLOR_SPACE_BT2020_RGB(pSource->ColorSpace)))
2784             {
2785                 // For PDVD alpha blending issue:
2786                 // If first frame is sRGB/stRGB/BT2020RGB format delivered as primary layer
2787                 // (which means main video content is in the first layer)
2788                 // and blend-type set as source blending,
2789                 // do source blending w/ bg, instead of setting as composite.
2790                 HDRStatic.DW58.TwoLayerOperationLayer0 = VPHAL_HDR_TWO_LAYER_OPTION_SBLEND_G9;
2791             }
2792             break;
2793         case 1:
2794             HDRStatic.DW1.HorizontalFrameOriginLayer1       = fOriginX;
2795             HDRStatic.DW9.VerticalFrameOriginLayer1         = fOriginY;
2796             HDRStatic.DW17.HorizontalScalingStepRatioLayer1 = fStepX;
2797             HDRStatic.DW25.VerticalScalingStepRatioLayer1   = fStepY;
2798             HDRStatic.DW33.LeftCoordinateRectangleLayer1    = pSource->rcDst.left;
2799             HDRStatic.DW33.TopCoordinateRectangleLayer1     = pSource->rcDst.top;
2800             HDRStatic.DW41.RightCoordinateRectangleLayer1   = pSource->rcDst.right - 1;
2801             HDRStatic.DW41.BottomCoordinateRectangleLayer1  = pSource->rcDst.bottom - 1;
2802             HDRStatic.DW49.FormatDescriptorLayer1           = FormatDescriptor;
2803             HDRStatic.DW49.ChromaSittingLocationLayer1      = ChromaSiting;
2804             HDRStatic.DW49.ChannelSwapEnablingFlagLayer1    = bChannelSwap;
2805             HDRStatic.DW49.IEFBypassEnablingFlagLayer1      = bBypassIEF;
2806             HDRStatic.DW49.RotationAngleMirrorDirectionLayer1 = HdrRotation;
2807             HDRStatic.DW49.SamplerIndexFirstPlaneLayer1       = uiSamplerStateIndex;
2808             if (pSource->Format == Format_P010 ||
2809                 pSource->Format == Format_P016)
2810             {
2811                 HDRStatic.DW49.SamplerIndexSecondThirdPlaneLayer1 = uiSamplerStateIndex2;
2812             }
2813             HDRStatic.DW49.CCMExtensionEnablingFlagLayer1     = pHdrState->StageEnableFlags[i].CCMExt1Enable ||
2814                                                                 pHdrState->StageEnableFlags[i].CCMExt2Enable;
2815             HDRStatic.DW49.ToneMappingEnablingFlagLayer1      = pHdrState->StageEnableFlags[i].PWLFEnable;
2816             HDRStatic.DW49.PriorCSCEnablingFlagLayer1         = pHdrState->StageEnableFlags[i].PriorCSCEnable;
2817             HDRStatic.DW49.EOTF1DLUTEnablingFlagLayer1        = pHdrState->StageEnableFlags[i].EOTFEnable;
2818             HDRStatic.DW49.CCMEnablingFlagLayer1              = pHdrState->StageEnableFlags[i].CCMEnable;
2819             HDRStatic.DW49.OETF1DLUTEnablingFlagLayer1        = pHdrState->StageEnableFlags[i].OETFEnable;
2820             HDRStatic.DW49.PostCSCEnablingFlagLayer1          = pHdrState->StageEnableFlags[i].PostCSCEnable;
2821             HDRStatic.DW49.Enabling3DLUTFlagLayer1            = b3dLut;
2822             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND_G9 ||
2823                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND_G9 ||
2824                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND_G9)
2825             {
2826                 HDRStatic.DW56.ConstantBlendingAlphaFillColorLayer1 = wAlpha;
2827             }
2828             HDRStatic.DW58.TwoLayerOperationLayer1              = HdrTwoLayerOp;
2829             break;
2830         case 2:
2831             HDRStatic.DW2.HorizontalFrameOriginLayer2       = fOriginX;
2832             HDRStatic.DW10.VerticalFrameOriginLayer2        = fOriginY;
2833             HDRStatic.DW18.HorizontalScalingStepRatioLayer2 = fStepX;
2834             HDRStatic.DW26.VerticalScalingStepRatioLayer2   = fStepY;
2835             HDRStatic.DW34.LeftCoordinateRectangleLayer2    = pSource->rcDst.left;
2836             HDRStatic.DW34.TopCoordinateRectangleLayer2     = pSource->rcDst.top;
2837             HDRStatic.DW42.RightCoordinateRectangleLayer2   = pSource->rcDst.right - 1;
2838             HDRStatic.DW42.BottomCoordinateRectangleLayer2  = pSource->rcDst.bottom - 1;
2839             HDRStatic.DW50.FormatDescriptorLayer2           = FormatDescriptor;
2840             HDRStatic.DW50.ChromaSittingLocationLayer2      = ChromaSiting;
2841             HDRStatic.DW50.ChannelSwapEnablingFlagLayer2    = bChannelSwap;
2842             HDRStatic.DW50.IEFBypassEnablingFlagLayer2      = bBypassIEF;
2843             HDRStatic.DW50.RotationAngleMirrorDirectionLayer2 = HdrRotation;
2844             HDRStatic.DW50.SamplerIndexFirstPlaneLayer2       = uiSamplerStateIndex;
2845             if (pSource->Format == Format_P010 ||
2846                 pSource->Format == Format_P016)
2847             {
2848                 HDRStatic.DW50.SamplerIndexSecondThirdPlaneLayer2 = uiSamplerStateIndex2;
2849             }
2850             HDRStatic.DW50.CCMExtensionEnablingFlagLayer2     = pHdrState->StageEnableFlags[i].CCMExt1Enable ||
2851                                                                 pHdrState->StageEnableFlags[i].CCMExt2Enable;
2852             HDRStatic.DW50.ToneMappingEnablingFlagLayer2      = pHdrState->StageEnableFlags[i].PWLFEnable;
2853             HDRStatic.DW50.PriorCSCEnablingFlagLayer2         = pHdrState->StageEnableFlags[i].PriorCSCEnable;
2854             HDRStatic.DW50.EOTF1DLUTEnablingFlagLayer2        = pHdrState->StageEnableFlags[i].EOTFEnable;
2855             HDRStatic.DW50.CCMEnablingFlagLayer2              = pHdrState->StageEnableFlags[i].CCMEnable;
2856             HDRStatic.DW50.OETF1DLUTEnablingFlagLayer2        = pHdrState->StageEnableFlags[i].OETFEnable;
2857             HDRStatic.DW50.PostCSCEnablingFlagLayer2          = pHdrState->StageEnableFlags[i].PostCSCEnable;
2858             HDRStatic.DW50.Enabling3DLUTFlagLayer2            = b3dLut;
2859             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND_G9 ||
2860                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND_G9 ||
2861                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND_G9)
2862             {
2863                 HDRStatic.DW56.ConstantBlendingAlphaFillColorLayer2 = wAlpha;
2864             }
2865             HDRStatic.DW58.TwoLayerOperationLayer2              = HdrTwoLayerOp;
2866             break;
2867         case 3:
2868             HDRStatic.DW3.HorizontalFrameOriginLayer3       = fOriginX;
2869             HDRStatic.DW11.VerticalFrameOriginLayer3        = fOriginY;
2870             HDRStatic.DW19.HorizontalScalingStepRatioLayer3 = fStepX;
2871             HDRStatic.DW27.VerticalScalingStepRatioLayer3   = fStepY;
2872             HDRStatic.DW35.LeftCoordinateRectangleLayer3    = pSource->rcDst.left;
2873             HDRStatic.DW35.TopCoordinateRectangleLayer3     = pSource->rcDst.top;
2874             HDRStatic.DW43.RightCoordinateRectangleLayer3   = pSource->rcDst.right - 1;
2875             HDRStatic.DW43.BottomCoordinateRectangleLayer3  = pSource->rcDst.bottom - 1;
2876             HDRStatic.DW51.FormatDescriptorLayer3           = FormatDescriptor;
2877             HDRStatic.DW51.ChromaSittingLocationLayer3      = ChromaSiting;
2878             HDRStatic.DW51.ChannelSwapEnablingFlagLayer3    = bChannelSwap;
2879             HDRStatic.DW51.IEFBypassEnablingFlagLayer3      = bBypassIEF;
2880             HDRStatic.DW51.RotationAngleMirrorDirectionLayer3 = HdrRotation;
2881             HDRStatic.DW51.SamplerIndexFirstPlaneLayer3       = uiSamplerStateIndex;
2882             if (pSource->Format == Format_P010 ||
2883                 pSource->Format == Format_P016)
2884             {
2885                 HDRStatic.DW51.SamplerIndexSecondThirdPlaneLayer3 = uiSamplerStateIndex2;
2886             }
2887             HDRStatic.DW51.CCMExtensionEnablingFlagLayer3     = pHdrState->StageEnableFlags[i].CCMExt1Enable ||
2888                                                                 pHdrState->StageEnableFlags[i].CCMExt2Enable;
2889             HDRStatic.DW51.ToneMappingEnablingFlagLayer3      = pHdrState->StageEnableFlags[i].PWLFEnable;
2890             HDRStatic.DW51.PriorCSCEnablingFlagLayer3         = pHdrState->StageEnableFlags[i].PriorCSCEnable;
2891             HDRStatic.DW51.EOTF1DLUTEnablingFlagLayer3        = pHdrState->StageEnableFlags[i].EOTFEnable;
2892             HDRStatic.DW51.CCMEnablingFlagLayer3              = pHdrState->StageEnableFlags[i].CCMEnable;
2893             HDRStatic.DW51.OETF1DLUTEnablingFlagLayer3        = pHdrState->StageEnableFlags[i].OETFEnable;
2894             HDRStatic.DW51.PostCSCEnablingFlagLayer3          = pHdrState->StageEnableFlags[i].PostCSCEnable;
2895             HDRStatic.DW51.Enabling3DLUTFlagLayer3            = b3dLut;
2896             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND_G9 ||
2897                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND_G9 ||
2898                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND_G9)
2899             {
2900                 HDRStatic.DW56.ConstantBlendingAlphaFillColorLayer3 = wAlpha;
2901             }
2902             HDRStatic.DW58.TwoLayerOperationLayer3              = HdrTwoLayerOp;
2903             break;
2904         case 4:
2905             HDRStatic.DW4.HorizontalFrameOriginLayer4       = fOriginX;
2906             HDRStatic.DW12.VerticalFrameOriginLayer4        = fOriginY;
2907             HDRStatic.DW20.HorizontalScalingStepRatioLayer4 = fStepX;
2908             HDRStatic.DW28.VerticalScalingStepRatioLayer4   = fStepY;
2909             HDRStatic.DW36.LeftCoordinateRectangleLayer4    = pSource->rcDst.left;
2910             HDRStatic.DW36.TopCoordinateRectangleLayer4     = pSource->rcDst.top;
2911             HDRStatic.DW44.RightCoordinateRectangleLayer4   = pSource->rcDst.right - 1;
2912             HDRStatic.DW44.BottomCoordinateRectangleLayer4  = pSource->rcDst.bottom - 1;
2913             HDRStatic.DW52.FormatDescriptorLayer4           = FormatDescriptor;
2914             HDRStatic.DW52.ChromaSittingLocationLayer4      = ChromaSiting;
2915             HDRStatic.DW52.ChannelSwapEnablingFlagLayer4    = bChannelSwap;
2916             HDRStatic.DW52.IEFBypassEnablingFlagLayer4      = bBypassIEF;
2917             HDRStatic.DW52.RotationAngleMirrorDirectionLayer4 = HdrRotation;
2918             HDRStatic.DW52.SamplerIndexFirstPlaneLayer4       = uiSamplerStateIndex;
2919             if (pSource->Format == Format_P010 ||
2920                 pSource->Format == Format_P016)
2921             {
2922                 HDRStatic.DW52.SamplerIndexSecondThirdPlaneLayer4 = uiSamplerStateIndex2;
2923             }
2924             HDRStatic.DW52.CCMExtensionEnablingFlagLayer4     = pHdrState->StageEnableFlags[i].CCMExt1Enable ||
2925                                                                 pHdrState->StageEnableFlags[i].CCMExt2Enable;
2926             HDRStatic.DW52.ToneMappingEnablingFlagLayer4      = pHdrState->StageEnableFlags[i].PWLFEnable;
2927             HDRStatic.DW52.PriorCSCEnablingFlagLayer4         = pHdrState->StageEnableFlags[i].PriorCSCEnable;
2928             HDRStatic.DW52.EOTF1DLUTEnablingFlagLayer4        = pHdrState->StageEnableFlags[i].EOTFEnable;
2929             HDRStatic.DW52.CCMEnablingFlagLayer4              = pHdrState->StageEnableFlags[i].CCMEnable;
2930             HDRStatic.DW52.OETF1DLUTEnablingFlagLayer4        = pHdrState->StageEnableFlags[i].OETFEnable;
2931             HDRStatic.DW52.PostCSCEnablingFlagLayer4          = pHdrState->StageEnableFlags[i].PostCSCEnable;
2932             HDRStatic.DW52.Enabling3DLUTFlagLayer4            = b3dLut;
2933             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND_G9 ||
2934                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND_G9 ||
2935                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND_G9)
2936             {
2937                 HDRStatic.DW57.ConstantBlendingAlphaFillColorLayer4 = wAlpha;
2938             }
2939             HDRStatic.DW59.TwoLayerOperationLayer4              = HdrTwoLayerOp;
2940             break;
2941         case 5:
2942             HDRStatic.DW5.HorizontalFrameOriginLayer5       = fOriginX;
2943             HDRStatic.DW13.VerticalFrameOriginLayer5        = fOriginY;
2944             HDRStatic.DW21.HorizontalScalingStepRatioLayer5 = fStepX;
2945             HDRStatic.DW29.VerticalScalingStepRatioLayer5   = fStepY;
2946             HDRStatic.DW37.LeftCoordinateRectangleLayer5    = pSource->rcDst.left;
2947             HDRStatic.DW37.TopCoordinateRectangleLayer5     = pSource->rcDst.top;
2948             HDRStatic.DW45.RightCoordinateRectangleLayer5   = pSource->rcDst.right - 1;
2949             HDRStatic.DW45.BottomCoordinateRectangleLayer5  = pSource->rcDst.bottom - 1;
2950             HDRStatic.DW53.FormatDescriptorLayer5           = FormatDescriptor;
2951             HDRStatic.DW53.ChromaSittingLocationLayer5      = ChromaSiting;
2952             HDRStatic.DW53.ChannelSwapEnablingFlagLayer5    = bChannelSwap;
2953             HDRStatic.DW53.IEFBypassEnablingFlagLayer5      = bBypassIEF;
2954             HDRStatic.DW53.RotationAngleMirrorDirectionLayer5 = HdrRotation;
2955             HDRStatic.DW53.SamplerIndexFirstPlaneLayer5       = uiSamplerStateIndex;
2956             if (pSource->Format == Format_P010 ||
2957                 pSource->Format == Format_P016)
2958             {
2959                 HDRStatic.DW53.SamplerIndexSecondThirdPlaneLayer5 = uiSamplerStateIndex2;
2960             }
2961             HDRStatic.DW53.CCMExtensionEnablingFlagLayer5     = pHdrState->StageEnableFlags[i].CCMExt1Enable ||
2962                                                                 pHdrState->StageEnableFlags[i].CCMExt2Enable;
2963             HDRStatic.DW53.ToneMappingEnablingFlagLayer5      = pHdrState->StageEnableFlags[i].PWLFEnable;
2964             HDRStatic.DW53.PriorCSCEnablingFlagLayer5         = pHdrState->StageEnableFlags[i].PriorCSCEnable;
2965             HDRStatic.DW53.EOTF1DLUTEnablingFlagLayer5        = pHdrState->StageEnableFlags[i].EOTFEnable;
2966             HDRStatic.DW53.CCMEnablingFlagLayer5              = pHdrState->StageEnableFlags[i].CCMEnable;
2967             HDRStatic.DW53.OETF1DLUTEnablingFlagLayer5        = pHdrState->StageEnableFlags[i].OETFEnable;
2968             HDRStatic.DW53.PostCSCEnablingFlagLayer5          = pHdrState->StageEnableFlags[i].PostCSCEnable;
2969             HDRStatic.DW53.Enabling3DLUTFlagLayer5            = b3dLut;
2970             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND_G9 ||
2971                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND_G9 ||
2972                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND_G9)
2973             {
2974                 HDRStatic.DW57.ConstantBlendingAlphaFillColorLayer5 = wAlpha;
2975             }
2976             HDRStatic.DW59.TwoLayerOperationLayer5              = HdrTwoLayerOp;
2977             break;
2978         case 6:
2979             HDRStatic.DW6.HorizontalFrameOriginLayer6       = fOriginX;
2980             HDRStatic.DW14.VerticalFrameOriginLayer6        = fOriginY;
2981             HDRStatic.DW22.HorizontalScalingStepRatioLayer6 = fStepX;
2982             HDRStatic.DW30.VerticalScalingStepRatioLayer6   = fStepY;
2983             HDRStatic.DW38.LeftCoordinateRectangleLayer6    = pSource->rcDst.left;
2984             HDRStatic.DW38.TopCoordinateRectangleLayer6     = pSource->rcDst.top;
2985             HDRStatic.DW46.RightCoordinateRectangleLayer6   = pSource->rcDst.right - 1;
2986             HDRStatic.DW46.BottomCoordinateRectangleLayer6  = pSource->rcDst.bottom - 1;
2987             HDRStatic.DW54.FormatDescriptorLayer6           = FormatDescriptor;
2988             HDRStatic.DW54.ChromaSittingLocationLayer6      = ChromaSiting;
2989             HDRStatic.DW54.ChannelSwapEnablingFlagLayer6    = bChannelSwap;
2990             HDRStatic.DW54.IEFBypassEnablingFlagLayer6      = bBypassIEF;
2991             HDRStatic.DW54.RotationAngleMirrorDirectionLayer6 = HdrRotation;
2992             HDRStatic.DW54.SamplerIndexFirstPlaneLayer6       = uiSamplerStateIndex;
2993             if (pSource->Format == Format_P010 ||
2994                 pSource->Format == Format_P016)
2995             {
2996                 HDRStatic.DW54.SamplerIndexSecondThirdPlaneLayer6 = uiSamplerStateIndex2;
2997             }
2998             HDRStatic.DW54.CCMExtensionEnablingFlagLayer6     = pHdrState->StageEnableFlags[i].CCMExt1Enable ||
2999                                                                 pHdrState->StageEnableFlags[i].CCMExt2Enable;
3000             HDRStatic.DW54.ToneMappingEnablingFlagLayer6      = pHdrState->StageEnableFlags[i].PWLFEnable;
3001             HDRStatic.DW54.PriorCSCEnablingFlagLayer6         = pHdrState->StageEnableFlags[i].PriorCSCEnable;
3002             HDRStatic.DW54.EOTF1DLUTEnablingFlagLayer6        = pHdrState->StageEnableFlags[i].EOTFEnable;
3003             HDRStatic.DW54.CCMEnablingFlagLayer6              = pHdrState->StageEnableFlags[i].CCMEnable;
3004             HDRStatic.DW54.OETF1DLUTEnablingFlagLayer6        = pHdrState->StageEnableFlags[i].OETFEnable;
3005             HDRStatic.DW54.PostCSCEnablingFlagLayer6          = pHdrState->StageEnableFlags[i].PostCSCEnable;
3006             HDRStatic.DW54.Enabling3DLUTFlagLayer6            = b3dLut;
3007             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND_G9 ||
3008                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND_G9 ||
3009                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND_G9)
3010             {
3011                 HDRStatic.DW57.ConstantBlendingAlphaFillColorLayer6 = wAlpha;
3012             }
3013             HDRStatic.DW59.TwoLayerOperationLayer6              = HdrTwoLayerOp;
3014             break;
3015         case 7:
3016             HDRStatic.DW7.HorizontalFrameOriginLayer7       = fOriginX;
3017             HDRStatic.DW15.VerticalFrameOriginLayer7        = fOriginY;
3018             HDRStatic.DW23.HorizontalScalingStepRatioLayer7 = fStepX;
3019             HDRStatic.DW31.VerticalScalingStepRatioLayer7   = fStepY;
3020             HDRStatic.DW39.LeftCoordinateRectangleLayer7    = pSource->rcDst.left;
3021             HDRStatic.DW39.TopCoordinateRectangleLayer7     = pSource->rcDst.top;
3022             HDRStatic.DW47.RightCoordinateRectangleLayer7   = pSource->rcDst.right - 1;
3023             HDRStatic.DW47.BottomCoordinateRectangleLayer7  = pSource->rcDst.bottom - 1;
3024             HDRStatic.DW55.FormatDescriptorLayer7           = FormatDescriptor;
3025             HDRStatic.DW55.ChromaSittingLocationLayer7      = ChromaSiting;
3026             HDRStatic.DW55.ChannelSwapEnablingFlagLayer7    = bChannelSwap;
3027             HDRStatic.DW55.IEFBypassEnablingFlagLayer7      = bBypassIEF;
3028             HDRStatic.DW55.RotationAngleMirrorDirectionLayer7 = HdrRotation;
3029             HDRStatic.DW55.SamplerIndexFirstPlaneLayer7       = uiSamplerStateIndex;
3030             if (pSource->Format == Format_P010 ||
3031                 pSource->Format == Format_P016)
3032             {
3033                 HDRStatic.DW55.SamplerIndexSecondThirdPlaneLayer7 = uiSamplerStateIndex2;
3034             }
3035             HDRStatic.DW55.CCMExtensionEnablingFlagLayer7     = pHdrState->StageEnableFlags[i].CCMExt1Enable ||
3036                                                                 pHdrState->StageEnableFlags[i].CCMExt2Enable;
3037             HDRStatic.DW55.ToneMappingEnablingFlagLayer7      = pHdrState->StageEnableFlags[i].PWLFEnable;
3038             HDRStatic.DW55.PriorCSCEnablingFlagLayer7         = pHdrState->StageEnableFlags[i].PriorCSCEnable;
3039             HDRStatic.DW55.EOTF1DLUTEnablingFlagLayer7        = pHdrState->StageEnableFlags[i].EOTFEnable;
3040             HDRStatic.DW55.CCMEnablingFlagLayer7              = pHdrState->StageEnableFlags[i].CCMEnable;
3041             HDRStatic.DW55.OETF1DLUTEnablingFlagLayer7        = pHdrState->StageEnableFlags[i].OETFEnable;
3042             HDRStatic.DW55.PostCSCEnablingFlagLayer7          = pHdrState->StageEnableFlags[i].PostCSCEnable;
3043             HDRStatic.DW55.Enabling3DLUTFlagLayer7            = b3dLut;
3044             if (HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CBLEND_G9  ||
3045                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CSBLEND_G9 ||
3046                 HdrTwoLayerOp == VPHAL_HDR_TWO_LAYER_OPTION_CPBLEND_G9)
3047             {
3048                 HDRStatic.DW57.ConstantBlendingAlphaFillColorLayer7 = wAlpha;
3049             }
3050             HDRStatic.DW59.TwoLayerOperationLayer7              = HdrTwoLayerOp;
3051             break;
3052         default:
3053             VPHAL_RENDER_ASSERTMESSAGE("Invalid input layer number.");
3054             break;
3055         }
3056     }
3057 
3058     FormatDescriptor = VpHal_HdrGetFormatDescriptor_g9(pHdrState->pTargetSurf[0]->Format);
3059     ChromaSiting     = VpHal_HdrGetHdrChromaSiting_g9(pHdrState->pTargetSurf[0]->ChromaSiting);
3060 
3061     if (pHdrState->pTargetSurf[0]->Format == Format_B10G10R10A2 ||
3062         pHdrState->pTargetSurf[0]->Format == Format_A8R8G8B8    ||
3063         pHdrState->pTargetSurf[0]->Format == Format_X8R8G8B8    ||
3064         pHdrState->pTargetSurf[0]->Format == Format_A16R16G16B16F)
3065     {
3066         bChannelSwap = true;
3067     }
3068     else
3069     {
3070         bChannelSwap = false;
3071     }
3072 
3073     HDRStatic.DW62.DestinationWidth                 = pHdrState->pTargetSurf[0]->dwWidth;
3074     HDRStatic.DW62.DestinationHeight                = pHdrState->pTargetSurf[0]->dwHeight;
3075     HDRStatic.DW63.TotalNumberInputLayers           = pHdrState->uSourceCount;
3076 
3077     if (0 == pHdrState->uSourceCount)
3078     {
3079         HDRStatic.DW32.LeftCoordinateRectangleLayer0    = pHdrState->pTargetSurf[0]->dwWidth  + 16;
3080         HDRStatic.DW32.TopCoordinateRectangleLayer0     = pHdrState->pTargetSurf[0]->dwHeight + 16;
3081         HDRStatic.DW40.RightCoordinateRectangleLayer0   = pHdrState->pTargetSurf[0]->dwWidth  + 16;
3082         HDRStatic.DW40.BottomCoordinateRectangleLayer0  = pHdrState->pTargetSurf[0]->dwHeight + 16;
3083         HDRStatic.DW58.TwoLayerOperationLayer0          = VPHAL_HDR_TWO_LAYER_OPTION_COMP_G9;
3084     }
3085 
3086     HDRStatic.DW63.FormatDescriptorDestination        = FormatDescriptor;
3087     HDRStatic.DW63.ChromaSittingLocationDestination   = ChromaSiting;
3088     HDRStatic.DW63.ChannelSwapEnablingFlagDestination = bChannelSwap;
3089 
3090     // Set Background color (use cspace of first layer)
3091     if (pHdrState->pColorFillParams)
3092     {
3093         VPHAL_COLOR_SAMPLE_8 Src, Dst;
3094         VPHAL_CSPACE         src_cspace, dst_cspace;
3095 
3096         Src.dwValue = pHdrState->pColorFillParams->Color;
3097 
3098         // get src and dst colorspaces
3099         src_cspace = pHdrState->pColorFillParams->CSpace;
3100         dst_cspace = pHdrState->pTargetSurf[0]->ColorSpace;
3101 
3102         // Convert BG color only if not done so before. CSC is expensive!
3103         if (VpUtils::GetCscMatrixForRender8Bit(&Dst, &Src, src_cspace, dst_cspace))
3104         {
3105             HDRStatic.DW60.FixedPointFillColorRVChannel     = Dst.R << 8;
3106             HDRStatic.DW60.FixedPointFillColorGYChannel     = Dst.G << 8;
3107             HDRStatic.DW61.FixedPointFillColorBUChannel     = Dst.B << 8;
3108             HDRStatic.DW61.FixedPointFillColorAlphaChannel  = Dst.A << 8;
3109         }
3110         else
3111         {
3112             HDRStatic.DW60.FixedPointFillColorRVChannel     = Src.R << 8;
3113             HDRStatic.DW60.FixedPointFillColorGYChannel     = Src.G << 8;
3114             HDRStatic.DW61.FixedPointFillColorBUChannel     = Src.B << 8;
3115             HDRStatic.DW61.FixedPointFillColorAlphaChannel  = Src.A << 8;
3116         }
3117     }
3118 
3119     *piCurbeOffsetOut = pRenderHal->pfnLoadCurbeData(
3120         pRenderHal,
3121         pRenderData->pMediaState,
3122         &HDRStatic,
3123         sizeof(MEDIA_WALKER_HDR_STATIC_DATA_G9));
3124 
3125     if (*piCurbeOffsetOut < 0)
3126     {
3127         eStatus = MOS_STATUS_UNKNOWN;
3128         goto finish;
3129     }
3130     pRenderData->iCurbeOffset = *piCurbeOffsetOut;
3131     PrintCurbeData(&HDRStatic);
3132 finish:
3133     return eStatus;
3134 }
3135 
PrintCurbeData(MEDIA_WALKER_HDR_STATIC_DATA_G9 * pObjectStatic)3136 void PrintCurbeData(MEDIA_WALKER_HDR_STATIC_DATA_G9 *pObjectStatic)
3137 {
3138 #if (_DEBUG || _RELEASE_INTERNAL)
3139     if (pObjectStatic == nullptr)
3140     {
3141         VPHAL_RENDER_ASSERTMESSAGE("The ObjectStatic pointer is null");
3142         return;
3143     }
3144     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW0.Value = %x", pObjectStatic->DW0.Value);
3145     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer0 = %x",
3146         pObjectStatic->DW0.HorizontalFrameOriginLayer0);
3147     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW1.Value = %x", pObjectStatic->DW1.Value);
3148     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer1 = %x",
3149         pObjectStatic->DW1.HorizontalFrameOriginLayer1);
3150     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW2.Value = %x", pObjectStatic->DW2.Value);
3151     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer2 = %x",
3152         pObjectStatic->DW2.HorizontalFrameOriginLayer2);
3153     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW3.Value = %x", pObjectStatic->DW3.Value);
3154     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer3 = %x",
3155         pObjectStatic->DW3.HorizontalFrameOriginLayer3);
3156     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW4.Value = %x", pObjectStatic->DW4.Value);
3157     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer4 = %x",
3158         pObjectStatic->DW4.HorizontalFrameOriginLayer4);
3159     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW5.Value = %x", pObjectStatic->DW5.Value);
3160     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer5 = %x",
3161         pObjectStatic->DW5.HorizontalFrameOriginLayer5);
3162     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW6.Value = %x", pObjectStatic->DW6.Value);
3163     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer6 = %x",
3164         pObjectStatic->DW6.HorizontalFrameOriginLayer6);
3165     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW7.Value = %x", pObjectStatic->DW7.Value);
3166     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalFrameOriginLayer7 = %x",
3167         pObjectStatic->DW7.HorizontalFrameOriginLayer7);
3168     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW8.Value = %x", pObjectStatic->DW8.Value);
3169     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer0 = %x",
3170         pObjectStatic->DW8.VerticalFrameOriginLayer0);
3171     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW9.Value = %x", pObjectStatic->DW9.Value);
3172     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer1 = %x",
3173         pObjectStatic->DW9.VerticalFrameOriginLayer1);
3174     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW10.Value = %x", pObjectStatic->DW10.Value);
3175     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer2 = %x",
3176         pObjectStatic->DW10.VerticalFrameOriginLayer2);
3177     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW11.Value = %x", pObjectStatic->DW11.Value);
3178     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer3 = %x",
3179         pObjectStatic->DW11.VerticalFrameOriginLayer3);
3180     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW12.Value = %x", pObjectStatic->DW12.Value);
3181     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer4 = %x",
3182         pObjectStatic->DW12.VerticalFrameOriginLayer4);
3183     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW13.Value = %x", pObjectStatic->DW13.Value);
3184     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer5 = %x",
3185         pObjectStatic->DW13.VerticalFrameOriginLayer5);
3186     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW14.Value = %x", pObjectStatic->DW14.Value);
3187     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer6 = %x",
3188         pObjectStatic->DW14.VerticalFrameOriginLayer6);
3189     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW15.Value = %x", pObjectStatic->DW15.Value);
3190     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalFrameOriginLayer7 = %x",
3191         pObjectStatic->DW15.VerticalFrameOriginLayer7);
3192     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW16.Value = %x", pObjectStatic->DW16.Value);
3193     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer0 = %x",
3194         pObjectStatic->DW16.HorizontalScalingStepRatioLayer0);
3195     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW17.Value = %x", pObjectStatic->DW17.Value);
3196     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer1 = %x",
3197         pObjectStatic->DW17.HorizontalScalingStepRatioLayer1);
3198     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW18.Value = %x", pObjectStatic->DW18.Value);
3199     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer2 = %x",
3200         pObjectStatic->DW18.HorizontalScalingStepRatioLayer2);
3201     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW19.Value = %x", pObjectStatic->DW19.Value);
3202     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer3 = %x",
3203         pObjectStatic->DW19.HorizontalScalingStepRatioLayer3);
3204     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW20.Value = %x", pObjectStatic->DW20.Value);
3205     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer4 = %x",
3206         pObjectStatic->DW20.HorizontalScalingStepRatioLayer4);
3207     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW21.Value = %x", pObjectStatic->DW21.Value);
3208     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer5 = %x",
3209         pObjectStatic->DW21.HorizontalScalingStepRatioLayer5);
3210     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW22.Value = %x", pObjectStatic->DW22.Value);
3211     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer6 = %x",
3212         pObjectStatic->DW22.HorizontalScalingStepRatioLayer6);
3213     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW23.Value = %x", pObjectStatic->DW23.Value);
3214     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     HorizontalScalingStepRatioLayer7 = %x",
3215         pObjectStatic->DW23.HorizontalScalingStepRatioLayer7);
3216     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW24.Value = %x", pObjectStatic->DW24.Value);
3217     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer0 = %x",
3218         pObjectStatic->DW24.VerticalScalingStepRatioLayer0);
3219     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW25.Value = %x", pObjectStatic->DW25.Value);
3220     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer1 = %x",
3221         pObjectStatic->DW25.VerticalScalingStepRatioLayer1);
3222     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW26.Value = %x", pObjectStatic->DW26.Value);
3223     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer2 = %x",
3224         pObjectStatic->DW26.VerticalScalingStepRatioLayer2);
3225     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW27.Value = %x", pObjectStatic->DW27.Value);
3226     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer3 = %x",
3227         pObjectStatic->DW27.VerticalScalingStepRatioLayer3);
3228     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW28.Value = %x", pObjectStatic->DW28.Value);
3229     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer4 = %x",
3230         pObjectStatic->DW28.VerticalScalingStepRatioLayer4);
3231     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW29.Value = %x", pObjectStatic->DW29.Value);
3232     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer5 = %x",
3233         pObjectStatic->DW29.VerticalScalingStepRatioLayer5);
3234     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW30.Value = %x", pObjectStatic->DW30.Value);
3235     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer6 = %x",
3236         pObjectStatic->DW30.VerticalScalingStepRatioLayer6);
3237     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW31.Value = %x", pObjectStatic->DW31.Value);
3238     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     VerticalScalingStepRatioLayer7 = %x",
3239         pObjectStatic->DW31.VerticalScalingStepRatioLayer7);
3240     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW32.Value = %d", pObjectStatic->DW32.Value);
3241     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer0 = 0x%d, TopCoordinateRectangleLayer0 = 0x%d",
3242         pObjectStatic->DW32.LeftCoordinateRectangleLayer0,
3243         pObjectStatic->DW32.TopCoordinateRectangleLayer0);
3244     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW33.Value = %d", pObjectStatic->DW33.Value);
3245     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer1 = 0x%d, TopCoordinateRectangleLayer2 = 0x%d",
3246         pObjectStatic->DW33.LeftCoordinateRectangleLayer1,
3247         pObjectStatic->DW33.TopCoordinateRectangleLayer1);
3248     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW34.Value = %d", pObjectStatic->DW34.Value);
3249     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer2 = 0x%d, TopCoordinateRectangleLayer2 = 0x%d",
3250         pObjectStatic->DW34.LeftCoordinateRectangleLayer2,
3251         pObjectStatic->DW34.TopCoordinateRectangleLayer2);
3252     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW35.Value = %d", pObjectStatic->DW35.Value);
3253     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer3 = 0x%d, TopCoordinateRectangleLayer3 = 0x%d",
3254         pObjectStatic->DW35.LeftCoordinateRectangleLayer3,
3255         pObjectStatic->DW35.TopCoordinateRectangleLayer3);
3256     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW36.Value = %d", pObjectStatic->DW36.Value);
3257     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer4 = 0x%d, TopCoordinateRectangleLayer4 = 0x%d",
3258         pObjectStatic->DW36.LeftCoordinateRectangleLayer4,
3259         pObjectStatic->DW36.TopCoordinateRectangleLayer4);
3260     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW37.Value = %d", pObjectStatic->DW37.Value);
3261     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer5 = 0x%d, TopCoordinateRectangleLayer5 = 0x%d",
3262         pObjectStatic->DW37.LeftCoordinateRectangleLayer5,
3263         pObjectStatic->DW37.TopCoordinateRectangleLayer5);
3264     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW38.Value = %d", pObjectStatic->DW38.Value);
3265     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer6 = 0x%d, TopCoordinateRectangleLayer6 = 0x%d",
3266         pObjectStatic->DW38.LeftCoordinateRectangleLayer6,
3267         pObjectStatic->DW38.TopCoordinateRectangleLayer6);
3268     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW39.Value = %d", pObjectStatic->DW39.Value);
3269     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     LeftCoordinateRectangleLayer7 = 0x%d, TopCoordinateRectangleLayer7 = 0x%d",
3270         pObjectStatic->DW39.LeftCoordinateRectangleLayer7,
3271         pObjectStatic->DW39.TopCoordinateRectangleLayer7);
3272     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW40.Value = %d", pObjectStatic->DW40.Value);
3273     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer0 = 0x%d, RightCoordinateRectangleLayer0 = 0x%d",
3274         pObjectStatic->DW40.BottomCoordinateRectangleLayer0,
3275         pObjectStatic->DW40.RightCoordinateRectangleLayer0);
3276     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW41.Value = %d", pObjectStatic->DW41.Value);
3277     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer1 = 0x%d, RightCoordinateRectangleLayer1 = 0x%d",
3278         pObjectStatic->DW41.BottomCoordinateRectangleLayer1,
3279         pObjectStatic->DW41.RightCoordinateRectangleLayer1);
3280     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW42.Value = %d", pObjectStatic->DW42.Value);
3281     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer2 = 0x%d, RightCoordinateRectangleLayer2 = 0x%d",
3282         pObjectStatic->DW42.BottomCoordinateRectangleLayer2,
3283         pObjectStatic->DW42.RightCoordinateRectangleLayer2);
3284     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW43.Value = %d", pObjectStatic->DW43.Value);
3285     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer3 = 0x%d, RightCoordinateRectangleLayer3 = 0x%d",
3286         pObjectStatic->DW43.BottomCoordinateRectangleLayer3,
3287         pObjectStatic->DW43.RightCoordinateRectangleLayer3);
3288     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW44.Value = %d", pObjectStatic->DW44.Value);
3289     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer4 = 0x%d, RightCoordinateRectangleLayer4 = 0x%d",
3290         pObjectStatic->DW44.BottomCoordinateRectangleLayer4,
3291         pObjectStatic->DW44.RightCoordinateRectangleLayer4);
3292     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW45.Value = %d", pObjectStatic->DW45.Value);
3293     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer5 = 0x%d, RightCoordinateRectangleLayer5 = 0x%d",
3294         pObjectStatic->DW45.BottomCoordinateRectangleLayer5,
3295         pObjectStatic->DW45.RightCoordinateRectangleLayer5);
3296     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW46.Value = %d", pObjectStatic->DW46.Value);
3297     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer6 = 0x%d, RightCoordinateRectangleLayer6 = 0x%d",
3298         pObjectStatic->DW46.BottomCoordinateRectangleLayer6,
3299         pObjectStatic->DW46.RightCoordinateRectangleLayer6);
3300     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW47.Value = %d", pObjectStatic->DW47.Value);
3301     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     BottomCoordinateRectangleLayer7 = 0x%d, RightCoordinateRectangleLayer7 = 0x%d",
3302         pObjectStatic->DW47.BottomCoordinateRectangleLayer7,
3303         pObjectStatic->DW47.RightCoordinateRectangleLayer7);
3304     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW48.Value = %d", pObjectStatic->DW48.Value);
3305     VPHAL_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",
3306         pObjectStatic->DW48.CCMEnablingFlagLayer0,
3307         pObjectStatic->DW48.CCMExtensionEnablingFlagLayer0,
3308         pObjectStatic->DW48.ChannelSwapEnablingFlagLayer0,
3309         pObjectStatic->DW48.ChromaSittingLocationLayer0,
3310         pObjectStatic->DW48.Enabling3DLUTFlagLayer0,
3311         pObjectStatic->DW48.EOTF1DLUTEnablingFlagLayer0,
3312         pObjectStatic->DW48.FormatDescriptorLayer0,
3313         pObjectStatic->DW48.IEFBypassEnablingFlagLayer0,
3314         pObjectStatic->DW48.OETF1DLUTEnablingFlagLayer0,
3315         pObjectStatic->DW48.PostCSCEnablingFlagLayer0,
3316         pObjectStatic->DW48.PriorCSCEnablingFlagLayer0,
3317         pObjectStatic->DW48.RotationAngleMirrorDirectionLayer0,
3318         pObjectStatic->DW48.SamplerIndexFirstPlaneLayer0,
3319         pObjectStatic->DW48.SamplerIndexSecondThirdPlaneLayer0,
3320         pObjectStatic->DW48.ToneMappingEnablingFlagLayer0);
3321     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW49.Value = %d", pObjectStatic->DW49.Value);
3322     VPHAL_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",
3323         pObjectStatic->DW49.CCMEnablingFlagLayer1,
3324         pObjectStatic->DW49.CCMExtensionEnablingFlagLayer1,
3325         pObjectStatic->DW49.ChannelSwapEnablingFlagLayer1,
3326         pObjectStatic->DW49.ChromaSittingLocationLayer1,
3327         pObjectStatic->DW49.Enabling3DLUTFlagLayer1,
3328         pObjectStatic->DW49.EOTF1DLUTEnablingFlagLayer1,
3329         pObjectStatic->DW49.FormatDescriptorLayer1,
3330         pObjectStatic->DW49.IEFBypassEnablingFlagLayer1,
3331         pObjectStatic->DW49.OETF1DLUTEnablingFlagLayer1,
3332         pObjectStatic->DW49.PostCSCEnablingFlagLayer1,
3333         pObjectStatic->DW49.PriorCSCEnablingFlagLayer1,
3334         pObjectStatic->DW49.RotationAngleMirrorDirectionLayer1,
3335         pObjectStatic->DW49.SamplerIndexFirstPlaneLayer1,
3336         pObjectStatic->DW49.SamplerIndexSecondThirdPlaneLayer1,
3337         pObjectStatic->DW49.ToneMappingEnablingFlagLayer1);
3338     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW50.Value = %d", pObjectStatic->DW50.Value);
3339     VPHAL_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",
3340         pObjectStatic->DW50.CCMEnablingFlagLayer2,
3341         pObjectStatic->DW50.CCMExtensionEnablingFlagLayer2,
3342         pObjectStatic->DW50.ChannelSwapEnablingFlagLayer2,
3343         pObjectStatic->DW50.ChromaSittingLocationLayer2,
3344         pObjectStatic->DW50.Enabling3DLUTFlagLayer2,
3345         pObjectStatic->DW50.EOTF1DLUTEnablingFlagLayer2,
3346         pObjectStatic->DW50.FormatDescriptorLayer2,
3347         pObjectStatic->DW50.IEFBypassEnablingFlagLayer2,
3348         pObjectStatic->DW50.OETF1DLUTEnablingFlagLayer2,
3349         pObjectStatic->DW50.PostCSCEnablingFlagLayer2,
3350         pObjectStatic->DW50.PriorCSCEnablingFlagLayer2,
3351         pObjectStatic->DW50.RotationAngleMirrorDirectionLayer2,
3352         pObjectStatic->DW50.SamplerIndexFirstPlaneLayer2,
3353         pObjectStatic->DW50.SamplerIndexSecondThirdPlaneLayer2,
3354         pObjectStatic->DW50.ToneMappingEnablingFlagLayer2);
3355     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW51.Value = %d", pObjectStatic->DW51.Value);
3356     VPHAL_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",
3357         pObjectStatic->DW51.CCMEnablingFlagLayer3,
3358         pObjectStatic->DW51.CCMExtensionEnablingFlagLayer3,
3359         pObjectStatic->DW51.ChannelSwapEnablingFlagLayer3,
3360         pObjectStatic->DW51.ChromaSittingLocationLayer3,
3361         pObjectStatic->DW51.Enabling3DLUTFlagLayer3,
3362         pObjectStatic->DW51.EOTF1DLUTEnablingFlagLayer3,
3363         pObjectStatic->DW51.FormatDescriptorLayer3,
3364         pObjectStatic->DW51.IEFBypassEnablingFlagLayer3,
3365         pObjectStatic->DW51.OETF1DLUTEnablingFlagLayer3,
3366         pObjectStatic->DW51.PostCSCEnablingFlagLayer3,
3367         pObjectStatic->DW51.PriorCSCEnablingFlagLayer3,
3368         pObjectStatic->DW51.RotationAngleMirrorDirectionLayer3,
3369         pObjectStatic->DW51.SamplerIndexFirstPlaneLayer3,
3370         pObjectStatic->DW51.SamplerIndexSecondThirdPlaneLayer3,
3371         pObjectStatic->DW51.ToneMappingEnablingFlagLayer3);
3372     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW52.Value = %d", pObjectStatic->DW52.Value);
3373     VPHAL_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",
3374         pObjectStatic->DW52.CCMEnablingFlagLayer4,
3375         pObjectStatic->DW52.CCMExtensionEnablingFlagLayer4,
3376         pObjectStatic->DW52.ChannelSwapEnablingFlagLayer4,
3377         pObjectStatic->DW52.ChromaSittingLocationLayer4,
3378         pObjectStatic->DW52.Enabling3DLUTFlagLayer4,
3379         pObjectStatic->DW52.EOTF1DLUTEnablingFlagLayer4,
3380         pObjectStatic->DW52.FormatDescriptorLayer4,
3381         pObjectStatic->DW52.IEFBypassEnablingFlagLayer4,
3382         pObjectStatic->DW52.OETF1DLUTEnablingFlagLayer4,
3383         pObjectStatic->DW52.PostCSCEnablingFlagLayer4,
3384         pObjectStatic->DW52.PriorCSCEnablingFlagLayer4,
3385         pObjectStatic->DW52.RotationAngleMirrorDirectionLayer4,
3386         pObjectStatic->DW52.SamplerIndexFirstPlaneLayer4,
3387         pObjectStatic->DW52.SamplerIndexSecondThirdPlaneLayer4,
3388         pObjectStatic->DW52.ToneMappingEnablingFlagLayer4);
3389     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW53.Value = %d", pObjectStatic->DW53.Value);
3390     VPHAL_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",
3391         pObjectStatic->DW53.CCMEnablingFlagLayer5,
3392         pObjectStatic->DW53.CCMExtensionEnablingFlagLayer5,
3393         pObjectStatic->DW53.ChannelSwapEnablingFlagLayer5,
3394         pObjectStatic->DW53.ChromaSittingLocationLayer5,
3395         pObjectStatic->DW53.Enabling3DLUTFlagLayer5,
3396         pObjectStatic->DW53.EOTF1DLUTEnablingFlagLayer5,
3397         pObjectStatic->DW53.FormatDescriptorLayer5,
3398         pObjectStatic->DW53.IEFBypassEnablingFlagLayer5,
3399         pObjectStatic->DW53.OETF1DLUTEnablingFlagLayer5,
3400         pObjectStatic->DW53.PostCSCEnablingFlagLayer5,
3401         pObjectStatic->DW53.PriorCSCEnablingFlagLayer5,
3402         pObjectStatic->DW53.RotationAngleMirrorDirectionLayer5,
3403         pObjectStatic->DW53.SamplerIndexFirstPlaneLayer5,
3404         pObjectStatic->DW53.SamplerIndexSecondThirdPlaneLayer5,
3405         pObjectStatic->DW53.ToneMappingEnablingFlagLayer5);
3406     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW54.Value = %d", pObjectStatic->DW54.Value);
3407     VPHAL_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",
3408         pObjectStatic->DW54.CCMEnablingFlagLayer6,
3409         pObjectStatic->DW54.CCMExtensionEnablingFlagLayer6,
3410         pObjectStatic->DW54.ChannelSwapEnablingFlagLayer6,
3411         pObjectStatic->DW54.ChromaSittingLocationLayer6,
3412         pObjectStatic->DW54.Enabling3DLUTFlagLayer6,
3413         pObjectStatic->DW54.EOTF1DLUTEnablingFlagLayer6,
3414         pObjectStatic->DW54.FormatDescriptorLayer6,
3415         pObjectStatic->DW54.IEFBypassEnablingFlagLayer6,
3416         pObjectStatic->DW54.OETF1DLUTEnablingFlagLayer6,
3417         pObjectStatic->DW54.PostCSCEnablingFlagLayer6,
3418         pObjectStatic->DW54.PriorCSCEnablingFlagLayer6,
3419         pObjectStatic->DW54.RotationAngleMirrorDirectionLayer6,
3420         pObjectStatic->DW54.SamplerIndexFirstPlaneLayer6,
3421         pObjectStatic->DW54.SamplerIndexSecondThirdPlaneLayer6,
3422         pObjectStatic->DW54.ToneMappingEnablingFlagLayer6);
3423     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW55.Value = %x", pObjectStatic->DW55.Value);
3424     VPHAL_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",
3425         pObjectStatic->DW55.CCMEnablingFlagLayer7,
3426         pObjectStatic->DW55.CCMExtensionEnablingFlagLayer7,
3427         pObjectStatic->DW55.ChannelSwapEnablingFlagLayer7,
3428         pObjectStatic->DW55.ChromaSittingLocationLayer7,
3429         pObjectStatic->DW55.Enabling3DLUTFlagLayer7,
3430         pObjectStatic->DW55.EOTF1DLUTEnablingFlagLayer7,
3431         pObjectStatic->DW55.FormatDescriptorLayer7,
3432         pObjectStatic->DW55.IEFBypassEnablingFlagLayer7,
3433         pObjectStatic->DW55.OETF1DLUTEnablingFlagLayer7,
3434         pObjectStatic->DW55.PostCSCEnablingFlagLayer7,
3435         pObjectStatic->DW55.PriorCSCEnablingFlagLayer7,
3436         pObjectStatic->DW55.RotationAngleMirrorDirectionLayer7,
3437         pObjectStatic->DW55.SamplerIndexFirstPlaneLayer7,
3438         pObjectStatic->DW55.SamplerIndexSecondThirdPlaneLayer7,
3439         pObjectStatic->DW55.ToneMappingEnablingFlagLayer7);
3440     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW56.Value = %d", pObjectStatic->DW56.Value);
3441     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     ConstantBlendingAlphaFillColorLayer0 = %d, ConstantBlendingAlphaFillColorLayer1 = %d, ConstantBlendingAlphaFillColorLayer2 = %d, ConstantBlendingAlphaFillColorLayer3 = %d",
3442         pObjectStatic->DW56.ConstantBlendingAlphaFillColorLayer0,
3443         pObjectStatic->DW56.ConstantBlendingAlphaFillColorLayer1,
3444         pObjectStatic->DW56.ConstantBlendingAlphaFillColorLayer2,
3445         pObjectStatic->DW56.ConstantBlendingAlphaFillColorLayer3);
3446     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW57.Value = %d", pObjectStatic->DW57.Value);
3447     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     ConstantBlendingAlphaFillColorLayer4 = %d, ConstantBlendingAlphaFillColorLayer5 = %d, ConstantBlendingAlphaFillColorLayer6 = %d, ConstantBlendingAlphaFillColorLayer7 = %d",
3448         pObjectStatic->DW57.ConstantBlendingAlphaFillColorLayer4,
3449         pObjectStatic->DW57.ConstantBlendingAlphaFillColorLayer5,
3450         pObjectStatic->DW57.ConstantBlendingAlphaFillColorLayer6,
3451         pObjectStatic->DW57.ConstantBlendingAlphaFillColorLayer7);
3452     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW58.Value = %d", pObjectStatic->DW58.Value);
3453     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     TwoLayerOperationLayer0 = %d, TwoLayerOperationLayer1 = %d, TwoLayerOperationLayer2 = %d, TwoLayerOperationLayer3 = %d",
3454         pObjectStatic->DW58.TwoLayerOperationLayer0,
3455         pObjectStatic->DW58.TwoLayerOperationLayer1,
3456         pObjectStatic->DW58.TwoLayerOperationLayer2,
3457         pObjectStatic->DW58.TwoLayerOperationLayer3);
3458     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW59.Value = %d", pObjectStatic->DW59.Value);
3459     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     TwoLayerOperationLayer4 = %d, TwoLayerOperationLayer5 = %d, TwoLayerOperationLayer6 = %d, TwoLayerOperationLayer7 = %d",
3460         pObjectStatic->DW59.TwoLayerOperationLayer4,
3461         pObjectStatic->DW59.TwoLayerOperationLayer5,
3462         pObjectStatic->DW59.TwoLayerOperationLayer6,
3463         pObjectStatic->DW59.TwoLayerOperationLayer7);
3464     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW60.Value = %d", pObjectStatic->DW60.Value);
3465     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     FixedPointFillColorGYChannel = %d, FixedPointFillColorRVChannel = %d",
3466         pObjectStatic->DW60.FixedPointFillColorGYChannel,
3467         pObjectStatic->DW60.FixedPointFillColorRVChannel);
3468     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW61.Value = %x", pObjectStatic->DW61.Value);
3469     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     FixedPointFillColorAlphaChannel = %d, FixedPointFillColorBUChannel = %d",
3470         pObjectStatic->DW61.FixedPointFillColorAlphaChannel,
3471         pObjectStatic->DW61.FixedPointFillColorBUChannel);
3472     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW62.Value = %d", pObjectStatic->DW62.Value);
3473     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     DestinationHeight = %d, DestinationWidth = %d",
3474         pObjectStatic->DW62.DestinationHeight,
3475         pObjectStatic->DW62.DestinationWidth);
3476     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData: DW63.Value = %d", pObjectStatic->DW63.Value);
3477     VPHAL_RENDER_VERBOSEMESSAGE("CurbeData:     ChannelSwapEnablingFlagDestination = %d, ChromaSittingLocationDestination = %d, DitherRoundEnablingFlagDestinationSurface = %d, DstCSCEnablingFlagDestination = %d, FormatDescriptorDestination = %d, Reserved = %d, TotalNumberInputLayers = %d",
3478         pObjectStatic->DW63.ChannelSwapEnablingFlagDestination,
3479         pObjectStatic->DW63.ChromaSittingLocationDestination,
3480         pObjectStatic->DW63.DitherRoundEnablingFlagDestinationSurface,
3481         pObjectStatic->DW63.DstCSCEnablingFlagDestination,
3482         pObjectStatic->DW63.FormatDescriptorDestination,
3483         pObjectStatic->DW63.Reserved,
3484         pObjectStatic->DW63.TotalNumberInputLayers);
3485 #endif
3486 }
3487 
3488 //!
3489 //! \brief    Get Hdr iTouch Split Frame Portion number
3490 //! \details  Get Hdr iTouch Split Frame Portion number is Gen9 platform specific
3491 //! \param    PVPHAL_HDR_STATE pHdrState
3492 //!           [in/out] Pointer to HDR state
3493 //! \return   MOS_STATUS
3494 //!
VpHal_HdrGetSplitFramePortion_g9(PVPHAL_HDR_STATE pHdrState)3495 MOS_STATUS VpHal_HdrGetSplitFramePortion_g9(
3496     PVPHAL_HDR_STATE        pHdrState)
3497 {
3498     MOS_STATUS eStatus;
3499     uint32_t   dwPixels;
3500 
3501     VPHAL_RENDER_CHK_NULL(pHdrState);
3502     VPHAL_RENDER_CHK_NULL(pHdrState->pTargetSurf[0]);
3503 
3504     dwPixels = pHdrState->pTargetSurf[0]->dwWidth * pHdrState->pTargetSurf[0]->dwHeight;
3505     //pHdrState->uiPortions = MOS_ROUNDUP_DIVIDE(dwPixels, g_Hdr_iTouc_Pixel_Throughput_g9[pHdrState->uSourceCount - 1]);
3506 
3507     if (dwPixels <= 1920 * 1080)
3508     {
3509         pHdrState->uiSplitFramePortions = 2;
3510     }
3511     else if (dwPixels <= 3840 * 2160)
3512     {
3513         pHdrState->uiSplitFramePortions = 4;
3514     }
3515     else
3516     {
3517         pHdrState->uiSplitFramePortions = 8;
3518     }
3519 
3520     eStatus = MOS_STATUS_SUCCESS;
3521 
3522 finish:
3523     return eStatus;
3524 }
3525 
3526 //!
3527 //! \brief    Initializes interface for HDR
3528 //! \details  Initializes interface for HDR which is Gen9 platform specific
3529 //! \param    PVPHAL_HDR_STATE pHdrState
3530 //!           [in] Pointer to HDR state
3531 //! \return   MOS_STATUS
3532 //!
VpHal_HdrInitInterface_g9(PVPHAL_HDR_STATE pHdrState)3533 MOS_STATUS VpHal_HdrInitInterface_g9(
3534     PVPHAL_HDR_STATE        pHdrState)
3535 {
3536     MOS_STATUS eStatus      = MOS_STATUS_SUCCESS;
3537     int32_t    i            = 0;
3538 
3539     VPHAL_RENDER_CHK_NULL(pHdrState);
3540 
3541     for (i = 0; i < VPHAL_MAX_HDR_INPUT_LAYER; i++)
3542     {
3543         pHdrState->uSourceBindingTableIndex[i] = VPHAL_HDR_BTINDEX_LAYER0_G9 + i * VPHAL_HDR_BTINDEX_PER_LAYER0_G9;
3544     }
3545 
3546     for (i = 0; i < VPHAL_MAX_HDR_OUTPUT_LAYER; i++)
3547     {
3548         pHdrState->uTargetBindingTableIndex[i] = VPHAL_HDR_BTINDEX_RENDERTARGET_G9 + i * VPHAL_HDR_BTINDEX_PER_TARGET_G9;
3549     }
3550 
3551     for (i = 0; i < VPHAL_MAX_HDR_INPUT_LAYER; i++)
3552     {
3553         pHdrState->LUTMode[i]   = VPHAL_HDR_LUT_MODE_NONE;
3554         pHdrState->EOTFGamma[i] = VPHAL_GAMMA_NONE;
3555         pHdrState->OETFGamma[i] = VPHAL_GAMMA_NONE;
3556         pHdrState->CCM[i]       = VPHAL_HDR_CCM_NONE;
3557         pHdrState->CCMExt1[i]   = VPHAL_HDR_CCM_NONE;
3558         pHdrState->CCMExt2[i]   = VPHAL_HDR_CCM_NONE;
3559         pHdrState->HdrMode[i]   = VPHAL_HDR_MODE_NONE;
3560         pHdrState->PriorCSC[i]  = VPHAL_HDR_CSC_NONE;
3561         pHdrState->PostCSC[i]   = VPHAL_HDR_CSC_NONE;
3562     }
3563 
3564     // Allocate AVS parameters
3565     VpHal_RenderInitAVSParams(&pHdrState->AVSParameters[0],
3566                               POLYPHASE_Y_COEFFICIENT_TABLE_SIZE_G9,
3567                               POLYPHASE_UV_COEFFICIENT_TABLE_SIZE_G9);
3568 
3569     VpHal_RenderInitAVSParams(&pHdrState->AVSParameters[1],
3570                               POLYPHASE_Y_COEFFICIENT_TABLE_SIZE_G9,
3571                               POLYPHASE_UV_COEFFICIENT_TABLE_SIZE_G9);
3572 
3573     pHdrState->dwOetfSurfaceWidth         = VPHAL_HDR_OETF_1DLUT_WIDTH;
3574     pHdrState->dwOetfSurfaceWidth         = VPHAL_HDR_OETF_1DLUT_HEIGHT;
3575     pHdrState->pKernelParamTable          = (PRENDERHAL_KERNEL_PARAM)g_Hdr_KernelParam_g9;
3576     pHdrState->pfnAllocateResources       = VpHal_HdrAllocateResources_g9;
3577     pHdrState->pfnSetupSurfaceStates      = VpHal_HdrSetupSurfaceStates_g9;
3578     pHdrState->pfnIsInputFormatSupported  = VpHal_HdrIsInputFormatSupported_g9;
3579     pHdrState->pfnIsOutputFormatSupported = VpHal_HdrIsOutputFormatSupported_g9;
3580     pHdrState->pfnLoadStaticData          = VpHal_HdrLoadStaticData_g9;
3581     pHdrState->pfnGetKernelParam          = VpHal_HdrGetKernelParam_g9;
3582     pHdrState->pfnInitOETF1DLUT           = VpHal_HdrInitOETF1DLUT_g9;
3583     pHdrState->pfnInitCoeff               = VpHal_HdrInitCoeff_g9;
3584     pHdrState->pfnSetSamplerStates        = VpHal_HdrSetSamplerStates_g9;
3585     pHdrState->pfnSetIefStates            = VpHal_HdrSetIefStates_g9;
3586     pHdrState->pfnSetSamplerAvsTable      = VpHal_HdrSetSamplerAvsTableParam_g9;
3587     pHdrState->pfnFreeResources           = VpHal_HdrFreeResources_g9;
3588     pHdrState->pfnGetSplitFramePortion    = VpHal_HdrGetSplitFramePortion_g9;
3589 
3590     pHdrState->pfnSetupPreSurfaceStates = VpHal_HdrSetupPreProcessSurfaceStates_g9;
3591     pHdrState->pfnLoadPreStaticData     = VpHal_HdrPreprocessLoadStaticData_g9;
3592 
3593     eStatus = MOS_STATUS_SUCCESS;
3594 
3595 finish:
3596     return eStatus;
3597 }
3598 
3599 //!
3600 //! \brief    Destroy interface for HDR
3601 //! \details  Destroy interface for HDR which is Gen9 platform specific
3602 //! \param    PVPHAL_HDR_STATE pHdrState
3603 //!           [in] Pointer to HDR state
3604 //! \return   MOS_STATUS
3605 //!
3606 
VpHal_HdrDestroyInterface_g9(PVPHAL_HDR_STATE pHdrState)3607 MOS_STATUS VpHal_HdrDestroyInterface_g9(
3608     PVPHAL_HDR_STATE        pHdrState)
3609 {
3610     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
3611     VPHAL_RENDER_CHK_NULL(pHdrState);
3612 
3613     VpHal_RenderDestroyAVSParams(&pHdrState->AVSParameters[0]);
3614     VpHal_RenderDestroyAVSParams(&pHdrState->AVSParameters[1]);
3615 
3616 finish:
3617     return eStatus;
3618 }
3619 
3620 //!
3621 //! \brief    Set HDR Ief State
3622 //! \details  Set HDR Ief State
3623 //! \param    PVPHAL_HDR_STATE pHdrState
3624 //!           [in] Pointer to HDR state
3625 //! \param    PVPHAL_HDR_RENDER_DATA pRenderData
3626 //!           [in] Pointer to render data
3627 //! \param    PMHW_SAMPLER_STATE_PARAM    pSamplerStateParams
3628 //!           [in] Pointer to Sampler State Parameters
3629 //! \return   MOS_STATUS
3630 //!
VpHal_HdrSetIefStates_g9(PVPHAL_HDR_STATE pHdrState,PVPHAL_HDR_RENDER_DATA pRenderData,PMHW_SAMPLER_STATE_PARAM pSamplerStateParams)3631 MOS_STATUS VpHal_HdrSetIefStates_g9(
3632     PVPHAL_HDR_STATE            pHdrState,
3633     PVPHAL_HDR_RENDER_DATA      pRenderData,
3634     PMHW_SAMPLER_STATE_PARAM    pSamplerStateParams)
3635 {
3636     MOS_STATUS eStatus = MOS_STATUS_UNKNOWN;
3637 
3638     VPHAL_RENDER_CHK_NULL(pHdrState);
3639     VPHAL_RENDER_CHK_NULL(pSamplerStateParams);
3640     VPHAL_RENDER_CHK_NULL(pRenderData);
3641 
3642     MOS_UNUSED(pRenderData);
3643     {
3644         Ief ief(pHdrState->pSrcSurf[0]);
3645         VPHAL_RENDER_CHK_STATUS(ief.SetHwState(pSamplerStateParams));
3646     }
3647 
3648 finish:
3649     return eStatus;
3650 }
3651 
3652 //!
3653 //! \brief    Initiate EOTF Surface for HDR
3654 //! \details  Initiate EOTF Surface for HDR
3655 //! \param    PVPHAL_HDR_STATE pHdrStatee
3656 //!           [in] Pointer to HDR state
3657 //! \param    int32_t iIndex
3658 //!           [in] input surface index
3659 //! \param    PVPHAL_SURFACE pOETF1DLUTSurface
3660 //!           [in] Pointer to OETF 1D LUT Surface
3661 //! \return   MOS_STATUS
3662 //!
VpHal_HdrInitOETF1DLUT_g9(PVPHAL_HDR_STATE pHdrState,int32_t iIndex,PVPHAL_SURFACE pOETF1DLUTSurface)3663 MOS_STATUS VpHal_HdrInitOETF1DLUT_g9(
3664     PVPHAL_HDR_STATE pHdrState,
3665     int32_t               iIndex,
3666     PVPHAL_SURFACE        pOETF1DLUTSurface)
3667 {
3668     MOS_STATUS       eStatus            = MOS_STATUS_SUCCESS;
3669     PMOS_INTERFACE   pOsInterface       = nullptr;
3670     uint32_t         i                  = 0;
3671     uint16_t         *pSrcOetfLut       = nullptr;
3672     uint8_t          *pDstOetfLut       = nullptr;
3673     MOS_LOCK_PARAMS  LockFlags          = {};
3674     PVPHAL_SURFACE   pTargetSurf        = (PVPHAL_SURFACE)pHdrState->pTargetSurf[0];
3675 
3676     VPHAL_PUBLIC_CHK_NULL(pHdrState);
3677     VPHAL_PUBLIC_CHK_NULL(pOETF1DLUTSurface);
3678     pOsInterface = pHdrState->pOsInterface;
3679 
3680     VPHAL_PUBLIC_CHK_NULL(pOsInterface);
3681 
3682     MOS_ZeroMemory(&LockFlags, sizeof(MOS_LOCK_PARAMS));
3683 
3684     LockFlags.WriteOnly = 1;
3685 
3686     // Lock the surface for writing
3687     pDstOetfLut = (uint8_t *)pOsInterface->pfnLockResource(
3688         pOsInterface,
3689         &(pOETF1DLUTSurface->OsResource),
3690         &LockFlags);
3691 
3692     VPHAL_RENDER_CHK_NULL(pDstOetfLut);
3693     VPHAL_RENDER_CHK_NULL(pHdrState->pTargetSurf[0]);
3694     VPHAL_RENDER_CHK_NULL(pHdrState->pTargetSurf[0]);
3695 
3696     // Hdr kernel require 0 to 1 floating point color value
3697     // To transfer the value of 16bit integer OETF table to 0 to 1 floating point
3698     // We need to divide the table with 2^16 - 1
3699     if ((pTargetSurf->pHDRParams &&
3700         (pTargetSurf->pHDRParams->EOTF == VPHAL_HDR_EOTF_TRADITIONAL_GAMMA_SDR ||
3701             pTargetSurf->pHDRParams->EOTF == VPHAL_HDR_EOTF_TRADITIONAL_GAMMA_HDR)) ||
3702         !pTargetSurf->pHDRParams)
3703     {
3704         if (pHdrState->OETFGamma[iIndex] == VPHAL_GAMMA_SRGB)
3705         {
3706             pSrcOetfLut = (uint16_t *)g_Hdr_ColorCorrect_OETF_sRGB_FP16_g9;
3707         }
3708         else
3709         {
3710             pSrcOetfLut = (uint16_t *)g_Hdr_ColorCorrect_OETF_BT709_FP16_g9;
3711         }
3712 
3713         for (i = 0;
3714             i < pOETF1DLUTSurface->dwHeight;
3715             i++, pDstOetfLut += pOETF1DLUTSurface->dwPitch, pSrcOetfLut += pOETF1DLUTSurface->dwWidth)
3716         {
3717             MOS_SecureMemcpy(pDstOetfLut, sizeof(uint16_t) * pOETF1DLUTSurface->dwWidth,
3718                 pSrcOetfLut, sizeof(uint16_t) * pOETF1DLUTSurface->dwWidth);
3719         }
3720     }
3721     else if (pTargetSurf->pHDRParams &&
3722         pTargetSurf->pHDRParams->EOTF == VPHAL_HDR_EOTF_SMPTE_ST2084)
3723     {
3724         if (pHdrState->HdrMode[iIndex] == VPHAL_HDR_MODE_INVERSE_TONE_MAPPING)
3725         {
3726             const float fStretchFactor = 0.01f;
3727             VpHal_Generate2SegmentsOETFLUT(fStretchFactor, OETF2084, pHdrState->OetfSmpteSt2084);
3728             pSrcOetfLut = pHdrState->OetfSmpteSt2084;
3729         }
3730         else // pHdrState->HdrMode[iIndex] == VPHAL_HDR_MODE_H2H
3731         {
3732             pSrcOetfLut = (uint16_t *)g_Hdr_ColorCorrect_OETF_SMPTE_ST2084_3Segs_FP16_g9;
3733         }
3734 
3735         for (i = 0;
3736             i < pOETF1DLUTSurface->dwHeight;
3737             i++, pDstOetfLut += pOETF1DLUTSurface->dwPitch, pSrcOetfLut += pOETF1DLUTSurface->dwWidth)
3738         {
3739             MOS_SecureMemcpy(pDstOetfLut, sizeof(uint16_t) * pOETF1DLUTSurface->dwWidth,
3740                 pSrcOetfLut, sizeof(uint16_t) * pOETF1DLUTSurface->dwWidth);
3741         }
3742     }
3743     else
3744     {
3745         VPHAL_RENDER_ASSERTMESSAGE("Invalid EOTF setting for tone mapping");
3746         eStatus = MOS_STATUS_INVALID_PARAMETER;
3747         goto finish;
3748     }
3749 
3750     pOsInterface->pfnUnlockResource(
3751         pOsInterface,
3752         &(pOETF1DLUTSurface->OsResource));
3753 
3754     eStatus = MOS_STATUS_SUCCESS;
3755 
3756 finish:
3757     return eStatus;
3758 }
3759 
3760 //!
3761 //! \brief    Get the Kernel Params
3762 //! \details  Get the Kernel Params, including kernel unique ID, KDT Index
3763 //! \param    VPHAL_HDR_KERNELID HdrKernelID
3764 //!           [in] HDR Kernel ID
3765 //! \param    int32_t* pKUIDOut
3766 //!           [out] Kernel unique ID
3767 //! \param    int32_t* pKDTIndexOut
3768 //!           [out] KDT index
3769 //! \param    PVPHAL_PERFTAG pPerfTag
3770 //!           [out] Performance tag
3771 //! \return   MOS_STATUS
3772 //!           MOS_STATUS_SUCCESS if successful, otherwise failed
3773 //!
VpHal_HdrGetKernelParam_g9(uint32_t HdrKernelID,int32_t * pKUIDOut,int32_t * pKDTIndexOut)3774 MOS_STATUS VpHal_HdrGetKernelParam_g9(
3775     uint32_t                    HdrKernelID,
3776     int32_t*                    pKUIDOut,
3777     int32_t*                    pKDTIndexOut)
3778 {
3779     MOS_STATUS                  eStatus;
3780 
3781     VPHAL_PUBLIC_CHK_NULL(pKUIDOut);
3782     VPHAL_PUBLIC_CHK_NULL(pKDTIndexOut);
3783 
3784     eStatus = MOS_STATUS_SUCCESS;
3785 
3786     if (HdrKernelID == KERNEL_HDR_MANDATORY)
3787     {
3788         *pKUIDOut = IDR_VP_HDR_mandatory;
3789         *pKDTIndexOut = KERNEL_HDR_MANDATORY_G9;
3790     }
3791     else if (HdrKernelID == KERNEL_HDR_PREPROCESS)
3792     {
3793         *pKUIDOut = IDR_VP_HDR_preprocess;
3794         *pKDTIndexOut = KERNEL_HDR_PREPROCESS_G9;
3795     }
3796     else
3797     {
3798         VPHAL_RENDER_ASSERTMESSAGE("Kernel Not found.");
3799         eStatus = MOS_STATUS_INVALID_PARAMETER;
3800     }
3801 
3802 finish:
3803     return eStatus;
3804 }
3805 
3806 //!
3807 //! \brief    HDR PreProcess Surface State Setup
3808 //! \details  Set up surface state used in HDR PreProcess, and bind the surface to pointed binding table entry.
3809 //! \param    PVPHAL_HDR_STATE pHdrState
3810 //            [in/out] Pointer to HDR state
3811 //! \param    PVPHAL_HDR_RENDER_DATA pRenderData
3812 //!           [in] Pointer to hdr render data.
3813 //! \return   MOS_STATUS
3814 //!           MOS_STATUS_SUCCESS if successful, otherwise failed
3815 //!
VpHal_HdrSetupPreProcessSurfaceStates_g9(PVPHAL_HDR_STATE pHdrState,PVPHAL_HDR_RENDER_DATA pRenderData)3816 MOS_STATUS VpHal_HdrSetupPreProcessSurfaceStates_g9(
3817     PVPHAL_HDR_STATE           pHdrState,
3818     PVPHAL_HDR_RENDER_DATA     pRenderData)
3819 {
3820     PVPHAL_SURFACE                  pSurfaceTemp                = nullptr;
3821     PRENDERHAL_SURFACE              pRenderHalSurfaceTemp       = nullptr;
3822     PRENDERHAL_INTERFACE            pRenderHal                  = nullptr;
3823     MOS_STATUS                      eStatus                     = MOS_STATUS_UNKNOWN;
3824     RENDERHAL_SURFACE_STATE_PARAMS  SurfaceParams               = {};
3825     int32_t                         iBTentry                    = 0;
3826 
3827     VPHAL_RENDER_CHK_NULL(pHdrState);
3828     VPHAL_RENDER_CHK_NULL(pRenderData);
3829 
3830     eStatus         = MOS_STATUS_UNKNOWN;
3831     pRenderHal      = pHdrState->pRenderHal;
3832     VPHAL_RENDER_CHK_NULL(pRenderHal);
3833 
3834     pSurfaceTemp            = &pHdrState->CoeffSurface;
3835     pRenderHalSurfaceTemp   = &pHdrState->RenderHalCoeffSurface;
3836 
3837     MOS_ZeroMemory(&SurfaceParams, sizeof(SurfaceParams));
3838     SurfaceParams.Type              = pRenderHal->SurfaceTypeDefault;
3839     SurfaceParams.isOutput     = false;
3840     SurfaceParams.Boundary          = RENDERHAL_SS_BOUNDARY_ORIGINAL;
3841     SurfaceParams.bWidth16Align     = false;
3842     SurfaceParams.MemObjCtl         = pHdrState->SurfMemObjCtl.CoeffSurfMemObjCtl;
3843     iBTentry                        = 16;
3844 
3845     if (!Mos_ResourceIsNull(&pSurfaceTemp->OsResource))
3846     {
3847         VPHAL_RENDER_CHK_STATUS(VpHal_CommonSetSurfaceForHwAccess(
3848             pRenderHal,
3849             pSurfaceTemp,
3850             pRenderHalSurfaceTemp,
3851             &SurfaceParams,
3852             pRenderData->iBindingTable,
3853             iBTentry,
3854             false));
3855     }
3856     else
3857     {
3858         VPHAL_RENDER_ASSERTMESSAGE("Null resource found");
3859         eStatus = MOS_STATUS_NULL_POINTER;
3860         goto finish;
3861     }
3862 
3863 finish:
3864     return eStatus;
3865 }
3866 
3867 //!
3868 //! \brief    Setup HDR PreProcess CURBE data
3869 //! \details  Setup HDR PreProcess CURBE data
3870 //! \param    PVPHAL_HDR_STATE pHdrState
3871 //!           [in] Poniter to HDR state
3872 //! \param    PVPHAL_HDR_RENDER_DATA pRenderData
3873 //!           [in] Poniter to HDR render data
3874 //! \param    int32_t* piCurbeOffsetOut
3875 //!           [Out] Curbe offset
3876 //! \return   MOS_STATUS
3877 //!           MOS_STATUS_SUCCESS if successful, otherwise
3878 //!
VpHal_HdrPreprocessLoadStaticData_g9(PVPHAL_HDR_STATE pHdrState,PVPHAL_HDR_RENDER_DATA pRenderData,int32_t * piCurbeOffsetOut)3879 MOS_STATUS VpHal_HdrPreprocessLoadStaticData_g9(
3880     PVPHAL_HDR_STATE            pHdrState,
3881     PVPHAL_HDR_RENDER_DATA      pRenderData,
3882     int32_t*                    piCurbeOffsetOut)
3883 {
3884     MOS_STATUS                                  eStatus     = MOS_STATUS_SUCCESS;
3885     PRENDERHAL_INTERFACE                        pRenderHal  = nullptr;
3886     PVPHAL_SURFACE                              pSource     = nullptr;
3887     PVPHAL_SURFACE                              pTarget     = nullptr;
3888 
3889     MEDIA_WALKER_HDR_PREPROCESS_STATIC_DATA_G9 HDRStatic;
3890     MOS_ZeroMemory(&HDRStatic, sizeof(MEDIA_WALKER_HDR_PREPROCESS_STATIC_DATA_G9));
3891 
3892     uint32_t uiMaxCLL[VPHAL_MAX_HDR_INPUT_LAYER] = { 0 };
3893     uint32_t uiMaxDLL[VPHAL_MAX_HDR_INPUT_LAYER] = { 0 };
3894     HDR_TMMODE tmMode[VPHAL_MAX_HDR_INPUT_LAYER] = { PREPROCESS_TM_MAX };
3895 
3896     VPHAL_RENDER_CHK_NULL(pHdrState);
3897     VPHAL_RENDER_CHK_NULL(pHdrState->pRenderHal);
3898     VPHAL_RENDER_CHK_NULL(pRenderData);
3899     VPHAL_RENDER_CHK_NULL(piCurbeOffsetOut);
3900 
3901     pRenderHal = pHdrState->pRenderHal;
3902 
3903     for (uint32_t i = 0; i < pHdrState->uSourceCount; i++)
3904     {
3905         if (i >= VPHAL_MAX_HDR_INPUT_LAYER)
3906         {
3907             eStatus = MOS_STATUS_INVALID_PARAMETER;
3908             goto finish;
3909         }
3910 
3911         pSource = pHdrState->pSrcSurf[i];
3912         if (pSource)
3913         {
3914             uiMaxCLL[i] = (pSource->pHDRParams) ? pSource->pHDRParams->MaxCLL : 0;
3915         }
3916 
3917         switch (pHdrState->HdrMode[i])
3918         {
3919         case VPHAL_HDR_MODE_TONE_MAPPING:           // H2S
3920             tmMode[i] = PREPROCESS_TM_H2S;
3921             break;
3922         case VPHAL_HDR_MODE_H2H:                    // H2S
3923             tmMode[i] = PREPROCESS_TM_H2H;
3924             break;
3925         case VPHAL_HDR_MODE_INVERSE_TONE_MAPPING:   // S2H
3926             tmMode[i] = PREPROCESS_TM_S2H;
3927             break;
3928         default:
3929             break;
3930         }
3931 
3932         pTarget = pHdrState->pTargetSurf[0];
3933         if (pTarget)
3934         {
3935             uiMaxDLL[0] = (pTarget->pHDRParams) ? pTarget->pHDRParams->max_display_mastering_luminance : 0;
3936         }
3937 
3938         HDRStatic.uiMaxCLL[i] = uiMaxCLL[i];
3939         HDRStatic.uiMaxDLL[i] = uiMaxDLL[0];
3940         HDRStatic.uiTMMode[i] = tmMode[i];
3941         VPHAL_RENDER_NORMALMESSAGE("StreamIndex: %d, maxCLL: %d, maxDLL: %d, TMMode: %d", i, HDRStatic.uiMaxCLL[i], HDRStatic.uiMaxDLL[i], HDRStatic.uiTMMode[i]);
3942     }
3943     HDRStatic.OutputCoeffIndex = 16;
3944 
3945     *piCurbeOffsetOut = pRenderHal->pfnLoadCurbeData(
3946         pRenderHal,
3947         pRenderData->pMediaState,
3948         &HDRStatic,
3949         sizeof(MEDIA_WALKER_HDR_PREPROCESS_STATIC_DATA_G9));
3950 
3951     if (*piCurbeOffsetOut < 0)
3952     {
3953         eStatus = MOS_STATUS_UNKNOWN;
3954         goto finish;
3955     }
3956     pRenderData->iCurbeOffset = *piCurbeOffsetOut;
3957 
3958 finish:
3959     return eStatus;
3960 }
3961