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