xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/common/vp/hal/vphal_render_composite.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2016-2021, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file     vphal_render_composite.h
24 //! \brief    Common interface and structure used in Composite
25 //! \details  Common interface and structure used in Composite
26 //!
27 #ifndef __VPHAL_RENDER_COMPOSITE_H__
28 #define __VPHAL_RENDER_COMPOSITE_H__
29 
30 #include "vphal.h"
31 #include "vphal_render_renderstate.h"
32 #include "vphal_render_common.h"
33 #include "mhw_render_legacy.h"
34 
35 //!
36 //! \brief Compositing buffers
37 //!
38 #define VPHAL_COMP_BUFFERS_DEFAULT  4
39 #define VPHAL_COMP_BUFFERS_MAX      32
40 
41 #define VPHAL_MAX_PROCAMP           2
42 
43 #define VPHAL_SURFACE_INDEX_INVALID -1
44 #define VPHAL_COMP_MAX_PALETTES     2
45 #define VPHAL_COMP_MAX_LUMA_KEY     1
46 #define VPHAL_COMP_MAX_AVS          1
47 #define VPHAL_COMP_MAX_PROCAMP      1
48 #define VPHAL_COMP_SAMPLER_NEAREST  1
49 #define VPHAL_COMP_SAMPLER_BILINEAR 2
50 #define VPHAL_COMP_SAMPLER_LUMAKEY  4
51 #define VPHAL_COMP_MAX_SAMPLER      (VPHAL_COMP_SAMPLER_NEAREST | VPHAL_COMP_SAMPLER_BILINEAR | VPHAL_COMP_SAMPLER_LUMAKEY)
52 
53 #define VPHAL_SAMPLER_Y                 1
54 #define VPHAL_SAMPLER_U                 2
55 #define VPHAL_SAMPLER_V                 3
56 #define VPHAL_COMP_COMPUTE_WALKER_THREAD_SPACE_WIDTH    1
57 #define VPHAL_COMP_COMPUTE_WALKER_THREAD_SPACE_HEIGHT   1
58 #define VPHAL_COMP_COMPUTE_WALKER_THREAD_SPACE_DEPTH    1
59 
60 // GRF 8 for unified kernel inline data (NLAS is enabled)
61 struct MEDIA_OBJECT_NLAS_INLINE_DATA
62 {
63     // DWORD 0 - GRF R6.0
64     union
65     {
66         struct
67         {
68             float   HorizontalFrameOriginLayer0;
69         };
70 
71         uint32_t       Value;
72     } DW00;
73 
74     // DWORD 1 - GRF R6.1
75     union
76     {
77         struct
78         {
79             float   HorizontalFrameOriginLayer1;
80         };
81 
82         uint32_t       Value;
83     } DW01;
84 
85     // DWORD 2 - GRF R6.2
86     union
87     {
88         struct
89         {
90             float   HorizontalFrameOriginLayer2;
91         };
92 
93         uint32_t       Value;
94     } DW02;
95 
96     // DWORD 03 - GRF R6.3
97     union
98     {
99         struct
100         {
101             float   HorizontalFrameOriginLayer3;
102         };
103 
104         uint32_t       Value;
105     } DW03;
106 
107     // DWORD 04 - GRF R6.4
108     union
109     {
110         struct
111         {
112             float   HorizontalFrameOriginLayer4;
113         };
114 
115         uint32_t       Value;
116     } DW04;
117 
118     // DWORD 05 - GRF R6.5
119     union
120     {
121         struct
122         {
123             float   HorizontalFrameOriginLayer5;
124         };
125 
126         uint32_t       Value;
127     } DW05;
128 
129     // DWORD 06 - GRF R6.6
130     union
131     {
132         struct
133         {
134             float   HorizontalFrameOriginLayer6;
135         };
136 
137         uint32_t       Value;
138     } DW06;
139 
140     // DWORD 07 - GRF R6.7
141     union
142     {
143         struct
144         {
145             float   HorizontalFrameOriginLayer7;
146         };
147 
148         uint32_t       Value;
149     } DW07;
150 };
151 
152 //!
153 //! \brief Structure to VPHAL Composite Media Object Inline Data
154 //!
155 struct VPHAL_COMPOSITE_MO_INLINE_DATA
156 {
157     // Do not change the two members' order because of low level memcpy
158     MEDIA_OBJECT_NLAS_INLINE_DATA       NLASInline;
159     MEDIA_OBJECT_KA2_INLINE_DATA        KA2Inline;
160 };
161 
162 //!
163 //! \brief Structure to VPHAL Composite Parameters
164 //!
165 typedef struct _VPHAL_COMPOSITE_PARAMS
166 {
167     // Pointer to target and source surfaces
168     uint32_t                uSourceCount;                       //!< Number of sources
169     PVPHAL_SURFACE          pSource[VPHAL_COMP_MAX_LAYERS];
170     uint32_t                uTargetCount;                       //!< Number of targets
171     VPHAL_SURFACE           Target[VPHAL_MAX_TARGETS];          //!< Render targets
172     // Needed by CP during MHW VP integration, due to pTokenState->pResourceInfo
173     RENDERHAL_SURFACE       RenderHalSurfaceSrc[VPHAL_COMP_MAX_LAYERS];
174     RENDERHAL_SURFACE       RenderHalSurfaceSrcField[VPHAL_COMP_MAX_LAYERS];
175     RENDERHAL_SURFACE       RenderHalSurfaceTarget[VPHAL_MAX_TARGETS];
176 
177     bool                    bSkipBlocks;          //!< Skip empty blocks
178     PRECT                   pConstriction;        //!< Constricted output
179     PVPHAL_COLORFILL_PARAMS pColorFillParams;     //!< ColorFill - BG only
180     PVPHAL_ALPHA_PARAMS     pCompAlpha;           //!< Alpha for composited surface
181     bool                    bAlphaCalculateEnable;
182     bool                    bForceSkipColorFill;  //!< Force skip colorfill even the first layer is translucent
183 
184     // Resource counters
185     int32_t                 nLayers;
186     int32_t                 nPalettes;
187     int32_t                 nAVS;
188     int32_t                 nProcamp;
189     int32_t                 nLumaKeys;
190     int32_t                 nSampler;
191     VPHAL_ROTATION          Rotation;           //!< Layer 0 rotation info
192 } VPHAL_COMPOSITE_PARAMS, *PVPHAL_COMPOSITE_PARAMS;
193 
194 //!
195 //! \brief Structure to VPHAL Composite Rendering data
196 //!
197 typedef struct _VPHAL_RENDERING_DATA_COMPOSITE
198 {
199     // Sources
200     int32_t                             iLayers;
201     PVPHAL_SURFACE                      pLayers[VPHAL_COMP_MAX_LAYERS];
202     PVPHAL_SURFACE                      pTarget[VPHAL_MAX_TARGETS];
203     PVPHAL_COLORFILL_PARAMS             pColorFill;
204     PVPHAL_ALPHA_PARAMS                 pCompAlpha;
205 
206     // Geometry
207     int32_t                             iBlocksX;
208     int32_t                             iBlocksY;
209     int32_t                             iBindingTable;
210     int32_t                             iMediaID;
211     int32_t                             iCurbeOffset;
212     int32_t                             iCurbeLength;
213     RECT                                rcOutput;
214 
215     // Constriction parameters
216     PRECT                               pConstriction;
217     int32_t                             ConstrictionOriginX;
218     int32_t                             ConstrictionOriginY;
219     float                               fConstrictionStepX;
220     float                               fConstrictionStepY;
221 
222     // HDC Direct Write flag
223     bool                                bHdcDwEnable;
224 
225     // Alpha Calculate flag
226     bool                                bAlphaCalculateEnable;
227 
228     // CM FC flag
229     bool                                bCmFcEnable;
230 
231     // States
232     PRENDERHAL_MEDIA_STATE              pMediaState;
233     MHW_SAMPLER_STATE_PARAM             SamplerStateParams[MHW_RENDER_ENGINE_SAMPLERS_MAX];
234     int32_t                             iCmdInlineSize;
235     int32_t                             iNLASInlineSize;
236     MEDIA_OBJECT_KA2_STATIC_DATA        Static;
237     MEDIA_WALKER_KA2_STATIC_DATA        WalkerStatic;
238     MEDIA_OBJECT_KA2_INLINE_DATA        Inline;
239     PMHW_AVS_PARAMS                     pAvsParams;
240     MEDIA_DP_FC_STATIC_DATA             DPFCStatic;
241     // Batch Buffer rendering arguments
242     VPHAL_BB_COMP_ARGS                  BbArgs;
243 
244     // Kernel Information
245     Kdll_CacheEntry                     *pKernelEntry;
246     Kdll_Procamp                        *pProcamp;
247 
248     // Extension data
249     void*                               pExtensionData;
250 
251 } VPHAL_RENDERING_DATA_COMPOSITE, *PVPHAL_RENDERING_DATA_COMPOSITE;
252 
253 //!
254 //! \brief Structure to VPHAL 16x16 Block COMPOSITE Mask
255 //!
256 typedef struct _VPHAL_16X16BLOCK_COMPOSITE_MASK
257 {
258     uint32_t       HorizontalBlockCompositeMask    : 16;
259     uint32_t       VerticalBlockCompositeMask      : 16;
260 } VPHAL_16X16BLOCK_COMPOSITE_MASK, *PVPHAL_16X16BLOCK_COMPOSITE_MASK;
261 
262 //!
263 //! \brief Class to VPHAL Composite render
264 //!
265 class CompositeState : public RenderState
266 {
267 public:
268     //!
269     //! \brief    Composite Constructor
270     //! \details  Construct Composite render and allocate member data structure
271     //! \param    [in] pOsInterface
272     //!           Pointer to MOS interface structure
273     //! \param    [in] pRenderHal
274     //!           Pointer to RenderHal interface structure
275     //! \param    [in] pPerfData
276     //!           Pointer to performance data structure
277     //! \param    [in] compositeCacheCntl
278     //!           Composite Cache Control Data
279     //! \param    [out] peStatus
280     //!           Pointer to MOS status
281     //!
282     CompositeState(
283         PMOS_INTERFACE                      pOsInterface,
284         PRENDERHAL_INTERFACE                pRenderHal,
285         PVPHAL_RNDR_PERF_DATA               pPerfData,
286         const VPHAL_COMPOSITE_CACHE_CNTL    &compositeCacheCntl,
287         MOS_STATUS                          *peStatus);
288 
289     //!
290     //! \brief    Composite render Destructor
291     //! \details  Destroy Composite render and release all related RenderState resources
292     //!
293     virtual ~CompositeState();
294 
295     //!
296     //! \brief    Initialize Composite render
297     //! \param    [in] pSettings
298     //!           Pointer to VPHAL Settings
299     //! \param    [in] pKernelDllState
300     //!           Pointer to KernelDLL State
301     //! \return   MOS_STATUS
302     //!           Return MOS_STATUS_SUCCESS if successful
303     //!
304     virtual MOS_STATUS Initialize(
305         const VphalSettings    *pSettings,
306         Kdll_State             *pKernelDllState);
307 
308     //!
309     //! \brief    Composite Destroy function
310     //! \details  Destroy resource allocated by Composite
311     //!
312     virtual void Destroy();
313 
314     //!
315     //! \brief    Composite render Rendering
316     //! \details  VPHal Composite render entry
317     //! \param    [in] pcRenderParams
318     //!           Pointer to Render parameters
319     //! \param    [in,out] pRenderPassData
320     //!           Pointer to Render data
321     //! \return   MOS_STATUS
322     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
323     //!
324     MOS_STATUS Render(
325         PCVPHAL_RENDER_PARAMS  pcRenderParams,
326         RenderpassData         *pRenderPassData);
327 
328     //!
329     //! \brief    Judge if Composite render is needed
330     //! \details  Check Render parameter/data if Composite render needed
331     //! \param    [in] pcRenderParams
332     //!           Pointer to Render parameters
333     //! \param    [in,out] pRenderPassData
334     //!           Pointer to Render data
335     //! \return   bool
336     //!           true if meeded. Else false
337     //!
338     bool IsNeeded(
339         PCVPHAL_RENDER_PARAMS  pcRenderParams,
340         RenderpassData         *pRenderPassData);
341 
342     void PrintCurbeData(MEDIA_OBJECT_KA2_STATIC_DATA *pWalkerStatic);
343 
344     void PrintWalkerParas(PMHW_GPGPU_WALKER_PARAMS pWalkerParams);
345 
346     void PrintSamplerParams(PMHW_SAMPLER_STATE_PARAM pSamplerParams);
347 
348     //!
349     //! \brief    set Report data
350     //! \details  set Report data for this render
351     //! \param    [in] pSource
352     //!           pointer to the surface
353     //!
354     virtual void SetReporting(PVPHAL_SURFACE pSource);
355 
356     //!
357     //! \brief    copy Report data
358     //! \details  copy Report data from this render
359     //! \param    [out] pReporting
360     //!           pointer to the Report data to copy data to
361     //!
362     virtual void CopyReporting(VphalFeatureReport* pReporting);
363 
364     //!
365     //! \brief    Judge if Composite render support multiple stream rendering
366     //! \details  Judge if Composite render support multiple stream rendering
367     //! \return   bool
368     //!           true if supported. Else false
369     //!
370     bool IsMultipleStreamSupported();
371 
372     //!
373     //! \brief    Search for the best match BB according to the Composition BB arguments
374     //! \param    [in] pBatchBufferTable
375     //!           Pointer to the BB table to be searched
376     //! \param    [in] pInputBbParams
377     //!           Pointer to the BB params required for the best match
378     //! \param    [in] iBbSize
379     //!           the BB size required for the best match
380     //! \param    [out] ppBatchBuffer
381     //!           Pointer to the addr of the best matched BB, pointer to nullptr if there's
382     //!           no available matched BB
383     //! \return   MOS_STATUS
384     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
385     //!
386     static MOS_STATUS GetBestMatchBB(
387         PVPHAL_BATCH_BUFFER_TABLE     pBatchBufferTable,
388         PVPHAL_BATCH_BUFFER_PARAMS    pInputBbParams,
389         int32_t                       iBbSize,
390         PMHW_BATCH_BUFFER             *ppBatchBuffer);
391 
392     //!
393     //! \brief    Load Palette Data
394     //! \details  Load Palette Data according to color space and CSC matrix.
395     //! \param    [in] pInPalette
396     //!           Pointer to Input Palette structure
397     //! \param    [in] srcCspace
398     //!           Source color space
399     //! \param    [in] dstCspace
400     //!           Destination color space
401     //! \param    [in] piCscMatrix
402     //!           Pointer to CSC matrix to use in fixed point format
403     //! \param    [in] iNumEntries
404     //!           Number of Palette entries to be filled
405     //! \param    [in,out] pPaletteData
406     //!           Pointer to Output Palette Address
407     //! \return   MOS_STATUS
408     //!           MOS_STATUS_SUCCESS, otherwise MOS_STATUS_UNIMPLEMENTED if Destination Colorspace not supported,
409     //!            or MOS_STATUS_INVALID_PARAMETER/MOS_STATUS_NULL_POINTER
410     //!
411     MOS_STATUS LoadPaletteData(
412         PVPHAL_PALETTE          pInPalette,
413         VPHAL_CSPACE            srcCspace,
414         VPHAL_CSPACE            dstCspace,
415         int32_t*                piCscMatrix,
416         int32_t                 iNumEntries,
417         void*                   pPaletteData);
418 
419 protected:
420     //!
421     //! \brief    Set Sampler Avs 8x8 Table
422     //! \param    [in] pRenderHal
423     //!           Pointer to RenderHal Interface Structure
424     //! \param    [in] pSamplerStateParams
425     //!           Pointer to Sampler State Params
426     //! \param    [in,out] pAvsParams
427     //!           Pointer to AVS Params
428     //! \param    [in] SrcFormat
429     //!           Source Format
430     //! \param    [in] fScaleX
431     //!           Horizontal Scale Factor
432     //! \param    [in] fScaleY
433     //!           Vertical Scale Factor
434     //! \param    [in] dwChromaSiting
435     //!           Chroma Siting
436     //! \return   MOS_STATUS
437     //!
438     virtual MOS_STATUS SetSamplerAvsTableParam(
439         PRENDERHAL_INTERFACE            pRenderHal,
440         PMHW_SAMPLER_STATE_PARAM        pSamplerStateParams,
441         PMHW_AVS_PARAMS                 pAvsParams,
442         MOS_FORMAT                      SrcFormat,
443         float                           fScaleX,
444         float                           fScaleY,
445         uint32_t                        dwChromaSiting);
446 
447     //!
448     //! \brief    Get Plane Offset override parameter for Kernel WA
449     //! \details  Get Y/UV Plane Offset override parameters for Kernel WA
450     //! \param    pRenderHalSurface
451     //!           [in,out] Pointer to Render Hal Surface
452     //! \param    pParams
453     //!           [in] Pointer to Surface State Params
454     //! \param    pOverride
455     //!           [out] Pointer to override param that provides adjustments to
456     //!                 Y, UV plane offsets, used for kernel WA in a few cases.
457     //! \return   RENDERHAL_OFFSET_OVERRIDE
458     //!           return pointer to RENDERHAL_OFFSET_OVERRIDE if need, otherwise return nullptr.
459     //!
GetPlaneOffsetOverrideParam(PRENDERHAL_SURFACE pRenderHalSurface,PRENDERHAL_SURFACE_STATE_PARAMS pParams,PRENDERHAL_OFFSET_OVERRIDE pOverride)460     virtual PRENDERHAL_OFFSET_OVERRIDE GetPlaneOffsetOverrideParam(
461         PRENDERHAL_SURFACE              pRenderHalSurface,
462         PRENDERHAL_SURFACE_STATE_PARAMS pParams,
463         PRENDERHAL_OFFSET_OVERRIDE      pOverride)
464     {
465         return nullptr;
466     }
467 
468     //!
469     //! \brief    Get Thread Count for VFE state parameter
470     //! \details  Get Thread Count for VFE state parameter
471     //! \param    pRenderingData
472     //!           [in] Pointer to Composite state
473     //! \param    pTarget
474     //!           [in] Pointer to target surface
475     //! \return   INT
476     //!           return the thread count
477     //!
478     virtual int32_t GetThreadCountForVfeState(
479         PVPHAL_RENDERING_DATA_COMPOSITE     pRenderingData,
480         PVPHAL_SURFACE                      pTarget);
481 
482     //!
483     //! \brief    Calculate Composite parameter and render data
484     //! \param    [in,out] pCompParams
485     //!           Pointer to Composite parameters.
486     //! \param    [in,out] pSource
487     //!           Pointer to surface.
488     //! \param    [in,out] pRenderingData
489     //!           Pointer to Composite RenderData.
490     //! \param    [out] pbColorfill
491     //!           Pointer to color fill flag.
492     //! \return   void
493     //!
494     virtual void CalculateRenderData(
495         PVPHAL_COMPOSITE_PARAMS         pCompParams,
496         PVPHAL_SURFACE                  pSurface,
497         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
498         bool*                           pbColorfill);
499 
500     //!
501     //! \brief    Adjust Params Based On Fc Limit
502     //! \param    [in,out] PCVPHAL_RENDER_PARAMS
503     //!           Pointer to pcRenderParam parameters.
504     //! \return   bool
505     //!
506     bool AdjustParamsBasedOnFcLimit(
507         PCVPHAL_RENDER_PARAMS pcRenderParam);
508 
509     //!
510     //! \brief    Set Sampler AVS parameters
511     //! \param    [in] pRenderingData
512     //!           pointer to render data
513     //! \param    [in] pSource
514     //!           pointer to source surface
515     //! \param    [in] pSurfaceEntry
516     //!           pointer to source state entry
517     //! \param    [out] pSamplerStateParams
518     //!           pointer to Sampler state params
519     //! \param    [in] fScaleX
520     //!           width scaling ratio
521     //! \param    [in] fScaleY
522     //!           height scaling ratio
523     //! \return   MOS_STATUS
524     //!
525     virtual MOS_STATUS SetSamplerAvsParams(
526         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
527         PVPHAL_SURFACE                  pSource,
528         PRENDERHAL_SURFACE_STATE_ENTRY  pSurfaceEntry,
529         PMHW_SAMPLER_STATE_PARAM        pSamplerStateParams,
530         float                           fScaleX,
531         float                           fScaleY);
532 
533     //!
534     //! \brief    set inline data
535     //! \param    [in] pBbArgs
536     //!           Pointer to Composite BB argument
537     //! \param    [in] pRenderingData
538     //!           Pointer to Composite render data
539     //! \param    [in] pStatic
540     //!           Pointer to static data
541     //! \param    [in,out] pInline
542     //!           Pointer to inline data
543     //! \param    [in,out] pInlineNLAS
544     //!           Pointer to NLAS inline data
545     //! \param    [in] x
546     //!           horizontal origin
547     //! \param    [out] fSrcX
548     //!           horizontal origin of layers
549     //! \return   void
550     //!
ModifyInlineData(PVPHAL_BB_COMP_ARGS pBbArgs,PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,MEDIA_OBJECT_KA2_STATIC_DATA * pStatic,MEDIA_OBJECT_KA2_INLINE_DATA * pInline,MEDIA_OBJECT_NLAS_INLINE_DATA * pInlineNLAS,int32_t x,float * fSrcX)551     virtual void ModifyInlineData(
552         PVPHAL_BB_COMP_ARGS                 pBbArgs,
553         PVPHAL_RENDERING_DATA_COMPOSITE     pRenderingData,
554         MEDIA_OBJECT_KA2_STATIC_DATA        *pStatic,
555         MEDIA_OBJECT_KA2_INLINE_DATA        *pInline,
556         MEDIA_OBJECT_NLAS_INLINE_DATA       *pInlineNLAS,
557         int32_t                             x,
558         float                               *fSrcX) {;}
559 
560     //!
561     //! \brief    Calculate crop factor
562     //! \param    [in] iLayer
563     //!           layer index
564     //! \param    [in] pRenderingData
565     //!           pointer to render data
566     //! \param    [out] pfCropX
567     //!           crop factor
568     //! \param    [out] pfCropY
569     //!           crop factor
570     //! \return   MOS_STATUS
571     //!
572     virtual MOS_STATUS CalculateCropParams(
573         int32_t                         iLayer,
574         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
575         float*                          pfCropX,
576         float*                          pfCropY);
577 
578     //!
579     //! \brief    Calculate and set inline data size
580     //! \param    [in] pRenderingData
581     //!           pointer to render data
582     //! \param    [out] pStatic
583     //!           pointer to static data
584     //! \return   void
585     //!
586     virtual int32_t CalculateInlineDataSize(
587         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
588         MEDIA_OBJECT_KA2_STATIC_DATA    *pStatic);
589 
590     //!
591     //! \brief    Calculate Media Object size
592     //! \param    [in] pRenderingData
593     //!           Pointer to Rendering Data
594     //! \return   int32_t
595     //!           Return the size of Media Object
596     //!
597     virtual int32_t CalculateMediaObjectSize(
598         PVPHAL_RENDERING_DATA_COMPOSITE     pRenderingData);
599 
600     //!
601     //! \brief    Modify MediaWalker Static Data
602     //! \param    [in] pRenderingData
603     //!           Pointer to Rendering Data
604     //! \return   void
605     //!
606     virtual void ModifyMediaWalkerStaticData(
607         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
608 
609     //!
610     //! \brief    Initialize Composite Rendering data
611     //! \details  Initialize Composite Rendering data, set output area, number of blocks,
612     //!           Sources, constriction parameters, rendering states, etc.
613     //! \param    [in] pCompParams
614     //!           Pointer to Composite parameters
615     //! \param    [out] pRenderingData
616     //!           Pointer to Composite Rendering data
617     //! \return   MOS_STATUS
618     //!
619     virtual MOS_STATUS RenderInit(
620         PVPHAL_COMPOSITE_PARAMS         pCompParams,
621         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
622 
623     //!
624     //! \brief    Release Composite Rendering data
625     //! \param    [in] pRenderingData
626     //!           Pointer to Composite Rendering data
627     //! \return   MOS_STATUS
628     //!
629     virtual void CleanRenderingData(
630         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
631 
632     //!
633     //! \brief    Fill in Gen specific static data
634     //! \details  Fill in Gen specific static data
635     //! \param    pRenderingData
636     //!           [in] Pointer to REnder Data
637     //! \param    pTarget
638     //!           [in] Pointer to Target Surface
639     //! \param    pStatic
640     //!           [in,out] Pointer to Static Data
641     //! \return   void
642     //!
643     virtual void SubmitStatesFillGenSpecificStaticData(
644         PVPHAL_RENDERING_DATA_COMPOSITE     pRenderingData,
645         PVPHAL_SURFACE                      pTarget,
646         MEDIA_OBJECT_KA2_STATIC_DATA        *pStatic) = 0;
647 
648     //!
649     //! \brief    Get Output Surface Chroma sitting position for kernel
650     //! \details  Get Output Surface Chroma sitting position for kernel
651     //! \param    pTarget
652     //!           [in] Pointer to Target Surface
653     //! \return   DWORD
654     //!           Return chroma sitting position
655     //!
656     uint32_t GetOutputChromaSitting(
657         PVPHAL_SURFACE                      pTarget);
658 
659     //!
660     //! \brief    Set Surface Compressed Parameters
661     //! \details  Set Surface Compressed Parameters, and compression mode
662     //! \param    [in,out] pSource
663     //!           Pointer to Source Surface
664     //! \param    [in] isRenderTarget
665     //!           Render Target or not
666     //! \return   void
667     //!
668     virtual void SetSurfaceCompressionParams(
669         PVPHAL_SURFACE                  pSource,
670         bool                            isRenderTarget);
671 
672     //!
673     //! \brief    Check NV12 luma key sampler solution is needed or not
674     //! \details  This func is needed for Gen9 platforms
675     //! \param    pSrc
676     //!           [in] Pointer to Source Surface
677     //! \param    pRenderHal
678     //!           [in] Pointer to render hal
679     //! \return   bool
680     //!           Return TRUE if needed, otherwise FALSE
681     //!
IsNV12SamplerLumakeyNeeded(PVPHAL_SURFACE pSrc,PRENDERHAL_INTERFACE pRenderHal)682     virtual bool IsNV12SamplerLumakeyNeeded(PVPHAL_SURFACE pSrc, PRENDERHAL_INTERFACE pRenderHal)
683     {
684         return false;
685     }
686 
687     //!
688     //! \brief    Check whether parameters for composition valid or not.
689     //! \param    [in] CompositeParams
690     //!           Parameters for composition
691     //! \return   MOS_STATUS
692     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
693     //!
694     virtual MOS_STATUS IsCompositeParamsValid(
695         const VPHAL_COMPOSITE_PARAMS& CompositeParams);
696 
697     //!
698     //! \brief    Get Sampler Index associated with a surface state for composite
699     //! \param    [in] pSurface
700     //!           point to input Surface
701     //! \param    [in] pEntry
702     //!           Pointer to Surface state
703     //! \param    [out] pSamplerIndex
704     //!           Pointer to Sampler Index
705     //! \param    [out] pSamplerType
706     //!           Pointer to Sampler Type
707     //! \return   MOS_STATUS
708     //!           Return MOS_STATUS_SUCCESS if successful, otherwise MOS_STATUS_UNKNOWN
709     //!
710     virtual MOS_STATUS GetSamplerIndex(
711         PVPHAL_SURFACE                      pSurface,
712         PRENDERHAL_SURFACE_STATE_ENTRY      pEntry,
713         int32_t*                            pSamplerIndex,
714         PMHW_SAMPLER_TYPE                   pSamplerType);
715 
716     //!
717     //! \brief    Update SamplerStateParams associated with a surface state for composite
718     //! \param    [in] pSamplerStateParams
719     //!           Pointer to SamplerStateParams
720     //! \param    [in] pEntry
721     //!           Pointer to Surface state
722     //! \param    [in] pRenderData
723     //!           Pointer to RenderData
724     //! \param    [in] uLayerNum
725     //!           Layer total number
726     //! \param    [in] SamplerFilterMode
727     //!           SamplerFilterMode to be set
728     //! \param    [out] pSamplerIndex
729     //!           Pointer to Sampler Index
730     //! \param    [out] pSurface
731     //!           point to Surface
732     //! \return   MOS_STATUS
733     //!           Return MOS_STATUS_SUCCESS if successful, otherwise MOS_STATUS_UNKNOWN
734     //!
735     virtual MOS_STATUS SetSamplerFilterMode(
736         PMHW_SAMPLER_STATE_PARAM       &pSamplerStateParams,
737         PRENDERHAL_SURFACE_STATE_ENTRY  pEntry,
738         PVPHAL_RENDERING_DATA_COMPOSITE pRenderData,
739         uint32_t                        uLayerNum,
740         MHW_SAMPLER_FILTER_MODE         SamplerFilterMode,
741         int32_t                        *pSamplerIndex,
742         PVPHAL_SURFACE                  pSource);
743 
744     //!
745     //! \brief    Check whether the 3Dsampler use for Y plane
746     //! \param    [in] SamplerID
747     //!           sampler ID
748     //! \return   bool
749     //!           Return true if the 3Dsampler use for Y plane, otherwise fase
750     //!
751     virtual bool IsSamplerIDForY(
752         int32_t                            SamplerID);
753 
754     //! \brief    set Sampler status
755     //! \param    [in] pSurface
756     //!           point to input Surface
757     //! \param    [in] Layer
758     //!           composition layer
759     //! \param    [in] pStatic
760     //!           Pointer to static data
761     //! \return   MOS_STATUS
762     //!           Return MOS_STATUS_SUCCESS if successful, otherwise MOS_STATUS_UNKNOWN
763     //!
Set3DSamplerStatus(PVPHAL_SURFACE pSurface,uint8_t Layer,MEDIA_OBJECT_KA2_STATIC_DATA * pStatic)764     virtual MOS_STATUS Set3DSamplerStatus(
765         PVPHAL_SURFACE                 pSurface,
766         uint8_t                        Layer,
767         MEDIA_OBJECT_KA2_STATIC_DATA   *pStatic)
768     {
769         // Just need the sub class to implement if it is needed;
770         return MOS_STATUS_SUCCESS;
771     }
772 
773     //! \brief    Update Inline Data status
774     //! \param    [in] pSurface
775     //!           point to input Surface
776     //! \param    [in] pStatic
777     //!           Pointer to static data
778     //! \return   MOS_STATUS
779     //!           Return MOS_STATUS_SUCCESS if successful, otherwise MOS_STATUS_UNKNOWN
780     //!
UpdateInlineDataStatus(PVPHAL_SURFACE pSurface,MEDIA_OBJECT_KA2_STATIC_DATA * pStatic)781     virtual MOS_STATUS UpdateInlineDataStatus(
782         PVPHAL_SURFACE                 pSurface,
783         MEDIA_OBJECT_KA2_STATIC_DATA   *pStatic)
784     {
785         // Just need the sub class to implement if it is needed;
786         return MOS_STATUS_SUCCESS;
787     }
788 
789     MOS_STATUS IntermediateAllocation(PVPHAL_SURFACE &pIntermediate,
790         PMOS_INTERFACE                               pOsInterface,
791         uint32_t                                     dwTempWidth,
792         uint32_t                                     dwTempHeight,
793         PVPHAL_SURFACE                               pTarget);
794 
795     //!
796     //! \brief    Prepare phases for composite and allocate intermediate buffer for rendering
797     //! \param    [in] pcRenderParams
798     //!           Pointer to Render parameters
799     //! \param    [in] ppSources
800     //!           Pointer to the address of Source Surfaces
801     //! \param    [in] iSources
802     //!           Count of Source Surfaces
803     //! \return   bool
804     //!           Return true if multiple phases, otherwise false
805     //!
806     virtual bool PreparePhases(
807         PCVPHAL_RENDER_PARAMS       pcRenderParams,
808         PVPHAL_SURFACE              *ppSources,
809         int32_t                     iSources);
810 
811     //!
812     //! \brief    Reset composite rendering parameters for the current phase
813     //! \param    [in,out] pComposite
814     //!           Pointer to Composite parameters
815     //! \return   void
816     //!
817     void ResetCompParams(
818         PVPHAL_COMPOSITE_PARAMS     pComposite);
819 
820     //!
821     //! \brief    Adds a source layer for composite
822     //! \param    [in,out] pComposite
823     //!           Pointer to Composite parameters
824     //! \param    [in] pSource
825     //!           Pointer to Source Surface
826     //! \return   bool
827     //!           Return TURE if source may be processed in the same phase, otherwise false
828     //!
829     bool AddCompLayer(
830         PVPHAL_COMPOSITE_PARAMS     pComposite,
831         PVPHAL_SURFACE              pSource,
832         bool                        bDisableAvsSampler);
833 
834     //!
835     //! \brief    Adds render target layer for composite
836     //! \param    [in,out] pComposite
837     //!           Pointer to Composite parameters
838     //! \param    [in] pTarget
839     //!           Pointer to target surface
840     //! \return   bool
841     //!           Return TURE if target may be processed in the same phase, otherwise false
842     //!
843     bool AddCompTarget(
844         PVPHAL_COMPOSITE_PARAMS     pComposite,
845         PVPHAL_SURFACE              pTarget);
846 
847     //!
848     //! \brief    set sclaing Ratio
849     //! \details  set sclaing Ratio for kernels which need to use different kernel to process scaling.
850     //!           parameters
851     //! \param    [in,out] Kdll_Scalingratio
852     //!           Pointer to scaling ratio
853     //! \return   void
SetFilterScalingRatio(Kdll_Scalingratio * ScalingRatio)854     virtual void SetFilterScalingRatio(
855         Kdll_Scalingratio*    ScalingRatio) {}
856 
857     //!
858     //! \brief    Render Compute Walker Buffer
859     //! \details  Render Compute Walker Buffer, fill Walker static data fields and set walker
860     //!           cmd params
861     //! \param    [in] pBatchBuffer
862     //!           Pointer to BatchBuffer
863     //! \param    [in] pRenderingData
864     //!           Pointer to Rendering Data
865     //! \param    [in] pWalkerParams
866     //!           Pointer to Walker parameters
867     //! \return   bool
868     //!           Return true if successful, otherwise false
869     //!
870     virtual bool RenderBufferComputeWalker(
871         PMHW_BATCH_BUFFER               pBatchBuffer,
872         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
873         PMHW_GPGPU_WALKER_PARAMS        pWalkerParams);
874 
875     //!
876     //! \brief    Submit Composite states
877     //! \details  Submit Composite states, including load CSC matrix, set NLAS Inline data,
878     //!           set background color, load Palettes, set output format, load kernel, load
879     //!           curbe data, set sampler state, set VFE State params, and etc
880     //! \param    [in] pRenderingData
881     //!           Pointer to Composite state
882     //! \return   bool
883     //!           Return TURE if successful, otherwise false
884     //!
885     virtual bool SubmitStates(
886         PVPHAL_RENDERING_DATA_COMPOSITE     pRenderingData);
887 
888     virtual bool IsDisableAVSSampler(
889         int32_t         iSources,
890         bool            isTargetY);
891 
892     //!
893     //! \brief    Decompress the Surface
894     //! \details  Decompress the interlaced Surface which is in the RC compression mode
895     //! \param    [in,out] pSource
896     //!           Pointer to Source Surface
897     //! \return   MOS_STATUS
898     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
899     //!
900     virtual MOS_STATUS DecompressInterlacedSurf(PVPHAL_SURFACE pSource);
901 
902 private:
903     //!
904     //! \brief    Prepare phases for composite and determine intermediate colorspace
905     //! \param    [in] pcRenderParams
906     //!           Pointer to Render parameters
907     //! \param    [in] ppSources
908     //!           Pointer to the address of Source Surfaces
909     //! \param    [in] iSources
910     //!           Count of Source Surfaces
911     //! \return   VPHAL_CSPACE
912     //!           Return intermediate colorspace
913     //!
914     VPHAL_CSPACE PrepareCSC(
915         PCVPHAL_RENDER_PARAMS   pcRenderParams,
916         PVPHAL_SURFACE          *ppSources,
917         int32_t                 iSources);
918 
919     //!
920     //! \brief    Composite multiple phase rendering
921     //! \details  Composite render with multiple phases. In some cases we cannot process composition just in one phase
922     //!           for example, if the input streams count is 9 (1 primary + 8 substreams), we need to postpone the
923     //!           9th stream to next second phase due to the input count limitation of current composition kernel.
924     //! \param    [in] pcRenderParams
925     //!           Pointer to VPHAL_RENDER_PARAMS
926     //! \param    [in] ppSources
927     //!           Pointer to PVPHAL_SURFACE, array of input surfaces
928     //! \param    [in] iSources
929     //!           constant int iSource indicating the size of ppSources
930     //! \param    [in] pOutput
931     //!           Pointer to VPHAL_SURFACE, output surface for the overall composition process
932     //! \return   MOS_STATUS
933     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
934     //!
935     MOS_STATUS RenderMultiPhase(
936         PCVPHAL_RENDER_PARAMS   pcRenderParams,
937         PVPHAL_SURFACE          *ppSources,
938         const int32_t           iSources,
939         PVPHAL_SURFACE          pOutput);
940 
941     //!
942     //! \brief    Perform multiple layer composite operation in one phase
943     //! \details  Perform multiple layer composite operation in one phase(scaling, blending,
944     //!           lumakey, CSC)
945     //! \param    [in,out] pCompParams
946     //!           Pointer to Composite parameters
947     //! \return   MOS_STATUS
948     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
949     //!
950     MOS_STATUS RenderPhase(
951         PVPHAL_COMPOSITE_PARAMS pCompParams);
952 
953     //!
954     //! \brief    Set Composite Scaling mode
955     //! \param    [in,out] pSource
956     //!           Pointer to Source Surface
957     //! \param    [in] uSourceCount
958     //!           Count of Source Surfaces
959     //! \return   void
960     //!
961     void SetScalingMode(
962         PVPHAL_SURFACE          pSource,
963         uint32_t                uSourceCount);
964 
965     //!
966     //! \brief    Judge whether Bob Di should be enabled
967     //! \details  Judge whether Bob Di should be enabled according to the parameter
968     //!           of pDeinterlaceParams and the height of the input surface
969     //! \param    [in] pSrc
970     //!           Pointer to Source Surface
971     //! \return   bool
972     //!           Return true if Bob DI should be enabled, otherwise false
973     //!
974     virtual bool IsBobDiEnabled(PVPHAL_SURFACE pSrc);
975 
976     //!
977     //! \brief    Set Composite Layer
978     //! \details  Set Composite Layer, including setup surface state and binding table, setup
979     //!           lumakey parameters, setup samplers, setup alpha blending parameters, adjust
980     //!           geometry for BOB DI, normalize source co-ordinates, set curbe and inline
981     //!           data, and etc
982     //! \param    [in] pRenderingData
983     //!           Pointer to Composite Rendering data
984     //! \param    [in] pSource
985     //!           Pointer to Source Surface
986     //! \param    [in] iLayerIdInCompParams
987     //!           Layer id in pCompParams for pSource
988     //! \param    [in,out] pCompParams
989     //!           Pointer to Composite parameters
990     //! \return   int32_t
991     //!           Return 1 if set layer successful, otherwise -1
992     //!
993     int32_t SetLayer(
994         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
995         PVPHAL_SURFACE                  pSource,
996         int                             iLayerIdInCompParams,
997         PVPHAL_COMPOSITE_PARAMS         pCompParams);
998 
999     //!
1000     //! \brief    Set Composite Render Target Layer
1001     //! \details  Set Composite Render Target Layer, setup surface state and binding table
1002     //! \param    [in] pRenderingData
1003     //!           Pointer to Composite Rendering data
1004     //! \param    [in] pCompParams
1005     //!           Pointer to Composite parameters
1006     //! \return   int32_t
1007     //!           Return number of Surface State entries if successful, otherwise -1
1008     //!
1009     int32_t SetLayerRT(
1010         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
1011         PVPHAL_COMPOSITE_PARAMS         pCompParams);
1012 
1013     //!
1014     //! \brief    Build filter description for dynamic linking
1015     //! \details  Build filter description(render method, current layer, layer format, layer
1016     //!           rotation, layer colorspace, sampling mode, scaling mode, luma key, blending,
1017     //!           colorfill, procamp, CSC) for dynamic linking
1018     //!           parameters
1019     //! \param    [in] pCompParams
1020     //!           Pointer to Composite parameters
1021     //! \param    [out] pFilter
1022     //!           Pointer to first filter entry
1023     //! \param    [out] piFilterSize
1024     //!           Pointer to filter size
1025     //! \return   bool
1026     //!           Return true if successful, otherwise false
1027     //!
1028     bool BuildFilter(
1029         PVPHAL_COMPOSITE_PARAMS         pCompParams,
1030         PKdll_FilterEntry               pFilter,
1031         int32_t*                        piFilterSize);
1032 
1033     //!
1034     //! \brief    Render Composite BatchBuffer
1035     //! \details  Render Composite BatchBuffer, fill Walker static data fields and set walker
1036     //!           cmd params
1037     //! \param    [in] pBatchBuffer
1038     //!           Pointer to BatchBuffer
1039     //! \param    [in] pRenderingData
1040     //!           Pointer to Rendering Data
1041     //! \param    [in] pWalkerParams
1042     //!           Pointer to Walker parameters
1043     //! \return   bool
1044     //!           Return true if successful, otherwise false
1045     //!
1046     bool RenderBufferMediaWalker(
1047         PMHW_BATCH_BUFFER               pBatchBuffer,
1048         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData,
1049         PMHW_WALKER_PARAMS              pWalkerParams);
1050 
1051     //!
1052     //! \brief    Judge whether  media walker pattern  will be vertical or not
1053     //! \details  if input layer is one , and input is linear format and rotation 90
1054     //!           or 270 is needed then the media walker pattern should be vertical
1055     //! \param    [in] pRenderingData
1056     //!           Pointer to Rendering Data
1057     //! \return   bool
1058     //!           Return true if vertical media pattern used, otherwise false
1059     //!
1060     bool MediaWalkerVertical(
1061         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
1062 
1063     //!
1064     //! \brief    Set Surface Parameters
1065     //! \details  Set Surface Parameters, set flags for RT, set surface type based on scaling
1066     //!           mode, set interlacing flags, etc.
1067     //! \param    [in,out] pSource
1068     //!           Pointer to Source Surface
1069     //! \param    [out] pSurfaceParams
1070     //!           Pointer to Surface Parameters
1071     //! \return   void
1072     //!
1073     void SetSurfaceParams(
1074         PVPHAL_SURFACE                  pSource,
1075         PRENDERHAL_SURFACE_STATE_PARAMS pSurfaceParams);
1076 
1077     //!
1078     //! \brief    Allocate Composite BatchBuffer
1079     //! \details  Allocate Composite BatchBuffer, search from existing BBs for a match. If
1080     //!           none, allocate new BB
1081     //! \param    [in] pRenderingData
1082     //!           Pointer to Rendering Data
1083     //! \param    [out] ppBatchBuffer
1084     //!           Pointer to the addr of the available BB. Pointer to nullptr if there's no
1085     //! \return   MOS_STATUS
1086     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
1087     //!
1088     MOS_STATUS AllocateBuffer(
1089         PVPHAL_RENDERING_DATA_COMPOSITE     pRenderingData,
1090         PMHW_BATCH_BUFFER                   *ppBatchBuffer);
1091 
1092     //!
1093     //! \brief    Render Composite BatchBuffer
1094     //! \details  Render Composite BatchBuffer, setup Media Object header and inline data
1095     //! \param    [in] pBatchBuffer
1096     //!           Pointer to BatchBuffer
1097     //! \param    [in] pRenderingData
1098     //!           Pointer to Rendering Data
1099     //! \return   bool
1100     //!           Return true if successful, otherwise false
1101     //!
1102     bool RenderBuffer(
1103         PMHW_BATCH_BUFFER               pBatchBuffer,
1104         PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData);
1105 
1106     //!
1107     //! \brief    Judge whether 8-tap adaptive filter for all channels should be enabled
1108     //! \details  Judge whether 8-tap adaptive filter for all channels should be enabled according to the input parameter
1109     //! \param    [in] pSrc
1110     //!           Pointer to Source Surface
1111     //! \param    [in] fScaleX
1112     //!           width scaling ratio
1113     //! \param    [in] fScaleY
1114     //!           height scaling ratio
1115     //! \return   bool
1116     //!           Return true 8-tap adaptive filter for all channels should be enabled, otherwise false
1117     //!
1118     bool Is8TapAdaptiveEnabled(
1119         PVPHAL_SURFACE          pSrc,
1120         float                   fScaleX,
1121         float                   fScaleY);
1122 
1123     //!
1124     //! \brief    Initialize Colorfill parameters
1125     //! \details  Initialize Colorfill parameters
1126     //! \return   void
1127     //!
1128     void InitColorFillParams();
1129 
1130     //!
1131     //! \brief    Check if sample unorm being used for source surface.
1132     //! \param    [in] pCompParams
1133     //!           Pointer to Composite parameters
1134     //! \param    pSrc
1135     //!           [in] Pointer to Source Surface
1136     //! \return   bool
1137     //!           Return TRUE if use sample unorm, otherwise FALSE
1138     //!
1139     bool IsUsingSampleUnorm(
1140         PVPHAL_COMPOSITE_PARAMS         pCompParams,
1141         PVPHAL_SURFACE                  pSrc);
1142 
1143     //!
1144     //! \brief    Check if sampler lumakey being supported or not for source surface.
1145     //! \param    pSrc
1146     //!           [in] Pointer to Source Surface
1147     //! \return   bool
1148     //!           Return TRUE if support, otherwise FALSE
1149     //!
1150     bool IsSamplerLumakeySupported(PVPHAL_SURFACE pSrc);
1151 
1152     //!
1153     //! \brief    Get intermediate surface output
1154     //! \param    pOutput
1155     //!           [in] Pointer to Intermediate Output Surface
1156     //! \return   PVPHAL_SURFACE
1157     //!           Return the chose output
1158     //!
1159     virtual MOS_STATUS GetIntermediateOutput(PVPHAL_SURFACE &output);
1160 
1161     virtual PVPHAL_SURFACE GetIntermediateSurface();
1162     virtual PVPHAL_SURFACE GetIntermediate1Surface();
1163     virtual PVPHAL_SURFACE GetIntermediate2Surface();
1164     // Procamp
1165     int32_t                         m_iMaxProcampEntries;
1166     int32_t                         m_iProcampVersion;
1167     Kdll_Procamp                    m_Procamp[VPHAL_MAX_PROCAMP];
1168 
1169     // Cache attributes
1170     VPHAL_COMPOSITE_CACHE_CNTL      m_SurfMemObjCtl;
1171 
1172     bool                            m_bNullHwRenderComp;      //!< Null rendering flag for Composite function
1173 
1174     bool                            m_b8TapAdaptiveEnable;    //!< 8 tap adaptive filter enable flag, read from user feature key
1175 
1176     Kdll_FilterDesc                 m_SearchFilter;
1177     Kdll_SearchState                m_KernelSearch;
1178     int32_t                         m_ThreadCountPrimary;
1179 
1180     // CMFC CSC Coefficient surface
1181     VPHAL_SURFACE                   m_CmfcCoeff;
1182     RENDERHAL_SURFACE               m_RenderHalCmfcCoeff;
1183 
1184     // Batch buffers
1185     int32_t                         m_iBatchBufferCount;
1186     MHW_BATCH_BUFFER                m_BatchBuffer[VPHAL_COMP_BUFFERS_MAX];
1187     VPHAL_BATCH_BUFFER_PARAMS       m_BufferParam[VPHAL_COMP_BUFFERS_MAX];
1188 
1189     // Multiple phase support
1190     int32_t                         m_iCallID;
1191 
1192     bool                            m_bLastPhase;                 //!< Flag for indicating the last Comp render phase
1193 
1194 protected:
1195 
1196      // Background Color fill parameters
1197     struct
1198     {
1199         VPHAL_COLOR_SAMPLE_8        m_csSrc;
1200         VPHAL_COLOR_SAMPLE_8        m_csDst;
1201         VPHAL_CSPACE                m_CSpaceSrc;
1202         VPHAL_CSPACE                m_CSpaceDst;
1203     };
1204 
1205     // Feature flags
1206     float                           m_fSamplerLinearBiasX;        //!< Linear sampler bias X
1207     float                           m_fSamplerLinearBiasY;        //!< Linear sampler bias Y
1208     bool                            m_bFtrMediaWalker;            //!< Media Object Walker enabled
1209     bool                            m_bFtrComputeWalker;          //!< Compute Walker enabled
1210     bool                            m_bFtrCSCCoeffPatchMode;      //!< Set CSC Coeff using patch mode
1211     bool                            m_bSamplerSupportRotation;    //!< Use sampler for Rotation
1212     bool                            m_bChromaUpSampling;          //!< Chroma Up Sampling needed
1213     bool                            m_bChromaDownSampling;        //!< Chroma Down Sampling needed
1214     bool                            m_bFallbackIefPatch;          //!< Fall back IEF path from AVS to SFC
1215     bool                            m_bKernelSupportDualOutput;   //!< Kernel support Dual Output
1216     bool                            m_bKernelSupportHdcDW;        //!< Kernel support HDC direct write
1217     bool                            m_bApplyTwoLayersCompOptimize;//!< Apply 2 layers composition optimization
1218     bool                            m_need3DSampler;              //!< If AVS Sampler not avaliable on specific platform, then we need 3D sampler instead
1219     bool                            m_bEnableSamplerLumakey;      //!< Enable/Disable sampler lumakey feature.
1220     bool                            m_bYV12iAvsScaling;           //!< Interlace AVS scaling support YV12 input format
1221 
1222     // AVS table
1223     MHW_AVS_PARAMS                  m_AvsParameters;
1224     MHW_SAMPLER_AVS_TABLE_PARAM     m_mhwSamplerAvsTableParam;    //!< params for AVS scaling 8x8 table
1225     bool                            m_bAvsTableCoeffExtraEnabled; //!< Sampler AVS table param, bIsCoeffExtraEnabled
1226     bool                            m_bAvsTableBalancedFilter;    //!< Sampler AVS table param, bBalancedFilter
1227 
1228     static const int                AVS_CACHE_SIZE = 4;           //!< AVS coefficients cache size
1229     AvsCoeffsCache<AVS_CACHE_SIZE>  m_AvsCoeffsCache;             //!< AVS coefficients calculation is expensive, add cache to mitigate
1230     VPHAL_SURFACE                   m_IntermediateSurface  = {};  //!< Intermediate surface (multiple phase / constriction support)
1231     VPHAL_SURFACE                   m_IntermediateSurface1 = {};  //!< Intermediate surface (multiple phase / constriction support)
1232     VPHAL_SURFACE                   *m_Intermediate  = nullptr;   //!< Intermediate surface (multiple phase / constriction support)
1233     VPHAL_SURFACE                   *m_Intermediate1 = nullptr;   //!< Intermediate surface (multiple phase / constriction support)
1234     VPHAL_SURFACE                   *m_Intermediate2 = nullptr;   //!< Rotation output intermediate surface
1235     VPHAL_SURFACE                   m_IntermediateSurface2 = {};  //!< Rotation output intermediate surface
1236 
1237     VPHAL_SURFACE                   m_AuxiliarySyncSurface = {};  //!< This Auxiliary surface is used to sync engine workload
1238 
1239     Kdll_State                      *m_pKernelDllState = nullptr; //!< Compositing Kernel DLL/Search state
1240     RENDERHAL_KERNEL_PARAM          m_KernelParams = {0};
1241 
1242     float                           m_fScaleX = 1.0f;
1243     float                           m_fScaleY = 1.0f;
1244 
1245     bool                            m_FusedEuDispatch = false;
1246 };
1247 
1248 typedef CompositeState * PCComposite;
1249 
1250 #endif // __VPHAL_RENDER_COMPOSITE_H__
1251