xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/Texture/GmmGen7Texture.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker 
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker 
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker 
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker 
23*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
24*35ffd701SAndroid Build Coastguard Worker 
25*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
26*35ffd701SAndroid Build Coastguard Worker /// Allocates the 2D mip layout for surface state programming.
27*35ffd701SAndroid Build Coastguard Worker ///
28*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO,
29*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pRestrictions: ptr to surface alignment and size restrictions
30*35ffd701SAndroid Build Coastguard Worker ///
31*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
32*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTex2D(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)33*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen7TextureCalc::FillTex2D(GMM_TEXTURE_INFO * pTexInfo,
34*35ffd701SAndroid Build Coastguard Worker                                                              __GMM_BUFFER_TYPE *pRestrictions)
35*35ffd701SAndroid Build Coastguard Worker {
36*35ffd701SAndroid Build Coastguard Worker     uint32_t   Width, Height, BitsPerPixel;
37*35ffd701SAndroid Build Coastguard Worker     uint32_t   HAlign, VAlign;
38*35ffd701SAndroid Build Coastguard Worker     uint32_t   CompressHeight, CompressWidth, CompressDepth;
39*35ffd701SAndroid Build Coastguard Worker     uint32_t   AlignedWidth, BlockHeight, ExpandedArraySize, Pitch;
40*35ffd701SAndroid Build Coastguard Worker     uint8_t    Compress = 0;
41*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS Status;
42*35ffd701SAndroid Build Coastguard Worker 
43*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
44*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pRestrictions, GMM_ERROR);
45*35ffd701SAndroid Build Coastguard Worker 
46*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
47*35ffd701SAndroid Build Coastguard Worker 
48*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
49*35ffd701SAndroid Build Coastguard Worker 
50*35ffd701SAndroid Build Coastguard Worker     BitsPerPixel = pTexInfo->BitsPerPixel;
51*35ffd701SAndroid Build Coastguard Worker     Height       = pTexInfo->BaseHeight;
52*35ffd701SAndroid Build Coastguard Worker     Width        = GFX_ULONG_CAST(pTexInfo->BaseWidth);
53*35ffd701SAndroid Build Coastguard Worker 
54*35ffd701SAndroid Build Coastguard Worker     pTexInfo->MSAA.NumSamples = GFX_MAX(pTexInfo->MSAA.NumSamples, 1);
55*35ffd701SAndroid Build Coastguard Worker 
56*35ffd701SAndroid Build Coastguard Worker     ExpandedArraySize =
57*35ffd701SAndroid Build Coastguard Worker     GFX_MAX(pTexInfo->ArraySize, 1) *
58*35ffd701SAndroid Build Coastguard Worker     ((pTexInfo->Type == RESOURCE_CUBE) ? 6 : 1) * // Cubemaps simply 6-element, 2D arrays.
59*35ffd701SAndroid Build Coastguard Worker     ((pTexInfo->Flags.Gpu.Depth || pTexInfo->Flags.Gpu.SeparateStencil) ?
60*35ffd701SAndroid Build Coastguard Worker      1 :
61*35ffd701SAndroid Build Coastguard Worker      pTexInfo->MSAA.NumSamples); // Gen7 MSAA (non-Depth/Stencil) RT samples stored as array planes.
62*35ffd701SAndroid Build Coastguard Worker 
63*35ffd701SAndroid Build Coastguard Worker     //
64*35ffd701SAndroid Build Coastguard Worker     // Check for color separation
65*35ffd701SAndroid Build Coastguard Worker     //
66*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.ColorSeparation || pTexInfo->Flags.Gpu.ColorSeparationRGBX)
67*35ffd701SAndroid Build Coastguard Worker     {
68*35ffd701SAndroid Build Coastguard Worker         bool csRestrictionsMet = (((ExpandedArraySize <= 2) &&
69*35ffd701SAndroid Build Coastguard Worker                                    (ExpandedArraySize == pTexInfo->ArraySize) &&
70*35ffd701SAndroid Build Coastguard Worker                                    ((pTexInfo->Format == GMM_FORMAT_R8G8B8A8_UNORM) ||
71*35ffd701SAndroid Build Coastguard Worker                                     (pTexInfo->Format == GMM_FORMAT_R8G8B8A8_UNORM_SRGB) ||
72*35ffd701SAndroid Build Coastguard Worker                                     (pTexInfo->Format == GMM_FORMAT_B8G8R8A8_UNORM) ||
73*35ffd701SAndroid Build Coastguard Worker                                     (pTexInfo->Format == GMM_FORMAT_B8G8R8A8_UNORM_SRGB) ||
74*35ffd701SAndroid Build Coastguard Worker                                     (pTexInfo->Format == GMM_FORMAT_B8G8R8X8_UNORM) ||
75*35ffd701SAndroid Build Coastguard Worker                                     (pTexInfo->Format == GMM_FORMAT_B8G8R8X8_UNORM_SRGB)) &&
76*35ffd701SAndroid Build Coastguard Worker                                    ((pTexInfo->Flags.Gpu.ColorSeparation && (Width % 16) == 0) ||
77*35ffd701SAndroid Build Coastguard Worker                                     (pTexInfo->Flags.Gpu.ColorSeparationRGBX && (Width % 12) == 0))));
78*35ffd701SAndroid Build Coastguard Worker 
79*35ffd701SAndroid Build Coastguard Worker         if(csRestrictionsMet)
80*35ffd701SAndroid Build Coastguard Worker         {
81*35ffd701SAndroid Build Coastguard Worker             ExpandedArraySize = GMM_COLOR_SEPARATION_ARRAY_SIZE;
82*35ffd701SAndroid Build Coastguard Worker         }
83*35ffd701SAndroid Build Coastguard Worker         else
84*35ffd701SAndroid Build Coastguard Worker         {
85*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.ColorSeparation     = 0;
86*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.ColorSeparationRGBX = 0;
87*35ffd701SAndroid Build Coastguard Worker         }
88*35ffd701SAndroid Build Coastguard Worker     }
89*35ffd701SAndroid Build Coastguard Worker 
90*35ffd701SAndroid Build Coastguard Worker     HAlign = pTexInfo->Alignment.HAlign;
91*35ffd701SAndroid Build Coastguard Worker     VAlign = pTexInfo->Alignment.VAlign;
92*35ffd701SAndroid Build Coastguard Worker     GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
93*35ffd701SAndroid Build Coastguard Worker 
94*35ffd701SAndroid Build Coastguard Worker     Compress = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
95*35ffd701SAndroid Build Coastguard Worker 
96*35ffd701SAndroid Build Coastguard Worker     /////////////////////////////////
97*35ffd701SAndroid Build Coastguard Worker     // Calculate Block Surface Height
98*35ffd701SAndroid Build Coastguard Worker     /////////////////////////////////
99*35ffd701SAndroid Build Coastguard Worker 
100*35ffd701SAndroid Build Coastguard Worker     // Adjust total height for arrayed 2D textures
101*35ffd701SAndroid Build Coastguard Worker     if(ExpandedArraySize > 1)
102*35ffd701SAndroid Build Coastguard Worker     {
103*35ffd701SAndroid Build Coastguard Worker         uint32_t Height0, Height1;
104*35ffd701SAndroid Build Coastguard Worker 
105*35ffd701SAndroid Build Coastguard Worker         Height0 = __GMM_EXPAND_HEIGHT(this, Height, VAlign, pTexInfo);
106*35ffd701SAndroid Build Coastguard Worker 
107*35ffd701SAndroid Build Coastguard Worker         // If not ARYSPC_LOD0-eligible...
108*35ffd701SAndroid Build Coastguard Worker         if((pTexInfo->MaxLod > 0) ||
109*35ffd701SAndroid Build Coastguard Worker            pTexInfo->Flags.Gpu.Depth || // Depth/HiZ/Stencil buffers not ARYSPC_LOD0-compatible.
110*35ffd701SAndroid Build Coastguard Worker            pTexInfo->Flags.Gpu.HiZ ||
111*35ffd701SAndroid Build Coastguard Worker            pTexInfo->Flags.Gpu.SeparateStencil)
112*35ffd701SAndroid Build Coastguard Worker         {
113*35ffd701SAndroid Build Coastguard Worker             Height1 = __GMM_EXPAND_HEIGHT(this, Height >> 1, VAlign, pTexInfo);
114*35ffd701SAndroid Build Coastguard Worker 
115*35ffd701SAndroid Build Coastguard Worker             // QPitch = (h0 + h1 + 12j) * pitch
116*35ffd701SAndroid Build Coastguard Worker             BlockHeight = Height0 + Height1 + 12 * VAlign;
117*35ffd701SAndroid Build Coastguard Worker         }
118*35ffd701SAndroid Build Coastguard Worker         else // SURFACE_STATE: Surface Array Spacing: ARYSPC_LOD0
119*35ffd701SAndroid Build Coastguard Worker         {
120*35ffd701SAndroid Build Coastguard Worker             // QPitch = h0 * pitch
121*35ffd701SAndroid Build Coastguard Worker             BlockHeight                               = Height0;
122*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Alignment.ArraySpacingSingleLod = true;
123*35ffd701SAndroid Build Coastguard Worker         }
124*35ffd701SAndroid Build Coastguard Worker 
125*35ffd701SAndroid Build Coastguard Worker         if(Compress)
126*35ffd701SAndroid Build Coastguard Worker         {
127*35ffd701SAndroid Build Coastguard Worker             BlockHeight /= CompressHeight;
128*35ffd701SAndroid Build Coastguard Worker         }
129*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Gpu.SeparateStencil)
130*35ffd701SAndroid Build Coastguard Worker         {
131*35ffd701SAndroid Build Coastguard Worker             BlockHeight /= 2;
132*35ffd701SAndroid Build Coastguard Worker         }
133*35ffd701SAndroid Build Coastguard Worker 
134*35ffd701SAndroid Build Coastguard Worker         // Compute total array height
135*35ffd701SAndroid Build Coastguard Worker         BlockHeight *= ExpandedArraySize;
136*35ffd701SAndroid Build Coastguard Worker     }
137*35ffd701SAndroid Build Coastguard Worker     else
138*35ffd701SAndroid Build Coastguard Worker     {
139*35ffd701SAndroid Build Coastguard Worker         BlockHeight = Get2DMipMapHeight(pTexInfo);
140*35ffd701SAndroid Build Coastguard Worker     }
141*35ffd701SAndroid Build Coastguard Worker 
142*35ffd701SAndroid Build Coastguard Worker 
143*35ffd701SAndroid Build Coastguard Worker     ///////////////////////////////////
144*35ffd701SAndroid Build Coastguard Worker     // Calculate Pitch
145*35ffd701SAndroid Build Coastguard Worker     ///////////////////////////////////
146*35ffd701SAndroid Build Coastguard Worker 
147*35ffd701SAndroid Build Coastguard Worker     AlignedWidth = __GMM_EXPAND_WIDTH(this, Width, HAlign, pTexInfo);
148*35ffd701SAndroid Build Coastguard Worker 
149*35ffd701SAndroid Build Coastguard Worker     // Calculate special pitch case of small dimensions where LOD1 + LOD2 widths are greater
150*35ffd701SAndroid Build Coastguard Worker     // than LOD0.  e.g. dimensions 4x4 and MinPitch == 1
151*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->MaxLod >= 2)
152*35ffd701SAndroid Build Coastguard Worker     {
153*35ffd701SAndroid Build Coastguard Worker         uint32_t AlignedWidthLod1, AlignedWidthLod2;
154*35ffd701SAndroid Build Coastguard Worker 
155*35ffd701SAndroid Build Coastguard Worker         AlignedWidthLod1 = __GMM_EXPAND_WIDTH(this, Width >> 1, HAlign, pTexInfo);
156*35ffd701SAndroid Build Coastguard Worker         AlignedWidthLod2 = __GMM_EXPAND_WIDTH(this, Width >> 2, HAlign, pTexInfo);
157*35ffd701SAndroid Build Coastguard Worker 
158*35ffd701SAndroid Build Coastguard Worker         AlignedWidth = GFX_MAX(AlignedWidth, AlignedWidthLod1 + AlignedWidthLod2);
159*35ffd701SAndroid Build Coastguard Worker     }
160*35ffd701SAndroid Build Coastguard Worker 
161*35ffd701SAndroid Build Coastguard Worker     if(Compress)
162*35ffd701SAndroid Build Coastguard Worker     {
163*35ffd701SAndroid Build Coastguard Worker         AlignedWidth /= CompressWidth;
164*35ffd701SAndroid Build Coastguard Worker     }
165*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Gpu.SeparateStencil)
166*35ffd701SAndroid Build Coastguard Worker     {
167*35ffd701SAndroid Build Coastguard Worker         AlignedWidth *= 2;
168*35ffd701SAndroid Build Coastguard Worker     }
169*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Gpu.ColorSeparation)
170*35ffd701SAndroid Build Coastguard Worker     {
171*35ffd701SAndroid Build Coastguard Worker         AlignedWidth *= pTexInfo->ArraySize;
172*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(0 == (AlignedWidth % GMM_COLOR_SEPARATION_WIDTH_DIVISION));
173*35ffd701SAndroid Build Coastguard Worker         AlignedWidth /= GMM_COLOR_SEPARATION_WIDTH_DIVISION;
174*35ffd701SAndroid Build Coastguard Worker     }
175*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Gpu.ColorSeparationRGBX)
176*35ffd701SAndroid Build Coastguard Worker     {
177*35ffd701SAndroid Build Coastguard Worker         AlignedWidth *= pTexInfo->ArraySize;
178*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(0 == (AlignedWidth % GMM_COLOR_SEPARATION_RGBX_WIDTH_DIVISION));
179*35ffd701SAndroid Build Coastguard Worker         AlignedWidth /= GMM_COLOR_SEPARATION_RGBX_WIDTH_DIVISION;
180*35ffd701SAndroid Build Coastguard Worker     }
181*35ffd701SAndroid Build Coastguard Worker 
182*35ffd701SAndroid Build Coastguard Worker     // Default pitch
183*35ffd701SAndroid Build Coastguard Worker     Pitch = AlignedWidth * BitsPerPixel >> 3;
184*35ffd701SAndroid Build Coastguard Worker 
185*35ffd701SAndroid Build Coastguard Worker     // Make sure the pitch satisfy linear min pitch requirment
186*35ffd701SAndroid Build Coastguard Worker     Pitch = GFX_MAX(Pitch, pRestrictions->MinPitch);
187*35ffd701SAndroid Build Coastguard Worker 
188*35ffd701SAndroid Build Coastguard Worker     // Make sure pitch satisfy alignment restriction
189*35ffd701SAndroid Build Coastguard Worker     Pitch = GFX_ALIGN(Pitch, pRestrictions->PitchAlignment);
190*35ffd701SAndroid Build Coastguard Worker 
191*35ffd701SAndroid Build Coastguard Worker 
192*35ffd701SAndroid Build Coastguard Worker     ////////////////////
193*35ffd701SAndroid Build Coastguard Worker     // Adjust for Tiling
194*35ffd701SAndroid Build Coastguard Worker     ////////////////////
195*35ffd701SAndroid Build Coastguard Worker     if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]))
196*35ffd701SAndroid Build Coastguard Worker     {
197*35ffd701SAndroid Build Coastguard Worker         Pitch       = GFX_ALIGN(Pitch, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth);
198*35ffd701SAndroid Build Coastguard Worker         BlockHeight = GFX_ALIGN(BlockHeight, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight);
199*35ffd701SAndroid Build Coastguard Worker 
200*35ffd701SAndroid Build Coastguard Worker         // If Tiled Resource or Undefined64KBSwizzle resource, align to 64KB tile size
201*35ffd701SAndroid Build Coastguard Worker         if((pTexInfo->Flags.Gpu.TiledResource || pTexInfo->Flags.Info.Undefined64KBSwizzle) &&
202*35ffd701SAndroid Build Coastguard Worker            (pTexInfo->Flags.Info.TiledY))
203*35ffd701SAndroid Build Coastguard Worker         {
204*35ffd701SAndroid Build Coastguard Worker             uint32_t ColFactor = 0, RowFactor = 0;
205*35ffd701SAndroid Build Coastguard Worker             uint32_t TRTileWidth = 0, TRTileHeight = 0;
206*35ffd701SAndroid Build Coastguard Worker 
207*35ffd701SAndroid Build Coastguard Worker             GmmGetD3DToHwTileConversion(pTexInfo, &ColFactor, &RowFactor);
208*35ffd701SAndroid Build Coastguard Worker             TRTileWidth  = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth * ColFactor;
209*35ffd701SAndroid Build Coastguard Worker             TRTileHeight = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight * RowFactor;
210*35ffd701SAndroid Build Coastguard Worker 
211*35ffd701SAndroid Build Coastguard Worker             Pitch       = GFX_ALIGN(Pitch, TRTileWidth);
212*35ffd701SAndroid Build Coastguard Worker             BlockHeight = GFX_ALIGN(BlockHeight, TRTileHeight);
213*35ffd701SAndroid Build Coastguard Worker         }
214*35ffd701SAndroid Build Coastguard Worker     }
215*35ffd701SAndroid Build Coastguard Worker 
216*35ffd701SAndroid Build Coastguard Worker     GMM_ASSERTDPF(pTexInfo->Flags.Info.LayoutBelow || !pTexInfo->Flags.Info.LayoutRight, "MIPLAYOUT_RIGHT not supported after Gen6!");
217*35ffd701SAndroid Build Coastguard Worker     pTexInfo->Flags.Info.LayoutBelow = 1;
218*35ffd701SAndroid Build Coastguard Worker     pTexInfo->Flags.Info.LayoutRight = 0;
219*35ffd701SAndroid Build Coastguard Worker 
220*35ffd701SAndroid Build Coastguard Worker     // If a texture is YUV packed, 96, or 48 bpp then one row plus 16 bytes of
221*35ffd701SAndroid Build Coastguard Worker     // padding needs to be added. Since this will create a none pitch aligned
222*35ffd701SAndroid Build Coastguard Worker     // surface the padding is aligned to the next row
223*35ffd701SAndroid Build Coastguard Worker     if(GmmIsYUVPacked(pTexInfo->Format) ||
224*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->BitsPerPixel == GMM_BITS(96)) ||
225*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->BitsPerPixel == GMM_BITS(48)))
226*35ffd701SAndroid Build Coastguard Worker     {
227*35ffd701SAndroid Build Coastguard Worker         BlockHeight += GMM_SCANLINES(1) + GFX_CEIL_DIV(GMM_BYTES(16), Pitch);
228*35ffd701SAndroid Build Coastguard Worker     }
229*35ffd701SAndroid Build Coastguard Worker 
230*35ffd701SAndroid Build Coastguard Worker     // Align height to even row to cover for HW over - fetch
231*35ffd701SAndroid Build Coastguard Worker     BlockHeight = GFX_ALIGN(BlockHeight, __GMM_EVEN_ROW);
232*35ffd701SAndroid Build Coastguard Worker 
233*35ffd701SAndroid Build Coastguard Worker     if((Status = // <-- Note assignment.
234*35ffd701SAndroid Build Coastguard Worker         FillTexPitchAndSize(
235*35ffd701SAndroid Build Coastguard Worker         pTexInfo, Pitch, BlockHeight, pRestrictions)) == GMM_SUCCESS)
236*35ffd701SAndroid Build Coastguard Worker     {
237*35ffd701SAndroid Build Coastguard Worker         Fill2DTexOffsetAddress(pTexInfo);
238*35ffd701SAndroid Build Coastguard Worker 
239*35ffd701SAndroid Build Coastguard Worker         // Init to no-packed mips. It'll be initialized when app calls to get packed
240*35ffd701SAndroid Build Coastguard Worker         // mips. Calculate packed mips here if there's a chance apps won't call to
241*35ffd701SAndroid Build Coastguard Worker         // get packed mips.
242*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Alignment.PackedMipStartLod = GMM_TILED_RESOURCE_NO_PACKED_MIPS;
243*35ffd701SAndroid Build Coastguard Worker     }
244*35ffd701SAndroid Build Coastguard Worker 
245*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
246*35ffd701SAndroid Build Coastguard Worker     return (Status);
247*35ffd701SAndroid Build Coastguard Worker }
248*35ffd701SAndroid Build Coastguard Worker 
249*35ffd701SAndroid Build Coastguard Worker 
250*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
251*35ffd701SAndroid Build Coastguard Worker /// Calculates the mip offset of given LOD in 2D mip layout
252*35ffd701SAndroid Build Coastguard Worker ///
253*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO,
254*35ffd701SAndroid Build Coastguard Worker ///
255*35ffd701SAndroid Build Coastguard Worker /// @return     offset value in bytes
256*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Get2DTexOffsetAddressPerMip(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)257*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T GmmLib::GmmGen7TextureCalc::Get2DTexOffsetAddressPerMip(GMM_TEXTURE_INFO *pTexInfo,
258*35ffd701SAndroid Build Coastguard Worker                                                                        uint32_t          MipLevel)
259*35ffd701SAndroid Build Coastguard Worker {
260*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T MipOffset;
261*35ffd701SAndroid Build Coastguard Worker     uint32_t       AlignedMipHeight, i, MipHeight, OffsetHeight;
262*35ffd701SAndroid Build Coastguard Worker     uint32_t       HAlign, VAlign;
263*35ffd701SAndroid Build Coastguard Worker     uint32_t       CompressHeight, CompressWidth, CompressDepth;
264*35ffd701SAndroid Build Coastguard Worker     uint8_t        Compress;
265*35ffd701SAndroid Build Coastguard Worker 
266*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
267*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
268*35ffd701SAndroid Build Coastguard Worker 
269*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
270*35ffd701SAndroid Build Coastguard Worker 
271*35ffd701SAndroid Build Coastguard Worker     HAlign = pTexInfo->Alignment.HAlign;
272*35ffd701SAndroid Build Coastguard Worker     VAlign = pTexInfo->Alignment.VAlign;
273*35ffd701SAndroid Build Coastguard Worker 
274*35ffd701SAndroid Build Coastguard Worker     GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
275*35ffd701SAndroid Build Coastguard Worker 
276*35ffd701SAndroid Build Coastguard Worker     Compress = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
277*35ffd701SAndroid Build Coastguard Worker 
278*35ffd701SAndroid Build Coastguard Worker     MipHeight    = pTexInfo->BaseHeight;
279*35ffd701SAndroid Build Coastguard Worker     OffsetHeight = 0;
280*35ffd701SAndroid Build Coastguard Worker 
281*35ffd701SAndroid Build Coastguard Worker     // Mips 0 and 1 are on the left edge...
282*35ffd701SAndroid Build Coastguard Worker     if(MipLevel < 2)
283*35ffd701SAndroid Build Coastguard Worker     {
284*35ffd701SAndroid Build Coastguard Worker         MipOffset = 0;
285*35ffd701SAndroid Build Coastguard Worker     }
286*35ffd701SAndroid Build Coastguard Worker     else // Mip2 and beyond are to the right of Mip1...
287*35ffd701SAndroid Build Coastguard Worker     {
288*35ffd701SAndroid Build Coastguard Worker         uint32_t Mip1Width = GFX_ULONG_CAST(pTexInfo->BaseWidth) >> 1;
289*35ffd701SAndroid Build Coastguard Worker 
290*35ffd701SAndroid Build Coastguard Worker         Mip1Width = __GMM_EXPAND_WIDTH(this, Mip1Width, HAlign, pTexInfo);
291*35ffd701SAndroid Build Coastguard Worker 
292*35ffd701SAndroid Build Coastguard Worker         if(Compress)
293*35ffd701SAndroid Build Coastguard Worker         {
294*35ffd701SAndroid Build Coastguard Worker             Mip1Width /= CompressWidth;
295*35ffd701SAndroid Build Coastguard Worker 
296*35ffd701SAndroid Build Coastguard Worker 	    if((pGmmLibContext->GetWaTable().WaAstcCorruptionForOddCompressedBlockSizeX || pTexInfo->Flags.Wa.CHVAstcSkipVirtualMips) && pPlatform->FormatTable[pTexInfo->Format].ASTC && CompressWidth == 5)
297*35ffd701SAndroid Build Coastguard Worker             {
298*35ffd701SAndroid Build Coastguard Worker                 uint32_t Width1   = (pTexInfo->BaseWidth == 1) ? 1 : (GFX_ULONG_CAST(pTexInfo->BaseWidth) >> 1);
299*35ffd701SAndroid Build Coastguard Worker                 uint32_t Modulo10 = Width1 % 10;
300*35ffd701SAndroid Build Coastguard Worker                 if(Modulo10 >= 1 && Modulo10 <= CompressWidth)
301*35ffd701SAndroid Build Coastguard Worker                 {
302*35ffd701SAndroid Build Coastguard Worker                     Mip1Width += 3;
303*35ffd701SAndroid Build Coastguard Worker                 }
304*35ffd701SAndroid Build Coastguard Worker             }
305*35ffd701SAndroid Build Coastguard Worker         }
306*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Gpu.SeparateStencil)
307*35ffd701SAndroid Build Coastguard Worker         {
308*35ffd701SAndroid Build Coastguard Worker             Mip1Width *= 2;
309*35ffd701SAndroid Build Coastguard Worker         }
310*35ffd701SAndroid Build Coastguard Worker 
311*35ffd701SAndroid Build Coastguard Worker         MipOffset = (GMM_GFX_SIZE_T)Mip1Width * pTexInfo->BitsPerPixel >> 3;
312*35ffd701SAndroid Build Coastguard Worker     }
313*35ffd701SAndroid Build Coastguard Worker 
314*35ffd701SAndroid Build Coastguard Worker     for(i = 1; i <= MipLevel; i++)
315*35ffd701SAndroid Build Coastguard Worker     {
316*35ffd701SAndroid Build Coastguard Worker         AlignedMipHeight = GFX_ULONG_CAST(__GMM_EXPAND_HEIGHT(this, MipHeight, VAlign, pTexInfo));
317*35ffd701SAndroid Build Coastguard Worker 
318*35ffd701SAndroid Build Coastguard Worker         if(Compress)
319*35ffd701SAndroid Build Coastguard Worker         {
320*35ffd701SAndroid Build Coastguard Worker             AlignedMipHeight /= CompressHeight;
321*35ffd701SAndroid Build Coastguard Worker         }
322*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Gpu.SeparateStencil)
323*35ffd701SAndroid Build Coastguard Worker         {
324*35ffd701SAndroid Build Coastguard Worker             AlignedMipHeight /= 2;
325*35ffd701SAndroid Build Coastguard Worker         }
326*35ffd701SAndroid Build Coastguard Worker 
327*35ffd701SAndroid Build Coastguard Worker         OffsetHeight += ((i != 2) ? AlignedMipHeight : 0);
328*35ffd701SAndroid Build Coastguard Worker 
329*35ffd701SAndroid Build Coastguard Worker         MipHeight >>= 1;
330*35ffd701SAndroid Build Coastguard Worker     }
331*35ffd701SAndroid Build Coastguard Worker 
332*35ffd701SAndroid Build Coastguard Worker     MipOffset += OffsetHeight * GFX_ULONG_CAST(pTexInfo->Pitch);
333*35ffd701SAndroid Build Coastguard Worker 
334*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
335*35ffd701SAndroid Build Coastguard Worker     return (MipOffset);
336*35ffd701SAndroid Build Coastguard Worker }
337*35ffd701SAndroid Build Coastguard Worker 
338*35ffd701SAndroid Build Coastguard Worker 
339*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
340*35ffd701SAndroid Build Coastguard Worker /// Calculates height of the 2D mip layout
341*35ffd701SAndroid Build Coastguard Worker ///
342*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO,
343*35ffd701SAndroid Build Coastguard Worker ///
344*35ffd701SAndroid Build Coastguard Worker /// @return     Height of 2D mip layout
345*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Get2DMipMapHeight(GMM_TEXTURE_INFO * pTexInfo)346*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmGen7TextureCalc::Get2DMipMapHeight(GMM_TEXTURE_INFO *pTexInfo)
347*35ffd701SAndroid Build Coastguard Worker {
348*35ffd701SAndroid Build Coastguard Worker     uint32_t Height, BlockHeight, NumLevels; // Final height for 2D surface
349*35ffd701SAndroid Build Coastguard Worker     uint32_t HeightLines, HeightLinesLevel0, HeightLinesLevel1, HeightLinesLevel2;
350*35ffd701SAndroid Build Coastguard Worker     uint32_t VAlign, CompressHeight, CompressWidth, CompressDepth;
351*35ffd701SAndroid Build Coastguard Worker     uint32_t i;
352*35ffd701SAndroid Build Coastguard Worker     uint8_t  Compress;
353*35ffd701SAndroid Build Coastguard Worker 
354*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
355*35ffd701SAndroid Build Coastguard Worker 
356*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
357*35ffd701SAndroid Build Coastguard Worker 
358*35ffd701SAndroid Build Coastguard Worker     // Mip 0 height is needed later
359*35ffd701SAndroid Build Coastguard Worker     Height      = pTexInfo->BaseHeight;
360*35ffd701SAndroid Build Coastguard Worker     Compress    = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
361*35ffd701SAndroid Build Coastguard Worker     NumLevels   = pTexInfo->MaxLod;
362*35ffd701SAndroid Build Coastguard Worker     HeightLines = Height;
363*35ffd701SAndroid Build Coastguard Worker     VAlign      = pTexInfo->Alignment.VAlign;
364*35ffd701SAndroid Build Coastguard Worker     GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
365*35ffd701SAndroid Build Coastguard Worker 
366*35ffd701SAndroid Build Coastguard Worker     HeightLinesLevel0 = __GMM_EXPAND_HEIGHT(this, HeightLines, VAlign, pTexInfo);
367*35ffd701SAndroid Build Coastguard Worker 
368*35ffd701SAndroid Build Coastguard Worker     if(Compress)
369*35ffd701SAndroid Build Coastguard Worker     {
370*35ffd701SAndroid Build Coastguard Worker         HeightLinesLevel0 /= CompressHeight;
371*35ffd701SAndroid Build Coastguard Worker     }
372*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Gpu.SeparateStencil)
373*35ffd701SAndroid Build Coastguard Worker     {
374*35ffd701SAndroid Build Coastguard Worker         HeightLinesLevel0 /= 2;
375*35ffd701SAndroid Build Coastguard Worker     }
376*35ffd701SAndroid Build Coastguard Worker 
377*35ffd701SAndroid Build Coastguard Worker     // Start out with mip0
378*35ffd701SAndroid Build Coastguard Worker     BlockHeight = HeightLinesLevel0;
379*35ffd701SAndroid Build Coastguard Worker 
380*35ffd701SAndroid Build Coastguard Worker     // Height of mip1 and height of all others mips(2,3,4,5,,) needed later
381*35ffd701SAndroid Build Coastguard Worker     HeightLinesLevel1 = HeightLinesLevel2 = 0;
382*35ffd701SAndroid Build Coastguard Worker     for(i = 1; i <= NumLevels; i++)
383*35ffd701SAndroid Build Coastguard Worker     {
384*35ffd701SAndroid Build Coastguard Worker         uint32_t AlignedHeightLines;
385*35ffd701SAndroid Build Coastguard Worker 
386*35ffd701SAndroid Build Coastguard Worker         HeightLines >>= 1;
387*35ffd701SAndroid Build Coastguard Worker 
388*35ffd701SAndroid Build Coastguard Worker         AlignedHeightLines = __GMM_EXPAND_HEIGHT(this, HeightLines, VAlign, pTexInfo);
389*35ffd701SAndroid Build Coastguard Worker 
390*35ffd701SAndroid Build Coastguard Worker         if(Compress)
391*35ffd701SAndroid Build Coastguard Worker         {
392*35ffd701SAndroid Build Coastguard Worker             AlignedHeightLines /= CompressHeight;
393*35ffd701SAndroid Build Coastguard Worker         }
394*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Gpu.SeparateStencil)
395*35ffd701SAndroid Build Coastguard Worker         {
396*35ffd701SAndroid Build Coastguard Worker             AlignedHeightLines /= 2;
397*35ffd701SAndroid Build Coastguard Worker         }
398*35ffd701SAndroid Build Coastguard Worker 
399*35ffd701SAndroid Build Coastguard Worker         if(i == 1)
400*35ffd701SAndroid Build Coastguard Worker         {
401*35ffd701SAndroid Build Coastguard Worker             HeightLinesLevel1 = AlignedHeightLines;
402*35ffd701SAndroid Build Coastguard Worker         }
403*35ffd701SAndroid Build Coastguard Worker         else
404*35ffd701SAndroid Build Coastguard Worker         {
405*35ffd701SAndroid Build Coastguard Worker             HeightLinesLevel2 += AlignedHeightLines;
406*35ffd701SAndroid Build Coastguard Worker         }
407*35ffd701SAndroid Build Coastguard Worker     }
408*35ffd701SAndroid Build Coastguard Worker 
409*35ffd701SAndroid Build Coastguard Worker     // If mip1 height covers all others then that is all we need
410*35ffd701SAndroid Build Coastguard Worker     if(HeightLinesLevel1 >= HeightLinesLevel2)
411*35ffd701SAndroid Build Coastguard Worker     {
412*35ffd701SAndroid Build Coastguard Worker         BlockHeight += GFX_ALIGN_NP2(HeightLinesLevel1, VAlign);
413*35ffd701SAndroid Build Coastguard Worker     }
414*35ffd701SAndroid Build Coastguard Worker     else
415*35ffd701SAndroid Build Coastguard Worker     {
416*35ffd701SAndroid Build Coastguard Worker         BlockHeight += GFX_ALIGN_NP2(HeightLinesLevel2, VAlign);
417*35ffd701SAndroid Build Coastguard Worker     }
418*35ffd701SAndroid Build Coastguard Worker 
419*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
420*35ffd701SAndroid Build Coastguard Worker     return (BlockHeight);
421*35ffd701SAndroid Build Coastguard Worker }
422*35ffd701SAndroid Build Coastguard Worker 
423*35ffd701SAndroid Build Coastguard Worker 
424*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
425*35ffd701SAndroid Build Coastguard Worker /// Calculates the address offset for each mip map of 2D texture and store them
426*35ffd701SAndroid Build Coastguard Worker /// into the GMM_TEXTURE_INFO for surf state programming.
427*35ffd701SAndroid Build Coastguard Worker ///
428*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: pointer to ::GMM_TEXTURE_INFO
429*35ffd701SAndroid Build Coastguard Worker ///
430*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Fill2DTexOffsetAddress(GMM_TEXTURE_INFO * pTexInfo)431*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmGen7TextureCalc::Fill2DTexOffsetAddress(GMM_TEXTURE_INFO *pTexInfo)
432*35ffd701SAndroid Build Coastguard Worker {
433*35ffd701SAndroid Build Coastguard Worker     uint32_t i;
434*35ffd701SAndroid Build Coastguard Worker 
435*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, VOIDRETURN);
436*35ffd701SAndroid Build Coastguard Worker 
437*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
438*35ffd701SAndroid Build Coastguard Worker 
439*35ffd701SAndroid Build Coastguard Worker     // QPitch: Array Element-to-Element, or Cube Face-to-Face Pitch...
440*35ffd701SAndroid Build Coastguard Worker     // -------------------------------------------------------------------------
441*35ffd701SAndroid Build Coastguard Worker     // Note: Gen7 MSAA RT samples stored as contiguous array planes--
442*35ffd701SAndroid Build Coastguard Worker     // e.g. MSAA-4X'ed array elements A and B stored: A0 A1 A2 A3 B0 B1 B2 B3.
443*35ffd701SAndroid Build Coastguard Worker     // However, for GMM's purposes QPitch is still the distance between
444*35ffd701SAndroid Build Coastguard Worker     // elements--not the distance between samples.
445*35ffd701SAndroid Build Coastguard Worker     // -------------------------------------------------------------------------
446*35ffd701SAndroid Build Coastguard Worker     if((pTexInfo->ArraySize <= 1) &&
447*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Type != RESOURCE_CUBE) &&
448*35ffd701SAndroid Build Coastguard Worker        !(pTexInfo->Flags.Gpu.ColorSeparation ||
449*35ffd701SAndroid Build Coastguard Worker          pTexInfo->Flags.Gpu.ColorSeparationRGBX))
450*35ffd701SAndroid Build Coastguard Worker     {
451*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchRender = 0;
452*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchLock   = 0;
453*35ffd701SAndroid Build Coastguard Worker     }
454*35ffd701SAndroid Build Coastguard Worker     else
455*35ffd701SAndroid Build Coastguard Worker     {
456*35ffd701SAndroid Build Coastguard Worker         uint32_t Height, Height0, Height1, ArrayQPitch, VAlign;
457*35ffd701SAndroid Build Coastguard Worker 
458*35ffd701SAndroid Build Coastguard Worker         Height = pTexInfo->BaseHeight;
459*35ffd701SAndroid Build Coastguard Worker 
460*35ffd701SAndroid Build Coastguard Worker         VAlign = pTexInfo->Alignment.VAlign;
461*35ffd701SAndroid Build Coastguard Worker 
462*35ffd701SAndroid Build Coastguard Worker         Height0 = __GMM_EXPAND_HEIGHT(this, Height, VAlign, pTexInfo);
463*35ffd701SAndroid Build Coastguard Worker         Height1 = __GMM_EXPAND_HEIGHT(this, Height >> 1, VAlign, pTexInfo);
464*35ffd701SAndroid Build Coastguard Worker 
465*35ffd701SAndroid Build Coastguard Worker         if(!pTexInfo->Alignment.ArraySpacingSingleLod)
466*35ffd701SAndroid Build Coastguard Worker         {
467*35ffd701SAndroid Build Coastguard Worker             // QPitch = (h0 + h1 + 12j) * pitch
468*35ffd701SAndroid Build Coastguard Worker             ArrayQPitch = Height0 + Height1 + 12 * VAlign;
469*35ffd701SAndroid Build Coastguard Worker         }
470*35ffd701SAndroid Build Coastguard Worker         else // SURFACE_STATE: Surface Array Spacing: ARYSPC_LOD0
471*35ffd701SAndroid Build Coastguard Worker         {
472*35ffd701SAndroid Build Coastguard Worker             // QPitch = h0 * pitch
473*35ffd701SAndroid Build Coastguard Worker             ArrayQPitch = Height0;
474*35ffd701SAndroid Build Coastguard Worker         }
475*35ffd701SAndroid Build Coastguard Worker 
476*35ffd701SAndroid Build Coastguard Worker         if(GmmIsCompressed(pGmmLibContext, pTexInfo->Format))
477*35ffd701SAndroid Build Coastguard Worker         {
478*35ffd701SAndroid Build Coastguard Worker             uint32_t CompressHeight, CompressWidth, CompressDepth;
479*35ffd701SAndroid Build Coastguard Worker 
480*35ffd701SAndroid Build Coastguard Worker             GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
481*35ffd701SAndroid Build Coastguard Worker 
482*35ffd701SAndroid Build Coastguard Worker             ArrayQPitch /= CompressHeight;
483*35ffd701SAndroid Build Coastguard Worker         }
484*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Gpu.SeparateStencil)
485*35ffd701SAndroid Build Coastguard Worker         {
486*35ffd701SAndroid Build Coastguard Worker             ArrayQPitch /= 2;
487*35ffd701SAndroid Build Coastguard Worker         }
488*35ffd701SAndroid Build Coastguard Worker 
489*35ffd701SAndroid Build Coastguard Worker         if((pTexInfo->MSAA.NumSamples > 1) && !(pTexInfo->Flags.Gpu.Depth || pTexInfo->Flags.Gpu.SeparateStencil))
490*35ffd701SAndroid Build Coastguard Worker         {
491*35ffd701SAndroid Build Coastguard Worker             // Gen7 MSAA (non-Depth/Stencil) RT samples stored as array planes;
492*35ffd701SAndroid Build Coastguard Worker             // QPitch still element-to-element, not sample-to-sample.
493*35ffd701SAndroid Build Coastguard Worker             ArrayQPitch *= pTexInfo->MSAA.NumSamples;
494*35ffd701SAndroid Build Coastguard Worker         }
495*35ffd701SAndroid Build Coastguard Worker 
496*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchRender = ArrayQPitch * pTexInfo->Pitch;
497*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchLock   = ArrayQPitch * pTexInfo->Pitch;
498*35ffd701SAndroid Build Coastguard Worker     }
499*35ffd701SAndroid Build Coastguard Worker 
500*35ffd701SAndroid Build Coastguard Worker     for(i = 0; i <= pTexInfo->MaxLod; i++)
501*35ffd701SAndroid Build Coastguard Worker     {
502*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.Texture2DOffsetInfo.Offset[i] = Get2DTexOffsetAddressPerMip(pTexInfo, i);
503*35ffd701SAndroid Build Coastguard Worker     }
504*35ffd701SAndroid Build Coastguard Worker 
505*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
506*35ffd701SAndroid Build Coastguard Worker }
507*35ffd701SAndroid Build Coastguard Worker 
508*35ffd701SAndroid Build Coastguard Worker 
509*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
510*35ffd701SAndroid Build Coastguard Worker /// Calculates total height of an arrayed 3D mip layout
511*35ffd701SAndroid Build Coastguard Worker ///
512*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO,
513*35ffd701SAndroid Build Coastguard Worker ///
514*35ffd701SAndroid Build Coastguard Worker /// @return     height of arrayed 3D mip layout
515*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetTotal3DHeight(GMM_TEXTURE_INFO * pTexInfo)516*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmGen7TextureCalc::GetTotal3DHeight(GMM_TEXTURE_INFO *pTexInfo)
517*35ffd701SAndroid Build Coastguard Worker {
518*35ffd701SAndroid Build Coastguard Worker     uint32_t          AlignedHeight, BlockHeight, Depth;
519*35ffd701SAndroid Build Coastguard Worker     uint8_t           Compressed;
520*35ffd701SAndroid Build Coastguard Worker     uint32_t          i, MipsInThisRow, MipLevel, MipRows;
521*35ffd701SAndroid Build Coastguard Worker     uint32_t          Total3DHeight = 0, UnitAlignHeight;
522*35ffd701SAndroid Build Coastguard Worker     uint32_t          CompressHeight, CompressWidth, CompressDepth;
523*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc;
524*35ffd701SAndroid Build Coastguard Worker 
525*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
526*35ffd701SAndroid Build Coastguard Worker 
527*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(pTexInfo, pGmmLibContext);
528*35ffd701SAndroid Build Coastguard Worker 
529*35ffd701SAndroid Build Coastguard Worker     BlockHeight     = pTexInfo->BaseHeight;
530*35ffd701SAndroid Build Coastguard Worker     Depth           = pTexInfo->Depth;
531*35ffd701SAndroid Build Coastguard Worker     MipLevel        = pTexInfo->MaxLod;
532*35ffd701SAndroid Build Coastguard Worker     UnitAlignHeight = pTexInfo->Alignment.VAlign;
533*35ffd701SAndroid Build Coastguard Worker 
534*35ffd701SAndroid Build Coastguard Worker     Compressed = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
535*35ffd701SAndroid Build Coastguard Worker     pTextureCalc->GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
536*35ffd701SAndroid Build Coastguard Worker 
537*35ffd701SAndroid Build Coastguard Worker     // All mip0s of all planes are stacked together, then mip1s and so on...
538*35ffd701SAndroid Build Coastguard Worker     for(i = 0; i <= MipLevel; i++)
539*35ffd701SAndroid Build Coastguard Worker     {
540*35ffd701SAndroid Build Coastguard Worker         BlockHeight   = GFX_MAX(BlockHeight, UnitAlignHeight);
541*35ffd701SAndroid Build Coastguard Worker         AlignedHeight = GFX_ALIGN(BlockHeight, UnitAlignHeight);
542*35ffd701SAndroid Build Coastguard Worker 
543*35ffd701SAndroid Build Coastguard Worker         if(Compressed)
544*35ffd701SAndroid Build Coastguard Worker         {
545*35ffd701SAndroid Build Coastguard Worker             AlignedHeight /= CompressHeight;
546*35ffd701SAndroid Build Coastguard Worker         }
547*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Gpu.SeparateStencil)
548*35ffd701SAndroid Build Coastguard Worker         {
549*35ffd701SAndroid Build Coastguard Worker             AlignedHeight /= 2;
550*35ffd701SAndroid Build Coastguard Worker         }
551*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Gpu.CCS)
552*35ffd701SAndroid Build Coastguard Worker         {
553*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
554*35ffd701SAndroid Build Coastguard Worker             {
555*35ffd701SAndroid Build Coastguard Worker                 AlignedHeight /= 32;
556*35ffd701SAndroid Build Coastguard Worker             }
557*35ffd701SAndroid Build Coastguard Worker             else if(pTexInfo->Flags.Gpu.__NonMsaaTileXCcs)
558*35ffd701SAndroid Build Coastguard Worker             {
559*35ffd701SAndroid Build Coastguard Worker                 AlignedHeight /= 16;
560*35ffd701SAndroid Build Coastguard Worker             }
561*35ffd701SAndroid Build Coastguard Worker         }
562*35ffd701SAndroid Build Coastguard Worker 
563*35ffd701SAndroid Build Coastguard Worker         // See how many mip can fit in one row
564*35ffd701SAndroid Build Coastguard Worker         MipsInThisRow = GFX_2_TO_POWER_OF(i);
565*35ffd701SAndroid Build Coastguard Worker 
566*35ffd701SAndroid Build Coastguard Worker         // calculate if the mips will spill over to multiple rows
567*35ffd701SAndroid Build Coastguard Worker         MipRows = GFX_CEIL_DIV(GFX_MAX(1, Depth >> i), MipsInThisRow);
568*35ffd701SAndroid Build Coastguard Worker 
569*35ffd701SAndroid Build Coastguard Worker         Total3DHeight += MipRows * AlignedHeight;
570*35ffd701SAndroid Build Coastguard Worker 
571*35ffd701SAndroid Build Coastguard Worker         // next level height
572*35ffd701SAndroid Build Coastguard Worker         BlockHeight >>= 1;
573*35ffd701SAndroid Build Coastguard Worker     }
574*35ffd701SAndroid Build Coastguard Worker 
575*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
576*35ffd701SAndroid Build Coastguard Worker     return Total3DHeight;
577*35ffd701SAndroid Build Coastguard Worker }
578*35ffd701SAndroid Build Coastguard Worker 
579*35ffd701SAndroid Build Coastguard Worker 
580*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
581*35ffd701SAndroid Build Coastguard Worker /// Calculates the address offset for each mip map of 3D texture and store them
582*35ffd701SAndroid Build Coastguard Worker /// into the GMM_TEXTURE_INFO for surf state programming.
583*35ffd701SAndroid Build Coastguard Worker ///
584*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO,
585*35ffd701SAndroid Build Coastguard Worker ///
586*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Fill3DTexOffsetAddress(GMM_TEXTURE_INFO * pTexInfo)587*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmGen7TextureCalc::Fill3DTexOffsetAddress(GMM_TEXTURE_INFO *pTexInfo)
588*35ffd701SAndroid Build Coastguard Worker {
589*35ffd701SAndroid Build Coastguard Worker     uint32_t          AlignedMipHeight, AlignedMipWidth;
590*35ffd701SAndroid Build Coastguard Worker     uint32_t          i, Depth;
591*35ffd701SAndroid Build Coastguard Worker     uint32_t          MipsInThisRow, MipLevel, MipRows;
592*35ffd701SAndroid Build Coastguard Worker     uint32_t          MipHeight, MipWidth;
593*35ffd701SAndroid Build Coastguard Worker     uint32_t          UnitAlignHeight, UnitAlignWidth;
594*35ffd701SAndroid Build Coastguard Worker     uint32_t          CompressHeight, CompressWidth, CompressDepth;
595*35ffd701SAndroid Build Coastguard Worker     uint32_t          OffsetMipRows = 0;
596*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T    OffsetValue;
597*35ffd701SAndroid Build Coastguard Worker     uint8_t           Compress;
598*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc;
599*35ffd701SAndroid Build Coastguard Worker 
600*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pTexInfo);
601*35ffd701SAndroid Build Coastguard Worker 
602*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(pTexInfo, pGmmLibContext);
603*35ffd701SAndroid Build Coastguard Worker 
604*35ffd701SAndroid Build Coastguard Worker     // Assign directly to unaligned MipMap dimension variables
605*35ffd701SAndroid Build Coastguard Worker     // There isn't a need to save original dimensions
606*35ffd701SAndroid Build Coastguard Worker     MipWidth  = GFX_ULONG_CAST(pTexInfo->BaseWidth);
607*35ffd701SAndroid Build Coastguard Worker     MipHeight = pTexInfo->BaseHeight;
608*35ffd701SAndroid Build Coastguard Worker 
609*35ffd701SAndroid Build Coastguard Worker     // Align before we compress
610*35ffd701SAndroid Build Coastguard Worker     UnitAlignWidth  = pTexInfo->Alignment.HAlign;
611*35ffd701SAndroid Build Coastguard Worker     UnitAlignHeight = pTexInfo->Alignment.VAlign;
612*35ffd701SAndroid Build Coastguard Worker     Compress        = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
613*35ffd701SAndroid Build Coastguard Worker     pTextureCalc->GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
614*35ffd701SAndroid Build Coastguard Worker 
615*35ffd701SAndroid Build Coastguard Worker     // Aligned MipMap Dimensions
616*35ffd701SAndroid Build Coastguard Worker     AlignedMipWidth  = GFX_ALIGN(MipWidth, UnitAlignWidth);
617*35ffd701SAndroid Build Coastguard Worker     AlignedMipHeight = GFX_ALIGN(MipHeight, UnitAlignHeight);
618*35ffd701SAndroid Build Coastguard Worker 
619*35ffd701SAndroid Build Coastguard Worker     Depth    = pTexInfo->Depth;
620*35ffd701SAndroid Build Coastguard Worker     MipLevel = pTexInfo->MaxLod;
621*35ffd701SAndroid Build Coastguard Worker 
622*35ffd701SAndroid Build Coastguard Worker     // Start with base offset
623*35ffd701SAndroid Build Coastguard Worker     OffsetValue = 0;
624*35ffd701SAndroid Build Coastguard Worker 
625*35ffd701SAndroid Build Coastguard Worker     // calculate the offset for each Mip level
626*35ffd701SAndroid Build Coastguard Worker     for(i = 0; i <= MipLevel; i++)
627*35ffd701SAndroid Build Coastguard Worker     {
628*35ffd701SAndroid Build Coastguard Worker         // store the value in blockdesc
629*35ffd701SAndroid Build Coastguard Worker         if(Compress)
630*35ffd701SAndroid Build Coastguard Worker         {
631*35ffd701SAndroid Build Coastguard Worker             // If there is compression, compress after the alignment at each level
632*35ffd701SAndroid Build Coastguard Worker             AlignedMipWidth /= CompressWidth;
633*35ffd701SAndroid Build Coastguard Worker             AlignedMipHeight /= CompressHeight;
634*35ffd701SAndroid Build Coastguard Worker         }
635*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Gpu.SeparateStencil)
636*35ffd701SAndroid Build Coastguard Worker         {
637*35ffd701SAndroid Build Coastguard Worker             AlignedMipWidth *= 2;
638*35ffd701SAndroid Build Coastguard Worker             AlignedMipHeight /= 2;
639*35ffd701SAndroid Build Coastguard Worker         }
640*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Gpu.CCS)
641*35ffd701SAndroid Build Coastguard Worker         {
642*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
643*35ffd701SAndroid Build Coastguard Worker             {
644*35ffd701SAndroid Build Coastguard Worker                 switch(pTexInfo->BitsPerPixel)
645*35ffd701SAndroid Build Coastguard Worker                 {
646*35ffd701SAndroid Build Coastguard Worker                     case 32:
647*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 8;
648*35ffd701SAndroid Build Coastguard Worker                         break;
649*35ffd701SAndroid Build Coastguard Worker                     case 64:
650*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 4;
651*35ffd701SAndroid Build Coastguard Worker                         break;
652*35ffd701SAndroid Build Coastguard Worker                     case 128:
653*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 2;
654*35ffd701SAndroid Build Coastguard Worker                         break;
655*35ffd701SAndroid Build Coastguard Worker                     default:
656*35ffd701SAndroid Build Coastguard Worker                         __GMM_ASSERT(0);
657*35ffd701SAndroid Build Coastguard Worker                 }
658*35ffd701SAndroid Build Coastguard Worker 
659*35ffd701SAndroid Build Coastguard Worker                 AlignedMipHeight /= 32;
660*35ffd701SAndroid Build Coastguard Worker             }
661*35ffd701SAndroid Build Coastguard Worker             else if(pTexInfo->Flags.Gpu.__NonMsaaTileXCcs)
662*35ffd701SAndroid Build Coastguard Worker             {
663*35ffd701SAndroid Build Coastguard Worker                 switch(pTexInfo->BitsPerPixel)
664*35ffd701SAndroid Build Coastguard Worker                 {
665*35ffd701SAndroid Build Coastguard Worker                     case 32:
666*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 16;
667*35ffd701SAndroid Build Coastguard Worker                         break;
668*35ffd701SAndroid Build Coastguard Worker                     case 64:
669*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 8;
670*35ffd701SAndroid Build Coastguard Worker                         break;
671*35ffd701SAndroid Build Coastguard Worker                     case 128:
672*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 4;
673*35ffd701SAndroid Build Coastguard Worker                         break;
674*35ffd701SAndroid Build Coastguard Worker                     default:
675*35ffd701SAndroid Build Coastguard Worker                         __GMM_ASSERT(0);
676*35ffd701SAndroid Build Coastguard Worker                 }
677*35ffd701SAndroid Build Coastguard Worker 
678*35ffd701SAndroid Build Coastguard Worker                 AlignedMipHeight /= 16;
679*35ffd701SAndroid Build Coastguard Worker             }
680*35ffd701SAndroid Build Coastguard Worker         }
681*35ffd701SAndroid Build Coastguard Worker 
682*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.Texture3DOffsetInfo.Offset[i] = OffsetValue;
683*35ffd701SAndroid Build Coastguard Worker 
684*35ffd701SAndroid Build Coastguard Worker         // See how many mip can fit in one row
685*35ffd701SAndroid Build Coastguard Worker         MipsInThisRow = GFX_2_TO_POWER_OF(i);
686*35ffd701SAndroid Build Coastguard Worker 
687*35ffd701SAndroid Build Coastguard Worker         // Slice pitch for LOD0
688*35ffd701SAndroid Build Coastguard Worker         if(MipsInThisRow == 1)
689*35ffd701SAndroid Build Coastguard Worker         {
690*35ffd701SAndroid Build Coastguard Worker             pTexInfo->OffsetInfo.Texture3DOffsetInfo.Mip0SlicePitch =
691*35ffd701SAndroid Build Coastguard Worker             AlignedMipHeight * pTexInfo->Pitch;
692*35ffd701SAndroid Build Coastguard Worker         }
693*35ffd701SAndroid Build Coastguard Worker 
694*35ffd701SAndroid Build Coastguard Worker         // calculate if the mips will spill over to multiple rows
695*35ffd701SAndroid Build Coastguard Worker         MipRows = GFX_CEIL_DIV(GFX_MAX(1, Depth >> i), MipsInThisRow);
696*35ffd701SAndroid Build Coastguard Worker 
697*35ffd701SAndroid Build Coastguard Worker         // Offset in terms of height
698*35ffd701SAndroid Build Coastguard Worker         OffsetMipRows += MipRows * AlignedMipHeight;
699*35ffd701SAndroid Build Coastguard Worker 
700*35ffd701SAndroid Build Coastguard Worker         // For a particular mip This is offset of a base slice (i.e. Slice 0)
701*35ffd701SAndroid Build Coastguard Worker         OffsetValue = OffsetMipRows * pTexInfo->Pitch;
702*35ffd701SAndroid Build Coastguard Worker 
703*35ffd701SAndroid Build Coastguard Worker         // next level height
704*35ffd701SAndroid Build Coastguard Worker         MipHeight >>= 1;
705*35ffd701SAndroid Build Coastguard Worker         // Clamp such that mip height is at least1
706*35ffd701SAndroid Build Coastguard Worker         MipHeight        = GFX_MAX(MipHeight, 1);
707*35ffd701SAndroid Build Coastguard Worker         AlignedMipHeight = GFX_ALIGN(MipHeight, UnitAlignHeight);
708*35ffd701SAndroid Build Coastguard Worker 
709*35ffd701SAndroid Build Coastguard Worker         MipWidth >>= 1;
710*35ffd701SAndroid Build Coastguard Worker         // Clamp such that mip width is at least 1
711*35ffd701SAndroid Build Coastguard Worker         MipWidth        = GFX_MAX(MipWidth, 1);
712*35ffd701SAndroid Build Coastguard Worker         AlignedMipWidth = GFX_ALIGN(MipWidth, UnitAlignWidth);
713*35ffd701SAndroid Build Coastguard Worker     }
714*35ffd701SAndroid Build Coastguard Worker }
715*35ffd701SAndroid Build Coastguard Worker 
716*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
717*35ffd701SAndroid Build Coastguard Worker /// Calculates the 3D offset and QPitch for surface state programming.
718*35ffd701SAndroid Build Coastguard Worker ///
719*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO,
720*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pRestrictions: ptr to surface alignment and size restrictions
721*35ffd701SAndroid Build Coastguard Worker ///
722*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
723*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTex3D(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)724*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen7TextureCalc::FillTex3D(GMM_TEXTURE_INFO * pTexInfo,
725*35ffd701SAndroid Build Coastguard Worker                                                              __GMM_BUFFER_TYPE *pRestrictions)
726*35ffd701SAndroid Build Coastguard Worker {
727*35ffd701SAndroid Build Coastguard Worker     uint32_t   AlignedMipWidth;
728*35ffd701SAndroid Build Coastguard Worker     uint32_t   BitsPerPixel;
729*35ffd701SAndroid Build Coastguard Worker     uint32_t   Depth, Height, Width;
730*35ffd701SAndroid Build Coastguard Worker     uint32_t   i, MipsInThisRow, MipWidth;
731*35ffd701SAndroid Build Coastguard Worker     uint32_t   RenderPitch = 0, ThisRowPitch;
732*35ffd701SAndroid Build Coastguard Worker     uint32_t   UnitAlignWidth;
733*35ffd701SAndroid Build Coastguard Worker     uint32_t   Total3DHeight;
734*35ffd701SAndroid Build Coastguard Worker     uint32_t   WidthBytesPhysical;
735*35ffd701SAndroid Build Coastguard Worker     uint8_t    Compress;
736*35ffd701SAndroid Build Coastguard Worker     uint32_t   CompressHeight, CompressWidth, CompressDepth;
737*35ffd701SAndroid Build Coastguard Worker     bool       SeparateStencil;
738*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS Status;
739*35ffd701SAndroid Build Coastguard Worker 
740*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
741*35ffd701SAndroid Build Coastguard Worker 
742*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
743*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pRestrictions, GMM_ERROR);
744*35ffd701SAndroid Build Coastguard Worker 
745*35ffd701SAndroid Build Coastguard Worker     const __GMM_PLATFORM_RESOURCE *pPlatformResource = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
746*35ffd701SAndroid Build Coastguard Worker 
747*35ffd701SAndroid Build Coastguard Worker     BitsPerPixel = pTexInfo->BitsPerPixel;
748*35ffd701SAndroid Build Coastguard Worker     Height       = pTexInfo->BaseHeight;
749*35ffd701SAndroid Build Coastguard Worker     Width        = GFX_ULONG_CAST(pTexInfo->BaseWidth);
750*35ffd701SAndroid Build Coastguard Worker     Depth        = pTexInfo->Depth;
751*35ffd701SAndroid Build Coastguard Worker 
752*35ffd701SAndroid Build Coastguard Worker     // Align before we compress
753*35ffd701SAndroid Build Coastguard Worker     UnitAlignWidth = pTexInfo->Alignment.HAlign;
754*35ffd701SAndroid Build Coastguard Worker     Compress       = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
755*35ffd701SAndroid Build Coastguard Worker     GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
756*35ffd701SAndroid Build Coastguard Worker     SeparateStencil = pTexInfo->Flags.Gpu.SeparateStencil ? true : false;
757*35ffd701SAndroid Build Coastguard Worker 
758*35ffd701SAndroid Build Coastguard Worker     // Unaligned MipMap dimension variables
759*35ffd701SAndroid Build Coastguard Worker     MipWidth = Width;
760*35ffd701SAndroid Build Coastguard Worker 
761*35ffd701SAndroid Build Coastguard Worker     // Aligned MipMap dimension variables
762*35ffd701SAndroid Build Coastguard Worker     AlignedMipWidth = GFX_ALIGN(MipWidth, UnitAlignWidth);
763*35ffd701SAndroid Build Coastguard Worker 
764*35ffd701SAndroid Build Coastguard Worker     // Calculate the render pitch exactly the same way we do the
765*35ffd701SAndroid Build Coastguard Worker     // offset for each Mip level
766*35ffd701SAndroid Build Coastguard Worker     for(i = 0; i <= pTexInfo->MaxLod; i++)
767*35ffd701SAndroid Build Coastguard Worker     {
768*35ffd701SAndroid Build Coastguard Worker         if(Compress)
769*35ffd701SAndroid Build Coastguard Worker         {
770*35ffd701SAndroid Build Coastguard Worker             // If there is compression, compress after the alignment at each level
771*35ffd701SAndroid Build Coastguard Worker             AlignedMipWidth /= CompressWidth;
772*35ffd701SAndroid Build Coastguard Worker         }
773*35ffd701SAndroid Build Coastguard Worker         else if(SeparateStencil)
774*35ffd701SAndroid Build Coastguard Worker         {
775*35ffd701SAndroid Build Coastguard Worker             AlignedMipWidth *= 2;
776*35ffd701SAndroid Build Coastguard Worker         }
777*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Flags.Gpu.CCS)
778*35ffd701SAndroid Build Coastguard Worker         {
779*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
780*35ffd701SAndroid Build Coastguard Worker             {
781*35ffd701SAndroid Build Coastguard Worker                 switch(BitsPerPixel)
782*35ffd701SAndroid Build Coastguard Worker                 {
783*35ffd701SAndroid Build Coastguard Worker                     case 32:
784*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 8;
785*35ffd701SAndroid Build Coastguard Worker                         break;
786*35ffd701SAndroid Build Coastguard Worker                     case 64:
787*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 4;
788*35ffd701SAndroid Build Coastguard Worker                         break;
789*35ffd701SAndroid Build Coastguard Worker                     case 128:
790*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 2;
791*35ffd701SAndroid Build Coastguard Worker                         break;
792*35ffd701SAndroid Build Coastguard Worker                     default:
793*35ffd701SAndroid Build Coastguard Worker                         __GMM_ASSERT(0);
794*35ffd701SAndroid Build Coastguard Worker                 }
795*35ffd701SAndroid Build Coastguard Worker             }
796*35ffd701SAndroid Build Coastguard Worker             else if(pTexInfo->Flags.Gpu.__NonMsaaTileXCcs)
797*35ffd701SAndroid Build Coastguard Worker             {
798*35ffd701SAndroid Build Coastguard Worker                 switch(BitsPerPixel)
799*35ffd701SAndroid Build Coastguard Worker                 {
800*35ffd701SAndroid Build Coastguard Worker                     case 32:
801*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 16;
802*35ffd701SAndroid Build Coastguard Worker                         break;
803*35ffd701SAndroid Build Coastguard Worker                     case 64:
804*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 8;
805*35ffd701SAndroid Build Coastguard Worker                         break;
806*35ffd701SAndroid Build Coastguard Worker                     case 128:
807*35ffd701SAndroid Build Coastguard Worker                         AlignedMipWidth /= 4;
808*35ffd701SAndroid Build Coastguard Worker                         break;
809*35ffd701SAndroid Build Coastguard Worker                     default:
810*35ffd701SAndroid Build Coastguard Worker                         __GMM_ASSERT(0);
811*35ffd701SAndroid Build Coastguard Worker                 }
812*35ffd701SAndroid Build Coastguard Worker             }
813*35ffd701SAndroid Build Coastguard Worker         }
814*35ffd701SAndroid Build Coastguard Worker 
815*35ffd701SAndroid Build Coastguard Worker         // See how many mip can fit in one row
816*35ffd701SAndroid Build Coastguard Worker         MipsInThisRow = GFX_2_TO_POWER_OF(i);
817*35ffd701SAndroid Build Coastguard Worker 
818*35ffd701SAndroid Build Coastguard Worker         // LOD planes may be less than MipsInThisRow, take the smaller value for pitch
819*35ffd701SAndroid Build Coastguard Worker         MipsInThisRow = GFX_MIN(GFX_MAX(1, (Depth >> i)), MipsInThisRow);
820*35ffd701SAndroid Build Coastguard Worker         ThisRowPitch  = AlignedMipWidth * MipsInThisRow;
821*35ffd701SAndroid Build Coastguard Worker 
822*35ffd701SAndroid Build Coastguard Worker         // Default pitch
823*35ffd701SAndroid Build Coastguard Worker         WidthBytesPhysical = ThisRowPitch * BitsPerPixel >> 3;
824*35ffd701SAndroid Build Coastguard Worker 
825*35ffd701SAndroid Build Coastguard Worker         if(RenderPitch < WidthBytesPhysical)
826*35ffd701SAndroid Build Coastguard Worker         {
827*35ffd701SAndroid Build Coastguard Worker             RenderPitch = WidthBytesPhysical;
828*35ffd701SAndroid Build Coastguard Worker         }
829*35ffd701SAndroid Build Coastguard Worker 
830*35ffd701SAndroid Build Coastguard Worker         MipWidth >>= 1;
831*35ffd701SAndroid Build Coastguard Worker         // Clamp such that mip width is at least 1
832*35ffd701SAndroid Build Coastguard Worker         MipWidth        = GFX_MAX(MipWidth, 1);
833*35ffd701SAndroid Build Coastguard Worker         AlignedMipWidth = GFX_ALIGN(MipWidth, UnitAlignWidth);
834*35ffd701SAndroid Build Coastguard Worker     }
835*35ffd701SAndroid Build Coastguard Worker 
836*35ffd701SAndroid Build Coastguard Worker     WidthBytesPhysical = RenderPitch;
837*35ffd701SAndroid Build Coastguard Worker 
838*35ffd701SAndroid Build Coastguard Worker     // Make sure the pitch satisfy linear min pitch requirment
839*35ffd701SAndroid Build Coastguard Worker     WidthBytesPhysical = GFX_MAX(WidthBytesPhysical,
840*35ffd701SAndroid Build Coastguard Worker                                  pRestrictions->MinPitch);
841*35ffd701SAndroid Build Coastguard Worker 
842*35ffd701SAndroid Build Coastguard Worker     // Make sure pitch satisfy alignment restriction
843*35ffd701SAndroid Build Coastguard Worker     WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical,
844*35ffd701SAndroid Build Coastguard Worker                                    pRestrictions->PitchAlignment);
845*35ffd701SAndroid Build Coastguard Worker 
846*35ffd701SAndroid Build Coastguard Worker     // Get Total height for the entire 3D texture
847*35ffd701SAndroid Build Coastguard Worker     Total3DHeight = GetTotal3DHeight(pTexInfo);
848*35ffd701SAndroid Build Coastguard Worker 
849*35ffd701SAndroid Build Coastguard Worker     if(GMM_IS_TILED(pPlatformResource->TileInfo[pTexInfo->TileMode]))
850*35ffd701SAndroid Build Coastguard Worker     {
851*35ffd701SAndroid Build Coastguard Worker         // Align to tile boundary
852*35ffd701SAndroid Build Coastguard Worker         Total3DHeight = GFX_ALIGN(Total3DHeight,
853*35ffd701SAndroid Build Coastguard Worker                                   pPlatformResource->TileInfo[pTexInfo->TileMode].LogicalTileHeight);
854*35ffd701SAndroid Build Coastguard Worker         WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical,
855*35ffd701SAndroid Build Coastguard Worker                                        pPlatformResource->TileInfo[pTexInfo->TileMode].LogicalTileWidth);
856*35ffd701SAndroid Build Coastguard Worker     }
857*35ffd701SAndroid Build Coastguard Worker 
858*35ffd701SAndroid Build Coastguard Worker     // If a texture is YUV packed, 96, or 48 bpp then one row plus 16 bytes of
859*35ffd701SAndroid Build Coastguard Worker     // padding needs to be added. Since this will create a none pitch aligned
860*35ffd701SAndroid Build Coastguard Worker     // surface the padding is aligned to the next row
861*35ffd701SAndroid Build Coastguard Worker     if(GmmIsYUVPacked(pTexInfo->Format) ||
862*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->BitsPerPixel == GMM_BITS(96)) ||
863*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->BitsPerPixel == GMM_BITS(48)))
864*35ffd701SAndroid Build Coastguard Worker     {
865*35ffd701SAndroid Build Coastguard Worker         Total3DHeight += GMM_SCANLINES(1) + GFX_CEIL_DIV(GMM_BYTES(16), WidthBytesPhysical);
866*35ffd701SAndroid Build Coastguard Worker     }
867*35ffd701SAndroid Build Coastguard Worker 
868*35ffd701SAndroid Build Coastguard Worker     Total3DHeight = GFX_ALIGN(Total3DHeight, __GMM_EVEN_ROW);
869*35ffd701SAndroid Build Coastguard Worker 
870*35ffd701SAndroid Build Coastguard Worker     if((Status = // <-- Note assignment.
871*35ffd701SAndroid Build Coastguard Worker         FillTexPitchAndSize(
872*35ffd701SAndroid Build Coastguard Worker         pTexInfo, WidthBytesPhysical, Total3DHeight, pRestrictions)) == GMM_SUCCESS)
873*35ffd701SAndroid Build Coastguard Worker     {
874*35ffd701SAndroid Build Coastguard Worker         Fill3DTexOffsetAddress(pTexInfo);
875*35ffd701SAndroid Build Coastguard Worker     }
876*35ffd701SAndroid Build Coastguard Worker 
877*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
878*35ffd701SAndroid Build Coastguard Worker     return (Status);
879*35ffd701SAndroid Build Coastguard Worker }
880*35ffd701SAndroid Build Coastguard Worker 
881*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
882*35ffd701SAndroid Build Coastguard Worker /// Allocates the 1D mip layout for surface state programming.
883*35ffd701SAndroid Build Coastguard Worker ///
884*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO,
885*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pRestrictions: ptr to surface alignment and size restrictions
886*35ffd701SAndroid Build Coastguard Worker ///
887*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
888*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTex1D(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)889*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen7TextureCalc::FillTex1D(GMM_TEXTURE_INFO * pTexInfo,
890*35ffd701SAndroid Build Coastguard Worker                                                              __GMM_BUFFER_TYPE *pRestrictions)
891*35ffd701SAndroid Build Coastguard Worker {
892*35ffd701SAndroid Build Coastguard Worker     return FillTex2D(pTexInfo, pRestrictions);
893*35ffd701SAndroid Build Coastguard Worker }
894*35ffd701SAndroid Build Coastguard Worker 
895*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
896*35ffd701SAndroid Build Coastguard Worker /// Calculates the cube layout for surface state programming.
897*35ffd701SAndroid Build Coastguard Worker ///
898*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO,
899*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pRestrictions: ptr to surface alignment and size restrictions
900*35ffd701SAndroid Build Coastguard Worker ///
901*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
902*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTexCube(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)903*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen7TextureCalc::FillTexCube(GMM_TEXTURE_INFO * pTexInfo,
904*35ffd701SAndroid Build Coastguard Worker                                                                __GMM_BUFFER_TYPE *pRestrictions)
905*35ffd701SAndroid Build Coastguard Worker {
906*35ffd701SAndroid Build Coastguard Worker     return FillTex2D(pTexInfo, pRestrictions);
907*35ffd701SAndroid Build Coastguard Worker }
908