xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/common/hw/mhw_blt_legacy.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2020-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_legacy.cpp
24 //! \brief    MHW interface for constructing commands for the BLT
25 //!
26 #include "mhw_blt_legacy.h"
27 
MhwBltInterface(PMOS_INTERFACE pOsInterface)28 MhwBltInterface::MhwBltInterface(PMOS_INTERFACE pOsInterface)
29 {
30     MHW_FUNCTION_ENTER;
31 
32     pfnAddResourceToCmd = nullptr;
33 
34     if (pOsInterface == nullptr)
35     {
36         MHW_ASSERTMESSAGE("Invalid OsInterface pointers provided");
37         return;
38     }
39 
40     m_osInterface       = pOsInterface;
41     if (m_osInterface->bUsesGfxAddress)
42     {
43         pfnAddResourceToCmd = Mhw_AddResourceToCmd_GfxAddress;
44     }
45     else  //PatchList
46     {
47         pfnAddResourceToCmd = Mhw_AddResourceToCmd_PatchList;
48     }
49 }
50 
AddFastCopyBlt(PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_FAST_COPY_BLT_PARAM pFastCopyBltParam,uint32_t srcOffset,uint32_t dstOffset)51 MOS_STATUS MhwBltInterface::AddFastCopyBlt(
52     PMOS_COMMAND_BUFFER      pCmdBuffer,
53     PMHW_FAST_COPY_BLT_PARAM pFastCopyBltParam,
54     uint32_t                    srcOffset,
55     uint32_t                    dstOffset)
56 {
57     MHW_FUNCTION_ENTER;
58 
59     MHW_RESOURCE_PARAMS ResourceParams;
60     MOS_STATUS          eStatus;
61 
62     eStatus = MOS_STATUS_SUCCESS;
63 
64     MHW_CHK_NULL_RETURN(m_osInterface);
65     MHW_CHK_NULL_RETURN(pFastCopyBltParam);
66     MHW_CHK_NULL_RETURN(pFastCopyBltParam->pDstOsResource);
67     MHW_CHK_NULL_RETURN(pFastCopyBltParam->pSrcOsResource);
68     MHW_CHK_NULL_RETURN(pFastCopyBltParam->pDstOsResource->pGmmResInfo);
69     MHW_CHK_NULL_RETURN(pFastCopyBltParam->pSrcOsResource->pGmmResInfo);
70 
71     mhw_blt_state::XY_FAST_COPY_BLT_CMD cmd;
72 
73     BLT_TILE_TYPE dstTiledMode = static_cast<BLT_TILE_TYPE>(pFastCopyBltParam->pDstOsResource->pGmmResInfo->GetTileType());
74     BLT_TILE_TYPE srcTiledMode = static_cast<BLT_TILE_TYPE>(pFastCopyBltParam->pSrcOsResource->pGmmResInfo->GetTileType());
75 
76     cmd.DW0.SourceTilingMethod            = GetFastTilingMode(srcTiledMode);
77     cmd.DW0.DestinationTilingMethod       = GetFastTilingMode(dstTiledMode);
78     cmd.DW1.TileYTypeForSource            = (srcTiledMode == BLT_NOT_TILED) ? 0 : 1;
79     cmd.DW1.TileYTypeForDestination       = (dstTiledMode == BLT_NOT_TILED) ? 0 : 1;
80     cmd.DW1.ColorDepth                    = pFastCopyBltParam->dwColorDepth;
81     cmd.DW1.DestinationPitch              = pFastCopyBltParam->dwDstPitch;
82     cmd.DW2.DestinationX1CoordinateLeft   = pFastCopyBltParam->dwDstLeft;
83     cmd.DW2.DestinationY1CoordinateTop    = pFastCopyBltParam->dwDstTop;
84     cmd.DW3.DestinationX2CoordinateRight  = pFastCopyBltParam->dwDstRight;
85     cmd.DW3.DestinationY2CoordinateBottom = pFastCopyBltParam->dwDstBottom;
86     cmd.DW6.SourceX1CoordinateLeft        = pFastCopyBltParam->dwSrcLeft;
87     cmd.DW6.SourceY1CoordinateTop         = pFastCopyBltParam->dwSrcTop;
88     cmd.DW7.SourcePitch                   = pFastCopyBltParam->dwSrcPitch;
89 
90     // add source address
91     MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
92     ResourceParams.dwLsbNum        = MHW_BLT_ENGINE_STATE_BASE_ADDRESS_SHIFT;
93     ResourceParams.dwOffset        = srcOffset;
94     ResourceParams.presResource    = pFastCopyBltParam->pSrcOsResource;
95     ResourceParams.pdwCmd          = &(cmd.DW8_9.Value[0]);
96     ResourceParams.dwLocationInCmd = 8;
97     ResourceParams.bIsWritable     = false;
98 
99     MHW_CHK_STATUS(pfnAddResourceToCmd(
100         m_osInterface,
101         pCmdBuffer,
102         &ResourceParams));
103 
104     // add destination address
105     MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
106     ResourceParams.dwLsbNum        = MHW_BLT_ENGINE_STATE_BASE_ADDRESS_SHIFT;
107     ResourceParams.dwOffset        = dstOffset;
108     ResourceParams.presResource    = pFastCopyBltParam->pDstOsResource;
109     ResourceParams.pdwCmd          = &(cmd.DW4_5.Value[0]);
110     ResourceParams.dwLocationInCmd = 4;
111     ResourceParams.bIsWritable     = true;
112 
113     MHW_CHK_STATUS(pfnAddResourceToCmd(
114         m_osInterface,
115         pCmdBuffer,
116         &ResourceParams));
117 
118     m_osInterface->pfnAddCommand(pCmdBuffer, &cmd, cmd.byteSize);
119 
120 finish:
121     return eStatus;
122 }
123 
AddBlockCopyBlt(PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_FAST_COPY_BLT_PARAM pFastCopyBltParam,uint32_t srcOffset,uint32_t dstOffset)124 MOS_STATUS MhwBltInterface::AddBlockCopyBlt(
125     PMOS_COMMAND_BUFFER      pCmdBuffer,
126     PMHW_FAST_COPY_BLT_PARAM pFastCopyBltParam,
127     uint32_t                 srcOffset,
128     uint32_t                 dstOffset)
129 {
130     MHW_FUNCTION_ENTER;
131 
132     MHW_RESOURCE_PARAMS ResourceParams;
133     MOS_STATUS          eStatus;
134 
135     eStatus = MOS_STATUS_SUCCESS;
136 
137     mhw_blt_state::XY_BLOCK_COPY_BLT_CMD cmd;
138     MHW_CHK_NULL(m_osInterface);
139     cmd.DW0.ColorDepth = pFastCopyBltParam->dwColorDepth;
140     cmd.DW1.DestinationPitch = pFastCopyBltParam->dwDstPitch -1;
141     cmd.DW1.DestinationMocsValue =
142         m_osInterface->pfnGetGmmClientContext(m_osInterface)->CachePolicyGetMemoryObject(nullptr, GMM_RESOURCE_USAGE_BLT_DESTINATION).DwordValue;
143 
144     cmd.DW1.DestinationTiling = (pFastCopyBltParam->pDstOsResource->TileType == MOS_TILE_LINEAR) ? 0:1;
145     cmd.DW8.SourceTiling = (pFastCopyBltParam->pSrcOsResource->TileType == MOS_TILE_LINEAR) ? 0:1;
146     cmd.DW8.SourceMocs =
147         m_osInterface->pfnGetGmmClientContext(m_osInterface)->CachePolicyGetMemoryObject(nullptr, GMM_RESOURCE_USAGE_BLT_SOURCE).DwordValue;
148 
149     cmd.DW2.DestinationX1CoordinateLeft = 0;
150     cmd.DW2.DestinationY1CoordinateTop = 0;
151     cmd.DW3.DestinationX2CoordinateRight = pFastCopyBltParam->dwDstRight;
152     cmd.DW3.DestinationY2CoordinateBottom = pFastCopyBltParam->dwDstBottom;
153     cmd.DW7.SourceX1CoordinateLeft = pFastCopyBltParam->dwSrcLeft;
154     cmd.DW7.SourceY1CoordinateTop = pFastCopyBltParam->dwSrcTop;
155     cmd.DW8.SourcePitch = pFastCopyBltParam->dwSrcPitch -1;
156 
157     // add source address
158     MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
159     ResourceParams.dwLsbNum        = 12;
160     ResourceParams.dwOffset        = srcOffset;
161     ResourceParams.presResource    = pFastCopyBltParam->pSrcOsResource;
162     ResourceParams.pdwCmd          = &(cmd.DW9_10.Value[0]);
163     ResourceParams.dwLocationInCmd = 9;
164     ResourceParams.bIsWritable     = false;
165 
166     MHW_CHK_STATUS(pfnAddResourceToCmd(
167         m_osInterface,
168         pCmdBuffer,
169         &ResourceParams));
170 
171     // add destination address
172     MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
173     ResourceParams.dwLsbNum        = 12;
174     ResourceParams.dwOffset        = dstOffset;
175     ResourceParams.presResource    = pFastCopyBltParam->pDstOsResource;
176     ResourceParams.pdwCmd          = &(cmd.DW4_5.Value[0]);
177     ResourceParams.dwLocationInCmd = 4;
178     ResourceParams.bIsWritable     = true;
179 
180     MHW_CHK_STATUS(pfnAddResourceToCmd(
181         m_osInterface,
182         pCmdBuffer,
183         &ResourceParams));
184 
185     m_osInterface->pfnAddCommand(pCmdBuffer, &cmd, cmd.byteSize);
186 
187 finish:
188     return eStatus;
189 }
190 
GetFastTilingMode(BLT_TILE_TYPE TileType)191 uint32_t MhwBltInterface::GetFastTilingMode(BLT_TILE_TYPE TileType)
192 {
193    switch(TileType)
194    {
195       case BLT_NOT_TILED:
196           return mhw_blt_state::XY_FAST_COPY_BLT_CMD::DESTINATION_TILING_METHOD_LINEAR_TILINGDISABLED;
197       case BLT_TILED_Y:
198       case BLT_TILED_4:
199           return mhw_blt_state::XY_FAST_COPY_BLT_CMD::DESTINATION_TILING_METHOD_TILE_Y;
200       case BLT_TILED_64:
201           return mhw_blt_state::XY_FAST_COPY_BLT_CMD::DESTINATION_TILING_METHOD_64KBTILING;
202       default:
203          MHW_ASSERTMESSAGE("BLT: Can't support GMM TileType %d.", TileType);
204    }
205    return mhw_blt_state::XY_FAST_COPY_BLT_CMD::DESTINATION_TILING_METHOD_LINEAR_TILINGDISABLED;
206 }