xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/Texture/GmmTextureAlloc.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker 
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker 
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker 
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker 
23*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
24*35ffd701SAndroid Build Coastguard Worker 
25*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
26*35ffd701SAndroid Build Coastguard Worker /// This functions sets the Tile Mode of the graphics surface
27*35ffd701SAndroid Build Coastguard Worker ///
28*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to ::GMM_TEXTURE_INFO
29*35ffd701SAndroid Build Coastguard Worker ///
30*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
SetTileMode(GMM_TEXTURE_INFO * pTexInfo)31*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmTextureCalc::SetTileMode(GMM_TEXTURE_INFO *pTexInfo)
32*35ffd701SAndroid Build Coastguard Worker {
33*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform;
34*35ffd701SAndroid Build Coastguard Worker 
35*35ffd701SAndroid Build Coastguard Worker     pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
36*35ffd701SAndroid Build Coastguard Worker 
37*35ffd701SAndroid Build Coastguard Worker     pTexInfo->TileMode = TILE_NONE;
38*35ffd701SAndroid Build Coastguard Worker 
39*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags))
40*35ffd701SAndroid Build Coastguard Worker     {
41*35ffd701SAndroid Build Coastguard Worker // clang-format off
42*35ffd701SAndroid Build Coastguard Worker         #define SET_TILE_MODE(Tile, Submode)                                                \
43*35ffd701SAndroid Build Coastguard Worker         {                                                                                   \
44*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->TileMode =                                                        \
45*35ffd701SAndroid Build Coastguard Worker                     (pTexInfo->BitsPerPixel == 128) ? TILE_##Tile##_##Submode##_128bpe :    \
46*35ffd701SAndroid Build Coastguard Worker                     (pTexInfo->BitsPerPixel ==  64) ? TILE_##Tile##_##Submode##_64bpe  :    \
47*35ffd701SAndroid Build Coastguard Worker                     (pTexInfo->BitsPerPixel ==  32) ? TILE_##Tile##_##Submode##_32bpe  :    \
48*35ffd701SAndroid Build Coastguard Worker                     (pTexInfo->BitsPerPixel ==  16) ? TILE_##Tile##_##Submode##_16bpe  :    \
49*35ffd701SAndroid Build Coastguard Worker                                                       TILE_##Tile##_##Submode##_8bpe;       \
50*35ffd701SAndroid Build Coastguard Worker         }                                                                                   \
51*35ffd701SAndroid Build Coastguard Worker 
52*35ffd701SAndroid Build Coastguard Worker         #define GENERATE_TILE_MODE(T, M1d, M2d, M2d_2x, M2d_4x, M2d_8x, M2d_16x, M3d)            \
53*35ffd701SAndroid Build Coastguard Worker         {\
54*35ffd701SAndroid Build Coastguard Worker             switch (pTexInfo->Type)\
55*35ffd701SAndroid Build Coastguard Worker             {\
56*35ffd701SAndroid Build Coastguard Worker                 case RESOURCE_1D:\
57*35ffd701SAndroid Build Coastguard Worker                     SET_TILE_MODE(T, M1d);\
58*35ffd701SAndroid Build Coastguard Worker                     break;\
59*35ffd701SAndroid Build Coastguard Worker                 case RESOURCE_2D:\
60*35ffd701SAndroid Build Coastguard Worker                 case RESOURCE_CUBE:\
61*35ffd701SAndroid Build Coastguard Worker                     switch (pTexInfo->MSAA.NumSamples)\
62*35ffd701SAndroid Build Coastguard Worker                     {\
63*35ffd701SAndroid Build Coastguard Worker                     case 1:\
64*35ffd701SAndroid Build Coastguard Worker                         SET_TILE_MODE(T, M2d);\
65*35ffd701SAndroid Build Coastguard Worker                         break;\
66*35ffd701SAndroid Build Coastguard Worker                     case 2:\
67*35ffd701SAndroid Build Coastguard Worker                         SET_TILE_MODE(T, M2d_2x);\
68*35ffd701SAndroid Build Coastguard Worker                         break;\
69*35ffd701SAndroid Build Coastguard Worker                     case 4:\
70*35ffd701SAndroid Build Coastguard Worker                         SET_TILE_MODE(T, M2d_4x);\
71*35ffd701SAndroid Build Coastguard Worker                         break;\
72*35ffd701SAndroid Build Coastguard Worker                     case 8:\
73*35ffd701SAndroid Build Coastguard Worker                         SET_TILE_MODE(T, M2d_8x);\
74*35ffd701SAndroid Build Coastguard Worker                         break;\
75*35ffd701SAndroid Build Coastguard Worker                     case 16:\
76*35ffd701SAndroid Build Coastguard Worker                         SET_TILE_MODE(T, M2d_16x);\
77*35ffd701SAndroid Build Coastguard Worker                         break;\
78*35ffd701SAndroid Build Coastguard Worker                     default:\
79*35ffd701SAndroid Build Coastguard Worker                         __GMM_ASSERT(0);\
80*35ffd701SAndroid Build Coastguard Worker                     }\
81*35ffd701SAndroid Build Coastguard Worker                     break;\
82*35ffd701SAndroid Build Coastguard Worker                 case RESOURCE_3D:\
83*35ffd701SAndroid Build Coastguard Worker                     SET_TILE_MODE(T, M3d);\
84*35ffd701SAndroid Build Coastguard Worker                     break;\
85*35ffd701SAndroid Build Coastguard Worker                 default:\
86*35ffd701SAndroid Build Coastguard Worker                     __GMM_ASSERT(0);\
87*35ffd701SAndroid Build Coastguard Worker             }\
88*35ffd701SAndroid Build Coastguard Worker         }
89*35ffd701SAndroid Build Coastguard Worker 
90*35ffd701SAndroid Build Coastguard Worker 
91*35ffd701SAndroid Build Coastguard Worker         // clang-format on
92*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Info.TiledYf)
93*35ffd701SAndroid Build Coastguard Worker         {
94*35ffd701SAndroid Build Coastguard Worker             GENERATE_TILE_MODE(YF, 1D, 2D, 2D_2X, 2D_4X, 2D_8X, 2D_16X, 3D);
95*35ffd701SAndroid Build Coastguard Worker 
96*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledYf = 1;
97*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledYs = 0;
98*35ffd701SAndroid Build Coastguard Worker         }
99*35ffd701SAndroid Build Coastguard Worker         else
100*35ffd701SAndroid Build Coastguard Worker         {
101*35ffd701SAndroid Build Coastguard Worker             if(pGmmLibContext->GetSkuTable().FtrTileY)
102*35ffd701SAndroid Build Coastguard Worker             {
103*35ffd701SAndroid Build Coastguard Worker                 GENERATE_TILE_MODE(YS, 1D, 2D, 2D_2X, 2D_4X, 2D_8X, 2D_16X, 3D);
104*35ffd701SAndroid Build Coastguard Worker             }
105*35ffd701SAndroid Build Coastguard Worker             else
106*35ffd701SAndroid Build Coastguard Worker             {
107*35ffd701SAndroid Build Coastguard Worker                 if (pGmmLibContext->GetSkuTable().FtrXe2PlusTiling)
108*35ffd701SAndroid Build Coastguard Worker                 {
109*35ffd701SAndroid Build Coastguard Worker                     GENERATE_TILE_MODE(_64, 1D, 2D, 2D_2X, 2D_4X, 2D_8X, 2D_16X, 3D);
110*35ffd701SAndroid Build Coastguard Worker                 }
111*35ffd701SAndroid Build Coastguard Worker                 else
112*35ffd701SAndroid Build Coastguard Worker                 {
113*35ffd701SAndroid Build Coastguard Worker                     GENERATE_TILE_MODE(_64, 1D, 2D, 2D_2X, 2D_4X, 2D_4X, 2D_4X, 3D);
114*35ffd701SAndroid Build Coastguard Worker                 }
115*35ffd701SAndroid Build Coastguard Worker             }
116*35ffd701SAndroid Build Coastguard Worker 
117*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledYf = 0;
118*35ffd701SAndroid Build Coastguard Worker             GMM_SET_64KB_TILE(pTexInfo->Flags, 1, pGmmLibContext);
119*35ffd701SAndroid Build Coastguard Worker         }
120*35ffd701SAndroid Build Coastguard Worker 
121*35ffd701SAndroid Build Coastguard Worker 
122*35ffd701SAndroid Build Coastguard Worker         GMM_SET_4KB_TILE(pTexInfo->Flags, pGmmLibContext->GetSkuTable().FtrTileY ? 1 : 0, pGmmLibContext);
123*35ffd701SAndroid Build Coastguard Worker 
124*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledX = 0;
125*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledW = 0;
126*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.Linear = 0;
127*35ffd701SAndroid Build Coastguard Worker #undef SET_TILE_MODE
128*35ffd701SAndroid Build Coastguard Worker     }
129*35ffd701SAndroid Build Coastguard Worker     else if(GMM_IS_4KB_TILE(pTexInfo->Flags))
130*35ffd701SAndroid Build Coastguard Worker     {
131*35ffd701SAndroid Build Coastguard Worker         GMM_SET_4KB_TILE(pTexInfo->Flags, 1, pGmmLibContext);
132*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledYf = 0;
133*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledYs = 0;
134*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledX  = 0;
135*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledW  = 0;
136*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.Linear  = 0;
137*35ffd701SAndroid Build Coastguard Worker         GMM_SET_4KB_TILE_MODE(pTexInfo->TileMode, pGmmLibContext);
138*35ffd701SAndroid Build Coastguard Worker     }
139*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Info.TiledX)
140*35ffd701SAndroid Build Coastguard Worker     {
141*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledY  = 0;
142*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledYf = 0;
143*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledYs = 0;
144*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledX  = 1;
145*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledW  = 0;
146*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.Linear  = 0;
147*35ffd701SAndroid Build Coastguard Worker         pTexInfo->TileMode           = LEGACY_TILE_X;
148*35ffd701SAndroid Build Coastguard Worker     }
149*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Info.TiledW)
150*35ffd701SAndroid Build Coastguard Worker     {
151*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledY  = 0;
152*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledYf = 0;
153*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledYs = 0;
154*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledX  = 0;
155*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledW  = 1;
156*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.Linear  = 0;
157*35ffd701SAndroid Build Coastguard Worker         pTexInfo->TileMode           = LEGACY_TILE_Y;
158*35ffd701SAndroid Build Coastguard Worker     }
159*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Info.Linear)
160*35ffd701SAndroid Build Coastguard Worker     {
161*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledY  = 0;
162*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledYf = 0;
163*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledYs = 0;
164*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledX  = 0;
165*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.TiledW  = 0;
166*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.Linear  = 1;
167*35ffd701SAndroid Build Coastguard Worker         pTexInfo->TileMode           = TILE_NONE;
168*35ffd701SAndroid Build Coastguard Worker     }
169*35ffd701SAndroid Build Coastguard Worker     else
170*35ffd701SAndroid Build Coastguard Worker     {
171*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "No tiling preference set!");
172*35ffd701SAndroid Build Coastguard Worker     }
173*35ffd701SAndroid Build Coastguard Worker 
174*35ffd701SAndroid Build Coastguard Worker     GMM_ASSERTDPF(pTexInfo->TileMode < GMM_TILE_MODES, "Invalid Tile Mode Set");
175*35ffd701SAndroid Build Coastguard Worker }
176*35ffd701SAndroid Build Coastguard Worker 
177*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
178*35ffd701SAndroid Build Coastguard Worker /// C Wrapper function for allocating a mip map or planar surface. The function
179*35ffd701SAndroid Build Coastguard Worker /// outputs offset, size and pitch information by enforcing all the h/w alignment
180*35ffd701SAndroid Build Coastguard Worker /// and restrictions.
181*35ffd701SAndroid Build Coastguard Worker ///
182*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to GMM_TEXTURE_INFO
183*35ffd701SAndroid Build Coastguard Worker ///
184*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
185*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
186*35ffd701SAndroid Build Coastguard Worker #if(defined(__GMM_KMD__))
GmmTexAlloc(GMM_LIB_CONTEXT * pGmmLibContext,GMM_TEXTURE_INFO * pTexInfo)187*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmTexAlloc(GMM_LIB_CONTEXT *pGmmLibContext, GMM_TEXTURE_INFO *pTexInfo)
188*35ffd701SAndroid Build Coastguard Worker {
189*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc = pGmmLibContext->GetTextureCalc();
190*35ffd701SAndroid Build Coastguard Worker     return (pTextureCalc->AllocateTexture(pTexInfo));
191*35ffd701SAndroid Build Coastguard Worker }
192*35ffd701SAndroid Build Coastguard Worker 
GmmTexLinearCCS(GMM_LIB_CONTEXT * pGmmLibContext,GMM_TEXTURE_INFO * pTexInfo,GMM_TEXTURE_INFO * pAuxTexInfo)193*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmTexLinearCCS(GMM_LIB_CONTEXT *pGmmLibContext, GMM_TEXTURE_INFO *pTexInfo, GMM_TEXTURE_INFO *pAuxTexInfo)
194*35ffd701SAndroid Build Coastguard Worker {
195*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc = pGmmLibContext->GetTextureCalc();
196*35ffd701SAndroid Build Coastguard Worker     return (pTextureCalc->FillTexCCS(pTexInfo, pAuxTexInfo));
197*35ffd701SAndroid Build Coastguard Worker }
198*35ffd701SAndroid Build Coastguard Worker #endif
199*35ffd701SAndroid Build Coastguard Worker 
200*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
201*35ffd701SAndroid Build Coastguard Worker /// Top level function for allocating a mip map or planar surface. The function
202*35ffd701SAndroid Build Coastguard Worker /// outputs offset, size and pitch information by enforcing all the h/w alignment
203*35ffd701SAndroid Build Coastguard Worker /// and restrictions.
204*35ffd701SAndroid Build Coastguard Worker ///
205*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to GMM_TEXTURE_INFO
206*35ffd701SAndroid Build Coastguard Worker ///
207*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
208*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
AllocateTexture(GMM_TEXTURE_INFO * pTexInfo)209*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmTextureCalc::AllocateTexture(GMM_TEXTURE_INFO *pTexInfo)
210*35ffd701SAndroid Build Coastguard Worker {
211*35ffd701SAndroid Build Coastguard Worker     __GMM_BUFFER_TYPE Restrictions = {0};
212*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS        Status;
213*35ffd701SAndroid Build Coastguard Worker 
214*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
215*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pGmmLibContext, GMM_ERROR);
216*35ffd701SAndroid Build Coastguard Worker 
217*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
218*35ffd701SAndroid Build Coastguard Worker 
219*35ffd701SAndroid Build Coastguard Worker     GetTexRestrictions(pTexInfo, &Restrictions);
220*35ffd701SAndroid Build Coastguard Worker 
221*35ffd701SAndroid Build Coastguard Worker     if((Status = __GmmTexFillHAlignVAlign(pTexInfo, pGmmLibContext)) != GMM_SUCCESS)
222*35ffd701SAndroid Build Coastguard Worker     {
223*35ffd701SAndroid Build Coastguard Worker         return Status;
224*35ffd701SAndroid Build Coastguard Worker     }
225*35ffd701SAndroid Build Coastguard Worker 
226*35ffd701SAndroid Build Coastguard Worker     // Planar YUV resources treated special. Packed YUV treated like 2D/3D/Cube...
227*35ffd701SAndroid Build Coastguard Worker     if(GmmIsPlanar(pTexInfo->Format))
228*35ffd701SAndroid Build Coastguard Worker     {
229*35ffd701SAndroid Build Coastguard Worker         Status = FillTexPlanar(pTexInfo, &Restrictions);
230*35ffd701SAndroid Build Coastguard Worker 
231*35ffd701SAndroid Build Coastguard Worker         if((Status == GMM_SUCCESS) &&
232*35ffd701SAndroid Build Coastguard Worker            (ValidateTexInfo(pTexInfo, &Restrictions) == false))
233*35ffd701SAndroid Build Coastguard Worker         {
234*35ffd701SAndroid Build Coastguard Worker             return GMM_ERROR;
235*35ffd701SAndroid Build Coastguard Worker         }
236*35ffd701SAndroid Build Coastguard Worker         if(GMM_SUCCESS != FillTexCCS(pTexInfo, pTexInfo))
237*35ffd701SAndroid Build Coastguard Worker         {
238*35ffd701SAndroid Build Coastguard Worker             return GMM_ERROR;
239*35ffd701SAndroid Build Coastguard Worker         }
240*35ffd701SAndroid Build Coastguard Worker         return Status;
241*35ffd701SAndroid Build Coastguard Worker     }
242*35ffd701SAndroid Build Coastguard Worker     else
243*35ffd701SAndroid Build Coastguard Worker     {
244*35ffd701SAndroid Build Coastguard Worker         SetTileMode(pTexInfo);
245*35ffd701SAndroid Build Coastguard Worker     }
246*35ffd701SAndroid Build Coastguard Worker 
247*35ffd701SAndroid Build Coastguard Worker     switch(pTexInfo->Type)
248*35ffd701SAndroid Build Coastguard Worker     {
249*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_2D:
250*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_PRIMARY:
251*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_SHADOW:
252*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_STAGING:
253*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_GDI:
254*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_NNDI:
255*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_HARDWARE_MBM:
256*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_OVERLAY_INTERMEDIATE_SURFACE:
257*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_IFFS_MAPTOGTT:
258*35ffd701SAndroid Build Coastguard Worker #if _WIN32
259*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_WGBOX_ENCODE_DISPLAY:
260*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_WGBOX_ENCODE_REFERENCE:
261*35ffd701SAndroid Build Coastguard Worker #endif
262*35ffd701SAndroid Build Coastguard Worker         {
263*35ffd701SAndroid Build Coastguard Worker             Status = FillTex2D(pTexInfo, &Restrictions);
264*35ffd701SAndroid Build Coastguard Worker 
265*35ffd701SAndroid Build Coastguard Worker             break;
266*35ffd701SAndroid Build Coastguard Worker         }
267*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_1D:
268*35ffd701SAndroid Build Coastguard Worker         {
269*35ffd701SAndroid Build Coastguard Worker             Status = FillTex1D(pTexInfo, &Restrictions);
270*35ffd701SAndroid Build Coastguard Worker 
271*35ffd701SAndroid Build Coastguard Worker             break;
272*35ffd701SAndroid Build Coastguard Worker         }
273*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_3D:
274*35ffd701SAndroid Build Coastguard Worker         {
275*35ffd701SAndroid Build Coastguard Worker             Status = FillTex3D(pTexInfo, &Restrictions);
276*35ffd701SAndroid Build Coastguard Worker 
277*35ffd701SAndroid Build Coastguard Worker             break;
278*35ffd701SAndroid Build Coastguard Worker         }
279*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_CUBE:
280*35ffd701SAndroid Build Coastguard Worker         {
281*35ffd701SAndroid Build Coastguard Worker             Status = FillTexCube(pTexInfo, &Restrictions);
282*35ffd701SAndroid Build Coastguard Worker 
283*35ffd701SAndroid Build Coastguard Worker             break;
284*35ffd701SAndroid Build Coastguard Worker         }
285*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_SCRATCH:
286*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_BUFFER:
287*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_FBC:
288*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_PWR_CONTEXT:
289*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_KMD_BUFFER:
290*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_NULL_CONTEXT_INDIRECT_STATE:
291*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_PERF_DATA_QUEUE:
292*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_HW_CONTEXT:
293*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_TAG_PAGE:
294*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_OVERLAY_DMA:
295*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_GTT_TRANSFER_REGION:
296*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_GLOBAL_BUFFER:
297*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_CURSOR:
298*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_GFX_CLIENT_BUFFER:
299*35ffd701SAndroid Build Coastguard Worker #if _WIN32
300*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_WGBOX_ENCODE_STATE:
301*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_WGBOX_ENCODE_TFD:
302*35ffd701SAndroid Build Coastguard Worker #endif
303*35ffd701SAndroid Build Coastguard Worker         {
304*35ffd701SAndroid Build Coastguard Worker             Status = FillTexBlockMem(pTexInfo, &Restrictions);
305*35ffd701SAndroid Build Coastguard Worker             break;
306*35ffd701SAndroid Build Coastguard Worker         }
307*35ffd701SAndroid Build Coastguard Worker         default:
308*35ffd701SAndroid Build Coastguard Worker         {
309*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "GmmTexAlloc: Unknown surface type!");
310*35ffd701SAndroid Build Coastguard Worker             return GMM_INVALIDPARAM;
311*35ffd701SAndroid Build Coastguard Worker         }
312*35ffd701SAndroid Build Coastguard Worker     };
313*35ffd701SAndroid Build Coastguard Worker 
314*35ffd701SAndroid Build Coastguard Worker     if(ValidateTexInfo(pTexInfo, &Restrictions) == false)
315*35ffd701SAndroid Build Coastguard Worker     {
316*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
317*35ffd701SAndroid Build Coastguard Worker     }
318*35ffd701SAndroid Build Coastguard Worker 
319*35ffd701SAndroid Build Coastguard Worker     if(GMM_SUCCESS != FillTexCCS(pTexInfo, pTexInfo))
320*35ffd701SAndroid Build Coastguard Worker     {
321*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
322*35ffd701SAndroid Build Coastguard Worker     }
323*35ffd701SAndroid Build Coastguard Worker 
324*35ffd701SAndroid Build Coastguard Worker     return Status;
325*35ffd701SAndroid Build Coastguard Worker }
326*35ffd701SAndroid Build Coastguard Worker 
FillTexCCS(GMM_TEXTURE_INFO * pBaseSurf,GMM_TEXTURE_INFO * pTexInfo)327*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmTextureCalc::FillTexCCS(GMM_TEXTURE_INFO *pBaseSurf, GMM_TEXTURE_INFO *pTexInfo)
328*35ffd701SAndroid Build Coastguard Worker {
329*35ffd701SAndroid Build Coastguard Worker     GMM_UNREFERENCED_PARAMETER(pBaseSurf);
330*35ffd701SAndroid Build Coastguard Worker     GMM_UNREFERENCED_PARAMETER(pTexInfo);
331*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
332*35ffd701SAndroid Build Coastguard Worker }
333*35ffd701SAndroid Build Coastguard Worker 
334*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
335*35ffd701SAndroid Build Coastguard Worker /// This function will validate pTexInfo to make sure all the surface creation
336*35ffd701SAndroid Build Coastguard Worker /// parameters are valid.
337*35ffd701SAndroid Build Coastguard Worker ///
338*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to ::GMM_TEXTURE_INFO
339*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pRestrictions: Reference to surface alignment and size restrictions
340*35ffd701SAndroid Build Coastguard Worker ///
341*35ffd701SAndroid Build Coastguard Worker /// @return     true/false
342*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
ValidateTexInfo(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)343*35ffd701SAndroid Build Coastguard Worker bool GmmLib::GmmTextureCalc::ValidateTexInfo(GMM_TEXTURE_INFO * pTexInfo,
344*35ffd701SAndroid Build Coastguard Worker                                              __GMM_BUFFER_TYPE *pRestrictions)
345*35ffd701SAndroid Build Coastguard Worker {
346*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, false);
347*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pRestrictions, false);
348*35ffd701SAndroid Build Coastguard Worker 
349*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
350*35ffd701SAndroid Build Coastguard Worker 
351*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Pitch > pRestrictions->MaxPitch)
352*35ffd701SAndroid Build Coastguard Worker     {
353*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0,
354*35ffd701SAndroid Build Coastguard Worker                       "GmmLib::GmmTextureCalc::ValidateTexInfo: Pitch"
355*35ffd701SAndroid Build Coastguard Worker                       "exceeds max HW pitch restriction.\r\n");
356*35ffd701SAndroid Build Coastguard Worker         return false;
357*35ffd701SAndroid Build Coastguard Worker     }
358*35ffd701SAndroid Build Coastguard Worker 
359*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
360*35ffd701SAndroid Build Coastguard Worker     return true;
361*35ffd701SAndroid Build Coastguard Worker }
362*35ffd701SAndroid Build Coastguard Worker 
363*35ffd701SAndroid Build Coastguard Worker 
364*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
365*35ffd701SAndroid Build Coastguard Worker /// Sets the tiling  type based on the required alignment parameters.
366*35ffd701SAndroid Build Coastguard Worker ///
367*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to ::GMM_TEXTURE_INFO
368*35ffd701SAndroid Build Coastguard Worker /// @param[in]  WidthBytesPhysical: Width in bytes of the surface
369*35ffd701SAndroid Build Coastguard Worker /// @param[in]  Height: Height of the surface
370*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pBufferType: Reference to surface alignment and size restrictions
371*35ffd701SAndroid Build Coastguard Worker ///
372*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
373*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTexPitchAndSize(GMM_TEXTURE_INFO * pTexInfo,GMM_GFX_SIZE_T WidthBytesPhysical,uint32_t Height,__GMM_BUFFER_TYPE * pBufferType)374*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmTextureCalc::FillTexPitchAndSize(GMM_TEXTURE_INFO * pTexInfo,
375*35ffd701SAndroid Build Coastguard Worker                                                        GMM_GFX_SIZE_T     WidthBytesPhysical,
376*35ffd701SAndroid Build Coastguard Worker                                                        uint32_t           Height,
377*35ffd701SAndroid Build Coastguard Worker                                                        __GMM_BUFFER_TYPE *pBufferType)
378*35ffd701SAndroid Build Coastguard Worker {
379*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS     Status           = GMM_SUCCESS;
380*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T WidthBytesRender = 0;
381*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T WidthBytesLock   = 0;
382*35ffd701SAndroid Build Coastguard Worker 
383*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
384*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pBufferType, GMM_ERROR);
385*35ffd701SAndroid Build Coastguard Worker 
386*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
387*35ffd701SAndroid Build Coastguard Worker 
388*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
389*35ffd701SAndroid Build Coastguard Worker 
390*35ffd701SAndroid Build Coastguard Worker     // Make sure that we meet the minimum HW requirment for that buffer type
391*35ffd701SAndroid Build Coastguard Worker     WidthBytesPhysical = GFX_MAX(WidthBytesPhysical, pBufferType->MinPitch);
392*35ffd701SAndroid Build Coastguard Worker 
393*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->TileMode >= GMM_TILE_MODES)
394*35ffd701SAndroid Build Coastguard Worker     {
395*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid parameter!");
396*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
397*35ffd701SAndroid Build Coastguard Worker     }
398*35ffd701SAndroid Build Coastguard Worker 
399*35ffd701SAndroid Build Coastguard Worker     if(GMM_ISNOT_TILED(pPlatform->TileInfo[pTexInfo->TileMode]))
400*35ffd701SAndroid Build Coastguard Worker     {
401*35ffd701SAndroid Build Coastguard Worker         pTexInfo->LegacyFlags |= GMM_LINEAR;
402*35ffd701SAndroid Build Coastguard Worker 
403*35ffd701SAndroid Build Coastguard Worker         // For linear surace we need to make sure that physical pitch
404*35ffd701SAndroid Build Coastguard Worker         // meet the HW alignment (i.e DWORD or QWORD, ETC)
405*35ffd701SAndroid Build Coastguard Worker         WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical,
406*35ffd701SAndroid Build Coastguard Worker                                        pBufferType->PitchAlignment);
407*35ffd701SAndroid Build Coastguard Worker 
408*35ffd701SAndroid Build Coastguard Worker         WidthBytesRender = WidthBytesPhysical;
409*35ffd701SAndroid Build Coastguard Worker         WidthBytesLock   = WidthBytesPhysical;
410*35ffd701SAndroid Build Coastguard Worker     }
411*35ffd701SAndroid Build Coastguard Worker     else
412*35ffd701SAndroid Build Coastguard Worker     {
413*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Info.TiledY ||
414*35ffd701SAndroid Build Coastguard Worker            pTexInfo->Flags.Info.TiledYf ||
415*35ffd701SAndroid Build Coastguard Worker            pTexInfo->Flags.Info.TiledYs)
416*35ffd701SAndroid Build Coastguard Worker         {
417*35ffd701SAndroid Build Coastguard Worker             pTexInfo->LegacyFlags |= GMM_TILE_Y;
418*35ffd701SAndroid Build Coastguard Worker         }
419*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Info.TiledX == 1)
420*35ffd701SAndroid Build Coastguard Worker         {
421*35ffd701SAndroid Build Coastguard Worker             pTexInfo->LegacyFlags |= GMM_TILE_X;
422*35ffd701SAndroid Build Coastguard Worker         }
423*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Info.TiledW == 1)
424*35ffd701SAndroid Build Coastguard Worker         {
425*35ffd701SAndroid Build Coastguard Worker             pTexInfo->LegacyFlags |= GMM_TILE_W;
426*35ffd701SAndroid Build Coastguard Worker         }
427*35ffd701SAndroid Build Coastguard Worker 
428*35ffd701SAndroid Build Coastguard Worker         // Align Height to tile height boundary
429*35ffd701SAndroid Build Coastguard Worker         Height = GFX_ALIGN(Height, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight);
430*35ffd701SAndroid Build Coastguard Worker 
431*35ffd701SAndroid Build Coastguard Worker         // Align Width to next tile boundary
432*35ffd701SAndroid Build Coastguard Worker         WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical,
433*35ffd701SAndroid Build Coastguard Worker                                        pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth);
434*35ffd701SAndroid Build Coastguard Worker 
435*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Info.RenderCompressed || pTexInfo->Flags.Info.MediaCompressed)
436*35ffd701SAndroid Build Coastguard Worker         {
437*35ffd701SAndroid Build Coastguard Worker             if(!GMM_IS_64KB_TILE(pTexInfo->Flags) && !pGmmLibContext->GetSkuTable().FtrFlatPhysCCS) //Ys is naturally aligned to required 4 YF pages
438*35ffd701SAndroid Build Coastguard Worker             {
439*35ffd701SAndroid Build Coastguard Worker                 // Align Pitch to 4-tile boundary
440*35ffd701SAndroid Build Coastguard Worker                 WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical,
441*35ffd701SAndroid Build Coastguard Worker                                                4 * pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth);
442*35ffd701SAndroid Build Coastguard Worker             }
443*35ffd701SAndroid Build Coastguard Worker         }
444*35ffd701SAndroid Build Coastguard Worker 
445*35ffd701SAndroid Build Coastguard Worker         // Calculate Alignment Restriction for rendering on the surface
446*35ffd701SAndroid Build Coastguard Worker         // NOTE:
447*35ffd701SAndroid Build Coastguard Worker         //  WidthBytesPhysical == true physical pitch used to determine amount
448*35ffd701SAndroid Build Coastguard Worker         //                        of Pages need for a surface
449*35ffd701SAndroid Build Coastguard Worker         //  WidthBytesRender == HW require pitch of a surface for rendering
450*35ffd701SAndroid Build Coastguard Worker         //                      (i.e. power2
451*35ffd701SAndroid Build Coastguard Worker         //  WidthBytesLock == Pitch when a surface is visible via Fence region.
452*35ffd701SAndroid Build Coastguard Worker 
453*35ffd701SAndroid Build Coastguard Worker         WidthBytesRender = WidthBytesLock = WidthBytesPhysical;
454*35ffd701SAndroid Build Coastguard Worker 
455*35ffd701SAndroid Build Coastguard Worker         // Align pitch to meet our HW requirment for each buffer
456*35ffd701SAndroid Build Coastguard Worker         WidthBytesRender = GFX_ALIGN(WidthBytesRender,
457*35ffd701SAndroid Build Coastguard Worker                                      pBufferType->RenderPitchAlignment);
458*35ffd701SAndroid Build Coastguard Worker 
459*35ffd701SAndroid Build Coastguard Worker         // Media Memory Compression : Allocate one memory tile wider than is required...
460*35ffd701SAndroid Build Coastguard Worker         pGmmLibContext->GetTextureCalc()->AllocateOneTileThanRequied(pTexInfo, WidthBytesRender,
461*35ffd701SAndroid Build Coastguard Worker                                                                         WidthBytesPhysical, WidthBytesLock);
462*35ffd701SAndroid Build Coastguard Worker 
463*35ffd701SAndroid Build Coastguard Worker         // check if locking a particular suface need to be power 2 or not
464*35ffd701SAndroid Build Coastguard Worker         if(pBufferType->NeedPow2LockAlignment)
465*35ffd701SAndroid Build Coastguard Worker         {
466*35ffd701SAndroid Build Coastguard Worker             WidthBytesLock = GFX_POW2_SIZE(WidthBytesPhysical);
467*35ffd701SAndroid Build Coastguard Worker         }
468*35ffd701SAndroid Build Coastguard Worker 
469*35ffd701SAndroid Build Coastguard Worker         // Align pitch to meet our HW requirment for each buffer
470*35ffd701SAndroid Build Coastguard Worker         // [1] 8K lock pitch is needed on Gen3 when we internally remap the
471*35ffd701SAndroid Build Coastguard Worker         //     display surface in GmmGetDisplayStartAddress ( ). Gen4,
472*35ffd701SAndroid Build Coastguard Worker         //     we don't remap due to Persurface tiling and stick to 64byte
473*35ffd701SAndroid Build Coastguard Worker         //     lock pitch alignment.
474*35ffd701SAndroid Build Coastguard Worker         WidthBytesLock = GFX_ALIGN(WidthBytesLock,
475*35ffd701SAndroid Build Coastguard Worker                                    pBufferType->LockPitchAlignment);
476*35ffd701SAndroid Build Coastguard Worker 
477*35ffd701SAndroid Build Coastguard Worker         if((pTexInfo->Type == RESOURCE_PRIMARY) || pTexInfo->Flags.Gpu.FlipChain)
478*35ffd701SAndroid Build Coastguard Worker         {
479*35ffd701SAndroid Build Coastguard Worker             // [2] At creation time, we tell OS the Render size, not
480*35ffd701SAndroid Build Coastguard Worker             //     SurfaceSizePhysical like other surfaces. Therefore, we change
481*35ffd701SAndroid Build Coastguard Worker             //     the SurfaceSizePhysical to match render size for simplicity.
482*35ffd701SAndroid Build Coastguard Worker             WidthBytesPhysical = WidthBytesRender;
483*35ffd701SAndroid Build Coastguard Worker         }
484*35ffd701SAndroid Build Coastguard Worker 
485*35ffd701SAndroid Build Coastguard Worker         if(pGmmLibContext->GetWaTable().WaMsaa8xTileYDepthPitchAlignment &&
486*35ffd701SAndroid Build Coastguard Worker            (pTexInfo->MSAA.NumSamples == 8) &&
487*35ffd701SAndroid Build Coastguard Worker            GMM_IS_4KB_TILE(pTexInfo->Flags) &&
488*35ffd701SAndroid Build Coastguard Worker            pTexInfo->Flags.Gpu.Depth)
489*35ffd701SAndroid Build Coastguard Worker         {
490*35ffd701SAndroid Build Coastguard Worker             WidthBytesLock =
491*35ffd701SAndroid Build Coastguard Worker             WidthBytesRender =
492*35ffd701SAndroid Build Coastguard Worker             WidthBytesPhysical = GFX_ALIGN(WidthBytesLock, GMM_BYTES(256));
493*35ffd701SAndroid Build Coastguard Worker         }
494*35ffd701SAndroid Build Coastguard Worker     }
495*35ffd701SAndroid Build Coastguard Worker 
496*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(WidthBytesLock == WidthBytesPhysical &&
497*35ffd701SAndroid Build Coastguard Worker                  WidthBytesRender == WidthBytesPhysical &&
498*35ffd701SAndroid Build Coastguard Worker                  WidthBytesLock == WidthBytesRender);
499*35ffd701SAndroid Build Coastguard Worker     pTexInfo->Pitch = WidthBytesLock;
500*35ffd701SAndroid Build Coastguard Worker 
501*35ffd701SAndroid Build Coastguard Worker     //VirtualPadding override
502*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Info.AllowVirtualPadding &&
503*35ffd701SAndroid Build Coastguard Worker        pTexInfo->OverridePitch)
504*35ffd701SAndroid Build Coastguard Worker     {
505*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Pitch = pTexInfo->OverridePitch;
506*35ffd701SAndroid Build Coastguard Worker     }
507*35ffd701SAndroid Build Coastguard Worker 
508*35ffd701SAndroid Build Coastguard Worker     // When lossless compression is enabled with plane width greater than 3840 and
509*35ffd701SAndroid Build Coastguard Worker     // horizontal panning, the surface pitch should be a multiple of 4 tiles. Since
510*35ffd701SAndroid Build Coastguard Worker     // GMM doesn't know about lossless compression status at allocation time, here
511*35ffd701SAndroid Build Coastguard Worker     // we apply the WA to all unified aux surfaces.
512*35ffd701SAndroid Build Coastguard Worker     if(pGmmLibContext->GetWaTable().WaLosslessCompressionSurfaceStride &&
513*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Gpu.UnifiedAuxSurface &&
514*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->BaseWidth > 3840))
515*35ffd701SAndroid Build Coastguard Worker     {
516*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Pitch = GFX_ALIGN(pTexInfo->Pitch, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth * 4);
517*35ffd701SAndroid Build Coastguard Worker     }
518*35ffd701SAndroid Build Coastguard Worker 
519*35ffd701SAndroid Build Coastguard Worker     // If FBC is enabled with a linear surface, the surface pitch should be a multiple of
520*35ffd701SAndroid Build Coastguard Worker     // 8 cache lines (512 bytes). Since GMM doesn't know about FBC status, here we apply
521*35ffd701SAndroid Build Coastguard Worker     // the WA to all linear surfaces.
522*35ffd701SAndroid Build Coastguard Worker     // Xadapter surfaces has to be 128 Bytes aligned and hence we don't want this 512B alignment
523*35ffd701SAndroid Build Coastguard Worker     // for Xadapter. Eventually FBC will be disabled in case of Xadapter Linear surfaces
524*35ffd701SAndroid Build Coastguard Worker     if(pGmmLibContext->GetSkuTable().FtrFbc &&
525*35ffd701SAndroid Build Coastguard Worker        pGmmLibContext->GetWaTable().WaFbcLinearSurfaceStride &&
526*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Gpu.FlipChain &&
527*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Info.Linear &&
528*35ffd701SAndroid Build Coastguard Worker        !pTexInfo->Flags.Info.XAdapter)
529*35ffd701SAndroid Build Coastguard Worker     {
530*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Gpu.FlipChainPreferred)
531*35ffd701SAndroid Build Coastguard Worker         {
532*35ffd701SAndroid Build Coastguard Worker             // Moderate down displayable flags if input parameters (.FlipChainPrefered)
533*35ffd701SAndroid Build Coastguard Worker             // deprioritise it, over Pitch alignement in this case.
534*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.FlipChain = __GMM_IS_ALIGN(pTexInfo->Pitch, 512);
535*35ffd701SAndroid Build Coastguard Worker         }
536*35ffd701SAndroid Build Coastguard Worker         else
537*35ffd701SAndroid Build Coastguard Worker         {
538*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Pitch = GFX_ALIGN(pTexInfo->Pitch, 512);
539*35ffd701SAndroid Build Coastguard Worker         }
540*35ffd701SAndroid Build Coastguard Worker     }
541*35ffd701SAndroid Build Coastguard Worker 
542*35ffd701SAndroid Build Coastguard Worker     // For CCS Aux Display Surf the surface stride should not exceed 8 times the LogicalTileWidth.
543*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs && pTexInfo->Flags.Gpu.FlipChain &&
544*35ffd701SAndroid Build Coastguard Worker        (GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN9_CORE))
545*35ffd701SAndroid Build Coastguard Worker     {
546*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(pTexInfo->Pitch <= (pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth * 8));
547*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Pitch = GFX_MIN(pTexInfo->Pitch, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth * 8);
548*35ffd701SAndroid Build Coastguard Worker     }
549*35ffd701SAndroid Build Coastguard Worker 
550*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs &&
551*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Pitch > pPlatform->TexAlign.CCS.MaxPitchinTiles * pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth))
552*35ffd701SAndroid Build Coastguard Worker     {
553*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Aux Surface pitch too large!");
554*35ffd701SAndroid Build Coastguard Worker         Status = GMM_ERROR;
555*35ffd701SAndroid Build Coastguard Worker     }
556*35ffd701SAndroid Build Coastguard Worker 
557*35ffd701SAndroid Build Coastguard Worker     if(pGmmLibContext->GetWaTable().Wa_15010089951)
558*35ffd701SAndroid Build Coastguard Worker     {
559*35ffd701SAndroid Build Coastguard Worker         // Default Tiling is set to Tile64 on FtrTileY disabled platforms
560*35ffd701SAndroid Build Coastguard Worker         uint8_t IsYUVSurface = ((GmmIsPlanar(pTexInfo->Format) &&
561*35ffd701SAndroid Build Coastguard Worker                                  (!((pTexInfo->Format == GMM_FORMAT_BGRP) || (pTexInfo->Format == GMM_FORMAT_RGBP)))) ||
562*35ffd701SAndroid Build Coastguard Worker                                 (GmmIsYUVPacked(pTexInfo->Format) &&
563*35ffd701SAndroid Build Coastguard Worker                                  !((pTexInfo->Format == GMM_FORMAT_YVYU_2x1) || (pTexInfo->Format == GMM_FORMAT_UYVY_2x1) || (pTexInfo->Format == GMM_FORMAT_UYVY_2x1))));
564*35ffd701SAndroid Build Coastguard Worker 
565*35ffd701SAndroid Build Coastguard Worker         //YCRCB* formats
566*35ffd701SAndroid Build Coastguard Worker         uint8_t IsYCrCbSurface = ((pTexInfo->Format == GMM_FORMAT_YCRCB_NORMAL) ||
567*35ffd701SAndroid Build Coastguard Worker                                   (pTexInfo->Format == GMM_FORMAT_YCRCB_SWAPUV) ||
568*35ffd701SAndroid Build Coastguard Worker                                   (pTexInfo->Format == GMM_FORMAT_YCRCB_SWAPUVY) || (pTexInfo->Format == GMM_FORMAT_YCRCB_SWAPY));
569*35ffd701SAndroid Build Coastguard Worker 
570*35ffd701SAndroid Build Coastguard Worker         // Allocation needs to extend an extra tile in width when pitch is not an odd multiplication
571*35ffd701SAndroid Build Coastguard Worker         // of tile width which is 128 for Tile4 (YUV allocation is forced as Tile4).
572*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Info.Tile4 && (IsYUVSurface || IsYCrCbSurface) &&
573*35ffd701SAndroid Build Coastguard Worker            ((pTexInfo->Pitch / (pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth)) % 2 == 0))
574*35ffd701SAndroid Build Coastguard Worker         {
575*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Pitch = (pTexInfo->Pitch + (pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth));
576*35ffd701SAndroid Build Coastguard Worker         }
577*35ffd701SAndroid Build Coastguard Worker     }
578*35ffd701SAndroid Build Coastguard Worker 
579*35ffd701SAndroid Build Coastguard Worker     // For NV12 Linear FlipChain surfaces, UV plane distance should be 4k Aligned.
580*35ffd701SAndroid Build Coastguard Worker     // Hence make the stride to align to 4k, so that UV distance will be 4k aligned.
581*35ffd701SAndroid Build Coastguard Worker     if(pGmmLibContext->GetWaTable().Wa4kAlignUVOffsetNV12LinearSurface &&
582*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Format == GMM_FORMAT_NV12 || GmmIsP0xx(pTexInfo->Format)) && pTexInfo->Flags.Info.Linear &&
583*35ffd701SAndroid Build Coastguard Worker        (!pTexInfo->Flags.Info.XAdapter) &&
584*35ffd701SAndroid Build Coastguard Worker        ((pTexInfo->Type == RESOURCE_PRIMARY) || pTexInfo->Flags.Gpu.FlipChain))
585*35ffd701SAndroid Build Coastguard Worker     {
586*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Gpu.FlipChainPreferred)
587*35ffd701SAndroid Build Coastguard Worker         {
588*35ffd701SAndroid Build Coastguard Worker             // Moderate down displayable flags if input parameters (.FlipChainPrefered)
589*35ffd701SAndroid Build Coastguard Worker             // deprioritise it, over Pitch alignement in this case.
590*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.FlipChain = __GMM_IS_ALIGN(pTexInfo->Pitch, GMM_KBYTE(4));
591*35ffd701SAndroid Build Coastguard Worker         }
592*35ffd701SAndroid Build Coastguard Worker         else
593*35ffd701SAndroid Build Coastguard Worker         {
594*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Pitch = GFX_ALIGN(pTexInfo->Pitch, GMM_KBYTE(4));
595*35ffd701SAndroid Build Coastguard Worker         }
596*35ffd701SAndroid Build Coastguard Worker     }
597*35ffd701SAndroid Build Coastguard Worker 
598*35ffd701SAndroid Build Coastguard Worker     if((GFX_GET_CURRENT_PRODUCT(pPlatform->Platform) >= IGFX_METEORLAKE))
599*35ffd701SAndroid Build Coastguard Worker     {
600*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.PhysicalPitch = pTexInfo->Pitch;
601*35ffd701SAndroid Build Coastguard Worker     }
602*35ffd701SAndroid Build Coastguard Worker 
603*35ffd701SAndroid Build Coastguard Worker     { // Surface Sizes
604*35ffd701SAndroid Build Coastguard Worker         int64_t Size;
605*35ffd701SAndroid Build Coastguard Worker 
606*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Gpu.S3d)
607*35ffd701SAndroid Build Coastguard Worker         {
608*35ffd701SAndroid Build Coastguard Worker             if(pGmmLibContext->GetSkuTable().FtrDisplayEngineS3d) // BDW+ Display Engine S3D (Tiled)
609*35ffd701SAndroid Build Coastguard Worker             {
610*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(!pTexInfo->Flags.Info.Linear);
611*35ffd701SAndroid Build Coastguard Worker 
612*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->S3d.BlankAreaOffset = 0;
613*35ffd701SAndroid Build Coastguard Worker 
614*35ffd701SAndroid Build Coastguard Worker                 if(pTexInfo->Flags.Gpu.S3dDx && (pTexInfo->ArraySize == 2))
615*35ffd701SAndroid Build Coastguard Worker                 {
616*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->S3d.RFrameOffset     = GFX_ULONG_CAST(pTexInfo->Pitch * pTexInfo->Alignment.QPitch);
617*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->S3d.TallBufferHeight = Height;
618*35ffd701SAndroid Build Coastguard Worker                 }
619*35ffd701SAndroid Build Coastguard Worker                 else
620*35ffd701SAndroid Build Coastguard Worker                 {
621*35ffd701SAndroid Build Coastguard Worker                     if(pTexInfo->Flags.Gpu.Overlay)
622*35ffd701SAndroid Build Coastguard Worker                     {
623*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->S3d.RFrameOffset = GFX_ULONG_CAST(pTexInfo->Pitch * Height);
624*35ffd701SAndroid Build Coastguard Worker 
625*35ffd701SAndroid Build Coastguard Worker                         Height = pTexInfo->S3d.TallBufferHeight = Height * 2;
626*35ffd701SAndroid Build Coastguard Worker                     }
627*35ffd701SAndroid Build Coastguard Worker                     else if(pTexInfo->Flags.Gpu.FlipChain)
628*35ffd701SAndroid Build Coastguard Worker                     {
629*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->S3d.RFrameOffset     = 0;
630*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->S3d.TallBufferHeight = Height;
631*35ffd701SAndroid Build Coastguard Worker                     }
632*35ffd701SAndroid Build Coastguard Worker                     else
633*35ffd701SAndroid Build Coastguard Worker                     {
634*35ffd701SAndroid Build Coastguard Worker                         // Something must be wrong. Not an S3D resource!
635*35ffd701SAndroid Build Coastguard Worker                         __GMM_ASSERT(0);
636*35ffd701SAndroid Build Coastguard Worker                     }
637*35ffd701SAndroid Build Coastguard Worker                 }
638*35ffd701SAndroid Build Coastguard Worker 
639*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(__GMM_IS_ALIGN(pTexInfo->S3d.RFrameOffset, PAGE_SIZE));
640*35ffd701SAndroid Build Coastguard Worker             }
641*35ffd701SAndroid Build Coastguard Worker             else if(pTexInfo->Flags.Gpu.S3dDx) // DX S3D (Tiled)
642*35ffd701SAndroid Build Coastguard Worker             {
643*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(!pTexInfo->Flags.Info.Linear || !pTexInfo->Flags.Gpu.Overlay);
644*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(pTexInfo->ArraySize <= 1); // S3D framebuffer arrays are not supported (pre-BDW).
645*35ffd701SAndroid Build Coastguard Worker 
646*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->S3d.BlankAreaOffset = GFX_ULONG_CAST(pTexInfo->Pitch * pTexInfo->BaseHeight);
647*35ffd701SAndroid Build Coastguard Worker 
648*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->S3d.RFrameOffset =
649*35ffd701SAndroid Build Coastguard Worker                 GFX_ULONG_CAST(pTexInfo->Pitch *
650*35ffd701SAndroid Build Coastguard Worker                                (pTexInfo->S3d.DisplayModeHeight + pTexInfo->S3d.NumBlankActiveLines));
651*35ffd701SAndroid Build Coastguard Worker 
652*35ffd701SAndroid Build Coastguard Worker                 Height =
653*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->S3d.TallBufferHeight =
654*35ffd701SAndroid Build Coastguard Worker                 GFX_ALIGN(
655*35ffd701SAndroid Build Coastguard Worker                 (pTexInfo->BaseHeight * 2) + pTexInfo->S3d.NumBlankActiveLines,
656*35ffd701SAndroid Build Coastguard Worker                 pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight);
657*35ffd701SAndroid Build Coastguard Worker             }
658*35ffd701SAndroid Build Coastguard Worker             else // Legacy S3D
659*35ffd701SAndroid Build Coastguard Worker             {
660*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(pTexInfo->Flags.Info.Linear);
661*35ffd701SAndroid Build Coastguard Worker 
662*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->S3d.BlankAreaOffset = GFX_ULONG_CAST(pTexInfo->Pitch * pTexInfo->BaseHeight);
663*35ffd701SAndroid Build Coastguard Worker 
664*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->S3d.RFrameOffset =
665*35ffd701SAndroid Build Coastguard Worker                 GFX_ULONG_CAST(pTexInfo->Pitch *
666*35ffd701SAndroid Build Coastguard Worker                                (pTexInfo->S3d.DisplayModeHeight + pTexInfo->S3d.NumBlankActiveLines));
667*35ffd701SAndroid Build Coastguard Worker 
668*35ffd701SAndroid Build Coastguard Worker                 if(pTexInfo->Flags.Gpu.Overlay)
669*35ffd701SAndroid Build Coastguard Worker                 {
670*35ffd701SAndroid Build Coastguard Worker                     Height =
671*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->S3d.TallBufferHeight =
672*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->BaseHeight +
673*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->S3d.NumBlankActiveLines +
674*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->S3d.DisplayModeHeight;
675*35ffd701SAndroid Build Coastguard Worker                 }
676*35ffd701SAndroid Build Coastguard Worker                 else if(pTexInfo->Flags.Gpu.FlipChain)
677*35ffd701SAndroid Build Coastguard Worker                 {
678*35ffd701SAndroid Build Coastguard Worker                     __GMM_ASSERT(pTexInfo->S3d.DisplayModeHeight == pTexInfo->BaseHeight);
679*35ffd701SAndroid Build Coastguard Worker 
680*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->S3d.TallBufferHeight =
681*35ffd701SAndroid Build Coastguard Worker                     (pTexInfo->BaseHeight * 2) +
682*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->S3d.NumBlankActiveLines;
683*35ffd701SAndroid Build Coastguard Worker                 }
684*35ffd701SAndroid Build Coastguard Worker                 else
685*35ffd701SAndroid Build Coastguard Worker                 {
686*35ffd701SAndroid Build Coastguard Worker                     // Something must be wrong. Not an S3D resource!
687*35ffd701SAndroid Build Coastguard Worker                     __GMM_ASSERT(0);
688*35ffd701SAndroid Build Coastguard Worker                 }
689*35ffd701SAndroid Build Coastguard Worker 
690*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(__GMM_IS_ALIGN(pTexInfo->S3d.RFrameOffset, PAGE_SIZE));
691*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(__GMM_IS_ALIGN(pTexInfo->S3d.BlankAreaOffset, PAGE_SIZE));
692*35ffd701SAndroid Build Coastguard Worker             }
693*35ffd701SAndroid Build Coastguard Worker 
694*35ffd701SAndroid Build Coastguard Worker             // Calculate surface size (physical).
695*35ffd701SAndroid Build Coastguard Worker             Size = pTexInfo->Pitch * Height;
696*35ffd701SAndroid Build Coastguard Worker 
697*35ffd701SAndroid Build Coastguard Worker             // Calculate tall buffer size (virtual).
698*35ffd701SAndroid Build Coastguard Worker             pTexInfo->S3d.TallBufferSize = GFX_ULONG_CAST(pTexInfo->Pitch * pTexInfo->S3d.TallBufferHeight);
699*35ffd701SAndroid Build Coastguard Worker         }
700*35ffd701SAndroid Build Coastguard Worker         else
701*35ffd701SAndroid Build Coastguard Worker         {
702*35ffd701SAndroid Build Coastguard Worker             Size = (int64_t)pTexInfo->Pitch * Height;
703*35ffd701SAndroid Build Coastguard Worker 
704*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Type == RESOURCE_3D && !pTexInfo->Flags.Info.Linear)
705*35ffd701SAndroid Build Coastguard Worker             {
706*35ffd701SAndroid Build Coastguard Worker                 Size *= pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileDepth;
707*35ffd701SAndroid Build Coastguard Worker             }
708*35ffd701SAndroid Build Coastguard Worker 
709*35ffd701SAndroid Build Coastguard Worker             if((pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) &&
710*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->MSAA.NumSamples > 1) &&
711*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Flags.Gpu.Depth == 0 && pTexInfo->Flags.Gpu.SeparateStencil == 0))
712*35ffd701SAndroid Build Coastguard Worker             {
713*35ffd701SAndroid Build Coastguard Worker                 // For color buffer (meaning not depth or stencil buffer)
714*35ffd701SAndroid Build Coastguard Worker                 // The width/height for TileYf/Ys MSAA surfaces are not expanded (using GmmExpandWidth/Height functions)
715*35ffd701SAndroid Build Coastguard Worker                 // because pitch for these surfaces is in their non-expanded dimensions. So, the pitch
716*35ffd701SAndroid Build Coastguard Worker                 // is also non-expanded units.  That's why, we multiply by the sample size here to get the correct size.
717*35ffd701SAndroid Build Coastguard Worker                 if(pGmmLibContext->GetSkuTable().FtrTileY)
718*35ffd701SAndroid Build Coastguard Worker                 {
719*35ffd701SAndroid Build Coastguard Worker                     Size *= pTexInfo->MSAA.NumSamples;
720*35ffd701SAndroid Build Coastguard Worker                 }
721*35ffd701SAndroid Build Coastguard Worker                 else
722*35ffd701SAndroid Build Coastguard Worker                 {
723*35ffd701SAndroid Build Coastguard Worker                     //XeHP, DG2
724*35ffd701SAndroid Build Coastguard Worker                     if (!pGmmLibContext->GetSkuTable().FtrXe2PlusTiling && (pTexInfo->MSAA.NumSamples == 8 || pTexInfo->MSAA.NumSamples == 16))
725*35ffd701SAndroid Build Coastguard Worker                     {
726*35ffd701SAndroid Build Coastguard Worker                         uint64_t SliceSize = pTexInfo->Pitch * Height;
727*35ffd701SAndroid Build Coastguard Worker                         SliceSize *= 4; // multiple by samples per tile
728*35ffd701SAndroid Build Coastguard Worker                         Size = (int64_t)SliceSize;
729*35ffd701SAndroid Build Coastguard Worker                     }
730*35ffd701SAndroid Build Coastguard Worker                     else
731*35ffd701SAndroid Build Coastguard Worker                     {
732*35ffd701SAndroid Build Coastguard Worker                         Size *= pTexInfo->MSAA.NumSamples;
733*35ffd701SAndroid Build Coastguard Worker                     }
734*35ffd701SAndroid Build Coastguard Worker                 }
735*35ffd701SAndroid Build Coastguard Worker             }
736*35ffd701SAndroid Build Coastguard Worker 
737*35ffd701SAndroid Build Coastguard Worker             if((pTexInfo->Flags.Info.TiledY && pTexInfo->Flags.Gpu.TiledResource))
738*35ffd701SAndroid Build Coastguard Worker             {
739*35ffd701SAndroid Build Coastguard Worker                 //Pad align surface to 64KB ie Tile size
740*35ffd701SAndroid Build Coastguard Worker                 Size = GFX_ALIGN(Size, GMM_KBYTE(64));
741*35ffd701SAndroid Build Coastguard Worker             }
742*35ffd701SAndroid Build Coastguard Worker 
743*35ffd701SAndroid Build Coastguard Worker             if (pGmmLibContext->GetSkuTable().FtrXe2Compression && pTexInfo->Flags.Info.Linear)
744*35ffd701SAndroid Build Coastguard Worker             {
745*35ffd701SAndroid Build Coastguard Worker                 Size = GFX_ALIGN(Size, GMM_BYTES(256)); // for all linear resources starting Xe2, align overall size to compression block size. For subresources, 256B alignment is not needed, needed only for overall resource
746*35ffd701SAndroid Build Coastguard Worker                                                         // on older platforms, all linear resources get Halign = 128B which ensures overall size to be a multiple of compression block size of 128B,
747*35ffd701SAndroid Build Coastguard Worker                                                         // so this is needed only for linear resources on Xe2 where HAlign continues to be at 128B, but compression block size has doubled to 256B
748*35ffd701SAndroid Build Coastguard Worker             }
749*35ffd701SAndroid Build Coastguard Worker 
750*35ffd701SAndroid Build Coastguard Worker             // Buffer Sampler Padding...
751*35ffd701SAndroid Build Coastguard Worker             if((pTexInfo->Type == RESOURCE_BUFFER) &&
752*35ffd701SAndroid Build Coastguard Worker                pGmmLibContext->GetWaTable().WaNoMinimizedTrivialSurfacePadding &&
753*35ffd701SAndroid Build Coastguard Worker                !pTexInfo->Flags.Wa.NoBufferSamplerPadding &&
754*35ffd701SAndroid Build Coastguard Worker                !pTexInfo->Flags.Info.ExistingSysMem && // <-- Currently using separate padding WA in OCL (and rarity/luck in other UMD's).
755*35ffd701SAndroid Build Coastguard Worker                // <-- Never sampled from.
756*35ffd701SAndroid Build Coastguard Worker                !pTexInfo->Flags.Gpu.Query &&
757*35ffd701SAndroid Build Coastguard Worker                !pTexInfo->Flags.Gpu.HistoryBuffer &&
758*35ffd701SAndroid Build Coastguard Worker                !pTexInfo->Flags.Gpu.State &&
759*35ffd701SAndroid Build Coastguard Worker                !pTexInfo->Flags.Gpu.StateDx9ConstantBuffer)
760*35ffd701SAndroid Build Coastguard Worker             // These can be sampled from, so they need the padding...
761*35ffd701SAndroid Build Coastguard Worker             // pTexInfo->Flags.Gpu.Constant
762*35ffd701SAndroid Build Coastguard Worker             // pTexInfo->Flags.Gpu.Index
763*35ffd701SAndroid Build Coastguard Worker             // pTexInfo->Flags.Gpu.Stream
764*35ffd701SAndroid Build Coastguard Worker             // pTexInfo->Flags.Gpu.Vertex
765*35ffd701SAndroid Build Coastguard Worker 
766*35ffd701SAndroid Build Coastguard Worker             {
767*35ffd701SAndroid Build Coastguard Worker                 uint32_t BufferSizeAlignment;
768*35ffd701SAndroid Build Coastguard Worker                 uint32_t BufferSizePadding;
769*35ffd701SAndroid Build Coastguard Worker 
770*35ffd701SAndroid Build Coastguard Worker                 // SURFTYPE_BUFFER's that can be sampled from must have their size
771*35ffd701SAndroid Build Coastguard Worker                 // padded to a multiple of 256 buffer elements and then have an
772*35ffd701SAndroid Build Coastguard Worker                 // additional 16 bytes of padding beyond that. Currently, the GMM
773*35ffd701SAndroid Build Coastguard Worker                 // doesn't receive a buffer's element type/size, so (until that's
774*35ffd701SAndroid Build Coastguard Worker                 // revamped) we'll assume the worst-case of 128-bit elements--which
775*35ffd701SAndroid Build Coastguard Worker                 // means padding to 256 * 128 / 8 = 4KB and then adding 16 bytes.
776*35ffd701SAndroid Build Coastguard Worker                 // In the case of BDW:A0, size is padded to a multiple of 512 buffer
777*35ffd701SAndroid Build Coastguard Worker                 // elements instead of 256--which means padding to 8KB.
778*35ffd701SAndroid Build Coastguard Worker 
779*35ffd701SAndroid Build Coastguard Worker                 BufferSizeAlignment =
780*35ffd701SAndroid Build Coastguard Worker                 (GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN8_CORE) ?
781*35ffd701SAndroid Build Coastguard Worker                 8192 :
782*35ffd701SAndroid Build Coastguard Worker                 4096;
783*35ffd701SAndroid Build Coastguard Worker 
784*35ffd701SAndroid Build Coastguard Worker                 BufferSizePadding = 16;
785*35ffd701SAndroid Build Coastguard Worker 
786*35ffd701SAndroid Build Coastguard Worker                 Size = GFX_ALIGN(Size, BufferSizeAlignment) + BufferSizePadding;
787*35ffd701SAndroid Build Coastguard Worker             }
788*35ffd701SAndroid Build Coastguard Worker 
789*35ffd701SAndroid Build Coastguard Worker             // HiZ Clear Color requires some small data at the end of the allocation to
790*35ffd701SAndroid Build Coastguard Worker             // store the color data.
791*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Gpu.HiZ && pTexInfo->Flags.Gpu.IndirectClearColor)
792*35ffd701SAndroid Build Coastguard Worker             {
793*35ffd701SAndroid Build Coastguard Worker                 Size += GMM_HIZ_CLEAR_COLOR_SIZE;
794*35ffd701SAndroid Build Coastguard Worker             }
795*35ffd701SAndroid Build Coastguard Worker 
796*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Info.ExistingSysMem &&
797*35ffd701SAndroid Build Coastguard Worker                !pTexInfo->ExistingSysMem.IsGmmAllocated &&
798*35ffd701SAndroid Build Coastguard Worker                !pTexInfo->ExistingSysMem.IsPageAligned)
799*35ffd701SAndroid Build Coastguard Worker             {
800*35ffd701SAndroid Build Coastguard Worker                 // Do not modify Size
801*35ffd701SAndroid Build Coastguard Worker             }
802*35ffd701SAndroid Build Coastguard Worker             else
803*35ffd701SAndroid Build Coastguard Worker             {
804*35ffd701SAndroid Build Coastguard Worker                 Size = GFX_ALIGN(Size, PAGE_SIZE);
805*35ffd701SAndroid Build Coastguard Worker             }
806*35ffd701SAndroid Build Coastguard Worker         }
807*35ffd701SAndroid Build Coastguard Worker 
808*35ffd701SAndroid Build Coastguard Worker         int64_t SurfaceMaxSize = 0;
809*35ffd701SAndroid Build Coastguard Worker 
810*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Gpu.NoRestriction)
811*35ffd701SAndroid Build Coastguard Worker         {
812*35ffd701SAndroid Build Coastguard Worker             SurfaceMaxSize = pPlatform->NoRestriction.MaxWidth;
813*35ffd701SAndroid Build Coastguard Worker         }
814*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Gpu.TiledResource)
815*35ffd701SAndroid Build Coastguard Worker         {
816*35ffd701SAndroid Build Coastguard Worker             SurfaceMaxSize = GMM_TBYTE(1);
817*35ffd701SAndroid Build Coastguard Worker         }
818*35ffd701SAndroid Build Coastguard Worker         else
819*35ffd701SAndroid Build Coastguard Worker         {
820*35ffd701SAndroid Build Coastguard Worker             SurfaceMaxSize = pPlatform->SurfaceMaxSize;
821*35ffd701SAndroid Build Coastguard Worker         }
822*35ffd701SAndroid Build Coastguard Worker 
823*35ffd701SAndroid Build Coastguard Worker         if(Size <= SurfaceMaxSize)
824*35ffd701SAndroid Build Coastguard Worker         {
825*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Size = Size;
826*35ffd701SAndroid Build Coastguard Worker         }
827*35ffd701SAndroid Build Coastguard Worker         else
828*35ffd701SAndroid Build Coastguard Worker         {
829*35ffd701SAndroid Build Coastguard Worker #if defined(__GMM_KMD__) || defined(__linux__)
830*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Surface too large!");
831*35ffd701SAndroid Build Coastguard Worker #endif
832*35ffd701SAndroid Build Coastguard Worker             Status = GMM_ERROR;
833*35ffd701SAndroid Build Coastguard Worker         }
834*35ffd701SAndroid Build Coastguard Worker     }
835*35ffd701SAndroid Build Coastguard Worker 
836*35ffd701SAndroid Build Coastguard Worker     {
837*35ffd701SAndroid Build Coastguard Worker         uint64_t TotalAlignment = (((uint64_t)((uint32_t)(pTexInfo->Alignment.BaseAlignment))) * ((uint32_t)(pBufferType->Alignment)));
838*35ffd701SAndroid Build Coastguard Worker 
839*35ffd701SAndroid Build Coastguard Worker         if(!pTexInfo->Alignment.BaseAlignment || __GMM_IS_ALIGN(pBufferType->Alignment, pTexInfo->Alignment.BaseAlignment))
840*35ffd701SAndroid Build Coastguard Worker         {
841*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Alignment.BaseAlignment = pBufferType->Alignment;
842*35ffd701SAndroid Build Coastguard Worker         }
843*35ffd701SAndroid Build Coastguard Worker         else if(__GMM_IS_ALIGN(pTexInfo->Alignment.BaseAlignment, pBufferType->Alignment))
844*35ffd701SAndroid Build Coastguard Worker         {
845*35ffd701SAndroid Build Coastguard Worker             // Do nothing: pTexInfo->Alignment.BaseAlignment is properly alighned
846*35ffd701SAndroid Build Coastguard Worker         }
847*35ffd701SAndroid Build Coastguard Worker         else if(TotalAlignment > 0xFFFFFFFF)
848*35ffd701SAndroid Build Coastguard Worker         {
849*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Client requested alignment is too high, failing the allocation to match HW requiremnets. \r\n");
850*35ffd701SAndroid Build Coastguard Worker             Status = GMM_ERROR;
851*35ffd701SAndroid Build Coastguard Worker         }
852*35ffd701SAndroid Build Coastguard Worker         else
853*35ffd701SAndroid Build Coastguard Worker         {
854*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Alignment.BaseAlignment = pTexInfo->Alignment.BaseAlignment * pBufferType->Alignment;
855*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0,
856*35ffd701SAndroid Build Coastguard Worker                           "Client requested alignment that is not properly aligned to HW requirements."
857*35ffd701SAndroid Build Coastguard Worker                           "Alignment is going to be much higher to match both client and HW requirements.\r\n");
858*35ffd701SAndroid Build Coastguard Worker         }
859*35ffd701SAndroid Build Coastguard Worker     }
860*35ffd701SAndroid Build Coastguard Worker 
861*35ffd701SAndroid Build Coastguard Worker     if((pTexInfo->Flags.Gpu.TilePool && (GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN9_CORE)) ||
862*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Flags.Info.Undefined64KBSwizzle) || GMM_IS_64KB_TILE(pTexInfo->Flags))
863*35ffd701SAndroid Build Coastguard Worker     {
864*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Alignment.BaseAlignment = (GFX_IS_ALIGNED(pTexInfo->Alignment.BaseAlignment, GMM_KBYTE(64))) ? pTexInfo->Alignment.BaseAlignment : GMM_KBYTE(64);
865*35ffd701SAndroid Build Coastguard Worker     }
866*35ffd701SAndroid Build Coastguard Worker 
867*35ffd701SAndroid Build Coastguard Worker     if(pGmmLibContext->GetWaTable().WaCompressedResourceRequiresConstVA21 && pTexInfo->Flags.Gpu.MMC)
868*35ffd701SAndroid Build Coastguard Worker     {
869*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Alignment.BaseAlignment = GMM_MBYTE(4);
870*35ffd701SAndroid Build Coastguard Worker     }
871*35ffd701SAndroid Build Coastguard Worker 
872*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
873*35ffd701SAndroid Build Coastguard Worker 
874*35ffd701SAndroid Build Coastguard Worker     return (Status);
875*35ffd701SAndroid Build Coastguard Worker } // FillTexPitchAndSize
876*35ffd701SAndroid Build Coastguard Worker 
877*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
878*35ffd701SAndroid Build Coastguard Worker /// This function will Setup a planar surface allocation.
879*35ffd701SAndroid Build Coastguard Worker ///
880*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to ::GMM_TEXTURE_INFO
881*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pRestrictions: Reference to surface alignment and size restrictions.
882*35ffd701SAndroid Build Coastguard Worker ///
883*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
884*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTexPlanar(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)885*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmTextureCalc::FillTexPlanar(GMM_TEXTURE_INFO * pTexInfo,
886*35ffd701SAndroid Build Coastguard Worker                                                              __GMM_BUFFER_TYPE *pRestrictions)
887*35ffd701SAndroid Build Coastguard Worker {
888*35ffd701SAndroid Build Coastguard Worker     uint32_t   WidthBytesPhysical, Height, YHeight, VHeight;
889*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS Status;
890*35ffd701SAndroid Build Coastguard Worker     bool       UVPacked = false;
891*35ffd701SAndroid Build Coastguard Worker 
892*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
893*35ffd701SAndroid Build Coastguard Worker 
894*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
895*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pRestrictions, GMM_ERROR);
896*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(!pTexInfo->Flags.Info.TiledW);
897*35ffd701SAndroid Build Coastguard Worker     pTexInfo->TileMode = TILE_NONE;
898*35ffd701SAndroid Build Coastguard Worker 
899*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
900*35ffd701SAndroid Build Coastguard Worker 
901*35ffd701SAndroid Build Coastguard Worker     WidthBytesPhysical = GFX_ULONG_CAST(pTexInfo->BaseWidth) * pTexInfo->BitsPerPixel >> 3;
902*35ffd701SAndroid Build Coastguard Worker     Height = VHeight = 0;
903*35ffd701SAndroid Build Coastguard Worker 
904*35ffd701SAndroid Build Coastguard Worker     YHeight = pTexInfo->BaseHeight;
905*35ffd701SAndroid Build Coastguard Worker 
906*35ffd701SAndroid Build Coastguard Worker     switch(pTexInfo->Format)
907*35ffd701SAndroid Build Coastguard Worker     {
908*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC1: // IMC1 = IMC3 with Swapped U/V
909*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC3:
910*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV420: // Same as IMC3.
911*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
912*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
913*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
914*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
915*35ffd701SAndroid Build Coastguard Worker         // UUUU
916*35ffd701SAndroid Build Coastguard Worker         // UUUU
917*35ffd701SAndroid Build Coastguard Worker         // VVVV
918*35ffd701SAndroid Build Coastguard Worker         // VVVV
919*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV422V: // Similar to IMC3 but U/V are full width.
920*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
921*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
922*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
923*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
924*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
925*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
926*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
927*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
928*35ffd701SAndroid Build Coastguard Worker             {
929*35ffd701SAndroid Build Coastguard Worker                 VHeight = GFX_ALIGN(GFX_CEIL_DIV(YHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
930*35ffd701SAndroid Build Coastguard Worker 
931*35ffd701SAndroid Build Coastguard Worker                 YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
932*35ffd701SAndroid Build Coastguard Worker 
933*35ffd701SAndroid Build Coastguard Worker                 Height = YHeight + 2 * VHeight; // One VHeight for V and one for U.
934*35ffd701SAndroid Build Coastguard Worker 
935*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
936*35ffd701SAndroid Build Coastguard Worker 
937*35ffd701SAndroid Build Coastguard Worker                 break;
938*35ffd701SAndroid Build Coastguard Worker             }
939*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV411R_TYPE: //Similar to IMC3 but U/V are quarther height and full width.
940*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
941*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
942*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
943*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
944*35ffd701SAndroid Build Coastguard Worker             //UUUUUUUU
945*35ffd701SAndroid Build Coastguard Worker             //VVVVVVVV
946*35ffd701SAndroid Build Coastguard Worker             {
947*35ffd701SAndroid Build Coastguard Worker                 VHeight = GFX_ALIGN(GFX_CEIL_DIV(YHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
948*35ffd701SAndroid Build Coastguard Worker 
949*35ffd701SAndroid Build Coastguard Worker                 YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
950*35ffd701SAndroid Build Coastguard Worker 
951*35ffd701SAndroid Build Coastguard Worker                 Height = YHeight + 2 * VHeight;
952*35ffd701SAndroid Build Coastguard Worker 
953*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
954*35ffd701SAndroid Build Coastguard Worker 
955*35ffd701SAndroid Build Coastguard Worker                 break;
956*35ffd701SAndroid Build Coastguard Worker             }
957*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV411: // Similar to IMC3 but U/V are quarter width and full height.
958*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
959*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
960*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
961*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
962*35ffd701SAndroid Build Coastguard Worker         // UU
963*35ffd701SAndroid Build Coastguard Worker         // UU
964*35ffd701SAndroid Build Coastguard Worker         // UU
965*35ffd701SAndroid Build Coastguard Worker         // UU
966*35ffd701SAndroid Build Coastguard Worker         // VV
967*35ffd701SAndroid Build Coastguard Worker         // VV
968*35ffd701SAndroid Build Coastguard Worker         // VV
969*35ffd701SAndroid Build Coastguard Worker         // VV
970*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV422H: // Similar to IMC3 but U/V are full height.
971*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
972*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
973*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
974*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
975*35ffd701SAndroid Build Coastguard Worker         // UUUU
976*35ffd701SAndroid Build Coastguard Worker         // UUUU
977*35ffd701SAndroid Build Coastguard Worker         // UUUU
978*35ffd701SAndroid Build Coastguard Worker         // UUUU
979*35ffd701SAndroid Build Coastguard Worker         // VVVV
980*35ffd701SAndroid Build Coastguard Worker         // VVVV
981*35ffd701SAndroid Build Coastguard Worker         // VVVV
982*35ffd701SAndroid Build Coastguard Worker         // VVVV
983*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV444: // Similar to IMC3 but U/V are full size.
984*35ffd701SAndroid Build Coastguard Worker #if _WIN32
985*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_WGBOX_YUV444:
986*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_WGBOX_PLANAR_YUV444:
987*35ffd701SAndroid Build Coastguard Worker #endif
988*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
989*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
990*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
991*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
992*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
993*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
994*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
995*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
996*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
997*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
998*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
999*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
1000*35ffd701SAndroid Build Coastguard Worker             {
1001*35ffd701SAndroid Build Coastguard Worker                 YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
1002*35ffd701SAndroid Build Coastguard Worker                 VHeight = YHeight;
1003*35ffd701SAndroid Build Coastguard Worker 
1004*35ffd701SAndroid Build Coastguard Worker                 Height = YHeight + 2 * VHeight;
1005*35ffd701SAndroid Build Coastguard Worker 
1006*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
1007*35ffd701SAndroid Build Coastguard Worker 
1008*35ffd701SAndroid Build Coastguard Worker                 break;
1009*35ffd701SAndroid Build Coastguard Worker             }
1010*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_BGRP:
1011*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_RGBP:
1012*35ffd701SAndroid Build Coastguard Worker         {
1013*35ffd701SAndroid Build Coastguard Worker             //For RGBP linear Tile keep resource Offset non aligned and for other Tile format to be 16-bit aligned
1014*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Info.Linear)
1015*35ffd701SAndroid Build Coastguard Worker             {
1016*35ffd701SAndroid Build Coastguard Worker                 VHeight = YHeight;
1017*35ffd701SAndroid Build Coastguard Worker 
1018*35ffd701SAndroid Build Coastguard Worker                 Height = YHeight + 2 * VHeight;
1019*35ffd701SAndroid Build Coastguard Worker 
1020*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
1021*35ffd701SAndroid Build Coastguard Worker             }
1022*35ffd701SAndroid Build Coastguard Worker             else
1023*35ffd701SAndroid Build Coastguard Worker             {
1024*35ffd701SAndroid Build Coastguard Worker                 YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
1025*35ffd701SAndroid Build Coastguard Worker                 VHeight = YHeight;
1026*35ffd701SAndroid Build Coastguard Worker 
1027*35ffd701SAndroid Build Coastguard Worker                 Height = YHeight + 2 * VHeight;
1028*35ffd701SAndroid Build Coastguard Worker 
1029*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
1030*35ffd701SAndroid Build Coastguard Worker             }
1031*35ffd701SAndroid Build Coastguard Worker 
1032*35ffd701SAndroid Build Coastguard Worker             break;
1033*35ffd701SAndroid Build Coastguard Worker         }
1034*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC2: // IMC2 = IMC4 with Swapped U/V
1035*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC4:
1036*35ffd701SAndroid Build Coastguard Worker         {
1037*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1038*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1039*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1040*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1041*35ffd701SAndroid Build Coastguard Worker             // UUUUVVVV
1042*35ffd701SAndroid Build Coastguard Worker             // UUUUVVVV
1043*35ffd701SAndroid Build Coastguard Worker 
1044*35ffd701SAndroid Build Coastguard Worker             YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
1045*35ffd701SAndroid Build Coastguard Worker             VHeight = GFX_CEIL_DIV(YHeight, 2);
1046*35ffd701SAndroid Build Coastguard Worker 
1047*35ffd701SAndroid Build Coastguard Worker             WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical, 2); // If odd YWidth, pitch bumps-up to fit rounded-up U/V planes.
1048*35ffd701SAndroid Build Coastguard Worker 
1049*35ffd701SAndroid Build Coastguard Worker             Height = YHeight + VHeight;
1050*35ffd701SAndroid Build Coastguard Worker 
1051*35ffd701SAndroid Build Coastguard Worker             // With SURFACE_STATE.XOffset support, the U-V interface has
1052*35ffd701SAndroid Build Coastguard Worker             // much lighter restrictions--which will be naturally met by
1053*35ffd701SAndroid Build Coastguard Worker             // surface pitch restrictions (i.e. dividing an IMC2/4 pitch
1054*35ffd701SAndroid Build Coastguard Worker             // by 2--to get the U/V interface--will always produce a safe
1055*35ffd701SAndroid Build Coastguard Worker             // XOffset value).
1056*35ffd701SAndroid Build Coastguard Worker 
1057*35ffd701SAndroid Build Coastguard Worker             // Not technically UV packed but sizing works out the same
1058*35ffd701SAndroid Build Coastguard Worker             // if the resource is std swizzled
1059*35ffd701SAndroid Build Coastguard Worker             UVPacked                              = true;
1060*35ffd701SAndroid Build Coastguard Worker             pTexInfo->OffsetInfo.Plane.NoOfPlanes = 2;
1061*35ffd701SAndroid Build Coastguard Worker 
1062*35ffd701SAndroid Build Coastguard Worker             break;
1063*35ffd701SAndroid Build Coastguard Worker         }
1064*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV12:
1065*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV21:
1066*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV11:
1067*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P010:
1068*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P012:
1069*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P016:
1070*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P208:
1071*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P216:
1072*35ffd701SAndroid Build Coastguard Worker         {
1073*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1074*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1075*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1076*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1077*35ffd701SAndroid Build Coastguard Worker             // [UV-Packing]
1078*35ffd701SAndroid Build Coastguard Worker             YHeight = GFX_ALIGN(pTexInfo->BaseHeight, __GMM_EVEN_ROW);
1079*35ffd701SAndroid Build Coastguard Worker             if((pTexInfo->Format == GMM_FORMAT_NV12) ||
1080*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_NV21) ||
1081*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P010) ||
1082*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P012) ||
1083*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P016))
1084*35ffd701SAndroid Build Coastguard Worker             {
1085*35ffd701SAndroid Build Coastguard Worker                 VHeight = GFX_CEIL_DIV(YHeight, 2); // U/V plane half of Y
1086*35ffd701SAndroid Build Coastguard Worker                 Height  = YHeight + VHeight;
1087*35ffd701SAndroid Build Coastguard Worker             }
1088*35ffd701SAndroid Build Coastguard Worker             else
1089*35ffd701SAndroid Build Coastguard Worker             {
1090*35ffd701SAndroid Build Coastguard Worker                 VHeight = YHeight; // U/V plane is same as Y
1091*35ffd701SAndroid Build Coastguard Worker                 Height  = YHeight + VHeight;
1092*35ffd701SAndroid Build Coastguard Worker             }
1093*35ffd701SAndroid Build Coastguard Worker 
1094*35ffd701SAndroid Build Coastguard Worker             if((pTexInfo->Format == GMM_FORMAT_NV12) ||
1095*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_NV21) ||
1096*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P010) ||
1097*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P012) ||
1098*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P016) ||
1099*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P208) ||
1100*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P216))
1101*35ffd701SAndroid Build Coastguard Worker             {
1102*35ffd701SAndroid Build Coastguard Worker                 WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical, 2); // If odd YWidth, pitch bumps-up to fit rounded-up U/V planes.
1103*35ffd701SAndroid Build Coastguard Worker             }
1104*35ffd701SAndroid Build Coastguard Worker             else //if(pTexInfo->Format == GMM_FORMAT_NV11)
1105*35ffd701SAndroid Build Coastguard Worker             {
1106*35ffd701SAndroid Build Coastguard Worker                 // Tiling not supported, since YPitch != UVPitch...
1107*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.TiledY  = 0;
1108*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.TiledYf = 0;
1109*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.TiledYs = 0;
1110*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.TiledX  = 0;
1111*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.Linear  = 1;
1112*35ffd701SAndroid Build Coastguard Worker             }
1113*35ffd701SAndroid Build Coastguard Worker 
1114*35ffd701SAndroid Build Coastguard Worker             UVPacked                              = true;
1115*35ffd701SAndroid Build Coastguard Worker             pTexInfo->OffsetInfo.Plane.NoOfPlanes = 2;
1116*35ffd701SAndroid Build Coastguard Worker             break;
1117*35ffd701SAndroid Build Coastguard Worker         }
1118*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_I420: // IYUV & I420: are identical to YV12 except,
1119*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IYUV: // U & V pl.s are reversed.
1120*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_YV12:
1121*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_YVU9:
1122*35ffd701SAndroid Build Coastguard Worker         {
1123*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1124*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1125*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1126*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
1127*35ffd701SAndroid Build Coastguard Worker             // VVVVVV..  <-- V and U planes follow the Y plane, as linear
1128*35ffd701SAndroid Build Coastguard Worker             // ..UUUUUU      arrays--without respect to pitch.
1129*35ffd701SAndroid Build Coastguard Worker 
1130*35ffd701SAndroid Build Coastguard Worker             uint32_t YSize, UVSize, YVSizeRShift;
1131*35ffd701SAndroid Build Coastguard Worker             uint32_t YSizeForUVPurposes, YSizeForUVPurposesDimensionalAlignment;
1132*35ffd701SAndroid Build Coastguard Worker 
1133*35ffd701SAndroid Build Coastguard Worker             YSize = WidthBytesPhysical * YHeight;
1134*35ffd701SAndroid Build Coastguard Worker 
1135*35ffd701SAndroid Build Coastguard Worker             // YVU9 has one U/V pixel for each 4x4 Y block.
1136*35ffd701SAndroid Build Coastguard Worker             // The others have one U/V pixel for each 2x2 Y block.
1137*35ffd701SAndroid Build Coastguard Worker 
1138*35ffd701SAndroid Build Coastguard Worker             // YVU9 has a Y:V size ratio of 16 (4x4 --> 1).
1139*35ffd701SAndroid Build Coastguard Worker             // The others have a ratio of 4 (2x2 --> 1).
1140*35ffd701SAndroid Build Coastguard Worker             YVSizeRShift = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
1141*35ffd701SAndroid Build Coastguard Worker 
1142*35ffd701SAndroid Build Coastguard Worker             // If a Y plane isn't fully-aligned to its Y-->U/V block size, the
1143*35ffd701SAndroid Build Coastguard Worker             // extra/unaligned Y pixels still need corresponding U/V pixels--So
1144*35ffd701SAndroid Build Coastguard Worker             // for the purpose of computing the UVSize, we must consider a
1145*35ffd701SAndroid Build Coastguard Worker             // dimensionally "rounded-up" YSize. (E.g. a 13x5 YVU9 Y plane would
1146*35ffd701SAndroid Build Coastguard Worker             // require 4x2 U/V planes--the same UVSize as a fully-aligned 16x8 Y.)
1147*35ffd701SAndroid Build Coastguard Worker             YSizeForUVPurposesDimensionalAlignment = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
1148*35ffd701SAndroid Build Coastguard Worker             YSizeForUVPurposes =
1149*35ffd701SAndroid Build Coastguard Worker             GFX_ALIGN(WidthBytesPhysical, YSizeForUVPurposesDimensionalAlignment) *
1150*35ffd701SAndroid Build Coastguard Worker             GFX_ALIGN(YHeight, YSizeForUVPurposesDimensionalAlignment);
1151*35ffd701SAndroid Build Coastguard Worker 
1152*35ffd701SAndroid Build Coastguard Worker             UVSize = 2 * // <-- U + V
1153*35ffd701SAndroid Build Coastguard Worker                      (YSizeForUVPurposes >> YVSizeRShift);
1154*35ffd701SAndroid Build Coastguard Worker 
1155*35ffd701SAndroid Build Coastguard Worker             Height = GFX_CEIL_DIV(YSize + UVSize, WidthBytesPhysical);
1156*35ffd701SAndroid Build Coastguard Worker 
1157*35ffd701SAndroid Build Coastguard Worker             // Tiling not supported, since YPitch != UVPitch...
1158*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledY           = 0;
1159*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledYf          = 0;
1160*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledYs          = 0;
1161*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledX           = 0;
1162*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.Linear           = 1;
1163*35ffd701SAndroid Build Coastguard Worker             pTexInfo->OffsetInfo.Plane.NoOfPlanes = 1;
1164*35ffd701SAndroid Build Coastguard Worker             break;
1165*35ffd701SAndroid Build Coastguard Worker         }
1166*35ffd701SAndroid Build Coastguard Worker         default:
1167*35ffd701SAndroid Build Coastguard Worker         {
1168*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Unexpected format");
1169*35ffd701SAndroid Build Coastguard Worker             return GMM_ERROR;
1170*35ffd701SAndroid Build Coastguard Worker         }
1171*35ffd701SAndroid Build Coastguard Worker     }
1172*35ffd701SAndroid Build Coastguard Worker 
1173*35ffd701SAndroid Build Coastguard Worker     // Align Height to even row to avoid hang if HW over-fetch
1174*35ffd701SAndroid Build Coastguard Worker     Height = GFX_ALIGN(Height, __GMM_EVEN_ROW);
1175*35ffd701SAndroid Build Coastguard Worker 
1176*35ffd701SAndroid Build Coastguard Worker     SetTileMode(pTexInfo);
1177*35ffd701SAndroid Build Coastguard Worker 
1178*35ffd701SAndroid Build Coastguard Worker     // MMC is not supported for linear formats.
1179*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.MMC)
1180*35ffd701SAndroid Build Coastguard Worker     {
1181*35ffd701SAndroid Build Coastguard Worker         if(!(pTexInfo->Flags.Info.TiledY || pTexInfo->Flags.Info.TiledYf || pTexInfo->Flags.Info.TiledYs))
1182*35ffd701SAndroid Build Coastguard Worker         {
1183*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.MMC = 0;
1184*35ffd701SAndroid Build Coastguard Worker         }
1185*35ffd701SAndroid Build Coastguard Worker     }
1186*35ffd701SAndroid Build Coastguard Worker 
1187*35ffd701SAndroid Build Coastguard Worker     // Legacy Planar "Linear Video" Restrictions...
1188*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Info.Linear && !pTexInfo->Flags.Wa.NoLegacyPlanarLinearVideoRestrictions)
1189*35ffd701SAndroid Build Coastguard Worker     {
1190*35ffd701SAndroid Build Coastguard Worker         pRestrictions->LockPitchAlignment   = GFX_MAX(pRestrictions->LockPitchAlignment, GMM_BYTES(64));
1191*35ffd701SAndroid Build Coastguard Worker         pRestrictions->MinPitch             = GFX_MAX(pRestrictions->MinPitch, GMM_BYTES(64));
1192*35ffd701SAndroid Build Coastguard Worker         pRestrictions->PitchAlignment       = GFX_MAX(pRestrictions->PitchAlignment, GMM_BYTES(64));
1193*35ffd701SAndroid Build Coastguard Worker         pRestrictions->RenderPitchAlignment = GFX_MAX(pRestrictions->RenderPitchAlignment, GMM_BYTES(64));
1194*35ffd701SAndroid Build Coastguard Worker     }
1195*35ffd701SAndroid Build Coastguard Worker 
1196*35ffd701SAndroid Build Coastguard Worker     // Multiply overall pitch alignment for surfaces whose U/V planes have a
1197*35ffd701SAndroid Build Coastguard Worker     // pitch down-scaled from that of Y--Since the U/V pitches must meet the
1198*35ffd701SAndroid Build Coastguard Worker     // original restriction, the Y pitch must meet a scaled-up multiple.
1199*35ffd701SAndroid Build Coastguard Worker     if((pTexInfo->Format == GMM_FORMAT_I420) ||
1200*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Format == GMM_FORMAT_IYUV) ||
1201*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Format == GMM_FORMAT_NV11) ||
1202*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Format == GMM_FORMAT_YV12) ||
1203*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Format == GMM_FORMAT_YVU9))
1204*35ffd701SAndroid Build Coastguard Worker     {
1205*35ffd701SAndroid Build Coastguard Worker         uint32_t LShift =
1206*35ffd701SAndroid Build Coastguard Worker         (pTexInfo->Format != GMM_FORMAT_YVU9) ?
1207*35ffd701SAndroid Build Coastguard Worker         1 : // UVPitch = 1/2 YPitch
1208*35ffd701SAndroid Build Coastguard Worker         2;  // UVPitch = 1/4 YPitch
1209*35ffd701SAndroid Build Coastguard Worker 
1210*35ffd701SAndroid Build Coastguard Worker         pRestrictions->LockPitchAlignment <<= LShift;
1211*35ffd701SAndroid Build Coastguard Worker         pRestrictions->MinPitch <<= LShift;
1212*35ffd701SAndroid Build Coastguard Worker         pRestrictions->PitchAlignment <<= LShift;
1213*35ffd701SAndroid Build Coastguard Worker         pRestrictions->RenderPitchAlignment <<= LShift;
1214*35ffd701SAndroid Build Coastguard Worker     }
1215*35ffd701SAndroid Build Coastguard Worker 
1216*35ffd701SAndroid Build Coastguard Worker     // For Tiled Planar surfaces, the planes must be tile-boundary aligned.
1217*35ffd701SAndroid Build Coastguard Worker     // Actual alignment is handled in FillPlanarOffsetAddress, but height
1218*35ffd701SAndroid Build Coastguard Worker     // and width must be adjusted for correct size calculation
1219*35ffd701SAndroid Build Coastguard Worker     if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]))
1220*35ffd701SAndroid Build Coastguard Worker     {
1221*35ffd701SAndroid Build Coastguard Worker         uint32_t TileHeight = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileHeight;
1222*35ffd701SAndroid Build Coastguard Worker         uint32_t TileWidth  = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileWidth;
1223*35ffd701SAndroid Build Coastguard Worker 
1224*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.Plane.IsTileAlignedPlanes = true;
1225*35ffd701SAndroid Build Coastguard Worker 
1226*35ffd701SAndroid Build Coastguard Worker         Height = GFX_ALIGN(YHeight, TileHeight) + (GFX_ALIGN(VHeight, TileHeight) * (UVPacked ? 1 : 2));
1227*35ffd701SAndroid Build Coastguard Worker 
1228*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Format == GMM_FORMAT_IMC2 || // IMC2, IMC4 needs even tile columns
1229*35ffd701SAndroid Build Coastguard Worker            pTexInfo->Format == GMM_FORMAT_IMC4)
1230*35ffd701SAndroid Build Coastguard Worker         {
1231*35ffd701SAndroid Build Coastguard Worker             // If the UV planes are packed then the surface pitch must be
1232*35ffd701SAndroid Build Coastguard Worker             // padded out so that the tile-aligned UV data will fit.
1233*35ffd701SAndroid Build Coastguard Worker             // This means that an odd Y plane width must be padded out
1234*35ffd701SAndroid Build Coastguard Worker             // with an additional tile. Even widths do not need padding
1235*35ffd701SAndroid Build Coastguard Worker             uint32_t TileCols = GFX_CEIL_DIV(WidthBytesPhysical, TileWidth);
1236*35ffd701SAndroid Build Coastguard Worker             if(TileCols % 2)
1237*35ffd701SAndroid Build Coastguard Worker             {
1238*35ffd701SAndroid Build Coastguard Worker                 WidthBytesPhysical = (TileCols + 1) * TileWidth;
1239*35ffd701SAndroid Build Coastguard Worker             }
1240*35ffd701SAndroid Build Coastguard Worker         }
1241*35ffd701SAndroid Build Coastguard Worker 
1242*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Info.TiledYs || pTexInfo->Flags.Info.TiledYf)
1243*35ffd701SAndroid Build Coastguard Worker         {
1244*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.RedecribedPlanes = true;
1245*35ffd701SAndroid Build Coastguard Worker         }
1246*35ffd701SAndroid Build Coastguard Worker     }
1247*35ffd701SAndroid Build Coastguard Worker 
1248*35ffd701SAndroid Build Coastguard Worker     //Special case LKF MMC compressed surfaces
1249*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.MMC &&
1250*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Gpu.UnifiedAuxSurface &&
1251*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Info.TiledY)
1252*35ffd701SAndroid Build Coastguard Worker     {
1253*35ffd701SAndroid Build Coastguard Worker         uint32_t TileHeight = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileHeight;
1254*35ffd701SAndroid Build Coastguard Worker 
1255*35ffd701SAndroid Build Coastguard Worker         Height = GFX_ALIGN(YHeight, TileHeight) + GFX_ALIGN(VHeight, TileHeight);
1256*35ffd701SAndroid Build Coastguard Worker     }
1257*35ffd701SAndroid Build Coastguard Worker 
1258*35ffd701SAndroid Build Coastguard Worker     // Vary wide planar tiled planar formats do not support MMC pre gen11. All formats do not support
1259*35ffd701SAndroid Build Coastguard Worker     // MMC above 16k bytes wide, while Yf NV12 does not support above 8k - 128 bytes.
1260*35ffd701SAndroid Build Coastguard Worker     if((GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) <= IGFX_GEN10_CORE) &&
1261*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Flags.Info.TiledY || pTexInfo->Flags.Info.TiledYf || pTexInfo->Flags.Info.TiledYs))
1262*35ffd701SAndroid Build Coastguard Worker     {
1263*35ffd701SAndroid Build Coastguard Worker         if(((pTexInfo->BaseWidth * pTexInfo->BitsPerPixel / 8) >= GMM_KBYTE(16)) ||
1264*35ffd701SAndroid Build Coastguard Worker            (pTexInfo->Format == GMM_FORMAT_NV12 && pTexInfo->Flags.Info.TiledYf &&
1265*35ffd701SAndroid Build Coastguard Worker             (pTexInfo->BaseWidth * pTexInfo->BitsPerPixel / 8) >= (GMM_KBYTE(8) - 128)))
1266*35ffd701SAndroid Build Coastguard Worker         {
1267*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.MMC = 0;
1268*35ffd701SAndroid Build Coastguard Worker         }
1269*35ffd701SAndroid Build Coastguard Worker     }
1270*35ffd701SAndroid Build Coastguard Worker 
1271*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Info.RedecribedPlanes)
1272*35ffd701SAndroid Build Coastguard Worker     {
1273*35ffd701SAndroid Build Coastguard Worker         if(false == RedescribeTexturePlanes(pTexInfo, &WidthBytesPhysical))
1274*35ffd701SAndroid Build Coastguard Worker         {
1275*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(false);
1276*35ffd701SAndroid Build Coastguard Worker         }
1277*35ffd701SAndroid Build Coastguard Worker     }
1278*35ffd701SAndroid Build Coastguard Worker 
1279*35ffd701SAndroid Build Coastguard Worker     if((Status = // <-- Note assignment.
1280*35ffd701SAndroid Build Coastguard Worker         FillTexPitchAndSize(
1281*35ffd701SAndroid Build Coastguard Worker         pTexInfo, WidthBytesPhysical, Height, pRestrictions)) == GMM_SUCCESS)
1282*35ffd701SAndroid Build Coastguard Worker     {
1283*35ffd701SAndroid Build Coastguard Worker         FillPlanarOffsetAddress(pTexInfo);
1284*35ffd701SAndroid Build Coastguard Worker     }
1285*35ffd701SAndroid Build Coastguard Worker 
1286*35ffd701SAndroid Build Coastguard Worker     // Planar & hybrid 2D arrays supported in DX11.1+ spec but not HW. Memory layout
1287*35ffd701SAndroid Build Coastguard Worker     // is defined by SW requirements; Y plane must be 4KB aligned.
1288*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->ArraySize > 1)
1289*35ffd701SAndroid Build Coastguard Worker     {
1290*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_SIZE_T ElementSizeBytes = pTexInfo->Size;
1291*35ffd701SAndroid Build Coastguard Worker         int64_t        LargeSize;
1292*35ffd701SAndroid Build Coastguard Worker 
1293*35ffd701SAndroid Build Coastguard Worker         // Size should always be page aligned.
1294*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT((pTexInfo->Size % PAGE_SIZE) == 0);
1295*35ffd701SAndroid Build Coastguard Worker 
1296*35ffd701SAndroid Build Coastguard Worker         if((LargeSize = (int64_t)ElementSizeBytes * pTexInfo->ArraySize) <= pPlatform->SurfaceMaxSize)
1297*35ffd701SAndroid Build Coastguard Worker         {
1298*35ffd701SAndroid Build Coastguard Worker             pTexInfo->OffsetInfo.Plane.ArrayQPitch = ElementSizeBytes;
1299*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Size                         = LargeSize;
1300*35ffd701SAndroid Build Coastguard Worker         }
1301*35ffd701SAndroid Build Coastguard Worker         else
1302*35ffd701SAndroid Build Coastguard Worker         {
1303*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Surface too large!");
1304*35ffd701SAndroid Build Coastguard Worker             Status = GMM_ERROR;
1305*35ffd701SAndroid Build Coastguard Worker         }
1306*35ffd701SAndroid Build Coastguard Worker     }
1307*35ffd701SAndroid Build Coastguard Worker 
1308*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
1309*35ffd701SAndroid Build Coastguard Worker     return (Status);
1310*35ffd701SAndroid Build Coastguard Worker } // FillTexPlanar
1311*35ffd701SAndroid Build Coastguard Worker 
1312*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1313*35ffd701SAndroid Build Coastguard Worker /// This function calculates the size and pitch for the linear buffer based on h/w
1314*35ffd701SAndroid Build Coastguard Worker /// alignment and size restrictions.
1315*35ffd701SAndroid Build Coastguard Worker ///
1316*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to ::GMM_TEXTURE_INFO
1317*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pRestrictions: Reference to surface alignment and size restrictions
1318*35ffd701SAndroid Build Coastguard Worker ///
1319*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
1320*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTexBlockMem(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)1321*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmTextureCalc::FillTexBlockMem(GMM_TEXTURE_INFO * pTexInfo,
1322*35ffd701SAndroid Build Coastguard Worker                                                    __GMM_BUFFER_TYPE *pRestrictions)
1323*35ffd701SAndroid Build Coastguard Worker {
1324*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T WidthBytesPhysical;
1325*35ffd701SAndroid Build Coastguard Worker     uint32_t       BitsPerPixel;
1326*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS     Status;
1327*35ffd701SAndroid Build Coastguard Worker 
1328*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
1329*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pRestrictions, GMM_ERROR);
1330*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pTexInfo->BitsPerPixel == GMM_BITS(8) || (pTexInfo->Flags.Info.AllowVirtualPadding));
1331*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pTexInfo->BaseHeight == 1);
1332*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pTexInfo->Flags.Info.Linear == 1);
1333*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pTexInfo->Flags.Info.TiledW == 0);
1334*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pTexInfo->Flags.Info.TiledX == 0);
1335*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pTexInfo->Flags.Info.TiledY == 0);
1336*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pTexInfo->Flags.Info.TiledYf == 0);
1337*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pTexInfo->Flags.Info.TiledYs == 0);
1338*35ffd701SAndroid Build Coastguard Worker 
1339*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
1340*35ffd701SAndroid Build Coastguard Worker 
1341*35ffd701SAndroid Build Coastguard Worker     // Width interpreted in bytes.
1342*35ffd701SAndroid Build Coastguard Worker     BitsPerPixel       = pTexInfo->BitsPerPixel;
1343*35ffd701SAndroid Build Coastguard Worker     WidthBytesPhysical = pTexInfo->BaseWidth * BitsPerPixel >> 3;
1344*35ffd701SAndroid Build Coastguard Worker 
1345*35ffd701SAndroid Build Coastguard Worker     Status = GMM_SUCCESS;
1346*35ffd701SAndroid Build Coastguard Worker 
1347*35ffd701SAndroid Build Coastguard Worker     // Clients can allocate Buffers and Structured Buffers by specifying either
1348*35ffd701SAndroid Build Coastguard Worker     // total size (in BaseWidth) or as an array of structs with the ArraySize
1349*35ffd701SAndroid Build Coastguard Worker     // and BaseWidth parameters (where BaseWidth = size of the arrayed struct).
1350*35ffd701SAndroid Build Coastguard Worker     if((pTexInfo->Type == RESOURCE_BUFFER) &&
1351*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->ArraySize > 1))
1352*35ffd701SAndroid Build Coastguard Worker     {
1353*35ffd701SAndroid Build Coastguard Worker         uint64_t __WidthBytesPhysical = WidthBytesPhysical;
1354*35ffd701SAndroid Build Coastguard Worker 
1355*35ffd701SAndroid Build Coastguard Worker         __WidthBytesPhysical *= pTexInfo->ArraySize;
1356*35ffd701SAndroid Build Coastguard Worker 
1357*35ffd701SAndroid Build Coastguard Worker         if(__WidthBytesPhysical <= pRestrictions->MaxPitch)
1358*35ffd701SAndroid Build Coastguard Worker         {
1359*35ffd701SAndroid Build Coastguard Worker             WidthBytesPhysical = (GMM_GFX_SIZE_T)__WidthBytesPhysical;
1360*35ffd701SAndroid Build Coastguard Worker         }
1361*35ffd701SAndroid Build Coastguard Worker         else
1362*35ffd701SAndroid Build Coastguard Worker         {
1363*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Surface too large!");
1364*35ffd701SAndroid Build Coastguard Worker             Status = GMM_ERROR;
1365*35ffd701SAndroid Build Coastguard Worker         }
1366*35ffd701SAndroid Build Coastguard Worker     }
1367*35ffd701SAndroid Build Coastguard Worker 
1368*35ffd701SAndroid Build Coastguard Worker     if(Status == GMM_SUCCESS)
1369*35ffd701SAndroid Build Coastguard Worker     {
1370*35ffd701SAndroid Build Coastguard Worker         // Make sure minimum width and alignment is met.
1371*35ffd701SAndroid Build Coastguard Worker         WidthBytesPhysical = GFX_MAX(WidthBytesPhysical, pRestrictions->MinPitch);
1372*35ffd701SAndroid Build Coastguard Worker         WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical, pRestrictions->PitchAlignment);
1373*35ffd701SAndroid Build Coastguard Worker 
1374*35ffd701SAndroid Build Coastguard Worker         Status = FillTexPitchAndSize(pTexInfo, WidthBytesPhysical, pTexInfo->BaseHeight, pRestrictions);
1375*35ffd701SAndroid Build Coastguard Worker     }
1376*35ffd701SAndroid Build Coastguard Worker 
1377*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
1378*35ffd701SAndroid Build Coastguard Worker     return (Status);
1379*35ffd701SAndroid Build Coastguard Worker }
1380*35ffd701SAndroid Build Coastguard Worker 
1381*35ffd701SAndroid Build Coastguard Worker 
1382*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1383*35ffd701SAndroid Build Coastguard Worker /// This function does any special-case conversion from client-provided pseudo creation
1384*35ffd701SAndroid Build Coastguard Worker /// parameters to actual parameters for CCS.
1385*35ffd701SAndroid Build Coastguard Worker ///
1386*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to ::GMM_TEXTURE_INFO
1387*35ffd701SAndroid Build Coastguard Worker ///
1388*35ffd701SAndroid Build Coastguard Worker ///  @return     ::GMM_STATUS
1389*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
MSAACCSUsage(GMM_TEXTURE_INFO * pTexInfo)1390*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmTextureCalc::MSAACCSUsage(GMM_TEXTURE_INFO *pTexInfo)
1391*35ffd701SAndroid Build Coastguard Worker {
1392*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS Status = GMM_SUCCESS;
1393*35ffd701SAndroid Build Coastguard Worker     //const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo);
1394*35ffd701SAndroid Build Coastguard Worker 
1395*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->MSAA.NumSamples > 1) // CCS for MSAA Compression
1396*35ffd701SAndroid Build Coastguard Worker     {
1397*35ffd701SAndroid Build Coastguard Worker         Status = MSAACompression(pTexInfo);
1398*35ffd701SAndroid Build Coastguard Worker     }
1399*35ffd701SAndroid Build Coastguard Worker     else // Non-MSAA CCS Use (i.e. Render Target Fast Clear)
1400*35ffd701SAndroid Build Coastguard Worker     {
1401*35ffd701SAndroid Build Coastguard Worker         if(!pTexInfo->Flags.Info.TiledW &&
1402*35ffd701SAndroid Build Coastguard Worker            ((!pTexInfo->Flags.Info.Linear) ||
1403*35ffd701SAndroid Build Coastguard Worker             (GMM_IS_4KB_TILE(pTexInfo->Flags) || GMM_IS_64KB_TILE(pTexInfo->Flags) ||
1404*35ffd701SAndroid Build Coastguard Worker              (pTexInfo->Type == RESOURCE_BUFFER && pTexInfo->Flags.Info.Linear))) && //!Yf - deprecate Yf
1405*35ffd701SAndroid Build Coastguard Worker            ((pTexInfo->MaxLod == 0) &&
1406*35ffd701SAndroid Build Coastguard Worker             (pTexInfo->ArraySize <= 1)) &&
1407*35ffd701SAndroid Build Coastguard Worker            (((pTexInfo->BitsPerPixel == 32) ||
1408*35ffd701SAndroid Build Coastguard Worker              (pTexInfo->BitsPerPixel == 64) ||
1409*35ffd701SAndroid Build Coastguard Worker              (pTexInfo->BitsPerPixel == 128))))
1410*35ffd701SAndroid Build Coastguard Worker         {
1411*35ffd701SAndroid Build Coastguard Worker             // For non-MSAA CCS usage, the four tables of
1412*35ffd701SAndroid Build Coastguard Worker             // requirements:
1413*35ffd701SAndroid Build Coastguard Worker             // (1) RT Alignment (GMM Don't Care: Occurs Naturally)
1414*35ffd701SAndroid Build Coastguard Worker             // (2) ClearRect Alignment
1415*35ffd701SAndroid Build Coastguard Worker             // (3) ClearRect Scaling (GMM Don't Care: GHAL3D Matter)
1416*35ffd701SAndroid Build Coastguard Worker             // (4) Non-MSAA CCS Sizing
1417*35ffd701SAndroid Build Coastguard Worker 
1418*35ffd701SAndroid Build Coastguard Worker             // Gen8+:
1419*35ffd701SAndroid Build Coastguard Worker             // Since mip-mapped and arrayed surfaces are supported, we
1420*35ffd701SAndroid Build Coastguard Worker             // deal with alignment later at per mip level. Here, we set
1421*35ffd701SAndroid Build Coastguard Worker             // tiling type only. TileX is not supported on Gen9+.
1422*35ffd701SAndroid Build Coastguard Worker             // Pre-Gen8:
1423*35ffd701SAndroid Build Coastguard Worker             // (!) For all the above, there are separate entries for
1424*35ffd701SAndroid Build Coastguard Worker             // 32/64/128bpp--and then deals with PIXEL widths--Here,
1425*35ffd701SAndroid Build Coastguard Worker             // though, we will unify by considering 8bpp table entries
1426*35ffd701SAndroid Build Coastguard Worker             // (unlisted--i.e. do the math)--and deal with BYTE widths.
1427*35ffd701SAndroid Build Coastguard Worker 
1428*35ffd701SAndroid Build Coastguard Worker             // (1) RT Alignment -- The surface width and height don't
1429*35ffd701SAndroid Build Coastguard Worker             // need to be padded to RT CL granularity. On HSW, all tiled
1430*35ffd701SAndroid Build Coastguard Worker             // RT's will have appropriate alignment (given 4KB surface
1431*35ffd701SAndroid Build Coastguard Worker             // base and no mip-map support) and appropriate padding
1432*35ffd701SAndroid Build Coastguard Worker             // (due to tile padding). On BDW+, GMM uses H/VALIGN that
1433*35ffd701SAndroid Build Coastguard Worker             // will guarantee the MCS RT alignment for all subresources.
1434*35ffd701SAndroid Build Coastguard Worker 
1435*35ffd701SAndroid Build Coastguard Worker             // (2) ClearRect Alignment -- I.e. FastClears must be done
1436*35ffd701SAndroid Build Coastguard Worker             // with certain granularity:
1437*35ffd701SAndroid Build Coastguard Worker             //  TileY:  512 Bytes x 128 Lines
1438*35ffd701SAndroid Build Coastguard Worker             //  TileX: 1024 Bytes x  64 Lines
1439*35ffd701SAndroid Build Coastguard Worker             // So a CCS must be sized to match that granularity (though
1440*35ffd701SAndroid Build Coastguard Worker             // the RT itself need not be fully padded to that
1441*35ffd701SAndroid Build Coastguard Worker             // granularity to use FastClear).
1442*35ffd701SAndroid Build Coastguard Worker 
1443*35ffd701SAndroid Build Coastguard Worker             // (4) Non-MSAA CCS Sizing -- CCS sizing is based on the
1444*35ffd701SAndroid Build Coastguard Worker             // size of the FastClear (with granularity padding) for the
1445*35ffd701SAndroid Build Coastguard Worker             // paired RT. CCS's (byte widths and heights) are scaled
1446*35ffd701SAndroid Build Coastguard Worker             // down from their RT's by:
1447*35ffd701SAndroid Build Coastguard Worker             //  TileY: 32 x 32
1448*35ffd701SAndroid Build Coastguard Worker             //  TileX: 64 x 16
1449*35ffd701SAndroid Build Coastguard Worker 
1450*35ffd701SAndroid Build Coastguard Worker             // ### Example #############################################
1451*35ffd701SAndroid Build Coastguard Worker             // RT:         800x600, 32bpp, TileY
1452*35ffd701SAndroid Build Coastguard Worker             // 8bpp:      3200x600
1453*35ffd701SAndroid Build Coastguard Worker             // FastClear: 3584x640 (for TileY FastClear Granularity of 512x128)
1454*35ffd701SAndroid Build Coastguard Worker             // CCS:       112x20 (for TileY RT:CCS Sizing Downscale of 32x32)
1455*35ffd701SAndroid Build Coastguard Worker 
1456*35ffd701SAndroid Build Coastguard Worker             uint32_t AlignmentFactor = pGmmLibContext->GetWaTable().WaDoubleFastClearWidthAlignment ? 2 : 1;
1457*35ffd701SAndroid Build Coastguard Worker 
1458*35ffd701SAndroid Build Coastguard Worker             pTexInfo->BaseWidth    = pTexInfo->BaseWidth * pTexInfo->BitsPerPixel / 8;
1459*35ffd701SAndroid Build Coastguard Worker             pTexInfo->BitsPerPixel = 8;
1460*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Format       = GMM_FORMAT_R8_UINT;
1461*35ffd701SAndroid Build Coastguard Worker 
1462*35ffd701SAndroid Build Coastguard Worker             if(GMM_IS_4KB_TILE(pTexInfo->Flags)) //-------- Fast Clear Granularity
1463*35ffd701SAndroid Build Coastguard Worker             {                                    //                       /--- RT:CCS Sizing Downscale
1464*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->BaseWidth  = GFX_ALIGN(pTexInfo->BaseWidth, 512 * AlignmentFactor) / 32;
1465*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->BaseHeight = GFX_ALIGN(pTexInfo->BaseHeight, 128) / 32;
1466*35ffd701SAndroid Build Coastguard Worker             }
1467*35ffd701SAndroid Build Coastguard Worker             else //if(pTexInfo->Flags.Info.TiledX)
1468*35ffd701SAndroid Build Coastguard Worker             {
1469*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->BaseWidth  = GFX_ALIGN(pTexInfo->BaseWidth, 1024 * AlignmentFactor) / 64;
1470*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->BaseHeight = GFX_ALIGN(pTexInfo->BaseHeight, 64) / 16;
1471*35ffd701SAndroid Build Coastguard Worker             }
1472*35ffd701SAndroid Build Coastguard Worker         }
1473*35ffd701SAndroid Build Coastguard Worker         else
1474*35ffd701SAndroid Build Coastguard Worker         {
1475*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Illegal CCS creation parameters!");
1476*35ffd701SAndroid Build Coastguard Worker             Status = GMM_ERROR;
1477*35ffd701SAndroid Build Coastguard Worker         }
1478*35ffd701SAndroid Build Coastguard Worker     }
1479*35ffd701SAndroid Build Coastguard Worker     return Status;
1480*35ffd701SAndroid Build Coastguard Worker }
1481*35ffd701SAndroid Build Coastguard Worker 
1482*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1483*35ffd701SAndroid Build Coastguard Worker /// This function does any special-case conversion from client-provided pseudo creation
1484*35ffd701SAndroid Build Coastguard Worker /// parameters to actual parameters for CCS for MSAA Compression.
1485*35ffd701SAndroid Build Coastguard Worker ///
1486*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to ::GMM_TEXTURE_INFO
1487*35ffd701SAndroid Build Coastguard Worker ///
1488*35ffd701SAndroid Build Coastguard Worker ///  @return     ::GMM_STATUS
1489*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
MSAACompression(GMM_TEXTURE_INFO * pTexInfo)1490*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmTextureCalc::MSAACompression(GMM_TEXTURE_INFO *pTexInfo)
1491*35ffd701SAndroid Build Coastguard Worker {
1492*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS Status = GMM_SUCCESS;
1493*35ffd701SAndroid Build Coastguard Worker 
1494*35ffd701SAndroid Build Coastguard Worker     if((pTexInfo->MSAA.NumSamples == 2) || (pTexInfo->MSAA.NumSamples == 4))
1495*35ffd701SAndroid Build Coastguard Worker     {
1496*35ffd701SAndroid Build Coastguard Worker         pTexInfo->BitsPerPixel = 8;
1497*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Format       = GMM_FORMAT_R8_UINT;
1498*35ffd701SAndroid Build Coastguard Worker     }
1499*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->MSAA.NumSamples == 8)
1500*35ffd701SAndroid Build Coastguard Worker     {
1501*35ffd701SAndroid Build Coastguard Worker         pTexInfo->BitsPerPixel = 32;
1502*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Format       = GMM_FORMAT_R32_UINT;
1503*35ffd701SAndroid Build Coastguard Worker     }
1504*35ffd701SAndroid Build Coastguard Worker     else //if(pTexInfo->MSAA.NumSamples == 16)
1505*35ffd701SAndroid Build Coastguard Worker     {
1506*35ffd701SAndroid Build Coastguard Worker         pTexInfo->BitsPerPixel = 64;
1507*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Format       = GMM_FORMAT_GENERIC_64BIT;
1508*35ffd701SAndroid Build Coastguard Worker     }
1509*35ffd701SAndroid Build Coastguard Worker 
1510*35ffd701SAndroid Build Coastguard Worker     if((Status = __GmmTexFillHAlignVAlign(pTexInfo, pGmmLibContext)) != GMM_SUCCESS) // Need to get our alignment (matching RT) before overwriting our RT's MSAA setting.
1511*35ffd701SAndroid Build Coastguard Worker     {
1512*35ffd701SAndroid Build Coastguard Worker         return Status;
1513*35ffd701SAndroid Build Coastguard Worker     }
1514*35ffd701SAndroid Build Coastguard Worker     pTexInfo->MSAA.NumSamples         = 1; // CCS itself isn't MSAA'ed.
1515*35ffd701SAndroid Build Coastguard Worker     pTexInfo->Flags.Gpu.__MsaaTileMcs = 1;
1516*35ffd701SAndroid Build Coastguard Worker 
1517*35ffd701SAndroid Build Coastguard Worker     return Status;
1518*35ffd701SAndroid Build Coastguard Worker }
1519*35ffd701SAndroid Build Coastguard Worker 
1520*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1521*35ffd701SAndroid Build Coastguard Worker ///Allocate one memory tile wider than is required for Media Memory Compression
1522*35ffd701SAndroid Build Coastguard Worker ///
1523*35ffd701SAndroid Build Coastguard Worker /// @param[in]  See function definition.
1524*35ffd701SAndroid Build Coastguard Worker ///
1525*35ffd701SAndroid Build Coastguard Worker /// @return     ::
1526*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
AllocateOneTileThanRequied(GMM_TEXTURE_INFO * pTexInfo,GMM_GFX_SIZE_T & WidthBytesRender,GMM_GFX_SIZE_T & WidthBytesPhysical,GMM_GFX_SIZE_T & WidthBytesLock)1527*35ffd701SAndroid Build Coastguard Worker void GMM_STDCALL GmmLib::GmmTextureCalc::AllocateOneTileThanRequied(GMM_TEXTURE_INFO *pTexInfo,
1528*35ffd701SAndroid Build Coastguard Worker                                                                     GMM_GFX_SIZE_T &  WidthBytesRender,
1529*35ffd701SAndroid Build Coastguard Worker                                                                     GMM_GFX_SIZE_T &  WidthBytesPhysical,
1530*35ffd701SAndroid Build Coastguard Worker                                                                     GMM_GFX_SIZE_T &  WidthBytesLock)
1531*35ffd701SAndroid Build Coastguard Worker {
1532*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
1533*35ffd701SAndroid Build Coastguard Worker 
1534*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.MMC && !pTexInfo->Flags.Gpu.UnifiedAuxSurface)
1535*35ffd701SAndroid Build Coastguard Worker     {
1536*35ffd701SAndroid Build Coastguard Worker         WidthBytesRender += pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth;
1537*35ffd701SAndroid Build Coastguard Worker         WidthBytesPhysical = WidthBytesLock = WidthBytesRender;
1538*35ffd701SAndroid Build Coastguard Worker     }
1539*35ffd701SAndroid Build Coastguard Worker }
1540