1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2019 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
24*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
25*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/Texture/GmmGen10TextureCalc.h"
26*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/Texture/GmmGen11TextureCalc.h"
27*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/Texture/GmmGen12TextureCalc.h"
28*35ffd701SAndroid Build Coastguard Worker
29*35ffd701SAndroid Build Coastguard Worker GMM_MIPTAIL_SLOT_OFFSET MipTailSlotOffset1DSurface[15][5] = GEN11_MIPTAIL_SLOT_OFFSET_1D_SURFACE;
30*35ffd701SAndroid Build Coastguard Worker GMM_MIPTAIL_SLOT_OFFSET MipTailSlotOffset2DSurface[15][5] = GEN11_MIPTAIL_SLOT_OFFSET_2D_SURFACE;
31*35ffd701SAndroid Build Coastguard Worker GMM_MIPTAIL_SLOT_OFFSET MipTailSlotOffset3DSurface[15][5] = GEN11_MIPTAIL_SLOT_OFFSET_3D_SURFACE;
32*35ffd701SAndroid Build Coastguard Worker
33*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
34*35ffd701SAndroid Build Coastguard Worker /// Calculates height of the 2D mip layout on Gen9
35*35ffd701SAndroid Build Coastguard Worker ///
36*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
37*35ffd701SAndroid Build Coastguard Worker ///
38*35ffd701SAndroid Build Coastguard Worker /// @return height of 2D mip layout
39*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Get2DMipMapHeight(GMM_TEXTURE_INFO * pTexInfo)40*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmGen12TextureCalc::Get2DMipMapHeight(GMM_TEXTURE_INFO *pTexInfo)
41*35ffd701SAndroid Build Coastguard Worker {
42*35ffd701SAndroid Build Coastguard Worker uint32_t BlockHeight, MipHeight;
43*35ffd701SAndroid Build Coastguard Worker uint32_t HeightLinesLevel0, HeightLinesLevel1, HeightLinesLevel2;
44*35ffd701SAndroid Build Coastguard Worker uint32_t i, MipLevel, VAlign, CompressHeight, CompressWidth, CompressDepth;
45*35ffd701SAndroid Build Coastguard Worker uint8_t Compressed;
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 Compressed = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
51*35ffd701SAndroid Build Coastguard Worker MipHeight = pTexInfo->BaseHeight;
52*35ffd701SAndroid Build Coastguard Worker MipLevel = pTexInfo->MaxLod;
53*35ffd701SAndroid Build Coastguard Worker VAlign = pTexInfo->Alignment.VAlign;
54*35ffd701SAndroid Build Coastguard Worker GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
55*35ffd701SAndroid Build Coastguard Worker
56*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel0 = __GMM_EXPAND_HEIGHT(this, MipHeight, VAlign, pTexInfo);
57*35ffd701SAndroid Build Coastguard Worker
58*35ffd701SAndroid Build Coastguard Worker if(Compressed)
59*35ffd701SAndroid Build Coastguard Worker {
60*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel0 /= CompressHeight;
61*35ffd701SAndroid Build Coastguard Worker }
62*35ffd701SAndroid Build Coastguard Worker
63*35ffd701SAndroid Build Coastguard Worker // Mip0 height...
64*35ffd701SAndroid Build Coastguard Worker BlockHeight = HeightLinesLevel0;
65*35ffd701SAndroid Build Coastguard Worker
66*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) &&
67*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Alignment.MipTailStartLod == 0) || (pTexInfo->MaxLod == 0)))
68*35ffd701SAndroid Build Coastguard Worker {
69*35ffd701SAndroid Build Coastguard Worker // Do nothing. Height is already aligned.
70*35ffd701SAndroid Build Coastguard Worker }
71*35ffd701SAndroid Build Coastguard Worker else
72*35ffd701SAndroid Build Coastguard Worker {
73*35ffd701SAndroid Build Coastguard Worker // Height of Mip1 and Mip2..n needed later...
74*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel1 = HeightLinesLevel2 = 0;
75*35ffd701SAndroid Build Coastguard Worker for(i = 1; i <= MipLevel; i++)
76*35ffd701SAndroid Build Coastguard Worker {
77*35ffd701SAndroid Build Coastguard Worker uint32_t AlignedHeightLines;
78*35ffd701SAndroid Build Coastguard Worker
79*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) &&
80*35ffd701SAndroid Build Coastguard Worker (i == pTexInfo->Alignment.MipTailStartLod))
81*35ffd701SAndroid Build Coastguard Worker {
82*35ffd701SAndroid Build Coastguard Worker AlignedHeightLines = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight;
83*35ffd701SAndroid Build Coastguard Worker
84*35ffd701SAndroid Build Coastguard Worker if(i == 1)
85*35ffd701SAndroid Build Coastguard Worker {
86*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel1 = AlignedHeightLines;
87*35ffd701SAndroid Build Coastguard Worker }
88*35ffd701SAndroid Build Coastguard Worker else
89*35ffd701SAndroid Build Coastguard Worker {
90*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel2 += AlignedHeightLines;
91*35ffd701SAndroid Build Coastguard Worker }
92*35ffd701SAndroid Build Coastguard Worker
93*35ffd701SAndroid Build Coastguard Worker break;
94*35ffd701SAndroid Build Coastguard Worker }
95*35ffd701SAndroid Build Coastguard Worker else
96*35ffd701SAndroid Build Coastguard Worker {
97*35ffd701SAndroid Build Coastguard Worker MipHeight = GmmTexGetMipHeight(pTexInfo, i);
98*35ffd701SAndroid Build Coastguard Worker
99*35ffd701SAndroid Build Coastguard Worker AlignedHeightLines = __GMM_EXPAND_HEIGHT(this, MipHeight, VAlign, pTexInfo);
100*35ffd701SAndroid Build Coastguard Worker
101*35ffd701SAndroid Build Coastguard Worker if(Compressed)
102*35ffd701SAndroid Build Coastguard Worker {
103*35ffd701SAndroid Build Coastguard Worker AlignedHeightLines /= CompressHeight;
104*35ffd701SAndroid Build Coastguard Worker }
105*35ffd701SAndroid Build Coastguard Worker
106*35ffd701SAndroid Build Coastguard Worker if(i == 1)
107*35ffd701SAndroid Build Coastguard Worker {
108*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel1 = AlignedHeightLines;
109*35ffd701SAndroid Build Coastguard Worker }
110*35ffd701SAndroid Build Coastguard Worker else
111*35ffd701SAndroid Build Coastguard Worker {
112*35ffd701SAndroid Build Coastguard Worker HeightLinesLevel2 += AlignedHeightLines;
113*35ffd701SAndroid Build Coastguard Worker }
114*35ffd701SAndroid Build Coastguard Worker }
115*35ffd701SAndroid Build Coastguard Worker }
116*35ffd701SAndroid Build Coastguard Worker
117*35ffd701SAndroid Build Coastguard Worker // If Mip1 height covers all others, then that is all we need...
118*35ffd701SAndroid Build Coastguard Worker if(!(pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)))
119*35ffd701SAndroid Build Coastguard Worker {
120*35ffd701SAndroid Build Coastguard Worker if(HeightLinesLevel1 >= HeightLinesLevel2)
121*35ffd701SAndroid Build Coastguard Worker {
122*35ffd701SAndroid Build Coastguard Worker BlockHeight += GFX_ALIGN(HeightLinesLevel1, VAlign);
123*35ffd701SAndroid Build Coastguard Worker }
124*35ffd701SAndroid Build Coastguard Worker else
125*35ffd701SAndroid Build Coastguard Worker {
126*35ffd701SAndroid Build Coastguard Worker BlockHeight += GFX_ALIGN(HeightLinesLevel2, VAlign);
127*35ffd701SAndroid Build Coastguard Worker }
128*35ffd701SAndroid Build Coastguard Worker }
129*35ffd701SAndroid Build Coastguard Worker else
130*35ffd701SAndroid Build Coastguard Worker {
131*35ffd701SAndroid Build Coastguard Worker //TR mode- requires TileMode height alignment
132*35ffd701SAndroid Build Coastguard Worker BlockHeight += (HeightLinesLevel1 >= HeightLinesLevel2) ? HeightLinesLevel1 : HeightLinesLevel2;
133*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_ALIGN(BlockHeight, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight);
134*35ffd701SAndroid Build Coastguard Worker }
135*35ffd701SAndroid Build Coastguard Worker }
136*35ffd701SAndroid Build Coastguard Worker
137*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
138*35ffd701SAndroid Build Coastguard Worker
139*35ffd701SAndroid Build Coastguard Worker return (BlockHeight);
140*35ffd701SAndroid Build Coastguard Worker }
141*35ffd701SAndroid Build Coastguard Worker
142*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
143*35ffd701SAndroid Build Coastguard Worker /// Calculates Linear CCS size from main surface size
144*35ffd701SAndroid Build Coastguard Worker ///
145*35ffd701SAndroid Build Coastguard Worker /// @param[in] pSurf: ptr to ::GMM_TEXTURE_INFO of main surface
146*35ffd701SAndroid Build Coastguard Worker /// @param[in] pAuxTexInfo: ptr to ::GMM_TEXTURE_INFO of Aux surface
147*35ffd701SAndroid Build Coastguard Worker ///
148*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTexCCS(GMM_TEXTURE_INFO * pSurf,GMM_TEXTURE_INFO * pAuxTexInfo)149*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmGen12TextureCalc::FillTexCCS(GMM_TEXTURE_INFO *pSurf,
150*35ffd701SAndroid Build Coastguard Worker GMM_TEXTURE_INFO *pAuxTexInfo)
151*35ffd701SAndroid Build Coastguard Worker {
152*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetSkuTable().FtrFlatPhysCCS && !pSurf->Flags.Gpu.ProceduralTexture)
153*35ffd701SAndroid Build Coastguard Worker {
154*35ffd701SAndroid Build Coastguard Worker //No CCS allocation for lossless compression (exclude AMFS CCS).
155*35ffd701SAndroid Build Coastguard Worker return GMM_SUCCESS;
156*35ffd701SAndroid Build Coastguard Worker }
157*35ffd701SAndroid Build Coastguard Worker else if(pAuxTexInfo->Flags.Gpu.__NonMsaaLinearCCS)
158*35ffd701SAndroid Build Coastguard Worker {
159*35ffd701SAndroid Build Coastguard Worker GMM_TEXTURE_INFO Surf = *pSurf;
160*35ffd701SAndroid Build Coastguard Worker uint32_t Depth;
161*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pSurf, pGmmLibContext);
162*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Flags.Info.TiledW = 0;
163*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Flags.Info.TiledYf = 0;
164*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Flags.Info.TiledX = 0;
165*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Flags.Info.Linear = 1;
166*35ffd701SAndroid Build Coastguard Worker GMM_SET_64KB_TILE(pAuxTexInfo->Flags, 0, pGmmLibContext);
167*35ffd701SAndroid Build Coastguard Worker GMM_SET_4KB_TILE(pAuxTexInfo->Flags, 0, pGmmLibContext);
168*35ffd701SAndroid Build Coastguard Worker
169*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->ArraySize = Surf.ArraySize;
170*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Alignment = {0};
171*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->BitsPerPixel = 8;
172*35ffd701SAndroid Build Coastguard Worker Depth = (Surf.Depth > 0) ? Surf.Depth : 1; // Depth = 0 needs to be handled gracefully
173*35ffd701SAndroid Build Coastguard Worker uint32_t ExpandedArraySize =
174*35ffd701SAndroid Build Coastguard Worker GFX_MAX(Surf.ArraySize, 1) *
175*35ffd701SAndroid Build Coastguard Worker ((Surf.Type == RESOURCE_CUBE) ? 6 : 1) * // Cubemaps simply 6-element, 2D arrays.
176*35ffd701SAndroid Build Coastguard Worker ((Surf.Type == RESOURCE_3D) ? Depth : 1) * // 3D's simply 2D arrays for sizing.
177*35ffd701SAndroid Build Coastguard Worker ((Surf.Flags.Gpu.Depth || Surf.Flags.Gpu.SeparateStencil ||
178*35ffd701SAndroid Build Coastguard Worker GMM_IS_64KB_TILE(Surf.Flags) || Surf.Flags.Info.TiledYf) ?
179*35ffd701SAndroid Build Coastguard Worker 1 :
180*35ffd701SAndroid Build Coastguard Worker Surf.MSAA.NumSamples) * // MSAA (non-Depth/Stencil) RT samples stored as array planes.
181*35ffd701SAndroid Build Coastguard Worker ((GMM_IS_64KB_TILE(Surf.Flags) && !pGmmLibContext->GetSkuTable().FtrTileY && !pGmmLibContext->GetSkuTable().FtrXe2PlusTiling && (Surf.MSAA.NumSamples == 16)) ? 4 : // MSAA x8/x16 stored as pseudo array planes each with 4x samples
182*35ffd701SAndroid Build Coastguard Worker (GMM_IS_64KB_TILE(Surf.Flags) && !pGmmLibContext->GetSkuTable().FtrTileY && !pGmmLibContext->GetSkuTable().FtrXe2PlusTiling && (Surf.MSAA.NumSamples == 8)) ? 2 :
183*35ffd701SAndroid Build Coastguard Worker 1);
184*35ffd701SAndroid Build Coastguard Worker
185*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_64KB_TILE(Surf.Flags) || Surf.Flags.Info.TiledYf)
186*35ffd701SAndroid Build Coastguard Worker {
187*35ffd701SAndroid Build Coastguard Worker ExpandedArraySize = GFX_ALIGN(ExpandedArraySize, pPlatform->TileInfo[Surf.TileMode].LogicalTileDepth);
188*35ffd701SAndroid Build Coastguard Worker }
189*35ffd701SAndroid Build Coastguard Worker
190*35ffd701SAndroid Build Coastguard Worker if(GmmIsUVPacked(Surf.Format))
191*35ffd701SAndroid Build Coastguard Worker {
192*35ffd701SAndroid Build Coastguard Worker uint64_t YCcsSize = GFX_ALIGN((Surf.OffsetInfo.Plane.Y[GMM_PLANE_U] * Surf.Pitch), GMM_KBYTE(16)) >> 8;
193*35ffd701SAndroid Build Coastguard Worker YCcsSize = GFX_ALIGN(YCcsSize, PAGE_SIZE);
194*35ffd701SAndroid Build Coastguard Worker
195*35ffd701SAndroid Build Coastguard Worker uint64_t PlanarSize = (Surf.ArraySize > 1) ? (Surf.OffsetInfo.Plane.ArrayQPitch) : Surf.Size;
196*35ffd701SAndroid Build Coastguard Worker
197*35ffd701SAndroid Build Coastguard Worker uint64_t UVCcsSize = GFX_ALIGN(PlanarSize - (Surf.OffsetInfo.Plane.Y[GMM_PLANE_U] * Surf.Pitch), GMM_KBYTE(16)) >> 8;
198*35ffd701SAndroid Build Coastguard Worker if(UVCcsSize == 0)
199*35ffd701SAndroid Build Coastguard Worker {
200*35ffd701SAndroid Build Coastguard Worker //GMM_ASSERTDPF(UVCcsSize != 0, "Incorrect Planar Surface Size"); //Redescription of Yf/Ys planar surface P010 hits it (debug required?)
201*35ffd701SAndroid Build Coastguard Worker UVCcsSize = 1;
202*35ffd701SAndroid Build Coastguard Worker }
203*35ffd701SAndroid Build Coastguard Worker UVCcsSize = GFX_ALIGN_NP2(UVCcsSize, PAGE_SIZE);
204*35ffd701SAndroid Build Coastguard Worker
205*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.X[GMM_PLANE_Y] = 0;
206*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_Y] = 0;
207*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.X[GMM_PLANE_U] = YCcsSize; //Being Linear CCS, fill X-offset - Test GetAuxOffset UV_CCS is proper
208*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_U] = 0;
209*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.X[GMM_PLANE_V] = YCcsSize; //Being Linear CCS, fill X-offset
210*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_V] = 0;
211*35ffd701SAndroid Build Coastguard Worker
212*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.ArrayQPitch = YCcsSize + UVCcsSize;
213*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Size = pAuxTexInfo->OffsetInfo.Plane.ArrayQPitch * ((Surf.ArraySize > 1) ? (Surf.ArraySize) : 1);
214*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Alignment.QPitch = GFX_ULONG_CAST(pAuxTexInfo->Size) / ExpandedArraySize;
215*35ffd701SAndroid Build Coastguard Worker }
216*35ffd701SAndroid Build Coastguard Worker else if(GmmIsPlanar(Surf.Format))
217*35ffd701SAndroid Build Coastguard Worker {
218*35ffd701SAndroid Build Coastguard Worker //Doesn't require separate Aux surfaces since not displayable. Page-alignment ensures
219*35ffd701SAndroid Build Coastguard Worker //each hybrid plane is 4k-aligned, hence gets unique AuxT.L1e
220*35ffd701SAndroid Build Coastguard Worker uint64_t PlanarSize = (Surf.ArraySize > 1) ? (Surf.OffsetInfo.Plane.ArrayQPitch) : Surf.Size;
221*35ffd701SAndroid Build Coastguard Worker uint64_t CcsSize = GFX_ALIGN(PlanarSize, GMM_KBYTE(16)) >> 8;
222*35ffd701SAndroid Build Coastguard Worker CcsSize = GFX_ALIGN(CcsSize, PAGE_SIZE);
223*35ffd701SAndroid Build Coastguard Worker
224*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.X[GMM_PLANE_Y] = 0;
225*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_Y] = 0;
226*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.X[GMM_PLANE_U] = GFX_ALIGN(Surf.OffsetInfo.Plane.Y[GMM_PLANE_U] * Surf.Pitch, GMM_KBYTE(16)) >> 8; //Being Linear CCS, fill X-offset - Test GetAuxOffset UV_CCS is proper
227*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_U] = 0;
228*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.X[GMM_PLANE_V] = GFX_ALIGN(Surf.OffsetInfo.Plane.Y[GMM_PLANE_V] * Surf.Pitch, GMM_KBYTE(16)) >> 8; //Being Linear CCS, fill X-offset
229*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_V] = 0;
230*35ffd701SAndroid Build Coastguard Worker
231*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->OffsetInfo.Plane.ArrayQPitch = CcsSize;
232*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Size = pAuxTexInfo->OffsetInfo.Plane.ArrayQPitch *
233*35ffd701SAndroid Build Coastguard Worker ((Surf.ArraySize > 1) ? (Surf.ArraySize) : 1);
234*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Alignment.QPitch = GFX_ULONG_CAST(pAuxTexInfo->Size) / ExpandedArraySize;
235*35ffd701SAndroid Build Coastguard Worker }
236*35ffd701SAndroid Build Coastguard Worker else
237*35ffd701SAndroid Build Coastguard Worker {
238*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Size = (GFX_ALIGN(Surf.Size, GMM_KBYTE(16)) >> 8);
239*35ffd701SAndroid Build Coastguard Worker
240*35ffd701SAndroid Build Coastguard Worker uint32_t qPitch;
241*35ffd701SAndroid Build Coastguard Worker if(ExpandedArraySize > 1)
242*35ffd701SAndroid Build Coastguard Worker {
243*35ffd701SAndroid Build Coastguard Worker uint64_t sliceSize = ((GFX_ALIGN(Surf.Pitch * Surf.Alignment.QPitch, GMM_KBYTE(16)) >> 8));
244*35ffd701SAndroid Build Coastguard Worker qPitch = GFX_ULONG_CAST(sliceSize); //HW doesn't use QPitch for Aux except MCS, how'd AMFS get sw-filled non-zero QPitch?
245*35ffd701SAndroid Build Coastguard Worker
246*35ffd701SAndroid Build Coastguard Worker
247*35ffd701SAndroid Build Coastguard Worker if(Surf.MSAA.NumSamples && !pGmmLibContext->GetSkuTable().FtrTileY)
248*35ffd701SAndroid Build Coastguard Worker {
249*35ffd701SAndroid Build Coastguard Worker //MSAA Qpitch is sample-distance, multiply NumSamples in a tile
250*35ffd701SAndroid Build Coastguard Worker qPitch *= (pGmmLibContext->GetSkuTable().FtrXe2PlusTiling ? Surf.MSAA.NumSamples : GFX_MIN(Surf.MSAA.NumSamples, 4));
251*35ffd701SAndroid Build Coastguard Worker }
252*35ffd701SAndroid Build Coastguard Worker }
253*35ffd701SAndroid Build Coastguard Worker else
254*35ffd701SAndroid Build Coastguard Worker {
255*35ffd701SAndroid Build Coastguard Worker qPitch = GFX_ULONG_CAST(pAuxTexInfo->Size);
256*35ffd701SAndroid Build Coastguard Worker }
257*35ffd701SAndroid Build Coastguard Worker
258*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Alignment.QPitch = qPitch;
259*35ffd701SAndroid Build Coastguard Worker }
260*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(ExpandedArraySize || (pAuxTexInfo->Size == 0));
261*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Pitch = 0;
262*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Type = RESOURCE_BUFFER;
263*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Alignment.BaseAlignment = GMM_KBYTE(4); //TODO: TiledResource?
264*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Size = GFX_ALIGN(pAuxTexInfo->Size, PAGE_SIZE); //page-align final size
265*35ffd701SAndroid Build Coastguard Worker
266*35ffd701SAndroid Build Coastguard Worker if(pAuxTexInfo->Flags.Gpu.TiledResource)
267*35ffd701SAndroid Build Coastguard Worker {
268*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Alignment.BaseAlignment = GMM_KBYTE(64); //TODO: TiledResource?
269*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Size = GFX_ALIGN(pAuxTexInfo->Size, GMM_KBYTE(64)); //page-align final size
270*35ffd701SAndroid Build Coastguard Worker }
271*35ffd701SAndroid Build Coastguard Worker
272*35ffd701SAndroid Build Coastguard Worker //Clear compression request in CCS
273*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Flags.Info.RenderCompressed = 0;
274*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Flags.Info.MediaCompressed = 0;
275*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Flags.Info.NotCompressed = 1;
276*35ffd701SAndroid Build Coastguard Worker pAuxTexInfo->Flags.Info.RedecribedPlanes = 0;
277*35ffd701SAndroid Build Coastguard Worker SetTileMode(pAuxTexInfo);
278*35ffd701SAndroid Build Coastguard Worker
279*35ffd701SAndroid Build Coastguard Worker return GMM_SUCCESS;
280*35ffd701SAndroid Build Coastguard Worker }
281*35ffd701SAndroid Build Coastguard Worker return GMM_SUCCESS;
282*35ffd701SAndroid Build Coastguard Worker }
283*35ffd701SAndroid Build Coastguard Worker
284*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
285*35ffd701SAndroid Build Coastguard Worker /// Allocates the 2D mip layout for surface state programming.
286*35ffd701SAndroid Build Coastguard Worker ///
287*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
288*35ffd701SAndroid Build Coastguard Worker /// @param[in] pRestrictions: ptr to surface alignment and size restrictions
289*35ffd701SAndroid Build Coastguard Worker ///
290*35ffd701SAndroid Build Coastguard Worker /// @return ::GMM_STATUS
291*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTex2D(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)292*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen12TextureCalc::FillTex2D(GMM_TEXTURE_INFO * pTexInfo,
293*35ffd701SAndroid Build Coastguard Worker __GMM_BUFFER_TYPE *pRestrictions)
294*35ffd701SAndroid Build Coastguard Worker {
295*35ffd701SAndroid Build Coastguard Worker uint32_t Width, Height, BitsPerPixel;
296*35ffd701SAndroid Build Coastguard Worker uint32_t HAlign, VAlign, DAlign, CompressHeight, CompressWidth, CompressDepth;
297*35ffd701SAndroid Build Coastguard Worker uint32_t AlignedWidth, BlockHeight, ExpandedArraySize, Pitch;
298*35ffd701SAndroid Build Coastguard Worker uint8_t Compress = 0;
299*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status;
300*35ffd701SAndroid Build Coastguard Worker
301*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
302*35ffd701SAndroid Build Coastguard Worker
303*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
304*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pRestrictions, GMM_ERROR);
305*35ffd701SAndroid Build Coastguard Worker
306*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
307*35ffd701SAndroid Build Coastguard Worker
308*35ffd701SAndroid Build Coastguard Worker BitsPerPixel = pTexInfo->BitsPerPixel;
309*35ffd701SAndroid Build Coastguard Worker //TODO: Deprecate TileY usage
310*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs))
311*35ffd701SAndroid Build Coastguard Worker {
312*35ffd701SAndroid Build Coastguard Worker // Aux Surfaces are 8bpp.
313*35ffd701SAndroid Build Coastguard Worker BitsPerPixel = 8;
314*35ffd701SAndroid Build Coastguard Worker }
315*35ffd701SAndroid Build Coastguard Worker
316*35ffd701SAndroid Build Coastguard Worker Height = pTexInfo->BaseHeight;
317*35ffd701SAndroid Build Coastguard Worker Width = GFX_ULONG_CAST(pTexInfo->BaseWidth);
318*35ffd701SAndroid Build Coastguard Worker
319*35ffd701SAndroid Build Coastguard Worker pTexInfo->MSAA.NumSamples = GFX_MAX(pTexInfo->MSAA.NumSamples, 1);
320*35ffd701SAndroid Build Coastguard Worker
321*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags))
322*35ffd701SAndroid Build Coastguard Worker {
323*35ffd701SAndroid Build Coastguard Worker FindMipTailStartLod(pTexInfo);
324*35ffd701SAndroid Build Coastguard Worker }
325*35ffd701SAndroid Build Coastguard Worker
326*35ffd701SAndroid Build Coastguard Worker ExpandedArraySize =
327*35ffd701SAndroid Build Coastguard Worker GFX_MAX(pTexInfo->ArraySize, 1) *
328*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Type == RESOURCE_CUBE) ? 6 : 1) * // Cubemaps simply 6-element, 2D arrays.
329*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Type == RESOURCE_3D) ? pTexInfo->Depth : 1) * // 3D's simply 2D arrays for sizing.
330*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Flags.Gpu.Depth || pTexInfo->Flags.Gpu.SeparateStencil ||
331*35ffd701SAndroid Build Coastguard Worker (GMM_IS_64KB_TILE(pTexInfo->Flags) || pTexInfo->Flags.Info.TiledYf)) ? // MSAA Ys/Yf samples are ALSO stored as array planes, calculate size for single sample and expand it later.
332*35ffd701SAndroid Build Coastguard Worker 1 :
333*35ffd701SAndroid Build Coastguard Worker pTexInfo->MSAA.NumSamples) * // MSAA (non-Depth/Stencil) RT samples stored as array planes.
334*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Flags.Gpu.Depth || pTexInfo->Flags.Gpu.SeparateStencil) ? // Depth/Stencil MSAA surface is expanded through Width and Depth
335*35ffd701SAndroid Build Coastguard Worker 1 :
336*35ffd701SAndroid Build Coastguard Worker ((GMM_IS_64KB_TILE(pTexInfo->Flags) && !pGmmLibContext->GetSkuTable().FtrTileY && !pGmmLibContext->GetSkuTable().FtrXe2PlusTiling && (pTexInfo->MSAA.NumSamples == 16)) ? 4 : // MSAA x8/x16 stored as pseudo array planes each with 4x samples
337*35ffd701SAndroid Build Coastguard Worker (GMM_IS_64KB_TILE(pTexInfo->Flags) && !pGmmLibContext->GetSkuTable().FtrTileY && !pGmmLibContext->GetSkuTable().FtrXe2PlusTiling && (pTexInfo->MSAA.NumSamples == 8)) ? 2 :
338*35ffd701SAndroid Build Coastguard Worker 1));
339*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_64KB_TILE(pTexInfo->Flags) || pTexInfo->Flags.Info.TiledYf)
340*35ffd701SAndroid Build Coastguard Worker {
341*35ffd701SAndroid Build Coastguard Worker ExpandedArraySize = GFX_CEIL_DIV(ExpandedArraySize, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileDepth);
342*35ffd701SAndroid Build Coastguard Worker }
343*35ffd701SAndroid Build Coastguard Worker
344*35ffd701SAndroid Build Coastguard Worker //
345*35ffd701SAndroid Build Coastguard Worker // Check for color separation
346*35ffd701SAndroid Build Coastguard Worker //
347*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.ColorSeparation || pTexInfo->Flags.Gpu.ColorSeparationRGBX)
348*35ffd701SAndroid Build Coastguard Worker {
349*35ffd701SAndroid Build Coastguard Worker bool csRestrictionsMet = (((ExpandedArraySize <= 2) &&
350*35ffd701SAndroid Build Coastguard Worker (ExpandedArraySize == pTexInfo->ArraySize) &&
351*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Format == GMM_FORMAT_R8G8B8A8_UNORM) ||
352*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_R8G8B8A8_UNORM_SRGB) ||
353*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_B8G8R8A8_UNORM) ||
354*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_B8G8R8A8_UNORM_SRGB) ||
355*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_B8G8R8X8_UNORM) ||
356*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_B8G8R8X8_UNORM_SRGB)) &&
357*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Flags.Gpu.ColorSeparation && (Width % 16) == 0) ||
358*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Gpu.ColorSeparationRGBX && (Width % 12) == 0))));
359*35ffd701SAndroid Build Coastguard Worker
360*35ffd701SAndroid Build Coastguard Worker if(csRestrictionsMet)
361*35ffd701SAndroid Build Coastguard Worker {
362*35ffd701SAndroid Build Coastguard Worker ExpandedArraySize = GMM_COLOR_SEPARATION_ARRAY_SIZE;
363*35ffd701SAndroid Build Coastguard Worker }
364*35ffd701SAndroid Build Coastguard Worker else
365*35ffd701SAndroid Build Coastguard Worker {
366*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.ColorSeparation = 0;
367*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.ColorSeparationRGBX = 0;
368*35ffd701SAndroid Build Coastguard Worker }
369*35ffd701SAndroid Build Coastguard Worker }
370*35ffd701SAndroid Build Coastguard Worker
371*35ffd701SAndroid Build Coastguard Worker HAlign = pTexInfo->Alignment.HAlign;
372*35ffd701SAndroid Build Coastguard Worker VAlign = pTexInfo->Alignment.VAlign;
373*35ffd701SAndroid Build Coastguard Worker DAlign = pTexInfo->Alignment.DAlign;
374*35ffd701SAndroid Build Coastguard Worker
375*35ffd701SAndroid Build Coastguard Worker GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
376*35ffd701SAndroid Build Coastguard Worker
377*35ffd701SAndroid Build Coastguard Worker Compress = GmmIsCompressed(pGmmLibContext, pTexInfo->Format);
378*35ffd701SAndroid Build Coastguard Worker
379*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////
380*35ffd701SAndroid Build Coastguard Worker // Calculate Block Surface Height
381*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////
382*35ffd701SAndroid Build Coastguard Worker
383*35ffd701SAndroid Build Coastguard Worker if(ExpandedArraySize > 1)
384*35ffd701SAndroid Build Coastguard Worker {
385*35ffd701SAndroid Build Coastguard Worker uint32_t Alignment = VAlign;
386*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Type == RESOURCE_3D && !pTexInfo->Flags.Info.Linear) ||
387*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Gpu.S3dDx && pGmmLibContext->GetSkuTable().FtrDisplayEngineS3d) ||
388*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Wa.MediaPipeUsage))
389*35ffd701SAndroid Build Coastguard Worker {
390*35ffd701SAndroid Build Coastguard Worker Alignment = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight;
391*35ffd701SAndroid Build Coastguard Worker }
392*35ffd701SAndroid Build Coastguard Worker
393*35ffd701SAndroid Build Coastguard Worker // Calculate the overall Block height...Mip0Height + Max(Mip1Height, Sum of Mip2Height..MipnHeight)
394*35ffd701SAndroid Build Coastguard Worker BlockHeight = Get2DMipMapTotalHeight(pTexInfo);
395*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_ALIGN_NP2(BlockHeight, Alignment);
396*35ffd701SAndroid Build Coastguard Worker
397*35ffd701SAndroid Build Coastguard Worker // GMM internally uses QPitch as the logical distance between slices, but translates
398*35ffd701SAndroid Build Coastguard Worker // as appropriate to service client queries in GmmResGetQPitch.
399*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.QPitch = BlockHeight;
400*35ffd701SAndroid Build Coastguard Worker
401*35ffd701SAndroid Build Coastguard Worker if(Compress)
402*35ffd701SAndroid Build Coastguard Worker {
403*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_CEIL_DIV(BlockHeight, CompressHeight);
404*35ffd701SAndroid Build Coastguard Worker
405*35ffd701SAndroid Build Coastguard Worker BlockHeight = GetAligned3DBlockHeight(pTexInfo, BlockHeight, ExpandedArraySize);
406*35ffd701SAndroid Build Coastguard Worker }
407*35ffd701SAndroid Build Coastguard Worker else
408*35ffd701SAndroid Build Coastguard Worker {
409*35ffd701SAndroid Build Coastguard Worker BlockHeight = ScaleTextureHeight(pTexInfo, BlockHeight);
410*35ffd701SAndroid Build Coastguard Worker }
411*35ffd701SAndroid Build Coastguard Worker
412*35ffd701SAndroid Build Coastguard Worker BlockHeight *= ExpandedArraySize;
413*35ffd701SAndroid Build Coastguard Worker }
414*35ffd701SAndroid Build Coastguard Worker else
415*35ffd701SAndroid Build Coastguard Worker {
416*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.QPitch = 0;
417*35ffd701SAndroid Build Coastguard Worker
418*35ffd701SAndroid Build Coastguard Worker BlockHeight = Get2DMipMapHeight(pTexInfo);
419*35ffd701SAndroid Build Coastguard Worker BlockHeight = ScaleTextureHeight(pTexInfo, BlockHeight);
420*35ffd701SAndroid Build Coastguard Worker }
421*35ffd701SAndroid Build Coastguard Worker
422*35ffd701SAndroid Build Coastguard Worker ///////////////////////////////////
423*35ffd701SAndroid Build Coastguard Worker // Calculate Pitch
424*35ffd701SAndroid Build Coastguard Worker ///////////////////////////////////
425*35ffd701SAndroid Build Coastguard Worker
426*35ffd701SAndroid Build Coastguard Worker AlignedWidth = __GMM_EXPAND_WIDTH(this, Width, HAlign, pTexInfo);
427*35ffd701SAndroid Build Coastguard Worker
428*35ffd701SAndroid Build Coastguard Worker // Calculate special pitch case of small dimensions where LOD1 + LOD2 widths
429*35ffd701SAndroid Build Coastguard Worker // are greater than LOD0. e.g. dimensions 4x4 and MinPitch == 1
430*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) &&
431*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Alignment.MipTailStartLod < 2))
432*35ffd701SAndroid Build Coastguard Worker {
433*35ffd701SAndroid Build Coastguard Worker // Do nothing -- all mips are in LOD0/LOD1, which is already width aligned.
434*35ffd701SAndroid Build Coastguard Worker }
435*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->MaxLod >= 2)
436*35ffd701SAndroid Build Coastguard Worker {
437*35ffd701SAndroid Build Coastguard Worker uint32_t AlignedWidthLod1, AlignedWidthLod2;
438*35ffd701SAndroid Build Coastguard Worker
439*35ffd701SAndroid Build Coastguard Worker AlignedWidthLod1 = __GMM_EXPAND_WIDTH(this, Width >> 1, HAlign, pTexInfo);
440*35ffd701SAndroid Build Coastguard Worker AlignedWidthLod2 = __GMM_EXPAND_WIDTH(this, Width >> 2, HAlign, pTexInfo);
441*35ffd701SAndroid Build Coastguard Worker
442*35ffd701SAndroid Build Coastguard Worker AlignedWidth = GFX_MAX(AlignedWidth, AlignedWidthLod1 + AlignedWidthLod2);
443*35ffd701SAndroid Build Coastguard Worker }
444*35ffd701SAndroid Build Coastguard Worker
445*35ffd701SAndroid Build Coastguard Worker if(Compress)
446*35ffd701SAndroid Build Coastguard Worker {
447*35ffd701SAndroid Build Coastguard Worker AlignedWidth = GFX_CEIL_DIV(AlignedWidth, CompressWidth);
448*35ffd701SAndroid Build Coastguard Worker }
449*35ffd701SAndroid Build Coastguard Worker else
450*35ffd701SAndroid Build Coastguard Worker {
451*35ffd701SAndroid Build Coastguard Worker AlignedWidth = ScaleTextureWidth(pTexInfo, AlignedWidth);
452*35ffd701SAndroid Build Coastguard Worker }
453*35ffd701SAndroid Build Coastguard Worker
454*35ffd701SAndroid Build Coastguard Worker // Default pitch
455*35ffd701SAndroid Build Coastguard Worker Pitch = AlignedWidth * BitsPerPixel >> 3;
456*35ffd701SAndroid Build Coastguard Worker
457*35ffd701SAndroid Build Coastguard Worker // Make sure the pitch satisfy linear min pitch requirment
458*35ffd701SAndroid Build Coastguard Worker Pitch = GFX_MAX(Pitch, pRestrictions->MinPitch);
459*35ffd701SAndroid Build Coastguard Worker
460*35ffd701SAndroid Build Coastguard Worker // Make sure pitch satisfy alignment restriction
461*35ffd701SAndroid Build Coastguard Worker Pitch = GFX_ALIGN(Pitch, pRestrictions->PitchAlignment);
462*35ffd701SAndroid Build Coastguard Worker
463*35ffd701SAndroid Build Coastguard Worker ////////////////////
464*35ffd701SAndroid Build Coastguard Worker // Adjust for Tiling
465*35ffd701SAndroid Build Coastguard Worker ////////////////////
466*35ffd701SAndroid Build Coastguard Worker
467*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]))
468*35ffd701SAndroid Build Coastguard Worker {
469*35ffd701SAndroid Build Coastguard Worker Pitch = GFX_ALIGN(Pitch, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth);
470*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_ALIGN(BlockHeight, pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight);
471*35ffd701SAndroid Build Coastguard Worker }
472*35ffd701SAndroid Build Coastguard Worker
473*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(pTexInfo->Flags.Info.LayoutBelow || !pTexInfo->Flags.Info.LayoutRight, "MIPLAYOUT_RIGHT not supported after Gen6!");
474*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.LayoutBelow = 1;
475*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.LayoutRight = 0;
476*35ffd701SAndroid Build Coastguard Worker
477*35ffd701SAndroid Build Coastguard Worker // If a texture is YUV packed, 96, or 48 bpp then one row plus 16 bytes of
478*35ffd701SAndroid Build Coastguard Worker // padding needs to be added. Since this will create a none pitch aligned
479*35ffd701SAndroid Build Coastguard Worker // surface the padding is aligned to the next row
480*35ffd701SAndroid Build Coastguard Worker if(GmmIsYUVPacked(pTexInfo->Format) ||
481*35ffd701SAndroid Build Coastguard Worker (pTexInfo->BitsPerPixel == GMM_BITS(96)) ||
482*35ffd701SAndroid Build Coastguard Worker (pTexInfo->BitsPerPixel == GMM_BITS(48)))
483*35ffd701SAndroid Build Coastguard Worker {
484*35ffd701SAndroid Build Coastguard Worker BlockHeight += GMM_SCANLINES(1) + GFX_CEIL_DIV(GMM_BYTES(16), Pitch);
485*35ffd701SAndroid Build Coastguard Worker }
486*35ffd701SAndroid Build Coastguard Worker
487*35ffd701SAndroid Build Coastguard Worker // For Non-planar surfaces, the alignment is done on the entire height of the allocation
488*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetWaTable().WaAlignYUVResourceToLCU &&
489*35ffd701SAndroid Build Coastguard Worker GmmIsYUVFormatLCUAligned(pTexInfo->Format) &&
490*35ffd701SAndroid Build Coastguard Worker !GmmIsPlanar(pTexInfo->Format))
491*35ffd701SAndroid Build Coastguard Worker {
492*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_ALIGN(BlockHeight, GMM_SCANLINES(GMM_MAX_LCU_SIZE));
493*35ffd701SAndroid Build Coastguard Worker }
494*35ffd701SAndroid Build Coastguard Worker
495*35ffd701SAndroid Build Coastguard Worker // Align height to even row to avoid hang if HW over-fetch
496*35ffd701SAndroid Build Coastguard Worker BlockHeight = GFX_ALIGN(BlockHeight, __GMM_EVEN_ROW);
497*35ffd701SAndroid Build Coastguard Worker
498*35ffd701SAndroid Build Coastguard Worker if((Status = // <-- Note assignment.
499*35ffd701SAndroid Build Coastguard Worker FillTexPitchAndSize(
500*35ffd701SAndroid Build Coastguard Worker pTexInfo, Pitch, BlockHeight, pRestrictions)) == GMM_SUCCESS)
501*35ffd701SAndroid Build Coastguard Worker {
502*35ffd701SAndroid Build Coastguard Worker Fill2DTexOffsetAddress(pTexInfo);
503*35ffd701SAndroid Build Coastguard Worker }
504*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
505*35ffd701SAndroid Build Coastguard Worker
506*35ffd701SAndroid Build Coastguard Worker return (Status);
507*35ffd701SAndroid Build Coastguard Worker }
508*35ffd701SAndroid Build Coastguard Worker
509*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
510*35ffd701SAndroid Build Coastguard Worker /// This function will Setup a planar surface allocation.
511*35ffd701SAndroid Build Coastguard Worker ///
512*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: Reference to ::GMM_TEXTURE_INFO
513*35ffd701SAndroid Build Coastguard Worker /// @param[in] pRestrictions: Reference to surface alignment and size restrictions.
514*35ffd701SAndroid Build Coastguard Worker ///
515*35ffd701SAndroid Build Coastguard Worker /// @return ::GMM_STATUS
516*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTexPlanar(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)517*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen12TextureCalc::FillTexPlanar(GMM_TEXTURE_INFO * pTexInfo,
518*35ffd701SAndroid Build Coastguard Worker __GMM_BUFFER_TYPE *pRestrictions)
519*35ffd701SAndroid Build Coastguard Worker {
520*35ffd701SAndroid Build Coastguard Worker uint32_t WidthBytesPhysical, Height, YHeight, VHeight;
521*35ffd701SAndroid Build Coastguard Worker uint32_t AdjustedVHeight = 0;
522*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status;
523*35ffd701SAndroid Build Coastguard Worker bool UVPacked = false;
524*35ffd701SAndroid Build Coastguard Worker uint32_t BitsPerPixel, AlignedWidth;
525*35ffd701SAndroid Build Coastguard Worker
526*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
527*35ffd701SAndroid Build Coastguard Worker
528*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
529*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pRestrictions, GMM_ERROR);
530*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(!pTexInfo->Flags.Info.TiledW);
531*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
532*35ffd701SAndroid Build Coastguard Worker
533*35ffd701SAndroid Build Coastguard Worker BitsPerPixel = pTexInfo->BitsPerPixel;
534*35ffd701SAndroid Build Coastguard Worker AlignedWidth = GFX_ULONG_CAST(pTexInfo->BaseWidth);
535*35ffd701SAndroid Build Coastguard Worker if(!pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
536*35ffd701SAndroid Build Coastguard Worker {
537*35ffd701SAndroid Build Coastguard Worker pTexInfo->TileMode = TILE_NONE;
538*35ffd701SAndroid Build Coastguard Worker }
539*35ffd701SAndroid Build Coastguard Worker else
540*35ffd701SAndroid Build Coastguard Worker {
541*35ffd701SAndroid Build Coastguard Worker pTexInfo->TileMode = LEGACY_TILE_Y;
542*35ffd701SAndroid Build Coastguard Worker }
543*35ffd701SAndroid Build Coastguard Worker
544*35ffd701SAndroid Build Coastguard Worker WidthBytesPhysical = AlignedWidth * BitsPerPixel >> 3;
545*35ffd701SAndroid Build Coastguard Worker Height = VHeight = 0;
546*35ffd701SAndroid Build Coastguard Worker
547*35ffd701SAndroid Build Coastguard Worker YHeight = pTexInfo->BaseHeight;
548*35ffd701SAndroid Build Coastguard Worker
549*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->Format)
550*35ffd701SAndroid Build Coastguard Worker {
551*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC1: // IMC1 = IMC3 with Swapped U/V
552*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC3:
553*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV420: // Same as IMC3.
554*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
555*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
556*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
557*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
558*35ffd701SAndroid Build Coastguard Worker // UUUU
559*35ffd701SAndroid Build Coastguard Worker // UUUU
560*35ffd701SAndroid Build Coastguard Worker // VVVV
561*35ffd701SAndroid Build Coastguard Worker // VVVV
562*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422V: // Similar to IMC3 but U/V are full width.
563*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
564*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
565*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
566*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
567*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
568*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
569*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
570*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
571*35ffd701SAndroid Build Coastguard Worker {
572*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(GFX_CEIL_DIV(YHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
573*35ffd701SAndroid Build Coastguard Worker
574*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
575*35ffd701SAndroid Build Coastguard Worker
576*35ffd701SAndroid Build Coastguard Worker Height = YHeight + 2 * VHeight; // One VHeight for V and one for U.
577*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
578*35ffd701SAndroid Build Coastguard Worker break;
579*35ffd701SAndroid Build Coastguard Worker }
580*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411R_TYPE: //Similar to IMC3 but U/V are quarther height and full width.
581*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
582*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
583*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
584*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
585*35ffd701SAndroid Build Coastguard Worker //UUUUUUUU
586*35ffd701SAndroid Build Coastguard Worker //VVVVVVVV
587*35ffd701SAndroid Build Coastguard Worker {
588*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(GFX_CEIL_DIV(YHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
589*35ffd701SAndroid Build Coastguard Worker
590*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
591*35ffd701SAndroid Build Coastguard Worker
592*35ffd701SAndroid Build Coastguard Worker Height = YHeight + 2 * VHeight;
593*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
594*35ffd701SAndroid Build Coastguard Worker break;
595*35ffd701SAndroid Build Coastguard Worker }
596*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411: // Similar to IMC3 but U/V are quarter width and full height.
597*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
598*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
599*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
600*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
601*35ffd701SAndroid Build Coastguard Worker // UU
602*35ffd701SAndroid Build Coastguard Worker // UU
603*35ffd701SAndroid Build Coastguard Worker // UU
604*35ffd701SAndroid Build Coastguard Worker // UU
605*35ffd701SAndroid Build Coastguard Worker // VV
606*35ffd701SAndroid Build Coastguard Worker // VV
607*35ffd701SAndroid Build Coastguard Worker // VV
608*35ffd701SAndroid Build Coastguard Worker // VV
609*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422H: // Similar to IMC3 but U/V are full height.
610*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
611*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
612*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
613*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
614*35ffd701SAndroid Build Coastguard Worker // UUUU
615*35ffd701SAndroid Build Coastguard Worker // UUUU
616*35ffd701SAndroid Build Coastguard Worker // UUUU
617*35ffd701SAndroid Build Coastguard Worker // UUUU
618*35ffd701SAndroid Build Coastguard Worker // VVVV
619*35ffd701SAndroid Build Coastguard Worker // VVVV
620*35ffd701SAndroid Build Coastguard Worker // VVVV
621*35ffd701SAndroid Build Coastguard Worker // VVVV
622*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV444: // Similar to IMC3 but U/V are full size.
623*35ffd701SAndroid Build Coastguard Worker #if _WIN32
624*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_WGBOX_YUV444:
625*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_WGBOX_PLANAR_YUV444:
626*35ffd701SAndroid Build Coastguard Worker #endif
627*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
628*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
629*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
630*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
631*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
632*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
633*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
634*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
635*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
636*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
637*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
638*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
639*35ffd701SAndroid Build Coastguard Worker {
640*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
641*35ffd701SAndroid Build Coastguard Worker VHeight = YHeight;
642*35ffd701SAndroid Build Coastguard Worker
643*35ffd701SAndroid Build Coastguard Worker Height = YHeight + 2 * VHeight;
644*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
645*35ffd701SAndroid Build Coastguard Worker break;
646*35ffd701SAndroid Build Coastguard Worker }
647*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_BGRP:
648*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_RGBP:
649*35ffd701SAndroid Build Coastguard Worker {
650*35ffd701SAndroid Build Coastguard Worker //For RGBP linear Tile keep resource Offset non aligned and for other Tile format to be 16-bit aligned
651*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.Linear)
652*35ffd701SAndroid Build Coastguard Worker {
653*35ffd701SAndroid Build Coastguard Worker VHeight = YHeight;
654*35ffd701SAndroid Build Coastguard Worker
655*35ffd701SAndroid Build Coastguard Worker Height = YHeight + 2 * VHeight;
656*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
657*35ffd701SAndroid Build Coastguard Worker }
658*35ffd701SAndroid Build Coastguard Worker else
659*35ffd701SAndroid Build Coastguard Worker {
660*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
661*35ffd701SAndroid Build Coastguard Worker VHeight = YHeight;
662*35ffd701SAndroid Build Coastguard Worker
663*35ffd701SAndroid Build Coastguard Worker Height = YHeight + 2 * VHeight;
664*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
665*35ffd701SAndroid Build Coastguard Worker }
666*35ffd701SAndroid Build Coastguard Worker break;
667*35ffd701SAndroid Build Coastguard Worker }
668*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC2: // IMC2 = IMC4 with Swapped U/V
669*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC4:
670*35ffd701SAndroid Build Coastguard Worker {
671*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
672*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
673*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
674*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
675*35ffd701SAndroid Build Coastguard Worker // UUUUVVVV
676*35ffd701SAndroid Build Coastguard Worker // UUUUVVVV
677*35ffd701SAndroid Build Coastguard Worker
678*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
679*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_CEIL_DIV(YHeight, 2);
680*35ffd701SAndroid Build Coastguard Worker
681*35ffd701SAndroid Build Coastguard Worker WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical, 2); // If odd YWidth, pitch bumps-up to fit rounded-up U/V planes.
682*35ffd701SAndroid Build Coastguard Worker
683*35ffd701SAndroid Build Coastguard Worker Height = YHeight + VHeight;
684*35ffd701SAndroid Build Coastguard Worker
685*35ffd701SAndroid Build Coastguard Worker // With SURFACE_STATE.XOffset support, the U-V interface has
686*35ffd701SAndroid Build Coastguard Worker // much lighter restrictions--which will be naturally met by
687*35ffd701SAndroid Build Coastguard Worker // surface pitch restrictions (i.e. dividing an IMC2/4 pitch
688*35ffd701SAndroid Build Coastguard Worker // by 2--to get the U/V interface--will always produce a safe
689*35ffd701SAndroid Build Coastguard Worker // XOffset value).
690*35ffd701SAndroid Build Coastguard Worker // Not technically UV packed but sizing works out the same
691*35ffd701SAndroid Build Coastguard Worker // if the resource is std swizzled
692*35ffd701SAndroid Build Coastguard Worker UVPacked = true;
693*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 2;
694*35ffd701SAndroid Build Coastguard Worker break;
695*35ffd701SAndroid Build Coastguard Worker }
696*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV12:
697*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV21:
698*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV11:
699*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
700*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
701*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
702*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P208:
703*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P216:
704*35ffd701SAndroid Build Coastguard Worker {
705*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
706*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
707*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
708*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
709*35ffd701SAndroid Build Coastguard Worker // [UV-Packing]
710*35ffd701SAndroid Build Coastguard Worker
711*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Format == GMM_FORMAT_NV12) ||
712*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_NV21) ||
713*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P010) ||
714*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P012) ||
715*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P016))
716*35ffd701SAndroid Build Coastguard Worker {
717*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_CEIL_DIV(YHeight, 2); // U/V plane half of Y
718*35ffd701SAndroid Build Coastguard Worker Height = YHeight + VHeight;
719*35ffd701SAndroid Build Coastguard Worker }
720*35ffd701SAndroid Build Coastguard Worker else
721*35ffd701SAndroid Build Coastguard Worker {
722*35ffd701SAndroid Build Coastguard Worker VHeight = YHeight; // U/V plane is same as Y
723*35ffd701SAndroid Build Coastguard Worker Height = YHeight + VHeight;
724*35ffd701SAndroid Build Coastguard Worker }
725*35ffd701SAndroid Build Coastguard Worker
726*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Format == GMM_FORMAT_NV12) ||
727*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_NV21) ||
728*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P010) ||
729*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P012) ||
730*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P016) ||
731*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P208) ||
732*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P216))
733*35ffd701SAndroid Build Coastguard Worker {
734*35ffd701SAndroid Build Coastguard Worker WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical, 2); // If odd YWidth, pitch bumps-up to fit rounded-up U/V planes.
735*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 2;
736*35ffd701SAndroid Build Coastguard Worker }
737*35ffd701SAndroid Build Coastguard Worker else //if(pTexInfo->Format == GMM_FORMAT_NV11)
738*35ffd701SAndroid Build Coastguard Worker {
739*35ffd701SAndroid Build Coastguard Worker // Tiling not supported, since YPitch != UVPitch...
740*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledYf = 0;
741*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledX = 0;
742*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.Linear = 1;
743*35ffd701SAndroid Build Coastguard Worker GMM_SET_64KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
744*35ffd701SAndroid Build Coastguard Worker GMM_SET_4KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
745*35ffd701SAndroid Build Coastguard Worker }
746*35ffd701SAndroid Build Coastguard Worker
747*35ffd701SAndroid Build Coastguard Worker UVPacked = true;
748*35ffd701SAndroid Build Coastguard Worker break;
749*35ffd701SAndroid Build Coastguard Worker }
750*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_I420: // IYUV & I420: are identical to YV12 except,
751*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IYUV: // U & V pl.s are reversed.
752*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YV12:
753*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YVU9:
754*35ffd701SAndroid Build Coastguard Worker {
755*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
756*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
757*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
758*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
759*35ffd701SAndroid Build Coastguard Worker // VVVVVV.. <-- V and U planes follow the Y plane, as linear
760*35ffd701SAndroid Build Coastguard Worker // ..UUUUUU arrays--without respect to pitch.
761*35ffd701SAndroid Build Coastguard Worker
762*35ffd701SAndroid Build Coastguard Worker uint32_t YSize, UVSize, YVSizeRShift;
763*35ffd701SAndroid Build Coastguard Worker uint32_t YSizeForUVPurposes, YSizeForUVPurposesDimensionalAlignment;
764*35ffd701SAndroid Build Coastguard Worker
765*35ffd701SAndroid Build Coastguard Worker YSize = WidthBytesPhysical * YHeight;
766*35ffd701SAndroid Build Coastguard Worker
767*35ffd701SAndroid Build Coastguard Worker // YVU9 has one U/V pixel for each 4x4 Y block.
768*35ffd701SAndroid Build Coastguard Worker // The others have one U/V pixel for each 2x2 Y block.
769*35ffd701SAndroid Build Coastguard Worker
770*35ffd701SAndroid Build Coastguard Worker // YVU9 has a Y:V size ratio of 16 (4x4 --> 1).
771*35ffd701SAndroid Build Coastguard Worker // The others have a ratio of 4 (2x2 --> 1).
772*35ffd701SAndroid Build Coastguard Worker YVSizeRShift = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
773*35ffd701SAndroid Build Coastguard Worker
774*35ffd701SAndroid Build Coastguard Worker // If a Y plane isn't fully-aligned to its Y-->U/V block size, the
775*35ffd701SAndroid Build Coastguard Worker // extra/unaligned Y pixels still need corresponding U/V pixels--So
776*35ffd701SAndroid Build Coastguard Worker // for the purpose of computing the UVSize, we must consider a
777*35ffd701SAndroid Build Coastguard Worker // dimensionally "rounded-up" YSize. (E.g. a 13x5 YVU9 Y plane would
778*35ffd701SAndroid Build Coastguard Worker // require 4x2 U/V planes--the same UVSize as a fully-aligned 16x8 Y.)
779*35ffd701SAndroid Build Coastguard Worker YSizeForUVPurposesDimensionalAlignment = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
780*35ffd701SAndroid Build Coastguard Worker YSizeForUVPurposes =
781*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(WidthBytesPhysical, YSizeForUVPurposesDimensionalAlignment) *
782*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(YHeight, YSizeForUVPurposesDimensionalAlignment);
783*35ffd701SAndroid Build Coastguard Worker
784*35ffd701SAndroid Build Coastguard Worker UVSize = 2 * // <-- U + V
785*35ffd701SAndroid Build Coastguard Worker (YSizeForUVPurposes >> YVSizeRShift);
786*35ffd701SAndroid Build Coastguard Worker
787*35ffd701SAndroid Build Coastguard Worker Height = GFX_CEIL_DIV(YSize + UVSize, WidthBytesPhysical);
788*35ffd701SAndroid Build Coastguard Worker
789*35ffd701SAndroid Build Coastguard Worker // Tiling not supported, since YPitch != UVPitch...
790*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledYf = 0;
791*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledX = 0;
792*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.Linear = 1;
793*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 1;
794*35ffd701SAndroid Build Coastguard Worker GMM_SET_64KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
795*35ffd701SAndroid Build Coastguard Worker GMM_SET_4KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
796*35ffd701SAndroid Build Coastguard Worker
797*35ffd701SAndroid Build Coastguard Worker break;
798*35ffd701SAndroid Build Coastguard Worker }
799*35ffd701SAndroid Build Coastguard Worker default:
800*35ffd701SAndroid Build Coastguard Worker {
801*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Unexpected format");
802*35ffd701SAndroid Build Coastguard Worker return GMM_ERROR;
803*35ffd701SAndroid Build Coastguard Worker }
804*35ffd701SAndroid Build Coastguard Worker }
805*35ffd701SAndroid Build Coastguard Worker
806*35ffd701SAndroid Build Coastguard Worker // Align Height to even row to avoid hang if HW over-fetch
807*35ffd701SAndroid Build Coastguard Worker Height = GFX_ALIGN(Height, __GMM_EVEN_ROW);
808*35ffd701SAndroid Build Coastguard Worker
809*35ffd701SAndroid Build Coastguard Worker SetTileMode(pTexInfo);
810*35ffd701SAndroid Build Coastguard Worker
811*35ffd701SAndroid Build Coastguard Worker // If the Surface has Odd height dimension, we will fall back to Linear Format.
812*35ffd701SAndroid Build Coastguard Worker // If MMC is enabled, disable MMC during such cases.
813*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.MMC)
814*35ffd701SAndroid Build Coastguard Worker {
815*35ffd701SAndroid Build Coastguard Worker if(!(GMM_IS_4KB_TILE(pTexInfo->Flags) || GMM_IS_64KB_TILE(pTexInfo->Flags)))
816*35ffd701SAndroid Build Coastguard Worker {
817*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.MMC = 0;
818*35ffd701SAndroid Build Coastguard Worker }
819*35ffd701SAndroid Build Coastguard Worker }
820*35ffd701SAndroid Build Coastguard Worker
821*35ffd701SAndroid Build Coastguard Worker // If the Surface has Odd height dimension, we will fall back to Linear Format.
822*35ffd701SAndroid Build Coastguard Worker // If MMC is enabled, disable .CCS/UnifiedAuxSurface during such cases.
823*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.CCS)
824*35ffd701SAndroid Build Coastguard Worker {
825*35ffd701SAndroid Build Coastguard Worker if(!(GMM_IS_4KB_TILE(pTexInfo->Flags) || GMM_IS_64KB_TILE(pTexInfo->Flags)) &&
826*35ffd701SAndroid Build Coastguard Worker !(pTexInfo->Flags.Gpu.__NonMsaaTileYCcs && GMM_IS_4KB_TILE(pTexInfo->Flags)))
827*35ffd701SAndroid Build Coastguard Worker {
828*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.MMC = 0;
829*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.CCS = 0;
830*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.UnifiedAuxSurface = 0;
831*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.__NonMsaaTileYCcs = 0;
832*35ffd701SAndroid Build Coastguard Worker }
833*35ffd701SAndroid Build Coastguard Worker }
834*35ffd701SAndroid Build Coastguard Worker
835*35ffd701SAndroid Build Coastguard Worker // Legacy Planar "Linear Video" Restrictions...
836*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.Linear && !pTexInfo->Flags.Wa.NoLegacyPlanarLinearVideoRestrictions)
837*35ffd701SAndroid Build Coastguard Worker {
838*35ffd701SAndroid Build Coastguard Worker pRestrictions->LockPitchAlignment = GFX_MAX(pRestrictions->LockPitchAlignment, GMM_BYTES(64));
839*35ffd701SAndroid Build Coastguard Worker pRestrictions->MinPitch = GFX_MAX(pRestrictions->MinPitch, GMM_BYTES(64));
840*35ffd701SAndroid Build Coastguard Worker pRestrictions->PitchAlignment = GFX_MAX(pRestrictions->PitchAlignment, GMM_BYTES(64));
841*35ffd701SAndroid Build Coastguard Worker pRestrictions->RenderPitchAlignment = GFX_MAX(pRestrictions->RenderPitchAlignment, GMM_BYTES(64));
842*35ffd701SAndroid Build Coastguard Worker }
843*35ffd701SAndroid Build Coastguard Worker
844*35ffd701SAndroid Build Coastguard Worker // Multiply overall pitch alignment for surfaces whose U/V planes have a
845*35ffd701SAndroid Build Coastguard Worker // pitch down-scaled from that of Y--Since the U/V pitches must meet the
846*35ffd701SAndroid Build Coastguard Worker // original restriction, the Y pitch must meet a scaled-up multiple.
847*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Format == GMM_FORMAT_I420) ||
848*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_IYUV) ||
849*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_NV11) ||
850*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_YV12) ||
851*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_YVU9))
852*35ffd701SAndroid Build Coastguard Worker {
853*35ffd701SAndroid Build Coastguard Worker uint32_t LShift =
854*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format != GMM_FORMAT_YVU9) ?
855*35ffd701SAndroid Build Coastguard Worker 1 : // UVPitch = 1/2 YPitch
856*35ffd701SAndroid Build Coastguard Worker 2; // UVPitch = 1/4 YPitch
857*35ffd701SAndroid Build Coastguard Worker
858*35ffd701SAndroid Build Coastguard Worker pRestrictions->LockPitchAlignment <<= LShift;
859*35ffd701SAndroid Build Coastguard Worker pRestrictions->MinPitch <<= LShift;
860*35ffd701SAndroid Build Coastguard Worker pRestrictions->PitchAlignment <<= LShift;
861*35ffd701SAndroid Build Coastguard Worker pRestrictions->RenderPitchAlignment <<= LShift;
862*35ffd701SAndroid Build Coastguard Worker }
863*35ffd701SAndroid Build Coastguard Worker
864*35ffd701SAndroid Build Coastguard Worker AdjustedVHeight = VHeight;
865*35ffd701SAndroid Build Coastguard Worker
866*35ffd701SAndroid Build Coastguard Worker FindMipTailStartLod(pTexInfo);
867*35ffd701SAndroid Build Coastguard Worker
868*35ffd701SAndroid Build Coastguard Worker // In case of Planar surfaces, only the last Plane has to be aligned to 64 for LCU access
869*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetWaTable().WaAlignYUVResourceToLCU && GmmIsYUVFormatLCUAligned(pTexInfo->Format) && VHeight > 0)
870*35ffd701SAndroid Build Coastguard Worker {
871*35ffd701SAndroid Build Coastguard Worker AdjustedVHeight = GFX_ALIGN(VHeight, GMM_SCANLINES(GMM_MAX_LCU_SIZE));
872*35ffd701SAndroid Build Coastguard Worker Height += AdjustedVHeight - VHeight;
873*35ffd701SAndroid Build Coastguard Worker }
874*35ffd701SAndroid Build Coastguard Worker
875*35ffd701SAndroid Build Coastguard Worker // For std swizzled and UV packed tile Ys/Yf cases, the planes
876*35ffd701SAndroid Build Coastguard Worker // must be tile-boundary aligned. Actual alignment is handled
877*35ffd701SAndroid Build Coastguard Worker // in FillPlanarOffsetAddress, but height and width must
878*35ffd701SAndroid Build Coastguard Worker // be adjusted for correct size calculation
879*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]) &&
880*35ffd701SAndroid Build Coastguard Worker !pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
881*35ffd701SAndroid Build Coastguard Worker {
882*35ffd701SAndroid Build Coastguard Worker uint32_t TileHeight = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileHeight;
883*35ffd701SAndroid Build Coastguard Worker uint32_t TileWidth = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileWidth;
884*35ffd701SAndroid Build Coastguard Worker
885*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.IsTileAlignedPlanes = true;
886*35ffd701SAndroid Build Coastguard Worker
887*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.CCS && !pGmmLibContext->GetSkuTable().FtrFlatPhysCCS) // alignment adjustment needed only for aux tables
888*35ffd701SAndroid Build Coastguard Worker {
889*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_64KB_TILE(pTexInfo->Flags))
890*35ffd701SAndroid Build Coastguard Worker {
891*35ffd701SAndroid Build Coastguard Worker TileHeight *= (!WA64K(pGmmLibContext) && !WA16K(pGmmLibContext)) ? 16 : 1; // For 64Kb Tile mode: Multiply TileHeight by 16 for 1 MB alignment
892*35ffd701SAndroid Build Coastguard Worker }
893*35ffd701SAndroid Build Coastguard Worker else
894*35ffd701SAndroid Build Coastguard Worker {
895*35ffd701SAndroid Build Coastguard Worker TileHeight *= (WA16K(pGmmLibContext) ? 1 : WA64K(pGmmLibContext) ? 4 : 64); // For 4k Tile: Multiply TileHeight by 4 and Pitch by 4 for 64kb alignment, multiply TileHeight by 64 and Pitch by 4 for 1 MB alignment
896*35ffd701SAndroid Build Coastguard Worker }
897*35ffd701SAndroid Build Coastguard Worker }
898*35ffd701SAndroid Build Coastguard Worker
899*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Format == GMM_FORMAT_IMC2 || // IMC2, IMC4 needs even tile columns
900*35ffd701SAndroid Build Coastguard Worker pTexInfo->Format == GMM_FORMAT_IMC4)
901*35ffd701SAndroid Build Coastguard Worker {
902*35ffd701SAndroid Build Coastguard Worker // If the U & V planes are side-by-side then the surface pitch must be
903*35ffd701SAndroid Build Coastguard Worker // padded out so that U and V planes will being on a tile boundary.
904*35ffd701SAndroid Build Coastguard Worker // This means that an odd Y plane width must be padded out
905*35ffd701SAndroid Build Coastguard Worker // with an additional tile. Even widths do not need padding
906*35ffd701SAndroid Build Coastguard Worker uint32_t TileCols = GFX_CEIL_DIV(WidthBytesPhysical, TileWidth);
907*35ffd701SAndroid Build Coastguard Worker if(TileCols % 2)
908*35ffd701SAndroid Build Coastguard Worker {
909*35ffd701SAndroid Build Coastguard Worker WidthBytesPhysical = (TileCols + 1) * TileWidth;
910*35ffd701SAndroid Build Coastguard Worker }
911*35ffd701SAndroid Build Coastguard Worker }
912*35ffd701SAndroid Build Coastguard Worker
913*35ffd701SAndroid Build Coastguard Worker Height = GFX_ALIGN(YHeight, TileHeight) + (UVPacked ? GFX_ALIGN(AdjustedVHeight, TileHeight) :
914*35ffd701SAndroid Build Coastguard Worker (GFX_ALIGN(VHeight, TileHeight) + GFX_ALIGN(AdjustedVHeight, TileHeight)));
915*35ffd701SAndroid Build Coastguard Worker
916*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_64KB_TILE(pTexInfo->Flags) || pTexInfo->Flags.Info.TiledYf)
917*35ffd701SAndroid Build Coastguard Worker {
918*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.RedecribedPlanes = true;
919*35ffd701SAndroid Build Coastguard Worker }
920*35ffd701SAndroid Build Coastguard Worker }
921*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
922*35ffd701SAndroid Build Coastguard Worker {
923*35ffd701SAndroid Build Coastguard Worker uint32_t TileHeight = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileHeight;
924*35ffd701SAndroid Build Coastguard Worker
925*35ffd701SAndroid Build Coastguard Worker BitsPerPixel = 8;
926*35ffd701SAndroid Build Coastguard Worker
927*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Format == GMM_FORMAT_IMC2 || // IMC2, IMC4 needs even tile columns
928*35ffd701SAndroid Build Coastguard Worker pTexInfo->Format == GMM_FORMAT_IMC4)
929*35ffd701SAndroid Build Coastguard Worker {
930*35ffd701SAndroid Build Coastguard Worker // If the U & V planes are side-by-side then the surface pitch must be
931*35ffd701SAndroid Build Coastguard Worker // padded out so that U and V planes will being on a tile boundary.
932*35ffd701SAndroid Build Coastguard Worker // This means that an odd Y plane width must be padded out
933*35ffd701SAndroid Build Coastguard Worker // with an additional tile. Even widths do not need padding
934*35ffd701SAndroid Build Coastguard Worker
935*35ffd701SAndroid Build Coastguard Worker // CCS must use padded main surface width, so get main surface TileWidth
936*35ffd701SAndroid Build Coastguard Worker #define CCSMODE_TO_TILEMODE(y) ((y + TILE_YF_2D_8bpe) < TILE_YS_1D_8bpe) ? (y + TILE_YF_2D_8bpe) : \
937*35ffd701SAndroid Build Coastguard Worker ((y + TILE_YF_2D_8bpe + 5) >= TILE_YS_1D_128bpe) ? (y + TILE_YF_2D_8bpe + 5) : TILE_NONE
938*35ffd701SAndroid Build Coastguard Worker
939*35ffd701SAndroid Build Coastguard Worker uint32_t BaseTileWidth = pPlatform->TileInfo[CCSMODE_TO_TILEMODE(pTexInfo->CCSModeAlign)].LogicalTileWidth;
940*35ffd701SAndroid Build Coastguard Worker WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical, 2 * BaseTileWidth);
941*35ffd701SAndroid Build Coastguard Worker }
942*35ffd701SAndroid Build Coastguard Worker
943*35ffd701SAndroid Build Coastguard Worker AlignedWidth = GFX_ULONG_CAST(WidthBytesPhysical / (pTexInfo->BitsPerPixel >> 3));
944*35ffd701SAndroid Build Coastguard Worker
945*35ffd701SAndroid Build Coastguard Worker WidthBytesPhysical = __GMM_EXPAND_WIDTH(this, AlignedWidth, pTexInfo->Alignment.HAlign, pTexInfo);
946*35ffd701SAndroid Build Coastguard Worker WidthBytesPhysical = ScaleTextureWidth(pTexInfo, WidthBytesPhysical); //Should both YAux and UVAux use same CCModeALign (ie using common bpe?)
947*35ffd701SAndroid Build Coastguard Worker //If different, then copy Aux info from per-plane Aux? HW has separate bpe or common?
948*35ffd701SAndroid Build Coastguard Worker YHeight = __GMM_EXPAND_HEIGHT(this, YHeight, pTexInfo->Alignment.VAlign, pTexInfo);
949*35ffd701SAndroid Build Coastguard Worker YHeight = ScaleTextureHeight(pTexInfo, YHeight);
950*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(YHeight, TileHeight);
951*35ffd701SAndroid Build Coastguard Worker
952*35ffd701SAndroid Build Coastguard Worker VHeight = __GMM_EXPAND_HEIGHT(this, VHeight, pTexInfo->Alignment.VAlign, pTexInfo);
953*35ffd701SAndroid Build Coastguard Worker VHeight = ScaleTextureHeight(pTexInfo, VHeight);
954*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(VHeight, TileHeight);
955*35ffd701SAndroid Build Coastguard Worker
956*35ffd701SAndroid Build Coastguard Worker Height = YHeight + VHeight;
957*35ffd701SAndroid Build Coastguard Worker }
958*35ffd701SAndroid Build Coastguard Worker
959*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.RedecribedPlanes)
960*35ffd701SAndroid Build Coastguard Worker {
961*35ffd701SAndroid Build Coastguard Worker if(false == RedescribeTexturePlanes(pTexInfo, &WidthBytesPhysical))
962*35ffd701SAndroid Build Coastguard Worker {
963*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(false);
964*35ffd701SAndroid Build Coastguard Worker }
965*35ffd701SAndroid Build Coastguard Worker }
966*35ffd701SAndroid Build Coastguard Worker
967*35ffd701SAndroid Build Coastguard Worker if((Status = // <-- Note assignment.
968*35ffd701SAndroid Build Coastguard Worker FillTexPitchAndSize(
969*35ffd701SAndroid Build Coastguard Worker pTexInfo, WidthBytesPhysical, Height, pRestrictions)) == GMM_SUCCESS)
970*35ffd701SAndroid Build Coastguard Worker {
971*35ffd701SAndroid Build Coastguard Worker FillPlanarOffsetAddress(pTexInfo);
972*35ffd701SAndroid Build Coastguard Worker }
973*35ffd701SAndroid Build Coastguard Worker
974*35ffd701SAndroid Build Coastguard Worker // Planar & hybrid 2D arrays supported in DX11.1+ spec but not HW. Memory layout
975*35ffd701SAndroid Build Coastguard Worker // is defined by SW requirements; Y plane must be 4KB aligned.
976*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->ArraySize > 1)
977*35ffd701SAndroid Build Coastguard Worker {
978*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T ElementSizeBytes = pTexInfo->Size;
979*35ffd701SAndroid Build Coastguard Worker int64_t LargeSize;
980*35ffd701SAndroid Build Coastguard Worker
981*35ffd701SAndroid Build Coastguard Worker // Size should always be page aligned.
982*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT((pTexInfo->Size % PAGE_SIZE) == 0);
983*35ffd701SAndroid Build Coastguard Worker
984*35ffd701SAndroid Build Coastguard Worker if((LargeSize = (int64_t)ElementSizeBytes * pTexInfo->ArraySize) <= pPlatform->SurfaceMaxSize)
985*35ffd701SAndroid Build Coastguard Worker {
986*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.ArrayQPitch = ElementSizeBytes;
987*35ffd701SAndroid Build Coastguard Worker pTexInfo->Size = LargeSize;
988*35ffd701SAndroid Build Coastguard Worker }
989*35ffd701SAndroid Build Coastguard Worker else
990*35ffd701SAndroid Build Coastguard Worker {
991*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Surface too large!");
992*35ffd701SAndroid Build Coastguard Worker Status = GMM_ERROR;
993*35ffd701SAndroid Build Coastguard Worker }
994*35ffd701SAndroid Build Coastguard Worker }
995*35ffd701SAndroid Build Coastguard Worker
996*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
997*35ffd701SAndroid Build Coastguard Worker return (Status);
998*35ffd701SAndroid Build Coastguard Worker } // FillTexPlanar
999*35ffd701SAndroid Build Coastguard Worker
GetCCSScaleFactor(GMM_TEXTURE_INFO * pTexInfo,CCS_UNIT & ScaleFactor)1000*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen12TextureCalc::GetCCSScaleFactor(GMM_TEXTURE_INFO *pTexInfo,
1001*35ffd701SAndroid Build Coastguard Worker CCS_UNIT & ScaleFactor)
1002*35ffd701SAndroid Build Coastguard Worker {
1003*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status = GMM_SUCCESS;
1004*35ffd701SAndroid Build Coastguard Worker GMM_TEXTURE_ALIGN_EX TexAlignEx = static_cast<PlatformInfoGen12 *>(pGmmLibContext->GetPlatformInfoObj())->GetExTextureAlign();
1005*35ffd701SAndroid Build Coastguard Worker uint32_t CCSModeIdx = 0;
1006*35ffd701SAndroid Build Coastguard Worker
1007*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) //pTexInfo is RT Surf
1008*35ffd701SAndroid Build Coastguard Worker {
1009*35ffd701SAndroid Build Coastguard Worker CCSModeIdx = CCS_MODE(pTexInfo->TileMode);
1010*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo->TileMode < GMM_TILE_MODES);
1011*35ffd701SAndroid Build Coastguard Worker }
1012*35ffd701SAndroid Build Coastguard Worker else //pTexInfo is CCS Surf
1013*35ffd701SAndroid Build Coastguard Worker {
1014*35ffd701SAndroid Build Coastguard Worker CCSModeIdx = pTexInfo->CCSModeAlign;
1015*35ffd701SAndroid Build Coastguard Worker }
1016*35ffd701SAndroid Build Coastguard Worker
1017*35ffd701SAndroid Build Coastguard Worker if(!(CCSModeIdx < CCS_MODES))
1018*35ffd701SAndroid Build Coastguard Worker {
1019*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0); //indicates something wrong w/ H/V/D Align Filling function or Wrong TileMode set
1020*35ffd701SAndroid Build Coastguard Worker return GMM_ERROR;
1021*35ffd701SAndroid Build Coastguard Worker }
1022*35ffd701SAndroid Build Coastguard Worker
1023*35ffd701SAndroid Build Coastguard Worker ScaleFactor = TexAlignEx.CCSEx[CCSModeIdx];
1024*35ffd701SAndroid Build Coastguard Worker
1025*35ffd701SAndroid Build Coastguard Worker return (Status);
1026*35ffd701SAndroid Build Coastguard Worker }
1027*35ffd701SAndroid Build Coastguard Worker
GetCCSExMode(GMM_TEXTURE_INFO * AuxSurf)1028*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen12TextureCalc::GetCCSExMode(GMM_TEXTURE_INFO *AuxSurf)
1029*35ffd701SAndroid Build Coastguard Worker {
1030*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_4KB_TILE(AuxSurf->Flags) || GMM_IS_64KB_TILE(AuxSurf->Flags) || AuxSurf->Flags.Info.Linear)
1031*35ffd701SAndroid Build Coastguard Worker {
1032*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetSkuTable().FtrLinearCCS)
1033*35ffd701SAndroid Build Coastguard Worker {
1034*35ffd701SAndroid Build Coastguard Worker AuxSurf->Flags.Gpu.__NonMsaaLinearCCS = 1;
1035*35ffd701SAndroid Build Coastguard Worker }
1036*35ffd701SAndroid Build Coastguard Worker else
1037*35ffd701SAndroid Build Coastguard Worker {
1038*35ffd701SAndroid Build Coastguard Worker AuxSurf->Flags.Gpu.__NonMsaaTileYCcs = 1;
1039*35ffd701SAndroid Build Coastguard Worker //CCS is always 2D, even for 3D surface
1040*35ffd701SAndroid Build Coastguard Worker if(AuxSurf->Type == RESOURCE_CUBE)
1041*35ffd701SAndroid Build Coastguard Worker {
1042*35ffd701SAndroid Build Coastguard Worker AuxSurf->ArraySize = 6;
1043*35ffd701SAndroid Build Coastguard Worker }
1044*35ffd701SAndroid Build Coastguard Worker AuxSurf->Type = RESOURCE_2D;
1045*35ffd701SAndroid Build Coastguard Worker }
1046*35ffd701SAndroid Build Coastguard Worker if(AuxSurf->Flags.Gpu.__NonMsaaTileYCcs)
1047*35ffd701SAndroid Build Coastguard Worker {
1048*35ffd701SAndroid Build Coastguard Worker AuxSurf->CCSModeAlign = 0;
1049*35ffd701SAndroid Build Coastguard Worker SetTileMode(AuxSurf);
1050*35ffd701SAndroid Build Coastguard Worker /*if (AuxSurf->Flags.Gpu.UnifiedAuxSurface)*/
1051*35ffd701SAndroid Build Coastguard Worker {
1052*35ffd701SAndroid Build Coastguard Worker AuxSurf->CCSModeAlign = CCS_MODE(AuxSurf->TileMode);
1053*35ffd701SAndroid Build Coastguard Worker }
1054*35ffd701SAndroid Build Coastguard Worker AuxSurf->TileMode = TILE_NONE;
1055*35ffd701SAndroid Build Coastguard Worker
1056*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(AuxSurf->CCSModeAlign < CCS_MODES);
1057*35ffd701SAndroid Build Coastguard Worker return (AuxSurf->CCSModeAlign < CCS_MODES) ? GMM_SUCCESS : GMM_INVALIDPARAM;
1058*35ffd701SAndroid Build Coastguard Worker }
1059*35ffd701SAndroid Build Coastguard Worker }
1060*35ffd701SAndroid Build Coastguard Worker return GMM_SUCCESS;
1061*35ffd701SAndroid Build Coastguard Worker }
1062*35ffd701SAndroid Build Coastguard Worker
ScaleTextureHeight(GMM_TEXTURE_INFO * pTexInfo,uint32_t Height)1063*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmGen12TextureCalc::ScaleTextureHeight(GMM_TEXTURE_INFO *pTexInfo, uint32_t Height)
1064*35ffd701SAndroid Build Coastguard Worker {
1065*35ffd701SAndroid Build Coastguard Worker uint32_t ScaledHeight = Height;
1066*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
1067*35ffd701SAndroid Build Coastguard Worker {
1068*35ffd701SAndroid Build Coastguard Worker CCS_UNIT ScaleFactor;
1069*35ffd701SAndroid Build Coastguard Worker GetCCSScaleFactor(pTexInfo, ScaleFactor);
1070*35ffd701SAndroid Build Coastguard Worker
1071*35ffd701SAndroid Build Coastguard Worker ScaledHeight /= ScaleFactor.Downscale.Height;
1072*35ffd701SAndroid Build Coastguard Worker }
1073*35ffd701SAndroid Build Coastguard Worker
1074*35ffd701SAndroid Build Coastguard Worker return ScaledHeight;
1075*35ffd701SAndroid Build Coastguard Worker }
1076*35ffd701SAndroid Build Coastguard Worker
ScaleTextureWidth(GMM_TEXTURE_INFO * pTexInfo,uint32_t Width)1077*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmGen12TextureCalc::ScaleTextureWidth(GMM_TEXTURE_INFO *pTexInfo, uint32_t Width)
1078*35ffd701SAndroid Build Coastguard Worker {
1079*35ffd701SAndroid Build Coastguard Worker uint32_t ScaledWidth = Width;
1080*35ffd701SAndroid Build Coastguard Worker
1081*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.CCS && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
1082*35ffd701SAndroid Build Coastguard Worker {
1083*35ffd701SAndroid Build Coastguard Worker CCS_UNIT ScaleFactor;
1084*35ffd701SAndroid Build Coastguard Worker GetCCSScaleFactor(pTexInfo, ScaleFactor);
1085*35ffd701SAndroid Build Coastguard Worker
1086*35ffd701SAndroid Build Coastguard Worker
1087*35ffd701SAndroid Build Coastguard Worker if(ScaleFactor.Downscale.Width < 0)
1088*35ffd701SAndroid Build Coastguard Worker {
1089*35ffd701SAndroid Build Coastguard Worker ScaledWidth *= ((-1) * ScaleFactor.Downscale.Width);
1090*35ffd701SAndroid Build Coastguard Worker }
1091*35ffd701SAndroid Build Coastguard Worker else
1092*35ffd701SAndroid Build Coastguard Worker {
1093*35ffd701SAndroid Build Coastguard Worker ScaledWidth /= ScaleFactor.Downscale.Width;
1094*35ffd701SAndroid Build Coastguard Worker }
1095*35ffd701SAndroid Build Coastguard Worker }
1096*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.ColorSeparation)
1097*35ffd701SAndroid Build Coastguard Worker {
1098*35ffd701SAndroid Build Coastguard Worker ScaledWidth *= pTexInfo->ArraySize;
1099*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0 == (ScaledWidth % GMM_COLOR_SEPARATION_WIDTH_DIVISION));
1100*35ffd701SAndroid Build Coastguard Worker ScaledWidth /= GMM_COLOR_SEPARATION_WIDTH_DIVISION;
1101*35ffd701SAndroid Build Coastguard Worker }
1102*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Flags.Gpu.ColorSeparationRGBX)
1103*35ffd701SAndroid Build Coastguard Worker {
1104*35ffd701SAndroid Build Coastguard Worker ScaledWidth *= pTexInfo->ArraySize;
1105*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0 == (ScaledWidth % GMM_COLOR_SEPARATION_RGBX_WIDTH_DIVISION));
1106*35ffd701SAndroid Build Coastguard Worker ScaledWidth /= GMM_COLOR_SEPARATION_RGBX_WIDTH_DIVISION;
1107*35ffd701SAndroid Build Coastguard Worker }
1108*35ffd701SAndroid Build Coastguard Worker
1109*35ffd701SAndroid Build Coastguard Worker return ScaledWidth;
1110*35ffd701SAndroid Build Coastguard Worker }
1111*35ffd701SAndroid Build Coastguard Worker
ScaleFCRectHeight(GMM_TEXTURE_INFO * pTexInfo,uint32_t Height)1112*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmGen12TextureCalc::ScaleFCRectHeight(GMM_TEXTURE_INFO *pTexInfo, uint32_t Height)
1113*35ffd701SAndroid Build Coastguard Worker {
1114*35ffd701SAndroid Build Coastguard Worker uint32_t ScaledHeight = Height;
1115*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.CCS)
1116*35ffd701SAndroid Build Coastguard Worker {
1117*35ffd701SAndroid Build Coastguard Worker CCS_UNIT *FCRectAlign = static_cast<PlatformInfoGen12 *>(pGmmLibContext->GetPlatformInfoObj())->GetFCRectAlign();
1118*35ffd701SAndroid Build Coastguard Worker uint8_t index = FCMaxModes;
1119*35ffd701SAndroid Build Coastguard Worker if((index = FCMode(pTexInfo->TileMode, pTexInfo->BitsPerPixel)) < FCMaxModes)
1120*35ffd701SAndroid Build Coastguard Worker {
1121*35ffd701SAndroid Build Coastguard Worker ScaledHeight = GFX_ALIGN(ScaledHeight, FCRectAlign[index].Align.Height);
1122*35ffd701SAndroid Build Coastguard Worker ScaledHeight /= FCRectAlign[index].Downscale.Height;
1123*35ffd701SAndroid Build Coastguard Worker }
1124*35ffd701SAndroid Build Coastguard Worker else
1125*35ffd701SAndroid Build Coastguard Worker {
1126*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
1127*35ffd701SAndroid Build Coastguard Worker }
1128*35ffd701SAndroid Build Coastguard Worker }
1129*35ffd701SAndroid Build Coastguard Worker
1130*35ffd701SAndroid Build Coastguard Worker return ScaledHeight;
1131*35ffd701SAndroid Build Coastguard Worker }
1132*35ffd701SAndroid Build Coastguard Worker
ScaleFCRectWidth(GMM_TEXTURE_INFO * pTexInfo,uint64_t Width)1133*35ffd701SAndroid Build Coastguard Worker uint64_t GMM_STDCALL GmmLib::GmmGen12TextureCalc::ScaleFCRectWidth(GMM_TEXTURE_INFO *pTexInfo, uint64_t Width)
1134*35ffd701SAndroid Build Coastguard Worker {
1135*35ffd701SAndroid Build Coastguard Worker uint64_t ScaledWidth = Width;
1136*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.CCS)
1137*35ffd701SAndroid Build Coastguard Worker {
1138*35ffd701SAndroid Build Coastguard Worker CCS_UNIT *FCRectAlign = static_cast<PlatformInfoGen12 *>(pGmmLibContext->GetPlatformInfoObj())->GetFCRectAlign();
1139*35ffd701SAndroid Build Coastguard Worker uint8_t index = FCMaxModes;
1140*35ffd701SAndroid Build Coastguard Worker if((index = FCMode(pTexInfo->TileMode, pTexInfo->BitsPerPixel)) < FCMaxModes)
1141*35ffd701SAndroid Build Coastguard Worker {
1142*35ffd701SAndroid Build Coastguard Worker ScaledWidth = GFX_ALIGN(ScaledWidth, FCRectAlign[index].Align.Width);
1143*35ffd701SAndroid Build Coastguard Worker ScaledWidth /= FCRectAlign[index].Downscale.Width;
1144*35ffd701SAndroid Build Coastguard Worker }
1145*35ffd701SAndroid Build Coastguard Worker else
1146*35ffd701SAndroid Build Coastguard Worker {
1147*35ffd701SAndroid Build Coastguard Worker //Unsupported tiling-type for FastClear
1148*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
1149*35ffd701SAndroid Build Coastguard Worker }
1150*35ffd701SAndroid Build Coastguard Worker }
1151*35ffd701SAndroid Build Coastguard Worker
1152*35ffd701SAndroid Build Coastguard Worker return ScaledWidth;
1153*35ffd701SAndroid Build Coastguard Worker }
1154*35ffd701SAndroid Build Coastguard Worker
1155*35ffd701SAndroid Build Coastguard Worker
Get2DFCSurfaceWidthFor3DSurface(GMM_TEXTURE_INFO * pTexInfo,uint64_t Width)1156*35ffd701SAndroid Build Coastguard Worker uint64_t GMM_STDCALL GmmLib::GmmGen12TextureCalc::Get2DFCSurfaceWidthFor3DSurface(GMM_TEXTURE_INFO *pTexInfo,
1157*35ffd701SAndroid Build Coastguard Worker uint64_t Width)
1158*35ffd701SAndroid Build Coastguard Worker {
1159*35ffd701SAndroid Build Coastguard Worker uint64_t Width2D = Width;
1160*35ffd701SAndroid Build Coastguard Worker if (pTexInfo->Flags.Gpu.CCS)
1161*35ffd701SAndroid Build Coastguard Worker {
1162*35ffd701SAndroid Build Coastguard Worker CCS_UNIT *FCRectAlign = static_cast<PlatformInfoGen12 *>(pGmmLibContext->GetPlatformInfoObj())->GetFCRectAlign();
1163*35ffd701SAndroid Build Coastguard Worker uint8_t index = FCMaxModes;
1164*35ffd701SAndroid Build Coastguard Worker if ((index = FCMode(pTexInfo->TileMode, pTexInfo->BitsPerPixel)) < FCMaxModes)
1165*35ffd701SAndroid Build Coastguard Worker {
1166*35ffd701SAndroid Build Coastguard Worker Width2D = GFX_ALIGN(Width2D, FCRectAlign[index].Align.Width);
1167*35ffd701SAndroid Build Coastguard Worker Width2D *= FCRectAlign[index].Downscale.Width;
1168*35ffd701SAndroid Build Coastguard Worker }
1169*35ffd701SAndroid Build Coastguard Worker else
1170*35ffd701SAndroid Build Coastguard Worker {
1171*35ffd701SAndroid Build Coastguard Worker
1172*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
1173*35ffd701SAndroid Build Coastguard Worker }
1174*35ffd701SAndroid Build Coastguard Worker }
1175*35ffd701SAndroid Build Coastguard Worker return Width2D;
1176*35ffd701SAndroid Build Coastguard Worker }
Get2DFCSurfaceHeightFor3DSurface(GMM_TEXTURE_INFO * pTexInfo,uint32_t Height,uint32_t Depth)1177*35ffd701SAndroid Build Coastguard Worker uint64_t GMM_STDCALL GmmLib::GmmGen12TextureCalc::Get2DFCSurfaceHeightFor3DSurface(GMM_TEXTURE_INFO *pTexInfo,
1178*35ffd701SAndroid Build Coastguard Worker uint32_t Height,
1179*35ffd701SAndroid Build Coastguard Worker uint32_t Depth)
1180*35ffd701SAndroid Build Coastguard Worker {
1181*35ffd701SAndroid Build Coastguard Worker uint64_t Height2D = Height;
1182*35ffd701SAndroid Build Coastguard Worker uint32_t Depth3D = Depth;
1183*35ffd701SAndroid Build Coastguard Worker
1184*35ffd701SAndroid Build Coastguard Worker if (pTexInfo->Flags.Gpu.CCS && (Depth > 1))
1185*35ffd701SAndroid Build Coastguard Worker {
1186*35ffd701SAndroid Build Coastguard Worker CCS_UNIT *FCRectAlign = static_cast<PlatformInfoGen12 *>(pGmmLibContext->GetPlatformInfoObj())->GetFCRectAlign();
1187*35ffd701SAndroid Build Coastguard Worker uint8_t index = FCMaxModes;
1188*35ffd701SAndroid Build Coastguard Worker if ((index = FCMode(pTexInfo->TileMode, pTexInfo->BitsPerPixel)) < FCMaxModes)
1189*35ffd701SAndroid Build Coastguard Worker {
1190*35ffd701SAndroid Build Coastguard Worker Height2D = GFX_ALIGN(Height2D, FCRectAlign[index].Align.Height);
1191*35ffd701SAndroid Build Coastguard Worker Height2D *= FCRectAlign[index].Downscale.Height;
1192*35ffd701SAndroid Build Coastguard Worker Depth3D = GFX_ALIGN(Depth3D, FCRectAlign[index].Align.Depth) / FCRectAlign[index].Align.Depth;
1193*35ffd701SAndroid Build Coastguard Worker Height2D *= Depth3D;
1194*35ffd701SAndroid Build Coastguard Worker }
1195*35ffd701SAndroid Build Coastguard Worker else
1196*35ffd701SAndroid Build Coastguard Worker {
1197*35ffd701SAndroid Build Coastguard Worker
1198*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
1199*35ffd701SAndroid Build Coastguard Worker }
1200*35ffd701SAndroid Build Coastguard Worker }
1201*35ffd701SAndroid Build Coastguard Worker return Height2D;
1202*35ffd701SAndroid Build Coastguard Worker }
1203*35ffd701SAndroid Build Coastguard Worker
1204*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1205*35ffd701SAndroid Build Coastguard Worker /// This function does any special-case conversion from client-provided pseudo creation
1206*35ffd701SAndroid Build Coastguard Worker /// parameters to actual parameters for CCS.
1207*35ffd701SAndroid Build Coastguard Worker ///
1208*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: Reference to ::GMM_TEXTURE_INFO
1209*35ffd701SAndroid Build Coastguard Worker ///
1210*35ffd701SAndroid Build Coastguard Worker /// @return ::GMM_STATUS
1211*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
MSAACCSUsage(GMM_TEXTURE_INFO * pTexInfo)1212*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen12TextureCalc::MSAACCSUsage(GMM_TEXTURE_INFO *pTexInfo)
1213*35ffd701SAndroid Build Coastguard Worker {
1214*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status = GMM_SUCCESS;
1215*35ffd701SAndroid Build Coastguard Worker
1216*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->MSAA.NumSamples > 1 && (pTexInfo->Flags.Gpu.MCS)) // CCS for MSAA Compression
1217*35ffd701SAndroid Build Coastguard Worker {
1218*35ffd701SAndroid Build Coastguard Worker Status = MSAACompression(pTexInfo);
1219*35ffd701SAndroid Build Coastguard Worker }
1220*35ffd701SAndroid Build Coastguard Worker else // Non-MSAA CCS Use (i.e. Render Target Fast Clear)
1221*35ffd701SAndroid Build Coastguard Worker {
1222*35ffd701SAndroid Build Coastguard Worker if(!pTexInfo->Flags.Info.TiledW &&
1223*35ffd701SAndroid Build Coastguard Worker (!pTexInfo->Flags.Info.TiledX) &&
1224*35ffd701SAndroid Build Coastguard Worker ((GMM_IS_4KB_TILE(pTexInfo->Flags) || GMM_IS_64KB_TILE(pTexInfo->Flags) ||
1225*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Type == RESOURCE_BUFFER && pTexInfo->Flags.Info.Linear)))) //!Yf - deprecate Yf)
1226*35ffd701SAndroid Build Coastguard Worker {
1227*35ffd701SAndroid Build Coastguard Worker // For non-MSAA CCS usage, the Doc has four tables of
1228*35ffd701SAndroid Build Coastguard Worker // requirements:
1229*35ffd701SAndroid Build Coastguard Worker // (1) RT Alignment (GMM Don't Care: Occurs Naturally)
1230*35ffd701SAndroid Build Coastguard Worker // (2) ClearRect Alignment
1231*35ffd701SAndroid Build Coastguard Worker // (3) ClearRect Scaling (GMM Don't Care: GHAL3D Matter)
1232*35ffd701SAndroid Build Coastguard Worker // (4) Non-MSAA CCS Sizing
1233*35ffd701SAndroid Build Coastguard Worker
1234*35ffd701SAndroid Build Coastguard Worker // Gen8+:
1235*35ffd701SAndroid Build Coastguard Worker // Since mip-mapped and arrayed surfaces are supported, we
1236*35ffd701SAndroid Build Coastguard Worker // deal with alignment later at per mip level. Here, we set
1237*35ffd701SAndroid Build Coastguard Worker // tiling type only. TileX is not supported on Gen9+.
1238*35ffd701SAndroid Build Coastguard Worker // Pre-Gen8:
1239*35ffd701SAndroid Build Coastguard Worker // (!) For all the above, the doc has separate entries for
1240*35ffd701SAndroid Build Coastguard Worker // 32/64/128bpp--and then deals with PIXEL widths--Here,
1241*35ffd701SAndroid Build Coastguard Worker // though, we will unify by considering 8bpp table entries
1242*35ffd701SAndroid Build Coastguard Worker // (unlisted--i.e. do the math)--and deal with BYTE widths.
1243*35ffd701SAndroid Build Coastguard Worker
1244*35ffd701SAndroid Build Coastguard Worker // (1) RT Alignment -- The surface width and height don't
1245*35ffd701SAndroid Build Coastguard Worker // need to be padded to RT CL granularity. On HSW, all tiled
1246*35ffd701SAndroid Build Coastguard Worker // RT's will have appropriate alignment (given 4KB surface
1247*35ffd701SAndroid Build Coastguard Worker // base and no mip-map support) and appropriate padding
1248*35ffd701SAndroid Build Coastguard Worker // (due to tile padding). On BDW+, GMM uses H/VALIGN that
1249*35ffd701SAndroid Build Coastguard Worker // will guarantee the MCS RT alignment for all subresources.
1250*35ffd701SAndroid Build Coastguard Worker
1251*35ffd701SAndroid Build Coastguard Worker // (2) ClearRect Alignment -- I.e. FastClears must be done
1252*35ffd701SAndroid Build Coastguard Worker // with certain granularity:
1253*35ffd701SAndroid Build Coastguard Worker // TileY: 512 Bytes x 128 Lines
1254*35ffd701SAndroid Build Coastguard Worker // TileX: 1024 Bytes x 64 Lines
1255*35ffd701SAndroid Build Coastguard Worker // So a CCS must be sized to match that granularity (though
1256*35ffd701SAndroid Build Coastguard Worker // the RT itself need not be fully padded to that
1257*35ffd701SAndroid Build Coastguard Worker // granularity to use FastClear).
1258*35ffd701SAndroid Build Coastguard Worker
1259*35ffd701SAndroid Build Coastguard Worker // (4) Non-MSAA CCS Sizing -- CCS sizing is based on the
1260*35ffd701SAndroid Build Coastguard Worker // size of the FastClear (with granularity padding) for the
1261*35ffd701SAndroid Build Coastguard Worker // paired RT. CCS's (byte widths and heights) are scaled
1262*35ffd701SAndroid Build Coastguard Worker // down from their RT's by:
1263*35ffd701SAndroid Build Coastguard Worker // TileY: 32 x 32
1264*35ffd701SAndroid Build Coastguard Worker // TileX: 64 x 16
1265*35ffd701SAndroid Build Coastguard Worker
1266*35ffd701SAndroid Build Coastguard Worker // ### Example #############################################
1267*35ffd701SAndroid Build Coastguard Worker // RT: 800x600, 32bpp, TileY
1268*35ffd701SAndroid Build Coastguard Worker // 8bpp: 3200x600
1269*35ffd701SAndroid Build Coastguard Worker // FastClear: 3584x640 (for TileY FastClear Granularity of 512x128)
1270*35ffd701SAndroid Build Coastguard Worker // CCS: 112x20 (for TileY RT:CCS Sizing Downscale of 32x32)
1271*35ffd701SAndroid Build Coastguard Worker
1272*35ffd701SAndroid Build Coastguard Worker GetCCSExMode(pTexInfo);
1273*35ffd701SAndroid Build Coastguard Worker }
1274*35ffd701SAndroid Build Coastguard Worker else
1275*35ffd701SAndroid Build Coastguard Worker {
1276*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Illegal CCS creation parameters!");
1277*35ffd701SAndroid Build Coastguard Worker Status = GMM_ERROR;
1278*35ffd701SAndroid Build Coastguard Worker }
1279*35ffd701SAndroid Build Coastguard Worker }
1280*35ffd701SAndroid Build Coastguard Worker return Status;
1281*35ffd701SAndroid Build Coastguard Worker }
1282*35ffd701SAndroid Build Coastguard Worker
1283*35ffd701SAndroid Build Coastguard Worker
1284*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1285*35ffd701SAndroid Build Coastguard Worker /// Returns the mip offset of given LOD in Mip Tail
1286*35ffd701SAndroid Build Coastguard Worker ///
1287*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
1288*35ffd701SAndroid Build Coastguard Worker /// MipLevel: mip-map level
1289*35ffd701SAndroid Build Coastguard Worker ///
1290*35ffd701SAndroid Build Coastguard Worker /// @return offset value of LOD in bytes
1291*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetMipTailByteOffset(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)1292*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmGen12TextureCalc::GetMipTailByteOffset(GMM_TEXTURE_INFO *pTexInfo,
1293*35ffd701SAndroid Build Coastguard Worker uint32_t MipLevel)
1294*35ffd701SAndroid Build Coastguard Worker {
1295*35ffd701SAndroid Build Coastguard Worker uint32_t ByteOffset = 0, Slot = 0xff;
1296*35ffd701SAndroid Build Coastguard Worker
1297*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
1298*35ffd701SAndroid Build Coastguard Worker
1299*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetSkuTable().FtrTileY)
1300*35ffd701SAndroid Build Coastguard Worker {
1301*35ffd701SAndroid Build Coastguard Worker return GmmGen11TextureCalc::GetMipTailByteOffset(pTexInfo, MipLevel);
1302*35ffd701SAndroid Build Coastguard Worker }
1303*35ffd701SAndroid Build Coastguard Worker // 3D textures follow the Gen10 mip tail format
1304*35ffd701SAndroid Build Coastguard Worker if(!pGmmLibContext->GetSkuTable().FtrStandardMipTailFormat)
1305*35ffd701SAndroid Build Coastguard Worker {
1306*35ffd701SAndroid Build Coastguard Worker return GmmGen9TextureCalc::GetMipTailByteOffset(pTexInfo, MipLevel);
1307*35ffd701SAndroid Build Coastguard Worker }
1308*35ffd701SAndroid Build Coastguard Worker
1309*35ffd701SAndroid Build Coastguard Worker // Til64 is the only format which supports MipTail on FtrTileY disabled platforms
1310*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo->Flags.Info.Tile64);
1311*35ffd701SAndroid Build Coastguard Worker // Mipped MSAA is not supported for Tile64
1312*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo->MSAA.NumSamples <= 1);
1313*35ffd701SAndroid Build Coastguard Worker
1314*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Type == RESOURCE_1D) || (pTexInfo->Type == RESOURCE_3D) || (pTexInfo->Type == RESOURCE_2D || pTexInfo->Type == RESOURCE_CUBE))
1315*35ffd701SAndroid Build Coastguard Worker {
1316*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod;
1317*35ffd701SAndroid Build Coastguard Worker }
1318*35ffd701SAndroid Build Coastguard Worker
1319*35ffd701SAndroid Build Coastguard Worker // Miptail Slot layout in Tile64: as per specifications
1320*35ffd701SAndroid Build Coastguard Worker // Byteoffset varies based on bpp for tile64 format, so any caller who needs to use byteoffset needs to call cpuswizzle with corresponding geomteric offsets
1321*35ffd701SAndroid Build Coastguard Worker // Returning ByteOffset as 0 for Tile64 always
1322*35ffd701SAndroid Build Coastguard Worker
1323*35ffd701SAndroid Build Coastguard Worker // GMM_DPF_CRITICAL("Miptail byte offset requested for Tile64 \r\n");
1324*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
1325*35ffd701SAndroid Build Coastguard Worker
1326*35ffd701SAndroid Build Coastguard Worker // return ByteOffset=0, i.e return start of miptail for any address within packed miptail
1327*35ffd701SAndroid Build Coastguard Worker return (ByteOffset);
1328*35ffd701SAndroid Build Coastguard Worker }
1329*35ffd701SAndroid Build Coastguard Worker
GetMipTailGeometryOffset(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel,uint32_t * OffsetX,uint32_t * OffsetY,uint32_t * OffsetZ)1330*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmGen12TextureCalc::GetMipTailGeometryOffset(GMM_TEXTURE_INFO *pTexInfo,
1331*35ffd701SAndroid Build Coastguard Worker uint32_t MipLevel,
1332*35ffd701SAndroid Build Coastguard Worker uint32_t * OffsetX,
1333*35ffd701SAndroid Build Coastguard Worker uint32_t * OffsetY,
1334*35ffd701SAndroid Build Coastguard Worker uint32_t * OffsetZ)
1335*35ffd701SAndroid Build Coastguard Worker {
1336*35ffd701SAndroid Build Coastguard Worker uint32_t ArrayIndex = 0;
1337*35ffd701SAndroid Build Coastguard Worker uint32_t Slot = 0;
1338*35ffd701SAndroid Build Coastguard Worker
1339*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
1340*35ffd701SAndroid Build Coastguard Worker
1341*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetSkuTable().FtrTileY)
1342*35ffd701SAndroid Build Coastguard Worker {
1343*35ffd701SAndroid Build Coastguard Worker return GmmGen11TextureCalc::GetMipTailGeometryOffset(pTexInfo, MipLevel, OffsetX, OffsetY, OffsetZ);
1344*35ffd701SAndroid Build Coastguard Worker }
1345*35ffd701SAndroid Build Coastguard Worker
1346*35ffd701SAndroid Build Coastguard Worker // Til64 is the only format which supports MipTail on FtrTileY disabled platforms
1347*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo->Flags.Info.Tile64);
1348*35ffd701SAndroid Build Coastguard Worker // Mipped MSAA is not supported for Tile64
1349*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo->MSAA.NumSamples <= 1);
1350*35ffd701SAndroid Build Coastguard Worker
1351*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->BitsPerPixel)
1352*35ffd701SAndroid Build Coastguard Worker {
1353*35ffd701SAndroid Build Coastguard Worker case 128:
1354*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 0;
1355*35ffd701SAndroid Build Coastguard Worker break;
1356*35ffd701SAndroid Build Coastguard Worker case 64:
1357*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 1;
1358*35ffd701SAndroid Build Coastguard Worker break;
1359*35ffd701SAndroid Build Coastguard Worker case 32:
1360*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 2;
1361*35ffd701SAndroid Build Coastguard Worker break;
1362*35ffd701SAndroid Build Coastguard Worker case 16:
1363*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 3;
1364*35ffd701SAndroid Build Coastguard Worker break;
1365*35ffd701SAndroid Build Coastguard Worker case 8:
1366*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 4;
1367*35ffd701SAndroid Build Coastguard Worker break;
1368*35ffd701SAndroid Build Coastguard Worker default:
1369*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
1370*35ffd701SAndroid Build Coastguard Worker break;
1371*35ffd701SAndroid Build Coastguard Worker }
1372*35ffd701SAndroid Build Coastguard Worker
1373*35ffd701SAndroid Build Coastguard Worker
1374*35ffd701SAndroid Build Coastguard Worker // FtrTileY disabled platforms: platforms which support Tile4/Tile64 tiled formats
1375*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Type == RESOURCE_1D)
1376*35ffd701SAndroid Build Coastguard Worker {
1377*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod;
1378*35ffd701SAndroid Build Coastguard Worker
1379*35ffd701SAndroid Build Coastguard Worker *OffsetX = MipTailSlotOffset1DSurface[Slot][ArrayIndex].X * pTexInfo->BitsPerPixel / 8;
1380*35ffd701SAndroid Build Coastguard Worker *OffsetY = MipTailSlotOffset1DSurface[Slot][ArrayIndex].Y;
1381*35ffd701SAndroid Build Coastguard Worker *OffsetZ = MipTailSlotOffset1DSurface[Slot][ArrayIndex].Z;
1382*35ffd701SAndroid Build Coastguard Worker }
1383*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Type == RESOURCE_2D || pTexInfo->Type == RESOURCE_CUBE)
1384*35ffd701SAndroid Build Coastguard Worker {
1385*35ffd701SAndroid Build Coastguard Worker // Mipped MSAA is not supported on Tile64, so need not account for MSAA here
1386*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod;
1387*35ffd701SAndroid Build Coastguard Worker
1388*35ffd701SAndroid Build Coastguard Worker *OffsetX = MipTailSlotOffset2DSurface[Slot][ArrayIndex].X * pTexInfo->BitsPerPixel / 8;
1389*35ffd701SAndroid Build Coastguard Worker *OffsetY = MipTailSlotOffset2DSurface[Slot][ArrayIndex].Y;
1390*35ffd701SAndroid Build Coastguard Worker *OffsetZ = MipTailSlotOffset2DSurface[Slot][ArrayIndex].Z;
1391*35ffd701SAndroid Build Coastguard Worker }
1392*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Type == RESOURCE_3D)
1393*35ffd701SAndroid Build Coastguard Worker {
1394*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod;
1395*35ffd701SAndroid Build Coastguard Worker
1396*35ffd701SAndroid Build Coastguard Worker *OffsetX = MipTailSlotOffset3DSurface[Slot][ArrayIndex].X * pTexInfo->BitsPerPixel / 8;
1397*35ffd701SAndroid Build Coastguard Worker *OffsetY = MipTailSlotOffset3DSurface[Slot][ArrayIndex].Y;
1398*35ffd701SAndroid Build Coastguard Worker *OffsetZ = MipTailSlotOffset3DSurface[Slot][ArrayIndex].Z;
1399*35ffd701SAndroid Build Coastguard Worker }
1400*35ffd701SAndroid Build Coastguard Worker
1401*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
1402*35ffd701SAndroid Build Coastguard Worker return;
1403*35ffd701SAndroid Build Coastguard Worker }
1404*35ffd701SAndroid Build Coastguard Worker
1405