xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/common/vp/hal/vphal_ddi.c (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2009-2023, 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_ddi.c
24 //! \brief    VPHAL related utility functions that are needed in DDI layer
25 //! \details  Common utility functions for different DDI layers
26 //!
27 #include "vphal_ddi.h"
28 #include "vphal.h"
29 
30 //!
31 //! \brief    Delete surface at DDI layer
32 //! \details  Free different parameter structures in surfaces and free surfaces
33 //!           at DDI layer, e.g. Sourc/Target/Bwd/Fwd surface
34 //! \param    [in,out] pSurf
35 //!           VPHAL surface pointer
36 //! \return   void
37 //!
VpHal_DdiDeleteSurface(PVPHAL_SURFACE pSurf)38 void VpHal_DdiDeleteSurface(PVPHAL_SURFACE pSurf)
39 {
40     if (pSurf)
41     {
42         if (pSurf->pBwdRef)
43         {
44             VpHal_DdiDeleteSurface(pSurf->pBwdRef);
45         }
46 
47         if (pSurf->pFwdRef)
48         {
49             VpHal_DdiDeleteSurface(pSurf->pFwdRef);
50         }
51 
52         MOS_SafeFreeMemory(pSurf->Palette.pPalette8);
53 
54         MOS_SafeFreeMemory(pSurf->pBlendingParams);
55 
56         MOS_SafeFreeMemory(pSurf->pLumaKeyParams);
57 
58         if (pSurf->pIEFParams)
59         {
60             MOS_SafeFreeMemory(pSurf->pIEFParams->pExtParam);
61             MOS_SafeFreeMemory(pSurf->pIEFParams);
62         }
63 
64         MOS_SafeFreeMemory(pSurf->pProcampParams);
65 
66         MOS_SafeFreeMemory(pSurf->pDeinterlaceParams);
67 
68         MOS_SafeFreeMemory(pSurf->pDenoiseParams);
69 
70         MOS_SafeFreeMemory(pSurf->pColorPipeParams);
71 
72         if (pSurf->p3DLutParams)
73         {
74             MOS_SafeFreeMemory(pSurf->p3DLutParams->pExt3DLutSurface);
75             MOS_SafeFreeMemory(pSurf->p3DLutParams);
76         }
77 
78         MOS_SafeFreeMemory(pSurf);
79     }
80 }
81 
82 //!
83 //! \brief    Destroy VPHAL rendering parameters
84 //! \details  Free source/target surface and other parameters
85 //! \param    [in,out] pRenderParams
86 //!           Render parameter pointer
87 //! \return   void
88 //!
VpHal_DdiReleaseRenderParams(PVPHAL_RENDER_PARAMS pRenderParams)89 void VpHal_DdiReleaseRenderParams(PVPHAL_RENDER_PARAMS pRenderParams)
90 {
91     int i;
92 
93     MOS_SafeFreeMemory(pRenderParams->pColorFillParams);
94 
95     MOS_SafeFreeMemory(pRenderParams->pCompAlpha);
96 
97     MOS_SafeFreeMemory(pRenderParams->pConstriction);
98 
99     for (i = 0; i < VPHAL_MAX_SOURCES; i++)
100     {
101         if (pRenderParams->pSrc[i])
102         {
103             VpHal_DdiDeleteSurface(pRenderParams->pSrc[i]);
104         }
105     }
106 
107     for (i = 0; i < VPHAL_MAX_TARGETS; i++)
108     {
109         if (pRenderParams->pTarget[i])
110         {
111             VpHal_DdiDeleteSurface(pRenderParams->pTarget[i]);
112         }
113     }
114 }
115 
116 //!
117 //! \brief    Judge whether the input procamp value is default or not
118 //! \details  If the procamp values requested are outside one step of the
119 //!           default value(to handle precision errors), then return true
120 //! \param    [in] ProcAmpParameters
121 //!           ProcAmp Parameters
122 //! \return   bool
123 //!           - true  The input procamp value is not default
124 //!           - false The input procamp value is default
125 //!
VpHal_DdiProcAmpValuesNotDefault(VPHAL_PROCAMP_PARAMS ProcAmpParameters)126 bool VpHal_DdiProcAmpValuesNotDefault(VPHAL_PROCAMP_PARAMS ProcAmpParameters)
127 {
128     if (OUT_OF_BOUNDS(
129         ProcAmpParameters.fBrightness,
130         PROCAMP_BRIGHTNESS_DEFAULT - PROCAMP_BRIGHTNESS_STEP,
131         PROCAMP_BRIGHTNESS_DEFAULT + PROCAMP_BRIGHTNESS_STEP)  ||
132         OUT_OF_BOUNDS(
133         ProcAmpParameters.fContrast,
134         PROCAMP_CONTRAST_DEFAULT - PROCAMP_CONTRAST_STEP,
135         PROCAMP_CONTRAST_DEFAULT + PROCAMP_CONTRAST_STEP)      ||
136         OUT_OF_BOUNDS(
137         ProcAmpParameters.fHue,
138         PROCAMP_HUE_DEFAULT - PROCAMP_HUE_STEP,
139         PROCAMP_HUE_DEFAULT + PROCAMP_HUE_STEP)                ||
140         OUT_OF_BOUNDS(
141         ProcAmpParameters.fSaturation,
142         PROCAMP_SATURATION_DEFAULT - PROCAMP_SATURATION_STEP,
143         PROCAMP_SATURATION_DEFAULT + PROCAMP_SATURATION_STEP))
144     {
145         return true;
146     }
147     return false;
148 }
149 
150 //!
151 //! \brief    Report mode of different features
152 //! \details  Report DI/Scaling/OutputPipe/FRC mode
153 //! \param    [in] pVpHalState
154 //!           VPHAL state pointer
155 //! \param    [in,out] pConfigValues
156 //!           Porinter to configuration report value structure,
157 //!           feature modes will be store in this structure.
158 //! \return   void
159 //!
VpHal_DdiReportFeatureMode(VpBase * pVpHalState,PVP_CONFIG pConfigValues)160 void VpHal_DdiReportFeatureMode(
161     VpBase              *pVpHalState,
162     PVP_CONFIG          pConfigValues)
163 {
164     VphalFeatureReport* pReport;
165 
166     // Get VPHAL feature reporting
167     pReport = pVpHalState->GetRenderFeatureReport();
168     VPHAL_PUBLIC_CHK_NULL_NO_STATUS_RETURN(pReport);
169 
170     // Report DI mode
171     switch (pReport->GetFeatures().deinterlaceMode)
172     {
173         case VPHAL_DI_REPORT_BOB         :
174         case VPHAL_DI_REPORT_ADI_BOB     :
175             pConfigValues->dwCurrentDeinterlaceMode = VPDDI_BOB;
176             break;
177         case VPHAL_DI_REPORT_ADI         :
178         case VPHAL_DI_REPORT_FMD         :
179             pConfigValues->dwCurrentDeinterlaceMode = VPDDI_ADI;
180             break;
181         case VPHAL_DI_REPORT_PROGRESSIVE :
182         default:
183             pConfigValues->dwCurrentDeinterlaceMode = VPDDI_PROGRESSIVE;
184             break;
185     }
186 
187     // Report Scaling mode
188     pConfigValues->dwCurrentScalingMode =
189         (pReport->GetFeatures().scalingMode == VPHAL_SCALING_AVS) ? VPDDI_ADVANCEDSCALING :
190             (pReport->GetFeatures().scalingMode > VPHAL_SCALING_AVS) ? VPDDI_SUPERRESOLUTIONSCALING : VPDDI_SCALING;
191 
192     // Report Output Pipe
193     pConfigValues->dwCurrentOutputPipeMode = pReport->GetFeatures().outputPipeMode;
194 
195     // Report HDR Mode
196     pConfigValues->dwCurrentHdrMode = pReport->GetFeatures().hdrMode;
197 
198     // Report VE Feature In Use
199     pConfigValues->dwCurrentVEFeatureInUse = pReport->GetFeatures().veFeatureInUse;
200 
201     // Report MMC status
202     pConfigValues->dwVPMMCInUse              = pReport->GetFeatures().vpMMCInUse;
203     pConfigValues->dwRTCompressible          = pReport->GetFeatures().rtCompressible;
204     pConfigValues->dwRTCompressMode          = pReport->GetFeatures().rtCompressMode;
205     pConfigValues->dwFFDICompressible        = pReport->GetFeatures().ffdiCompressible;
206     pConfigValues->dwFFDICompressMode        = pReport->GetFeatures().ffdiCompressMode;
207     pConfigValues->dwFFDNCompressible        = pReport->GetFeatures().ffdnCompressible;
208     pConfigValues->dwFFDNCompressMode        = pReport->GetFeatures().ffdnCompressMode;
209     pConfigValues->dwSTMMCompressible        = pReport->GetFeatures().stmmCompressible;
210     pConfigValues->dwSTMMCompressMode        = pReport->GetFeatures().stmmCompressMode;
211     pConfigValues->dwScalerCompressible      = pReport->GetFeatures().scalerCompressible;
212     pConfigValues->dwScalerCompressMode      = pReport->GetFeatures().scalerCompressMode;
213     pConfigValues->dwPrimaryCompressible     = pReport->GetFeatures().primaryCompressible;
214     pConfigValues->dwPrimaryCompressMode     = pReport->GetFeatures().primaryCompressMode;
215 
216     // Report In Place Compositon status
217     pConfigValues->dwCurrentCompositionMode = pReport->GetFeatures().compositionMode;
218     pConfigValues->dwCurrentScdMode         = pReport->GetFeatures().diScdMode;
219 
220     // Report Vebox Scalability
221     pConfigValues->dwCurrentVeboxScalability = pReport->GetFeatures().VeboxScalability;
222 
223     // Report VP Apogeios
224     pConfigValues->dwCurrentVPApogeios       = pReport->GetFeatures().VPApogeios;
225 
226     VP_DDI_NORMALMESSAGE("VP Feature Report: \
227         OutputPipeMode %d, \
228         HDRMode %d, \
229         VEFeatureInUse %d, \
230         ScalingMode %d, \
231         DeinterlaceMode %d, \
232         VPMMCInUse %d, \
233         RTCompressible %d, \
234         RTCompressMode %d, \
235         PrimaryCompressible %d, \
236         PrimaryCompressMode %d, \
237         CompositionMode %d",
238         pReport->GetFeatures().outputPipeMode,
239         pReport->GetFeatures().hdrMode,
240         pReport->GetFeatures().veFeatureInUse,
241         pReport->GetFeatures().scalingMode,
242         pReport->GetFeatures().deinterlaceMode,
243         pReport->GetFeatures().vpMMCInUse,
244         pReport->GetFeatures().rtCompressible,
245         pReport->GetFeatures().rtCompressMode,
246         pReport->GetFeatures().primaryCompressible,
247         pReport->GetFeatures().primaryCompressMode,
248         pReport->GetFeatures().compositionMode
249     );
250 }
251 
252 //!
253 //! \brief    Set up split screen demo mode
254 //! \details  Allocate and initialize split-screen demo mode structure
255 //! \param    [in] splitDemoPosDdi
256 //!           The split demo position setting from DDI layer
257 //! \param    [in] splitDemoParaDdi
258 //!           The split demo parameters setting from DDI layer
259 //! \param    [in,out] splitScreenDemoModeParams
260 //!           Pointer to struct for split-screen demo mode parameters
261 //! \param    [in,out] disableDemoMode
262 //!           Return whether demo mode will be disable or not
263 //! \param    [in] disableDemoMode
264 //!           Pointer to MOS INTERFACE for OS interaction
265 //! \return   MOS_STATUS
266 //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
267 //!
VpHal_DdiSetupSplitScreenDemoMode(uint32_t splitDemoPosDdi,uint32_t splitDemoParaDdi,PVPHAL_SPLIT_SCREEN_DEMO_MODE_PARAMS * splitScreenDemoModeParams,bool * disableDemoMode,PMOS_INTERFACE pOsInterface)268 MOS_STATUS VpHal_DdiSetupSplitScreenDemoMode(
269     uint32_t                                splitDemoPosDdi,
270     uint32_t                                splitDemoParaDdi,
271     PVPHAL_SPLIT_SCREEN_DEMO_MODE_PARAMS    *splitScreenDemoModeParams,
272     bool                                    *disableDemoMode,
273     PMOS_INTERFACE                           pOsInterface)
274 {
275     MOS_STATUS                  eStatus;
276     uint32_t                    splitScreenDemoPosition;
277     uint32_t                    splitScreenDemoParameters;
278 
279     eStatus                     = MOS_STATUS_SUCCESS;
280     splitScreenDemoPosition     = splitDemoPosDdi;
281     splitScreenDemoParameters   = splitDemoParaDdi;
282 
283     //--------------------------
284     // Set Demo Mode Parameters
285     //--------------------------
286     if (*splitScreenDemoModeParams == nullptr)
287     {
288         *splitScreenDemoModeParams = (PVPHAL_SPLIT_SCREEN_DEMO_MODE_PARAMS)MOS_AllocAndZeroMemory(sizeof(VPHAL_SPLIT_SCREEN_DEMO_MODE_PARAMS));
289         VPHAL_PUBLIC_CHK_NULL(*splitScreenDemoModeParams);
290     }
291 
292 #if (_DEBUG || _RELEASE_INTERNAL)
293     // If it is not enabled from DDI params, check if internal user feature key have settings
294     if (splitScreenDemoPosition == SPLIT_SCREEN_DEMO_DISABLED &&
295         splitScreenDemoParameters == 0)
296     {
297         MOS_USER_FEATURE_VALUE_DATA UserFeatureData;
298 
299         MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
300         MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
301             nullptr,
302             __MEDIA_USER_FEATURE_VALUE_SPLIT_SCREEN_DEMO_POSITION_ID,
303             &UserFeatureData,
304             pOsInterface ? pOsInterface->pOsContext : nullptr));
305         splitScreenDemoPosition = UserFeatureData.u32Data;
306 
307         MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
308         MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
309             nullptr,
310             __MEDIA_USER_FEATURE_VALUE_SPLIT_SCREEN_DEMO_PARAMETERS_ID,
311             &UserFeatureData,
312             pOsInterface ? pOsInterface->pOsContext : nullptr));
313         splitScreenDemoParameters = UserFeatureData.u32Data;
314     }
315 #endif
316 
317     if ((splitScreenDemoPosition > SPLIT_SCREEN_DEMO_DISABLED) && (splitScreenDemoPosition < SPLIT_SCREEN_DEMO_END_POS_LIST))
318     {
319         (*splitScreenDemoModeParams)->Position            = (VPHAL_SPLIT_SCREEN_DEMO_POSITION)(splitScreenDemoPosition);
320         (*splitScreenDemoModeParams)->bDisableACE         = (bool)((splitScreenDemoParameters & 0x0001) > 0);
321         (*splitScreenDemoModeParams)->bDisableAVS         = (bool)((splitScreenDemoParameters & 0x0002) > 0);
322         (*splitScreenDemoModeParams)->bDisableDN          = (bool)((splitScreenDemoParameters & 0x0004) > 0);
323         (*splitScreenDemoModeParams)->bDisableFMD         = (bool)((splitScreenDemoParameters & 0x0008) > 0);
324         (*splitScreenDemoModeParams)->bDisableIEF         = (bool)((splitScreenDemoParameters & 0x0010) > 0);
325         (*splitScreenDemoModeParams)->bDisableProcamp     = (bool)((splitScreenDemoParameters & 0x0020) > 0);
326         (*splitScreenDemoModeParams)->bDisableSTE         = (bool)((splitScreenDemoParameters & 0x0040) > 0);
327         (*splitScreenDemoModeParams)->bDisableTCC         = (bool)((splitScreenDemoParameters & 0x0080) > 0);
328         (*splitScreenDemoModeParams)->bDisableIS          = (bool)((splitScreenDemoParameters & 0x0100) > 0);
329         (*splitScreenDemoModeParams)->bDisableDrDb        = (bool)((splitScreenDemoParameters & 0x0200) > 0);
330         (*splitScreenDemoModeParams)->bDisableDNUV        = (bool)((splitScreenDemoParameters & 0x0400) > 0);
331         (*splitScreenDemoModeParams)->bDisableFRC         = (bool)((splitScreenDemoParameters & 0x0800) > 0);
332         (*splitScreenDemoModeParams)->bDisableLACE        = (bool)((splitScreenDemoParameters & 0x1000) > 0);
333         *disableDemoMode = false;
334     }
335     else
336     {
337         *disableDemoMode = true;
338     }
339 
340 finish:
341     return eStatus;
342 }
343 
344 //!
345 //! \brief    Init IEF Params to their default value
346 //! \param    [out] pIEFParams
347 //!           The IEF Params struct to be initialized
348 //! \return   MOS_STATUS
349 //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
350 //!
VpHal_DdiInitIEFParams(PVPHAL_IEF_PARAMS pIEFParams)351 MOS_STATUS VpHal_DdiInitIEFParams(
352     PVPHAL_IEF_PARAMS       pIEFParams)
353 {
354     MOS_STATUS              eStatus = MOS_STATUS_SUCCESS;
355 
356     VPHAL_PUBLIC_CHK_NULL(pIEFParams);
357 
358     // Init default values for flows where user feature key is not available or used
359     pIEFParams->bSkintoneTuned        = true;
360     pIEFParams->bEmphasizeSkinDetail  = false;
361     pIEFParams->bSmoothMode           = false;
362     pIEFParams->StrongEdgeWeight      = IEF_STRONG_EDGE_WEIGHT;
363     pIEFParams->RegularWeight         = IEF_REGULAR_WEIGHT;
364     pIEFParams->StrongEdgeThreshold   = IEF_STRONG_EDGE_THRESHOLD;
365 
366 finish:
367     return eStatus;
368 }
369