xref: /aosp_15_r20/external/intel-media-driver/media_softlet/agnostic/common/hw/mhw_blt_impl.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
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