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