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_LEGACY_H__
29 #define __VP_VEBOX_CMD_PACKET_LEGACY_H__
30 
31 #include "mhw_vebox_g12_X.h"
32 #include "vp_vebox_cmd_packet.h"
33 #include "vp_vebox_common.h"
34 #include "vp_render_sfc_base.h"
35 #include "vp_filter.h"
36 #include "vp_user_feature_control.h"
37 
38 namespace vp {
39 
40 class VpVeboxCmdPacketLegacy : virtual public VpVeboxCmdPacketBase
41 {
42 public:
43     VpVeboxCmdPacketLegacy(MediaTask * task, PVP_MHWINTERFACE hwInterface, PVpAllocator &allocator, VPMediaMemComp *mmc);
44 
45     virtual ~VpVeboxCmdPacketLegacy();
46 
47     virtual MOS_STATUS Submit(MOS_COMMAND_BUFFER* commandBuffer, uint8_t packetPhase = otherPacket) override;
48 
49     virtual MOS_STATUS Init() override;
50 
Destory()51     virtual MOS_STATUS Destory() { return MOS_STATUS_SUCCESS; };
52 
53     virtual MOS_STATUS Prepare() override;
54 
55     virtual MOS_STATUS PrepareState() override;
56 
AllocateExecRenderData()57     virtual MOS_STATUS                  AllocateExecRenderData()
58     {
59         MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
60 
61         if (!m_lastExecRenderData)
62         {
63             m_lastExecRenderData = MOS_New(VpVeboxRenderData);
64             if (!m_lastExecRenderData)
65             {
66                 return MOS_STATUS_NO_SPACE;
67             }
68 
69             eStatus = m_lastExecRenderData->Init();
70             if (eStatus != MOS_STATUS_SUCCESS)
71             {
72                 MOS_Delete(m_lastExecRenderData);
73             }
74 
75         }
76         return eStatus;
77     }
78 
GetLastExecRenderData()79     virtual VpVeboxRenderData *GetLastExecRenderData()
80     {
81         if (!m_lastExecRenderData)
82         {
83             AllocateExecRenderData();
84         }
85         return m_lastExecRenderData;
86     }
87 
IsIECPEnabled()88     virtual bool IsIECPEnabled()
89     {
90         if (GetLastExecRenderData() != NULL)
91         {
92            return GetLastExecRenderData()->IECP.IsIecpEnabled();
93         }
94         return false;
95     }
96 
97     virtual MOS_STATUS ValidateHDR3DLutParameters(bool is3DLutTableFilled);
98 
99     //!
100     //! \brief    Setup surface states for Vebox
101     //! \details  Setup surface states for use in the current Vebox Operation
102     //! \param    [in] bDiVarianceEnable
103     //!           Is DI/Variances report enabled
104     //! \param    [in,out] pVeboxSurfaceStateCmdParams
105     //!           Pointer to VEBOX_SURFACE_STATE command parameters
106     //! \return   void
107     //!
108     virtual void SetupSurfaceStates(
109         PVP_VEBOX_SURFACE_STATE_CMD_PARAMS  pVeboxSurfaceStateCmdParams);
110 
111     //!
112     //! \brief    Setup surface states for Vebox
113     //! \details  Setup surface states for use in the current Vebox Operation
114     //! \param    [in] pRenderHal
115     //!           Pointer to Render Hal
116     //! \param    [in] CmdBuffer
117     //!           Pointer to command buffer
118     //! \param    [in] pGenericPrologParams
119     //!           pointer to Generic prolog params struct to send to cmd buffer header
120     //! \return   void
121     //!
122     virtual MOS_STATUS InitCmdBufferWithVeParams(
123         PRENDERHAL_INTERFACE                    pRenderHal,
124         MOS_COMMAND_BUFFER                      &CmdBuffer,
125         PRENDERHAL_GENERIC_PROLOG_PARAMS        pGenericPrologParams);
126 
127     //!
128     //! \brief    Setup Scaling Params for Vebox/SFC
129     //! \details  Setup surface Scaling Params for Vebox/SFC
130     //! \param    [in] scalingParams
131     //!           Scaling Params
132     //! \return   MOS_STATUS
133     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
134     //!
135     virtual MOS_STATUS SetScalingParams(PSFC_SCALING_PARAMS scalingParams) override;
136 
137     virtual MOS_STATUS ConfigureSteParams(VpVeboxRenderData *renderData, bool bEnableSte, uint32_t dwSTEFactor, bool bEnableStd, uint32_t stdparaSizeInBytes, void *stdparam);
138     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);
139     virtual MOS_STATUS ConfigureProcampParams(VpVeboxRenderData *renderData, bool bEnableProcamp, float fBrightness, float fContrast, float fHue, float fSaturation);
140     virtual MOS_STATUS ConfigureDenoiseParams(VpVeboxRenderData *renderData, float fDenoiseFactor);
141 
142     virtual MOS_STATUS UpdateCscParams(FeatureParamCsc &params) override;
143     virtual MOS_STATUS UpdateDenoiseParams(FeatureParamDenoise &params) override;
144     virtual MOS_STATUS UpdateTccParams(FeatureParamTcc &params) override;
145     virtual MOS_STATUS UpdateSteParams(FeatureParamSte &params) override;
146     virtual MOS_STATUS UpdateProcampParams(FeatureParamProcamp &params) override;
147 
148     virtual void AddCommonOcaMessage(PMOS_COMMAND_BUFFER pCmdBufferInUse, MOS_CONTEXT *pOsContext, PMOS_INTERFACE pOsInterface, PRENDERHAL_INTERFACE pRenderHal, PMHW_MI_MMIOREGISTERS pMmioRegisters, PMHW_MI_INTERFACE pMhwMiInterface);
149 
150 
151     //!
152     //! \brief    Setup CSC Params for Vebox/SFC
153     //! \details  Setup surface CSC Params for Vebox/SFC
154     //! \param    [in] cscParams
155     //!           CSC/IEF Params
156     //! \return   MOS_STATUS
157     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
158     //!
159     virtual MOS_STATUS SetSfcCSCParams(PSFC_CSC_PARAMS cscParams) override;
160 
161     //!
162     //! \brief    Setup CSC Params for Vebox back end
163     //! \details  Setup surface CSC Params for Vebox
164     //! \param    [in] cscParams
165     //!           CSC Params
166     //! \return   MOS_STATUS
167     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
168     //!
169     virtual MOS_STATUS SetVeboxBeCSCParams(PVEBOX_CSC_PARAMS cscParams) override;
170 
171     //!
172     //! \brief    Setup Vebox Output Alpha Value
173     //! \details  Setup Vebox Output Alpha Value
174     //! \param    [in] cscParams
175     //!           CSC Params
176     //! \return   MOS_STATUS
177     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
178     //!
179     virtual MOS_STATUS SetVeboxOutputAlphaParams(PVEBOX_CSC_PARAMS cscParams);
180 
181     //!
182     //! \brief    Setup Vebox Chroma sub sampling
183     //! \details  Setup Vebox Chroma sub sampling
184     //! \param    [in] cscParams
185     //!           CSC Params
186     //! \return   MOS_STATUS
187     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
188     //!
189     virtual MOS_STATUS SetVeboxChromasitingParams(PVEBOX_CSC_PARAMS cscParams);
190 
191     //!
192     //! \brief    Setup Roattion/Mirror Params for Vebox/SFC
193     //! \details  Setup surface Roattion/Mirror Params for Vebox/SFC
194     //! \param    [in] rotMirParams
195     //!           Rotation/Mirror Params
196     //! \return   MOS_STATUS
197     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
198     //!
199     virtual MOS_STATUS SetSfcRotMirParams(PSFC_ROT_MIR_PARAMS rotMirParams) override;
200 
201     //!
202     //! \brief    Setup DN Params for Vebox
203     //! \details  Setup surface DN Params for Vebox
204     //! \param    [in] dnParams
205     //!           DN Params
206     //! \return   MOS_STATUS
207     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
208     //!
209     virtual MOS_STATUS SetDnParams(PVEBOX_DN_PARAMS dnParams) override;
210 
211     //!
212     //! \brief    Setup STE Params for Vebox
213     //! \details  Setup surface STE Params for Vebox
214     //! \param    [in] steParams
215     //!           STE Params
216     //! \return   MOS_STATUS
217     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
218     //!
219     virtual MOS_STATUS SetSteParams(PVEBOX_STE_PARAMS steParams) override;
220 
221     //!
222     //! \brief    Setup HDR Params for Vebox
223     //! \details  Setup surface HDR Params for Vebox
224     //! \param    [in] HDRParams
225     //!           HDR Params
226     //! \return   MOS_STATUS
227     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
228     //!
229     virtual MOS_STATUS SetHdrParams(PVEBOX_HDR_PARAMS hdrParams) override;
230 
231     //!
232     //! \brief    Setup TCC Params for Vebox
233     //! \details  Setup surface TCC Params for Vebox
234     //! \param    [in] tccParams
235     //!           TCC Params
236     //! \return   MOS_STATUS
237     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
238     //!
239     virtual MOS_STATUS SetTccParams(PVEBOX_TCC_PARAMS tccParams) override;
240 
241     //!
242     //! \brief    Setup Procamp Params for Vebox
243     //! \details  Setup surface Procamp Params for Vebox
244     //! \param    [in] procampParams
245     //!           Procamp Params
246     //! \return   MOS_STATUS
247     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
248     //!
249     virtual MOS_STATUS SetProcampParams(PVEBOX_PROCAMP_PARAMS procampParams) override;
250 
251     //!
252     //! \brief    Setup DI Params for Vebox
253     //! \details  Setup surface DN Params for Vebox
254     //! \param    [in] diParams
255     //!           DI Params
256     //! \return   MOS_STATUS
257     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
258     //!
259     virtual MOS_STATUS SetDiParams(PVEBOX_DI_PARAMS diParams) override;
260 
261     //!
262     //! \brief    Setup CGC Params for Vebox
263     //! \details  Setup surface CGC Params for Vebox
264     //! \param    [in] cgcParams
265     //!           CGC Params
266     //! \return   MOS_STATUS
267     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
268     //!
269     virtual MOS_STATUS SetCgcParams(PVEBOX_CGC_PARAMS cgcParams) override;
270 
271     //!
272     //! \brief    Get DN luma parameters
273     //! \details  Get DN luma parameters
274     //! \param    [in] bDnEnabled
275     //!           true if DN being enabled
276     //! \param    [in] bAutoDetect
277     //!           true if auto DN being enabled
278     //! \param    [in] fDnFactor
279     //!           DN factor
280     //! \param    [in] bRefValid
281     //!           true if reference surface available
282     //! \param    [out] pLumaParams
283     //!           DN luma parameters
284     //! \return   MOS_STATUS
285     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
286     //!
GetDnLumaParams(bool bDnEnabled,bool bAutoDetect,float fDnFactor,bool bRefValid,PVP_SAMPLER_STATE_DN_PARAM pLumaParams)287     virtual MOS_STATUS GetDnLumaParams(
288         bool                        bDnEnabled,
289         bool                        bAutoDetect,
290         float                       fDnFactor,
291         bool                        bRefValid,
292         PVP_SAMPLER_STATE_DN_PARAM  pLumaParams) { return MOS_STATUS_SUCCESS; }
293 
294     //!
295     //! \brief    Get DN chroma parameters
296     //! \details  Get DN chroma parameters
297     //! \param    [in] bChromaDenoise
298     //!           true if chroma DN being enabled
299     //! \param    [in] bAutoDetect
300     //!           true if auto DN being enabled
301     //! \param    [in] fDnFactor
302     //!           DN factor
303     //! \param    [out] pChromaParams
304     //!           DN chroma parameters
305     //! \return   MOS_STATUS
306     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
307     //!
GetDnChromaParams(bool bChromaDenoise,bool bAutoDetect,float fDnFactor,PVPHAL_DNUV_PARAMS pChromaParams)308     virtual MOS_STATUS GetDnChromaParams(
309         bool                        bChromaDenoise,
310         bool                        bAutoDetect,
311         float                       fDnFactor,
312         PVPHAL_DNUV_PARAMS          pChromaParams) { return MOS_STATUS_SUCCESS; }
313 
314     //!
315     //! \brief    Config DN luma pix range
316     //! \details  Config DN luma pix range threshold and weight
317     //! \param    [in] bDnEnabled
318     //!           true if DN being enabled
319     //! \param    [in] bAutoDetect
320     //!           true if auto DN being enabled
321     //! \param    [in] fDnFactor
322     //!           DN factor
323     //! \return   MOS_STATUS
324     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
325     //!
ConfigLumaPixRange(bool bDnEnabled,bool bAutoDetect,float fDnFactor)326     virtual MOS_STATUS ConfigLumaPixRange(
327         bool                        bDnEnabled,
328         bool                        bAutoDetect,
329         float                       fDnFactor) { return MOS_STATUS_SUCCESS; }
330 
331     //!
332     //! \brief    Config DN chroma pix range
333     //! \details  Config DN chroma pix range threshold and weight
334     //! \param    [in] bChromaDenoise
335     //!           true if chroma DN being enabled
336     //! \param    [in] bAutoDetect
337     //!           true if auto DN being enabled
338     //! \param    [in] fDnFactor
339     //!           DN factor
340     //! \return   MOS_STATUS
341     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
342     //!
ConfigChromaPixRange(bool bChromaDenoise,bool bAutoDetect,float fDnFactor)343     virtual MOS_STATUS ConfigChromaPixRange(
344         bool                        bChromaDenoise,
345         bool                        bAutoDetect,
346         float                       fDnFactor) { return MOS_STATUS_SUCCESS; }
347 
348     virtual MOS_STATUS InitSTMMHistory();
349 
350     //!
351     //! \brief    Vebox Populate VEBOX parameters
352     //! \details  Populate the Vebox VEBOX state parameters to VEBOX RenderData
353     //! \param    [in] bDnEnabled
354     //!           true if DN being enabled
355     //! \param    [in] bChromaDenoise
356     //!           true if chroma DN being enabled
357     //! \param    [in] pLumaParams
358     //!           Pointer to Luma DN and DI parameter
359     //! \param    [in] pChromaParams
360     //!           Pointer to Chroma DN parameter
361     //! \return   MOS_STATUS
362     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
363     //!
364     virtual MOS_STATUS ConfigDnLumaChromaParams(
365         bool                            bDnEnabled,
366         bool                            bChromaDenoise,
367         PVP_SAMPLER_STATE_DN_PARAM      pLumaParams,
368         PVPHAL_DNUV_PARAMS              pChromaParams
369         );
370 
371     //!
372     //! \brief    Calculate offsets of statistics surface address based on the
373     //!           functions which were enabled in the previous call,
374     //!           and store the width and height of the per-block statistics into DNDI_STATE
375     //! \details
376     //! Layout of Statistics surface when Temporal DI enabled
377     //!     --------------------------------------------------------------\n
378     //!     | 16 bytes for x=0, Y=0       | 16 bytes for x=16, Y=0       | ...\n
379     //!     |-------------------------------------------------------------\n
380     //!     | 16 bytes for x=0, Y=4       | ...\n
381     //!     |------------------------------\n
382     //!     | ...\n
383     //!     |------------------------------\n
384     //!     | 16 bytes for x=0, Y=height-4| ...\n
385     //!     |-----------------------------------------------Pitch----------------------------------------------------------\n
386     //!     | 256 DW of ACE histogram Slice 0 (Previous)| 17 DW Reserved         | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
387     //!     |--------------------------------------------------------------------------------------------------------------\n
388     //!     | 256 DW of ACE histogram Slice 0 (Current) | 11 DW FMD0 | 6 DW GNE0 | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
389     //!     |--------------------------------------------------------------------------------------------------------------\n
390     //!     | 256 DW of ACE histogram Slice 1 (Previous)| 17 DW Reserved         | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
391     //!     |--------------------------------------------------------------------------------------------------------------\n
392     //!     | 256 DW of ACE histogram Slice 1 (Current) | 11 DW FMD1 | 6 DW GNE1 | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
393     //!     ---------------------------------------------------------------------------------------------------------------\n
394     //!
395     //! Layout of Statistics surface when DN or Spatial DI enabled (and Temporal DI disabled)
396     //!     --------------------------------------------------------------\n
397     //!     | 16 bytes for x=0, Y=0       | 16 bytes for x=16, Y=0       | ...\n
398     //!     |-------------------------------------------------------------\n
399     //!     | 16 bytes for x=0, Y=4       | ...\n
400     //!     |------------------------------\n
401     //!     | ...\n
402     //!     |------------------------------\n
403     //!     | 16 bytes for x=0, Y=height-4| ...\n
404     //!     |-----------------------------------------------Pitch----------------------------------------------------------\n
405     //!     | 256 DW of ACE histogram Slice 0 (Input)   | 11 DW FMD0 | 6 DW GNE0 | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
406     //!     |--------------------------------------------------------------------------------------------------------------\n
407     //!     | 256 DW of ACE histogram Slice 1 (Input)   | 11 DW FMD1 | 6 DW GNE1 | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
408     //!     ---------------------------------------------------------------------------------------------------------------\n
409     //!
410     //! Layout of Statistics surface when both DN and DI are disabled
411     //!     ------------------------------------------------Pitch----------------------------------------------------------\n
412     //!     | 256 DW of ACE histogram Slice 0 (Input)   | 17 DW Reserved         | 2 DW STD0 | 2 DW GCC0 | 11 DW Reserved |\n
413     //!     |--------------------------------------------------------------------------------------------------------------\n
414     //!     | 256 DW of ACE histogram Slice 1 (Input)   | 17 DW Reserved         | 2 DW STD1 | 2 DW GCC1 | 11 DW Reserved |\n
415     //!     ---------------------------------------------------------------------------------------------------------------\n
416     //! \param    [out] pStatSlice0Offset
417     //!           Statistics surface Slice 0 base pointer
418     //! \param    [out] pStatSlice1Offset
419     //!           Statistics surface Slice 1 base pointer
420     //! \return   MOS_STATUS
421     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
422     //!
423     virtual MOS_STATUS GetStatisticsSurfaceOffsets(
424         int32_t*                            pStatSlice0Offset,
425         int32_t*                            pStatSlice1Offset);
426 
427     //!
428     //! \brief    Configure FMD parameter
429     //! \details  Configure FMD parameters for DNDI State
430     //! \param    [in] bProgressive
431     //!           true if sample being progressive
432     //! \param    [in] bAutoDenoise
433     //!           true if auto denoise being enabled
434     //! \param    [out] pLumaParams
435     //!           Pointer to DNDI Param for set FMD parameters
436     //! \return   MOS_STATUS
437     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
438     //!
439     virtual MOS_STATUS ConfigFMDParams(bool bProgressive, bool bAutoDenoise, bool bFmdEnabled);
440 
441     //!
442     //! \brief    Setup Vebox_State Command parameter
443     //! \param    [in,out] pVeboxStateCmdParams
444     //!           Pointer to VEBOX_STATE command parameters
445     //! \return   MOS_STATUS
446     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
447     //!
448     virtual MOS_STATUS SetupVeboxState(
449         PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams);
450 
451     //!
452     //! \brief    Setup Vebox_DI_IECP Command params
453     //! \details  Setup Vebox_DI_IECP Command params
454     //! \param    [in] bDiScdEnable
455     //!           Is DI/Variances report enabled
456     //! \param    [in,out] pVeboxDiIecpCmdParams
457     //!           Pointer to VEBOX_DI_IECP command parameters
458     //! \return   MOS_STATUS
459     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
460     //!
461     virtual MOS_STATUS SetupDiIecpState(
462         bool                        bDiScdEnable,
463         PMHW_VEBOX_DI_IECP_CMD_PARAMS   pVeboxDiIecpCmdParams);
464 
465     //!
466     //! \brief    Check Vebox using kernel resource or not
467     //! \details  Check Vebox using kernel resource or not
468     //! \return   bool
469     //!           Return true if use kernel resource
470     //!
471     virtual bool UseKernelResource();
472 
473     //!
474     //! \brief    Vebox send Vebox ring HW commands
475     //! \details  Send Vebox ring Commands.
476     //! \return   MOS_STATUS
477     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
478     //!
479     virtual MOS_STATUS SendVeboxCmd(MOS_COMMAND_BUFFER* commandBuffer);
480 
481     //!
482     //! \brief    enable or disable SFC output path.
483     //! \details  enable or disable SFC output path
484     //! \return   void
485     //!
SetSfcOutputPath(bool bSfcUsed)486     virtual void SetSfcOutputPath(bool bSfcUsed) { m_IsSfcUsed = bSfcUsed; };
487 
GetSfcRenderInstance()488     virtual SfcRenderBase* GetSfcRenderInstance() { return m_sfcRender; };
489 
490     virtual MOS_STATUS PacketInit(
491         VP_SURFACE                          *inputSurface,
492         VP_SURFACE                          *outputSurface,
493         VP_SURFACE                          *previousSurface,
494         VP_SURFACE_SETTING                  &surfSetting,
495         VP_EXECUTE_CAPS                     packetCaps)override;
496 
497     virtual MOS_STATUS SetUpdatedExecuteResource(
498         VP_SURFACE                          *inputSurface,
499         VP_SURFACE                          *outputSurface,
500         VP_SURFACE                          *previousSurface,
501         VP_SURFACE_SETTING                  &surfSetting) override;
502 
503     //!
504     //! \brief    Check whether the Vebox command parameters are correct
505     //! \param    [in] VeboxStateCmdParams
506     //!           MHW vebox state cmd params
507     //! \param    [in] VeboxDiIecpCmdParams
508     //!           DiIecpCmd params struct
509     //! \return   MOS_STATUS
510     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
511     //!
512     virtual MOS_STATUS IsCmdParamsValid(
513         const MHW_VEBOX_STATE_CMD_PARAMS            &VeboxStateCmdParams,
514         const MHW_VEBOX_DI_IECP_CMD_PARAMS          &VeboxDiIecpCmdParams,
515         const VP_VEBOX_SURFACE_STATE_CMD_PARAMS  &VeboxSurfaceStateCmdParams);
516 
QueryStatLayout(VEBOX_STAT_QUERY_TYPE QueryType,uint32_t * pQuery)517     virtual MOS_STATUS QueryStatLayout(
518         VEBOX_STAT_QUERY_TYPE QueryType,
519         uint32_t*             pQuery) {return MOS_STATUS_SUCCESS;};
520 
521     //!
522     //! \brief    Determine if the Batch Buffer End is needed to add in the end
523     //! \details  Detect platform OS and return the flag whether the Batch Buffer End is needed to add in the end
524     //! \param    [in] pOsInterface
525     //!           Pointer to MOS_INTERFACE
526     //! \return   bool
527     //!           The flag of adding Batch Buffer End
528     //!
529     virtual bool RndrCommonIsMiBBEndNeeded(
530         PMOS_INTERFACE           pOsInterface);
531 
532     //!
533     //! \brief    Vebox perftag
534     //! \details  set vebox perftag
535     //! \return   MOS_STATUS
536     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
537     //!
538     virtual MOS_STATUS VeboxSetPerfTag();
539 
540     //!
541     //! \brief    Vebox perftag for NV12 source
542     //! \details  set vebox perftag for NV12 source
543     //! \return   MOS_STATUS
544     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
545     //!
546     virtual MOS_STATUS VeboxSetPerfTagNv12();
547 
548     //!
549     //! \brief    Vebox perftag for Pa format source
550     //! \details  set vebox perftag for Pa format source
551     //! \return   MOS_STATUS
552     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
553     //!
554     virtual MOS_STATUS VeboxSetPerfTagPaFormat();
555 
556     //!
557     //! \brief    Vebox state heap update for auto mode features
558     //! \details  Update Vebox indirect states for auto mode features
559     //! \return   MOS_STATUS
560     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
561     //!
562     virtual MOS_STATUS UpdateVeboxStates();
563 
564     //! \brief    Vebox get statistics surface base
565     //! \details  Calculate address of statistics surface address based on the
566     //!           functions which were enabled in the previous call.
567     //! \param    uint8_t* pStat
568     //!           [in] Pointer to Statistics surface
569     //! \param    uint8_t* * pStatSlice0Base
570     //!           [out] Statistics surface Slice 0 base pointer
571     //! \param    uint8_t* * pStatSlice1Base
572     //!           [out] Statistics surface Slice 1 base pointer
573     //! \return   MOS_STATUS
574     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
575     //!
576     virtual MOS_STATUS GetStatisticsSurfaceBase(
577         uint8_t  *pStat,
578         uint8_t **pStatSlice0Base,
579         uint8_t **pStatSlice1Base);
580 
QueryStatLayoutGNE(VEBOX_STAT_QUERY_TYPE QueryType,uint32_t * pQuery,uint8_t * pStatSlice0Base,uint8_t * pStatSlice1Base)581     virtual MOS_STATUS QueryStatLayoutGNE(
582         VEBOX_STAT_QUERY_TYPE QueryType,
583         uint32_t             *pQuery,
584         uint8_t              *pStatSlice0Base,
585         uint8_t              *pStatSlice1Base) { return MOS_STATUS_SUCCESS; };
586 
587     //!
588     //! \brief    Vebox update HVS DN states
589     //! \details  CPU update for VEBOX DN states
590     //! \param    bDnEnabled
591     //!           [in] true if DN enabled
592     //! \param    bChromaDenoise
593     //!           [in] true if chroma DN enabled
594     //! \param    bAutoDenoise
595     //!           [in] true if auto DN enabled
596     //! \param    uint32_t* pStatSlice0GNEPtr
597     //!           [out] Pointer to Vebox slice0 GNE data
598     //! \param    uint32_t* pStatSlice1GNEPtr
599     //!           [out] Pointer to Vebox slice1 GNE data
600     //! \return   MOS_STATUS
601     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
602     //!
603     virtual MOS_STATUS UpdateDnHVSParameters(
604         uint32_t *pStatSlice0GNEPtr,
605         uint32_t *pStatSlice1GNEPtr);
606 
607     //!
608     //! \brief    Vebox state adjust boundary for statistics surface
609     //! \details  Adjust boundary for statistics surface block
610     //! \return   MOS_STATUS
611     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
612     //!
613     virtual MOS_STATUS AdjustBlockStatistics();
614 
615 protected:
616 
617     //!
618     //! \brief    Doing prepare stage tasks for SendVeboxCmd
619     //!           Parameters might remain unchanged in case
620     //! \param    [out] CmdBuffer
621     //!           reference to Cmd buffer control struct
622     //! \param    [out] GenericPrologParams
623     //!           GpuStatusBuffer resource to be set
624     //! \param    [out] iRemaining
625     //!           integer showing initial cmd buffer usage
626     //! \return   MOS_STATUS
627     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
628     //!
629    virtual MOS_STATUS PrepareVeboxCmd(
630       MOS_COMMAND_BUFFER*                      CmdBuffer,
631       RENDERHAL_GENERIC_PROLOG_PARAMS&         GenericPrologParams,
632       int32_t&                                 iRemaining);
633 
634     //!
635     //! \brief    Render the Vebox Cmd buffer for SendVeboxCmd
636     //!           Parameters might remain unchanged in case
637     //! \param    [in,out] CmdBuffer
638     //!           reference to Cmd buffer control struct
639     //! \param    [out] VeboxDiIecpCmdParams
640     //!           DiIecpCmd params struct to be set
641     //! \param    [out] VeboxSurfaceStateCmdParams
642     //!           VPHAL surface state cmd to be set
643     //! \param    [out] MhwVeboxSurfaceStateCmdParams
644     //!           MHW surface state cmd to be set
645     //! \param    [out] VeboxStateCmdParams
646     //!           MHW vebox state cmd to be set
647     //! \param    [out] FlushDwParams
648     //!           MHW MI_FLUSH_DW cmd to be set
649     //! \param    [in] pGenericPrologParams
650     //!           pointer to Generic prolog params struct to send to cmd buffer header
651     //! \return   MOS_STATUS
652     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
653     //!
654     virtual MOS_STATUS RenderVeboxCmd(
655         MOS_COMMAND_BUFFER                      *CmdBuffer,
656         MHW_VEBOX_DI_IECP_CMD_PARAMS            &VeboxDiIecpCmdParams,
657         VP_VEBOX_SURFACE_STATE_CMD_PARAMS    &VeboxSurfaceStateCmdParams,
658         MHW_VEBOX_SURFACE_STATE_CMD_PARAMS      &MhwVeboxSurfaceStateCmdParams,
659         MHW_VEBOX_STATE_CMD_PARAMS              &VeboxStateCmdParams,
660         MHW_MI_FLUSH_DW_PARAMS                  &FlushDwParams,
661         PRENDERHAL_GENERIC_PROLOG_PARAMS        pGenericPrologParams);
662 
663     //!
664     //! \brief    handle Cmd buffer's offset when error occur
665     //! \details  handle Cmd buffer's offset when error occur
666     //! \param    [in,out] CmdBuffer
667     //!           reference to Cmd buffer control struct
668     //! \return   void
669     void CmdErrorHanlde(
670         MOS_COMMAND_BUFFER  *CmdBuffer,
671         int32_t             &iRemaining);
672 
673     //!
674     //! \brief    Send Vecs Status Tag
675     //! \details  Add MI Flush with write back into command buffer for GPU to write
676     //!           back GPU Tag. This should be the last command in 1st level batch.
677     //!           This ensures sync tag will be written after rendering is complete.
678     //! \param    [in] pMhwMiInterface
679     //!           MHW MI interface
680     //! \param    [in] pOsInterface
681     //!           Pointer to OS Interface
682     //! \param    [out] pCmdBuffer
683     //!           Pointer to Command Buffer
684     //! \return   MOS_STATUS
685     //!
686     virtual MOS_STATUS SendVecsStatusTag(
687       PMHW_MI_INTERFACE                   pMhwMiInterface,
688       PMOS_INTERFACE                      pOsInterface,
689       PMOS_COMMAND_BUFFER                 pCmdBuffer);
690 
691     virtual MOS_STATUS InitVeboxSurfaceStateCmdParams(
692         PVP_VEBOX_SURFACE_STATE_CMD_PARAMS    pVpHalVeboxSurfaceStateCmdParams,
693         PMHW_VEBOX_SURFACE_STATE_CMD_PARAMS      pMhwVeboxSurfaceStateCmdParams);
694 
695     virtual MOS_STATUS InitVeboxSurfaceParams(
696         PVP_SURFACE                     pVpHalVeboxSurface,
697         PMHW_VEBOX_SURFACE_PARAMS       pMhwVeboxSurface);
698 
699     //!
700     //! \brief    Copy Surface value
701     //! \param    [in] pTargetSurface
702     //!           Pointer to surface copy value to
703     //! \param    [in] pSourceSurface
704     //!           Pointer to surface copy value from
705     //! \return   void
706     //!
707     virtual void CopySurfaceValue(
708       PVP_SURFACE                 pTargetSurface,
709       PVP_SURFACE                 pSourceSurface);
710 
711     //!
712     //! \brief    Add vebox DNDI state
713     //! \details  Add vebox DNDI state
714     //! \return   MOS_STATUS
715     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
716     //!
717     virtual MOS_STATUS AddVeboxDndiState();
718 
719     //!
720     //! \brief    Add vebox IECP state
721     //! \details  Add vebox IECP state
722     //! \return   MOS_STATUS
723     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
724     //!
725     virtual MOS_STATUS AddVeboxIECPState();
726 
727     //!
728     //! \brief    Add vebox Hdr state
729     //! \details  Add vebox Hdr state
730     //! \return   MOS_STATUS
731     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
732     //!
733     virtual MOS_STATUS AddVeboxHdrState();
734 
735     virtual bool IsVeboxGamutStateNeeded();
736 
737     //!
738     //! \brief    Add vebox Gamut state
739     //! \details  Add vebox Gamut state
740     //! \return   MOS_STATUS
741     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
742     //!
743     virtual MOS_STATUS AddVeboxGamutState();
744 
745     //!
746     //! \brief    Vebox set up vebox state heap
747     //! \details  Setup Vebox indirect states: DNDI and etc
748     //! \return   MOS_STATUS
749     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
750     //!
751     virtual MOS_STATUS SetupIndirectStates();
752 
753     //!
754     //! \brief    Vebox get the back-end colorspace conversion matrix
755     //! \details  When the i/o is A8R8G8B8 or X8R8G8B8, the transfer matrix
756     //!           needs to be updated accordingly
757     //! \param    [in] inputColorSpace
758     //!           color space of vebox input surface
759     //! \param    [in] outputColorSpace
760     //!           color space of vebox output surface
761     //! \param    [in] inputFormat
762     //!           format of vebox input surface
763     //! \return   void
764     //!
765     virtual void VeboxGetBeCSCMatrix(
766         VPHAL_CSPACE    inputColorSpace,
767         VPHAL_CSPACE    outputColorSpace,
768         MOS_FORMAT      inputFormat);
769 
770     virtual MOS_STATUS SetDiParams(
771         bool                    bDiEnabled,
772         bool                    bSCDEnabled,
773         bool                    bHDContent,
774         VPHAL_SAMPLE_TYPE       sampleTypeInput,
775         MHW_VEBOX_DNDI_PARAMS   &param);
776 
777     bool IsTopField(VPHAL_SAMPLE_TYPE sampleType);
778     bool IsTopFieldFirst(VPHAL_SAMPLE_TYPE sampleType);
779 
780     //!
781     //! \brief    Get surface by type
782     //! \details  Get surface by type
783     //! \param    [in] type
784     //!           surface type
785     //! \return   VP_SURFACE*
786     //!           Pointer to surface of specified type
787     //!
788     virtual VP_SURFACE* GetSurface(SurfaceType type);
789 
790     virtual MOS_STATUS InitSurfMemCacheControl(VP_EXECUTE_CAPS packetCaps);
791 
792     virtual MHW_CSPACE VpHalCspace2MhwCspace(VPHAL_CSPACE cspace);
793 
794     virtual MOS_STATUS SetupDNTableForHVS(
795         PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams);
796 
797     virtual MOS_STATUS SetupHDRLuts(
798         PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams);
799 
800     virtual MOS_STATUS Init3DLutTable(PVP_SURFACE surf3DLut);
801 
802     void UpdateCpPrepareResources();
803 
804     MOS_STATUS SetupVebox3DLutForHDR(
805         PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams);
806 
807     MOS_STATUS SetupVeboxExternal3DLutforHDR(
808         PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams);
809 
810 protected:
811 #if (_DEBUG || _RELEASE_INTERNAL)
StallBatchBuffer(PMOS_COMMAND_BUFFER cmdBuffer)812     virtual MOS_STATUS StallBatchBuffer(
813         PMOS_COMMAND_BUFFER cmdBuffer)
814     {
815         return MOS_STATUS_SUCCESS;
816     }
817 #endif
818 
819 private:
820 
821     //!
822     //! \brief    IsFormatMMCSupported
823     //! \details  Check if the format of vebox output surface is supported by MMC
824     //! \param    [in] Format
825     //! \return   bool  true if suported, otherwise not supported
826     //!
827     bool IsFormatMMCSupported(
828         MOS_FORMAT                  Format);
829 
830     //!
831     //! \brief    SetSfcMmcParams
832     //! \details  set sfc state mmc related params
833     //! \return   bool  success if succeeded, otherwise failure
834     //!
835     virtual MOS_STATUS SetSfcMmcParams();
836     MOS_STATUS InitSfcRender();
837 
838     //!
839     //! \brief    Dump Vebox State Heap
840     //! \details  Dump Vebox State Heap
841     //! \return   MOS_STATUS  MOS_STATUS_SUCCESS if succeeded, otherwise failure
842     //!
843     MOS_STATUS DumpVeboxStateHeap();
844 
845     MOS_STATUS SetVeboxSurfaceControlBits(
846         PMHW_VEBOX_INTERFACE                pVeboxInterface,
847         MHW_VEBOX_SURFACE_CNTL_PARAMS       *pVeboxSurfCntlParams,
848         uint32_t                            *pSurfCtrlBits);
849 
850     MOS_STATUS setVeboxProCmd(
851         PMHW_MI_INTERFACE     pMhwMiInterface,
852         PMHW_VEBOX_INTERFACE  pVeboxInterface,
853         MOS_COMMAND_BUFFER*   CmdBuffer);
854 
855     MOS_STATUS SetVeboxIndex(
856         PMHW_VEBOX_INTERFACE                pVeboxInterface,
857         uint32_t                            dwVeboxIndex,
858         uint32_t                            dwVeboxCount,
859         uint32_t                            dwUsingSFC);
860 
861     MOS_STATUS SetVeboxState(
862         PMHW_VEBOX_INTERFACE        pVeboxInterface,
863         PMOS_COMMAND_BUFFER         pCmdBufferInUse,
864         PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams,
865         bool                        bCmBuffer);
866 
867     MOS_STATUS SetVeboxSurfaces(
868         PMHW_VEBOX_INTERFACE                pVeboxInterface,
869         PMOS_COMMAND_BUFFER                 pCmdBufferInUse,
870         PMHW_VEBOX_SURFACE_STATE_CMD_PARAMS pMhwVeboxSurfaceStateCmdParams);
871 
872     MOS_STATUS SetVeboxDiIecp(
873         PMHW_VEBOX_INTERFACE               pVeboxInterface,
874         PMOS_COMMAND_BUFFER                pCmdBufferInUse,
875         PMHW_VEBOX_DI_IECP_CMD_PARAMS      pVeboxDiIecpCmdParams);
876 
877 protected:
878 
879     // Execution state
880     VpVeboxRenderData           *m_lastExecRenderData     = nullptr;                             //!< Cache last render operation info
881 
882     VPHAL_CSPACE                m_CscOutputCspace = {};                            //!< Cspace of Output Frame
883     VPHAL_CSPACE                m_CscInputCspace = {};                             //!< Cspace of Input frame
884     float                       m_fCscCoeff[9];                                    //!< [3x3] Coeff matrix for CSC
885     float                       m_fCscInOffset[3];                                 //!< [3x1] Input Offset matrix for CSC
886     float                       m_fCscOutOffset[3];                                //!< [3x1] Output Offset matrix for CSC
887     SfcRenderBase               *m_sfcRender             = nullptr;
888     bool                        m_IsSfcUsed              = false;
889 
890     VEBOX_PACKET_SURFACE_PARAMS m_veboxPacketSurface = {};
891 
892     VP_SURFACE                  *m_currentSurface           = nullptr;              //!< Current frame
893     VP_SURFACE                  *m_previousSurface          = nullptr;              //!< Previous frame
894     VP_SURFACE                  *m_renderTarget             = nullptr;              //!< Render Target frame
895 
896     uint32_t                    m_dwGlobalNoiseLevelU = 0;                        //!< Global Noise Level for U
897     uint32_t                    m_dwGlobalNoiseLevelV = 0;                        //!< Global Noise Level for V
898     uint32_t                    m_dwGlobalNoiseLevel = 0;                         //!< Global Noise Level
899     PVP_VEBOX_CACHE_CNTL        m_surfMemCacheCtl = nullptr;                      //!< Surface memory cache control
900     uint32_t                    m_DIOutputFrames = MEDIA_VEBOX_DI_OUTPUT_CURRENT; //!< default value is 2 for non-DI case.
901 
902     // Statistics
903     uint32_t                    m_dwVeboxPerBlockStatisticsWidth = 0;             //!< Per block statistics width
904     uint32_t                    m_dwVeboxPerBlockStatisticsHeight = 0;            //!< Per block statistics height
905 
906     // STE factor LUT
907     static const uint32_t       m_satP1Table[MHW_STE_FACTOR_MAX + 1];
908     static const uint32_t       m_satS0Table[MHW_STE_FACTOR_MAX + 1];
909     static const uint32_t       m_satS1Table[MHW_STE_FACTOR_MAX + 1];
910 
911     MediaScalability           *m_scalability              = nullptr;            //!< scalability
912     bool                        m_useKernelResource        = false;               //!< Use Vebox Kernel Resource
913     uint32_t                    m_inputDepth               = 0;
914     std::shared_ptr<mhw::vebox::Itf> m_veboxItf            = nullptr;
915     vp::VpUserFeatureControl   *m_vpUserFeatureControl = nullptr;
916 
917 MEDIA_CLASS_DEFINE_END(vp__VpVeboxCmdPacketLegacy)
918 };
919 
920 }
921 #endif // !__VP_VEBOX_CMD_PACKET_H__
922