xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/gen11/hw/mhw_sfc_g11_X.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2015-2019, 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     mhw_sfc_g11_X.cpp
24 //! \brief    Constructs sfc commands on Gen11-based platforms
25 //! \details  Each client facing function both creates a HW command and adds
26 //!           that command to a command or batch buffer.
27 //!
28 
29 #include "mhw_sfc_g11_X.h"
30 
AddSfcState(PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_SFC_STATE_PARAMS pSfcStateParams,PMHW_SFC_OUT_SURFACE_PARAMS pOutSurface)31 MOS_STATUS MhwSfcInterfaceG11::AddSfcState(
32     PMOS_COMMAND_BUFFER            pCmdBuffer,
33     PMHW_SFC_STATE_PARAMS          pSfcStateParams,
34     PMHW_SFC_OUT_SURFACE_PARAMS    pOutSurface)
35 {
36     PMOS_INTERFACE              pOsInterface;
37     bool                        bHalfPitchForChroma;
38     bool                        bInterleaveChroma;
39     uint16_t                    wUXOffset;
40     uint16_t                    wUYOffset;
41     uint16_t                    wVXOffset;
42     uint16_t                    wVYOffset;
43     MHW_RESOURCE_PARAMS         ResourceParams;
44     MEDIA_WA_TABLE              *pWaTable = nullptr;
45 
46     mhw_sfc_g11_X::SFC_STATE_CMD cmd;
47 
48     MHW_CHK_NULL_RETURN(pCmdBuffer);
49     MHW_CHK_NULL_RETURN(pSfcStateParams);
50     MHW_CHK_NULL_RETURN(pOutSurface);
51 
52     pOsInterface = m_osInterface;
53     MHW_CHK_NULL_RETURN(pOsInterface);
54     pWaTable     = pOsInterface->pfnGetWaTable(pOsInterface);
55     MHW_CHK_NULL_RETURN(pWaTable);
56 
57     bHalfPitchForChroma = false;
58     bInterleaveChroma   = false;
59     wUXOffset           = 0;
60     wUYOffset           = 0;
61     wVXOffset           = 0;
62     wVYOffset           = 0;
63 
64     // Check input/output size
65     MHW_ASSERT(pSfcStateParams->dwInputFrameWidth   >= m_minWidth);
66     MHW_ASSERT(pSfcStateParams->dwInputFrameHeight  >= m_minHeight);
67     MHW_ASSERT(pSfcStateParams->dwOutputFrameWidth  <= m_maxWidth);
68     MHW_ASSERT(pSfcStateParams->dwOutputFrameHeight <= m_maxHeight);
69 
70     // Set DW1
71     cmd.DW1.SfcPipeMode                  = pSfcStateParams->sfcPipeMode;
72     cmd.DW1.SfcInputChromaSubSampling    = pSfcStateParams->dwInputChromaSubSampling;
73     cmd.DW1.VdVeInputOrderingMode        = pSfcStateParams->dwVDVEInputOrderingMode;
74 
75     // Set DW2
76     cmd.DW2.InputFrameResolutionWidth    = pSfcStateParams->dwInputFrameWidth - 1;
77     cmd.DW2.InputFrameResolutionHeight   = pSfcStateParams->dwInputFrameHeight - 1;
78 
79     // Set DW3
80     cmd.DW3.OutputChromaDownsamplingCoSitingPositionVerticalDirection   = pSfcStateParams->dwChromaDownSamplingVerticalCoef;
81     cmd.DW3.OutputChromaDownsamplingCoSitingPositionHorizontalDirection = pSfcStateParams->dwChromaDownSamplingHorizontalCoef;
82 
83     switch(pSfcStateParams->OutputFrameFormat)
84     {
85         case Format_AYUV:
86             cmd.DW3.OutputSurfaceFormatType = cmd.OUTPUT_SURFACE_FORMAT_TYPE_AYUV;
87             break;
88         case Format_X8R8G8B8:
89         case Format_A8R8G8B8:
90         case Format_X8B8G8R8:
91         case Format_A8B8G8R8:
92             cmd.DW3.OutputSurfaceFormatType = cmd.OUTPUT_SURFACE_FORMAT_TYPE_A8B8G8R8;
93             break;
94         case Format_R10G10B10A2:
95         case Format_B10G10R10A2:
96             cmd.DW3.OutputSurfaceFormatType = cmd.OUTPUT_SURFACE_FORMAT_TYPE_A2R10G10B10;
97             break;
98         case Format_R5G6B5:
99             cmd.DW3.OutputSurfaceFormatType = cmd.OUTPUT_SURFACE_FORMAT_TYPE_R5G6B5;
100             break;
101         case Format_NV12:
102             cmd.DW3.OutputSurfaceFormatType = cmd.OUTPUT_SURFACE_FORMAT_TYPE_NV12;
103             bInterleaveChroma   = true;
104             wUYOffset           = (uint16_t)pOutSurface->dwUYoffset;
105             break;
106         case Format_YUY2:
107             cmd.DW3.OutputSurfaceFormatType = cmd.OUTPUT_SURFACE_FORMAT_TYPE_YUYV;
108             break;
109         case Format_UYVY:
110             cmd.DW3.OutputSurfaceFormatType = cmd.OUTPUT_SURFACE_FORMAT_TYPE_UYVY;
111             break;
112         case Format_P010:
113             cmd.DW3.OutputSurfaceFormatType = cmd.OUTPUT_SURFACE_FORMAT_TYPE_P016;
114             cmd.DW4.Bitdepth                = 0;
115             wUYOffset                       = (uint16_t)pOutSurface->dwUYoffset;
116             break;
117         case Format_P016:
118             cmd.DW3.OutputSurfaceFormatType = cmd.OUTPUT_SURFACE_FORMAT_TYPE_P016;
119             cmd.DW4.Bitdepth                = 1;
120             wUYOffset                       = (uint16_t)pOutSurface->dwUYoffset;
121             break;
122         default:
123             MHW_ASSERTMESSAGE("Unknown Output Format.");
124             return MOS_STATUS_UNKNOWN;
125     }
126 
127     // RGBASwapEnable is true when the OutputSurfaceFormatType is set as A8B8G8R8 for X8R8G8B8 and A8R8G8B8 output,
128     // the OutputSurfaceFormatType is set as A2R10G10B10 for R10G10B10A2 output,
129     cmd.DW3.RgbaChannelSwapEnable = pSfcStateParams->bRGBASwapEnable;
130 
131     // Set DW4
132     cmd.DW4.IefEnable                    = pSfcStateParams->bIEFEnable;
133     cmd.DW4.SkinToneTunedIefEnable       = pSfcStateParams->bSkinToneTunedIEFEnable;
134     cmd.DW4.AvsFilterMode                = pSfcStateParams->dwAVSFilterMode;
135     cmd.DW4.AdaptiveFilterForAllChannels = (pSfcStateParams->dwAVSFilterMode == cmd.AVS_FILTER_MODE_8X8POLY_PHASEFILTERBILINEAR_ADAPTIVE) ?
136                                                       true : false;
137     cmd.DW4.AvsScalingEnable             = ((pSfcStateParams->fAVSXScalingRatio == 1.0F) &&
138                                                       (pSfcStateParams->fAVSYScalingRatio == 1.0F)) ? false : true;
139     cmd.DW4.BypassYAdaptiveFiltering     = pSfcStateParams->bBypassYAdaptiveFilter;
140     cmd.DW4.BypassXAdaptiveFiltering     = pSfcStateParams->bBypassXAdaptiveFilter;
141     cmd.DW4.ChromaUpsamplingEnable       = pSfcStateParams->bAVSChromaUpsamplingEnable;
142     cmd.DW4.RotationMode                 = pSfcStateParams->RotationMode;
143     cmd.DW4.ColorFillEnable              = pSfcStateParams->bColorFillEnable;
144     cmd.DW4.CscEnable                    = pSfcStateParams->bCSCEnable;
145 
146     if (pSfcStateParams->bMirrorEnable)
147     {
148         cmd.DW4.Value                   |= (uint32_t) (1 << 14) & 0x00004000;                                          // Mirror Mode
149         cmd.DW4.Value                   |= (uint32_t) (pSfcStateParams->dwMirrorType << 13) & 0x00002000;              // Mirror Type
150     }
151 
152     // Set DW5, DW6, DW7, DW8, DW9
153     cmd.DW5.SourceRegionWidth            = pSfcStateParams->dwSourceRegionWidth - 1;
154     cmd.DW5.SourceRegionHeight           = pSfcStateParams->dwSourceRegionHeight - 1;
155     cmd.DW6.SourceRegionHorizontalOffset = pSfcStateParams->dwSourceRegionHorizontalOffset;
156     cmd.DW6.SourceRegionVerticalOffset   = pSfcStateParams->dwSourceRegionVerticalOffset;
157     cmd.DW7.OutputFrameWidth             = pSfcStateParams->dwOutputFrameWidth + pOutSurface->dwSurfaceXOffset - 1;
158     cmd.DW7.OutputFrameHeight            = pSfcStateParams->dwOutputFrameHeight + pOutSurface->dwSurfaceYOffset - 1;
159     cmd.DW8.ScaledRegionSizeWidth        = pSfcStateParams->dwScaledRegionWidth - 1;
160     cmd.DW8.ScaledRegionSizeHeight       = pSfcStateParams->dwScaledRegionHeight - 1;
161     cmd.DW9.ScaledRegionHorizontalOffset = pSfcStateParams->dwScaledRegionHorizontalOffset + pOutSurface->dwSurfaceXOffset;
162     cmd.DW9.ScaledRegionVerticalOffset   = pSfcStateParams->dwScaledRegionVerticalOffset + pOutSurface->dwSurfaceYOffset;
163 
164     // Set DW10
165     cmd.DW10.GrayBarPixelUG              = MOS_CLAMP_MIN_MAX(MOS_F_ROUND(pSfcStateParams->fColorFillUGPixel * 1024.0F), 0, 1023); // U10
166     cmd.DW10.GrayBarPixelYR              = MOS_CLAMP_MIN_MAX(MOS_F_ROUND(pSfcStateParams->fColorFillYRPixel * 1024.0F), 0, 1023); // U10
167 
168     // Set DW11
169     cmd.DW11.GrayBarPixelA               = MOS_CLAMP_MIN_MAX(MOS_F_ROUND(pSfcStateParams->fColorFillAPixel * 1024.0F), 0, 1023); // U10
170     cmd.DW11.GrayBarPixelVB              = MOS_CLAMP_MIN_MAX(MOS_F_ROUND(pSfcStateParams->fColorFillVBPixel * 1024.0F), 0, 1023); // U10
171 
172     // Set DW13
173     cmd.DW13.AlphaDefaultValue           = MOS_CLAMP_MIN_MAX(MOS_F_ROUND(pSfcStateParams->fAlphaPixel * 1024.0F), 0, 1023); // U10
174 
175     // Set DW14
176     cmd.DW14.ScalingFactorHeight         = MOS_UF_ROUND((1.0F / pSfcStateParams->fAVSYScalingRatio) * 131072.0F); // U4.17
177 
178     // Set DW15
179     cmd.DW15.ScalingFactorWidth          = MOS_UF_ROUND((1.0F / pSfcStateParams->fAVSXScalingRatio) * 131072.0f); // U4.17
180 
181     // Set DW19
182     cmd.DW19.OutputFrameSurfaceBaseAddressMemoryCompressionEnable                   = pSfcStateParams->bMMCEnable;
183     cmd.DW19.OutputFrameSurfaceBaseAddressIndexToMemoryObjectControlStateMocsTables = m_outputSurfCtrl.Gen9.Index;
184 
185     if (pSfcStateParams->MMCMode == MOS_MMC_VERTICAL)
186     {
187         cmd.DW19.OutputFrameSurfaceBaseAddressMemoryCompressionMode = 1;
188     }
189 
190     // Set DW22
191     cmd.DW22.AvsLineBufferBaseAddressIndexToMemoryObjectControlStateMocsTables
192                                                    = m_avsLineBufferCtrl.Gen9.Index;
193     // Set DW25
194     cmd.DW25.IefLineBufferBaseAddressIndexToMemoryObjectControlStateMocsTables
195                                                    = m_iefLineBufferCtrl.Gen9.Index;
196     // Set DW29
197     cmd.DW29.OutputSurfaceTileWalk       = (pOutSurface->TileType == MOS_TILE_Y) ?
198                                                       true : false;
199     cmd.DW29.OutputSurfaceTiled          = (pOutSurface->TileType != MOS_TILE_LINEAR) ?
200                                                       true : false;
201     cmd.DW29.OutputSurfaceHalfPitchForChroma
202                                                    = bHalfPitchForChroma;
203     cmd.DW29.OutputSurfacePitch          = pOutSurface->dwPitch - 1;
204     cmd.DW29.OutputSurfaceInterleaveChromaEnable
205                                                    = bInterleaveChroma;
206     cmd.DW29.OutputSurfaceFormat         = cmd.DW3.OutputSurfaceFormatType;
207 
208     // Set DW30, DW31
209     cmd.DW30.OutputSurfaceYOffsetForU    = wUYOffset;
210     cmd.DW30.OutputSurfaceXOffsetForU    = wUXOffset;
211     cmd.DW31.OutputSurfaceYOffsetForV    = wVYOffset;
212     cmd.DW31.OutputSurfaceXOffsetForV    = wVXOffset;
213 
214     if (pSfcStateParams->pOsResOutputSurface)
215     {
216         MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
217         ResourceParams.presResource                = pSfcStateParams->pOsResOutputSurface;
218         ResourceParams.pdwCmd                      = &(cmd.DW17.Value);
219         ResourceParams.dwLocationInCmd             = 17;
220         ResourceParams.HwCommandType               = MOS_SFC_STATE;
221         ResourceParams.bIsWritable                 = true;
222         ResourceParams.dwOffset                    = pSfcStateParams->dwOutputSurfaceOffset;
223 
224         MHW_CHK_STATUS_RETURN(pfnAddResourceToCmd(
225           pOsInterface,
226           pCmdBuffer,
227           &ResourceParams));
228 
229         if (pOsInterface->bPitchAndUVPatchingNeeded)
230         {
231             cmd.DW29.OutputSurfacePitch                = 0;
232             ResourceParams.dwLocationInCmd             = 29;
233             ResourceParams.patchType                   = MOS_PATCH_TYPE_PITCH;
234             ResourceParams.shiftAmount                 = 3;
235             ResourceParams.shiftDirection              = 0;
236             ResourceParams.pdwCmd                      = &(cmd.DW29.Value);
237             MHW_CHK_STATUS_RETURN(pfnAddResourceToCmd(
238                                                       pOsInterface,
239                                                       pCmdBuffer,
240                                                       &ResourceParams));
241 
242             cmd.DW30.OutputSurfaceYOffsetForU = 0;
243 
244             ResourceParams.dwLocationInCmd             = 30;
245             ResourceParams.patchType                   = MOS_PATCH_TYPE_UV_Y_OFFSET;
246             ResourceParams.shiftAmount                 = 0;
247             ResourceParams.pdwCmd                      = &(cmd.DW30.Value);
248             MHW_CHK_STATUS_RETURN(pfnAddResourceToCmd(
249                                                       pOsInterface,
250                                                       pCmdBuffer,
251                                                       &ResourceParams));
252         }
253     }
254 
255     if (pSfcStateParams->pOsResAVSLineBuffer)
256     {
257         MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
258         ResourceParams.presResource                = pSfcStateParams->pOsResAVSLineBuffer;
259         ResourceParams.pdwCmd                      = &(cmd.DW20.Value);
260         ResourceParams.dwLocationInCmd             = 20;
261         ResourceParams.HwCommandType               = MOS_SFC_STATE;
262         ResourceParams.bIsWritable                 = true;
263 
264         MHW_CHK_STATUS_RETURN(pfnAddResourceToCmd(
265           pOsInterface,
266           pCmdBuffer,
267           &ResourceParams));
268     }
269 
270     if (pSfcStateParams->pOsResIEFLineBuffer)
271     {
272         MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
273         ResourceParams.presResource                = pSfcStateParams->pOsResIEFLineBuffer;
274         ResourceParams.pdwCmd                      = &(cmd.DW23.Value);
275         ResourceParams.dwLocationInCmd             = 23;
276         ResourceParams.HwCommandType               = MOS_SFC_STATE;
277         ResourceParams.bIsWritable                 = true;
278 
279         MHW_CHK_STATUS_RETURN(pfnAddResourceToCmd(
280           pOsInterface,
281           pCmdBuffer,
282           &ResourceParams));
283     }
284 
285     MHW_CHK_STATUS_RETURN(pOsInterface->pfnAddCommand(pCmdBuffer, &cmd, cmd.byteSize));
286 
287     return MOS_STATUS_SUCCESS;
288 }
289 
AddSfcAvsState(PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_SFC_AVS_STATE pSfcAvsState)290 MOS_STATUS MhwSfcInterfaceG11::AddSfcAvsState(
291     PMOS_COMMAND_BUFFER             pCmdBuffer,
292     PMHW_SFC_AVS_STATE              pSfcAvsState)
293 {
294     MHW_CHK_NULL_RETURN(pCmdBuffer);
295     MHW_CHK_NULL_RETURN(pSfcAvsState);
296 
297     mhw_sfc_g11_X::SFC_AVS_STATE_CMD *cmdPtr;
298     cmdPtr = (mhw_sfc_g11_X::SFC_AVS_STATE_CMD *)pCmdBuffer->pCmdPtr;
299 
300     MHW_CHK_STATUS_RETURN(MhwSfcInterfaceGeneric::AddSfcAvsState(pCmdBuffer, pSfcAvsState));
301 
302     if (pSfcAvsState)
303     {
304         MHW_CHK_NULL_RETURN(cmdPtr);
305         cmdPtr->DW3.InputHorizontalSitingValueSpecifiesTheHorizontalSitingOfTheInput = pSfcAvsState->dwInputHorizontalSiting;
306         cmdPtr->DW3.InputVerticalSitingSpecifiesTheVerticalSitingOfTheInput          = pSfcAvsState->dwInputVerticalSitting;
307     }
308 
309     return MOS_STATUS_SUCCESS;
310 }
311 
SetSfcSamplerTable(PMHW_SFC_AVS_LUMA_TABLE pLumaTable,PMHW_SFC_AVS_CHROMA_TABLE pChromaTable,PMHW_AVS_PARAMS pAvsParams,MOS_FORMAT SrcFormat,float fScaleX,float fScaleY,uint32_t dwChromaSiting,bool bUse8x8Filter,float fHPStrength,float fLanczosT)312 MOS_STATUS MhwSfcInterfaceG11::SetSfcSamplerTable(
313     PMHW_SFC_AVS_LUMA_TABLE      pLumaTable,
314     PMHW_SFC_AVS_CHROMA_TABLE    pChromaTable,
315     PMHW_AVS_PARAMS              pAvsParams,
316     MOS_FORMAT                   SrcFormat,
317     float                        fScaleX,
318     float                        fScaleY,
319     uint32_t                     dwChromaSiting,
320     bool                         bUse8x8Filter,
321     float                           fHPStrength,
322     float                           fLanczosT)
323 {
324     int32_t     *piYCoefsX, *piYCoefsY;
325     int32_t     *piUVCoefsX, *piUVCoefsY;
326     MHW_PLANE   Plane;
327 
328     MHW_CHK_NULL_RETURN(pLumaTable);
329     MHW_CHK_NULL_RETURN(pChromaTable);
330     MHW_CHK_NULL_RETURN(pAvsParams);
331 
332     fHPStrength = 0.0F;
333     piYCoefsX = pAvsParams->piYCoefsX;
334     piYCoefsY = pAvsParams->piYCoefsY;
335     piUVCoefsX = pAvsParams->piUVCoefsX;
336     piUVCoefsY = pAvsParams->piUVCoefsY;
337 
338     //  Skip calculation if no changes to AVS parameters
339     if (SrcFormat == pAvsParams->Format  &&
340         fScaleX == pAvsParams->fScaleX &&
341         fScaleY == pAvsParams->fScaleY)
342     {
343         return MOS_STATUS_SUCCESS;
344     }
345 
346     // AVS Coefficients don't change for Scaling Factors > 1.0x
347     // Hence recalculation is avoided
348     if (fScaleX > 1.0F && pAvsParams->fScaleX > 1.0F)
349     {
350         pAvsParams->fScaleX = fScaleX;
351     }
352 
353     // AVS Coefficients don't change for Scaling Factors > 1.0x
354     // Hence recalculation is avoided
355     if (fScaleY > 1.0F && pAvsParams->fScaleY > 1.0F)
356     {
357         pAvsParams->fScaleY = fScaleY;
358     }
359 
360     // Recalculate Horizontal scaling table
361     if (SrcFormat != pAvsParams->Format || fScaleX != pAvsParams->fScaleX)
362     {
363         MOS_ZeroMemory(
364             piYCoefsX,
365             8 * 32 * sizeof(int32_t));
366 
367         MOS_ZeroMemory(
368             piUVCoefsX,
369             4 * 32 * sizeof(int32_t));
370 
371         // 4-tap filtering for RGB format G-channel.
372         Plane = IS_RGB32_FORMAT(SrcFormat) ? MHW_U_PLANE : MHW_Y_PLANE;
373 
374         pAvsParams->fScaleX = fScaleX;
375 
376         if (m_scalingMode == MHW_SCALING_NEAREST)
377         {
378             MHW_CHK_STATUS_RETURN(Mhw_SetNearestModeTable(
379                 piYCoefsX,
380                 Plane,
381                 true));
382 
383             MHW_CHK_STATUS_RETURN(Mhw_SetNearestModeTable(
384                 piUVCoefsX,
385                 MHW_U_PLANE,
386                 true));
387         }
388         else
389         {
390             // For 1x scaling in horizontal direction and not force polyphase coefs, use special coefficients for filtering
391             if ((fScaleX == 1.0F && !pAvsParams->bForcePolyPhaseCoefs))
392             {
393                 MHW_CHK_STATUS_RETURN(Mhw_SetNearestModeTable(
394                     piYCoefsX,
395                     Plane,
396                     true));
397 
398                 MHW_CHK_STATUS_RETURN(Mhw_SetNearestModeTable(
399                     piUVCoefsX,
400                     MHW_U_PLANE,
401                     true));
402             }
403             else
404             {
405                 // Clamp the Scaling Factor if > 1.0x
406                 fScaleX = MOS_MIN(1.0F, fScaleX);
407 
408                 MHW_CHK_STATUS_RETURN(Mhw_CalcPolyphaseTablesY(
409                     piYCoefsX,
410                     fScaleX,
411                     Plane,
412                     SrcFormat,
413                     fHPStrength,
414                     bUse8x8Filter,
415                     NUM_HW_POLYPHASE_TABLES,
416                     0));
417             }
418 
419             // If Chroma Siting info is present
420             if (dwChromaSiting & MHW_CHROMA_SITING_HORZ_LEFT)
421             {
422                 // No Chroma Siting
423                 MHW_CHK_STATUS_RETURN(Mhw_CalcPolyphaseTablesUV(
424                     piUVCoefsX,
425                     2.0F,
426                     fScaleX));
427             }
428             else
429             {
430                 // Chroma siting offset will be add in the HW cmd
431                 MHW_CHK_STATUS_RETURN(Mhw_CalcPolyphaseTablesUV(
432                     piUVCoefsX,
433                     3.0F,
434                     fScaleX));
435             }
436         }
437     }
438 
439     // Recalculate Vertical scaling table
440     if (SrcFormat != pAvsParams->Format || fScaleY != pAvsParams->fScaleY)
441     {
442         MOS_ZeroMemory(piYCoefsY, 8 * 32 * sizeof(int32_t));
443 
444         MOS_ZeroMemory(piUVCoefsY, 4 * 32 * sizeof(int32_t));
445 
446         // 4-tap filtering for RGB format G-channel.
447         Plane = IS_RGB32_FORMAT(SrcFormat) ? MHW_U_PLANE : MHW_Y_PLANE;
448 
449         pAvsParams->fScaleY = fScaleY;
450 
451         if (m_scalingMode == MHW_SCALING_NEAREST)
452         {
453             MHW_CHK_STATUS_RETURN(Mhw_SetNearestModeTable(
454                 piYCoefsY,
455                 Plane,
456                 true));
457 
458             MHW_CHK_STATUS_RETURN(Mhw_SetNearestModeTable(
459                 piUVCoefsY,
460                 MHW_U_PLANE,
461                 true));
462         }
463         else
464         {
465             // For 1x scaling in vertical direction and not force polyphase coefs, use special coefficients for filtering
466             if ((fScaleY == 1.0F && !pAvsParams->bForcePolyPhaseCoefs))
467             {
468                 MHW_CHK_STATUS_RETURN(Mhw_SetNearestModeTable(
469                     piYCoefsY,
470                     Plane,
471                     true));
472 
473                 MHW_CHK_STATUS_RETURN(Mhw_SetNearestModeTable(
474                     piUVCoefsY,
475                     MHW_U_PLANE,
476                     true));
477             }
478             else
479             {
480                 // Clamp the Scaling Factor if > 1.0x
481                 fScaleY = MOS_MIN(1.0F, fScaleY);
482 
483                 MHW_CHK_STATUS_RETURN(Mhw_CalcPolyphaseTablesY(
484                     piYCoefsY,
485                     fScaleY,
486                     Plane,
487                     SrcFormat,
488                     fHPStrength,
489                     bUse8x8Filter,
490                     NUM_HW_POLYPHASE_TABLES, 0));
491             }
492 
493             // If Chroma Siting info is present
494             if (dwChromaSiting & MHW_CHROMA_SITING_VERT_TOP)
495             {
496                 // No Chroma Siting
497                 MHW_CHK_STATUS_RETURN(Mhw_CalcPolyphaseTablesUV(
498                     piUVCoefsY,
499                     2.0F,
500                     fScaleY));
501             }
502             else
503             {
504                 // Chroma siting offset will be add in the HW cmd
505                 MHW_CHK_STATUS_RETURN(Mhw_CalcPolyphaseTablesUV(
506                     piUVCoefsY,
507                     3.0F,
508                     fScaleY));
509             }
510         }
511     }
512 
513     // Save format used to calculate AVS parameters
514     pAvsParams->Format = SrcFormat;
515 
516     SetSfcAVSLumaTable(
517         SrcFormat,
518         pLumaTable->LumaTable,
519         piYCoefsX,
520         piYCoefsY,
521         false);
522 
523     SetSfcAVSChromaTable(
524         pChromaTable->ChromaTable,
525         piUVCoefsX,
526         piUVCoefsY);
527 
528     return MOS_STATUS_SUCCESS;
529 }
530 
MhwSfcInterfaceG11(PMOS_INTERFACE pOsInterface)531 MhwSfcInterfaceG11::MhwSfcInterfaceG11(PMOS_INTERFACE pOsInterface) : MhwSfcInterfaceGeneric(pOsInterface)
532 {
533     if (m_osInterface == nullptr)
534     {
535          MHW_ASSERTMESSAGE("Invalid Input Paramete: m_osInterface is nullptr");
536         return;
537     }
538 
539     // Get Memory control object directly from MOS.
540     // If any override is needed, something like pfnOverrideMemoryObjectCtrl() / pfnComposeSurfaceCacheabilityControl()
541     // will need to be implemented.
542     m_outputSurfCtrl.Value = m_osInterface->pfnCachePolicyGetMemoryObject(
543         MOS_MHW_RESOURCE_USAGE_Sfc_CurrentOutputSurface,
544         m_osInterface->pfnGetGmmClientContext(m_osInterface)).DwordValue;
545 
546     m_avsLineBufferCtrl.Value = m_osInterface->pfnCachePolicyGetMemoryObject(
547         MOS_MHW_RESOURCE_USAGE_Sfc_AvsLineBufferSurface,
548         m_osInterface->pfnGetGmmClientContext(m_osInterface)).DwordValue;
549     m_iefLineBufferCtrl.Value = m_osInterface->pfnCachePolicyGetMemoryObject(
550         MOS_MHW_RESOURCE_USAGE_Sfc_IefLineBufferSurface,
551         m_osInterface->pfnGetGmmClientContext(m_osInterface)).DwordValue;
552 }
553