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