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 /////////////////////////////////////////////////////////////////////////////////////
27*35ffd701SAndroid Build Coastguard Worker /// Calculates the mip offset of given LOD in 1D mip layout
28*35ffd701SAndroid Build Coastguard Worker ///
29*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
30*35ffd701SAndroid Build Coastguard Worker ///
31*35ffd701SAndroid Build Coastguard Worker /// @return offset value in bytes
32*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Get1DTexOffsetAddressPerMip(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)33*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T GmmLib::GmmGen9TextureCalc::Get1DTexOffsetAddressPerMip(GMM_TEXTURE_INFO *pTexInfo,
34*35ffd701SAndroid Build Coastguard Worker uint32_t MipLevel)
35*35ffd701SAndroid Build Coastguard Worker {
36*35ffd701SAndroid Build Coastguard Worker uint32_t AlignedMipWidth, MipWidth, __MipLevel;
37*35ffd701SAndroid Build Coastguard Worker uint32_t i, HAlign;
38*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T MipOffset = 0;
39*35ffd701SAndroid Build Coastguard Worker uint8_t Compressed;
40*35ffd701SAndroid Build Coastguard Worker uint32_t CompressHeight, CompressWidth, CompressDepth;
41*35ffd701SAndroid Build Coastguard Worker
42*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
43*35ffd701SAndroid Build Coastguard Worker
44*35ffd701SAndroid Build Coastguard Worker HAlign = pTexInfo->Alignment.HAlign;
45*35ffd701SAndroid Build Coastguard Worker MipWidth = GFX_ULONG_CAST(pTexInfo->BaseWidth);
46*35ffd701SAndroid Build Coastguard Worker
47*35ffd701SAndroid Build Coastguard Worker __MipLevel =
48*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) ?
49*35ffd701SAndroid Build Coastguard Worker GFX_MIN(MipLevel, pTexInfo->Alignment.MipTailStartLod) :
50*35ffd701SAndroid Build Coastguard Worker MipLevel;
51*35ffd701SAndroid Build Coastguard Worker
52*35ffd701SAndroid Build Coastguard Worker Compressed = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
53*35ffd701SAndroid Build Coastguard Worker GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
54*35ffd701SAndroid Build Coastguard Worker
55*35ffd701SAndroid Build Coastguard Worker for(i = 1; i <= __MipLevel; i++)
56*35ffd701SAndroid Build Coastguard Worker {
57*35ffd701SAndroid Build Coastguard Worker AlignedMipWidth = __GMM_EXPAND_WIDTH(this, MipWidth, HAlign, pTexInfo);
58*35ffd701SAndroid Build Coastguard Worker
59*35ffd701SAndroid Build Coastguard Worker if(Compressed)
60*35ffd701SAndroid Build Coastguard Worker {
61*35ffd701SAndroid Build Coastguard Worker AlignedMipWidth /= CompressWidth;
62*35ffd701SAndroid Build Coastguard Worker }
63*35ffd701SAndroid Build Coastguard Worker
64*35ffd701SAndroid Build Coastguard Worker MipOffset += AlignedMipWidth;
65*35ffd701SAndroid Build Coastguard Worker
66*35ffd701SAndroid Build Coastguard Worker MipWidth = GFX_ULONG_CAST(GmmTexGetMipWidth(pTexInfo, i));
67*35ffd701SAndroid Build Coastguard Worker }
68*35ffd701SAndroid Build Coastguard Worker
69*35ffd701SAndroid Build Coastguard Worker MipOffset *= (pTexInfo->BitsPerPixel >> 3);
70*35ffd701SAndroid Build Coastguard Worker
71*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) &&
72*35ffd701SAndroid Build Coastguard Worker (MipLevel >= pTexInfo->Alignment.MipTailStartLod))
73*35ffd701SAndroid Build Coastguard Worker {
74*35ffd701SAndroid Build Coastguard Worker MipOffset += GetMipTailByteOffset(pTexInfo, MipLevel);
75*35ffd701SAndroid Build Coastguard Worker }
76*35ffd701SAndroid Build Coastguard Worker
77*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
78*35ffd701SAndroid Build Coastguard Worker
79*35ffd701SAndroid Build Coastguard Worker return (MipOffset);
80*35ffd701SAndroid Build Coastguard Worker }
81*35ffd701SAndroid Build Coastguard Worker
82*35ffd701SAndroid Build Coastguard Worker
83*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
84*35ffd701SAndroid Build Coastguard Worker /// Calculates the address offset for each mip map of 1D texture and store them into
85*35ffd701SAndroid Build Coastguard Worker /// the GMM_TEXTURE_INFO for surf state programming.
86*35ffd701SAndroid Build Coastguard Worker ///
87*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
88*35ffd701SAndroid Build Coastguard Worker ///
89*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Fill1DTexOffsetAddress(GMM_TEXTURE_INFO * pTexInfo)90*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmGen9TextureCalc::Fill1DTexOffsetAddress(GMM_TEXTURE_INFO *pTexInfo)
91*35ffd701SAndroid Build Coastguard Worker {
92*35ffd701SAndroid Build Coastguard Worker uint32_t i;
93*35ffd701SAndroid Build Coastguard Worker
94*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
95*35ffd701SAndroid Build Coastguard Worker
96*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchRender =
97*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchLock =
98*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.QPitch * pTexInfo->BitsPerPixel >> 3;
99*35ffd701SAndroid Build Coastguard Worker
100*35ffd701SAndroid Build Coastguard Worker for(i = 0; i <= pTexInfo->MaxLod; i++)
101*35ffd701SAndroid Build Coastguard Worker {
102*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Texture2DOffsetInfo.Offset[i] = Get1DTexOffsetAddressPerMip(pTexInfo, i);
103*35ffd701SAndroid Build Coastguard Worker }
104*35ffd701SAndroid Build Coastguard Worker
105*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
106*35ffd701SAndroid Build Coastguard Worker }
107*35ffd701SAndroid Build Coastguard Worker
108*35ffd701SAndroid Build Coastguard Worker
109*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
110*35ffd701SAndroid Build Coastguard Worker /// Allocates the 1D mip layout for surface state programming.
111*35ffd701SAndroid Build Coastguard Worker ///
112*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
113*35ffd701SAndroid Build Coastguard Worker /// @param[in] pRestrictions: ptr to surface alignment and size restrictions
114*35ffd701SAndroid Build Coastguard Worker ///
115*35ffd701SAndroid Build Coastguard Worker /// @return ::GMM_STATUS
116*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTex1D(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)117*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen9TextureCalc::FillTex1D(GMM_TEXTURE_INFO * pTexInfo,
118*35ffd701SAndroid Build Coastguard Worker __GMM_BUFFER_TYPE *pRestrictions)
119*35ffd701SAndroid Build Coastguard Worker {
120*35ffd701SAndroid Build Coastguard Worker uint32_t ArraySize, BitsPerPixel, HAlign, i, Width, MipWidth;
121*35ffd701SAndroid Build Coastguard Worker int64_t Size;
122*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status = GMM_SUCCESS;
123*35ffd701SAndroid Build Coastguard Worker uint8_t Compressed;
124*35ffd701SAndroid Build Coastguard Worker uint32_t CompressHeight, CompressWidth, CompressDepth;
125*35ffd701SAndroid Build Coastguard Worker
126*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
127*35ffd701SAndroid Build Coastguard Worker
128*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
129*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pRestrictions, GMM_ERROR);
130*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo->Flags.Info.Linear ||
131*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledYf ||
132*35ffd701SAndroid Build Coastguard Worker GMM_IS_64KB_TILE(pTexInfo->Flags));
133*35ffd701SAndroid Build Coastguard Worker
134*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.Linear = 1;
135*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledW = 0;
136*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledX = 0;
137*35ffd701SAndroid Build Coastguard Worker GMM_SET_4KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
138*35ffd701SAndroid Build Coastguard Worker
139*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
140*35ffd701SAndroid Build Coastguard Worker
141*35ffd701SAndroid Build Coastguard Worker ArraySize = GFX_MAX(pTexInfo->ArraySize, 1);
142*35ffd701SAndroid Build Coastguard Worker BitsPerPixel = pTexInfo->BitsPerPixel;
143*35ffd701SAndroid Build Coastguard Worker HAlign = pTexInfo->Alignment.HAlign;
144*35ffd701SAndroid Build Coastguard Worker
145*35ffd701SAndroid Build Coastguard Worker Compressed = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
146*35ffd701SAndroid Build Coastguard Worker GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
147*35ffd701SAndroid Build Coastguard Worker
148*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags))
149*35ffd701SAndroid Build Coastguard Worker {
150*35ffd701SAndroid Build Coastguard Worker FindMipTailStartLod(pTexInfo);
151*35ffd701SAndroid Build Coastguard Worker }
152*35ffd701SAndroid Build Coastguard Worker
153*35ffd701SAndroid Build Coastguard Worker /////////////////////////////
154*35ffd701SAndroid Build Coastguard Worker // Calculate Surface QPitch
155*35ffd701SAndroid Build Coastguard Worker /////////////////////////////
156*35ffd701SAndroid Build Coastguard Worker
157*35ffd701SAndroid Build Coastguard Worker Width = __GMM_EXPAND_WIDTH(this, GFX_ULONG_CAST(pTexInfo->BaseWidth), HAlign, pTexInfo);
158*35ffd701SAndroid Build Coastguard Worker MipWidth = Width;
159*35ffd701SAndroid Build Coastguard Worker
160*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) &&
161*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Alignment.MipTailStartLod == 0) || (pTexInfo->MaxLod == 0)))
162*35ffd701SAndroid Build Coastguard Worker {
163*35ffd701SAndroid Build Coastguard Worker // Do nothing. Width is already aligned.
164*35ffd701SAndroid Build Coastguard Worker }
165*35ffd701SAndroid Build Coastguard Worker else
166*35ffd701SAndroid Build Coastguard Worker {
167*35ffd701SAndroid Build Coastguard Worker for(i = 1; i <= pTexInfo->MaxLod; i++)
168*35ffd701SAndroid Build Coastguard Worker {
169*35ffd701SAndroid Build Coastguard Worker uint32_t AlignedMipWidth;
170*35ffd701SAndroid Build Coastguard Worker
171*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) &&
172*35ffd701SAndroid Build Coastguard Worker (i == pTexInfo->Alignment.MipTailStartLod))
173*35ffd701SAndroid Build Coastguard Worker {
174*35ffd701SAndroid Build Coastguard Worker Width += pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth;
175*35ffd701SAndroid Build Coastguard Worker break;
176*35ffd701SAndroid Build Coastguard Worker }
177*35ffd701SAndroid Build Coastguard Worker else
178*35ffd701SAndroid Build Coastguard Worker {
179*35ffd701SAndroid Build Coastguard Worker MipWidth = GFX_ULONG_CAST(GmmTexGetMipWidth(pTexInfo, i));
180*35ffd701SAndroid Build Coastguard Worker
181*35ffd701SAndroid Build Coastguard Worker AlignedMipWidth = __GMM_EXPAND_WIDTH(this, MipWidth, HAlign, pTexInfo);
182*35ffd701SAndroid Build Coastguard Worker
183*35ffd701SAndroid Build Coastguard Worker if(Compressed)
184*35ffd701SAndroid Build Coastguard Worker {
185*35ffd701SAndroid Build Coastguard Worker AlignedMipWidth /= CompressWidth;
186*35ffd701SAndroid Build Coastguard Worker }
187*35ffd701SAndroid Build Coastguard Worker
188*35ffd701SAndroid Build Coastguard Worker Width += AlignedMipWidth;
189*35ffd701SAndroid Build Coastguard Worker }
190*35ffd701SAndroid Build Coastguard Worker }
191*35ffd701SAndroid Build Coastguard Worker }
192*35ffd701SAndroid Build Coastguard Worker
193*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.QPitch = GFX_ALIGN((ArraySize > 1) ? Width : 0, HAlign); // in pixels
194*35ffd701SAndroid Build Coastguard Worker
195*35ffd701SAndroid Build Coastguard Worker pTexInfo->Pitch = 0;
196*35ffd701SAndroid Build Coastguard Worker
197*35ffd701SAndroid Build Coastguard Worker ///////////////////////////
198*35ffd701SAndroid Build Coastguard Worker // Calculate Surface Size
199*35ffd701SAndroid Build Coastguard Worker ///////////////////////////
200*35ffd701SAndroid Build Coastguard Worker
201*35ffd701SAndroid Build Coastguard Worker Width *= BitsPerPixel >> 3;
202*35ffd701SAndroid Build Coastguard Worker
203*35ffd701SAndroid Build Coastguard Worker Size = GFX_ALIGN((uint64_t)Width * ArraySize, PAGE_SIZE);
204*35ffd701SAndroid Build Coastguard Worker
205*35ffd701SAndroid Build Coastguard Worker if(Size <= pPlatform->SurfaceMaxSize)
206*35ffd701SAndroid Build Coastguard Worker {
207*35ffd701SAndroid Build Coastguard Worker pTexInfo->Size = Size;
208*35ffd701SAndroid Build Coastguard Worker
209*35ffd701SAndroid Build Coastguard Worker Fill1DTexOffsetAddress(pTexInfo);
210*35ffd701SAndroid Build Coastguard Worker }
211*35ffd701SAndroid Build Coastguard Worker else
212*35ffd701SAndroid Build Coastguard Worker {
213*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Surface too large!");
214*35ffd701SAndroid Build Coastguard Worker Status = GMM_ERROR;
215*35ffd701SAndroid Build Coastguard Worker }
216*35ffd701SAndroid Build Coastguard Worker
217*35ffd701SAndroid Build Coastguard Worker //////////////////////
218*35ffd701SAndroid Build Coastguard Worker // Surface Alignment
219*35ffd701SAndroid Build Coastguard Worker //////////////////////
220*35ffd701SAndroid Build Coastguard Worker
221*35ffd701SAndroid Build Coastguard Worker if(!pTexInfo->Alignment.BaseAlignment || __GMM_IS_ALIGN(pRestrictions->Alignment, pTexInfo->Alignment.BaseAlignment))
222*35ffd701SAndroid Build Coastguard Worker {
223*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.BaseAlignment = pRestrictions->Alignment;
224*35ffd701SAndroid Build Coastguard Worker }
225*35ffd701SAndroid Build Coastguard Worker else if(__GMM_IS_ALIGN(pTexInfo->Alignment.BaseAlignment, pRestrictions->Alignment))
226*35ffd701SAndroid Build Coastguard Worker {
227*35ffd701SAndroid Build Coastguard Worker // Do nothing: pTexInfo->Alignment.BaseAlignment is properly aligned
228*35ffd701SAndroid Build Coastguard Worker }
229*35ffd701SAndroid Build Coastguard Worker else
230*35ffd701SAndroid Build Coastguard Worker {
231*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.BaseAlignment = pTexInfo->Alignment.BaseAlignment * pRestrictions->Alignment;
232*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0,
233*35ffd701SAndroid Build Coastguard Worker "Client requested alignment that is not properly aligned to HW requirements."
234*35ffd701SAndroid Build Coastguard Worker "Alignment is going to be much higher to match both client and HW requirements.\r\n");
235*35ffd701SAndroid Build Coastguard Worker }
236*35ffd701SAndroid Build Coastguard Worker
237*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
238*35ffd701SAndroid Build Coastguard Worker
239*35ffd701SAndroid Build Coastguard Worker return (Status);
240*35ffd701SAndroid Build Coastguard Worker }
241*35ffd701SAndroid Build Coastguard Worker
242*35ffd701SAndroid Build Coastguard Worker
243*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
244*35ffd701SAndroid Build Coastguard Worker /// Calculates height of the 2D mip layout on Gen9
245*35ffd701SAndroid Build Coastguard Worker ///
246*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
247*35ffd701SAndroid Build Coastguard Worker ///
248*35ffd701SAndroid Build Coastguard Worker /// @return height of 2D mip layout
249*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Get2DMipMapHeight(GMM_TEXTURE_INFO * pTexInfo)250*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmGen9TextureCalc::Get2DMipMapHeight(GMM_TEXTURE_INFO *pTexInfo)
251*35ffd701SAndroid Build Coastguard Worker {
252*35ffd701SAndroid Build Coastguard Worker uint32_t BlockHeight, MipHeight;
253*35ffd701SAndroid Build Coastguard Worker uint32_t HeightLinesLevel0, HeightLinesLevel1, HeightLinesLevel2;
254*35ffd701SAndroid Build Coastguard Worker uint32_t i, MipLevel, VAlign, CompressHeight, CompressWidth, CompressDepth;
255*35ffd701SAndroid Build Coastguard Worker uint8_t Compressed;
256*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
257*35ffd701SAndroid Build Coastguard Worker
258*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
259*35ffd701SAndroid Build Coastguard Worker
260*35ffd701SAndroid Build Coastguard Worker Compressed = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
261*35ffd701SAndroid Build Coastguard Worker MipHeight = pTexInfo->BaseHeight;
262*35ffd701SAndroid Build Coastguard Worker MipLevel = pTexInfo->MaxLod;
263*35ffd701SAndroid Build Coastguard Worker VAlign = pTexInfo->Alignment.VAlign;
264*35ffd701SAndroid Build Coastguard Worker GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
265*35ffd701SAndroid Build Coastguard Worker
266*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel0 = __GMM_EXPAND_HEIGHT(this, MipHeight, VAlign, pTexInfo);
267*35ffd701SAndroid Build Coastguard Worker
268*35ffd701SAndroid Build Coastguard Worker if(Compressed)
269*35ffd701SAndroid Build Coastguard Worker {
270*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel0 /= CompressHeight;
271*35ffd701SAndroid Build Coastguard Worker }
272*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.SeparateStencil && pTexInfo->Flags.Info.TiledW)
273*35ffd701SAndroid Build Coastguard Worker {
274*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel0 /= 2;
275*35ffd701SAndroid Build Coastguard Worker }
276*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
277*35ffd701SAndroid Build Coastguard Worker {
278*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel0 /= 16;
279*35ffd701SAndroid Build Coastguard Worker }
280*35ffd701SAndroid Build Coastguard Worker
281*35ffd701SAndroid Build Coastguard Worker // Mip0 height...
282*35ffd701SAndroid Build Coastguard Worker BlockHeight = HeightLinesLevel0;
283*35ffd701SAndroid Build Coastguard Worker
284*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Flags.Info.TiledYf || pTexInfo->Flags.Info.TiledYs) &&
285*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Alignment.MipTailStartLod == 0) || (pTexInfo->MaxLod == 0)))
286*35ffd701SAndroid Build Coastguard Worker {
287*35ffd701SAndroid Build Coastguard Worker // Do nothing. Height is already aligned.
288*35ffd701SAndroid Build Coastguard Worker }
289*35ffd701SAndroid Build Coastguard Worker else
290*35ffd701SAndroid Build Coastguard Worker {
291*35ffd701SAndroid Build Coastguard Worker // Height of Mip1 and Mip2..n needed later...
292*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel1 = HeightLinesLevel2 = 0;
293*35ffd701SAndroid Build Coastguard Worker for(i = 1; i <= MipLevel; i++)
294*35ffd701SAndroid Build Coastguard Worker {
295*35ffd701SAndroid Build Coastguard Worker uint32_t AlignedHeightLines;
296*35ffd701SAndroid Build Coastguard Worker
297*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Flags.Info.TiledYf || pTexInfo->Flags.Info.TiledYs) &&
298*35ffd701SAndroid Build Coastguard Worker (i == pTexInfo->Alignment.MipTailStartLod))
299*35ffd701SAndroid Build Coastguard Worker {
300*35ffd701SAndroid Build Coastguard Worker AlignedHeightLines = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight;
301*35ffd701SAndroid Build Coastguard Worker
302*35ffd701SAndroid Build Coastguard Worker if(i == 1)
303*35ffd701SAndroid Build Coastguard Worker {
304*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel1 = AlignedHeightLines;
305*35ffd701SAndroid Build Coastguard Worker }
306*35ffd701SAndroid Build Coastguard Worker else
307*35ffd701SAndroid Build Coastguard Worker {
308*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel2 += AlignedHeightLines;
309*35ffd701SAndroid Build Coastguard Worker }
310*35ffd701SAndroid Build Coastguard Worker
311*35ffd701SAndroid Build Coastguard Worker break;
312*35ffd701SAndroid Build Coastguard Worker }
313*35ffd701SAndroid Build Coastguard Worker else
314*35ffd701SAndroid Build Coastguard Worker {
315*35ffd701SAndroid Build Coastguard Worker MipHeight = GmmTexGetMipHeight(pTexInfo, i);
316*35ffd701SAndroid Build Coastguard Worker
317*35ffd701SAndroid Build Coastguard Worker AlignedHeightLines = __GMM_EXPAND_HEIGHT(this, MipHeight, VAlign, pTexInfo);
318*35ffd701SAndroid Build Coastguard Worker
319*35ffd701SAndroid Build Coastguard Worker if(Compressed)
320*35ffd701SAndroid Build Coastguard Worker {
321*35ffd701SAndroid Build Coastguard Worker AlignedHeightLines /= CompressHeight;
322*35ffd701SAndroid Build Coastguard Worker }
323*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.SeparateStencil && pTexInfo->Flags.Info.TiledW)
324*35ffd701SAndroid Build Coastguard Worker {
325*35ffd701SAndroid Build Coastguard Worker AlignedHeightLines /= 2;
326*35ffd701SAndroid Build Coastguard Worker }
327*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
328*35ffd701SAndroid Build Coastguard Worker {
329*35ffd701SAndroid Build Coastguard Worker AlignedHeightLines /= 16;
330*35ffd701SAndroid Build Coastguard Worker }
331*35ffd701SAndroid Build Coastguard Worker
332*35ffd701SAndroid Build Coastguard Worker if(i == 1)
333*35ffd701SAndroid Build Coastguard Worker {
334*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel1 = AlignedHeightLines;
335*35ffd701SAndroid Build Coastguard Worker }
336*35ffd701SAndroid Build Coastguard Worker else
337*35ffd701SAndroid Build Coastguard Worker {
338*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel2 += AlignedHeightLines;
339*35ffd701SAndroid Build Coastguard Worker }
340*35ffd701SAndroid Build Coastguard Worker }
341*35ffd701SAndroid Build Coastguard Worker }
342*35ffd701SAndroid Build Coastguard Worker
343*35ffd701SAndroid Build Coastguard Worker // If Mip1 height covers all others, then that is all we need...
344*35ffd701SAndroid Build Coastguard Worker if(!(pTexInfo->Flags.Info.TiledYf || pTexInfo->Flags.Info.TiledYs))
345*35ffd701SAndroid Build Coastguard Worker {
346*35ffd701SAndroid Build Coastguard Worker if(HeightLinesLevel1 >= HeightLinesLevel2)
347*35ffd701SAndroid Build Coastguard Worker {
348*35ffd701SAndroid Build Coastguard Worker BlockHeight += GFX_ALIGN(HeightLinesLevel1, VAlign);
349*35ffd701SAndroid Build Coastguard Worker }
350*35ffd701SAndroid Build Coastguard Worker else
351*35ffd701SAndroid Build Coastguard Worker {
352*35ffd701SAndroid Build Coastguard Worker BlockHeight += GFX_ALIGN(HeightLinesLevel2, VAlign);
353*35ffd701SAndroid Build Coastguard Worker }
354*35ffd701SAndroid Build Coastguard Worker }
355*35ffd701SAndroid Build Coastguard Worker else
356*35ffd701SAndroid Build Coastguard Worker {
357*35ffd701SAndroid Build Coastguard Worker //TR mode- requires TileMode height alignment
358*35ffd701SAndroid Build Coastguard Worker BlockHeight += (HeightLinesLevel1 >= HeightLinesLevel2) ? HeightLinesLevel1 : HeightLinesLevel2;
359*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_ALIGN(BlockHeight, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight);
360*35ffd701SAndroid Build Coastguard Worker }
361*35ffd701SAndroid Build Coastguard Worker }
362*35ffd701SAndroid Build Coastguard Worker
363*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
364*35ffd701SAndroid Build Coastguard Worker
365*35ffd701SAndroid Build Coastguard Worker return (BlockHeight);
366*35ffd701SAndroid Build Coastguard Worker }
367*35ffd701SAndroid Build Coastguard Worker
368*35ffd701SAndroid Build Coastguard Worker
369*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
370*35ffd701SAndroid Build Coastguard Worker /// Calculates total height of an arrayed 2D/3D mip layout
371*35ffd701SAndroid Build Coastguard Worker ///
372*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
373*35ffd701SAndroid Build Coastguard Worker ///
374*35ffd701SAndroid Build Coastguard Worker /// @return height of arrayed 2D/3D mip layout
375*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Get2DMipMapTotalHeight(GMM_TEXTURE_INFO * pTexInfo)376*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmGen9TextureCalc::Get2DMipMapTotalHeight(GMM_TEXTURE_INFO *pTexInfo)
377*35ffd701SAndroid Build Coastguard Worker {
378*35ffd701SAndroid Build Coastguard Worker uint32_t BlockHeight, MipHeight;
379*35ffd701SAndroid Build Coastguard Worker uint32_t HeightLinesLevel0, HeightLinesLevel1, HeightLinesLevel2;
380*35ffd701SAndroid Build Coastguard Worker uint32_t i, MipLevel, VAlign;
381*35ffd701SAndroid Build Coastguard Worker uint32_t AlignedHeightLines;
382*35ffd701SAndroid Build Coastguard Worker
383*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
384*35ffd701SAndroid Build Coastguard Worker
385*35ffd701SAndroid Build Coastguard Worker MipHeight = pTexInfo->BaseHeight;
386*35ffd701SAndroid Build Coastguard Worker MipLevel = pTexInfo->MaxLod;
387*35ffd701SAndroid Build Coastguard Worker VAlign = pTexInfo->Alignment.VAlign;
388*35ffd701SAndroid Build Coastguard Worker
389*35ffd701SAndroid Build Coastguard Worker MipLevel =
390*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) ?
391*35ffd701SAndroid Build Coastguard Worker GFX_MIN(MipLevel, pTexInfo->Alignment.MipTailStartLod) :
392*35ffd701SAndroid Build Coastguard Worker MipLevel;
393*35ffd701SAndroid Build Coastguard Worker
394*35ffd701SAndroid Build Coastguard Worker
395*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel0 = __GMM_EXPAND_HEIGHT(this, MipHeight, VAlign, pTexInfo);
396*35ffd701SAndroid Build Coastguard Worker
397*35ffd701SAndroid Build Coastguard Worker // Mip0 height...
398*35ffd701SAndroid Build Coastguard Worker BlockHeight = HeightLinesLevel0;
399*35ffd701SAndroid Build Coastguard Worker
400*35ffd701SAndroid Build Coastguard Worker // Height of Mip1 and Mip2..n needed later...
401*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel1 = HeightLinesLevel2 = 0;
402*35ffd701SAndroid Build Coastguard Worker for(i = 1; i <= MipLevel; i++)
403*35ffd701SAndroid Build Coastguard Worker {
404*35ffd701SAndroid Build Coastguard Worker MipHeight = GmmTexGetMipHeight(pTexInfo, i);
405*35ffd701SAndroid Build Coastguard Worker
406*35ffd701SAndroid Build Coastguard Worker AlignedHeightLines = __GMM_EXPAND_HEIGHT(this, MipHeight, VAlign, pTexInfo);
407*35ffd701SAndroid Build Coastguard Worker
408*35ffd701SAndroid Build Coastguard Worker if(i == 1)
409*35ffd701SAndroid Build Coastguard Worker {
410*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel1 = AlignedHeightLines;
411*35ffd701SAndroid Build Coastguard Worker }
412*35ffd701SAndroid Build Coastguard Worker else
413*35ffd701SAndroid Build Coastguard Worker {
414*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel2 += AlignedHeightLines;
415*35ffd701SAndroid Build Coastguard Worker }
416*35ffd701SAndroid Build Coastguard Worker }
417*35ffd701SAndroid Build Coastguard Worker
418*35ffd701SAndroid Build Coastguard Worker // If Mip1 height covers all others, then that is all we need...
419*35ffd701SAndroid Build Coastguard Worker if(HeightLinesLevel1 >= HeightLinesLevel2)
420*35ffd701SAndroid Build Coastguard Worker {
421*35ffd701SAndroid Build Coastguard Worker BlockHeight += HeightLinesLevel1;
422*35ffd701SAndroid Build Coastguard Worker }
423*35ffd701SAndroid Build Coastguard Worker else
424*35ffd701SAndroid Build Coastguard Worker {
425*35ffd701SAndroid Build Coastguard Worker BlockHeight += HeightLinesLevel2;
426*35ffd701SAndroid Build Coastguard Worker }
427*35ffd701SAndroid Build Coastguard Worker
428*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
429*35ffd701SAndroid Build Coastguard Worker
430*35ffd701SAndroid Build Coastguard Worker return (BlockHeight);
431*35ffd701SAndroid Build Coastguard Worker }
432*35ffd701SAndroid Build Coastguard Worker
433*35ffd701SAndroid Build Coastguard Worker
434*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
435*35ffd701SAndroid Build Coastguard Worker /// Calculates the mip offset of given LOD in 2D/3D mip layout
436*35ffd701SAndroid Build Coastguard Worker ///
437*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
438*35ffd701SAndroid Build Coastguard Worker ///
439*35ffd701SAndroid Build Coastguard Worker /// @return ::GMM_GFX_SIZE_T offset value in bytes
440*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Get2DTexOffsetAddressPerMip(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)441*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T GmmLib::GmmGen9TextureCalc::Get2DTexOffsetAddressPerMip(GMM_TEXTURE_INFO *pTexInfo,
442*35ffd701SAndroid Build Coastguard Worker uint32_t MipLevel)
443*35ffd701SAndroid Build Coastguard Worker {
444*35ffd701SAndroid Build Coastguard Worker uint32_t AlignedMipHeight, i, OffsetHeight;
445*35ffd701SAndroid Build Coastguard Worker uint8_t Compressed;
446*35ffd701SAndroid Build Coastguard Worker uint32_t HAlign, VAlign, __MipLevel;
447*35ffd701SAndroid Build Coastguard Worker uint32_t CompressHeight, CompressWidth, CompressDepth;
448*35ffd701SAndroid Build Coastguard Worker uint32_t MipHeight;
449*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T MipOffset;
450*35ffd701SAndroid Build Coastguard Worker
451*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
452*35ffd701SAndroid Build Coastguard Worker
453*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
454*35ffd701SAndroid Build Coastguard Worker
455*35ffd701SAndroid Build Coastguard Worker HAlign = pTexInfo->Alignment.HAlign;
456*35ffd701SAndroid Build Coastguard Worker VAlign = pTexInfo->Alignment.VAlign;
457*35ffd701SAndroid Build Coastguard Worker Compressed = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
458*35ffd701SAndroid Build Coastguard Worker
459*35ffd701SAndroid Build Coastguard Worker MipHeight = pTexInfo->BaseHeight;
460*35ffd701SAndroid Build Coastguard Worker OffsetHeight = 0;
461*35ffd701SAndroid Build Coastguard Worker
462*35ffd701SAndroid Build Coastguard Worker GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
463*35ffd701SAndroid Build Coastguard Worker
464*35ffd701SAndroid Build Coastguard Worker __MipLevel =
465*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) ?
466*35ffd701SAndroid Build Coastguard Worker GFX_MIN(MipLevel, pTexInfo->Alignment.MipTailStartLod) :
467*35ffd701SAndroid Build Coastguard Worker MipLevel;
468*35ffd701SAndroid Build Coastguard Worker
469*35ffd701SAndroid Build Coastguard Worker if(__MipLevel < 2) // LOD0 and LOD1 are on the left edge...
470*35ffd701SAndroid Build Coastguard Worker {
471*35ffd701SAndroid Build Coastguard Worker MipOffset = 0;
472*35ffd701SAndroid Build Coastguard Worker }
473*35ffd701SAndroid Build Coastguard Worker else // LOD2 and beyond are to the right of LOD1...
474*35ffd701SAndroid Build Coastguard Worker {
475*35ffd701SAndroid Build Coastguard Worker uint32_t MipWidth = GFX_ULONG_CAST(GmmTexGetMipWidth(pTexInfo, 1));
476*35ffd701SAndroid Build Coastguard Worker uint32_t BitsPerPixel = pTexInfo->BitsPerPixel;
477*35ffd701SAndroid Build Coastguard Worker
478*35ffd701SAndroid Build Coastguard Worker MipWidth = __GMM_EXPAND_WIDTH(this, MipWidth, HAlign, pTexInfo);
479*35ffd701SAndroid Build Coastguard Worker
480*35ffd701SAndroid Build Coastguard Worker if(Compressed)
481*35ffd701SAndroid Build Coastguard Worker {
482*35ffd701SAndroid Build Coastguard Worker MipWidth /= CompressWidth;
483*35ffd701SAndroid Build Coastguard Worker }
484*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.SeparateStencil && pTexInfo->Flags.Info.TiledW)
485*35ffd701SAndroid Build Coastguard Worker {
486*35ffd701SAndroid Build Coastguard Worker //Expt: Stencil Row interleaving, where Rowheight = VALign=8
487*35ffd701SAndroid Build Coastguard Worker //XOffset on interleaved row not different than w/o interleave.
488*35ffd701SAndroid Build Coastguard Worker //MipWidth *= 2;
489*35ffd701SAndroid Build Coastguard Worker }
490*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
491*35ffd701SAndroid Build Coastguard Worker {
492*35ffd701SAndroid Build Coastguard Worker BitsPerPixel = 8; // Aux Surfaces are 8bpp
493*35ffd701SAndroid Build Coastguard Worker
494*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->BitsPerPixel)
495*35ffd701SAndroid Build Coastguard Worker {
496*35ffd701SAndroid Build Coastguard Worker case 32:
497*35ffd701SAndroid Build Coastguard Worker MipWidth /= 8;
498*35ffd701SAndroid Build Coastguard Worker break;
499*35ffd701SAndroid Build Coastguard Worker case 64:
500*35ffd701SAndroid Build Coastguard Worker MipWidth /= 4;
501*35ffd701SAndroid Build Coastguard Worker break;
502*35ffd701SAndroid Build Coastguard Worker case 128:
503*35ffd701SAndroid Build Coastguard Worker MipWidth /= 2;
504*35ffd701SAndroid Build Coastguard Worker break;
505*35ffd701SAndroid Build Coastguard Worker default:
506*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
507*35ffd701SAndroid Build Coastguard Worker }
508*35ffd701SAndroid Build Coastguard Worker }
509*35ffd701SAndroid Build Coastguard Worker
510*35ffd701SAndroid Build Coastguard Worker MipOffset = (GMM_GFX_SIZE_T)MipWidth * BitsPerPixel >> 3;
511*35ffd701SAndroid Build Coastguard Worker }
512*35ffd701SAndroid Build Coastguard Worker
513*35ffd701SAndroid Build Coastguard Worker for(i = 1; i <= __MipLevel; i++)
514*35ffd701SAndroid Build Coastguard Worker {
515*35ffd701SAndroid Build Coastguard Worker AlignedMipHeight = GFX_ULONG_CAST(__GMM_EXPAND_HEIGHT(this, MipHeight, VAlign, pTexInfo));
516*35ffd701SAndroid Build Coastguard Worker
517*35ffd701SAndroid Build Coastguard Worker if(Compressed)
518*35ffd701SAndroid Build Coastguard Worker {
519*35ffd701SAndroid Build Coastguard Worker AlignedMipHeight /= CompressHeight;
520*35ffd701SAndroid Build Coastguard Worker }
521*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.SeparateStencil && pTexInfo->Flags.Info.TiledW)
522*35ffd701SAndroid Build Coastguard Worker {
523*35ffd701SAndroid Build Coastguard Worker AlignedMipHeight /= 2;
524*35ffd701SAndroid Build Coastguard Worker }
525*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
526*35ffd701SAndroid Build Coastguard Worker {
527*35ffd701SAndroid Build Coastguard Worker AlignedMipHeight /= 16;
528*35ffd701SAndroid Build Coastguard Worker }
529*35ffd701SAndroid Build Coastguard Worker
530*35ffd701SAndroid Build Coastguard Worker OffsetHeight += ((i != 2) ? AlignedMipHeight : 0);
531*35ffd701SAndroid Build Coastguard Worker
532*35ffd701SAndroid Build Coastguard Worker MipHeight = GmmTexGetMipHeight(pTexInfo, i);
533*35ffd701SAndroid Build Coastguard Worker }
534*35ffd701SAndroid Build Coastguard Worker OffsetHeight *= GFX_MAX(pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileDepth, 1);
535*35ffd701SAndroid Build Coastguard Worker
536*35ffd701SAndroid Build Coastguard Worker MipOffset += OffsetHeight * GFX_ULONG_CAST(pTexInfo->Pitch);
537*35ffd701SAndroid Build Coastguard Worker
538*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) &&
539*35ffd701SAndroid Build Coastguard Worker (MipLevel >= pTexInfo->Alignment.MipTailStartLod))
540*35ffd701SAndroid Build Coastguard Worker {
541*35ffd701SAndroid Build Coastguard Worker MipOffset += GetMipTailByteOffset(pTexInfo, MipLevel);
542*35ffd701SAndroid Build Coastguard Worker }
543*35ffd701SAndroid Build Coastguard Worker
544*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
545*35ffd701SAndroid Build Coastguard Worker return (MipOffset);
546*35ffd701SAndroid Build Coastguard Worker }
547*35ffd701SAndroid Build Coastguard Worker
548*35ffd701SAndroid Build Coastguard Worker
549*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
550*35ffd701SAndroid Build Coastguard Worker /// Calculates the address offset for each mip map of 2D texture and store them into
551*35ffd701SAndroid Build Coastguard Worker /// the GMM_TEXTURE_INFO for surf state programming.
552*35ffd701SAndroid Build Coastguard Worker ///
553*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
554*35ffd701SAndroid Build Coastguard Worker ///
555*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Fill2DTexOffsetAddress(GMM_TEXTURE_INFO * pTexInfo)556*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmGen9TextureCalc::Fill2DTexOffsetAddress(GMM_TEXTURE_INFO *pTexInfo)
557*35ffd701SAndroid Build Coastguard Worker {
558*35ffd701SAndroid Build Coastguard Worker uint32_t i;
559*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
560*35ffd701SAndroid Build Coastguard Worker
561*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
562*35ffd701SAndroid Build Coastguard Worker
563*35ffd701SAndroid Build Coastguard Worker // QPitch: Array Element-to-Element, or Cube Face-to-Face Pitch...
564*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->ArraySize <= 1) &&
565*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Type != RESOURCE_3D) &&
566*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Type != RESOURCE_CUBE) &&
567*35ffd701SAndroid Build Coastguard Worker !(pTexInfo->Flags.Gpu.ColorSeparation ||
568*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.ColorSeparationRGBX))
569*35ffd701SAndroid Build Coastguard Worker {
570*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchRender =
571*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchLock = 0;
572*35ffd701SAndroid Build Coastguard Worker }
573*35ffd701SAndroid Build Coastguard Worker else
574*35ffd701SAndroid Build Coastguard Worker {
575*35ffd701SAndroid Build Coastguard Worker uint32_t ArrayQPitch, Alignment;
576*35ffd701SAndroid Build Coastguard Worker
577*35ffd701SAndroid Build Coastguard Worker Alignment = pTexInfo->Alignment.VAlign;
578*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Type == RESOURCE_3D && !pTexInfo->Flags.Info.Linear) ||
579*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Gpu.S3dDx && pGmmLibContext->GetSkuTable().FtrDisplayEngineS3d) ||
580*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Wa.MediaPipeUsage))
581*35ffd701SAndroid Build Coastguard Worker {
582*35ffd701SAndroid Build Coastguard Worker Alignment = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight;
583*35ffd701SAndroid Build Coastguard Worker //Gmm uses TileY for Stencil allocations, having half TileW height (TileY width compensates)
584*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.SeparateStencil && pTexInfo->Flags.Info.TiledW)
585*35ffd701SAndroid Build Coastguard Worker {
586*35ffd701SAndroid Build Coastguard Worker Alignment *= 2;
587*35ffd701SAndroid Build Coastguard Worker }
588*35ffd701SAndroid Build Coastguard Worker }
589*35ffd701SAndroid Build Coastguard Worker
590*35ffd701SAndroid Build Coastguard Worker // Calculate the overall Block height...Mip0Height + Max(Mip1Height, Sum of Mip2Height..MipnHeight)
591*35ffd701SAndroid Build Coastguard Worker ArrayQPitch = Get2DMipMapTotalHeight(pTexInfo);
592*35ffd701SAndroid Build Coastguard Worker ArrayQPitch = GFX_ALIGN_NP2(ArrayQPitch, Alignment);
593*35ffd701SAndroid Build Coastguard Worker
594*35ffd701SAndroid Build Coastguard Worker // Color Surf with MSAA Enabled Mutiply 4
595*35ffd701SAndroid Build Coastguard Worker if (GMM_IS_64KB_TILE(pTexInfo->Flags) && (!pGmmLibContext->GetSkuTable().FtrTileY) && (!pGmmLibContext->GetSkuTable().FtrXe2PlusTiling) &&
596*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->MSAA.NumSamples == 8) || (pTexInfo->MSAA.NumSamples == 16)) &&
597*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Flags.Gpu.Depth == 0) && (pTexInfo->Flags.Gpu.SeparateStencil == 0)))
598*35ffd701SAndroid Build Coastguard Worker {
599*35ffd701SAndroid Build Coastguard Worker // ArrayQPitch *= 4; /* Aligned height of 4 samples */
600*35ffd701SAndroid Build Coastguard Worker }
601*35ffd701SAndroid Build Coastguard Worker
602*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.QPitch = ArrayQPitch;
603*35ffd701SAndroid Build Coastguard Worker
604*35ffd701SAndroid Build Coastguard Worker if(GmmIsCompressed(pGmmLibContext, pTexInfo->Format))
605*35ffd701SAndroid Build Coastguard Worker {
606*35ffd701SAndroid Build Coastguard Worker uint32_t CompressWidth, CompressHeight, CompressDepth;
607*35ffd701SAndroid Build Coastguard Worker
608*35ffd701SAndroid Build Coastguard Worker GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
609*35ffd701SAndroid Build Coastguard Worker
610*35ffd701SAndroid Build Coastguard Worker ArrayQPitch /= CompressHeight;
611*35ffd701SAndroid Build Coastguard Worker
612*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Type == RESOURCE_3D) && !pTexInfo->Flags.Info.Linear)
613*35ffd701SAndroid Build Coastguard Worker {
614*35ffd701SAndroid Build Coastguard Worker ArrayQPitch = GFX_ALIGN(ArrayQPitch, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight);
615*35ffd701SAndroid Build Coastguard Worker }
616*35ffd701SAndroid Build Coastguard Worker }
617*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.SeparateStencil && pTexInfo->Flags.Info.TiledW)
618*35ffd701SAndroid Build Coastguard Worker {
619*35ffd701SAndroid Build Coastguard Worker ArrayQPitch /= 2;
620*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Type == RESOURCE_3D && !pTexInfo->Flags.Info.Linear)
621*35ffd701SAndroid Build Coastguard Worker {
622*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.QPitch = ArrayQPitch;
623*35ffd701SAndroid Build Coastguard Worker }
624*35ffd701SAndroid Build Coastguard Worker }
625*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
626*35ffd701SAndroid Build Coastguard Worker {
627*35ffd701SAndroid Build Coastguard Worker ArrayQPitch /= 16;
628*35ffd701SAndroid Build Coastguard Worker }
629*35ffd701SAndroid Build Coastguard Worker
630*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchRender =
631*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchLock = ArrayQPitch * pTexInfo->Pitch;
632*35ffd701SAndroid Build Coastguard Worker }
633*35ffd701SAndroid Build Coastguard Worker
634*35ffd701SAndroid Build Coastguard Worker for(i = 0; i <= pTexInfo->MaxLod; i++)
635*35ffd701SAndroid Build Coastguard Worker {
636*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Texture2DOffsetInfo.Offset[i] = Get2DTexOffsetAddressPerMip(pTexInfo, i);
637*35ffd701SAndroid Build Coastguard Worker }
638*35ffd701SAndroid Build Coastguard Worker
639*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
640*35ffd701SAndroid Build Coastguard Worker }
641*35ffd701SAndroid Build Coastguard Worker
642*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
643*35ffd701SAndroid Build Coastguard Worker /// Returns the aligned block height of the 3D surface on Gen9
644*35ffd701SAndroid Build Coastguard Worker ///
645*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
646*35ffd701SAndroid Build Coastguard Worker /// BlockHeight: Unaligned block height
647*35ffd701SAndroid Build Coastguard Worker /// ExpandedArraySize: adjusted array size for MSAA, cube faces, etc.
648*35ffd701SAndroid Build Coastguard Worker ///
649*35ffd701SAndroid Build Coastguard Worker /// @return Aligned BlockHeight
650*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetAligned3DBlockHeight(GMM_TEXTURE_INFO * pTexInfo,uint32_t BlockHeight,uint32_t ExpandedArraySize)651*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmGen9TextureCalc::GetAligned3DBlockHeight(GMM_TEXTURE_INFO *pTexInfo,
652*35ffd701SAndroid Build Coastguard Worker uint32_t BlockHeight,
653*35ffd701SAndroid Build Coastguard Worker uint32_t ExpandedArraySize)
654*35ffd701SAndroid Build Coastguard Worker {
655*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
656*35ffd701SAndroid Build Coastguard Worker
657*35ffd701SAndroid Build Coastguard Worker GMM_UNREFERENCED_PARAMETER(ExpandedArraySize);
658*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pTexInfo, 0);
659*35ffd701SAndroid Build Coastguard Worker
660*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
661*35ffd701SAndroid Build Coastguard Worker
662*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Type == RESOURCE_3D) && !pTexInfo->Flags.Info.Linear)
663*35ffd701SAndroid Build Coastguard Worker {
664*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_ALIGN(BlockHeight, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight);
665*35ffd701SAndroid Build Coastguard Worker }
666*35ffd701SAndroid Build Coastguard Worker
667*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
668*35ffd701SAndroid Build Coastguard Worker
669*35ffd701SAndroid Build Coastguard Worker return BlockHeight;
670*35ffd701SAndroid Build Coastguard Worker }
671*35ffd701SAndroid Build Coastguard Worker
672*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
673*35ffd701SAndroid Build Coastguard Worker /// Allocates the 2D mip layout for surface state programming.
674*35ffd701SAndroid Build Coastguard Worker ///
675*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
676*35ffd701SAndroid Build Coastguard Worker /// @param[in] pRestrictions: ptr to surface alignment and size restrictions
677*35ffd701SAndroid Build Coastguard Worker ///
678*35ffd701SAndroid Build Coastguard Worker /// @return ::GMM_STATUS
679*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTex2D(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)680*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen9TextureCalc::FillTex2D(GMM_TEXTURE_INFO * pTexInfo,
681*35ffd701SAndroid Build Coastguard Worker __GMM_BUFFER_TYPE *pRestrictions)
682*35ffd701SAndroid Build Coastguard Worker {
683*35ffd701SAndroid Build Coastguard Worker uint32_t Width, Height, BitsPerPixel;
684*35ffd701SAndroid Build Coastguard Worker uint32_t HAlign, VAlign, DAlign, CompressHeight, CompressWidth, CompressDepth;
685*35ffd701SAndroid Build Coastguard Worker uint32_t AlignedWidth, BlockHeight, ExpandedArraySize, Pitch;
686*35ffd701SAndroid Build Coastguard Worker uint8_t Compress = 0;
687*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status;
688*35ffd701SAndroid Build Coastguard Worker
689*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
690*35ffd701SAndroid Build Coastguard Worker
691*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
692*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pRestrictions, GMM_ERROR);
693*35ffd701SAndroid Build Coastguard Worker
694*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
695*35ffd701SAndroid Build Coastguard Worker
696*35ffd701SAndroid Build Coastguard Worker BitsPerPixel = pTexInfo->BitsPerPixel;
697*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
698*35ffd701SAndroid Build Coastguard Worker {
699*35ffd701SAndroid Build Coastguard Worker // Aux Surfaces are 8bpp.
700*35ffd701SAndroid Build Coastguard Worker BitsPerPixel = 8;
701*35ffd701SAndroid Build Coastguard Worker }
702*35ffd701SAndroid Build Coastguard Worker
703*35ffd701SAndroid Build Coastguard Worker Height = pTexInfo->BaseHeight;
704*35ffd701SAndroid Build Coastguard Worker Width = GFX_ULONG_CAST(pTexInfo->BaseWidth);
705*35ffd701SAndroid Build Coastguard Worker
706*35ffd701SAndroid Build Coastguard Worker pTexInfo->MSAA.NumSamples = GFX_MAX(pTexInfo->MSAA.NumSamples, 1);
707*35ffd701SAndroid Build Coastguard Worker
708*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.TiledYf || pTexInfo->Flags.Info.TiledYs)
709*35ffd701SAndroid Build Coastguard Worker {
710*35ffd701SAndroid Build Coastguard Worker FindMipTailStartLod(pTexInfo);
711*35ffd701SAndroid Build Coastguard Worker }
712*35ffd701SAndroid Build Coastguard Worker
713*35ffd701SAndroid Build Coastguard Worker ExpandedArraySize =
714*35ffd701SAndroid Build Coastguard Worker GFX_MAX(pTexInfo->ArraySize, 1) *
715*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Type == RESOURCE_CUBE) ? 6 : 1) * // Cubemaps simply 6-element, 2D arrays.
716*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Type == RESOURCE_3D) ? pTexInfo->Depth : 1) * // 3D's simply 2D arrays.
717*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Flags.Gpu.Depth || pTexInfo->Flags.Gpu.SeparateStencil ||
718*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs || pTexInfo->Flags.Info.TiledYf)) ? // MSAA Ys samples are NOT stored as array planes.
719*35ffd701SAndroid Build Coastguard Worker 1 :
720*35ffd701SAndroid Build Coastguard Worker pTexInfo->MSAA.NumSamples); // MSAA (non-Depth/Stencil) RT samples stored as array planes.
721*35ffd701SAndroid Build Coastguard Worker
722*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.TiledYs || pTexInfo->Flags.Info.TiledYf)
723*35ffd701SAndroid Build Coastguard Worker {
724*35ffd701SAndroid Build Coastguard Worker ExpandedArraySize = GFX_CEIL_DIV(ExpandedArraySize, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileDepth);
725*35ffd701SAndroid Build Coastguard Worker }
726*35ffd701SAndroid Build Coastguard Worker
727*35ffd701SAndroid Build Coastguard Worker //
728*35ffd701SAndroid Build Coastguard Worker // Check for color separation
729*35ffd701SAndroid Build Coastguard Worker //
730*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.ColorSeparation || pTexInfo->Flags.Gpu.ColorSeparationRGBX)
731*35ffd701SAndroid Build Coastguard Worker {
732*35ffd701SAndroid Build Coastguard Worker bool csRestrictionsMet = (((ExpandedArraySize <= 2) &&
733*35ffd701SAndroid Build Coastguard Worker (ExpandedArraySize == pTexInfo->ArraySize) &&
734*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Format == GMM_FORMAT_R8G8B8A8_UNORM) ||
735*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_R8G8B8A8_UNORM_SRGB) ||
736*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_B8G8R8A8_UNORM) ||
737*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_B8G8R8A8_UNORM_SRGB) ||
738*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_B8G8R8X8_UNORM) ||
739*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_B8G8R8X8_UNORM_SRGB)) &&
740*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Flags.Gpu.ColorSeparation && (Width % 16) == 0) ||
741*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Gpu.ColorSeparationRGBX && (Width % 12) == 0))));
742*35ffd701SAndroid Build Coastguard Worker
743*35ffd701SAndroid Build Coastguard Worker if(csRestrictionsMet)
744*35ffd701SAndroid Build Coastguard Worker {
745*35ffd701SAndroid Build Coastguard Worker ExpandedArraySize = GMM_COLOR_SEPARATION_ARRAY_SIZE;
746*35ffd701SAndroid Build Coastguard Worker }
747*35ffd701SAndroid Build Coastguard Worker else
748*35ffd701SAndroid Build Coastguard Worker {
749*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.ColorSeparation = false;
750*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.ColorSeparationRGBX = false;
751*35ffd701SAndroid Build Coastguard Worker }
752*35ffd701SAndroid Build Coastguard Worker }
753*35ffd701SAndroid Build Coastguard Worker
754*35ffd701SAndroid Build Coastguard Worker HAlign = pTexInfo->Alignment.HAlign;
755*35ffd701SAndroid Build Coastguard Worker VAlign = pTexInfo->Alignment.VAlign;
756*35ffd701SAndroid Build Coastguard Worker DAlign = pTexInfo->Alignment.DAlign;
757*35ffd701SAndroid Build Coastguard Worker GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
758*35ffd701SAndroid Build Coastguard Worker
759*35ffd701SAndroid Build Coastguard Worker Compress = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
760*35ffd701SAndroid Build Coastguard Worker
761*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////
762*35ffd701SAndroid Build Coastguard Worker // Calculate Block Surface Height
763*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////
764*35ffd701SAndroid Build Coastguard Worker
765*35ffd701SAndroid Build Coastguard Worker if(ExpandedArraySize > 1)
766*35ffd701SAndroid Build Coastguard Worker {
767*35ffd701SAndroid Build Coastguard Worker uint32_t Alignment = VAlign;
768*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Type == RESOURCE_3D && !pTexInfo->Flags.Info.Linear) ||
769*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Gpu.S3dDx && pGmmLibContext->GetSkuTable().FtrDisplayEngineS3d) ||
770*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Wa.MediaPipeUsage))
771*35ffd701SAndroid Build Coastguard Worker {
772*35ffd701SAndroid Build Coastguard Worker Alignment = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight;
773*35ffd701SAndroid Build Coastguard Worker //Gmm uses TileY for Stencil allocations, having half TileW height (TileY width compensates)
774*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.SeparateStencil && pTexInfo->Flags.Info.TiledW)
775*35ffd701SAndroid Build Coastguard Worker {
776*35ffd701SAndroid Build Coastguard Worker Alignment *= 2;
777*35ffd701SAndroid Build Coastguard Worker }
778*35ffd701SAndroid Build Coastguard Worker }
779*35ffd701SAndroid Build Coastguard Worker
780*35ffd701SAndroid Build Coastguard Worker // Calculate the overall Block height...Mip0Height + Max(Mip1Height, Sum of Mip2Height..MipnHeight)
781*35ffd701SAndroid Build Coastguard Worker BlockHeight = Get2DMipMapTotalHeight(pTexInfo);
782*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_ALIGN_NP2(BlockHeight, Alignment);
783*35ffd701SAndroid Build Coastguard Worker
784*35ffd701SAndroid Build Coastguard Worker // GMM internally uses QPitch as the logical distance between slices, but translates
785*35ffd701SAndroid Build Coastguard Worker // as appropriate to service client queries in GmmResGetQPitch.
786*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.QPitch = BlockHeight;
787*35ffd701SAndroid Build Coastguard Worker
788*35ffd701SAndroid Build Coastguard Worker if(Compress)
789*35ffd701SAndroid Build Coastguard Worker {
790*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_CEIL_DIV(BlockHeight, CompressHeight);
791*35ffd701SAndroid Build Coastguard Worker
792*35ffd701SAndroid Build Coastguard Worker BlockHeight = GetAligned3DBlockHeight(pTexInfo, BlockHeight, ExpandedArraySize);
793*35ffd701SAndroid Build Coastguard Worker }
794*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.SeparateStencil && pTexInfo->Flags.Info.TiledW)
795*35ffd701SAndroid Build Coastguard Worker {
796*35ffd701SAndroid Build Coastguard Worker BlockHeight /= 2;
797*35ffd701SAndroid Build Coastguard Worker }
798*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
799*35ffd701SAndroid Build Coastguard Worker {
800*35ffd701SAndroid Build Coastguard Worker BlockHeight /= 16;
801*35ffd701SAndroid Build Coastguard Worker }
802*35ffd701SAndroid Build Coastguard Worker
803*35ffd701SAndroid Build Coastguard Worker BlockHeight *= ExpandedArraySize;
804*35ffd701SAndroid Build Coastguard Worker }
805*35ffd701SAndroid Build Coastguard Worker else
806*35ffd701SAndroid Build Coastguard Worker {
807*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.QPitch = 0;
808*35ffd701SAndroid Build Coastguard Worker
809*35ffd701SAndroid Build Coastguard Worker BlockHeight = Get2DMipMapHeight(pTexInfo);
810*35ffd701SAndroid Build Coastguard Worker }
811*35ffd701SAndroid Build Coastguard Worker
812*35ffd701SAndroid Build Coastguard Worker ///////////////////////////////////
813*35ffd701SAndroid Build Coastguard Worker // Calculate Pitch
814*35ffd701SAndroid Build Coastguard Worker ///////////////////////////////////
815*35ffd701SAndroid Build Coastguard Worker
816*35ffd701SAndroid Build Coastguard Worker AlignedWidth = __GMM_EXPAND_WIDTH(this, Width, HAlign, pTexInfo);
817*35ffd701SAndroid Build Coastguard Worker
818*35ffd701SAndroid Build Coastguard Worker // Calculate special pitch case of small dimensions where LOD1 + LOD2 widths
819*35ffd701SAndroid Build Coastguard Worker // are greater than LOD0. e.g. dimensions 4x4 and MinPitch == 1
820*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Flags.Info.TiledYf || pTexInfo->Flags.Info.TiledYs) &&
821*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Alignment.MipTailStartLod < 2))
822*35ffd701SAndroid Build Coastguard Worker {
823*35ffd701SAndroid Build Coastguard Worker // Do nothing -- all mips are in LOD0/LOD1, which is already width aligned.
824*35ffd701SAndroid Build Coastguard Worker }
825*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->MaxLod >= 2)
826*35ffd701SAndroid Build Coastguard Worker {
827*35ffd701SAndroid Build Coastguard Worker uint32_t AlignedWidthLod1, AlignedWidthLod2;
828*35ffd701SAndroid Build Coastguard Worker
829*35ffd701SAndroid Build Coastguard Worker AlignedWidthLod1 = __GMM_EXPAND_WIDTH(this, Width >> 1, HAlign, pTexInfo);
830*35ffd701SAndroid Build Coastguard Worker AlignedWidthLod2 = __GMM_EXPAND_WIDTH(this, Width >> 2, HAlign, pTexInfo);
831*35ffd701SAndroid Build Coastguard Worker
832*35ffd701SAndroid Build Coastguard Worker AlignedWidth = GFX_MAX(AlignedWidth, AlignedWidthLod1 + AlignedWidthLod2);
833*35ffd701SAndroid Build Coastguard Worker }
834*35ffd701SAndroid Build Coastguard Worker
835*35ffd701SAndroid Build Coastguard Worker if(Compress)
836*35ffd701SAndroid Build Coastguard Worker {
837*35ffd701SAndroid Build Coastguard Worker AlignedWidth = GFX_CEIL_DIV(AlignedWidth, CompressWidth);
838*35ffd701SAndroid Build Coastguard Worker }
839*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.SeparateStencil && pTexInfo->Flags.Info.TiledW)
840*35ffd701SAndroid Build Coastguard Worker {
841*35ffd701SAndroid Build Coastguard Worker AlignedWidth *= 2;
842*35ffd701SAndroid Build Coastguard Worker }
843*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
844*35ffd701SAndroid Build Coastguard Worker {
845*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->BitsPerPixel)
846*35ffd701SAndroid Build Coastguard Worker {
847*35ffd701SAndroid Build Coastguard Worker case 32:
848*35ffd701SAndroid Build Coastguard Worker AlignedWidth /= 8;
849*35ffd701SAndroid Build Coastguard Worker break;
850*35ffd701SAndroid Build Coastguard Worker case 64:
851*35ffd701SAndroid Build Coastguard Worker AlignedWidth /= 4;
852*35ffd701SAndroid Build Coastguard Worker break;
853*35ffd701SAndroid Build Coastguard Worker case 128:
854*35ffd701SAndroid Build Coastguard Worker AlignedWidth /= 2;
855*35ffd701SAndroid Build Coastguard Worker break;
856*35ffd701SAndroid Build Coastguard Worker default:
857*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
858*35ffd701SAndroid Build Coastguard Worker }
859*35ffd701SAndroid Build Coastguard Worker }
860*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.ColorSeparation)
861*35ffd701SAndroid Build Coastguard Worker {
862*35ffd701SAndroid Build Coastguard Worker AlignedWidth *= pTexInfo->ArraySize;
863*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0 == (AlignedWidth % GMM_COLOR_SEPARATION_WIDTH_DIVISION));
864*35ffd701SAndroid Build Coastguard Worker AlignedWidth /= GMM_COLOR_SEPARATION_WIDTH_DIVISION;
865*35ffd701SAndroid Build Coastguard Worker }
866*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.ColorSeparationRGBX)
867*35ffd701SAndroid Build Coastguard Worker {
868*35ffd701SAndroid Build Coastguard Worker AlignedWidth *= pTexInfo->ArraySize;
869*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0 == (AlignedWidth % GMM_COLOR_SEPARATION_RGBX_WIDTH_DIVISION));
870*35ffd701SAndroid Build Coastguard Worker AlignedWidth /= GMM_COLOR_SEPARATION_RGBX_WIDTH_DIVISION;
871*35ffd701SAndroid Build Coastguard Worker }
872*35ffd701SAndroid Build Coastguard Worker
873*35ffd701SAndroid Build Coastguard Worker // Default pitch
874*35ffd701SAndroid Build Coastguard Worker Pitch = AlignedWidth * BitsPerPixel >> 3;
875*35ffd701SAndroid Build Coastguard Worker
876*35ffd701SAndroid Build Coastguard Worker // Make sure the pitch satisfy linear min pitch requirment
877*35ffd701SAndroid Build Coastguard Worker Pitch = GFX_MAX(Pitch, pRestrictions->MinPitch);
878*35ffd701SAndroid Build Coastguard Worker
879*35ffd701SAndroid Build Coastguard Worker // Make sure pitch satisfy alignment restriction
880*35ffd701SAndroid Build Coastguard Worker Pitch = GFX_ALIGN(Pitch, pRestrictions->PitchAlignment);
881*35ffd701SAndroid Build Coastguard Worker
882*35ffd701SAndroid Build Coastguard Worker ////////////////////
883*35ffd701SAndroid Build Coastguard Worker // Adjust for Tiling
884*35ffd701SAndroid Build Coastguard Worker ////////////////////
885*35ffd701SAndroid Build Coastguard Worker
886*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]))
887*35ffd701SAndroid Build Coastguard Worker {
888*35ffd701SAndroid Build Coastguard Worker Pitch = GFX_ALIGN(Pitch, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth);
889*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_ALIGN(BlockHeight, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight);
890*35ffd701SAndroid Build Coastguard Worker }
891*35ffd701SAndroid Build Coastguard Worker
892*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(pTexInfo->Flags.Info.LayoutBelow || !pTexInfo->Flags.Info.LayoutRight, "MIPLAYOUT_RIGHT not supported after Gen6!");
893*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.LayoutBelow = 1;
894*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.LayoutRight = 0;
895*35ffd701SAndroid Build Coastguard Worker
896*35ffd701SAndroid Build Coastguard Worker // If a texture is YUV packed, 96, or 48 bpp then one row plus 16 bytes of
897*35ffd701SAndroid Build Coastguard Worker // padding needs to be added. Since this will create a none pitch aligned
898*35ffd701SAndroid Build Coastguard Worker // surface the padding is aligned to the next row
899*35ffd701SAndroid Build Coastguard Worker if(GmmIsYUVPacked(pTexInfo->Format) ||
900*35ffd701SAndroid Build Coastguard Worker (pTexInfo->BitsPerPixel == GMM_BITS(96)) ||
901*35ffd701SAndroid Build Coastguard Worker (pTexInfo->BitsPerPixel == GMM_BITS(48)))
902*35ffd701SAndroid Build Coastguard Worker {
903*35ffd701SAndroid Build Coastguard Worker BlockHeight += GMM_SCANLINES(1) + GFX_CEIL_DIV(GMM_BYTES(16), Pitch);
904*35ffd701SAndroid Build Coastguard Worker }
905*35ffd701SAndroid Build Coastguard Worker
906*35ffd701SAndroid Build Coastguard Worker // Align height to even row to cover for HW over-fetch
907*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_ALIGN(BlockHeight, __GMM_EVEN_ROW);
908*35ffd701SAndroid Build Coastguard Worker
909*35ffd701SAndroid Build Coastguard Worker if((Status = // <-- Note assignment.
910*35ffd701SAndroid Build Coastguard Worker FillTexPitchAndSize(
911*35ffd701SAndroid Build Coastguard Worker pTexInfo, Pitch, BlockHeight, pRestrictions)) == GMM_SUCCESS)
912*35ffd701SAndroid Build Coastguard Worker {
913*35ffd701SAndroid Build Coastguard Worker Fill2DTexOffsetAddress(pTexInfo);
914*35ffd701SAndroid Build Coastguard Worker }
915*35ffd701SAndroid Build Coastguard Worker
916*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
917*35ffd701SAndroid Build Coastguard Worker
918*35ffd701SAndroid Build Coastguard Worker return (Status);
919*35ffd701SAndroid Build Coastguard Worker }
920*35ffd701SAndroid Build Coastguard Worker
921*35ffd701SAndroid Build Coastguard Worker
922*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
923*35ffd701SAndroid Build Coastguard Worker /// Returns the mip offset of given LOD in Mip Tail
924*35ffd701SAndroid Build Coastguard Worker ///
925*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
926*35ffd701SAndroid Build Coastguard Worker /// MipLevel: given LOD #
927*35ffd701SAndroid Build Coastguard Worker ///
928*35ffd701SAndroid Build Coastguard Worker /// @return offset value of LOD in bytes
929*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetMipTailByteOffset(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)930*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmGen9TextureCalc::GetMipTailByteOffset(GMM_TEXTURE_INFO *pTexInfo,
931*35ffd701SAndroid Build Coastguard Worker uint32_t MipLevel)
932*35ffd701SAndroid Build Coastguard Worker {
933*35ffd701SAndroid Build Coastguard Worker uint32_t ByteOffset = 0, Slot;
934*35ffd701SAndroid Build Coastguard Worker
935*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
936*35ffd701SAndroid Build Coastguard Worker
937*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Type == RESOURCE_1D) || (pTexInfo->Type == RESOURCE_3D))
938*35ffd701SAndroid Build Coastguard Worker {
939*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod +
940*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf ? 4 : 0);
941*35ffd701SAndroid Build Coastguard Worker
942*35ffd701SAndroid Build Coastguard Worker switch(Slot)
943*35ffd701SAndroid Build Coastguard Worker {
944*35ffd701SAndroid Build Coastguard Worker case 0:
945*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(32);
946*35ffd701SAndroid Build Coastguard Worker break;
947*35ffd701SAndroid Build Coastguard Worker case 1:
948*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(16);
949*35ffd701SAndroid Build Coastguard Worker break;
950*35ffd701SAndroid Build Coastguard Worker case 2:
951*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(8);
952*35ffd701SAndroid Build Coastguard Worker break;
953*35ffd701SAndroid Build Coastguard Worker case 3:
954*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(4);
955*35ffd701SAndroid Build Coastguard Worker break;
956*35ffd701SAndroid Build Coastguard Worker case 4:
957*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(2);
958*35ffd701SAndroid Build Coastguard Worker break;
959*35ffd701SAndroid Build Coastguard Worker case 5:
960*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(1);
961*35ffd701SAndroid Build Coastguard Worker break;
962*35ffd701SAndroid Build Coastguard Worker case 6:
963*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(768);
964*35ffd701SAndroid Build Coastguard Worker break;
965*35ffd701SAndroid Build Coastguard Worker case 7:
966*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(512);
967*35ffd701SAndroid Build Coastguard Worker break;
968*35ffd701SAndroid Build Coastguard Worker case 8:
969*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(448);
970*35ffd701SAndroid Build Coastguard Worker break;
971*35ffd701SAndroid Build Coastguard Worker case 9:
972*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(384);
973*35ffd701SAndroid Build Coastguard Worker break;
974*35ffd701SAndroid Build Coastguard Worker case 10:
975*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(320);
976*35ffd701SAndroid Build Coastguard Worker break;
977*35ffd701SAndroid Build Coastguard Worker case 11:
978*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(256);
979*35ffd701SAndroid Build Coastguard Worker break;
980*35ffd701SAndroid Build Coastguard Worker case 12:
981*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(192);
982*35ffd701SAndroid Build Coastguard Worker break;
983*35ffd701SAndroid Build Coastguard Worker case 13:
984*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(128);
985*35ffd701SAndroid Build Coastguard Worker break;
986*35ffd701SAndroid Build Coastguard Worker case 14:
987*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(64);
988*35ffd701SAndroid Build Coastguard Worker break;
989*35ffd701SAndroid Build Coastguard Worker case 15:
990*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(0);
991*35ffd701SAndroid Build Coastguard Worker break;
992*35ffd701SAndroid Build Coastguard Worker default:
993*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
994*35ffd701SAndroid Build Coastguard Worker }
995*35ffd701SAndroid Build Coastguard Worker }
996*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Type == RESOURCE_2D || pTexInfo->Type == RESOURCE_CUBE)
997*35ffd701SAndroid Build Coastguard Worker {
998*35ffd701SAndroid Build Coastguard Worker // clang-format off
999*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod +
1000*35ffd701SAndroid Build Coastguard Worker // TileYs
1001*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 16) ? 4 :
1002*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 8) ? 3 :
1003*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 4) ? 2 :
1004*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 2) ? 1 :
1005*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs ) ? 0 :
1006*35ffd701SAndroid Build Coastguard Worker // TileYf
1007*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf ) ? 4: 0);
1008*35ffd701SAndroid Build Coastguard Worker // clang-format on
1009*35ffd701SAndroid Build Coastguard Worker
1010*35ffd701SAndroid Build Coastguard Worker switch(Slot)
1011*35ffd701SAndroid Build Coastguard Worker {
1012*35ffd701SAndroid Build Coastguard Worker case 0:
1013*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(32);
1014*35ffd701SAndroid Build Coastguard Worker break;
1015*35ffd701SAndroid Build Coastguard Worker case 1:
1016*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(16);
1017*35ffd701SAndroid Build Coastguard Worker break;
1018*35ffd701SAndroid Build Coastguard Worker case 2:
1019*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(8);
1020*35ffd701SAndroid Build Coastguard Worker break;
1021*35ffd701SAndroid Build Coastguard Worker case 3:
1022*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(4);
1023*35ffd701SAndroid Build Coastguard Worker break;
1024*35ffd701SAndroid Build Coastguard Worker case 4:
1025*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(2);
1026*35ffd701SAndroid Build Coastguard Worker break;
1027*35ffd701SAndroid Build Coastguard Worker case 5:
1028*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(1536);
1029*35ffd701SAndroid Build Coastguard Worker break;
1030*35ffd701SAndroid Build Coastguard Worker case 6:
1031*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(1280);
1032*35ffd701SAndroid Build Coastguard Worker break;
1033*35ffd701SAndroid Build Coastguard Worker case 7:
1034*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(1024);
1035*35ffd701SAndroid Build Coastguard Worker break;
1036*35ffd701SAndroid Build Coastguard Worker case 8:
1037*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(768);
1038*35ffd701SAndroid Build Coastguard Worker break;
1039*35ffd701SAndroid Build Coastguard Worker case 9:
1040*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(512);
1041*35ffd701SAndroid Build Coastguard Worker break;
1042*35ffd701SAndroid Build Coastguard Worker case 10:
1043*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(256);
1044*35ffd701SAndroid Build Coastguard Worker break;
1045*35ffd701SAndroid Build Coastguard Worker case 11:
1046*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(192);
1047*35ffd701SAndroid Build Coastguard Worker break;
1048*35ffd701SAndroid Build Coastguard Worker case 12:
1049*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(128);
1050*35ffd701SAndroid Build Coastguard Worker break;
1051*35ffd701SAndroid Build Coastguard Worker case 13:
1052*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(64);
1053*35ffd701SAndroid Build Coastguard Worker break;
1054*35ffd701SAndroid Build Coastguard Worker case 14:
1055*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(0);
1056*35ffd701SAndroid Build Coastguard Worker break;
1057*35ffd701SAndroid Build Coastguard Worker default:
1058*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
1059*35ffd701SAndroid Build Coastguard Worker }
1060*35ffd701SAndroid Build Coastguard Worker }
1061*35ffd701SAndroid Build Coastguard Worker
1062*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
1063*35ffd701SAndroid Build Coastguard Worker
1064*35ffd701SAndroid Build Coastguard Worker return (ByteOffset);
1065*35ffd701SAndroid Build Coastguard Worker }
1066*35ffd701SAndroid Build Coastguard Worker
1067*35ffd701SAndroid Build Coastguard Worker GMM_MIPTAIL_SLOT_OFFSET Gen9MipTailSlotOffset1DSurface[16][5] = GEN9_MIPTAIL_SLOT_OFFSET_1D_SURFACE;
1068*35ffd701SAndroid Build Coastguard Worker GMM_MIPTAIL_SLOT_OFFSET Gen9MipTailSlotOffset2DSurface[15][5] = GEN9_MIPTAIL_SLOT_OFFSET_2D_SURFACE;
1069*35ffd701SAndroid Build Coastguard Worker GMM_MIPTAIL_SLOT_OFFSET Gen9MipTailSlotOffset3DSurface[16][5] = GEN9_MIPTAIL_SLOT_OFFSET_3D_SURFACE;
1070*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1071*35ffd701SAndroid Build Coastguard Worker /// Returns the mip-map offset in geometric OffsetX, Y, Z
1072*35ffd701SAndroid Build Coastguard Worker // for a given LOD in Mip Tail.
1073*35ffd701SAndroid Build Coastguard Worker ///
1074*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
1075*35ffd701SAndroid Build Coastguard Worker /// MipLevel: mip-map level
1076*35ffd701SAndroid Build Coastguard Worker /// OffsetX: ptr to Offset in X direction (in bytes)
1077*35ffd701SAndroid Build Coastguard Worker /// OffsetY: ptr to Offset in Y direction (in pixels)
1078*35ffd701SAndroid Build Coastguard Worker /// OffsetZ: ptr to Offset in Z direction (in pixels)
1079*35ffd701SAndroid Build Coastguard Worker ///
1080*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetMipTailGeometryOffset(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel,uint32_t * OffsetX,uint32_t * OffsetY,uint32_t * OffsetZ)1081*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmGen9TextureCalc::GetMipTailGeometryOffset(GMM_TEXTURE_INFO *pTexInfo,
1082*35ffd701SAndroid Build Coastguard Worker uint32_t MipLevel,
1083*35ffd701SAndroid Build Coastguard Worker uint32_t * OffsetX,
1084*35ffd701SAndroid Build Coastguard Worker uint32_t * OffsetY,
1085*35ffd701SAndroid Build Coastguard Worker uint32_t * OffsetZ)
1086*35ffd701SAndroid Build Coastguard Worker {
1087*35ffd701SAndroid Build Coastguard Worker uint32_t ArrayIndex = 0;
1088*35ffd701SAndroid Build Coastguard Worker uint32_t Slot = 0;
1089*35ffd701SAndroid Build Coastguard Worker
1090*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
1091*35ffd701SAndroid Build Coastguard Worker
1092*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->BitsPerPixel)
1093*35ffd701SAndroid Build Coastguard Worker {
1094*35ffd701SAndroid Build Coastguard Worker case 128:
1095*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 0;
1096*35ffd701SAndroid Build Coastguard Worker break;
1097*35ffd701SAndroid Build Coastguard Worker case 64:
1098*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 1;
1099*35ffd701SAndroid Build Coastguard Worker break;
1100*35ffd701SAndroid Build Coastguard Worker case 32:
1101*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 2;
1102*35ffd701SAndroid Build Coastguard Worker break;
1103*35ffd701SAndroid Build Coastguard Worker case 16:
1104*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 3;
1105*35ffd701SAndroid Build Coastguard Worker break;
1106*35ffd701SAndroid Build Coastguard Worker case 8:
1107*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 4;
1108*35ffd701SAndroid Build Coastguard Worker break;
1109*35ffd701SAndroid Build Coastguard Worker default:
1110*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
1111*35ffd701SAndroid Build Coastguard Worker break;
1112*35ffd701SAndroid Build Coastguard Worker }
1113*35ffd701SAndroid Build Coastguard Worker
1114*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Type == RESOURCE_1D)
1115*35ffd701SAndroid Build Coastguard Worker {
1116*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod +
1117*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf ? 4 : 0);
1118*35ffd701SAndroid Build Coastguard Worker
1119*35ffd701SAndroid Build Coastguard Worker *OffsetX = Gen9MipTailSlotOffset1DSurface[Slot][ArrayIndex].X * pTexInfo->BitsPerPixel / 8;
1120*35ffd701SAndroid Build Coastguard Worker *OffsetY = Gen9MipTailSlotOffset1DSurface[Slot][ArrayIndex].Y;
1121*35ffd701SAndroid Build Coastguard Worker *OffsetZ = Gen9MipTailSlotOffset1DSurface[Slot][ArrayIndex].Z;
1122*35ffd701SAndroid Build Coastguard Worker }
1123*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Type == RESOURCE_2D || pTexInfo->Type == RESOURCE_CUBE)
1124*35ffd701SAndroid Build Coastguard Worker {
1125*35ffd701SAndroid Build Coastguard Worker // clang-format off
1126*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod +
1127*35ffd701SAndroid Build Coastguard Worker // TileYs
1128*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 16) ? 4 :
1129*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 8) ? 3 :
1130*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 4) ? 2 :
1131*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 2) ? 1 :
1132*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs ) ? 0 :
1133*35ffd701SAndroid Build Coastguard Worker // TileYf
1134*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf ) ? 4: 0);
1135*35ffd701SAndroid Build Coastguard Worker // clang-format on
1136*35ffd701SAndroid Build Coastguard Worker
1137*35ffd701SAndroid Build Coastguard Worker *OffsetX = Gen9MipTailSlotOffset2DSurface[Slot][ArrayIndex].X * pTexInfo->BitsPerPixel / 8;
1138*35ffd701SAndroid Build Coastguard Worker *OffsetY = Gen9MipTailSlotOffset2DSurface[Slot][ArrayIndex].Y;
1139*35ffd701SAndroid Build Coastguard Worker *OffsetZ = Gen9MipTailSlotOffset2DSurface[Slot][ArrayIndex].Z;
1140*35ffd701SAndroid Build Coastguard Worker }
1141*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Type == RESOURCE_3D)
1142*35ffd701SAndroid Build Coastguard Worker {
1143*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod +
1144*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf ? 4 : 0);
1145*35ffd701SAndroid Build Coastguard Worker
1146*35ffd701SAndroid Build Coastguard Worker *OffsetX = Gen9MipTailSlotOffset3DSurface[Slot][ArrayIndex].X * pTexInfo->BitsPerPixel / 8;
1147*35ffd701SAndroid Build Coastguard Worker *OffsetY = Gen9MipTailSlotOffset3DSurface[Slot][ArrayIndex].Y;
1148*35ffd701SAndroid Build Coastguard Worker *OffsetZ = Gen9MipTailSlotOffset3DSurface[Slot][ArrayIndex].Z;
1149*35ffd701SAndroid Build Coastguard Worker }
1150*35ffd701SAndroid Build Coastguard Worker
1151*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
1152*35ffd701SAndroid Build Coastguard Worker return;
1153*35ffd701SAndroid Build Coastguard Worker }
1154*35ffd701SAndroid Build Coastguard Worker
1155*35ffd701SAndroid Build Coastguard Worker
1156*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1157*35ffd701SAndroid Build Coastguard Worker /// Allocates the 3D mip layout for surface state programming.
1158*35ffd701SAndroid Build Coastguard Worker ///
1159*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
1160*35ffd701SAndroid Build Coastguard Worker /// @param[in] pRestrictions: ptr to surface alignment and size restrictions
1161*35ffd701SAndroid Build Coastguard Worker ///
1162*35ffd701SAndroid Build Coastguard Worker /// @return ::GMM_STATUS
1163*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTex3D(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)1164*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen9TextureCalc::FillTex3D(GMM_TEXTURE_INFO * pTexInfo,
1165*35ffd701SAndroid Build Coastguard Worker __GMM_BUFFER_TYPE *pRestrictions)
1166*35ffd701SAndroid Build Coastguard Worker {
1167*35ffd701SAndroid Build Coastguard Worker return FillTex2D(pTexInfo, pRestrictions);
1168*35ffd701SAndroid Build Coastguard Worker }
1169*35ffd701SAndroid Build Coastguard Worker
1170*35ffd701SAndroid Build Coastguard Worker
1171*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1172*35ffd701SAndroid Build Coastguard Worker /// Calculates the cube layout for surface state programming.
1173*35ffd701SAndroid Build Coastguard Worker ///
1174*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
1175*35ffd701SAndroid Build Coastguard Worker /// @param[in] pRestrictions: ptr to surface alignment and size restrictions
1176*35ffd701SAndroid Build Coastguard Worker ///
1177*35ffd701SAndroid Build Coastguard Worker /// @return ::GMM_STATUS
1178*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTexCube(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)1179*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen9TextureCalc::FillTexCube(GMM_TEXTURE_INFO * pTexInfo,
1180*35ffd701SAndroid Build Coastguard Worker __GMM_BUFFER_TYPE *pRestrictions)
1181*35ffd701SAndroid Build Coastguard Worker {
1182*35ffd701SAndroid Build Coastguard Worker return FillTex2D(pTexInfo, pRestrictions);
1183*35ffd701SAndroid Build Coastguard Worker }
1184*35ffd701SAndroid Build Coastguard Worker
1185*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1186*35ffd701SAndroid Build Coastguard Worker /// This function does any special-case conversion from client-provided pseudo creation
1187*35ffd701SAndroid Build Coastguard Worker /// parameters to actual parameters for CCS.
1188*35ffd701SAndroid Build Coastguard Worker ///
1189*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: Reference to ::GMM_TEXTURE_INFO
1190*35ffd701SAndroid Build Coastguard Worker ///
1191*35ffd701SAndroid Build Coastguard Worker /// @return ::GMM_STATUS
1192*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
MSAACCSUsage(GMM_TEXTURE_INFO * pTexInfo)1193*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen9TextureCalc::MSAACCSUsage(GMM_TEXTURE_INFO *pTexInfo)
1194*35ffd701SAndroid Build Coastguard Worker {
1195*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status = GMM_SUCCESS;
1196*35ffd701SAndroid Build Coastguard Worker
1197*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->MSAA.NumSamples > 1) // CCS for MSAA Compression
1198*35ffd701SAndroid Build Coastguard Worker {
1199*35ffd701SAndroid Build Coastguard Worker Status = MSAACompression(pTexInfo);
1200*35ffd701SAndroid Build Coastguard Worker }
1201*35ffd701SAndroid Build Coastguard Worker else // Non-MSAA CCS Use (i.e. Render Target Fast Clear)
1202*35ffd701SAndroid Build Coastguard Worker {
1203*35ffd701SAndroid Build Coastguard Worker if(!pTexInfo->Flags.Info.TiledW &&
1204*35ffd701SAndroid Build Coastguard Worker (!pTexInfo->Flags.Info.TiledX) &&
1205*35ffd701SAndroid Build Coastguard Worker ((!pTexInfo->Flags.Info.Linear) ||
1206*35ffd701SAndroid Build Coastguard Worker (GMM_IS_4KB_TILE(pTexInfo->Flags) || GMM_IS_64KB_TILE(pTexInfo->Flags) ||
1207*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Type == RESOURCE_BUFFER && pTexInfo->Flags.Info.Linear))) && //!Yf - deprecate Yf
1208*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->BitsPerPixel == 32) ||
1209*35ffd701SAndroid Build Coastguard Worker (pTexInfo->BitsPerPixel == 64) ||
1210*35ffd701SAndroid Build Coastguard Worker (pTexInfo->BitsPerPixel == 128)))
1211*35ffd701SAndroid Build Coastguard Worker {
1212*35ffd701SAndroid Build Coastguard Worker // For non-MSAA CCS usage, the four tables of
1213*35ffd701SAndroid Build Coastguard Worker // requirements:
1214*35ffd701SAndroid Build Coastguard Worker // (1) RT Alignment (GMM Don't Care: Occurs Naturally)
1215*35ffd701SAndroid Build Coastguard Worker // (2) ClearRect Alignment
1216*35ffd701SAndroid Build Coastguard Worker // (3) ClearRect Scaling (GMM Don't Care: GHAL3D Matter)
1217*35ffd701SAndroid Build Coastguard Worker // (4) Non-MSAA CCS Sizing
1218*35ffd701SAndroid Build Coastguard Worker
1219*35ffd701SAndroid Build Coastguard Worker // Gen8+:
1220*35ffd701SAndroid Build Coastguard Worker // Since mip-mapped and arrayed surfaces are supported, we
1221*35ffd701SAndroid Build Coastguard Worker // deal with alignment later at per mip level. Here, we set
1222*35ffd701SAndroid Build Coastguard Worker // tiling type only. TileX is not supported on Gen9+.
1223*35ffd701SAndroid Build Coastguard Worker // Pre-Gen8:
1224*35ffd701SAndroid Build Coastguard Worker // (!) For all the above, there are separate entries for
1225*35ffd701SAndroid Build Coastguard Worker // 32/64/128bpp--and then deals with PIXEL widths--Here,
1226*35ffd701SAndroid Build Coastguard Worker // though, we will unify by considering 8bpp table entries
1227*35ffd701SAndroid Build Coastguard Worker // (unlisted--i.e. do the math)--and deal with BYTE widths.
1228*35ffd701SAndroid Build Coastguard Worker
1229*35ffd701SAndroid Build Coastguard Worker // (1) RT Alignment -- The surface width and height don't
1230*35ffd701SAndroid Build Coastguard Worker // need to be padded to RT CL granularity. On HSW, all tiled
1231*35ffd701SAndroid Build Coastguard Worker // RT's will have appropriate alignment (given 4KB surface
1232*35ffd701SAndroid Build Coastguard Worker // base and no mip-map support) and appropriate padding
1233*35ffd701SAndroid Build Coastguard Worker // (due to tile padding). On BDW+, GMM uses H/VALIGN that
1234*35ffd701SAndroid Build Coastguard Worker // will guarantee the MCS RT alignment for all subresources.
1235*35ffd701SAndroid Build Coastguard Worker
1236*35ffd701SAndroid Build Coastguard Worker // (2) ClearRect Alignment -- I.e. FastClears must be done
1237*35ffd701SAndroid Build Coastguard Worker // with certain granularity:
1238*35ffd701SAndroid Build Coastguard Worker // TileY: 512 Bytes x 128 Lines
1239*35ffd701SAndroid Build Coastguard Worker // TileX: 1024 Bytes x 64 Lines
1240*35ffd701SAndroid Build Coastguard Worker // So a CCS must be sized to match that granularity (though
1241*35ffd701SAndroid Build Coastguard Worker // the RT itself need not be fully padded to that
1242*35ffd701SAndroid Build Coastguard Worker // granularity to use FastClear).
1243*35ffd701SAndroid Build Coastguard Worker
1244*35ffd701SAndroid Build Coastguard Worker // (4) Non-MSAA CCS Sizing -- CCS sizing is based on the
1245*35ffd701SAndroid Build Coastguard Worker // size of the FastClear (with granularity padding) for the
1246*35ffd701SAndroid Build Coastguard Worker // paired RT. CCS's (byte widths and heights) are scaled
1247*35ffd701SAndroid Build Coastguard Worker // down from their RT's by:
1248*35ffd701SAndroid Build Coastguard Worker // TileY: 32 x 32
1249*35ffd701SAndroid Build Coastguard Worker // TileX: 64 x 16
1250*35ffd701SAndroid Build Coastguard Worker
1251*35ffd701SAndroid Build Coastguard Worker // ### Example #############################################
1252*35ffd701SAndroid Build Coastguard Worker // RT: 800x600, 32bpp, TileY
1253*35ffd701SAndroid Build Coastguard Worker // 8bpp: 3200x600
1254*35ffd701SAndroid Build Coastguard Worker // FastClear: 3584x640 (for TileY FastClear Granularity of 512x128)
1255*35ffd701SAndroid Build Coastguard Worker // CCS: 112x20 (for TileY RT:CCS Sizing Downscale of 32x32)
1256*35ffd701SAndroid Build Coastguard Worker
1257*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.__NonMsaaTileYCcs = pTexInfo->Flags.Info.TiledY || pTexInfo->Flags.Info.TiledYf || pTexInfo->Flags.Info.TiledYs;
1258*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.__NonMsaaTileXCcs = pTexInfo->Flags.Info.TiledX;
1259*35ffd701SAndroid Build Coastguard Worker }
1260*35ffd701SAndroid Build Coastguard Worker else
1261*35ffd701SAndroid Build Coastguard Worker {
1262*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Illegal CCS creation parameters!");
1263*35ffd701SAndroid Build Coastguard Worker Status = GMM_ERROR;
1264*35ffd701SAndroid Build Coastguard Worker }
1265*35ffd701SAndroid Build Coastguard Worker }
1266*35ffd701SAndroid Build Coastguard Worker return Status;
1267*35ffd701SAndroid Build Coastguard Worker }
1268