1 /*
2 * Copyright (c) 2018-2022, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file     vp_vebox_cmd_packet.h
24 //! \brief    vebox packet which used in by mediapipline.
25 //! \details  vebox packet provide the structures and generate the cmd buffer which mediapipline will used.
26 //!
27 
28 #ifndef __VP_VEBOX_CMD_PACKET_H__
29 #define __VP_VEBOX_CMD_PACKET_H__
30 
31 #include "vp_vebox_cmd_packet_base.h"
32 #include "vp_vebox_common.h"
33 #include "vp_filter.h"
34 #include "mhw_mi_itf.h"
35 #include "vp_render_sfc_base.h"
36 #include "hal_oca_interface_next.h"
37 
38 #define VP_MAX_NUM_FFDI_SURFACES     4                                       //!< 2 for ADI plus additional 2 for parallel execution on HSW+
39 #define VP_NUM_FFDN_SURFACES         2                                       //!< Number of FFDN surfaces
40 #define VP_NUM_STMM_SURFACES         2                                       //!< Number of STMM statistics surfaces
41 #define VP_DNDI_BUFFERS_MAX          4                                       //!< Max DNDI buffers
42 #define VP_NUM_KERNEL_VEBOX          8                                       //!< Max kernels called at Adv stage
43 
44 #define VP_VEBOX_RGB_ACE_HISTOGRAM_SIZE_RESERVED          (3072 * 4)
45 
46 #define VP_VEBOX_LACE_HISTOGRAM_256_BIN_PER_BLOCK          (256 * 2)
47 #define VP_NUM_RGB_CHANNEL                   3
48 #define VP_NUM_FRAME_PREVIOUS_CURRENT        2
49 
50 #define VP_VEBOX_MAX_SLICES_G12                           4
51 
52 #define VP_VEBOX_RGB_HISTOGRAM_SIZE_G12                   (VP_VEBOX_RGB_HISTOGRAM_SIZE_PER_SLICE * \
53                                                            VP_NUM_RGB_CHANNEL                    * \
54                                                            VP_VEBOX_MAX_SLICES_G12)
55 
56 #ifndef VEBOX_AUTO_DENOISE_SUPPORTED
57 #define VEBOX_AUTO_DENOISE_SUPPORTED    1
58 #endif
59 
60 //!
61 //! \brief Denoise Range
62 //!
63 #define NOISEFACTOR_MAX                                 64                      //!< Max Slider value
64 #define NOISEFACTOR_MID                                 32                      //!< Mid Slider value, SKL+ only
65 #define NOISEFACTOR_MIN                                 0                       //!< Min Slider value
66 
67 #define VP_VEBOX_RGB_HISTOGRAM_SIZE_PER_SLICE                (256 * 4)
68 #define VP_VEBOX_ACE_HISTOGRAM_SIZE_PER_FRAME_PER_SLICE      (256 * 4)
69 
70 //No matter how many vebox running, the histogram slice number is always 4.
71 //When there is only one VEBOX, 0 is written to the other histogram slices by HW.
72 #define VP_VEBOX_HISTOGRAM_SLICES_COUNT                      4
73 
74 #define VP_VEBOX_RGB_HISTOGRAM_SIZE                      (VP_VEBOX_RGB_HISTOGRAM_SIZE_PER_SLICE * \
75                                                           VP_NUM_RGB_CHANNEL                    * \
76                                                           VP_VEBOX_HISTOGRAM_SLICES_COUNT)
77 #define VP_VEBOX_RGB_ACE_HISTOGRAM_SIZE_RESERVED         (3072 * 4)
78 
79 //!
80 //! \brief Vebox Statistics Surface definition for TGL
81 //!
82 #define VP_VEBOX_STATISTICS_SIZE                          (32 * 8)
83 #define VP_VEBOX_STATISTICS_PER_FRAME_SIZE                (32 * sizeof(uint32_t))
84 #define VP_VEBOX_STATISTICS_SURFACE_FMD_OFFSET            0
85 #define VP_VEBOX_STATISTICS_SURFACE_GNE_OFFSET            0x2C
86 #define VP_VEBOX_STATISTICS_SURFACE_TGNE_OFFSET           0x5C
87 #define VP_VEBOX_STATISTICS_SURFACE_STD_OFFSET            0x44
88 
89 //!
90 //! \brief Spatial Denoise Definitions
91 //!
92 #define NOSIE_GNE_CHROMA_THRESHOLD                        1850
93 #define NOSIE_GNE_LUMA_THRESHOLD                          32000
94 #define NOSIE_GNE_RESOLUTION_THRESHOLD                    2073600  // size of 1080P
95 //!
96 //! \brief Temporal Denoise Definitions
97 //!
98 //!
99 #define NOISE_HISTORY_DELTA_DEFAULT                     8
100 #define NOISE_HISTORY_MAX_DEFAULT                       192
101 #define NOISE_NUMMOTIONPIXELS_THRESHOLD_DEFAULT         0
102 #define NOISE_LOWTEMPORALPIXELDIFF_THRESHOLD_DEFAULT    6
103 #define NOISE_TEMPORALPIXELDIFF_THRESHOLD_DEFAULT       12
104 #define NOISE_SUMABSTEMPORALDIFF_THRESHOLD_DEFAULT      128
105 
106 // Pixel Range Threshold Array Denoise Definitions for SKL+ 5x5 Bilateral Filter
107 #define NOISE_BLF_RANGE_THRESHOLD_ADP_NLVL          1
108 #define NOISE_BLF_RANGE_THRESHOLD_ADP_NLVL_MIN      65536
109 #define NOISE_BLF_RANGE_THRESHOLD_ADP_NLVL_MAX      393216
110 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI0          192
111 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI1          320
112 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI2          384
113 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI3          640
114 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI4          1024
115 #define NOISE_BLF_RANGE_THRESHOLD_NLVL_MI5          1280
116 #define NOISE_BLF_RANGE_THRADPDYNR_MIN              512
117 #define NOISE_BLF_RANGE_THRADPDYNR_MAX              2048
118 #define NOISE_BLF_RANGE_THRDYNR_MIN                 256
119 #define NOISE_BLF_RANGE_THRESHOLD_S0_MIN            32
120 #define NOISE_BLF_RANGE_THRESHOLD_S0_MID            192
121 #define NOISE_BLF_RANGE_THRESHOLD_S0_MAX            384
122 #define NOISE_BLF_RANGE_THRESHOLD_S1_MIN            64
123 #define NOISE_BLF_RANGE_THRESHOLD_S1_MID            256
124 #define NOISE_BLF_RANGE_THRESHOLD_S1_MAX            576
125 #define NOISE_BLF_RANGE_THRESHOLD_S2_MIN            128
126 #define NOISE_BLF_RANGE_THRESHOLD_S2_MID            512
127 #define NOISE_BLF_RANGE_THRESHOLD_S2_MAX            896
128 #define NOISE_BLF_RANGE_THRESHOLD_S3_MIN            128
129 #define NOISE_BLF_RANGE_THRESHOLD_S3_MID            640
130 #define NOISE_BLF_RANGE_THRESHOLD_S3_MAX            1280
131 #define NOISE_BLF_RANGE_THRESHOLD_S4_MIN            128
132 #define NOISE_BLF_RANGE_THRESHOLD_S4_MID            896
133 #define NOISE_BLF_RANGE_THRESHOLD_S4_MAX            1920
134 #define NOISE_BLF_RANGE_THRESHOLD_S5_MIN            128
135 #define NOISE_BLF_RANGE_THRESHOLD_S5_MID            1280
136 #define NOISE_BLF_RANGE_THRESHOLD_S5_MAX            2560
137 #define NOISE_BLF_RANGE_THRESHOLD_S0_DEFAULT        NOISE_BLF_RANGE_THRESHOLD_S0_MID
138 #define NOISE_BLF_RANGE_THRESHOLD_S1_DEFAULT        NOISE_BLF_RANGE_THRESHOLD_S1_MID
139 #define NOISE_BLF_RANGE_THRESHOLD_S2_DEFAULT        NOISE_BLF_RANGE_THRESHOLD_S2_MID
140 #define NOISE_BLF_RANGE_THRESHOLD_S3_DEFAULT        NOISE_BLF_RANGE_THRESHOLD_S3_MID
141 #define NOISE_BLF_RANGE_THRESHOLD_S4_DEFAULT        NOISE_BLF_RANGE_THRESHOLD_S4_MID
142 #define NOISE_BLF_RANGE_THRESHOLD_S5_DEFAULT        NOISE_BLF_RANGE_THRESHOLD_S5_MID
143 #define NOISE_BLF_RANGE_THRESHOLD_S0_AUTO_DEFAULT   192
144 #define NOISE_BLF_RANGE_THRESHOLD_S1_AUTO_DEFAULT   320
145 #define NOISE_BLF_RANGE_THRESHOLD_S2_AUTO_DEFAULT   384
146 #define NOISE_BLF_RANGE_THRESHOLD_S3_AUTO_DEFAULT   640
147 #define NOISE_BLF_RANGE_THRESHOLD_S4_AUTO_DEFAULT   1024
148 #define NOISE_BLF_RANGE_THRESHOLD_S5_AUTO_DEFAULT   1280
149 
150 // Pixel Range Weight Array Denoise Definitions for SKL+ 5x5 Bilateral Filter
151 #define NOISE_BLF_RANGE_WGTS0_MIN                   16
152 #define NOISE_BLF_RANGE_WGTS0_MID                   16
153 #define NOISE_BLF_RANGE_WGTS0_MAX                   16
154 #define NOISE_BLF_RANGE_WGTS1_MIN                   9
155 #define NOISE_BLF_RANGE_WGTS1_MID                   14
156 #define NOISE_BLF_RANGE_WGTS1_MAX                   15
157 #define NOISE_BLF_RANGE_WGTS2_MIN                   2
158 #define NOISE_BLF_RANGE_WGTS2_MID                   10
159 #define NOISE_BLF_RANGE_WGTS2_MAX                   13
160 #define NOISE_BLF_RANGE_WGTS3_MIN                   0
161 #define NOISE_BLF_RANGE_WGTS3_MID                   5
162 #define NOISE_BLF_RANGE_WGTS3_MAX                   10
163 #define NOISE_BLF_RANGE_WGTS4_MIN                   0
164 #define NOISE_BLF_RANGE_WGTS4_MID                   2
165 #define NOISE_BLF_RANGE_WGTS4_MAX                   7
166 #define NOISE_BLF_RANGE_WGTS5_MIN                   0
167 #define NOISE_BLF_RANGE_WGTS5_MID                   1
168 #define NOISE_BLF_RANGE_WGTS5_MAX                   4
169 #define NOISE_BLF_RANGE_WGTS0_DEFAULT               NOISE_BLF_RANGE_WGTS0_MID
170 #define NOISE_BLF_RANGE_WGTS1_DEFAULT               NOISE_BLF_RANGE_WGTS1_MID
171 #define NOISE_BLF_RANGE_WGTS2_DEFAULT               NOISE_BLF_RANGE_WGTS2_MID
172 #define NOISE_BLF_RANGE_WGTS3_DEFAULT               NOISE_BLF_RANGE_WGTS3_MID
173 #define NOISE_BLF_RANGE_WGTS4_DEFAULT               NOISE_BLF_RANGE_WGTS4_MID
174 #define NOISE_BLF_RANGE_WGTS5_DEFAULT               NOISE_BLF_RANGE_WGTS5_MID
175 
176 // Distance Weight Matrix Denoise Definitions for SKL+ 5x5 Bilateral Filter
177 #define NOISE_BLF_DISTANCE_WGTS00_DEFAULT           12
178 #define NOISE_BLF_DISTANCE_WGTS01_DEFAULT           12
179 #define NOISE_BLF_DISTANCE_WGTS02_DEFAULT           10
180 #define NOISE_BLF_DISTANCE_WGTS10_DEFAULT           12
181 #define NOISE_BLF_DISTANCE_WGTS11_DEFAULT           11
182 #define NOISE_BLF_DISTANCE_WGTS12_DEFAULT           10
183 #define NOISE_BLF_DISTANCE_WGTS20_DEFAULT           10
184 #define NOISE_BLF_DISTANCE_WGTS21_DEFAULT           10
185 #define NOISE_BLF_DISTANCE_WGTS22_DEFAULT           8
186 
187 //!
188 //! \brief Improved Deinterlacing for CNL+
189 //!
190 #define VPHAL_VEBOX_DI_CHROMA_TDM_WEIGHT_NATUAL                     0
191 #define VPHAL_VEBOX_DI_LUMA_TDM_WEIGHT_NATUAL                       4
192 #define VPHAL_VEBOX_DI_SHCM_DELTA_NATUAL                            5
193 #define VPHAL_VEBOX_DI_SHCM_THRESHOLD_NATUAL                        255
194 #define VPHAL_VEBOX_DI_SVCM_DELTA_NATUAL                            5
195 #define VPHAL_VEBOX_DI_SVCM_THRESHOLD_NATUAL                        255
196 #define VPHAL_VEBOX_DI_LUMA_TDM_CORING_THRESHOLD_NATUAL             0
197 #define VPHAL_VEBOX_DI_CHROMA_TDM_CORING_THRESHOLD_NATUAL           0
198 #define VPHAL_VEBOX_DI_DIRECTION_CHECK_THRESHOLD_NATUAL             3
199 #define VPHAL_VEBOX_DI_TEARING_LOW_THRESHOLD_NATUAL                 20
200 #define VPHAL_VEBOX_DI_TEARING_HIGH_THRESHOLD_NATUAL                100
201 #define VPHAL_VEBOX_DI_DIFF_CHECK_SLACK_THRESHOLD_NATUAL            15
202 #define VPHAL_VEBOX_DI_SAD_WT0_NATUAL                               0
203 #define VPHAL_VEBOX_DI_SAD_WT1_NATUAL                               63
204 #define VPHAL_VEBOX_DI_SAD_WT2_NATUAL                               76
205 #define VPHAL_VEBOX_DI_SAD_WT3_NATUAL                               89
206 #define VPHAL_VEBOX_DI_SAD_WT4_NATUAL                               114
207 #define VPHAL_VEBOX_DI_SAD_WT6_NATUAL                               217
208 #define VPHAL_VEBOX_DI_LPFWTLUT0_SD_NATUAL                          0
209 #define VPHAL_VEBOX_DI_LPFWTLUT0_HD_NATUAL                          0
210 #define VPHAL_VEBOX_DI_LPFWTLUT1_SD_NATUAL                          0
211 #define VPHAL_VEBOX_DI_LPFWTLUT1_HD_NATUAL                          0
212 #define VPHAL_VEBOX_DI_LPFWTLUT2_SD_NATUAL                          0
213 #define VPHAL_VEBOX_DI_LPFWTLUT2_HD_NATUAL                          0
214 #define VPHAL_VEBOX_DI_LPFWTLUT3_SD_NATUAL                          128
215 #define VPHAL_VEBOX_DI_LPFWTLUT3_HD_NATUAL                          0
216 #define VPHAL_VEBOX_DI_LPFWTLUT4_SD_NATUAL                          128
217 #define VPHAL_VEBOX_DI_LPFWTLUT4_HD_NATUAL                          32
218 #define VPHAL_VEBOX_DI_LPFWTLUT5_SD_NATUAL                          128
219 #define VPHAL_VEBOX_DI_LPFWTLUT5_HD_NATUAL                          64
220 #define VPHAL_VEBOX_DI_LPFWTLUT6_SD_NATUAL                          255
221 #define VPHAL_VEBOX_DI_LPFWTLUT6_HD_NATUAL                          128
222 #define VPHAL_VEBOX_DI_LPFWTLUT7_SD_NATUAL                          255
223 #define VPHAL_VEBOX_DI_LPFWTLUT7_HD_NATUAL                          255
224 
225 //!
226 //! \brief STE factor
227 //!
228 
229 #define MHW_STE_FACTOR_MAX                      9  // STE factor is 0 ~ 9
230 
231 // \brief   VEBOX 3DLUT HDR
232 #define LUT65_SEG_SIZE                                              65
233 #define LUT65_MUL_SIZE                                              128
234 #define LUT33_SEG_SIZE                                              33
235 #define LUT33_MUL_SIZE                                              64
236 #define VP_VEBOX_HDR_3DLUT65                                        LUT65_SEG_SIZE *\
237                                                                     LUT65_SEG_SIZE *\
238                                                                     LUT65_MUL_SIZE * sizeof(int64_t)
239 #define VP_VEBOX_HDR_3DLUT33                                        LUT33_SEG_SIZE *             \
240                                                                     LUT33_SEG_SIZE *     \
241                                                                     LUT33_MUL_SIZE * \
242                                                                     sizeof(int64_t)
243 #define SHAPE_1K_LOOKUP_SIZE                                        2048 * sizeof(uint32_t)
244 //!
245 //! \brief Vebox Statistics Surface definition
246 //!
247 #define VPHAL_VEBOX_STATISTICS_SIZE (32 * 8)
248 #define VPHAL_VEBOX_STATISTICS_SURFACE_GNE_OFFSET 0x2C
249 #define VPHAL_VEBOX_STATISTICS_SURFACE_STD_OFFSET 0x44
250 #define VPHAL_VEBOX_STATISTICS_PER_FRAME_SIZE (32 * sizeof(uint32_t))
251 #define VPHAL_VEBOX_STATISTICS_SURFACE_FMD_OFFSET 0
252 
253 //! \brief Number of LACE's PWLF surfaces
254 //!
255 #define VP_NUM_LACE_PWLF_SURFACES                                   2
256 
257 //!
258 //! \brief  Chroma Denoise params
259 //!
260 typedef struct _VPHAL_DNUV_PARAMS
261 {
262     uint32_t    dwHistoryInitUV;
263     uint32_t    dwHistoryDeltaUV;
264     uint32_t    dwHistoryMaxUV;
265     uint32_t    dwSTADThresholdU;
266     uint32_t    dwSTADThresholdV;
267     uint32_t    dwLTDThresholdU;
268     uint32_t    dwLTDThresholdV;
269     uint32_t    dwTDThresholdU;
270     uint32_t    dwTDThresholdV;
271 } VPHAL_DNUV_PARAMS, *PVPHAL_DNUV_PARAMS;
272 
273 //!
274 //! \brief  Structure to handle DNDI sampler states
275 //!
276 typedef struct _VP_SAMPLER_STATE_DN_PARAM
277 {
278     uint32_t  dwDenoiseASDThreshold;
279     uint32_t  dwDenoiseHistoryDelta;
280     uint32_t  dwDenoiseMaximumHistory;
281     uint32_t  dwDenoiseSTADThreshold;
282     uint32_t  dwDenoiseSCMThreshold;
283     uint32_t  dwDenoiseMPThreshold;
284     uint32_t  dwLTDThreshold;
285     uint32_t  dwTDThreshold;
286     uint32_t  dwGoodNeighborThreshold;
287 } VP_SAMPLER_STATE_DN_PARAM, *PVP_SAMPLER_STATE_DN_PARAM;
288 
289 namespace vp
290 {
291 typedef struct _VEBOX_PACKET_SURFACE_PARAMS
292 {
293     VP_SURFACE                      *pCurrInput;
294     VP_SURFACE                      *pPrevInput;
295     VP_SURFACE                      *pSTMMInput;
296     VP_SURFACE                      *pSTMMOutput;
297     VP_SURFACE                      *pDenoisedCurrOutput;
298     VP_SURFACE                      *pCurrOutput;           //!< Current Vebox Output
299     VP_SURFACE                      *pPrevOutput;
300     VP_SURFACE                      *pStatisticsOutput;
301     VP_SURFACE                      *pAlphaOrVignette;
302     VP_SURFACE                      *pLaceOrAceOrRgbHistogram;
303     VP_SURFACE                      *pSurfSkinScoreOutput;
304     VP_SURFACE                      *pFMDHistorySurface;
305     VP_SURFACE                      *pInnerTileConvertInput;
306 }VEBOX_PACKET_SURFACE_PARAMS, *PVEBOX_PACKET_SURFACE_PARAMS;
307 };
308 
309 enum MEDIASTATE_DNDI_FIELDCOPY_SELECT
310 {
311     MEDIASTATE_DNDI_DEINTERLACE     = 0,
312     MEDIASTATE_DNDI_FIELDCOPY_PREV  = 1,
313     MEDIASTATE_DNDI_FIELDCOPY_NEXT  = 2
314 };
315 
316 //!
317 //! \brief VPHAL Query Type for Vebox Statistics Surface
318 //!
319 typedef enum _VEBOX_STAT_QUERY_TYPE
320 {
321     VEBOX_STAT_QUERY_FMD_OFFEST = 0,
322     VEBOX_STAT_QUERY_WB_OFFEST,
323     VEBOX_STAT_QUERY_GNE_OFFEST,
324     VEBOX_STAT_QUERY_STD_OFFEST,
325     VEBOX_STAT_QUERY_GCC_OFFEST,
326     VEBOX_STAT_QUERY_PER_FRAME_SIZE
327 } VEBOX_STAT_QUERY_TYPE;
328 
329 //!
330 //! \brief  Feature specific cache control settings
331 //!
332 typedef struct _VP_VEBOX_CACHE_CNTL
333 {
334     // Input
335     bool                        bDnDi;
336     bool                        bLace;
337 
338     // Output
339     VPHAL_DNDI_CACHE_CNTL        DnDi;
340     VPHAL_LACE_CACHE_CNTL        Lace;
341 } VP_VEBOX_CACHE_CNTL, *PVP_VEBOX_CACHE_CNTL;
342 
343 namespace vp {
344 
345 class VpVeboxCmdPacket : virtual public VpVeboxCmdPacketBase
346 {
347 public:
348     VpVeboxCmdPacket(MediaTask * task, PVP_MHWINTERFACE hwInterface, PVpAllocator &allocator, VPMediaMemComp *mmc);
349 
350     virtual ~VpVeboxCmdPacket();
351 
352     virtual MOS_STATUS Submit(MOS_COMMAND_BUFFER* commandBuffer, uint8_t packetPhase = otherPacket) override;
353 
354     virtual MOS_STATUS Init() override;
355 
Destory()356     virtual MOS_STATUS Destory() { return MOS_STATUS_SUCCESS; };
357 
358     virtual MOS_STATUS Prepare() override;
359 
360     virtual MOS_STATUS PrepareState() override;
361 
AllocateExecRenderData()362     virtual MOS_STATUS                  AllocateExecRenderData()
363     {
364         MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
365 
366         if (!m_lastExecRenderData)
367         {
368             m_lastExecRenderData = MOS_New(VpVeboxRenderData);
369             if (!m_lastExecRenderData)
370             {
371                 return MOS_STATUS_NO_SPACE;
372             }
373 
374             eStatus = m_lastExecRenderData->Init();
375             if (eStatus != MOS_STATUS_SUCCESS)
376             {
377                 MOS_Delete(m_lastExecRenderData);
378             }
379 
380         }
381         return eStatus;
382     }
383 
GetLastExecRenderData()384     virtual VpVeboxRenderData *GetLastExecRenderData()
385     {
386         if (!m_lastExecRenderData)
387         {
388             AllocateExecRenderData();
389         }
390         return m_lastExecRenderData;
391     }
392 
IsIECPEnabled()393     virtual bool IsIECPEnabled()
394     {
395         if (GetLastExecRenderData() != NULL)
396         {
397            return GetLastExecRenderData()->IECP.IsIecpEnabled();
398         }
399         return false;
400     }
401 
402     virtual MOS_STATUS ValidateHDR3DLutParameters(bool is3DLutTableFilled);
403 
404     //!
405     //! \brief    Setup surface states for Vebox
406     //! \details  Setup surface states for use in the current Vebox Operation
407     //! \param    [in] bDiVarianceEnable
408     //!           Is DI/Variances report enabled
409     //! \param    [in,out] pVeboxSurfaceStateCmdParams
410     //!           Pointer to VEBOX_SURFACE_STATE command parameters
411     //! \return   void
412     //!
413     virtual MOS_STATUS SetupSurfaceStates(
414         PVP_VEBOX_SURFACE_STATE_CMD_PARAMS  pVeboxSurfaceStateCmdParams);
415 
416     //!
417     //! \brief    Setup surface states for Vebox
418     //! \details  Setup surface states for use in the current Vebox Operation
419     //! \param    [in] pRenderHal
420     //!           Pointer to Render Hal
421     //! \param    [in] CmdBuffer
422     //!           Pointer to command buffer
423     //! \param    [in] pGenericPrologParams
424     //!           pointer to Generic prolog params struct to send to cmd buffer header
425     //! \return   void
426     //!
427     virtual MOS_STATUS InitCmdBufferWithVeParams(
428         PRENDERHAL_INTERFACE                    pRenderHal,
429         MOS_COMMAND_BUFFER                      &CmdBuffer,
430         PRENDERHAL_GENERIC_PROLOG_PARAMS        pGenericPrologParams);
431 
432     //!
433     //! \brief    Setup Scaling Params for Vebox/SFC
434     //! \details  Setup surface Scaling Params for Vebox/SFC
435     //! \param    [in] scalingParams
436     //!           Scaling Params
437     //! \return   MOS_STATUS
438     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
439     //!
440     virtual MOS_STATUS SetScalingParams(PSFC_SCALING_PARAMS scalingParams) override;
441 
442     //!
443     //! \brief    Setup CSC Params for Vebox/SFC
444     //! \details  Setup surface CSC Params for Vebox/SFC
445     //! \param    [in] cscParams
446     //!           CSC/IEF Params
447     //! \return   MOS_STATUS
448     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
449     //!
450     virtual MOS_STATUS SetSfcCSCParams(PSFC_CSC_PARAMS cscParams) override;
451 
452     //!
453     //! \brief    Setup CSC Params for Vebox back end
454     //! \details  Setup surface CSC Params for Vebox
455     //! \param    [in] cscParams
456     //!           CSC Params
457     //! \return   MOS_STATUS
458     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
459     //!
460     virtual MOS_STATUS SetVeboxBeCSCParams(PVEBOX_CSC_PARAMS cscParams) override;
461 
462     //!
463     //! \brief    Setup Vebox Output Alpha Value
464     //! \details  Setup Vebox Output Alpha Value
465     //! \param    [in] cscParams
466     //!           CSC Params
467     //! \return   MOS_STATUS
468     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
469     //!
470     virtual MOS_STATUS SetVeboxOutputAlphaParams(PVEBOX_CSC_PARAMS cscParams) ;
471 
472     //!
473     //! \brief    Setup Vebox Chroma sub sampling
474     //! \details  Setup Vebox Chroma sub sampling
475     //! \param    [in] cscParams
476     //!           CSC Params
477     //! \return   MOS_STATUS
478     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
479     //!
480     virtual MOS_STATUS SetVeboxChromasitingParams(PVEBOX_CSC_PARAMS cscParams);
481 
482     //!
483     //! \brief    Setup Roattion/Mirror Params for Vebox/SFC
484     //! \details  Setup surface Roattion/Mirror Params for Vebox/SFC
485     //! \param    [in] rotMirParams
486     //!           Rotation/Mirror Params
487     //! \return   MOS_STATUS
488     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
489     //!
490     virtual MOS_STATUS SetSfcRotMirParams(PSFC_ROT_MIR_PARAMS rotMirParams) override;
491 
492     //!
493     //! \brief    Setup DN Params for Vebox
494     //! \details  Setup surface DN Params for Vebox
495     //! \param    [in] dnParams
496     //!           DN Params
497     //! \return   MOS_STATUS
498     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
499     //!
500     virtual MOS_STATUS SetDnParams(PVEBOX_DN_PARAMS dnParams) override;
501 
502     //!
503     //! \brief    Setup STE Params for Vebox
504     //! \details  Setup surface STE Params for Vebox
505     //! \param    [in] steParams
506     //!           STE Params
507     //! \return   MOS_STATUS
508     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
509     //!
510     virtual MOS_STATUS SetSteParams(PVEBOX_STE_PARAMS steParams) override;
511 
512     //!
513     //! \brief    Setup HDR Params for Vebox
514     //! \details  Setup surface HDR Params for Vebox
515     //! \param    [in] HDRParams
516     //!           HDR Params
517     //! \return   MOS_STATUS
518     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
519     //!
520     virtual MOS_STATUS SetHdrParams(PVEBOX_HDR_PARAMS hdrParams) override;
521 
522     //!
523     //! \brief    Setup TCC Params for Vebox
524     //! \details  Setup surface TCC Params for Vebox
525     //! \param    [in] tccParams
526     //!           TCC Params
527     //! \return   MOS_STATUS
528     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
529     //!
530     virtual MOS_STATUS SetTccParams(PVEBOX_TCC_PARAMS tccParams) override;
531 
532     //!
533     //! \brief    Setup Procamp Params for Vebox
534     //! \details  Setup surface Procamp Params for Vebox
535     //! \param    [in] procampParams
536     //!           Procamp Params
537     //! \return   MOS_STATUS
538     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
539     //!
540     virtual MOS_STATUS SetProcampParams(PVEBOX_PROCAMP_PARAMS procampParams) override;
541 
542     //!
543     //! \brief    Setup DI Params for Vebox
544     //! \details  Setup surface DN Params for Vebox
545     //! \param    [in] diParams
546     //!           DI Params
547     //! \return   MOS_STATUS
548     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
549     //!
550     virtual MOS_STATUS SetDiParams(PVEBOX_DI_PARAMS diParams) override;
551     virtual MOS_STATUS ConfigureSteParams(VpVeboxRenderData *renderData, bool bEnableSte, uint32_t dwSTEFactor, bool bEnableStd, uint32_t stdParaSizeInBytes, void *stdParams);
552 
553     //!
554     //! \brief    Setup CGC Params for Vebox
555     //! \details  Setup surface CGC Params for Vebox
556     //! \param    [in] cgcParams
557     //!           CGC Params
558     //! \return   MOS_STATUS
559     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
560     //!
561     virtual MOS_STATUS SetCgcParams(PVEBOX_CGC_PARAMS cgcParams) override;
562     virtual MOS_STATUS ConfigureTccParams(VpVeboxRenderData *renderData, bool bEnableTcc, uint8_t magenta, uint8_t red, uint8_t yellow, uint8_t green, uint8_t cyan, uint8_t blue);
563     virtual MOS_STATUS ConfigureProcampParams(VpVeboxRenderData *renderData, bool bEnableProcamp, float fBrightness, float fContrast, float fHue, float fSaturation);
564     virtual MOS_STATUS ConfigureDenoiseParams(VpVeboxRenderData *renderData, float fDenoiseFactor);
565 
566     virtual MOS_STATUS UpdateCscParams(FeatureParamCsc &params) override;
567     virtual MOS_STATUS UpdateDenoiseParams(FeatureParamDenoise &params) override;
568     virtual MOS_STATUS UpdateTccParams(FeatureParamTcc &params) override;
569     virtual MOS_STATUS UpdateSteParams(FeatureParamSte &params) override;
570     virtual MOS_STATUS UpdateProcampParams(FeatureParamProcamp &params) override;
571 
572     virtual void AddCommonOcaMessage(PMOS_COMMAND_BUFFER pCmdBufferInUse, MOS_CONTEXT_HANDLE pOsContext, PMOS_INTERFACE pOsInterface, PRENDERHAL_INTERFACE pRenderHal, PMHW_MI_MMIOREGISTERS pMmioRegisters);
573     //!
574     //! \brief    Get DN luma parameters
575     //! \details  Get DN luma parameters
576     //! \param    [in] bDnEnabled
577     //!           true if DN being enabled
578     //! \param    [in] bAutoDetect
579     //!           true if auto DN being enabled
580     //! \param    [in] fDnFactor
581     //!           DN factor
582     //! \param    [in] bRefValid
583     //!           true if reference surface available
584     //! \param    [out] pLumaParams
585     //!           DN luma parameters
586     //! \return   MOS_STATUS
587     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
588     //!
GetDnLumaParams(bool bDnEnabled,bool bAutoDetect,float fDnFactor,bool bRefValid,PVP_SAMPLER_STATE_DN_PARAM pLumaParams)589     virtual MOS_STATUS GetDnLumaParams(
590         bool                        bDnEnabled,
591         bool                        bAutoDetect,
592         float                       fDnFactor,
593         bool                        bRefValid,
594         PVP_SAMPLER_STATE_DN_PARAM  pLumaParams) { return MOS_STATUS_SUCCESS; }
595 
596     //!
597     //! \brief    Get DN chroma parameters
598     //! \details  Get DN chroma parameters
599     //! \param    [in] bChromaDenoise
600     //!           true if chroma DN being enabled
601     //! \param    [in] bAutoDetect
602     //!           true if auto DN being enabled
603     //! \param    [in] fDnFactor
604     //!           DN factor
605     //! \param    [out] pChromaParams
606     //!           DN chroma parameters
607     //! \return   MOS_STATUS
608     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
609     //!
GetDnChromaParams(bool bChromaDenoise,bool bAutoDetect,float fDnFactor,PVPHAL_DNUV_PARAMS pChromaParams)610     virtual MOS_STATUS GetDnChromaParams(
611         bool                        bChromaDenoise,
612         bool                        bAutoDetect,
613         float                       fDnFactor,
614         PVPHAL_DNUV_PARAMS          pChromaParams) { return MOS_STATUS_SUCCESS; }
615 
616     //!
617     //! \brief    Config DN luma pix range
618     //! \details  Config DN luma pix range threshold and weight
619     //! \param    [in] bDnEnabled
620     //!           true if DN being enabled
621     //! \param    [in] bAutoDetect
622     //!           true if auto DN being enabled
623     //! \param    [in] fDnFactor
624     //!           DN factor
625     //! \return   MOS_STATUS
626     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
627     //!
ConfigLumaPixRange(bool bDnEnabled,bool bAutoDetect,float fDnFactor)628     virtual MOS_STATUS ConfigLumaPixRange(
629         bool                        bDnEnabled,
630         bool                        bAutoDetect,
631         float                       fDnFactor) { return MOS_STATUS_SUCCESS; }
632 
633     //!
634     //! \brief    Config DN chroma pix range
635     //! \details  Config DN chroma pix range threshold and weight
636     //! \param    [in] bChromaDenoise
637     //!           true if chroma DN being enabled
638     //! \param    [in] bAutoDetect
639     //!           true if auto DN being enabled
640     //! \param    [in] fDnFactor
641     //!           DN factor
642     //! \return   MOS_STATUS
643     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
644     //!
ConfigChromaPixRange(bool bChromaDenoise,bool bAutoDetect,float fDnFactor)645     virtual MOS_STATUS ConfigChromaPixRange(
646         bool                        bChromaDenoise,
647         bool                        bAutoDetect,
648         float                       fDnFactor) { return MOS_STATUS_SUCCESS; }
649 
650     virtual MOS_STATUS InitSTMMHistory();
651 
652     //!
653     //! \brief    Vebox Populate VEBOX parameters
654     //! \details  Populate the Vebox VEBOX state parameters to VEBOX RenderData
655     //! \param    [in] bDnEnabled
656     //!           true if DN being enabled
657     //! \param    [in] bChromaDenoise
658     //!           true if chroma DN being enabled
659     //! \param    [in] pLumaParams
660     //!           Pointer to Luma DN and DI parameter
661     //! \param    [in] pChromaParams
662     //!           Pointer to Chroma DN parameter
663     //! \return   MOS_STATUS
664     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
665     //!
666     virtual MOS_STATUS ConfigDnLumaChromaParams(
667         bool                            bDnEnabled,
668         bool                            bChromaDenoise,
669         PVP_SAMPLER_STATE_DN_PARAM      pLumaParams,
670         PVPHAL_DNUV_PARAMS              pChromaParams
671         );
672 
673     //!
674     //! \brief    Calculate offsets of statistics surface address based on the
675     //!           functions which were enabled in the previous call,
676     //!           and store the width and height of the per-block statistics into DNDI_STATE
677     //! \details
678     //! Layout of Statistics surface when Temporal DI enabled
679     //!     --------------------------------------------------------------\n
680     //!     | 16 bytes for x=0, Y=0       | 16 bytes for x=16, Y=0       | ...\n
681     //!     |-------------------------------------------------------------\n
682     //!     | 16 bytes for x=0, Y=4       | ...\n
683     //!     |------------------------------\n
684     //!     | ...\n
685     //!     |------------------------------\n
686     //!     | 16 bytes for x=0, Y=height-4| ...\n
687     //!     |-----------------------------------------------Pitch----------------------------------------------------------\n
688     //!     | 256 DW of ACE histogram Slice 0 (Previous)| 17 DW Reserved         | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
689     //!     |--------------------------------------------------------------------------------------------------------------\n
690     //!     | 256 DW of ACE histogram Slice 0 (Current) | 11 DW FMD0 | 6 DW GNE0 | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
691     //!     |--------------------------------------------------------------------------------------------------------------\n
692     //!     | 256 DW of ACE histogram Slice 1 (Previous)| 17 DW Reserved         | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
693     //!     |--------------------------------------------------------------------------------------------------------------\n
694     //!     | 256 DW of ACE histogram Slice 1 (Current) | 11 DW FMD1 | 6 DW GNE1 | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
695     //!     ---------------------------------------------------------------------------------------------------------------\n
696     //!
697     //! Layout of Statistics surface when DN or Spatial DI enabled (and Temporal DI disabled)
698     //!     --------------------------------------------------------------\n
699     //!     | 16 bytes for x=0, Y=0       | 16 bytes for x=16, Y=0       | ...\n
700     //!     |-------------------------------------------------------------\n
701     //!     | 16 bytes for x=0, Y=4       | ...\n
702     //!     |------------------------------\n
703     //!     | ...\n
704     //!     |------------------------------\n
705     //!     | 16 bytes for x=0, Y=height-4| ...\n
706     //!     |-----------------------------------------------Pitch----------------------------------------------------------\n
707     //!     | 256 DW of ACE histogram Slice 0 (Input)   | 11 DW FMD0 | 6 DW GNE0 | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
708     //!     |--------------------------------------------------------------------------------------------------------------\n
709     //!     | 256 DW of ACE histogram Slice 1 (Input)   | 11 DW FMD1 | 6 DW GNE1 | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
710     //!     ---------------------------------------------------------------------------------------------------------------\n
711     //!
712     //! Layout of Statistics surface when both DN and DI are disabled
713     //!     ------------------------------------------------Pitch----------------------------------------------------------\n
714     //!     | 256 DW of ACE histogram Slice 0 (Input)   | 17 DW Reserved         | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
715     //!     |--------------------------------------------------------------------------------------------------------------\n
716     //!     | 256 DW of ACE histogram Slice 1 (Input)   | 17 DW Reserved         | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
717     //!     ---------------------------------------------------------------------------------------------------------------\n
718     //! \param    [out] pStatSlice0Offset
719     //!           Statistics surface Slice 0 base pointer
720     //! \param    [out] pStatSlice1Offset
721     //!           Statistics surface Slice 1 base pointer
722     //! \return   MOS_STATUS
723     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
724     //!
725     virtual MOS_STATUS GetStatisticsSurfaceOffsets(
726         int32_t*                            pStatSlice0Offset,
727         int32_t*                            pStatSlice1Offset);
728 
729     //!
730     //! \brief    Configure FMD parameter
731     //! \details  Configure FMD parameters for DNDI State
732     //! \param    [in] bProgressive
733     //!           true if sample being progressive
734     //! \param    [in] bAutoDenoise
735     //!           true if auto denoise being enabled
736     //! \param    [out] pLumaParams
737     //!           Pointer to DNDI Param for set FMD parameters
738     //! \return   MOS_STATUS
739     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
740     //!
741     virtual MOS_STATUS ConfigFMDParams(bool bProgressive, bool bAutoDenoise, bool bFmdEnabled);
742 
743     //!
744     //! \brief    Setup Vebox_State Command parameter
745     //! \param    [in,out] pVeboxStateCmdParams
746     //!           Pointer to VEBOX_STATE command parameters
747     //! \return   MOS_STATUS
748     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
749     //!
750     virtual MOS_STATUS SetupVeboxState(mhw::vebox::VEBOX_STATE_PAR& veboxStateCmdParams);
751 
752     //!
753     //! \brief    Setup Vebox_DI_IECP Command params
754     //! \details  Setup Vebox_DI_IECP Command params
755     //! \param    [in] bDiScdEnable
756     //!           Is DI/Variances report enabled
757     //! \param    [in,out] pVeboxDiIecpCmdParams
758     //!           Pointer to VEBOX_DI_IECP command parameters
759     //! \return   MOS_STATUS
760     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
761     //!
762     virtual MOS_STATUS SetupDiIecpState(
763         bool                        bDiScdEnable,
764         mhw::vebox::VEB_DI_IECP_PAR &veboxDiIecpCmdParam);
765 
766     //!
767     //! \brief    Check Vebox using kernel resource or not
768     //! \details  Check Vebox using kernel resource or not
769     //! \return   bool
770     //!           Return true if use kernel resource
771     //!
772     virtual bool UseKernelResource();
773 
774     //!
775     //! \brief    Vebox send Vebox ring HW commands
776     //! \details  Send Vebox ring Commands.
777     //! \return   MOS_STATUS
778     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
779     //!
780     virtual MOS_STATUS SendVeboxCmd(MOS_COMMAND_BUFFER* commandBuffer);
781 
782     //!
783     //! \brief    enable or disable SFC output path.
784     //! \details  enable or disable SFC output path
785     //! \return   void
786     //!
SetSfcOutputPath(bool bSfcUsed)787     virtual void SetSfcOutputPath(bool bSfcUsed) { m_IsSfcUsed = bSfcUsed; };
788 
GetSfcRenderInstance()789     virtual SfcRenderBase* GetSfcRenderInstance() { return m_sfcRender; };
790 
791     virtual MOS_STATUS PacketInit(
792         VP_SURFACE                          *inputSurface,
793         VP_SURFACE                          *outputSurface,
794         VP_SURFACE                          *previousSurface,
795         VP_SURFACE_SETTING                  &surfSetting,
796         VP_EXECUTE_CAPS                     packetCaps) override;
797 
798     virtual MOS_STATUS SetUpdatedExecuteResource(
799         VP_SURFACE                          *inputSurface,
800         VP_SURFACE                          *outputSurface,
801         VP_SURFACE                          *previousSurface,
802         VP_SURFACE_SETTING                  &surfSetting) override;
803 
804     //!
805     //! \brief    Check whether the Vebox command parameters are correct
806     //! \param    [in] VeboxStateCmdParams
807     //!           MHW vebox state cmd params
808     //! \param    [in] VeboxDiIecpCmdParams
809     //!           DiIecpCmd params struct
810     //! \return   MOS_STATUS
811     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
812     //!
813     virtual MOS_STATUS IsCmdParamsValid(
814         const mhw::vebox::VEBOX_STATE_PAR           &veboxStateCmdParams,
815         const mhw::vebox::VEB_DI_IECP_PAR           &veboxDiIecpCmdParams,
816         const VP_VEBOX_SURFACE_STATE_CMD_PARAMS  &VeboxSurfaceStateCmdParams);
817 
QueryStatLayout(VEBOX_STAT_QUERY_TYPE QueryType,uint32_t * pQuery)818     virtual MOS_STATUS QueryStatLayout(
819         VEBOX_STAT_QUERY_TYPE QueryType,
820         uint32_t*             pQuery) {return MOS_STATUS_SUCCESS;};
821 
822     //!
823     //! \brief    Determine if the Batch Buffer End is needed to add in the end
824     //! \details  Detect platform OS and return the flag whether the Batch Buffer End is needed to add in the end
825     //! \param    [in] pOsInterface
826     //!           Pointer to MOS_INTERFACE
827     //! \return   bool
828     //!           The flag of adding Batch Buffer End
829     //!
830     virtual bool RndrCommonIsMiBBEndNeeded(
831         PMOS_INTERFACE           pOsInterface);
832 
833     //!
834     //! \brief    Vebox perftag
835     //! \details  set vebox perftag
836     //! \return   MOS_STATUS
837     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
838     //!
839     virtual MOS_STATUS VeboxSetPerfTag();
840 
841     //!
842     //! \brief    Vebox perftag for NV12 source
843     //! \details  set vebox perftag for NV12 source
844     //! \return   MOS_STATUS
845     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
846     //!
847     virtual MOS_STATUS VeboxSetPerfTagNv12();
848 
849     //!
850     //! \brief    Vebox perftag for Pa format source
851     //! \details  set vebox perftag for Pa format source
852     //! \return   MOS_STATUS
853     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
854     //!
855     virtual MOS_STATUS VeboxSetPerfTagPaFormat();
856 
857     //!
858     //! \brief    Vebox state heap update for auto mode features
859     //! \details  Update Vebox indirect states for auto mode features
860     //! \return   MOS_STATUS
861     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
862     //!
863     virtual MOS_STATUS UpdateVeboxStates();
864 
865     //! \brief    Vebox get statistics surface base
866     //! \details  Calculate address of statistics surface address based on the
867     //!           functions which were enabled in the previous call.
868     //! \param    uint8_t* pStat
869     //!           [in] Pointer to Statistics surface
870     //! \param    uint8_t* * pStatSlice0Base
871     //!           [out] Statistics surface Slice 0 base pointer
872     //! \param    uint8_t* * pStatSlice1Base
873     //!           [out] Statistics surface Slice 1 base pointer
874     //! \return   MOS_STATUS
875     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
876     //!
877     virtual MOS_STATUS GetStatisticsSurfaceBase(
878         uint8_t  *pStat,
879         uint8_t **pStatSlice0Base,
880         uint8_t **pStatSlice1Base);
881 
882     virtual MOS_STATUS QueryStatLayoutGNE(
883         VEBOX_STAT_QUERY_TYPE QueryType,
884         uint32_t             *pQuery,
885         uint8_t              *pStatSlice0Base,
886         uint8_t              *pStatSlice1Base);
887 
888     virtual MOS_STATUS CheckTGNEValid(
889         uint32_t *pStatSlice0GNEPtr,
890         uint32_t *pStatSlice1GNEPtr,
891         uint32_t *pQuery);
892     //!
893     //! \brief    Vebox update HVS DN states
894     //! \details  CPU update for VEBOX DN states
895     //! \param    bDnEnabled
896     //!           [in] true if DN enabled
897     //! \param    bChromaDenoise
898     //!           [in] true if chroma DN enabled
899     //! \param    bAutoDenoise
900     //!           [in] true if auto DN enabled
901     //! \param    uint32_t* pStatSlice0GNEPtr
902     //!           [out] Pointer to Vebox slice0 GNE data
903     //! \param    uint32_t* pStatSlice1GNEPtr
904     //!           [out] Pointer to Vebox slice1 GNE data
905     //! \return   MOS_STATUS
906     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
907     //!
908     virtual MOS_STATUS UpdateDnHVSParameters(
909         uint32_t *pStatSlice0GNEPtr,
910         uint32_t *pStatSlice1GNEPtr);
911 
912     //!
913     //! \brief    Vebox state adjust boundary for statistics surface
914     //! \details  Adjust boundary for statistics surface block
915     //! \return   MOS_STATUS
916     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
917     //!
918     virtual MOS_STATUS AdjustBlockStatistics();
919 
920     virtual MOS_STATUS GNELumaConsistentCheck(
921         uint32_t &dwGNELuma,
922         uint32_t *pStatSlice0GNEPtr,
923         uint32_t *pStatSlice1GNEPtr);
924 
925     MOS_STATUS InitVeboxSurfaceStateCmdParamsForTileConvert(
926         PMHW_VEBOX_SURFACE_STATE_CMD_PARAMS mhwVeboxSurfaceStateCmdParams,
927         PMOS_SURFACE                        inputSurface,
928         PMOS_SURFACE                        outputSurface);
929 
930     MOS_STATUS AddTileConvertStates(
931         MOS_COMMAND_BUFFER *CmdBuffer,
932         MHW_VEBOX_SURFACE_STATE_CMD_PARAMS &MhwVeboxSurfaceStateCmdParams);
933 
934     MOS_FORMAT AdjustFormatForTileConvert(MOS_FORMAT format);
935     // TGNE
936     uint32_t dwGlobalNoiseLevel_Temporal  = 0;  //!< Global Temporal Noise Level for Y
937     uint32_t dwGlobalNoiseLevelU_Temporal = 0;  //!< Global Temporal Noise Level for U
938     uint32_t dwGlobalNoiseLevelV_Temporal = 0;  //!< Global Temporal Noise Level for V
939     uint32_t curNoiseLevel_Temporal       = 0;  //!< Temporal Noise Level for Y
940     uint32_t curNoiseLevelU_Temporal      = 0;  //!< Temporal Noise Level for U
941     uint32_t curNoiseLevelV_Temporal      = 0;  //!< Temporal Noise Level for V
942     bool     m_bTgneEnable                = true;
943     bool     m_bTgneValid                 = false;
944     bool     m_bFallback                  = false;
945 
946     mhw::vebox::MHW_VEBOX_CHROMA_PARAMS veboxChromaParams = {};
947 
948 #if (_DEBUG || _RELEASE_INTERNAL)
StallBatchBuffer(PMOS_COMMAND_BUFFER cmdBuffer)949     virtual MOS_STATUS StallBatchBuffer(
950         PMOS_COMMAND_BUFFER cmdBuffer)
951     {
952         return MOS_STATUS_SUCCESS;
953     }
954 #endif
955 
956 protected:
957 
958     //!
959     //! \brief    Doing prepare stage tasks for SendVeboxCmd
960     //!           Parameters might remain unchanged in case
961     //! \param    [out] CmdBuffer
962     //!           reference to Cmd buffer control struct
963     //! \param    [out] GenericPrologParams
964     //!           GpuStatusBuffer resource to be set
965     //! \param    [out] iRemaining
966     //!           integer showing initial cmd buffer usage
967     //! \return   MOS_STATUS
968     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
969     //!
970    virtual MOS_STATUS PrepareVeboxCmd(
971       MOS_COMMAND_BUFFER*                      CmdBuffer,
972       RENDERHAL_GENERIC_PROLOG_PARAMS&         GenericPrologParams,
973       int32_t&                                 iRemaining);
974 
975     //!
976     //! \brief    Render the Vebox Cmd buffer for SendVeboxCmd
977     //!           Parameters might remain unchanged in case
978     //! \param    [in,out] CmdBuffer
979     //!           reference to Cmd buffer control struct
980     //! \param    [out] VeboxDiIecpCmdParams
981     //!           DiIecpCmd params struct to be set
982     //! \param    [out] VeboxSurfaceStateCmdParams
983     //!           VPHAL surface state cmd to be set
984     //! \param    [out] MhwVeboxSurfaceStateCmdParams
985     //!           MHW surface state cmd to be set
986     //! \param    [out] VeboxStateCmdParams
987     //!           MHW vebox state cmd to be set
988     //! \param    [out] FlushDwParams
989     //!           MHW MI_FLUSH_DW cmd to be set
990     //! \param    [in] pGenericPrologParams
991     //!           pointer to Generic prolog params struct to send to cmd buffer header
992     //! \return   MOS_STATUS
993     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
994     //!
995     virtual MOS_STATUS RenderVeboxCmd(
996         MOS_COMMAND_BUFFER                      *CmdBuffer,
997         VP_VEBOX_SURFACE_STATE_CMD_PARAMS    &VeboxSurfaceStateCmdParams,
998         MHW_VEBOX_SURFACE_STATE_CMD_PARAMS      &MhwVeboxSurfaceStateCmdParams,
999         MHW_MI_FLUSH_DW_PARAMS                  &FlushDwParams,
1000         PRENDERHAL_GENERIC_PROLOG_PARAMS        pGenericPrologParams);
1001 
1002     //!
1003     //! \brief    handle Cmd buffer's offset when error occur
1004     //! \details  handle Cmd buffer's offset when error occur
1005     //! \param    [in,out] CmdBuffer
1006     //!           reference to Cmd buffer control struct
1007     //! \return   void
1008     void CmdErrorHanlde(
1009         MOS_COMMAND_BUFFER  *CmdBuffer,
1010         int32_t             &iRemaining);
1011 
1012     //!
1013     //! \brief    Send Vecs Status Tag
1014     //! \details  Add MI Flush with write back into command buffer for GPU to write
1015     //!           back GPU Tag. This should be the last command in 1st level batch.
1016     //!           This ensures sync tag will be written after rendering is complete.
1017     //! \param    [in] pOsInterface
1018     //!           Pointer to OS Interface
1019     //! \param    [out] pCmdBuffer
1020     //!           Pointer to Command Buffer
1021     //! \return   MOS_STATUS
1022     //!
1023     MOS_STATUS SendVecsStatusTag(
1024       PMOS_INTERFACE                      pOsInterface,
1025       PMOS_COMMAND_BUFFER                 pCmdBuffer);
1026 
1027     virtual MOS_STATUS InitVeboxSurfaceStateCmdParams(
1028         PVP_VEBOX_SURFACE_STATE_CMD_PARAMS    pVpHalVeboxSurfaceStateCmdParams,
1029         PMHW_VEBOX_SURFACE_STATE_CMD_PARAMS      pMhwVeboxSurfaceStateCmdParams);
1030 
1031     virtual MOS_STATUS InitVeboxSurfaceParams(
1032         PVP_SURFACE                     pVpHalVeboxSurface,
1033         PMHW_VEBOX_SURFACE_PARAMS       pMhwVeboxSurface);
1034 
1035     //!
1036     //! \brief    Copy Surface value
1037     //! \param    [in] pTargetSurface
1038     //!           Pointer to surface copy value to
1039     //! \param    [in] pSourceSurface
1040     //!           Pointer to surface copy value from
1041     //! \return   void
1042     //!
1043     virtual void CopySurfaceValue(
1044       PVP_SURFACE                 pTargetSurface,
1045       PVP_SURFACE                 pSourceSurface);
1046 
1047     //!
1048     //! \brief    Add vebox DNDI state
1049     //! \details  Add vebox DNDI state
1050     //! \return   MOS_STATUS
1051     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
1052     //!
1053     virtual MOS_STATUS AddVeboxDndiState();
1054 
1055     //!
1056     //! \brief    Add vebox IECP state
1057     //! \details  Add vebox IECP state
1058     //! \return   MOS_STATUS
1059     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
1060     //!
1061     virtual MOS_STATUS AddVeboxIECPState();
1062 
1063     //!
1064     //! \brief    Add vebox Hdr state
1065     //! \details  Add vebox Hdr state
1066     //! \return   MOS_STATUS
1067     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
1068     //!
1069     virtual MOS_STATUS AddVeboxHdrState();
1070 
1071     virtual bool IsVeboxGamutStateNeeded();
1072 
1073     //!
1074     //! \brief    Add vebox Gamut state
1075     //! \details  Add vebox Gamut state
1076     //! \return   MOS_STATUS
1077     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
1078     //!
1079     virtual MOS_STATUS AddVeboxGamutState();
1080 
1081     //!
1082     //! \brief    Vebox set up vebox state heap
1083     //! \details  Setup Vebox indirect states: DNDI and etc
1084     //! \return   MOS_STATUS
1085     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
1086     //!
1087     virtual MOS_STATUS SetupIndirectStates();
1088 
1089     //!
1090     //! \brief    Vebox get the back-end colorspace conversion matrix
1091     //! \details  When the i/o is A8R8G8B8 or X8R8G8B8, the transfer matrix
1092     //!           needs to be updated accordingly
1093     //! \param    [in] inputColorSpace
1094     //!           color space of vebox input surface
1095     //! \param    [in] outputColorSpace
1096     //!           color space of vebox output surface
1097     //! \param    [in] inputFormat
1098     //!           format of vebox input surface
1099     //! \return   void
1100     //!
1101     virtual void VeboxGetBeCSCMatrix(
1102         VPHAL_CSPACE    inputColorSpace,
1103         VPHAL_CSPACE    outputColorSpace,
1104         MOS_FORMAT      inputFormat);
1105 
1106     virtual MOS_STATUS SetDiParams(
1107         bool                    bDiEnabled,
1108         bool                    bSCDEnabled,
1109         bool                    bHDContent,
1110         VPHAL_SAMPLE_TYPE       sampleTypeInput,
1111         MHW_VEBOX_DNDI_PARAMS   &param);
1112 
1113     bool IsTopField(VPHAL_SAMPLE_TYPE sampleType);
1114     bool IsTopFieldFirst(VPHAL_SAMPLE_TYPE sampleType);
1115 
1116     //!
1117     //! \brief    Get surface by type
1118     //! \details  Get surface by type
1119     //! \param    [in] type
1120     //!           surface type
1121     //! \return   VP_SURFACE*
1122     //!           Pointer to surface of specified type
1123     //!
1124     virtual VP_SURFACE* GetSurface(SurfaceType type);
1125 
1126     virtual MOS_STATUS InitSurfMemCacheControl(VP_EXECUTE_CAPS packetCaps);
1127 
1128     virtual MHW_CSPACE VpHalCspace2MhwCspace(VPHAL_CSPACE cspace);
1129 
1130     virtual MOS_STATUS SetupDNTableForHVS(
1131         mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams);
1132 
1133     virtual MOS_STATUS SetupHDRLuts(
1134         mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams);
1135     virtual MOS_STATUS Init3DLutTable(PVP_SURFACE surf3DLut);
1136     void    UpdateCpPrepareResources();
1137     virtual MOS_STATUS Add1DLutState(PVP_SURFACE &surface, PMHW_1DLUT_PARAMS p1DLutParams);
1138     virtual MOS_STATUS SetupVebox3DLutForHDR(
1139         mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams);
SetupVeboxFP16State(mhw::vebox::VEBOX_STATE_PAR & veboxStateCmdParams)1140     virtual MOS_STATUS SetupVeboxFP16State(mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams)
1141     {
1142         return MOS_STATUS_SUCCESS;
1143     }
1144 
1145     virtual MOS_STATUS SetupHDRUnifiedForHDR(
1146         mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams);
1147 
1148     virtual MOS_STATUS SetupVeboxExternal3DLutforHDR(
1149         mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams);
1150 
1151 private:
1152 
1153     //!
1154     //! \brief    IsFormatMMCSupported
1155     //! \details  Check if the format of vebox output surface is supported by MMC
1156     //! \param    [in] Format
1157     //! \return   bool  true if suported, otherwise not supported
1158     //!
1159     bool IsFormatMMCSupported(
1160         MOS_FORMAT                  Format);
1161 
1162     //!
1163     //! \brief    SetSfcMmcParams
1164     //! \details  set sfc state mmc related params
1165     //! \return   bool  success if succeeded, otherwise failure
1166     //!
1167     virtual MOS_STATUS SetSfcMmcParams();
1168     MOS_STATUS InitSfcRender();
1169 
1170     //!
1171     //! \brief    Dump Vebox State Heap
1172     //! \details  Dump Vebox State Heap
1173     //! \return   MOS_STATUS  MOS_STATUS_SUCCESS if succeeded, otherwise failure
1174     //!
1175     MOS_STATUS DumpVeboxStateHeap();
1176 
1177     MOS_STATUS SetVeboxSurfaceControlBits(
1178         MHW_VEBOX_SURFACE_CNTL_PARAMS       *pVeboxSurfCntlParams,
1179         uint32_t                            *pSurfCtrlBits);
1180 
1181     MOS_STATUS SetVeboxProCmd(
1182         MOS_COMMAND_BUFFER*   CmdBuffer);
1183 
1184     MOS_STATUS SetVeboxIndex(
1185         uint32_t                            dwVeboxIndex,
1186         uint32_t                            dwVeboxCount,
1187         uint32_t                            dwUsingSFC);
1188 
1189     MOS_STATUS SetVeboxState(
1190         PMOS_COMMAND_BUFFER                 pCmdBufferInUse);
1191 
1192     MOS_STATUS SetVeboxSurfaces(
1193         PMOS_COMMAND_BUFFER                 pCmdBufferInUse,
1194         PMHW_VEBOX_SURFACE_STATE_CMD_PARAMS pMhwVeboxSurfaceStateCmdParams);
1195 
1196     MOS_STATUS SetVeboxDiIecp(
1197         PMOS_COMMAND_BUFFER                pCmdBufferInUse);
1198 
1199 protected:
1200 
1201     // Execution state
1202     VpVeboxRenderData           *m_lastExecRenderData     = nullptr;                             //!< Cache last render operation info
1203 
1204     VPHAL_CSPACE                m_CscOutputCspace = {};                            //!< Cspace of Output Frame
1205     VPHAL_CSPACE                m_CscInputCspace = {};                             //!< Cspace of Input frame
1206     float                       m_fCscCoeff[9];                                    //!< [3x3] Coeff matrix for CSC
1207     float                       m_fCscInOffset[3];                                 //!< [3x1] Input Offset matrix for CSC
1208     float                       m_fCscOutOffset[3];                                //!< [3x1] Output Offset matrix for CSC
1209     SfcRenderBase               *m_sfcRender             = nullptr;
1210     bool                        m_IsSfcUsed              = false;
1211 
1212     VEBOX_PACKET_SURFACE_PARAMS m_veboxPacketSurface = {};
1213 
1214     VP_SURFACE                  *m_currentSurface           = nullptr;              //!< Current frame
1215     VP_SURFACE                  *m_previousSurface          = nullptr;              //!< Previous frame
1216     VP_SURFACE                  *m_renderTarget             = nullptr;              //!< Render Target frame
1217     VP_SURFACE                  *m_originalOutput           = nullptr;              //!< Render Target frame
1218 
1219     uint32_t                    m_dwGlobalNoiseLevelU = 0;                        //!< Global Noise Level for U
1220     uint32_t                    m_dwGlobalNoiseLevelV = 0;                        //!< Global Noise Level for V
1221     uint32_t                    m_dwGlobalNoiseLevel = 0;                         //!< Global Noise Level
1222     PVP_VEBOX_CACHE_CNTL        m_surfMemCacheCtl = nullptr;                      //!< Surface memory cache control
1223     uint32_t                    m_DIOutputFrames = MEDIA_VEBOX_DI_OUTPUT_CURRENT; //!< default value is 2 for non-DI case.
1224 
1225     // Statistics
1226     uint32_t                    m_dwVeboxPerBlockStatisticsWidth = 0;             //!< Per block statistics width
1227     uint32_t                    m_dwVeboxPerBlockStatisticsHeight = 0;            //!< Per block statistics height
1228 
1229     // STE factor LUT
1230     static const uint32_t       m_satP1Table[MHW_STE_FACTOR_MAX + 1];
1231     static const uint32_t       m_satS0Table[MHW_STE_FACTOR_MAX + 1];
1232     static const uint32_t       m_satS1Table[MHW_STE_FACTOR_MAX + 1];
1233 
1234     MediaScalability           *m_scalability              = nullptr;            //!< scalability
1235     bool                        m_useKernelResource        = false;               //!< Use Vebox Kernel Resource
1236     uint32_t                    m_inputDepth               = 0;
1237     std::shared_ptr<mhw::vebox::Itf> m_veboxItf            = nullptr;
1238     MediaFeatureManager        *m_featureManager           = nullptr;
1239     std::shared_ptr<mhw::mi::Itf> m_miItf                  = nullptr;
1240     vp::VpUserFeatureControl   *m_vpUserFeatureControl     = nullptr;
1241 
1242 MEDIA_CLASS_DEFINE_END(vp__VpVeboxCmdPacket)
1243 };
1244 
1245 }
1246 #endif // !__VP_VEBOX_CMD_PACKET_H__
1247