xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/inc/Internal/Common/Texture/GmmTextureCalc.h (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1 /*==============================================================================
2 Copyright(c) 2017 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 #pragma once
23 #ifdef __cplusplus
24 #include "External/Common/GmmMemAllocator.hpp"
25 #include "Internal/Common/GmmLibInc.h"
26 /////////////////////////////////////////////////////////////////////////////////////
27 /// @file GmmTextureCalc.h
28 /// @brief This file contains the common functions and members for texture calculations
29 ///        on all GENs/Platforms
30 /////////////////////////////////////////////////////////////////////////////////////
31 namespace GmmLib
32 {
33 
34     /////////////////////////////////////////////////////////////////////////
35     /// Contains texture calc functions and members that are common across all
36     /// platform implementation.  This is an abstract class and provides a
37     /// uniform interface to all the texture clients and provides gen specific
38     /// texture allocation through derived concrete GmmGenXTextureCalc class.
39     /////////////////////////////////////////////////////////////////////////
40     class Context;
41     class NON_PAGED_SECTION GmmTextureCalc :
42                                 public GmmMemAllocator
43     {
44         private:
45 
46             GMM_STATUS      FillTexBlockMem(
47                                 GMM_TEXTURE_INFO    *pTexInfo,
48                                 __GMM_BUFFER_TYPE   *pRestrictions);
49             void           ResetRestrictions(__GMM_BUFFER_TYPE *pRestriction);
50 
51             void            GetTexRestrictions(
52                                 GMM_TEXTURE_INFO* pTexInfo,
53                                 __GMM_BUFFER_TYPE* pBuff);
54 
55             bool         ValidateTexInfo(
56                                 GMM_TEXTURE_INFO  *pTexInfo,
57                                 __GMM_BUFFER_TYPE *pRestrictions);
58 
59         protected:
60 	    Context *pGmmLibContext;
61 
62             /* Function prototypes */
63 
64 
65             virtual GMM_STATUS  GMM_STDCALL FillTexPlanar(
66                                 GMM_TEXTURE_INFO    *pTexInfo,
67                                 __GMM_BUFFER_TYPE   *pRestrictions);
68 
69             GMM_STATUS      FillTexPitchAndSize(GMM_TEXTURE_INFO  *pTexInfo,
70                                 GMM_GFX_SIZE_T    WidthBytesPhysical,
71                                 uint32_t             Height,
72                                 __GMM_BUFFER_TYPE *pBufferType);
73 
74             void            FillPlanarOffsetAddress(
75                                 GMM_TEXTURE_INFO   *pTexInfo);
76 
77             void            FindMipTailStartLod(GMM_TEXTURE_INFO *pTexInfo);
78             GMM_VIRTUAL void                GetGenericRestrictions(GMM_TEXTURE_INFO* pTexInfo,
79                                                                    __GMM_BUFFER_TYPE *pBuff);
80             GMM_VIRTUAL __GMM_BUFFER_TYPE*  GetBestRestrictions(__GMM_BUFFER_TYPE *pFirstBuffer,
81                                                                 const __GMM_BUFFER_TYPE *pSecondBuffer);
82             /* Inline functions */
83             /////////////////////////////////////////////////////////////////////////////////////
84             /// Checks where the restrictions are invalid or not
85             /// @param[in]  pRestriction Restrictions to check
86             /// @return     true if restriction is invalid. false otherwise.
87             /////////////////////////////////////////////////////////////////////////////////////
IsRestrictionInvalid(__GMM_BUFFER_TYPE * pRestriction)88             GMM_INLINE_VIRTUAL GMM_INLINE bool IsRestrictionInvalid(__GMM_BUFFER_TYPE *pRestriction)
89             {
90                 return ((pRestriction->MinDepth == 0xffffffff) ? true : false);
91             }
92             /////////////////////////////////////////////////////////////////////////////////////
93             /// Returns restrictions for a linear buffer.
94             /// @param[out]     pBuff Restrictions are returned in this buffer
95             /////////////////////////////////////////////////////////////////////////////////////
GetLinearRestrictions(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pBuff)96             GMM_INLINE_VIRTUAL GMM_INLINE void GetLinearRestrictions(GMM_TEXTURE_INFO* pTexInfo, __GMM_BUFFER_TYPE* pBuff)
97             {
98                 *pBuff = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo,pGmmLibContext)->Linear;
99             }
100             /////////////////////////////////////////////////////////////////////////////////////
101             /// Returns restrictions for the primary buffer.
102             /// @param[out]     pBuff Restrictions are returned in this buffer
103             /////////////////////////////////////////////////////////////////////////////////////
GetPrimaryRestrictions(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pBuff)104             GMM_INLINE_VIRTUAL GMM_INLINE void GetPrimaryRestrictions(GMM_TEXTURE_INFO* pTexInfo, __GMM_BUFFER_TYPE* pBuff)
105             {
106                 *pBuff = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo,pGmmLibContext)->ASyncFlipSurface;
107             }
108 
109             virtual uint32_t   Get2DMipMapHeight(GMM_TEXTURE_INFO   *pTexInfo) = 0;
110 
111             virtual void    Fill2DTexOffsetAddress(GMM_TEXTURE_INFO *pTexInfo) = 0;
112 
113             virtual GMM_GFX_SIZE_T  Get2DTexOffsetAddressPerMip(
114                                 GMM_TEXTURE_INFO *pTexInfo,
115                                 uint32_t            MipLevel) = 0;
116 
GetMipTailByteOffset(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)117             virtual uint32_t   GetMipTailByteOffset(
118                                 GMM_TEXTURE_INFO *pTexInfo,
119                                 uint32_t            MipLevel)
120             {
121                 GMM_UNREFERENCED_PARAMETER(pTexInfo);
122                 GMM_UNREFERENCED_PARAMETER(MipLevel);
123                 // Left empty
124                 return 0;
125             }
126 
GetMipTailGeometryOffset(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel,uint32_t * OffsetX,uint32_t * OffsetY,uint32_t * OffsetZ)127             virtual void    GetMipTailGeometryOffset(
128                                 GMM_TEXTURE_INFO *pTexInfo,
129                                 uint32_t            MipLevel,
130                                 uint32_t*           OffsetX,
131                                 uint32_t*           OffsetY,
132                                 uint32_t*           OffsetZ)
133             {
134                 GMM_UNREFERENCED_PARAMETER(pTexInfo);
135                 GMM_UNREFERENCED_PARAMETER(MipLevel);
136                 GMM_UNREFERENCED_PARAMETER(OffsetX);
137                 GMM_UNREFERENCED_PARAMETER(OffsetY);
138                 GMM_UNREFERENCED_PARAMETER(OffsetZ);
139 
140                 // Left empty
141             }
142 
143             GMM_GFX_SIZE_T  Get3DMipByteAddress(
144                                 GMM_TEXTURE_INFO*    pTexInfo,
145                                 GMM_REQ_OFFSET_INFO *pReqInfo);
146 
GetAligned3DBlockHeight(GMM_TEXTURE_INFO * pTexInfo,uint32_t BlockHeight,uint32_t ExpandedArraySize)147             virtual uint32_t   GetAligned3DBlockHeight(
148                                 GMM_TEXTURE_INFO*    pTexInfo,
149                                 uint32_t BlockHeight,
150                                 uint32_t ExpandedArraySize)
151             {
152                 GMM_UNREFERENCED_PARAMETER(pTexInfo);
153                 GMM_UNREFERENCED_PARAMETER(BlockHeight);
154                 GMM_UNREFERENCED_PARAMETER(ExpandedArraySize);
155 
156                 // Left empty
157                 return 0;
158             }
159 
160         public:
161             /* Constructors */
162             // "Creates GmmTextureCalc object based on platform ID"
163             void SetTileMode(GMM_TEXTURE_INFO* pTexInfo);
164 
GmmTextureCalc(Context * pGmmLibContext)165 	    GmmTextureCalc(Context *pGmmLibContext)
166             {
167                 this->pGmmLibContext = pGmmLibContext;
168             }
169 
~GmmTextureCalc()170             virtual ~GmmTextureCalc()
171             {
172 
173             }
174 
175 	    /* Function prototypes */
176             GMM_STATUS      AllocateTexture(GMM_TEXTURE_INFO *pTexInfo);
177             virtual GMM_STATUS      FillTexCCS(GMM_TEXTURE_INFO *pBaseSurf, GMM_TEXTURE_INFO *pTexInfo);
178             uint8_t         SurfaceRequires64KBTileOptimization(
179                                 GMM_TEXTURE_INFO *pTexInfo);
180 
181             GMM_STATUS      PreProcessTexSpecialCases(
182                                 GMM_TEXTURE_INFO* pTexInfo);
183 
184             uint32_t           ExpandHeight(
185                                 uint32_t Height,
186                                 uint32_t UnitAlignment,
187                                 uint32_t NumSamples);
188 
189             uint32_t           ExpandWidth(
190                                 uint32_t Width,
191                                 uint32_t UnitAlignment,
192                                 uint32_t NumSamples);
193 
194             void            GetCompressionBlockDimensions(
195                                 GMM_RESOURCE_FORMAT Format,
196                                 uint32_t *pWidth,
197                                 uint32_t *pHeight,
198                                 uint32_t *pDepth);
199 
200             GMM_STATUS      GetTexRenderOffset(
201                                 GMM_TEXTURE_INFO*    pTexInfo,
202                                 GMM_REQ_OFFSET_INFO* pReqInfo);
203 
204             virtual GMM_STATUS      GetTexLockOffset(
205                                 GMM_TEXTURE_INFO* pTexInfo,
206                                 GMM_REQ_OFFSET_INFO *pReqInfo);
207 
208             GMM_STATUS      GetTexStdLayoutOffset(
209                                 GMM_TEXTURE_INFO* pTexInfo,
210                                 GMM_REQ_OFFSET_INFO *pReqInfo);
211 
212             virtual GMM_GFX_SIZE_T  GetMipMapByteAddress(
213                                 GMM_TEXTURE_INFO*    pTexInfo,
214                                 GMM_REQ_OFFSET_INFO *pReqInfo);
215 
216             void            AlignTexHeightWidth(
217                                 GMM_TEXTURE_INFO*   pTexInfo,
218                                 uint32_t*              pHeight,
219                                 uint32_t*     pWidth);
220 
221             bool     GmmGetD3DToHwTileConversion(
222                                 GMM_TEXTURE_INFO *pTexInfo,
223                                 uint32_t             *pColFactor,
224                                 uint32_t             *pRowFactor);
225             void    GetResRestrictions(
226                                   GMM_TEXTURE_INFO* pTexInfo,
227                                   __GMM_BUFFER_TYPE& pBuff);
228 
229 	    bool RedescribeTexturePlanes(GMM_TEXTURE_INFO *pTexInfo, uint32_t *pWidthBytesPhysical);
230 
231 	    bool GetRedescribedPlaneParams(GMM_TEXTURE_INFO *pTexInfo, GMM_YUV_PLANE PlaneType, GMM_TEXTURE_INFO *pRedescribedTexInfo);
232 
233 	    // Virtual functions
234             virtual GMM_STATUS GMM_STDCALL  FillTex1D(
235                                                 GMM_TEXTURE_INFO  *pTexInfo,
236                                                 __GMM_BUFFER_TYPE *pRestrictions) = 0;
237             virtual GMM_STATUS GMM_STDCALL  FillTex2D(
238                                                 GMM_TEXTURE_INFO  *pTexInfo,
239                                                 __GMM_BUFFER_TYPE *pRestrictions) = 0;
240             virtual GMM_STATUS GMM_STDCALL  FillTex3D(
241                                                 GMM_TEXTURE_INFO  *pTexInfo,
242                                                 __GMM_BUFFER_TYPE *pRestrictions) = 0;
243             virtual GMM_STATUS GMM_STDCALL  FillTexCube(
244                                                 GMM_TEXTURE_INFO    *pTexInfo,
245                                                 __GMM_BUFFER_TYPE   *pRestrictions) = 0;
246 
GetCCSExMode(GMM_TEXTURE_INFO * AuxSurf)247             virtual GMM_STATUS GMM_STDCALL GetCCSExMode(GMM_TEXTURE_INFO * AuxSurf)
248             {
249                 GMM_UNREFERENCED_PARAMETER(AuxSurf);
250 
251                 return GMM_SUCCESS;
252             }
253 
ScaleTextureWidth(GMM_TEXTURE_INFO * pTexInfo,uint32_t Width)254             virtual uint32_t  GMM_STDCALL ScaleTextureWidth(GMM_TEXTURE_INFO* pTexInfo,
255                                                          uint32_t Width)
256             {
257                 __GMM_ASSERT(pTexInfo != NULL);
258 
259                 switch (pTexInfo->BitsPerPixel)
260                 {
261                     case 32:  Width /= 8; break;
262                     case 64:  Width /= 4; break;
263                     case 128: Width /= 2; break;
264                     default: __GMM_ASSERT(0);
265                 }
266 
267                 return Width;
268             }
269 
ScaleTextureHeight(GMM_TEXTURE_INFO * pTexInfo,uint32_t Height)270             virtual uint32_t  GMM_STDCALL ScaleTextureHeight(GMM_TEXTURE_INFO* pTexInfo,
271                                                         uint32_t Height)
272             {
273                 GMM_UNREFERENCED_PARAMETER(pTexInfo);
274                 return Height /= 16;
275             }
276 
GmmTexGetMipWidth(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)277             virtual GMM_GFX_SIZE_T  GmmTexGetMipWidth(GMM_TEXTURE_INFO *pTexInfo, uint32_t MipLevel)
278             {
279                 __GMM_ASSERTPTR(pTexInfo, 0);
280                 return(GFX_MAX(1, pTexInfo->BaseWidth >> MipLevel));
281             }
GmmTexGetMipHeight(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)282             virtual uint32_t GmmTexGetMipHeight(GMM_TEXTURE_INFO *pTexInfo, uint32_t MipLevel)
283             {
284                 __GMM_ASSERTPTR(pTexInfo, 0);
285                 return(GFX_MAX(1, pTexInfo->BaseHeight >> MipLevel));
286             }
287 
GmmTexGetMipDepth(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)288             virtual uint32_t GmmTexGetMipDepth(GMM_TEXTURE_INFO *pTexInfo, uint32_t MipLevel)
289             {
290                 __GMM_ASSERTPTR(pTexInfo, 0);
291                 return(GFX_MAX(1, pTexInfo->Depth >> MipLevel));
292             }
293 
ScaleFCRectHeight(GMM_TEXTURE_INFO * pTexInfo,uint32_t Height)294             virtual uint32_t GMM_STDCALL ScaleFCRectHeight(GMM_TEXTURE_INFO * pTexInfo, uint32_t Height)
295             {
296                 __GMM_ASSERTPTR(pTexInfo, 0);
297                 uint32_t ScaledHeight = Height;
298 
299                 if (pTexInfo->TileMode == LEGACY_TILE_X)
300                 {
301                     const uint16_t FastClearRccTileXAlignHeight = 64; // lines - RCC ( Render Color Cache ) Alignment Sizes
302                     const uint16_t TileXClearHeightScale = 32;         // lines - Clear & Resolve Rect Scaling Sizes
303 
304                     ScaledHeight = GFX_ALIGN(ScaledHeight, FastClearRccTileXAlignHeight);
305                     ScaledHeight /= TileXClearHeightScale;
306                 }
307                 else if (pTexInfo->TileMode == LEGACY_TILE_Y)
308                 {
309                     const uint16_t FastClearRccTileYAlignHeight = 128; // bits
310                     const uint16_t TileYClearHeightScale = 64;        // bits
311 
312                     ScaledHeight = GFX_ALIGN(ScaledHeight, FastClearRccTileYAlignHeight);
313                     ScaledHeight /= TileYClearHeightScale;
314                 }
315                 return ScaledHeight;
316 
317             }
318 
ScaleFCRectWidth(GMM_TEXTURE_INFO * pTexInfo,uint64_t Width)319             virtual uint64_t GMM_STDCALL ScaleFCRectWidth(GMM_TEXTURE_INFO * pTexInfo, uint64_t Width)
320             {
321                 __GMM_ASSERTPTR(pTexInfo, 0);
322                 uint64_t ScaledWidth = Width;
323 
324                 if (pTexInfo->TileMode == LEGACY_TILE_X)
325                 {
326                     const uint32_t FastClearRccTileXAlignWidth = 8192; // bits - RCC ( Render Color Cache ) Alignment Sizes
327                     const uint32_t TileXClearWidthScale = 4096;        // bits - Clear & Resolve Rect Scaling Sizes
328 
329                     ScaledWidth = GFX_ALIGN(ScaledWidth, FastClearRccTileXAlignWidth / pTexInfo->BitsPerPixel);
330                     ScaledWidth /= TileXClearWidthScale;
331                 }
332                 else if (pTexInfo->TileMode == LEGACY_TILE_Y)
333                 {
334                     const uint32_t FastClearRccTileYAlignWidth = 4096; // bits
335                     const uint32_t TileYClearWidthScale = 2048;        // bits
336 
337                     ScaledWidth = GFX_ALIGN(ScaledWidth, FastClearRccTileYAlignWidth / pTexInfo->BitsPerPixel);
338                     ScaledWidth /= TileYClearWidthScale;
339                 }
340                 return ScaledWidth;
341             }
342 
343             virtual GMM_STATUS GMM_STDCALL MSAACCSUsage(GMM_TEXTURE_INFO *pTexInfo);
344             virtual void GMM_STDCALL AllocateOneTileThanRequied(GMM_TEXTURE_INFO *pTexInfo,
345                                                                 GMM_GFX_SIZE_T &WidthBytesRender,
346                                                                 GMM_GFX_SIZE_T &WidthBytesPhysical,
347                                                                 GMM_GFX_SIZE_T &WidthBytesLock);
348             GMM_STATUS MSAACompression(GMM_TEXTURE_INFO *pTexInfo);
Get2DFCSurfaceWidthFor3DSurface(GMM_TEXTURE_INFO * pTexInfo,uint64_t Width)349 		virtual uint64_t GMM_STDCALL Get2DFCSurfaceWidthFor3DSurface(GMM_TEXTURE_INFO *pTexInfo,
350 		                                                             uint64_t          Width)
351 		{
352 		    GMM_UNREFERENCED_PARAMETER(pTexInfo);
353 		    return Width;
354 		}
Get2DFCSurfaceHeightFor3DSurface(GMM_TEXTURE_INFO * pTexInfo,uint32_t Height,uint32_t Depth)355 		virtual uint64_t GMM_STDCALL Get2DFCSurfaceHeightFor3DSurface(GMM_TEXTURE_INFO *pTexInfo,
356 		                                                              uint32_t          Height,
357 		                                                              uint32_t          Depth)
358 		{
359 		    GMM_UNREFERENCED_PARAMETER(pTexInfo);
360 		    GMM_UNREFERENCED_PARAMETER(Depth);
361 		    return Height;
362 		}
363 
364             uint32_t GMM_STDCALL GetDisplayFrameOffset(GMM_TEXTURE_INFO    *pTexInfo,
365                                                        GMM_REQ_OFFSET_INFO *pReqInfo);
366 	    virtual uint32_t GMM_STDCALL IsTileAlignedPlanes(GMM_TEXTURE_INFO *pTexInfo);
367             virtual uint32_t GMM_STDCALL GetNumberOfPlanes(GMM_TEXTURE_INFO *pTexInfo);
368             virtual void GMM_STDCALL     SetPlanarOffsetInfo(GMM_TEXTURE_INFO            *pTexInfo,
369                                                            GMM_RESCREATE_CUSTOM_PARAMS &CreateParams);
370 #ifndef __GMM_KMD__
371             virtual void GMM_STDCALL SetPlanarOffsetInfo_2(GMM_TEXTURE_INFO              *pTexInfo,
372                                                           GMM_RESCREATE_CUSTOM_PARAMS_2 &CreateParams);
373 #endif
374             virtual void GMM_STDCALL SetPlaneUnAlignedTexOffsetInfo(GMM_TEXTURE_INFO *pTexInfo,
375                                                                     uint32_t YHeight,
376                                                                     uint32_t VHeight);
377             virtual void GMM_STDCALL GetPlaneIdForCpuBlt(GMM_TEXTURE_INFO *pTexInfo,
378                                                           GMM_RES_COPY_BLT *pBlt,
379                                                           uint32_t *PlaneId);
380             virtual void GMM_STDCALL GetBltInfoPerPlane(GMM_TEXTURE_INFO *pTexInfo,
381                                                              GMM_RES_COPY_BLT *pBlt,
382                                                              uint32_t PlaneId);
383 	    /* inline functions */
384     };
385 
386 }
387 #endif // #ifdef __cplusplus
388