1 /* 2 * Copyright (c) 2022, 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_blt_impl.h 24 //! \brief MHW BLT interface common base 25 //! \details 26 //! 27 28 #ifndef __MHW_BLT_IMPL_H__ 29 #define __MHW_BLT_IMPL_H__ 30 31 #include "mhw_blt_itf.h" 32 #include "mhw_impl.h" 33 #include "media_copy_common.h" 34 35 namespace mhw 36 { 37 namespace blt 38 { 39 40 template <typename cmd_t> 41 class Impl : public Itf, public mhw::Impl 42 { 43 _BLT_CMD_DEF(_MHW_CMD_ALL_DEF_FOR_IMPL); 44 45 public: Impl(PMOS_INTERFACE osItf)46 Impl(PMOS_INTERFACE osItf) : mhw::Impl(osItf) 47 { 48 MHW_FUNCTION_ENTER; 49 } 50 51 //! 52 //! \brief Add Block copy Command 53 //! \details BLT function to add block copy command 54 //! \param [in] pCmdBuffer 55 //! Pointer to Command buffer 56 //! \param [in] pFastCopyBltParam 57 //! Pointer to MHW_FAST_COPY_BLT_PARAM 58 //! \param [in] srcOffset 59 //! input surface's soruce offset 60 //! \param [in] outOffset 61 //! output surface's soruce offset 62 //! \return MOS_STATUS 63 //! MOS_STATUS_SUCCESS if success, else fail reason 64 //! AddBlockCopyBlt(PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_FAST_COPY_BLT_PARAM pBlockCopyBltParam,uint32_t srcOffset,uint32_t dstOffset)65 MOS_STATUS AddBlockCopyBlt( 66 PMOS_COMMAND_BUFFER pCmdBuffer, 67 PMHW_FAST_COPY_BLT_PARAM pBlockCopyBltParam, 68 uint32_t srcOffset, 69 uint32_t dstOffset) override 70 { 71 MHW_CHK_NULL_RETURN(pCmdBuffer); 72 MHW_CHK_NULL_RETURN(pBlockCopyBltParam); 73 74 auto& par = MHW_GETPAR_F(XY_BLOCK_COPY_BLT)(); 75 par = {}; 76 par.dwColorDepth = pBlockCopyBltParam->dwColorDepth; 77 par.dwSrcPitch = pBlockCopyBltParam->dwSrcPitch; 78 par.dwDstPitch = pBlockCopyBltParam->dwDstPitch; 79 par.dwSrcTop = pBlockCopyBltParam->dwSrcTop; 80 par.dwSrcLeft = pBlockCopyBltParam->dwSrcLeft; 81 par.dwDstTop = pBlockCopyBltParam->dwDstTop; 82 par.dwDstBottom = pBlockCopyBltParam->dwDstBottom; 83 par.dwDstLeft = pBlockCopyBltParam->dwDstLeft; 84 par.dwDstRight = pBlockCopyBltParam->dwDstRight; 85 par.dwSrcOffset = srcOffset; 86 par.dwDstOffset = dstOffset; 87 par.dwPlaneIndex = pBlockCopyBltParam->dwPlaneIndex; 88 par.dwPlaneNum = pBlockCopyBltParam->dwPlaneNum; 89 par.pSrcOsResource = pBlockCopyBltParam->pSrcOsResource; 90 par.pDstOsResource = pBlockCopyBltParam->pDstOsResource; 91 92 MHW_CHK_STATUS_RETURN(MHW_ADDCMD_F(XY_BLOCK_COPY_BLT)(pCmdBuffer)); 93 94 return MOS_STATUS_SUCCESS; 95 } 96 _MHW_SETCMD_OVERRIDE_DECL(XY_BLOCK_COPY_BLT)97 _MHW_SETCMD_OVERRIDE_DECL(XY_BLOCK_COPY_BLT) 98 { 99 MHW_FUNCTION_ENTER; 100 101 _MHW_SETCMD_CALLBASE(XY_BLOCK_COPY_BLT); 102 MHW_CHK_NULL_RETURN(params.pSrcOsResource); 103 MHW_CHK_NULL_RETURN(params.pDstOsResource); 104 105 MHW_RESOURCE_PARAMS ResourceParams; 106 PGMM_RESOURCE_INFO pSrcGmmResInfo = params.pSrcOsResource->pGmmResInfo; 107 PGMM_RESOURCE_INFO pDstGmmResInfo = params.pDstOsResource->pGmmResInfo; 108 MHW_CHK_NULL_RETURN(pSrcGmmResInfo); 109 MHW_CHK_NULL_RETURN(pDstGmmResInfo); 110 111 BLT_TILE_TYPE dstTiledMode = static_cast<BLT_TILE_TYPE>(pDstGmmResInfo->GetTileType()); 112 BLT_TILE_TYPE srcTiledMode = static_cast<BLT_TILE_TYPE>(pSrcGmmResInfo->GetTileType()); 113 114 uint32_t sourceResourceWidth = (uint32_t)pSrcGmmResInfo->GetBaseWidth(); 115 uint32_t sourceResourceHeight = (uint32_t)pSrcGmmResInfo->GetBaseHeight(); 116 uint32_t dstResourceWidth = (uint32_t)pDstGmmResInfo->GetBaseWidth(); 117 uint32_t dstResourceHeight = (uint32_t)pDstGmmResInfo->GetBaseHeight(); 118 119 MHW_CHK_NULL_RETURN(this->m_currentCmdBuf); 120 MHW_CHK_NULL_RETURN(this->m_osItf); 121 122 // mmc 123 MOS_MEMCOMP_STATE srcMmcModel = MOS_MEMCOMP_DISABLED; 124 MOS_MEMCOMP_STATE dstMmcModel = MOS_MEMCOMP_DISABLED; 125 GMM_RESOURCE_FLAG inputFlags = pSrcGmmResInfo->GetResFlags(); 126 GMM_RESOURCE_FLAG outFlags = pDstGmmResInfo->GetResFlags(); 127 MCPY_CHK_STATUS_RETURN(this->m_osItf->pfnGetMemoryCompressionMode(this->m_osItf, params.pSrcOsResource, (PMOS_MEMCOMP_STATE) & (srcMmcModel))); 128 MCPY_CHK_STATUS_RETURN(this->m_osItf->pfnGetMemoryCompressionMode(this->m_osItf, params.pDstOsResource, (PMOS_MEMCOMP_STATE) & (dstMmcModel))); 129 130 uint32_t srcQPitch = pSrcGmmResInfo->GetQPitch(); 131 uint32_t dstQPitch = pDstGmmResInfo->GetQPitch(); 132 GMM_RESOURCE_TYPE dstResType = pDstGmmResInfo->GetResourceType(); 133 GMM_RESOURCE_TYPE srcResType = pSrcGmmResInfo->GetResourceType(); 134 135 uint32_t dstSampleNum = pDstGmmResInfo->GetNumSamples(); 136 137 cmd.DW0.InstructionTargetOpcode = 0x41; 138 cmd.DW0.ColorDepth = params.dwColorDepth; 139 cmd.DW1.DestinationPitch = params.dwDstPitch - 1; 140 cmd.DW1.DestinationMocsValue = GetBlockCopyBltMOCS(MOS_GMM_RESOURCE_USAGE_BLT_DESTINATION); 141 142 cmd.DW1.DestinationTiling = GetFastTilingMode(dstTiledMode); 143 cmd.DW8.SourceTiling = GetFastTilingMode(srcTiledMode); 144 cmd.DW8.SourceMocs = GetBlockCopyBltMOCS(MOS_GMM_RESOURCE_USAGE_BLT_SOURCE); 145 146 cmd.DW2.DestinationX1CoordinateLeft = 0; 147 cmd.DW2.DestinationY1CoordinateTop = 0; 148 cmd.DW3.DestinationX2CoordinateRight = params.dwDstRight; 149 cmd.DW3.DestinationY2CoordinateBottom = params.dwDstBottom; 150 cmd.DW7.SourceX1CoordinateLeft = params.dwSrcLeft; 151 cmd.DW7.SourceY1CoordinateTop = params.dwSrcTop; 152 cmd.DW8.SourcePitch = params.dwSrcPitch - 1; 153 154 if (!outFlags.Info.LocalOnly) 155 { 156 cmd.DW6.DestinationTargetMemory = 1;//DESTINATION_TARGET_MEMORY::DESTINATION_TARGET_MEMORY_SYSTEM_MEM; 157 } 158 if (!inputFlags.Info.LocalOnly) 159 { 160 cmd.DW11.SourceTargetMemory = 1;// SOURCE_TARGET_MEMORY::SOURCE_TARGET_MEMORY_SYSTEM_MEM; 161 } 162 163 cmd.DW16.DestinationSurfaceHeight = dstResourceHeight -1; 164 cmd.DW16.DestinationSurfaceWidth = dstResourceWidth -1; 165 cmd.DW16.DestinationSurfaceType = 1; // 0 is 1D, 1 is 2D 166 cmd.DW19.SourceSurfaceHeight = sourceResourceHeight - 1; 167 cmd.DW19.SourceSurfaceWidth = sourceResourceWidth - 1; 168 cmd.DW19.SourceSurfaceType = 1; 169 170 MCPY_NORMALMESSAGE("Src type %d, dst type %d, srcTiledMode %d, dstTiledMode %d", 171 srcResType, dstResType, srcTiledMode, dstTiledMode); 172 173 cmd.DW17.DestinationSurfaceQpitch = dstQPitch >> 2; 174 cmd.DW20.SourceSurfaceQpitch = srcQPitch >> 2; 175 176 cmd.DW18.DestinationHorizontalAlign = pDstGmmResInfo->GetVAlign();; 177 cmd.DW18.DestinationVerticalAlign = pDstGmmResInfo->GetHAlign(); 178 cmd.DW18.DestinationMipTailStartLOD = 0xf; 179 180 cmd.DW21.SourceHorizontalAlign = pSrcGmmResInfo->GetVAlign(); 181 cmd.DW21.SourceVerticalAlign = pSrcGmmResInfo->GetHAlign(); 182 cmd.DW21.SourceMipTailStartLOD = 0xf; 183 184 // add source address 185 MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams)); 186 ResourceParams.dwLsbNum = 0; 187 ResourceParams.dwOffset = params.dwSrcOffset; 188 ResourceParams.presResource = params.pSrcOsResource; 189 ResourceParams.pdwCmd = &(cmd.DW9_10.Value[0]); 190 ResourceParams.dwLocationInCmd = 9; 191 ResourceParams.bIsWritable = false; 192 193 MHW_CHK_STATUS_RETURN(AddResourceToCmd( 194 this->m_osItf, 195 this->m_currentCmdBuf, 196 &ResourceParams)); 197 198 // add destination address 199 MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams)); 200 ResourceParams.dwLsbNum = 0; 201 ResourceParams.dwOffset = params.dwDstOffset; 202 ResourceParams.presResource = params.pDstOsResource; 203 ResourceParams.pdwCmd = &(cmd.DW4_5.Value[0]); 204 ResourceParams.dwLocationInCmd = 4; 205 ResourceParams.bIsWritable = true; 206 207 MHW_CHK_STATUS_RETURN(AddResourceToCmd( 208 this->m_osItf, 209 this->m_currentCmdBuf, 210 &ResourceParams)); 211 212 MCPY_NORMALMESSAGE("Block BLT cmd:dstSampleNum = %d; width = %d, hieght = %d, ColorDepth = %d, Source Pitch %d, mocs = %d,tiled %d," 213 "mmc model % d, dst Pitch %d, mocs = %d,tiled %d, mmc model %d", 214 dstSampleNum, params.dwDstRight, params.dwDstBottom, 215 cmd.DW0.ColorDepth, cmd.DW8.SourcePitch, cmd.DW8.SourceMocs, cmd.DW8.SourceTiling, srcMmcModel, 216 cmd.DW1.DestinationPitch, cmd.DW1.DestinationMocsValue, cmd.DW1.DestinationTiling, dstMmcModel); 217 218 return MOS_STATUS_SUCCESS; 219 } 220 221 protected: 222 //! 223 //! \brief Get Block copy MOCS 224 //! \details BLT function to get the MOCS 225 //! \param [in] MOS_HW_RESOURCE_DEF 226 //! Pointer to UsageDef 227 //! \return uint32_t 228 //! return the MOCS value 229 //! GetBlockCopyBltMOCS(MOS_HW_RESOURCE_DEF UsageDef)230 virtual uint32_t GetBlockCopyBltMOCS(MOS_HW_RESOURCE_DEF UsageDef) 231 { 232 // MemoryObject will get 7 bits data. only bits[1-7] save MOCS, while some 233 // platoforms only use 4 bits mocs. 234 return (m_osItf->pfnCachePolicyGetMemoryObject(UsageDef, 235 m_osItf->pfnGetGmmClientContext(m_osItf)).DwordValue & 0x1E) >>1; 236 } 237 238 using base_t = Itf; 239 MEDIA_CLASS_DEFINE_END(mhw__blt__Impl) 240 }; 241 } // namespace blt 242 } // namespace mhw 243 244 #endif // __MHW_BLT_IMPL_H__ 245