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