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