xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/Texture/GmmTextureSpecialCases.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 function does any special-case conversion from client-provided pseudo creation
27*35ffd701SAndroid Build Coastguard Worker /// parameters to actual parameters for Hiz, CCS, SeparateStencil and Depth buffers.
28*35ffd701SAndroid Build Coastguard Worker ///
29*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to ::GMM_TEXTURE_INFO
30*35ffd701SAndroid Build Coastguard Worker ///
31*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
PreProcessTexSpecialCases(GMM_TEXTURE_INFO * pTexInfo)32*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmTextureCalc::PreProcessTexSpecialCases(GMM_TEXTURE_INFO *pTexInfo)
33*35ffd701SAndroid Build Coastguard Worker {
34*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS               Status    = GMM_SUCCESS;
35*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
36*35ffd701SAndroid Build Coastguard Worker 
37*35ffd701SAndroid Build Coastguard Worker     if(!pTexInfo->Flags.Gpu.CCS &&
38*35ffd701SAndroid Build Coastguard Worker        !pTexInfo->Flags.Gpu.MCS &&
39*35ffd701SAndroid Build Coastguard Worker        !pTexInfo->Flags.Gpu.HiZ &&
40*35ffd701SAndroid Build Coastguard Worker        !pTexInfo->Flags.Gpu.SeparateStencil &&
41*35ffd701SAndroid Build Coastguard Worker        !pTexInfo->Flags.Gpu.MMC)
42*35ffd701SAndroid Build Coastguard Worker     {
43*35ffd701SAndroid Build Coastguard Worker         // Fast-out for non-special-cases.
44*35ffd701SAndroid Build Coastguard Worker     }
45*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Gpu.HiZ) // ######################################
46*35ffd701SAndroid Build Coastguard Worker     {
47*35ffd701SAndroid Build Coastguard Worker         // With HiZ surface creation, clients send the size/etc. parameters of
48*35ffd701SAndroid Build Coastguard Worker         // the associated Depth Buffer--and here we convert to the appropriate
49*35ffd701SAndroid Build Coastguard Worker         // HiZ creation parameters...
50*35ffd701SAndroid Build Coastguard Worker 
51*35ffd701SAndroid Build Coastguard Worker         if((pTexInfo->BaseWidth > 0) &&
52*35ffd701SAndroid Build Coastguard Worker            (pTexInfo->BaseWidth <= pPlatform->HiZ.MaxWidth) &&
53*35ffd701SAndroid Build Coastguard Worker            (pTexInfo->BaseHeight > 0) &&
54*35ffd701SAndroid Build Coastguard Worker            (pTexInfo->BaseHeight <= pPlatform->HiZ.MaxHeight) &&
55*35ffd701SAndroid Build Coastguard Worker            (pTexInfo->Depth <= ((pTexInfo->Type == RESOURCE_3D) ?
56*35ffd701SAndroid Build Coastguard Worker                                 pPlatform->HiZ.MaxDepth :
57*35ffd701SAndroid Build Coastguard Worker                                 1)) &&
58*35ffd701SAndroid Build Coastguard Worker            (pTexInfo->ArraySize <= ((pTexInfo->Type == RESOURCE_3D) ?
59*35ffd701SAndroid Build Coastguard Worker                                     1 :
60*35ffd701SAndroid Build Coastguard Worker                                     (pTexInfo->Type == RESOURCE_CUBE) ?
61*35ffd701SAndroid Build Coastguard Worker                                     pPlatform->HiZ.MaxArraySize / 6 :
62*35ffd701SAndroid Build Coastguard Worker                                     pPlatform->HiZ.MaxArraySize)) &&
63*35ffd701SAndroid Build Coastguard Worker            // SKL+ does not support HiZ surfaces for 1D and 3D surfaces
64*35ffd701SAndroid Build Coastguard Worker            ((GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) < IGFX_GEN9_CORE) ||
65*35ffd701SAndroid Build Coastguard Worker             (pTexInfo->Type != RESOURCE_1D && pTexInfo->Type != RESOURCE_3D)))
66*35ffd701SAndroid Build Coastguard Worker         {
67*35ffd701SAndroid Build Coastguard Worker             uint32_t Z_Width, Z_Height, Z_Depth;
68*35ffd701SAndroid Build Coastguard Worker 
69*35ffd701SAndroid Build Coastguard Worker             // Latch Z_[Width/Height/Depth]...
70*35ffd701SAndroid Build Coastguard Worker             Z_Width  = GFX_ULONG_CAST(pTexInfo->BaseWidth);
71*35ffd701SAndroid Build Coastguard Worker             Z_Height = pTexInfo->BaseHeight;
72*35ffd701SAndroid Build Coastguard Worker             if((pTexInfo->Type == RESOURCE_1D) ||
73*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Type == RESOURCE_2D))
74*35ffd701SAndroid Build Coastguard Worker             {
75*35ffd701SAndroid Build Coastguard Worker                 Z_Depth = GFX_MAX(pTexInfo->ArraySize, 1);
76*35ffd701SAndroid Build Coastguard Worker             }
77*35ffd701SAndroid Build Coastguard Worker             else if(pTexInfo->Type == RESOURCE_3D)
78*35ffd701SAndroid Build Coastguard Worker             {
79*35ffd701SAndroid Build Coastguard Worker                 Z_Depth = pTexInfo->Depth;
80*35ffd701SAndroid Build Coastguard Worker             }
81*35ffd701SAndroid Build Coastguard Worker             else if(pTexInfo->Type == RESOURCE_CUBE)
82*35ffd701SAndroid Build Coastguard Worker             {
83*35ffd701SAndroid Build Coastguard Worker                 // HW doesn't allow HiZ cube arrays, but GMM is allowing because
84*35ffd701SAndroid Build Coastguard Worker                 // clients will redescribe depth/HiZ cube arrays as 2D arrays.
85*35ffd701SAndroid Build Coastguard Worker                 Z_Depth = 6 * GFX_MAX(pTexInfo->ArraySize, 1);
86*35ffd701SAndroid Build Coastguard Worker             }
87*35ffd701SAndroid Build Coastguard Worker             else
88*35ffd701SAndroid Build Coastguard Worker             {
89*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(0); // Illegal--Should have caught at upper IF check.
90*35ffd701SAndroid Build Coastguard Worker                 Z_Depth = 0;
91*35ffd701SAndroid Build Coastguard Worker             }
92*35ffd701SAndroid Build Coastguard Worker 
93*35ffd701SAndroid Build Coastguard Worker             // HZ_[Width/Height/QPitch] Calculation...
94*35ffd701SAndroid Build Coastguard Worker             {
95*35ffd701SAndroid Build Coastguard Worker                 uint32_t h0, h1, hL, i, NumSamples, QPitch, Z_HeightL;
96*35ffd701SAndroid Build Coastguard Worker                 uint32_t HZ_HAlign = 16, HZ_VAlign = 8;
97*35ffd701SAndroid Build Coastguard Worker                 uint8_t  HZ_DepthRows = pPlatform->HiZPixelsPerByte;
98*35ffd701SAndroid Build Coastguard Worker 
99*35ffd701SAndroid Build Coastguard Worker                 // HZ operates in pixel space starting from SKL. So, it does not care
100*35ffd701SAndroid Build Coastguard Worker                 // whether the depth buffer is in MSAA mode or not.
101*35ffd701SAndroid Build Coastguard Worker                 NumSamples =
102*35ffd701SAndroid Build Coastguard Worker                 (GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN9_CORE) ?
103*35ffd701SAndroid Build Coastguard Worker                 1 :
104*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->MSAA.NumSamples;
105*35ffd701SAndroid Build Coastguard Worker 
106*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->BaseWidth = ExpandWidth(Z_Width, HZ_HAlign, NumSamples);
107*35ffd701SAndroid Build Coastguard Worker 
108*35ffd701SAndroid Build Coastguard Worker                 h0 = ExpandHeight(Z_Height, HZ_VAlign, NumSamples);
109*35ffd701SAndroid Build Coastguard Worker 
110*35ffd701SAndroid Build Coastguard Worker                 Z_Height = GmmTexGetMipHeight(pTexInfo, 1);
111*35ffd701SAndroid Build Coastguard Worker                 h1       = ExpandHeight(Z_Height, HZ_VAlign, NumSamples);
112*35ffd701SAndroid Build Coastguard Worker 
113*35ffd701SAndroid Build Coastguard Worker                 if(GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN8_CORE)
114*35ffd701SAndroid Build Coastguard Worker                 {
115*35ffd701SAndroid Build Coastguard Worker                     if(pTexInfo->Type == RESOURCE_3D)
116*35ffd701SAndroid Build Coastguard Worker                     {
117*35ffd701SAndroid Build Coastguard Worker                         for(i = 0, Z_HeightL = 0; i <= pTexInfo->MaxLod; i++)
118*35ffd701SAndroid Build Coastguard Worker                         {
119*35ffd701SAndroid Build Coastguard Worker                             Z_Height = GmmTexGetMipHeight(pTexInfo, i);
120*35ffd701SAndroid Build Coastguard Worker                             hL       = ExpandHeight(Z_Height, HZ_VAlign, NumSamples);
121*35ffd701SAndroid Build Coastguard Worker                             Z_HeightL += (hL * GFX_MAX(1, (Z_Depth / GFX_2_TO_POWER_OF(i))));
122*35ffd701SAndroid Build Coastguard Worker                         }
123*35ffd701SAndroid Build Coastguard Worker 
124*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->ArraySize  = 0;
125*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->BaseHeight = Z_HeightL / 2;
126*35ffd701SAndroid Build Coastguard Worker                     }
127*35ffd701SAndroid Build Coastguard Worker                     else
128*35ffd701SAndroid Build Coastguard Worker                     {
129*35ffd701SAndroid Build Coastguard Worker                         for(i = 2, Z_HeightL = 0; i <= pTexInfo->MaxLod; i++)
130*35ffd701SAndroid Build Coastguard Worker                         {
131*35ffd701SAndroid Build Coastguard Worker                             Z_Height = GmmTexGetMipHeight(pTexInfo, i);
132*35ffd701SAndroid Build Coastguard Worker                             Z_HeightL += ExpandHeight(Z_Height, HZ_VAlign, NumSamples);
133*35ffd701SAndroid Build Coastguard Worker                         }
134*35ffd701SAndroid Build Coastguard Worker 
135*35ffd701SAndroid Build Coastguard Worker                         QPitch =
136*35ffd701SAndroid Build Coastguard Worker                         (pTexInfo->MaxLod > 0) ?
137*35ffd701SAndroid Build Coastguard Worker                         (h0 + GFX_MAX(h1, Z_HeightL)) :
138*35ffd701SAndroid Build Coastguard Worker                         h0;
139*35ffd701SAndroid Build Coastguard Worker                         QPitch /= HZ_DepthRows;
140*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->ArraySize  = Z_Depth;
141*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->BaseHeight = QPitch;
142*35ffd701SAndroid Build Coastguard Worker                     }
143*35ffd701SAndroid Build Coastguard Worker 
144*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->Alignment.HAlign = HZ_HAlign;
145*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->Alignment.VAlign = HZ_VAlign / HZ_DepthRows;
146*35ffd701SAndroid Build Coastguard Worker                 }
147*35ffd701SAndroid Build Coastguard Worker                 else //if (GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN7_CORE)
148*35ffd701SAndroid Build Coastguard Worker                 {
149*35ffd701SAndroid Build Coastguard Worker                     if(pTexInfo->Type == RESOURCE_3D)
150*35ffd701SAndroid Build Coastguard Worker                     {
151*35ffd701SAndroid Build Coastguard Worker                         for(i = 0, Z_HeightL = 0; i <= pTexInfo->MaxLod; i++)
152*35ffd701SAndroid Build Coastguard Worker                         {
153*35ffd701SAndroid Build Coastguard Worker                             hL = ExpandHeight(Z_Height >> i, HZ_VAlign, NumSamples);
154*35ffd701SAndroid Build Coastguard Worker                             Z_HeightL += (hL * GFX_MAX(1, (Z_Depth / GFX_2_TO_POWER_OF(i))));
155*35ffd701SAndroid Build Coastguard Worker                         }
156*35ffd701SAndroid Build Coastguard Worker 
157*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->BaseHeight = Z_HeightL / 2;
158*35ffd701SAndroid Build Coastguard Worker                     }
159*35ffd701SAndroid Build Coastguard Worker                     else
160*35ffd701SAndroid Build Coastguard Worker                     {
161*35ffd701SAndroid Build Coastguard Worker                         QPitch = h0 + h1 + 12 * HZ_VAlign;
162*35ffd701SAndroid Build Coastguard Worker 
163*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->BaseHeight = GFX_CEIL_DIV((QPitch * Z_Depth / 2), 8) * 8;
164*35ffd701SAndroid Build Coastguard Worker                     }
165*35ffd701SAndroid Build Coastguard Worker 
166*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->ArraySize = 1;
167*35ffd701SAndroid Build Coastguard Worker                 }
168*35ffd701SAndroid Build Coastguard Worker             }
169*35ffd701SAndroid Build Coastguard Worker 
170*35ffd701SAndroid Build Coastguard Worker             /// Native HZ Params //////////////////////////////////////////////////
171*35ffd701SAndroid Build Coastguard Worker             pTexInfo->BitsPerPixel       = 8;
172*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Depth              = 1;
173*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Format             = GMM_FORMAT_GENERIC_8BIT;
174*35ffd701SAndroid Build Coastguard Worker             pTexInfo->MaxLod             = 0;
175*35ffd701SAndroid Build Coastguard Worker             pTexInfo->MSAA.NumSamples    = 1;
176*35ffd701SAndroid Build Coastguard Worker             pTexInfo->MSAA.SamplePattern = GMM_MSAA_DISABLED;
177*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Type               = RESOURCE_2D;
178*35ffd701SAndroid Build Coastguard Worker 
179*35ffd701SAndroid Build Coastguard Worker             // HiZ Always Tile-Y
180*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.Linear  = 0;
181*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledW  = 0;
182*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledX  = 0;
183*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledYf = 0;
184*35ffd701SAndroid Build Coastguard Worker             GMM_SET_64KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
185*35ffd701SAndroid Build Coastguard Worker             GMM_SET_4KB_TILE(pTexInfo->Flags, 1, pGmmLibContext);
186*35ffd701SAndroid Build Coastguard Worker 
187*35ffd701SAndroid Build Coastguard Worker         }
188*35ffd701SAndroid Build Coastguard Worker         else
189*35ffd701SAndroid Build Coastguard Worker         {
190*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Illegal HiZ creation parameters!");
191*35ffd701SAndroid Build Coastguard Worker             Status = GMM_ERROR;
192*35ffd701SAndroid Build Coastguard Worker         }
193*35ffd701SAndroid Build Coastguard Worker     } // HiZ
194*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Gpu.CCS ||
195*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.MCS) // ######################################
196*35ffd701SAndroid Build Coastguard Worker     {
197*35ffd701SAndroid Build Coastguard Worker         // With CCS surface creation, clients send height, width, depth, etc. of
198*35ffd701SAndroid Build Coastguard Worker         // the associated RenderTarget--and here we convert to the appropriate CCS
199*35ffd701SAndroid Build Coastguard Worker         // creation parameters...
200*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT((!pGmmLibContext->GetSkuTable().FtrTileY ||
201*35ffd701SAndroid Build Coastguard Worker                       (pTexInfo->Flags.Info.Linear + pTexInfo->Flags.Info.TiledW + pTexInfo->Flags.Info.TiledX + pTexInfo->Flags.Info.TiledY)) == 1);
202*35ffd701SAndroid Build Coastguard Worker 
203*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT((pGmmLibContext->GetSkuTable().FtrTileY || (pTexInfo->Flags.Info.Linear + pTexInfo->Flags.Info.Tile4 + pTexInfo->Flags.Info.Tile64)) == 1);
204*35ffd701SAndroid Build Coastguard Worker 
205*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT((pTexInfo->MSAA.NumSamples == 1) || (pTexInfo->MSAA.NumSamples == 2) || (pTexInfo->MSAA.NumSamples == 4) ||
206*35ffd701SAndroid Build Coastguard Worker                      (pTexInfo->MSAA.NumSamples == 8) || (pTexInfo->MSAA.NumSamples == 16));
207*35ffd701SAndroid Build Coastguard Worker 
208*35ffd701SAndroid Build Coastguard Worker         Status = pGmmLibContext->GetTextureCalc()->MSAACCSUsage(pTexInfo);
209*35ffd701SAndroid Build Coastguard Worker 
210*35ffd701SAndroid Build Coastguard Worker         if(!pTexInfo->Flags.Gpu.__NonMsaaLinearCCS)
211*35ffd701SAndroid Build Coastguard Worker         {
212*35ffd701SAndroid Build Coastguard Worker             // CCS Always Tile-Y (Even for Non-MSAA FastClear.)
213*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.Linear  = 0;
214*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledW  = 0;
215*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledX  = 0;
216*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledYf = 0;
217*35ffd701SAndroid Build Coastguard Worker 
218*35ffd701SAndroid Build Coastguard Worker             GMM_SET_64KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
219*35ffd701SAndroid Build Coastguard Worker             GMM_SET_4KB_TILE(pTexInfo->Flags, 1, pGmmLibContext);
220*35ffd701SAndroid Build Coastguard Worker 
221*35ffd701SAndroid Build Coastguard Worker             //Clear compression request in CCS
222*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.RenderCompressed = 0;
223*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.MediaCompressed  = 0;
224*35ffd701SAndroid Build Coastguard Worker         }
225*35ffd701SAndroid Build Coastguard Worker 
226*35ffd701SAndroid Build Coastguard Worker     }                                            // CCS
227*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Gpu.SeparateStencil) // ##########################
228*35ffd701SAndroid Build Coastguard Worker     {
229*35ffd701SAndroid Build Coastguard Worker         // Seperate stencil sizing is based on the associated depth buffer
230*35ffd701SAndroid Build Coastguard Worker         // size, however UMD manages this sizing, and GMM will allocate any
231*35ffd701SAndroid Build Coastguard Worker         // arbitrarily sized stencil. Stencils do have specific tiling
232*35ffd701SAndroid Build Coastguard Worker         // requirements however, which is handled below.
233*35ffd701SAndroid Build Coastguard Worker 
234*35ffd701SAndroid Build Coastguard Worker         if((pTexInfo->BaseWidth > 0) &&
235*35ffd701SAndroid Build Coastguard Worker            (pTexInfo->BaseHeight > 0))
236*35ffd701SAndroid Build Coastguard Worker         {
237*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(pTexInfo->BitsPerPixel == 8);
238*35ffd701SAndroid Build Coastguard Worker 
239*35ffd701SAndroid Build Coastguard Worker             if(GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) < IGFX_GEN7_CORE)
240*35ffd701SAndroid Build Coastguard Worker             {
241*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF((pTexInfo->MaxLod == 0), "Stencil Buffer LOD's not supported!");
242*35ffd701SAndroid Build Coastguard Worker             }
243*35ffd701SAndroid Build Coastguard Worker 
244*35ffd701SAndroid Build Coastguard Worker             if(pGmmLibContext->GetSkuTable().FtrTileY)
245*35ffd701SAndroid Build Coastguard Worker             {
246*35ffd701SAndroid Build Coastguard Worker                 // Separate Stencil Tile-W Gen8-Gen11, otherwise Tile-Y
247*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.Linear  = 0;
248*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.TiledX  = 0;
249*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.TiledYf = 0;
250*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.TiledW  = 0;
251*35ffd701SAndroid Build Coastguard Worker                 GMM_SET_4KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
252*35ffd701SAndroid Build Coastguard Worker                 GMM_SET_64KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
253*35ffd701SAndroid Build Coastguard Worker 
254*35ffd701SAndroid Build Coastguard Worker                 if(GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN8_CORE &&
255*35ffd701SAndroid Build Coastguard Worker                    GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) <= IGFX_GEN11_CORE)
256*35ffd701SAndroid Build Coastguard Worker                 {
257*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->Flags.Info.TiledW = 1;
258*35ffd701SAndroid Build Coastguard Worker                 }
259*35ffd701SAndroid Build Coastguard Worker                 else
260*35ffd701SAndroid Build Coastguard Worker                 {
261*35ffd701SAndroid Build Coastguard Worker                     GMM_SET_4KB_TILE(pTexInfo->Flags, 1, pGmmLibContext);
262*35ffd701SAndroid Build Coastguard Worker                 }
263*35ffd701SAndroid Build Coastguard Worker             }
264*35ffd701SAndroid Build Coastguard Worker             else
265*35ffd701SAndroid Build Coastguard Worker             {
266*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(pTexInfo->Flags.Info.Tile4 + pTexInfo->Flags.Info.Tile64 == 1);
267*35ffd701SAndroid Build Coastguard Worker             }
268*35ffd701SAndroid Build Coastguard Worker         }
269*35ffd701SAndroid Build Coastguard Worker         else
270*35ffd701SAndroid Build Coastguard Worker         {
271*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Illegal Separate Stencil creation parameters!");
272*35ffd701SAndroid Build Coastguard Worker             Status = GMM_ERROR;
273*35ffd701SAndroid Build Coastguard Worker         }
274*35ffd701SAndroid Build Coastguard Worker     } // Separate Stencil
275*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Gpu.MMC && pTexInfo->Flags.Gpu.UnifiedAuxSurface)
276*35ffd701SAndroid Build Coastguard Worker     {
277*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Gpu.__NonMsaaLinearCCS = 1;
278*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Flags.Info.Linear            = 1;
279*35ffd701SAndroid Build Coastguard Worker     }
280*35ffd701SAndroid Build Coastguard Worker 
281*35ffd701SAndroid Build Coastguard Worker     return Status;
282*35ffd701SAndroid Build Coastguard Worker }
283*35ffd701SAndroid Build Coastguard Worker 
284*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
285*35ffd701SAndroid Build Coastguard Worker /// This function performs rough estimate of memory requirement between 4KB Tile vs
286*35ffd701SAndroid Build Coastguard Worker /// 64KB Tile surfaces and if the memory wastage due to padding/alignment exceeds
287*35ffd701SAndroid Build Coastguard Worker /// configured threshold, then optimize to demote the surface to 4KB Tile.
288*35ffd701SAndroid Build Coastguard Worker ///
289*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to ::GMM_TEXTURE_INFO
290*35ffd701SAndroid Build Coastguard Worker ///             returns 1 if optimization to demote to 4KB tile is required otherwise 0
291*35ffd701SAndroid Build Coastguard Worker ///
292*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
SurfaceRequires64KBTileOptimization(GMM_TEXTURE_INFO * pTexInfo)293*35ffd701SAndroid Build Coastguard Worker uint8_t GmmLib::GmmTextureCalc::SurfaceRequires64KBTileOptimization(GMM_TEXTURE_INFO *pTexInfo)
294*35ffd701SAndroid Build Coastguard Worker {
295*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS               Status    = GMM_SUCCESS;
296*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
297*35ffd701SAndroid Build Coastguard Worker     uint32_t                 Size4KbTile, Size64KbTile;
298*35ffd701SAndroid Build Coastguard Worker 
299*35ffd701SAndroid Build Coastguard Worker     // Discard the surface if not eligible for 4KB Tile.
300*35ffd701SAndroid Build Coastguard Worker     // All YUV formats restricted with default Tile64 across clients
301*35ffd701SAndroid Build Coastguard Worker     if((pTexInfo->MSAA.NumSamples > 1) ||
302*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Gpu.TiledResource ||
303*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Gpu.HiZ ||
304*35ffd701SAndroid Build Coastguard Worker        (!pTexInfo->Flags.Info.Tile64))
305*35ffd701SAndroid Build Coastguard Worker     {
306*35ffd701SAndroid Build Coastguard Worker         return 0;
307*35ffd701SAndroid Build Coastguard Worker     }
308*35ffd701SAndroid Build Coastguard Worker 
309*35ffd701SAndroid Build Coastguard Worker     // Calc Surf size for 64KB Tile.
310*35ffd701SAndroid Build Coastguard Worker     // Ignoring the CCS/AuxSurf dimensions since its proportional to main surface size
311*35ffd701SAndroid Build Coastguard Worker     {
312*35ffd701SAndroid Build Coastguard Worker         GMM_TEXTURE_INFO Surf = {};
313*35ffd701SAndroid Build Coastguard Worker         uint32_t         ExpandedArraySize, BitsPerPixel;
314*35ffd701SAndroid Build Coastguard Worker         uint32_t         SliceHeight, SliceWidth, Pitch;
315*35ffd701SAndroid Build Coastguard Worker         uint32_t         BlockHeight = 0;
316*35ffd701SAndroid Build Coastguard Worker         uint32_t         HAlign, VAlign, DAlign, CompressHeight, CompressWidth, CompressDepth;
317*35ffd701SAndroid Build Coastguard Worker 
318*35ffd701SAndroid Build Coastguard Worker         Surf = *pTexInfo;
319*35ffd701SAndroid Build Coastguard Worker 
320*35ffd701SAndroid Build Coastguard Worker         //Get HAlign/VAlign
321*35ffd701SAndroid Build Coastguard Worker         if((Status = __GmmTexFillHAlignVAlign(&Surf, pGmmLibContext)) != GMM_SUCCESS)
322*35ffd701SAndroid Build Coastguard Worker         {
323*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(0);
324*35ffd701SAndroid Build Coastguard Worker             return 0;
325*35ffd701SAndroid Build Coastguard Worker         }
326*35ffd701SAndroid Build Coastguard Worker 
327*35ffd701SAndroid Build Coastguard Worker         HAlign = Surf.Alignment.HAlign;
328*35ffd701SAndroid Build Coastguard Worker         VAlign = Surf.Alignment.VAlign;
329*35ffd701SAndroid Build Coastguard Worker         DAlign = Surf.Alignment.DAlign;
330*35ffd701SAndroid Build Coastguard Worker 
331*35ffd701SAndroid Build Coastguard Worker         // Set Tile Mode
332*35ffd701SAndroid Build Coastguard Worker         SetTileMode(&Surf);
333*35ffd701SAndroid Build Coastguard Worker         BitsPerPixel = Surf.BitsPerPixel;
334*35ffd701SAndroid Build Coastguard Worker 
335*35ffd701SAndroid Build Coastguard Worker         ExpandedArraySize =
336*35ffd701SAndroid Build Coastguard Worker         GFX_MAX(Surf.ArraySize, 1) *
337*35ffd701SAndroid Build Coastguard Worker         ((Surf.Type == RESOURCE_CUBE) ? 6 : 1) *                   // Cubemaps simply 6-element, 2D arrays.
338*35ffd701SAndroid Build Coastguard Worker         ((Surf.Type == RESOURCE_3D) ? GFX_MAX(Surf.Depth, 1) : 1); // 3D's simply 2D arrays for sizing.
339*35ffd701SAndroid Build Coastguard Worker 
340*35ffd701SAndroid Build Coastguard Worker         if(GMM_IS_64KB_TILE(Surf.Flags))
341*35ffd701SAndroid Build Coastguard Worker         {
342*35ffd701SAndroid Build Coastguard Worker             ExpandedArraySize = GFX_CEIL_DIV(ExpandedArraySize, pPlatform->TileInfo[Surf.TileMode].LogicalTileDepth);
343*35ffd701SAndroid Build Coastguard Worker         }
344*35ffd701SAndroid Build Coastguard Worker 
345*35ffd701SAndroid Build Coastguard Worker         // For Mipped Surface, Approx SliceHeight = VAlign(Lod0Height) * Mipped ? 1.5 : 1;
346*35ffd701SAndroid Build Coastguard Worker         SliceHeight = GFX_ALIGN(Surf.BaseHeight, VAlign);
347*35ffd701SAndroid Build Coastguard Worker 
348*35ffd701SAndroid Build Coastguard Worker         if(Surf.MaxLod > 1)
349*35ffd701SAndroid Build Coastguard Worker         {
350*35ffd701SAndroid Build Coastguard Worker             SliceHeight = (GFX_ALIGN(Surf.BaseHeight, VAlign) * 3) / 2;
351*35ffd701SAndroid Build Coastguard Worker         }
352*35ffd701SAndroid Build Coastguard Worker 
353*35ffd701SAndroid Build Coastguard Worker         uint8_t Compress = GmmIsCompressed(pGmmLibContext, Surf.Format);
354*35ffd701SAndroid Build Coastguard Worker         GetCompressionBlockDimensions(Surf.Format, &CompressWidth, &CompressHeight, &CompressDepth);
355*35ffd701SAndroid Build Coastguard Worker 
356*35ffd701SAndroid Build Coastguard Worker 
357*35ffd701SAndroid Build Coastguard Worker         SliceWidth  = __GMM_EXPAND_WIDTH(this, GFX_ULONG_CAST(Surf.BaseWidth), HAlign, &Surf);
358*35ffd701SAndroid Build Coastguard Worker         BlockHeight = SliceHeight * ExpandedArraySize;
359*35ffd701SAndroid Build Coastguard Worker 
360*35ffd701SAndroid Build Coastguard Worker         if(Compress)
361*35ffd701SAndroid Build Coastguard Worker         {
362*35ffd701SAndroid Build Coastguard Worker             SliceWidth  = GFX_CEIL_DIV(SliceWidth, CompressWidth);
363*35ffd701SAndroid Build Coastguard Worker             BlockHeight = GFX_CEIL_DIV(BlockHeight, CompressHeight);
364*35ffd701SAndroid Build Coastguard Worker         }
365*35ffd701SAndroid Build Coastguard Worker 
366*35ffd701SAndroid Build Coastguard Worker         // Default pitch
367*35ffd701SAndroid Build Coastguard Worker         Pitch = SliceWidth * BitsPerPixel >> 3;
368*35ffd701SAndroid Build Coastguard Worker 
369*35ffd701SAndroid Build Coastguard Worker         if(GMM_IS_TILED(pPlatform->TileInfo[Surf.TileMode]))
370*35ffd701SAndroid Build Coastguard Worker         {
371*35ffd701SAndroid Build Coastguard Worker             Pitch       = GFX_ALIGN(Pitch, pPlatform->TileInfo[Surf.TileMode].LogicalTileWidth);
372*35ffd701SAndroid Build Coastguard Worker             BlockHeight = GFX_ALIGN(BlockHeight, pPlatform->TileInfo[Surf.TileMode].LogicalTileHeight);
373*35ffd701SAndroid Build Coastguard Worker         }
374*35ffd701SAndroid Build Coastguard Worker 
375*35ffd701SAndroid Build Coastguard Worker         // Calculate Tile aligned size.
376*35ffd701SAndroid Build Coastguard Worker         Size64KbTile = BlockHeight * Pitch;
377*35ffd701SAndroid Build Coastguard Worker 
378*35ffd701SAndroid Build Coastguard Worker 	if(pTexInfo->Type == RESOURCE_3D && !pTexInfo->Flags.Info.Linear)
379*35ffd701SAndroid Build Coastguard Worker         {
380*35ffd701SAndroid Build Coastguard Worker             Size64KbTile *= pPlatform->TileInfo[Surf.TileMode].LogicalTileDepth;
381*35ffd701SAndroid Build Coastguard Worker         }
382*35ffd701SAndroid Build Coastguard Worker     }
383*35ffd701SAndroid Build Coastguard Worker 
384*35ffd701SAndroid Build Coastguard Worker     // Calc Surf size for 4KB Tile
385*35ffd701SAndroid Build Coastguard Worker     // Ignoring the CCS/AuxSurf dimensions since its proportional to main surface size
386*35ffd701SAndroid Build Coastguard Worker     {
387*35ffd701SAndroid Build Coastguard Worker         GMM_TEXTURE_INFO Surf = {};
388*35ffd701SAndroid Build Coastguard Worker         uint32_t         ExpandedArraySize, BitsPerPixel;
389*35ffd701SAndroid Build Coastguard Worker         uint32_t         SliceHeight, SliceWidth, Pitch;
390*35ffd701SAndroid Build Coastguard Worker         uint32_t         BlockHeight = 0;
391*35ffd701SAndroid Build Coastguard Worker         uint32_t         HAlign, VAlign, DAlign, CompressHeight, CompressWidth, CompressDepth;
392*35ffd701SAndroid Build Coastguard Worker 
393*35ffd701SAndroid Build Coastguard Worker         Surf                   = *pTexInfo;
394*35ffd701SAndroid Build Coastguard Worker         Surf.Flags.Info.Tile4  = 1;
395*35ffd701SAndroid Build Coastguard Worker         Surf.Flags.Info.Tile64 = 0;
396*35ffd701SAndroid Build Coastguard Worker 
397*35ffd701SAndroid Build Coastguard Worker         //Get HAlign/VAlign
398*35ffd701SAndroid Build Coastguard Worker         if((Status = __GmmTexFillHAlignVAlign(&Surf, pGmmLibContext)) != GMM_SUCCESS)
399*35ffd701SAndroid Build Coastguard Worker         {
400*35ffd701SAndroid Build Coastguard Worker             Status = GMM_ERROR;
401*35ffd701SAndroid Build Coastguard Worker             return Status;
402*35ffd701SAndroid Build Coastguard Worker         }
403*35ffd701SAndroid Build Coastguard Worker 
404*35ffd701SAndroid Build Coastguard Worker         HAlign = Surf.Alignment.HAlign;
405*35ffd701SAndroid Build Coastguard Worker         VAlign = Surf.Alignment.VAlign;
406*35ffd701SAndroid Build Coastguard Worker         DAlign = Surf.Alignment.DAlign;
407*35ffd701SAndroid Build Coastguard Worker 
408*35ffd701SAndroid Build Coastguard Worker         // Set Tile Mode
409*35ffd701SAndroid Build Coastguard Worker         SetTileMode(&Surf);
410*35ffd701SAndroid Build Coastguard Worker         BitsPerPixel = Surf.BitsPerPixel;
411*35ffd701SAndroid Build Coastguard Worker 
412*35ffd701SAndroid Build Coastguard Worker         ExpandedArraySize =
413*35ffd701SAndroid Build Coastguard Worker         GFX_MAX(Surf.ArraySize, 1) *
414*35ffd701SAndroid Build Coastguard Worker         ((Surf.Type == RESOURCE_CUBE) ? 6 : 1) *                   // Cubemaps simply 6-element, 2D arrays.
415*35ffd701SAndroid Build Coastguard Worker         ((Surf.Type == RESOURCE_3D) ? GFX_MAX(Surf.Depth, 1) : 1); // 3D's simply 2D arrays for sizing.
416*35ffd701SAndroid Build Coastguard Worker 
417*35ffd701SAndroid Build Coastguard Worker         if(GMM_IS_64KB_TILE(Surf.Flags))
418*35ffd701SAndroid Build Coastguard Worker         {
419*35ffd701SAndroid Build Coastguard Worker             ExpandedArraySize = GFX_CEIL_DIV(ExpandedArraySize, pPlatform->TileInfo[Surf.TileMode].LogicalTileDepth);
420*35ffd701SAndroid Build Coastguard Worker         }
421*35ffd701SAndroid Build Coastguard Worker 
422*35ffd701SAndroid Build Coastguard Worker         // For Mipped Surface, Approx SliceHeight = VAlign(Lod0Height) * Mipped ? 1.5 : 1;
423*35ffd701SAndroid Build Coastguard Worker         SliceHeight = GFX_ALIGN(Surf.BaseHeight, VAlign);
424*35ffd701SAndroid Build Coastguard Worker 
425*35ffd701SAndroid Build Coastguard Worker         if(Surf.MaxLod > 1)
426*35ffd701SAndroid Build Coastguard Worker         {
427*35ffd701SAndroid Build Coastguard Worker             SliceHeight = (GFX_ALIGN(Surf.BaseHeight, VAlign) * 3) / 2;
428*35ffd701SAndroid Build Coastguard Worker         }
429*35ffd701SAndroid Build Coastguard Worker 
430*35ffd701SAndroid Build Coastguard Worker         uint8_t Compress = GmmIsCompressed(pGmmLibContext, Surf.Format);
431*35ffd701SAndroid Build Coastguard Worker         GetCompressionBlockDimensions(Surf.Format, &CompressWidth, &CompressHeight, &CompressDepth);
432*35ffd701SAndroid Build Coastguard Worker 
433*35ffd701SAndroid Build Coastguard Worker         SliceWidth  = __GMM_EXPAND_WIDTH(this, GFX_ULONG_CAST(Surf.BaseWidth), HAlign, &Surf);
434*35ffd701SAndroid Build Coastguard Worker         BlockHeight = SliceHeight * ExpandedArraySize;
435*35ffd701SAndroid Build Coastguard Worker 
436*35ffd701SAndroid Build Coastguard Worker         if(Compress)
437*35ffd701SAndroid Build Coastguard Worker         {
438*35ffd701SAndroid Build Coastguard Worker             SliceWidth  = GFX_CEIL_DIV(SliceWidth, CompressWidth);
439*35ffd701SAndroid Build Coastguard Worker             BlockHeight = GFX_CEIL_DIV(BlockHeight, CompressHeight);
440*35ffd701SAndroid Build Coastguard Worker         }
441*35ffd701SAndroid Build Coastguard Worker 
442*35ffd701SAndroid Build Coastguard Worker         // Default pitch
443*35ffd701SAndroid Build Coastguard Worker         Pitch = SliceWidth * BitsPerPixel >> 3;
444*35ffd701SAndroid Build Coastguard Worker 
445*35ffd701SAndroid Build Coastguard Worker         if(GMM_IS_TILED(pPlatform->TileInfo[Surf.TileMode]))
446*35ffd701SAndroid Build Coastguard Worker         {
447*35ffd701SAndroid Build Coastguard Worker             Pitch       = GFX_ALIGN(Pitch, pPlatform->TileInfo[Surf.TileMode].LogicalTileWidth);
448*35ffd701SAndroid Build Coastguard Worker             BlockHeight = GFX_ALIGN(BlockHeight, pPlatform->TileInfo[Surf.TileMode].LogicalTileHeight);
449*35ffd701SAndroid Build Coastguard Worker         }
450*35ffd701SAndroid Build Coastguard Worker 
451*35ffd701SAndroid Build Coastguard Worker         // Calculate Tile aligned size.
452*35ffd701SAndroid Build Coastguard Worker         Size4KbTile = BlockHeight * Pitch;
453*35ffd701SAndroid Build Coastguard Worker     }
454*35ffd701SAndroid Build Coastguard Worker 
455*35ffd701SAndroid Build Coastguard Worker     // check if 64KB tiled resource size exceeds memory wastage threshold.
456*35ffd701SAndroid Build Coastguard Worker     if(((Size4KbTile * (100 + (GMM_GFX_SIZE_T)pGmmLibContext->GetAllowedPaddingFor64KBTileSurf())) / 100) < Size64KbTile)
457*35ffd701SAndroid Build Coastguard Worker     {
458*35ffd701SAndroid Build Coastguard Worker         return 1;
459*35ffd701SAndroid Build Coastguard Worker     }
460*35ffd701SAndroid Build Coastguard Worker 
461*35ffd701SAndroid Build Coastguard Worker     return 0;
462*35ffd701SAndroid Build Coastguard Worker }
463