xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/common/hw/mhw_sfc_generic.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2017-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_generic.h
24 //! \brief    MHW interface templates for render engine commands
25 //! \details  Impelements shared HW command construction functions across all platforms as templates
26 //!
27 
28 #ifndef __MHW_SFC_GENERIC_H__
29 #define __MHW_SFC_GENERIC_H__
30 
31 #include "mhw_sfc.h"
32 
33 template <class TSfcCmds>
34 class MhwSfcInterfaceGeneric : public MhwSfcInterface
35 {
36 public:
37 
MhwSfcInterfaceGeneric(PMOS_INTERFACE pOsInterface)38     MhwSfcInterfaceGeneric(PMOS_INTERFACE pOsInterface) : MhwSfcInterface(pOsInterface)
39     {
40         MHW_FUNCTION_ENTER;
41     }
42 
~MhwSfcInterfaceGeneric()43     virtual ~MhwSfcInterfaceGeneric() { MHW_FUNCTION_ENTER; }
44 
AddSfcLock(PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_SFC_LOCK_PARAMS pSfcLockParams)45     MOS_STATUS AddSfcLock(
46         PMOS_COMMAND_BUFFER            pCmdBuffer,
47         PMHW_SFC_LOCK_PARAMS           pSfcLockParams)
48     {
49         typename TSfcCmds::SFC_LOCK_CMD cmd;
50 
51         MHW_CHK_NULL_RETURN(m_osInterface);
52         MHW_CHK_NULL_RETURN(pCmdBuffer);
53         MHW_CHK_NULL_RETURN(pSfcLockParams);
54 
55         cmd.DW1.VeSfcPipeSelect                    = (pSfcLockParams->sfcPipeMode == SFC_PIPE_MODE_VEBOX) ? 1 : 0;
56         cmd.DW1.PreScaledOutputSurfaceOutputEnable = pSfcLockParams->bOutputToMemory ? 1 : 0;
57 
58         MHW_CHK_STATUS_RETURN(m_osInterface->pfnAddCommand(pCmdBuffer, &cmd, cmd.byteSize));
59         return MOS_STATUS_SUCCESS;
60     }
61 
AddSfcFrameStart(PMOS_COMMAND_BUFFER pCmdBuffer,uint8_t sfcPipeMode)62     MOS_STATUS AddSfcFrameStart(
63         PMOS_COMMAND_BUFFER            pCmdBuffer,
64         uint8_t                        sfcPipeMode)
65     {
66         typename TSfcCmds::SFC_FRAME_START_CMD cmd;
67         MHW_CHK_NULL_RETURN(m_osInterface);
68         MHW_CHK_NULL_RETURN(pCmdBuffer);
69         MHW_CHK_STATUS_RETURN(m_osInterface->pfnAddCommand(pCmdBuffer, &cmd, cmd.byteSize));
70 
71         return MOS_STATUS_SUCCESS;
72     }
73 
AddSfcIefState(PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_SFC_IEF_STATE_PARAMS pSfcIefStateParams)74     MOS_STATUS AddSfcIefState(
75         PMOS_COMMAND_BUFFER            pCmdBuffer,
76         PMHW_SFC_IEF_STATE_PARAMS      pSfcIefStateParams)
77     {
78         typename TSfcCmds::SFC_IEF_STATE_CMD cmd;
79 
80         MHW_CHK_NULL_RETURN(m_osInterface);
81         MHW_CHK_NULL_RETURN(pCmdBuffer);
82         MHW_CHK_NULL_RETURN(pSfcIefStateParams);
83 
84         // Init SFC_IEF_STATE_CMD
85         cmd.DW1.GainFactor            = 0;
86         cmd.DW1.R3XCoefficient        = 0;
87         cmd.DW1.R3CCoefficient        = 0;
88         cmd.DW2.GlobalNoiseEstimation = 0;
89         cmd.DW2.R5XCoefficient        = 0;
90         cmd.DW2.R5CxCoefficient       = 0;
91         cmd.DW2.R5CCoefficient        = 0;
92 
93         cmd.DW3.StdSinAlpha  = 101;
94         cmd.DW3.StdCosAlpha  = 79;
95         cmd.DW5.DiamondAlpha = 100;
96         cmd.DW7.InvMarginVyl = 3300;
97         cmd.DW8.InvMarginVyu = 1600;
98         cmd.DW10.S0L         = MOS_BITFIELD_VALUE((uint32_t)-5, 11);
99         cmd.DW10.YSlope2     = 31;
100         cmd.DW12.YSlope1     = 31;
101         cmd.DW14.S0U         = 256;
102         cmd.DW15.S1U         = 113;
103         cmd.DW15.S2U         = MOS_BITFIELD_VALUE((uint32_t)-179, 11);
104 
105         // Set IEF Params
106         if (pSfcIefStateParams->bIEFEnable)
107         {
108             cmd.DW1.GainFactor          = pSfcIefStateParams->dwGainFactor;
109             cmd.DW1.StrongEdgeThreshold = pSfcIefStateParams->StrongEdgeThreshold;
110             cmd.DW1.R3XCoefficient      = pSfcIefStateParams->dwR3xCoefficient;
111             cmd.DW1.R3CCoefficient      = pSfcIefStateParams->dwR3cCoefficient;
112             cmd.DW2.StrongEdgeWeight    = pSfcIefStateParams->StrongEdgeWeight;
113             cmd.DW2.RegularWeight       = pSfcIefStateParams->RegularWeight;
114             cmd.DW2.R5XCoefficient      = pSfcIefStateParams->dwR5xCoefficient;
115             cmd.DW2.R5CxCoefficient     = pSfcIefStateParams->dwR5cxCoefficient;
116             cmd.DW2.R5CCoefficient      = pSfcIefStateParams->dwR5cCoefficient;
117             cmd.DW4.VyStdEnable         = pSfcIefStateParams->bVYSTDEnable;
118             cmd.DW5.SkinDetailFactor    = pSfcIefStateParams->bSkinDetailFactor;
119         }
120 
121         // Set CSC Params
122         if (pSfcIefStateParams->bCSCEnable)
123         {
124             MHW_CHK_NULL_RETURN(pSfcIefStateParams->pfCscCoeff);
125             MHW_CHK_NULL_RETURN(pSfcIefStateParams->pfCscInOffset);
126             MHW_CHK_NULL_RETURN(pSfcIefStateParams->pfCscOutOffset);
127             cmd.DW16.TransformEnable = true;
128 
129             cmd.DW16.C0 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscCoeff[0] * 1024.0F);  // S2.10
130             cmd.DW16.C1 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscCoeff[1] * 1024.0F);  // S2.10
131             cmd.DW17.C2 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscCoeff[2] * 1024.0F);  // S2.10
132 
133             cmd.DW17.C3 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscCoeff[3] * 1024.0F);  // S2.10
134             cmd.DW18.C4 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscCoeff[4] * 1024.0F);  // S2.10
135             cmd.DW18.C5 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscCoeff[5] * 1024.0F);  // S2.10
136 
137             cmd.DW19.C6 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscCoeff[6] * 1024.0F);  // S2.10
138             cmd.DW19.C7 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscCoeff[7] * 1024.0F);  // S2.10
139             cmd.DW20.C8 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscCoeff[8] * 1024.0F);  // S2.10
140 
141             cmd.DW21.OffsetIn1 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscInOffset[0] * 4.0F);  // S8.2
142             cmd.DW22.OffsetIn2 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscInOffset[1] * 4.0F);  // S8.2
143             cmd.DW23.OffsetIn3 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscInOffset[2] * 4.0F);  // S8.2
144 
145             cmd.DW21.OffsetOut1 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscOutOffset[0] * 4.0F);  // S8.2
146             cmd.DW22.OffsetOut2 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscOutOffset[1] * 4.0F);  // S8.2
147             cmd.DW23.OffsetOut3 = (uint32_t)MOS_F_ROUND(pSfcIefStateParams->pfCscOutOffset[2] * 4.0F); // S8.2
148         }
149 
150         MHW_CHK_STATUS_RETURN(m_osInterface->pfnAddCommand(pCmdBuffer, &cmd, cmd.byteSize));
151 
152         return MOS_STATUS_SUCCESS;
153     }
154 
AddSfcAvsChromaTable(PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_SFC_AVS_CHROMA_TABLE pChromaTable)155     MOS_STATUS AddSfcAvsChromaTable(
156         PMOS_COMMAND_BUFFER             pCmdBuffer,
157         PMHW_SFC_AVS_CHROMA_TABLE       pChromaTable)
158     {
159         PSFC_AVS_CHROMA_FILTER_COEFF                      pChromaCoeff;
160         typename TSfcCmds::SFC_AVS_CHROMA_Coeff_Table_CMD cmd;
161 
162         MHW_CHK_NULL_RETURN(m_osInterface);
163         MHW_CHK_NULL_RETURN(pCmdBuffer);
164         MHW_CHK_NULL_RETURN(pChromaTable);
165         pChromaCoeff = pChromaTable->ChromaTable;
166 
167         // Copy programmed State tables into the command
168         MHW_CHK_STATUS_RETURN(MOS_SecureMemcpy(
169             &(cmd.DW1),
170             sizeof(SFC_AVS_CHROMA_FILTER_COEFF)* 32,
171             pChromaCoeff,
172             sizeof(SFC_AVS_CHROMA_FILTER_COEFF)* 32));
173 
174         MHW_CHK_STATUS_RETURN(m_osInterface->pfnAddCommand(pCmdBuffer, &cmd, cmd.byteSize));
175 
176         return MOS_STATUS_SUCCESS;
177     }
178 
AddSfcAvsLumaTable(PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_SFC_AVS_LUMA_TABLE pLumaTable)179    MOS_STATUS AddSfcAvsLumaTable(
180        PMOS_COMMAND_BUFFER             pCmdBuffer,
181        PMHW_SFC_AVS_LUMA_TABLE         pLumaTable)
182    {
183        PSFC_AVS_LUMA_FILTER_COEFF                      pLumaCoeff;
184        typename TSfcCmds::SFC_AVS_LUMA_Coeff_Table_CMD cmd;
185 
186        MHW_CHK_NULL_RETURN(m_osInterface);
187        MHW_CHK_NULL_RETURN(pCmdBuffer);
188        MHW_CHK_NULL_RETURN(pLumaTable);
189 
190        pLumaCoeff = pLumaTable->LumaTable;
191 
192        // Copy programmed State tables into the command
193        MHW_CHK_STATUS_RETURN(MOS_SecureMemcpy(
194            &(cmd.DW1),
195            sizeof(SFC_AVS_LUMA_FILTER_COEFF)* 32,
196            pLumaCoeff,
197            sizeof(SFC_AVS_LUMA_FILTER_COEFF)* 32));
198 
199        MHW_CHK_STATUS_RETURN(m_osInterface->pfnAddCommand(pCmdBuffer, &cmd, cmd.byteSize));
200 
201        return MOS_STATUS_SUCCESS;
202    }
203 
AddSfcAvsState(PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_SFC_AVS_STATE pSfcAvsState)204    MOS_STATUS AddSfcAvsState(
205        PMOS_COMMAND_BUFFER             pCmdBuffer,
206        PMHW_SFC_AVS_STATE              pSfcAvsState)
207    {
208        typename TSfcCmds::SFC_AVS_STATE_CMD cmd;
209        MHW_CHK_NULL_RETURN(m_osInterface);
210        MHW_CHK_NULL_RETURN(pCmdBuffer);
211        MHW_CHK_NULL_RETURN(pSfcAvsState);
212 
213        // Inilizatialied the SFC_AVS_STATE_CMD
214        cmd.DW1.TransitionAreaWith8Pixels = 5;
215        cmd.DW1.TransitionAreaWith4Pixels = 4;
216        if (pSfcAvsState->dwAVSFilterMode == MEDIASTATE_SFC_AVS_FILTER_BILINEAR)
217        {
218            cmd.DW1.SharpnessLevel = 0;
219        }
220        else
221        {
222            cmd.DW1.SharpnessLevel = 255;
223        }
224 
225        cmd.DW2.MaxDerivativePoint8       = 20;
226        cmd.DW2.MaxDerivative4Pixels      = 7;
227 
228        MHW_CHK_STATUS_RETURN(m_osInterface->pfnAddCommand(pCmdBuffer, &cmd, cmd.byteSize));
229        return MOS_STATUS_SUCCESS;
230    }
231 };
232 
233 #endif  // __MHW_SFC_GENERIC_H__
234