xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/Texture/GmmXe_LPGTexture.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2022 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker 
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker 
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker 
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker 
23*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
24*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/Texture/GmmGen10TextureCalc.h"
25*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/Texture/GmmGen11TextureCalc.h"
26*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/Texture/GmmGen12TextureCalc.h"
27*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/Texture/GmmXe_LPGTextureCalc.h"
28*35ffd701SAndroid Build Coastguard Worker 
29*35ffd701SAndroid Build Coastguard Worker 
30*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
31*35ffd701SAndroid Build Coastguard Worker /// This function will Setup a planar surface allocation.
32*35ffd701SAndroid Build Coastguard Worker ///
33*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: Reference to ::GMM_TEXTURE_INFO
34*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pRestrictions: Reference to surface alignment and size restrictions.
35*35ffd701SAndroid Build Coastguard Worker ///
36*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
37*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTexPlanar(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)38*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmXe_LPGTextureCalc::FillTexPlanar(GMM_TEXTURE_INFO * pTexInfo,
39*35ffd701SAndroid Build Coastguard Worker                                                                    __GMM_BUFFER_TYPE *pRestrictions)
40*35ffd701SAndroid Build Coastguard Worker {
41*35ffd701SAndroid Build Coastguard Worker     uint32_t   WidthBytesPhysical, Height, YHeight, VHeight;
42*35ffd701SAndroid Build Coastguard Worker     uint32_t   AdjustedVHeight = 0;
43*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS Status;
44*35ffd701SAndroid Build Coastguard Worker     bool       UVPacked = false;
45*35ffd701SAndroid Build Coastguard Worker     uint32_t   BitsPerPixel, AlignedWidth;
46*35ffd701SAndroid Build Coastguard Worker 
47*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
48*35ffd701SAndroid Build Coastguard Worker 
49*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
50*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pRestrictions, GMM_ERROR);
51*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(!pTexInfo->Flags.Info.TiledW);
52*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
53*35ffd701SAndroid Build Coastguard Worker 
54*35ffd701SAndroid Build Coastguard Worker     BitsPerPixel = pTexInfo->BitsPerPixel;
55*35ffd701SAndroid Build Coastguard Worker     AlignedWidth = GFX_ULONG_CAST(pTexInfo->BaseWidth);
56*35ffd701SAndroid Build Coastguard Worker 
57*35ffd701SAndroid Build Coastguard Worker     if(!pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
58*35ffd701SAndroid Build Coastguard Worker     {
59*35ffd701SAndroid Build Coastguard Worker         pTexInfo->TileMode = TILE_NONE;
60*35ffd701SAndroid Build Coastguard Worker     }
61*35ffd701SAndroid Build Coastguard Worker     else
62*35ffd701SAndroid Build Coastguard Worker     {
63*35ffd701SAndroid Build Coastguard Worker         pTexInfo->TileMode = LEGACY_TILE_Y;
64*35ffd701SAndroid Build Coastguard Worker     }
65*35ffd701SAndroid Build Coastguard Worker 
66*35ffd701SAndroid Build Coastguard Worker     WidthBytesPhysical = AlignedWidth * BitsPerPixel >> 3;
67*35ffd701SAndroid Build Coastguard Worker     Height = VHeight = 0;
68*35ffd701SAndroid Build Coastguard Worker 
69*35ffd701SAndroid Build Coastguard Worker     YHeight = pTexInfo->BaseHeight;
70*35ffd701SAndroid Build Coastguard Worker 
71*35ffd701SAndroid Build Coastguard Worker     switch(pTexInfo->Format)
72*35ffd701SAndroid Build Coastguard Worker     {
73*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC1: // IMC1 = IMC3 with Swapped U/V
74*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC3:
75*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV420: // Same as IMC3.
76*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
77*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
78*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
79*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
80*35ffd701SAndroid Build Coastguard Worker         // UUUU
81*35ffd701SAndroid Build Coastguard Worker         // UUUU
82*35ffd701SAndroid Build Coastguard Worker         // VVVV
83*35ffd701SAndroid Build Coastguard Worker         // VVVV
84*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV422V: // Similar to IMC3 but U/V are full width.
85*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
86*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
87*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
88*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
89*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
90*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
91*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
92*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
93*35ffd701SAndroid Build Coastguard Worker             {
94*35ffd701SAndroid Build Coastguard Worker                 VHeight = GFX_ALIGN(GFX_CEIL_DIV(YHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
95*35ffd701SAndroid Build Coastguard Worker 
96*35ffd701SAndroid Build Coastguard Worker                 YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
97*35ffd701SAndroid Build Coastguard Worker 
98*35ffd701SAndroid Build Coastguard Worker                 Height                                      = YHeight + 2 * VHeight; // One VHeight for V and one for U.
99*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes = 3;
100*35ffd701SAndroid Build Coastguard Worker                 break;
101*35ffd701SAndroid Build Coastguard Worker             }
102*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV411R_TYPE: //Similar to IMC3 but U/V are quarther height and full width.
103*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
104*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
105*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
106*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
107*35ffd701SAndroid Build Coastguard Worker             //UUUUUUUU
108*35ffd701SAndroid Build Coastguard Worker             //VVVVVVVV
109*35ffd701SAndroid Build Coastguard Worker             {
110*35ffd701SAndroid Build Coastguard Worker                 VHeight = GFX_ALIGN(GFX_CEIL_DIV(YHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
111*35ffd701SAndroid Build Coastguard Worker 
112*35ffd701SAndroid Build Coastguard Worker                 YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
113*35ffd701SAndroid Build Coastguard Worker 
114*35ffd701SAndroid Build Coastguard Worker                 Height                                      = YHeight + 2 * VHeight;
115*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes = 3;
116*35ffd701SAndroid Build Coastguard Worker                 break;
117*35ffd701SAndroid Build Coastguard Worker             }
118*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV411: // Similar to IMC3 but U/V are quarter width and full height.
119*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
120*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
121*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
122*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
123*35ffd701SAndroid Build Coastguard Worker         // UU
124*35ffd701SAndroid Build Coastguard Worker         // UU
125*35ffd701SAndroid Build Coastguard Worker         // UU
126*35ffd701SAndroid Build Coastguard Worker         // UU
127*35ffd701SAndroid Build Coastguard Worker         // VV
128*35ffd701SAndroid Build Coastguard Worker         // VV
129*35ffd701SAndroid Build Coastguard Worker         // VV
130*35ffd701SAndroid Build Coastguard Worker         // VV
131*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV422H: // Similar to IMC3 but U/V are full height.
132*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
133*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
134*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
135*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
136*35ffd701SAndroid Build Coastguard Worker         // UUUU
137*35ffd701SAndroid Build Coastguard Worker         // UUUU
138*35ffd701SAndroid Build Coastguard Worker         // UUUU
139*35ffd701SAndroid Build Coastguard Worker         // UUUU
140*35ffd701SAndroid Build Coastguard Worker         // VVVV
141*35ffd701SAndroid Build Coastguard Worker         // VVVV
142*35ffd701SAndroid Build Coastguard Worker         // VVVV
143*35ffd701SAndroid Build Coastguard Worker         // VVVV
144*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV444: // Similar to IMC3 but U/V are full size.
145*35ffd701SAndroid Build Coastguard Worker #if _WIN32
146*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_WGBOX_YUV444:
147*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_WGBOX_PLANAR_YUV444:
148*35ffd701SAndroid Build Coastguard Worker #endif
149*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
150*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
151*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
152*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
153*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
154*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
155*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
156*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
157*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
158*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
159*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
160*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
161*35ffd701SAndroid Build Coastguard Worker             {
162*35ffd701SAndroid Build Coastguard Worker                 YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
163*35ffd701SAndroid Build Coastguard Worker                 VHeight = YHeight;
164*35ffd701SAndroid Build Coastguard Worker 
165*35ffd701SAndroid Build Coastguard Worker                 Height                                      = YHeight + 2 * VHeight;
166*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes = 3;
167*35ffd701SAndroid Build Coastguard Worker                 break;
168*35ffd701SAndroid Build Coastguard Worker             }
169*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_BGRP:
170*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_RGBP:
171*35ffd701SAndroid Build Coastguard Worker         {
172*35ffd701SAndroid Build Coastguard Worker             //For RGBP linear Tile keep resource Offset non aligned and for other Tile format to be 16-bit aligned
173*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Info.Linear)
174*35ffd701SAndroid Build Coastguard Worker             {
175*35ffd701SAndroid Build Coastguard Worker                 VHeight = YHeight;
176*35ffd701SAndroid Build Coastguard Worker 
177*35ffd701SAndroid Build Coastguard Worker                 Height                                      = YHeight + 2 * VHeight;
178*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes = 3;
179*35ffd701SAndroid Build Coastguard Worker             }
180*35ffd701SAndroid Build Coastguard Worker             else
181*35ffd701SAndroid Build Coastguard Worker             {
182*35ffd701SAndroid Build Coastguard Worker                 YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
183*35ffd701SAndroid Build Coastguard Worker                 VHeight = YHeight;
184*35ffd701SAndroid Build Coastguard Worker 
185*35ffd701SAndroid Build Coastguard Worker                 Height                                      = YHeight + 2 * VHeight;
186*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes = 3;
187*35ffd701SAndroid Build Coastguard Worker             }
188*35ffd701SAndroid Build Coastguard Worker             break;
189*35ffd701SAndroid Build Coastguard Worker         }
190*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC2: // IMC2 = IMC4 with Swapped U/V
191*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC4:
192*35ffd701SAndroid Build Coastguard Worker         {
193*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
194*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
195*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
196*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
197*35ffd701SAndroid Build Coastguard Worker             // UUUUVVVV
198*35ffd701SAndroid Build Coastguard Worker             // UUUUVVVV
199*35ffd701SAndroid Build Coastguard Worker 
200*35ffd701SAndroid Build Coastguard Worker             YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
201*35ffd701SAndroid Build Coastguard Worker             VHeight = GFX_CEIL_DIV(YHeight, 2);
202*35ffd701SAndroid Build Coastguard Worker 
203*35ffd701SAndroid Build Coastguard Worker             WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical, 2); // If odd YWidth, pitch bumps-up to fit rounded-up U/V planes.
204*35ffd701SAndroid Build Coastguard Worker 
205*35ffd701SAndroid Build Coastguard Worker             Height = YHeight + VHeight;
206*35ffd701SAndroid Build Coastguard Worker 
207*35ffd701SAndroid Build Coastguard Worker             // With SURFACE_STATE.XOffset support, the U-V interface has
208*35ffd701SAndroid Build Coastguard Worker             // much lighter restrictions--which will be naturally met by
209*35ffd701SAndroid Build Coastguard Worker             // surface pitch restrictions (i.e. dividing an IMC2/4 pitch
210*35ffd701SAndroid Build Coastguard Worker             // by 2--to get the U/V interface--will always produce a safe
211*35ffd701SAndroid Build Coastguard Worker             // XOffset value).
212*35ffd701SAndroid Build Coastguard Worker             // Not technically UV packed but sizing works out the same
213*35ffd701SAndroid Build Coastguard Worker             // if the resource is std swizzled
214*35ffd701SAndroid Build Coastguard Worker             UVPacked                                    = true;
215*35ffd701SAndroid Build Coastguard Worker             pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes = 2;
216*35ffd701SAndroid Build Coastguard Worker             break;
217*35ffd701SAndroid Build Coastguard Worker         }
218*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV12:
219*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV21:
220*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV11:
221*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P010:
222*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P012:
223*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P016:
224*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P208:
225*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P216:
226*35ffd701SAndroid Build Coastguard Worker         {
227*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
228*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
229*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
230*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
231*35ffd701SAndroid Build Coastguard Worker             // [UV-Packing]
232*35ffd701SAndroid Build Coastguard Worker 
233*35ffd701SAndroid Build Coastguard Worker             if((pTexInfo->Format == GMM_FORMAT_NV12) ||
234*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_NV21) ||
235*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P010) ||
236*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P012) ||
237*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P016))
238*35ffd701SAndroid Build Coastguard Worker             {
239*35ffd701SAndroid Build Coastguard Worker                 VHeight = GFX_CEIL_DIV(YHeight, 2); // U/V plane half of Y
240*35ffd701SAndroid Build Coastguard Worker                 Height  = YHeight + VHeight;
241*35ffd701SAndroid Build Coastguard Worker             }
242*35ffd701SAndroid Build Coastguard Worker             else
243*35ffd701SAndroid Build Coastguard Worker             {
244*35ffd701SAndroid Build Coastguard Worker                 VHeight = YHeight; // U/V plane is same as Y
245*35ffd701SAndroid Build Coastguard Worker                 Height  = YHeight + VHeight;
246*35ffd701SAndroid Build Coastguard Worker             }
247*35ffd701SAndroid Build Coastguard Worker 
248*35ffd701SAndroid Build Coastguard Worker             if((pTexInfo->Format == GMM_FORMAT_NV12) ||
249*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_NV21) ||
250*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P010) ||
251*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P012) ||
252*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P016) ||
253*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P208) ||
254*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P216))
255*35ffd701SAndroid Build Coastguard Worker             {
256*35ffd701SAndroid Build Coastguard Worker                 WidthBytesPhysical                          = GFX_ALIGN(WidthBytesPhysical, 2); // If odd YWidth, pitch bumps-up to fit rounded-up U/V planes.
257*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes = 2;
258*35ffd701SAndroid Build Coastguard Worker             }
259*35ffd701SAndroid Build Coastguard Worker             else //if(pTexInfo->Format == GMM_FORMAT_NV11)
260*35ffd701SAndroid Build Coastguard Worker             {
261*35ffd701SAndroid Build Coastguard Worker                 // Tiling not supported, since YPitch != UVPitch...
262*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.TiledYf = 0;
263*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.TiledX  = 0;
264*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->Flags.Info.Linear  = 1;
265*35ffd701SAndroid Build Coastguard Worker                 GMM_SET_64KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
266*35ffd701SAndroid Build Coastguard Worker                 GMM_SET_4KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
267*35ffd701SAndroid Build Coastguard Worker             }
268*35ffd701SAndroid Build Coastguard Worker 
269*35ffd701SAndroid Build Coastguard Worker             UVPacked = true;
270*35ffd701SAndroid Build Coastguard Worker             break;
271*35ffd701SAndroid Build Coastguard Worker         }
272*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_I420: // IYUV & I420: are identical to YV12 except,
273*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IYUV: // U & V pl.s are reversed.
274*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_YV12:
275*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_YVU9:
276*35ffd701SAndroid Build Coastguard Worker         {
277*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
278*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
279*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
280*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
281*35ffd701SAndroid Build Coastguard Worker             // VVVVVV..  <-- V and U planes follow the Y plane, as linear
282*35ffd701SAndroid Build Coastguard Worker             // ..UUUUUU      arrays--without respect to pitch.
283*35ffd701SAndroid Build Coastguard Worker 
284*35ffd701SAndroid Build Coastguard Worker             uint32_t YSize, UVSize, YVSizeRShift;
285*35ffd701SAndroid Build Coastguard Worker             uint32_t YSizeForUVPurposes, YSizeForUVPurposesDimensionalAlignment;
286*35ffd701SAndroid Build Coastguard Worker 
287*35ffd701SAndroid Build Coastguard Worker             YSize = WidthBytesPhysical * YHeight;
288*35ffd701SAndroid Build Coastguard Worker 
289*35ffd701SAndroid Build Coastguard Worker             // YVU9 has one U/V pixel for each 4x4 Y block.
290*35ffd701SAndroid Build Coastguard Worker             // The others have one U/V pixel for each 2x2 Y block.
291*35ffd701SAndroid Build Coastguard Worker 
292*35ffd701SAndroid Build Coastguard Worker             // YVU9 has a Y:V size ratio of 16 (4x4 --> 1).
293*35ffd701SAndroid Build Coastguard Worker             // The others have a ratio of 4 (2x2 --> 1).
294*35ffd701SAndroid Build Coastguard Worker             YVSizeRShift = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
295*35ffd701SAndroid Build Coastguard Worker 
296*35ffd701SAndroid Build Coastguard Worker             // If a Y plane isn't fully-aligned to its Y-->U/V block size, the
297*35ffd701SAndroid Build Coastguard Worker             // extra/unaligned Y pixels still need corresponding U/V pixels--So
298*35ffd701SAndroid Build Coastguard Worker             // for the purpose of computing the UVSize, we must consider a
299*35ffd701SAndroid Build Coastguard Worker             // dimensionally "rounded-up" YSize. (E.g. a 13x5 YVU9 Y plane would
300*35ffd701SAndroid Build Coastguard Worker             // require 4x2 U/V planes--the same UVSize as a fully-aligned 16x8 Y.)
301*35ffd701SAndroid Build Coastguard Worker             YSizeForUVPurposesDimensionalAlignment = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
302*35ffd701SAndroid Build Coastguard Worker             YSizeForUVPurposes =
303*35ffd701SAndroid Build Coastguard Worker             GFX_ALIGN(WidthBytesPhysical, YSizeForUVPurposesDimensionalAlignment) *
304*35ffd701SAndroid Build Coastguard Worker             GFX_ALIGN(YHeight, YSizeForUVPurposesDimensionalAlignment);
305*35ffd701SAndroid Build Coastguard Worker 
306*35ffd701SAndroid Build Coastguard Worker             UVSize = 2 * // <-- U + V
307*35ffd701SAndroid Build Coastguard Worker                      (YSizeForUVPurposes >> YVSizeRShift);
308*35ffd701SAndroid Build Coastguard Worker 
309*35ffd701SAndroid Build Coastguard Worker             Height = GFX_CEIL_DIV(YSize + UVSize, WidthBytesPhysical);
310*35ffd701SAndroid Build Coastguard Worker 
311*35ffd701SAndroid Build Coastguard Worker             // Tiling not supported, since YPitch != UVPitch...
312*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledYf                = 0;
313*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.TiledX                 = 0;
314*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.Linear                 = 1;
315*35ffd701SAndroid Build Coastguard Worker             pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes = 1;
316*35ffd701SAndroid Build Coastguard Worker             GMM_SET_64KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
317*35ffd701SAndroid Build Coastguard Worker             GMM_SET_4KB_TILE(pTexInfo->Flags, 0, pGmmLibContext);
318*35ffd701SAndroid Build Coastguard Worker 
319*35ffd701SAndroid Build Coastguard Worker             break;
320*35ffd701SAndroid Build Coastguard Worker         }
321*35ffd701SAndroid Build Coastguard Worker         default:
322*35ffd701SAndroid Build Coastguard Worker         {
323*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Unexpected format");
324*35ffd701SAndroid Build Coastguard Worker             return GMM_ERROR;
325*35ffd701SAndroid Build Coastguard Worker         }
326*35ffd701SAndroid Build Coastguard Worker     }
327*35ffd701SAndroid Build Coastguard Worker 
328*35ffd701SAndroid Build Coastguard Worker     // Align Height to even row to avoid hang if HW over-fetch
329*35ffd701SAndroid Build Coastguard Worker     Height = GFX_ALIGN(Height, __GMM_EVEN_ROW);
330*35ffd701SAndroid Build Coastguard Worker 
331*35ffd701SAndroid Build Coastguard Worker     SetTileMode(pTexInfo);
332*35ffd701SAndroid Build Coastguard Worker 
333*35ffd701SAndroid Build Coastguard Worker     // If the Surface has Odd height dimension, we will fall back to Linear Format.
334*35ffd701SAndroid Build Coastguard Worker     // If MMC is enabled, disable MMC during such cases.
335*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.MMC)
336*35ffd701SAndroid Build Coastguard Worker     {
337*35ffd701SAndroid Build Coastguard Worker         if(!(GMM_IS_4KB_TILE(pTexInfo->Flags) || GMM_IS_64KB_TILE(pTexInfo->Flags)))
338*35ffd701SAndroid Build Coastguard Worker         {
339*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.MMC = 0;
340*35ffd701SAndroid Build Coastguard Worker         }
341*35ffd701SAndroid Build Coastguard Worker     }
342*35ffd701SAndroid Build Coastguard Worker 
343*35ffd701SAndroid Build Coastguard Worker     // If the Surface has Odd height dimension, we will fall back to Linear Format.
344*35ffd701SAndroid Build Coastguard Worker     // If MMC is enabled, disable .CCS/UnifiedAuxSurface during such cases.
345*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.CCS)
346*35ffd701SAndroid Build Coastguard Worker     {
347*35ffd701SAndroid Build Coastguard Worker         if(!(GMM_IS_4KB_TILE(pTexInfo->Flags) || GMM_IS_64KB_TILE(pTexInfo->Flags)) &&
348*35ffd701SAndroid Build Coastguard Worker            !(pTexInfo->Flags.Gpu.__NonMsaaTileYCcs && GMM_IS_4KB_TILE(pTexInfo->Flags)))
349*35ffd701SAndroid Build Coastguard Worker         {
350*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.MMC               = 0;
351*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.CCS               = 0;
352*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.UnifiedAuxSurface = 0;
353*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.__NonMsaaTileYCcs = 0;
354*35ffd701SAndroid Build Coastguard Worker         }
355*35ffd701SAndroid Build Coastguard Worker     }
356*35ffd701SAndroid Build Coastguard Worker 
357*35ffd701SAndroid Build Coastguard Worker     // Legacy Planar "Linear Video" Restrictions...
358*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Info.Linear && !pTexInfo->Flags.Wa.NoLegacyPlanarLinearVideoRestrictions)
359*35ffd701SAndroid Build Coastguard Worker     {
360*35ffd701SAndroid Build Coastguard Worker         pRestrictions->LockPitchAlignment   = GFX_MAX(pRestrictions->LockPitchAlignment, GMM_BYTES(64));
361*35ffd701SAndroid Build Coastguard Worker         pRestrictions->MinPitch             = GFX_MAX(pRestrictions->MinPitch, GMM_BYTES(64));
362*35ffd701SAndroid Build Coastguard Worker         pRestrictions->PitchAlignment       = GFX_MAX(pRestrictions->PitchAlignment, GMM_BYTES(64));
363*35ffd701SAndroid Build Coastguard Worker         pRestrictions->RenderPitchAlignment = GFX_MAX(pRestrictions->RenderPitchAlignment, GMM_BYTES(64));
364*35ffd701SAndroid Build Coastguard Worker     }
365*35ffd701SAndroid Build Coastguard Worker 
366*35ffd701SAndroid Build Coastguard Worker     // Multiply overall pitch alignment for surfaces whose U/V planes have a
367*35ffd701SAndroid Build Coastguard Worker     // pitch down-scaled from that of Y--Since the U/V pitches must meet the
368*35ffd701SAndroid Build Coastguard Worker     // original restriction, the Y pitch must meet a scaled-up multiple.
369*35ffd701SAndroid Build Coastguard Worker     if((pTexInfo->Format == GMM_FORMAT_I420) ||
370*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Format == GMM_FORMAT_IYUV) ||
371*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Format == GMM_FORMAT_NV11) ||
372*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Format == GMM_FORMAT_YV12) ||
373*35ffd701SAndroid Build Coastguard Worker        (pTexInfo->Format == GMM_FORMAT_YVU9))
374*35ffd701SAndroid Build Coastguard Worker     {
375*35ffd701SAndroid Build Coastguard Worker         uint32_t LShift =
376*35ffd701SAndroid Build Coastguard Worker         (pTexInfo->Format != GMM_FORMAT_YVU9) ?
377*35ffd701SAndroid Build Coastguard Worker         1 : // UVPitch = 1/2 YPitch
378*35ffd701SAndroid Build Coastguard Worker         2;  // UVPitch = 1/4 YPitch
379*35ffd701SAndroid Build Coastguard Worker 
380*35ffd701SAndroid Build Coastguard Worker         pRestrictions->LockPitchAlignment <<= LShift;
381*35ffd701SAndroid Build Coastguard Worker         pRestrictions->MinPitch <<= LShift;
382*35ffd701SAndroid Build Coastguard Worker         pRestrictions->PitchAlignment <<= LShift;
383*35ffd701SAndroid Build Coastguard Worker         pRestrictions->RenderPitchAlignment <<= LShift;
384*35ffd701SAndroid Build Coastguard Worker     }
385*35ffd701SAndroid Build Coastguard Worker 
386*35ffd701SAndroid Build Coastguard Worker     AdjustedVHeight = VHeight;
387*35ffd701SAndroid Build Coastguard Worker 
388*35ffd701SAndroid Build Coastguard Worker     FindMipTailStartLod(pTexInfo);
389*35ffd701SAndroid Build Coastguard Worker 
390*35ffd701SAndroid Build Coastguard Worker     // In case of Planar surfaces, only the last Plane has to be aligned to 64 for LCU access
391*35ffd701SAndroid Build Coastguard Worker     if(pGmmLibContext->GetWaTable().WaAlignYUVResourceToLCU && GmmIsYUVFormatLCUAligned(pTexInfo->Format) && VHeight > 0)
392*35ffd701SAndroid Build Coastguard Worker     {
393*35ffd701SAndroid Build Coastguard Worker         AdjustedVHeight = GFX_ALIGN(VHeight, GMM_SCANLINES(GMM_MAX_LCU_SIZE));
394*35ffd701SAndroid Build Coastguard Worker         Height += AdjustedVHeight - VHeight;
395*35ffd701SAndroid Build Coastguard Worker     }
396*35ffd701SAndroid Build Coastguard Worker 
397*35ffd701SAndroid Build Coastguard Worker     // For std swizzled and UV packed tile Ys/Yf cases, the planes
398*35ffd701SAndroid Build Coastguard Worker     // must be tile-boundary aligned. Actual alignment is handled
399*35ffd701SAndroid Build Coastguard Worker     // in FillPlanarOffsetAddress, but height and width must
400*35ffd701SAndroid Build Coastguard Worker     // be adjusted for correct size calculation
401*35ffd701SAndroid Build Coastguard Worker     if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]) &&
402*35ffd701SAndroid Build Coastguard Worker        !pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
403*35ffd701SAndroid Build Coastguard Worker     {
404*35ffd701SAndroid Build Coastguard Worker         uint32_t TileHeight = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileHeight;
405*35ffd701SAndroid Build Coastguard Worker         uint32_t TileWidth  = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileWidth;
406*35ffd701SAndroid Build Coastguard Worker 
407*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.IsTileAlignedPlanes = true;
408*35ffd701SAndroid Build Coastguard Worker 
409*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Gpu.CCS && !pGmmLibContext->GetSkuTable().FtrFlatPhysCCS) // alignment adjustment needed only for aux tables
410*35ffd701SAndroid Build Coastguard Worker         {
411*35ffd701SAndroid Build Coastguard Worker             if(GMM_IS_64KB_TILE(pTexInfo->Flags))
412*35ffd701SAndroid Build Coastguard Worker             {
413*35ffd701SAndroid Build Coastguard Worker                 TileHeight *= (!WA64K(pGmmLibContext) && !WA16K(pGmmLibContext)) ? 16 : 1; // For 64Kb Tile mode: Multiply TileHeight by 16 for 1 MB alignment
414*35ffd701SAndroid Build Coastguard Worker             }
415*35ffd701SAndroid Build Coastguard Worker             else
416*35ffd701SAndroid Build Coastguard Worker             {
417*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
418*35ffd701SAndroid Build Coastguard Worker             }
419*35ffd701SAndroid Build Coastguard Worker         }
420*35ffd701SAndroid Build Coastguard Worker 
421*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Format == GMM_FORMAT_IMC2 || // IMC2, IMC4 needs even tile columns
422*35ffd701SAndroid Build Coastguard Worker            pTexInfo->Format == GMM_FORMAT_IMC4)
423*35ffd701SAndroid Build Coastguard Worker         {
424*35ffd701SAndroid Build Coastguard Worker             // If the U & V planes are side-by-side then the surface pitch must be
425*35ffd701SAndroid Build Coastguard Worker             // padded out so that U and V planes will being on a tile boundary.
426*35ffd701SAndroid Build Coastguard Worker             // This means that an odd Y plane width must be padded out
427*35ffd701SAndroid Build Coastguard Worker             // with an additional tile. Even widths do not need padding
428*35ffd701SAndroid Build Coastguard Worker             uint32_t TileCols = GFX_CEIL_DIV(WidthBytesPhysical, TileWidth);
429*35ffd701SAndroid Build Coastguard Worker             if(TileCols % 2)
430*35ffd701SAndroid Build Coastguard Worker             {
431*35ffd701SAndroid Build Coastguard Worker                 WidthBytesPhysical = (TileCols + 1) * TileWidth;
432*35ffd701SAndroid Build Coastguard Worker             }
433*35ffd701SAndroid Build Coastguard Worker         }
434*35ffd701SAndroid Build Coastguard Worker 
435*35ffd701SAndroid Build Coastguard Worker         Height = GFX_ALIGN(YHeight, TileHeight) + (UVPacked ? GFX_ALIGN(AdjustedVHeight, TileHeight) :
436*35ffd701SAndroid Build Coastguard Worker                                                               (GFX_ALIGN(VHeight, TileHeight) + GFX_ALIGN(AdjustedVHeight, TileHeight)));
437*35ffd701SAndroid Build Coastguard Worker 
438*35ffd701SAndroid Build Coastguard Worker         if(GMM_IS_64KB_TILE(pTexInfo->Flags) || pTexInfo->Flags.Info.TiledYf)
439*35ffd701SAndroid Build Coastguard Worker         {
440*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Info.RedecribedPlanes = true;
441*35ffd701SAndroid Build Coastguard Worker         }
442*35ffd701SAndroid Build Coastguard Worker     }
443*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
444*35ffd701SAndroid Build Coastguard Worker     {
445*35ffd701SAndroid Build Coastguard Worker         uint32_t TileHeight = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileHeight;
446*35ffd701SAndroid Build Coastguard Worker 
447*35ffd701SAndroid Build Coastguard Worker         BitsPerPixel = 8;
448*35ffd701SAndroid Build Coastguard Worker 
449*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Format == GMM_FORMAT_IMC2 || // IMC2, IMC4 needs even tile columns
450*35ffd701SAndroid Build Coastguard Worker            pTexInfo->Format == GMM_FORMAT_IMC4)
451*35ffd701SAndroid Build Coastguard Worker         {
452*35ffd701SAndroid Build Coastguard Worker // If the U & V planes are side-by-side then the surface pitch must be
453*35ffd701SAndroid Build Coastguard Worker // padded out so that U and V planes will being on a tile boundary.
454*35ffd701SAndroid Build Coastguard Worker // This means that an odd Y plane width must be padded out
455*35ffd701SAndroid Build Coastguard Worker // with an additional tile. Even widths do not need padding
456*35ffd701SAndroid Build Coastguard Worker 
457*35ffd701SAndroid Build Coastguard Worker // CCS must use padded main surface width, so get main surface TileWidth
458*35ffd701SAndroid Build Coastguard Worker #define CCSMODE_TO_TILEMODE(y) ((y + TILE_YF_2D_8bpe) < TILE_YS_1D_8bpe) ? (y + TILE_YF_2D_8bpe) : \
459*35ffd701SAndroid Build Coastguard Worker                                                                            ((y + TILE_YF_2D_8bpe + 5) >= TILE_YS_1D_128bpe) ? (y + TILE_YF_2D_8bpe + 5) : TILE_NONE
460*35ffd701SAndroid Build Coastguard Worker 
461*35ffd701SAndroid Build Coastguard Worker             uint32_t BaseTileWidth = pPlatform->TileInfo[CCSMODE_TO_TILEMODE(pTexInfo->CCSModeAlign)].LogicalTileWidth;
462*35ffd701SAndroid Build Coastguard Worker             WidthBytesPhysical     = GFX_ALIGN(WidthBytesPhysical, 2 * BaseTileWidth);
463*35ffd701SAndroid Build Coastguard Worker         }
464*35ffd701SAndroid Build Coastguard Worker 
465*35ffd701SAndroid Build Coastguard Worker         AlignedWidth = GFX_ULONG_CAST(WidthBytesPhysical / (pTexInfo->BitsPerPixel >> 3));
466*35ffd701SAndroid Build Coastguard Worker 
467*35ffd701SAndroid Build Coastguard Worker         WidthBytesPhysical = __GMM_EXPAND_WIDTH(this, AlignedWidth, pTexInfo->Alignment.HAlign, pTexInfo);
468*35ffd701SAndroid Build Coastguard Worker         WidthBytesPhysical = ScaleTextureWidth(pTexInfo, WidthBytesPhysical); //Should both YAux and UVAux use same CCModeALign (ie using common bpe?)
469*35ffd701SAndroid Build Coastguard Worker                                                                               //If different, then copy Aux info from per-plane Aux? HW has separate bpe or common?
470*35ffd701SAndroid Build Coastguard Worker         YHeight = __GMM_EXPAND_HEIGHT(this, YHeight, pTexInfo->Alignment.VAlign, pTexInfo);
471*35ffd701SAndroid Build Coastguard Worker         YHeight = ScaleTextureHeight(pTexInfo, YHeight);
472*35ffd701SAndroid Build Coastguard Worker         YHeight = GFX_ALIGN(YHeight, TileHeight);
473*35ffd701SAndroid Build Coastguard Worker 
474*35ffd701SAndroid Build Coastguard Worker         VHeight = __GMM_EXPAND_HEIGHT(this, VHeight, pTexInfo->Alignment.VAlign, pTexInfo);
475*35ffd701SAndroid Build Coastguard Worker         VHeight = ScaleTextureHeight(pTexInfo, VHeight);
476*35ffd701SAndroid Build Coastguard Worker         VHeight = GFX_ALIGN(VHeight, TileHeight);
477*35ffd701SAndroid Build Coastguard Worker 
478*35ffd701SAndroid Build Coastguard Worker         Height = YHeight + VHeight;
479*35ffd701SAndroid Build Coastguard Worker     }
480*35ffd701SAndroid Build Coastguard Worker 
481*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Info.RedecribedPlanes)
482*35ffd701SAndroid Build Coastguard Worker     {
483*35ffd701SAndroid Build Coastguard Worker         if(false == RedescribeTexturePlanes(pTexInfo, &WidthBytesPhysical))
484*35ffd701SAndroid Build Coastguard Worker         {
485*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(false);
486*35ffd701SAndroid Build Coastguard Worker         }
487*35ffd701SAndroid Build Coastguard Worker     }
488*35ffd701SAndroid Build Coastguard Worker     if((Status = // <-- Note assignment.
489*35ffd701SAndroid Build Coastguard Worker         FillTexPitchAndSize(
490*35ffd701SAndroid Build Coastguard Worker         pTexInfo, WidthBytesPhysical, Height, pRestrictions)) == GMM_SUCCESS)
491*35ffd701SAndroid Build Coastguard Worker     {
492*35ffd701SAndroid Build Coastguard Worker         FillPlanarOffsetAddress(pTexInfo);
493*35ffd701SAndroid Build Coastguard Worker     }
494*35ffd701SAndroid Build Coastguard Worker 
495*35ffd701SAndroid Build Coastguard Worker     // Planar & hybrid 2D arrays supported in DX11.1+ spec but not HW. Memory layout
496*35ffd701SAndroid Build Coastguard Worker     // is defined by SW requirements; Y plane must be 4KB aligned.
497*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->ArraySize > 1)
498*35ffd701SAndroid Build Coastguard Worker     {
499*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_SIZE_T ElementSizeBytes = pTexInfo->Size;
500*35ffd701SAndroid Build Coastguard Worker         int64_t        LargeSize;
501*35ffd701SAndroid Build Coastguard Worker 
502*35ffd701SAndroid Build Coastguard Worker         // Size should always be page aligned.
503*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT((pTexInfo->Size % PAGE_SIZE) == 0);
504*35ffd701SAndroid Build Coastguard Worker 
505*35ffd701SAndroid Build Coastguard Worker         if((LargeSize = (int64_t)ElementSizeBytes * pTexInfo->ArraySize) <= pPlatform->SurfaceMaxSize)
506*35ffd701SAndroid Build Coastguard Worker         {
507*35ffd701SAndroid Build Coastguard Worker             pTexInfo->OffsetInfo.PlaneXe_LPG.ArrayQPitch = ElementSizeBytes;
508*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Size                               = LargeSize;
509*35ffd701SAndroid Build Coastguard Worker         }
510*35ffd701SAndroid Build Coastguard Worker         else
511*35ffd701SAndroid Build Coastguard Worker         {
512*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Surface too large!");
513*35ffd701SAndroid Build Coastguard Worker             Status = GMM_ERROR;
514*35ffd701SAndroid Build Coastguard Worker         }
515*35ffd701SAndroid Build Coastguard Worker     }
516*35ffd701SAndroid Build Coastguard Worker 
517*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
518*35ffd701SAndroid Build Coastguard Worker     return (Status);
519*35ffd701SAndroid Build Coastguard Worker } // FillTexPlanar
520*35ffd701SAndroid Build Coastguard Worker 
521*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
522*35ffd701SAndroid Build Coastguard Worker /// This function calculates the (X,Y) address of each given plane. X is in bytes
523*35ffd701SAndroid Build Coastguard Worker /// and Y is in scanlines.
524*35ffd701SAndroid Build Coastguard Worker ///
525*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO
526*35ffd701SAndroid Build Coastguard Worker ///
527*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillPlanarOffsetAddress(GMM_TEXTURE_INFO * pTexInfo)528*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmXe_LPGTextureCalc::FillPlanarOffsetAddress(GMM_TEXTURE_INFO *pTexInfo)
529*35ffd701SAndroid Build Coastguard Worker {
530*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T *pUOffsetX, *pUOffsetY;
531*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T *pVOffsetX, *pVOffsetY;
532*35ffd701SAndroid Build Coastguard Worker     uint32_t        YHeight = 0, VHeight = 0;
533*35ffd701SAndroid Build Coastguard Worker     bool            UVPacked = false;
534*35ffd701SAndroid Build Coastguard Worker     uint32_t        Height;
535*35ffd701SAndroid Build Coastguard Worker     uint32_t        WidthBytesPhysical = GFX_ULONG_CAST(pTexInfo->BaseWidth) * pTexInfo->BitsPerPixel >> 3;
536*35ffd701SAndroid Build Coastguard Worker 
537*35ffd701SAndroid Build Coastguard Worker #define SWAP_UV()              \
538*35ffd701SAndroid Build Coastguard Worker     {                          \
539*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_SIZE_T *pTemp; \
540*35ffd701SAndroid Build Coastguard Worker                                \
541*35ffd701SAndroid Build Coastguard Worker         pTemp     = pUOffsetX; \
542*35ffd701SAndroid Build Coastguard Worker         pUOffsetX = pVOffsetX; \
543*35ffd701SAndroid Build Coastguard Worker         pVOffsetX = pTemp;     \
544*35ffd701SAndroid Build Coastguard Worker                                \
545*35ffd701SAndroid Build Coastguard Worker         pTemp     = pUOffsetY; \
546*35ffd701SAndroid Build Coastguard Worker         pUOffsetY = pVOffsetY; \
547*35ffd701SAndroid Build Coastguard Worker         pVOffsetY = pTemp;     \
548*35ffd701SAndroid Build Coastguard Worker     }
549*35ffd701SAndroid Build Coastguard Worker 
550*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, VOIDRETURN);
551*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(((pTexInfo->TileMode < GMM_TILE_MODES) && (pTexInfo->TileMode >= TILE_NONE)), VOIDRETURN);
552*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
553*35ffd701SAndroid Build Coastguard Worker 
554*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
555*35ffd701SAndroid Build Coastguard Worker 
556*35ffd701SAndroid Build Coastguard Worker     // GMM_PLANE_Y always at (0, 0)...
557*35ffd701SAndroid Build Coastguard Worker     pTexInfo->OffsetInfo.PlaneXe_LPG.X[GMM_PLANE_Y] = 0;
558*35ffd701SAndroid Build Coastguard Worker     pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_Y] = 0;
559*35ffd701SAndroid Build Coastguard Worker 
560*35ffd701SAndroid Build Coastguard Worker     pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_Y] = 0;
561*35ffd701SAndroid Build Coastguard Worker     pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_Y] = 0;
562*35ffd701SAndroid Build Coastguard Worker 
563*35ffd701SAndroid Build Coastguard Worker     Height = pTexInfo->BaseHeight;
564*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
565*35ffd701SAndroid Build Coastguard Worker     {
566*35ffd701SAndroid Build Coastguard Worker         Height = __GMM_EXPAND_HEIGHT(this, Height, pTexInfo->Alignment.VAlign, pTexInfo);
567*35ffd701SAndroid Build Coastguard Worker         Height = ScaleTextureHeight(pTexInfo, Height);
568*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Gpu.UnifiedAuxSurface)
569*35ffd701SAndroid Build Coastguard Worker         {
570*35ffd701SAndroid Build Coastguard Worker             pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_Y] = 0;
571*35ffd701SAndroid Build Coastguard Worker         }
572*35ffd701SAndroid Build Coastguard Worker     }
573*35ffd701SAndroid Build Coastguard Worker 
574*35ffd701SAndroid Build Coastguard Worker     // GMM_PLANE_U/V Planes...
575*35ffd701SAndroid Build Coastguard Worker     pUOffsetX = &pTexInfo->OffsetInfo.PlaneXe_LPG.X[GMM_PLANE_U];
576*35ffd701SAndroid Build Coastguard Worker     pUOffsetY = &pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_U];
577*35ffd701SAndroid Build Coastguard Worker     pVOffsetX = &pTexInfo->OffsetInfo.PlaneXe_LPG.X[GMM_PLANE_V];
578*35ffd701SAndroid Build Coastguard Worker     pVOffsetY = &pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_V];
579*35ffd701SAndroid Build Coastguard Worker 
580*35ffd701SAndroid Build Coastguard Worker     switch(pTexInfo->Format)
581*35ffd701SAndroid Build Coastguard Worker     {
582*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC1:
583*35ffd701SAndroid Build Coastguard Worker             SWAP_UV(); // IMC1 = IMC3 with Swapped U/V
584*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC3:
585*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV420:  // Same as IMC3.
586*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
587*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
588*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
589*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
590*35ffd701SAndroid Build Coastguard Worker                                           // UUUU
591*35ffd701SAndroid Build Coastguard Worker                                           // UUUU
592*35ffd701SAndroid Build Coastguard Worker                                           // VVVV
593*35ffd701SAndroid Build Coastguard Worker                                           // VVVV
594*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV422V: // Similar to IMC3 but U/V are full width.
595*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
596*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
597*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
598*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
599*35ffd701SAndroid Build Coastguard Worker                                           // UUUUUUUU
600*35ffd701SAndroid Build Coastguard Worker                                           // UUUUUUUU
601*35ffd701SAndroid Build Coastguard Worker                                           // VVVVVVVV
602*35ffd701SAndroid Build Coastguard Worker                                           // VVVVVVVV
603*35ffd701SAndroid Build Coastguard Worker             {
604*35ffd701SAndroid Build Coastguard Worker                 *pUOffsetX = 0;
605*35ffd701SAndroid Build Coastguard Worker                 YHeight    = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
606*35ffd701SAndroid Build Coastguard Worker                 *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
607*35ffd701SAndroid Build Coastguard Worker 
608*35ffd701SAndroid Build Coastguard Worker                 *pVOffsetX = 0;
609*35ffd701SAndroid Build Coastguard Worker                 VHeight    = GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
610*35ffd701SAndroid Build Coastguard Worker                 *pVOffsetY =
611*35ffd701SAndroid Build Coastguard Worker                 GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) +
612*35ffd701SAndroid Build Coastguard Worker                 GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
613*35ffd701SAndroid Build Coastguard Worker 
614*35ffd701SAndroid Build Coastguard Worker                 break;
615*35ffd701SAndroid Build Coastguard Worker             }
616*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV411R_TYPE: //Similar to IMC3 but U/V are quarther height and full width.
617*35ffd701SAndroid Build Coastguard Worker                                                //YYYYYYYY
618*35ffd701SAndroid Build Coastguard Worker                                                //YYYYYYYY
619*35ffd701SAndroid Build Coastguard Worker                                                //YYYYYYYY
620*35ffd701SAndroid Build Coastguard Worker                                                //YYYYYYYY
621*35ffd701SAndroid Build Coastguard Worker                                                //UUUUUUUU
622*35ffd701SAndroid Build Coastguard Worker                                                //VVVVVVVV
623*35ffd701SAndroid Build Coastguard Worker             {
624*35ffd701SAndroid Build Coastguard Worker                 *pUOffsetX = 0;
625*35ffd701SAndroid Build Coastguard Worker                 YHeight    = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
626*35ffd701SAndroid Build Coastguard Worker                 *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
627*35ffd701SAndroid Build Coastguard Worker 
628*35ffd701SAndroid Build Coastguard Worker                 *pVOffsetX = 0;
629*35ffd701SAndroid Build Coastguard Worker                 VHeight    = GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
630*35ffd701SAndroid Build Coastguard Worker                 *pVOffsetY =
631*35ffd701SAndroid Build Coastguard Worker                 GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) +
632*35ffd701SAndroid Build Coastguard Worker                 GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
633*35ffd701SAndroid Build Coastguard Worker 
634*35ffd701SAndroid Build Coastguard Worker                 break;
635*35ffd701SAndroid Build Coastguard Worker             }
636*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV411:  // Similar to IMC3 but U/V are quarter width and full height.
637*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
638*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
639*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
640*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
641*35ffd701SAndroid Build Coastguard Worker                                           // UU
642*35ffd701SAndroid Build Coastguard Worker                                           // UU
643*35ffd701SAndroid Build Coastguard Worker                                           // UU
644*35ffd701SAndroid Build Coastguard Worker                                           // UU
645*35ffd701SAndroid Build Coastguard Worker                                           // VV
646*35ffd701SAndroid Build Coastguard Worker                                           // VV
647*35ffd701SAndroid Build Coastguard Worker                                           // VV
648*35ffd701SAndroid Build Coastguard Worker                                           // VV
649*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV422H: // Similar to IMC3 but U/V are full height.
650*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
651*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
652*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
653*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
654*35ffd701SAndroid Build Coastguard Worker                                           // UUUU
655*35ffd701SAndroid Build Coastguard Worker                                           // UUUU
656*35ffd701SAndroid Build Coastguard Worker                                           // UUUU
657*35ffd701SAndroid Build Coastguard Worker                                           // UUUU
658*35ffd701SAndroid Build Coastguard Worker                                           // VVVV
659*35ffd701SAndroid Build Coastguard Worker                                           // VVVV
660*35ffd701SAndroid Build Coastguard Worker                                           // VVVV
661*35ffd701SAndroid Build Coastguard Worker                                           // VVVV
662*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV444:  // Similar to IMC3 but U/V are full size.
663*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
664*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
665*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
666*35ffd701SAndroid Build Coastguard Worker                                           // YYYYYYYY
667*35ffd701SAndroid Build Coastguard Worker                                           // UUUUUUUU
668*35ffd701SAndroid Build Coastguard Worker                                           // UUUUUUUU
669*35ffd701SAndroid Build Coastguard Worker                                           // UUUUUUUU
670*35ffd701SAndroid Build Coastguard Worker                                           // UUUUUUUU
671*35ffd701SAndroid Build Coastguard Worker                                           // VVVVVVVV
672*35ffd701SAndroid Build Coastguard Worker                                           // VVVVVVVV
673*35ffd701SAndroid Build Coastguard Worker                                           // VVVVVVVV
674*35ffd701SAndroid Build Coastguard Worker                                           // VVVVVVVV
675*35ffd701SAndroid Build Coastguard Worker             {
676*35ffd701SAndroid Build Coastguard Worker                 *pUOffsetX = 0;
677*35ffd701SAndroid Build Coastguard Worker                 YHeight    = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
678*35ffd701SAndroid Build Coastguard Worker                 *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
679*35ffd701SAndroid Build Coastguard Worker 
680*35ffd701SAndroid Build Coastguard Worker                 *pVOffsetX = 0;
681*35ffd701SAndroid Build Coastguard Worker                 VHeight    = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
682*35ffd701SAndroid Build Coastguard Worker                 *pVOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) * 2;
683*35ffd701SAndroid Build Coastguard Worker 
684*35ffd701SAndroid Build Coastguard Worker                 break;
685*35ffd701SAndroid Build Coastguard Worker             }
686*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_BGRP:
687*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_RGBP:
688*35ffd701SAndroid Build Coastguard Worker         {
689*35ffd701SAndroid Build Coastguard Worker             //For RGBP linear Tile keep resource Offset non aligned and for other Tile format to be 16-bit aligned
690*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Info.Linear)
691*35ffd701SAndroid Build Coastguard Worker             {
692*35ffd701SAndroid Build Coastguard Worker                 *pUOffsetX = 0;
693*35ffd701SAndroid Build Coastguard Worker                 YHeight    = pTexInfo->BaseHeight;
694*35ffd701SAndroid Build Coastguard Worker                 *pUOffsetY = pTexInfo->BaseHeight;
695*35ffd701SAndroid Build Coastguard Worker 
696*35ffd701SAndroid Build Coastguard Worker                 *pVOffsetX = 0;
697*35ffd701SAndroid Build Coastguard Worker                 VHeight    = pTexInfo->BaseHeight;
698*35ffd701SAndroid Build Coastguard Worker                 *pVOffsetY = (GMM_GFX_SIZE_T)pTexInfo->BaseHeight * 2;
699*35ffd701SAndroid Build Coastguard Worker             }
700*35ffd701SAndroid Build Coastguard Worker             else //Tiled
701*35ffd701SAndroid Build Coastguard Worker             {
702*35ffd701SAndroid Build Coastguard Worker                 *pUOffsetX = 0;
703*35ffd701SAndroid Build Coastguard Worker                 YHeight    = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
704*35ffd701SAndroid Build Coastguard Worker                 *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
705*35ffd701SAndroid Build Coastguard Worker 
706*35ffd701SAndroid Build Coastguard Worker                 *pVOffsetX = 0;
707*35ffd701SAndroid Build Coastguard Worker                 VHeight    = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
708*35ffd701SAndroid Build Coastguard Worker                 *pVOffsetY = (GMM_GFX_SIZE_T)GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) * 2;
709*35ffd701SAndroid Build Coastguard Worker             }
710*35ffd701SAndroid Build Coastguard Worker             break;
711*35ffd701SAndroid Build Coastguard Worker         }
712*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC2:
713*35ffd701SAndroid Build Coastguard Worker             SWAP_UV(); // IMC2 = IMC4 with Swapped U/V
714*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC4:
715*35ffd701SAndroid Build Coastguard Worker         {
716*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
717*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
718*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
719*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
720*35ffd701SAndroid Build Coastguard Worker             // UUUUVVVV
721*35ffd701SAndroid Build Coastguard Worker             // UUUUVVVV
722*35ffd701SAndroid Build Coastguard Worker 
723*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT((pTexInfo->Pitch & 1) == 0);
724*35ffd701SAndroid Build Coastguard Worker 
725*35ffd701SAndroid Build Coastguard Worker             *pUOffsetX = 0;
726*35ffd701SAndroid Build Coastguard Worker             YHeight    = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
727*35ffd701SAndroid Build Coastguard Worker             *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
728*35ffd701SAndroid Build Coastguard Worker 
729*35ffd701SAndroid Build Coastguard Worker             *pVOffsetX = pTexInfo->Pitch / 2;
730*35ffd701SAndroid Build Coastguard Worker             VHeight    = GFX_CEIL_DIV(YHeight, 2);
731*35ffd701SAndroid Build Coastguard Worker             *pVOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
732*35ffd701SAndroid Build Coastguard Worker 
733*35ffd701SAndroid Build Coastguard Worker             // Not technically UV packed but sizing works out the same
734*35ffd701SAndroid Build Coastguard Worker             UVPacked = true;
735*35ffd701SAndroid Build Coastguard Worker 
736*35ffd701SAndroid Build Coastguard Worker             break;
737*35ffd701SAndroid Build Coastguard Worker         }
738*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_I420: // I420 = IYUV
739*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IYUV:
740*35ffd701SAndroid Build Coastguard Worker             SWAP_UV(); // I420/IYUV = YV12 with Swapped U/V
741*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_YV12:
742*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_YVU9:
743*35ffd701SAndroid Build Coastguard Worker         {
744*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
745*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
746*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
747*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
748*35ffd701SAndroid Build Coastguard Worker             // VVVVVV..  <-- V and U planes follow the Y plane, as linear
749*35ffd701SAndroid Build Coastguard Worker             // ..UUUUUU      arrays--without respect to pitch.
750*35ffd701SAndroid Build Coastguard Worker 
751*35ffd701SAndroid Build Coastguard Worker             uint32_t YSize, YVSizeRShift, VSize, UOffset;
752*35ffd701SAndroid Build Coastguard Worker             uint32_t YSizeForUVPurposes, YSizeForUVPurposesDimensionalAlignment;
753*35ffd701SAndroid Build Coastguard Worker 
754*35ffd701SAndroid Build Coastguard Worker             YSize = GFX_ULONG_CAST(pTexInfo->Pitch) * pTexInfo->BaseHeight;
755*35ffd701SAndroid Build Coastguard Worker 
756*35ffd701SAndroid Build Coastguard Worker             // YVU9 has one U/V pixel for each 4x4 Y block.
757*35ffd701SAndroid Build Coastguard Worker             // The others have one U/V pixel for each 2x2 Y block.
758*35ffd701SAndroid Build Coastguard Worker 
759*35ffd701SAndroid Build Coastguard Worker             // YVU9 has a Y:V size ratio of 16 (4x4 --> 1).
760*35ffd701SAndroid Build Coastguard Worker             // The others have a ratio of 4 (2x2 --> 1).
761*35ffd701SAndroid Build Coastguard Worker             YVSizeRShift = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
762*35ffd701SAndroid Build Coastguard Worker 
763*35ffd701SAndroid Build Coastguard Worker             // If a Y plane isn't fully-aligned to its Y-->U/V block size, the
764*35ffd701SAndroid Build Coastguard Worker             // extra/unaligned Y pixels still need corresponding U/V pixels--So
765*35ffd701SAndroid Build Coastguard Worker             // for the purpose of computing the UVSize, we must consider a
766*35ffd701SAndroid Build Coastguard Worker             // dimensionally "rounded-up" YSize. (E.g. a 13x5 YVU9 Y plane would
767*35ffd701SAndroid Build Coastguard Worker             // require 4x2 U/V planes--the same UVSize as a fully-aligned 16x8 Y.)
768*35ffd701SAndroid Build Coastguard Worker             YSizeForUVPurposesDimensionalAlignment = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
769*35ffd701SAndroid Build Coastguard Worker             YSizeForUVPurposes =
770*35ffd701SAndroid Build Coastguard Worker             GFX_ALIGN(GFX_ULONG_CAST(pTexInfo->Pitch), YSizeForUVPurposesDimensionalAlignment) *
771*35ffd701SAndroid Build Coastguard Worker             GFX_ALIGN(pTexInfo->BaseHeight, YSizeForUVPurposesDimensionalAlignment);
772*35ffd701SAndroid Build Coastguard Worker 
773*35ffd701SAndroid Build Coastguard Worker             VSize   = (YSizeForUVPurposes >> YVSizeRShift);
774*35ffd701SAndroid Build Coastguard Worker             UOffset = YSize + VSize;
775*35ffd701SAndroid Build Coastguard Worker 
776*35ffd701SAndroid Build Coastguard Worker             *pVOffsetX = 0;
777*35ffd701SAndroid Build Coastguard Worker             *pVOffsetY = pTexInfo->BaseHeight;
778*35ffd701SAndroid Build Coastguard Worker 
779*35ffd701SAndroid Build Coastguard Worker             *pUOffsetX = UOffset % pTexInfo->Pitch;
780*35ffd701SAndroid Build Coastguard Worker             *pUOffsetY = UOffset / pTexInfo->Pitch;
781*35ffd701SAndroid Build Coastguard Worker 
782*35ffd701SAndroid Build Coastguard Worker             YHeight = GFX_CEIL_DIV(YSize + 2 * VSize, WidthBytesPhysical);
783*35ffd701SAndroid Build Coastguard Worker 
784*35ffd701SAndroid Build Coastguard Worker             break;
785*35ffd701SAndroid Build Coastguard Worker         }
786*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV12:
787*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV21:
788*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV11:
789*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P010:
790*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P012:
791*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P016:
792*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P208:
793*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P216:
794*35ffd701SAndroid Build Coastguard Worker         {
795*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
796*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
797*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
798*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
799*35ffd701SAndroid Build Coastguard Worker             // [UV-Packing]
800*35ffd701SAndroid Build Coastguard Worker             *pUOffsetX = *pVOffsetX = 0;
801*35ffd701SAndroid Build Coastguard Worker             YHeight                 = GFX_ALIGN(Height, __GMM_EVEN_ROW);
802*35ffd701SAndroid Build Coastguard Worker             *pUOffsetY = *pVOffsetY = YHeight;
803*35ffd701SAndroid Build Coastguard Worker 
804*35ffd701SAndroid Build Coastguard Worker             if((pTexInfo->Format == GMM_FORMAT_NV12) ||
805*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_NV21) ||
806*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P010) ||
807*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P012) ||
808*35ffd701SAndroid Build Coastguard Worker                (pTexInfo->Format == GMM_FORMAT_P016))
809*35ffd701SAndroid Build Coastguard Worker             {
810*35ffd701SAndroid Build Coastguard Worker                 VHeight = GFX_CEIL_DIV(Height, 2);
811*35ffd701SAndroid Build Coastguard Worker             }
812*35ffd701SAndroid Build Coastguard Worker             else
813*35ffd701SAndroid Build Coastguard Worker             {
814*35ffd701SAndroid Build Coastguard Worker                 VHeight = YHeight; // U/V plane is same as Y
815*35ffd701SAndroid Build Coastguard Worker             }
816*35ffd701SAndroid Build Coastguard Worker 
817*35ffd701SAndroid Build Coastguard Worker             UVPacked = true;
818*35ffd701SAndroid Build Coastguard Worker             break;
819*35ffd701SAndroid Build Coastguard Worker         }
820*35ffd701SAndroid Build Coastguard Worker         default:
821*35ffd701SAndroid Build Coastguard Worker         {
822*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Unknown Video Format U\n");
823*35ffd701SAndroid Build Coastguard Worker             break;
824*35ffd701SAndroid Build Coastguard Worker         }
825*35ffd701SAndroid Build Coastguard Worker     }
826*35ffd701SAndroid Build Coastguard Worker 
827*35ffd701SAndroid Build Coastguard Worker     pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_Y] = YHeight;
828*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 2)
829*35ffd701SAndroid Build Coastguard Worker     {
830*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_U] = VHeight;
831*35ffd701SAndroid Build Coastguard Worker     }
832*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 3)
833*35ffd701SAndroid Build Coastguard Worker     {
834*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_U] =
835*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_V] = VHeight;
836*35ffd701SAndroid Build Coastguard Worker     }
837*35ffd701SAndroid Build Coastguard Worker 
838*35ffd701SAndroid Build Coastguard Worker     if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]) || pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
839*35ffd701SAndroid Build Coastguard Worker     {
840*35ffd701SAndroid Build Coastguard Worker         uint32_t TileHeight         = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight;
841*35ffd701SAndroid Build Coastguard Worker         uint32_t TileWidth          = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth;
842*35ffd701SAndroid Build Coastguard Worker         uint32_t PhysicalTileHeight = TileHeight;
843*35ffd701SAndroid Build Coastguard Worker 
844*35ffd701SAndroid Build Coastguard Worker         if(GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) > IGFX_GEN11LP_CORE)
845*35ffd701SAndroid Build Coastguard Worker         {
846*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Gpu.CCS && !pGmmLibContext->GetSkuTable().FtrFlatPhysCCS)
847*35ffd701SAndroid Build Coastguard Worker             {
848*35ffd701SAndroid Build Coastguard Worker                 //U/V must be aligned to AuxT granularity, 4x pitchalign enforces 16K-align for 4KB tile,
849*35ffd701SAndroid Build Coastguard Worker                 //add extra padding for 64K AuxT, 1MB AuxT
850*35ffd701SAndroid Build Coastguard Worker                 if(GMM_IS_64KB_TILE(pTexInfo->Flags))
851*35ffd701SAndroid Build Coastguard Worker                 {
852*35ffd701SAndroid Build Coastguard Worker                     TileHeight *= (!WA64K(pGmmLibContext) && !WA16K(pGmmLibContext)) ? 16 : 1; // For 64Kb Tile mode: Multiply TileHeight by 16 for 1 MB alignment
853*35ffd701SAndroid Build Coastguard Worker                 }
854*35ffd701SAndroid Build Coastguard Worker                 else
855*35ffd701SAndroid Build Coastguard Worker                 {
856*35ffd701SAndroid Build Coastguard Worker                     PhysicalTileHeight *= (WA16K(pGmmLibContext) ? 1 : WA64K(pGmmLibContext) ? 4 : 1); //  for 1 MB AuxT granularity, we do 1 MB alignment only in VA space and not in physical space, so do not multiply PhysicalTileHeight with 64 here
857*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
858*35ffd701SAndroid Build Coastguard Worker                 }
859*35ffd701SAndroid Build Coastguard Worker                 if(!WA64K(pGmmLibContext) && !WA16K(pGmmLibContext))
860*35ffd701SAndroid Build Coastguard Worker                 {
861*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->OffsetInfo.PlaneXe_LPG.Is1MBAuxTAlignedPlanes       = true;
862*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->OffsetInfo.PlaneXe_LPG.Physical.Height[GMM_PLANE_Y] = GFX_ALIGN(YHeight, PhysicalTileHeight); // confirm tilealignment is needed for physivcal backing, else calculate size from unaligned offset and use the same
863*35ffd701SAndroid Build Coastguard Worker                     if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 2)
864*35ffd701SAndroid Build Coastguard Worker                     {
865*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->OffsetInfo.PlaneXe_LPG.Physical.Height[GMM_PLANE_U] = GFX_ALIGN(VHeight, PhysicalTileHeight);
866*35ffd701SAndroid Build Coastguard Worker                     }
867*35ffd701SAndroid Build Coastguard Worker                     else if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 3)
868*35ffd701SAndroid Build Coastguard Worker                     {
869*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->OffsetInfo.PlaneXe_LPG.Physical.Height[GMM_PLANE_U] =
870*35ffd701SAndroid Build Coastguard Worker                         pTexInfo->OffsetInfo.PlaneXe_LPG.Physical.Height[GMM_PLANE_V] = GFX_ALIGN(VHeight, PhysicalTileHeight);
871*35ffd701SAndroid Build Coastguard Worker                     }
872*35ffd701SAndroid Build Coastguard Worker                 }
873*35ffd701SAndroid Build Coastguard Worker             }
874*35ffd701SAndroid Build Coastguard Worker         }
875*35ffd701SAndroid Build Coastguard Worker 
876*35ffd701SAndroid Build Coastguard Worker         *pUOffsetX = GFX_ALIGN(*pUOffsetX, TileWidth);
877*35ffd701SAndroid Build Coastguard Worker         *pUOffsetY = GFX_ALIGN(*pUOffsetY, TileHeight);
878*35ffd701SAndroid Build Coastguard Worker         *pVOffsetX = GFX_ALIGN(*pVOffsetX, TileWidth);
879*35ffd701SAndroid Build Coastguard Worker         *pVOffsetY = UVPacked ?
880*35ffd701SAndroid Build Coastguard Worker                      GFX_ALIGN(*pVOffsetY, TileHeight) :
881*35ffd701SAndroid Build Coastguard Worker                      GFX_ALIGN(YHeight, TileHeight) + GFX_ALIGN(VHeight, TileHeight);
882*35ffd701SAndroid Build Coastguard Worker 
883*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Gpu.UnifiedAuxSurface && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
884*35ffd701SAndroid Build Coastguard Worker         {
885*35ffd701SAndroid Build Coastguard Worker             *pUOffsetY += pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_Y];
886*35ffd701SAndroid Build Coastguard Worker             *pVOffsetY = *pUOffsetY;
887*35ffd701SAndroid Build Coastguard Worker         }
888*35ffd701SAndroid Build Coastguard Worker 
889*35ffd701SAndroid Build Coastguard Worker         // This is needed for FtrDisplayPageTables
890*35ffd701SAndroid Build Coastguard Worker         if(pGmmLibContext->GetSkuTable().FtrDisplayPageTables)
891*35ffd701SAndroid Build Coastguard Worker         {
892*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->OffsetInfo.PlaneXe_LPG.Is1MBAuxTAlignedPlanes)
893*35ffd701SAndroid Build Coastguard Worker             {
894*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.PlaneXe_LPG.Aligned.Height[GMM_PLANE_Y] = GFX_ALIGN(YHeight, PhysicalTileHeight); // confirm tilealignment is needed for physivcal backing, else calculate size from unaligned offset and use the same
895*35ffd701SAndroid Build Coastguard Worker                 if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 2)
896*35ffd701SAndroid Build Coastguard Worker                 {
897*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->OffsetInfo.PlaneXe_LPG.Aligned.Height[GMM_PLANE_U] = GFX_ALIGN(VHeight, PhysicalTileHeight);
898*35ffd701SAndroid Build Coastguard Worker                 }
899*35ffd701SAndroid Build Coastguard Worker                 else if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 3)
900*35ffd701SAndroid Build Coastguard Worker                 {
901*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->OffsetInfo.PlaneXe_LPG.Aligned.Height[GMM_PLANE_U] =
902*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->OffsetInfo.PlaneXe_LPG.Aligned.Height[GMM_PLANE_V] = GFX_ALIGN(VHeight, PhysicalTileHeight);
903*35ffd701SAndroid Build Coastguard Worker                 }
904*35ffd701SAndroid Build Coastguard Worker             }
905*35ffd701SAndroid Build Coastguard Worker             else
906*35ffd701SAndroid Build Coastguard Worker             {
907*35ffd701SAndroid Build Coastguard Worker                 pTexInfo->OffsetInfo.PlaneXe_LPG.Aligned.Height[GMM_PLANE_Y] = GFX_ALIGN(YHeight, TileHeight);
908*35ffd701SAndroid Build Coastguard Worker                 if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 2)
909*35ffd701SAndroid Build Coastguard Worker                 {
910*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->OffsetInfo.PlaneXe_LPG.Aligned.Height[GMM_PLANE_U] = GFX_ALIGN(VHeight, TileHeight);
911*35ffd701SAndroid Build Coastguard Worker                 }
912*35ffd701SAndroid Build Coastguard Worker                 else if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 3)
913*35ffd701SAndroid Build Coastguard Worker                 {
914*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->OffsetInfo.PlaneXe_LPG.Aligned.Height[GMM_PLANE_U] =
915*35ffd701SAndroid Build Coastguard Worker                     pTexInfo->OffsetInfo.PlaneXe_LPG.Aligned.Height[GMM_PLANE_V] = GFX_ALIGN(VHeight, TileHeight);
916*35ffd701SAndroid Build Coastguard Worker                 }
917*35ffd701SAndroid Build Coastguard Worker             }
918*35ffd701SAndroid Build Coastguard Worker         }
919*35ffd701SAndroid Build Coastguard Worker     }
920*35ffd701SAndroid Build Coastguard Worker 
921*35ffd701SAndroid Build Coastguard Worker     //Special case LKF MMC compressed surfaces
922*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.MMC &&
923*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Gpu.UnifiedAuxSurface &&
924*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Info.TiledY)
925*35ffd701SAndroid Build Coastguard Worker     {
926*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_SIZE_T TileHeight = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileHeight;
927*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_SIZE_T TileWidth  = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileWidth;
928*35ffd701SAndroid Build Coastguard Worker 
929*35ffd701SAndroid Build Coastguard Worker         *pUOffsetX = GFX_ALIGN(*pUOffsetX, TileWidth);
930*35ffd701SAndroid Build Coastguard Worker         *pUOffsetY = GFX_ALIGN(*pUOffsetY, TileHeight);
931*35ffd701SAndroid Build Coastguard Worker         *pVOffsetX = GFX_ALIGN(*pVOffsetX, TileWidth);
932*35ffd701SAndroid Build Coastguard Worker         *pVOffsetY = GFX_ALIGN(*pVOffsetY, TileHeight);
933*35ffd701SAndroid Build Coastguard Worker     }
934*35ffd701SAndroid Build Coastguard Worker 
935*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
936*35ffd701SAndroid Build Coastguard Worker 
937*35ffd701SAndroid Build Coastguard Worker #undef SWAP_UV
938*35ffd701SAndroid Build Coastguard Worker }
939*35ffd701SAndroid Build Coastguard Worker 
940*35ffd701SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////
941*35ffd701SAndroid Build Coastguard Worker /// Calculates offset address of a sub resource(i.e.  Mip Map, Cube face, volume texture)
942*35ffd701SAndroid Build Coastguard Worker ///
943*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO
944*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pReqInfo: ptr to GMM_REQ_OFFSET_INFO to store offset info
945*35ffd701SAndroid Build Coastguard Worker ///
946*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
947*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetTexLockOffset(GMM_TEXTURE_INFO * pTexInfo,GMM_REQ_OFFSET_INFO * pReqInfo)948*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmXe_LPGTextureCalc::GetTexLockOffset(GMM_TEXTURE_INFO *   pTexInfo,
949*35ffd701SAndroid Build Coastguard Worker                                                           GMM_REQ_OFFSET_INFO *pReqInfo)
950*35ffd701SAndroid Build Coastguard Worker {
951*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS     Result = GMM_SUCCESS;
952*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T AddressOffset;
953*35ffd701SAndroid Build Coastguard Worker     uint32_t       Pitch, Slice;
954*35ffd701SAndroid Build Coastguard Worker     uint32_t       MipHeight, MipWidth, MipLevel;
955*35ffd701SAndroid Build Coastguard Worker     uint32_t       NumberOfMipsInSingleRow, SliceRow;
956*35ffd701SAndroid Build Coastguard Worker 
957*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
958*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pReqInfo, GMM_ERROR);
959*35ffd701SAndroid Build Coastguard Worker 
960*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
961*35ffd701SAndroid Build Coastguard Worker 
962*35ffd701SAndroid Build Coastguard Worker     // set default value
963*35ffd701SAndroid Build Coastguard Worker     AddressOffset = 0;
964*35ffd701SAndroid Build Coastguard Worker     Pitch         = GFX_ULONG_CAST(pTexInfo->Pitch);
965*35ffd701SAndroid Build Coastguard Worker     MipLevel      = pReqInfo->MipLevel;
966*35ffd701SAndroid Build Coastguard Worker     Slice         = pReqInfo->Slice;
967*35ffd701SAndroid Build Coastguard Worker 
968*35ffd701SAndroid Build Coastguard Worker     if(GmmIsPlanar(pTexInfo->Format))
969*35ffd701SAndroid Build Coastguard Worker     {
970*35ffd701SAndroid Build Coastguard Worker         AddressOffset           = GetMipMapByteAddress(pTexInfo, pReqInfo);
971*35ffd701SAndroid Build Coastguard Worker         pReqInfo->Lock.Offset64 = AddressOffset;
972*35ffd701SAndroid Build Coastguard Worker         pReqInfo->Lock.Pitch    = pTexInfo->OffsetInfo.PlaneXe_LPG.Is1MBAuxTAlignedPlanes ? GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.PhysicalPitch) : Pitch;
973*35ffd701SAndroid Build Coastguard Worker 
974*35ffd701SAndroid Build Coastguard Worker         // Adjust returned pitch for non-uniform-pitch U/V queries...
975*35ffd701SAndroid Build Coastguard Worker         if((pReqInfo->Plane == GMM_PLANE_U) ||
976*35ffd701SAndroid Build Coastguard Worker            (pReqInfo->Plane == GMM_PLANE_V))
977*35ffd701SAndroid Build Coastguard Worker         {
978*35ffd701SAndroid Build Coastguard Worker             switch(pTexInfo->Format)
979*35ffd701SAndroid Build Coastguard Worker             {
980*35ffd701SAndroid Build Coastguard Worker                 case GMM_FORMAT_I420:
981*35ffd701SAndroid Build Coastguard Worker                 case GMM_FORMAT_IYUV:
982*35ffd701SAndroid Build Coastguard Worker                 case GMM_FORMAT_YV12:
983*35ffd701SAndroid Build Coastguard Worker                 case GMM_FORMAT_NV11:
984*35ffd701SAndroid Build Coastguard Worker                     pReqInfo->Lock.Pitch /= 2;
985*35ffd701SAndroid Build Coastguard Worker                     break;
986*35ffd701SAndroid Build Coastguard Worker                 case GMM_FORMAT_YVU9:
987*35ffd701SAndroid Build Coastguard Worker                     pReqInfo->Lock.Pitch /= 4;
988*35ffd701SAndroid Build Coastguard Worker                     break;
989*35ffd701SAndroid Build Coastguard Worker                 default:
990*35ffd701SAndroid Build Coastguard Worker                     //Cool--Constant pitch across all planes.
991*35ffd701SAndroid Build Coastguard Worker                     break;
992*35ffd701SAndroid Build Coastguard Worker             }
993*35ffd701SAndroid Build Coastguard Worker         }
994*35ffd701SAndroid Build Coastguard Worker 
995*35ffd701SAndroid Build Coastguard Worker         return Result;
996*35ffd701SAndroid Build Coastguard Worker     }
997*35ffd701SAndroid Build Coastguard Worker 
998*35ffd701SAndroid Build Coastguard Worker     switch(pTexInfo->Type)
999*35ffd701SAndroid Build Coastguard Worker     {
1000*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_3D:
1001*35ffd701SAndroid Build Coastguard Worker         {
1002*35ffd701SAndroid Build Coastguard Worker             if(GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN9_CORE)
1003*35ffd701SAndroid Build Coastguard Worker             {
1004*35ffd701SAndroid Build Coastguard Worker                 AddressOffset = GFX_ULONG_CAST(GetMipMapByteAddress(pTexInfo, pReqInfo));
1005*35ffd701SAndroid Build Coastguard Worker 
1006*35ffd701SAndroid Build Coastguard Worker                 // Bytes from one slice to the next...
1007*35ffd701SAndroid Build Coastguard Worker                 pReqInfo->Lock.Gen9PlusSlicePitch = GFX_ULONG_CAST(pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchLock);
1008*35ffd701SAndroid Build Coastguard Worker             }
1009*35ffd701SAndroid Build Coastguard Worker             else
1010*35ffd701SAndroid Build Coastguard Worker             {
1011*35ffd701SAndroid Build Coastguard Worker                 MipHeight = pTexInfo->BaseHeight >> MipLevel;
1012*35ffd701SAndroid Build Coastguard Worker                 MipWidth  = GFX_ULONG_CAST(pTexInfo->BaseWidth) >> MipLevel;
1013*35ffd701SAndroid Build Coastguard Worker 
1014*35ffd701SAndroid Build Coastguard Worker                 AlignTexHeightWidth(pTexInfo, &MipHeight, &MipWidth);
1015*35ffd701SAndroid Build Coastguard Worker 
1016*35ffd701SAndroid Build Coastguard Worker                 // See how many mip can fit in one row
1017*35ffd701SAndroid Build Coastguard Worker                 NumberOfMipsInSingleRow = GFX_2_TO_POWER_OF(MipLevel);
1018*35ffd701SAndroid Build Coastguard Worker 
1019*35ffd701SAndroid Build Coastguard Worker                 SliceRow = Slice / NumberOfMipsInSingleRow;
1020*35ffd701SAndroid Build Coastguard Worker 
1021*35ffd701SAndroid Build Coastguard Worker                 // get the base address + Slice pitch
1022*35ffd701SAndroid Build Coastguard Worker                 AddressOffset = pTexInfo->OffsetInfo.Texture3DOffsetInfo.Offset[MipLevel];
1023*35ffd701SAndroid Build Coastguard Worker 
1024*35ffd701SAndroid Build Coastguard Worker                 pReqInfo->Lock.Mip0SlicePitch = GFX_ULONG_CAST(pTexInfo->OffsetInfo.Texture3DOffsetInfo.Mip0SlicePitch);
1025*35ffd701SAndroid Build Coastguard Worker 
1026*35ffd701SAndroid Build Coastguard Worker                 // Actual address is offset based on requested slice
1027*35ffd701SAndroid Build Coastguard Worker                 AddressOffset += (GMM_GFX_SIZE_T)SliceRow * MipHeight * Pitch;
1028*35ffd701SAndroid Build Coastguard Worker 
1029*35ffd701SAndroid Build Coastguard Worker                 // Get to particular slice
1030*35ffd701SAndroid Build Coastguard Worker                 if(Slice % NumberOfMipsInSingleRow)
1031*35ffd701SAndroid Build Coastguard Worker                 {
1032*35ffd701SAndroid Build Coastguard Worker                     AddressOffset += (((GMM_GFX_SIZE_T)(Slice % NumberOfMipsInSingleRow) *
1033*35ffd701SAndroid Build Coastguard Worker                                        MipWidth * pTexInfo->BitsPerPixel) >>
1034*35ffd701SAndroid Build Coastguard Worker                                       3);
1035*35ffd701SAndroid Build Coastguard Worker                 }
1036*35ffd701SAndroid Build Coastguard Worker             }
1037*35ffd701SAndroid Build Coastguard Worker             break;
1038*35ffd701SAndroid Build Coastguard Worker         }
1039*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_CUBE:
1040*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_2D:
1041*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_1D:
1042*35ffd701SAndroid Build Coastguard Worker         {
1043*35ffd701SAndroid Build Coastguard Worker             AddressOffset = GetMipMapByteAddress(pTexInfo, pReqInfo);
1044*35ffd701SAndroid Build Coastguard Worker             break;
1045*35ffd701SAndroid Build Coastguard Worker         }
1046*35ffd701SAndroid Build Coastguard Worker         default:
1047*35ffd701SAndroid Build Coastguard Worker         { // These resources dont' have multiple levels of detail
1048*35ffd701SAndroid Build Coastguard Worker             AddressOffset = 0;
1049*35ffd701SAndroid Build Coastguard Worker             break;
1050*35ffd701SAndroid Build Coastguard Worker         }
1051*35ffd701SAndroid Build Coastguard Worker     }
1052*35ffd701SAndroid Build Coastguard Worker 
1053*35ffd701SAndroid Build Coastguard Worker     pReqInfo->Lock.Offset64 = AddressOffset;
1054*35ffd701SAndroid Build Coastguard Worker     pReqInfo->Lock.Pitch    = Pitch;
1055*35ffd701SAndroid Build Coastguard Worker 
1056*35ffd701SAndroid Build Coastguard Worker     return Result;
1057*35ffd701SAndroid Build Coastguard Worker }
1058*35ffd701SAndroid Build Coastguard Worker 
1059*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1060*35ffd701SAndroid Build Coastguard Worker /// Function used to calculate byte address of a specified mip map
1061*35ffd701SAndroid Build Coastguard Worker ///
1062*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO
1063*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pReqInfo: ptr to GMM_REQ_OFFSET_INFO
1064*35ffd701SAndroid Build Coastguard Worker ///
1065*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_GFX_SIZE_T byte offset
1066*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetMipMapByteAddress(GMM_TEXTURE_INFO * pTexInfo,GMM_REQ_OFFSET_INFO * pReqInfo)1067*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T GmmLib::GmmXe_LPGTextureCalc::GetMipMapByteAddress(GMM_TEXTURE_INFO *   pTexInfo,
1068*35ffd701SAndroid Build Coastguard Worker                                                                   GMM_REQ_OFFSET_INFO *pReqInfo)
1069*35ffd701SAndroid Build Coastguard Worker {
1070*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T ArrayQPitch, MipMapByteAddress, Pitch;
1071*35ffd701SAndroid Build Coastguard Worker     uint32_t       MipLevel;
1072*35ffd701SAndroid Build Coastguard Worker 
1073*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
1074*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pReqInfo, GMM_ERROR);
1075*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(!(pTexInfo->Flags.Gpu.CCS && !pTexInfo->Flags.Gpu.UnifiedAuxSurface));
1076*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pReqInfo->Plane < GMM_MAX_PLANE);
1077*35ffd701SAndroid Build Coastguard Worker 
1078*35ffd701SAndroid Build Coastguard Worker     MipLevel    = pReqInfo->MipLevel;
1079*35ffd701SAndroid Build Coastguard Worker     Pitch       = pTexInfo->Pitch;
1080*35ffd701SAndroid Build Coastguard Worker     ArrayQPitch = pReqInfo->ReqRender ?
1081*35ffd701SAndroid Build Coastguard Worker                   pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchRender :
1082*35ffd701SAndroid Build Coastguard Worker                   pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchLock;
1083*35ffd701SAndroid Build Coastguard Worker 
1084*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
1085*35ffd701SAndroid Build Coastguard Worker 
1086*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Type == RESOURCE_3D && !pTexInfo->Flags.Info.Linear)
1087*35ffd701SAndroid Build Coastguard Worker     {
1088*35ffd701SAndroid Build Coastguard Worker         ArrayQPitch *= pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileDepth;
1089*35ffd701SAndroid Build Coastguard Worker     }
1090*35ffd701SAndroid Build Coastguard Worker 
1091*35ffd701SAndroid Build Coastguard Worker     if((GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN8_CORE) &&
1092*35ffd701SAndroid Build Coastguard Worker        ((pTexInfo->MSAA.NumSamples > 1) &&
1093*35ffd701SAndroid Build Coastguard Worker         !(pTexInfo->Flags.Gpu.Depth ||
1094*35ffd701SAndroid Build Coastguard Worker           pTexInfo->Flags.Gpu.SeparateStencil ||
1095*35ffd701SAndroid Build Coastguard Worker           GMM_IS_64KB_TILE(pTexInfo->Flags) ||
1096*35ffd701SAndroid Build Coastguard Worker           pTexInfo->Flags.Info.TiledYf)))
1097*35ffd701SAndroid Build Coastguard Worker     {
1098*35ffd701SAndroid Build Coastguard Worker         ArrayQPitch *= pTexInfo->MSAA.NumSamples;
1099*35ffd701SAndroid Build Coastguard Worker     }
1100*35ffd701SAndroid Build Coastguard Worker 
1101*35ffd701SAndroid Build Coastguard Worker     if(GmmIsPlanar(pTexInfo->Format))
1102*35ffd701SAndroid Build Coastguard Worker     {
1103*35ffd701SAndroid Build Coastguard Worker         uint32_t Plane = pReqInfo->Plane;
1104*35ffd701SAndroid Build Coastguard Worker 
1105*35ffd701SAndroid Build Coastguard Worker         uint32_t OffsetX = 0;
1106*35ffd701SAndroid Build Coastguard Worker         uint32_t OffsetY = 0;
1107*35ffd701SAndroid Build Coastguard Worker         if(Plane < GMM_MAX_PLANE)
1108*35ffd701SAndroid Build Coastguard Worker         {
1109*35ffd701SAndroid Build Coastguard Worker             if(pReqInfo->ReqLock && pTexInfo->OffsetInfo.PlaneXe_LPG.Is1MBAuxTAlignedPlanes)
1110*35ffd701SAndroid Build Coastguard Worker             {
1111*35ffd701SAndroid Build Coastguard Worker                 OffsetX = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.X[GMM_PLANE_Y]);
1112*35ffd701SAndroid Build Coastguard Worker                 OffsetY = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_Y]);
1113*35ffd701SAndroid Build Coastguard Worker                 for(uint32_t PlaneId = GMM_PLANE_Y; PlaneId < Plane; PlaneId++)
1114*35ffd701SAndroid Build Coastguard Worker                 {
1115*35ffd701SAndroid Build Coastguard Worker                     // physical offset calculation: x offset remains same as PLANE_Y, YOffset = sum of physical height of all prev planes
1116*35ffd701SAndroid Build Coastguard Worker                     OffsetY += GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.Physical.Height[PlaneId]);
1117*35ffd701SAndroid Build Coastguard Worker                 }
1118*35ffd701SAndroid Build Coastguard Worker                 Pitch       = pTexInfo->OffsetInfo.PlaneXe_LPG.PhysicalPitch;
1119*35ffd701SAndroid Build Coastguard Worker                 ArrayQPitch = ((pTexInfo->OffsetInfo.PlaneXe_LPG.Physical.Height[GMM_PLANE_Y] + pTexInfo->OffsetInfo.PlaneXe_LPG.Physical.Height[GMM_PLANE_U] + pTexInfo->OffsetInfo.PlaneXe_LPG.Physical.Height[GMM_PLANE_V]) * pTexInfo->OffsetInfo.PlaneXe_LPG.PhysicalPitch); // Physical size of single array
1120*35ffd701SAndroid Build Coastguard Worker             }
1121*35ffd701SAndroid Build Coastguard Worker             else
1122*35ffd701SAndroid Build Coastguard Worker             {
1123*35ffd701SAndroid Build Coastguard Worker                 OffsetX     = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.X[Plane]);
1124*35ffd701SAndroid Build Coastguard Worker                 OffsetY     = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.Y[Plane]);
1125*35ffd701SAndroid Build Coastguard Worker                 ArrayQPitch = pTexInfo->OffsetInfo.PlaneXe_LPG.ArrayQPitch;
1126*35ffd701SAndroid Build Coastguard Worker             }
1127*35ffd701SAndroid Build Coastguard Worker         }
1128*35ffd701SAndroid Build Coastguard Worker         MipMapByteAddress = (OffsetY * Pitch) + OffsetX;
1129*35ffd701SAndroid Build Coastguard Worker 
1130*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(!pReqInfo->ArrayIndex || (pReqInfo->ArrayIndex < pTexInfo->ArraySize));
1131*35ffd701SAndroid Build Coastguard Worker 
1132*35ffd701SAndroid Build Coastguard Worker         MipMapByteAddress += (ArrayQPitch * pReqInfo->ArrayIndex);
1133*35ffd701SAndroid Build Coastguard Worker     }
1134*35ffd701SAndroid Build Coastguard Worker     else
1135*35ffd701SAndroid Build Coastguard Worker     {
1136*35ffd701SAndroid Build Coastguard Worker         switch(pTexInfo->Type)
1137*35ffd701SAndroid Build Coastguard Worker         {
1138*35ffd701SAndroid Build Coastguard Worker             case RESOURCE_CUBE:
1139*35ffd701SAndroid Build Coastguard Worker             {
1140*35ffd701SAndroid Build Coastguard Worker                 uint32_t CubeFace = pReqInfo->CubeFace;
1141*35ffd701SAndroid Build Coastguard Worker 
1142*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF( // Validate Cube Map Params...
1143*35ffd701SAndroid Build Coastguard Worker                 (!pReqInfo->ArrayIndex || (pReqInfo->ArrayIndex < pTexInfo->ArraySize)) &&
1144*35ffd701SAndroid Build Coastguard Worker                 (pReqInfo->CubeFace < __GMM_MAX_CUBE_FACE) &&
1145*35ffd701SAndroid Build Coastguard Worker                 (pReqInfo->CubeFace != __GMM_NO_CUBE_MAP) &&
1146*35ffd701SAndroid Build Coastguard Worker                 (pReqInfo->Plane == GMM_NO_PLANE) &&
1147*35ffd701SAndroid Build Coastguard Worker                 (pReqInfo->Slice == 0),
1148*35ffd701SAndroid Build Coastguard Worker                 "Invalid parameter!");
1149*35ffd701SAndroid Build Coastguard Worker 
1150*35ffd701SAndroid Build Coastguard Worker                 // Support for CubeMap Arrays using 2D Arrays
1151*35ffd701SAndroid Build Coastguard Worker                 MipMapByteAddress = pTexInfo->OffsetInfo.Texture2DOffsetInfo.Offset[MipLevel];
1152*35ffd701SAndroid Build Coastguard Worker                 MipMapByteAddress += (ArrayQPitch * ((6 * pReqInfo->ArrayIndex) + CubeFace));
1153*35ffd701SAndroid Build Coastguard Worker                 break;
1154*35ffd701SAndroid Build Coastguard Worker             }
1155*35ffd701SAndroid Build Coastguard Worker             case RESOURCE_2D:
1156*35ffd701SAndroid Build Coastguard Worker             case RESOURCE_1D:
1157*35ffd701SAndroid Build Coastguard Worker             {
1158*35ffd701SAndroid Build Coastguard Worker                 MipMapByteAddress = pTexInfo->OffsetInfo.Texture2DOffsetInfo.Offset[MipLevel];
1159*35ffd701SAndroid Build Coastguard Worker 
1160*35ffd701SAndroid Build Coastguard Worker                 if(pReqInfo->ArrayIndex)
1161*35ffd701SAndroid Build Coastguard Worker                 {
1162*35ffd701SAndroid Build Coastguard Worker                     MipMapByteAddress += (ArrayQPitch * pReqInfo->ArrayIndex);
1163*35ffd701SAndroid Build Coastguard Worker                 }
1164*35ffd701SAndroid Build Coastguard Worker                 break;
1165*35ffd701SAndroid Build Coastguard Worker             }
1166*35ffd701SAndroid Build Coastguard Worker             case RESOURCE_3D:
1167*35ffd701SAndroid Build Coastguard Worker             {
1168*35ffd701SAndroid Build Coastguard Worker                 if(GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN9_CORE)
1169*35ffd701SAndroid Build Coastguard Worker                 {
1170*35ffd701SAndroid Build Coastguard Worker                     MipMapByteAddress = pTexInfo->OffsetInfo.Texture2DOffsetInfo.Offset[MipLevel];
1171*35ffd701SAndroid Build Coastguard Worker 
1172*35ffd701SAndroid Build Coastguard Worker                     if(pReqInfo->Slice)
1173*35ffd701SAndroid Build Coastguard Worker                     {
1174*35ffd701SAndroid Build Coastguard Worker                         MipMapByteAddress += (ArrayQPitch * pReqInfo->Slice);
1175*35ffd701SAndroid Build Coastguard Worker                     }
1176*35ffd701SAndroid Build Coastguard Worker                 }
1177*35ffd701SAndroid Build Coastguard Worker                 else
1178*35ffd701SAndroid Build Coastguard Worker                 {
1179*35ffd701SAndroid Build Coastguard Worker                     MipMapByteAddress = Get3DMipByteAddress(pTexInfo, pReqInfo);
1180*35ffd701SAndroid Build Coastguard Worker                 }
1181*35ffd701SAndroid Build Coastguard Worker                 break;
1182*35ffd701SAndroid Build Coastguard Worker             }
1183*35ffd701SAndroid Build Coastguard Worker             default:
1184*35ffd701SAndroid Build Coastguard Worker             { // These resources don't have multiple levels of detail
1185*35ffd701SAndroid Build Coastguard Worker                 MipMapByteAddress = 0;
1186*35ffd701SAndroid Build Coastguard Worker                 break;
1187*35ffd701SAndroid Build Coastguard Worker             }
1188*35ffd701SAndroid Build Coastguard Worker         }
1189*35ffd701SAndroid Build Coastguard Worker     }
1190*35ffd701SAndroid Build Coastguard Worker 
1191*35ffd701SAndroid Build Coastguard Worker     MipMapByteAddress += pTexInfo->Flags.Gpu.S3d ?
1192*35ffd701SAndroid Build Coastguard Worker                          GetDisplayFrameOffset(pTexInfo, pReqInfo) :
1193*35ffd701SAndroid Build Coastguard Worker                          0;
1194*35ffd701SAndroid Build Coastguard Worker 
1195*35ffd701SAndroid Build Coastguard Worker     return MipMapByteAddress;
1196*35ffd701SAndroid Build Coastguard Worker }
1197*35ffd701SAndroid Build Coastguard Worker 
SetPlanarOffsetInfo(GMM_TEXTURE_INFO * pTexInfo,GMM_RESCREATE_CUSTOM_PARAMS & CreateParams)1198*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmXe_LPGTextureCalc::SetPlanarOffsetInfo(GMM_TEXTURE_INFO *pTexInfo, GMM_RESCREATE_CUSTOM_PARAMS &CreateParams)
1199*35ffd701SAndroid Build Coastguard Worker {
1200*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform;
1201*35ffd701SAndroid Build Coastguard Worker     pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
1202*35ffd701SAndroid Build Coastguard Worker 
1203*35ffd701SAndroid Build Coastguard Worker     if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]))
1204*35ffd701SAndroid Build Coastguard Worker     {
1205*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.IsTileAlignedPlanes = true;
1206*35ffd701SAndroid Build Coastguard Worker     }
1207*35ffd701SAndroid Build Coastguard Worker     for(uint8_t i = 1; i <= CreateParams.NoOfPlanes; i++)
1208*35ffd701SAndroid Build Coastguard Worker     {
1209*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.X[i] = CreateParams.PlaneOffset.X[i];
1210*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.Y[i] = CreateParams.PlaneOffset.Y[i];
1211*35ffd701SAndroid Build Coastguard Worker     }
1212*35ffd701SAndroid Build Coastguard Worker     pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes = CreateParams.NoOfPlanes;
1213*35ffd701SAndroid Build Coastguard Worker }
1214*35ffd701SAndroid Build Coastguard Worker 
1215*35ffd701SAndroid Build Coastguard Worker #ifndef __GMM_KMD__
SetPlanarOffsetInfo_2(GMM_TEXTURE_INFO * pTexInfo,GMM_RESCREATE_CUSTOM_PARAMS_2 & CreateParams)1216*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmXe_LPGTextureCalc::SetPlanarOffsetInfo_2(GMM_TEXTURE_INFO *pTexInfo, GMM_RESCREATE_CUSTOM_PARAMS_2 &CreateParams)
1217*35ffd701SAndroid Build Coastguard Worker {
1218*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform;
1219*35ffd701SAndroid Build Coastguard Worker     pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
1220*35ffd701SAndroid Build Coastguard Worker 
1221*35ffd701SAndroid Build Coastguard Worker     if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]))
1222*35ffd701SAndroid Build Coastguard Worker     {
1223*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.IsTileAlignedPlanes = true;
1224*35ffd701SAndroid Build Coastguard Worker     }
1225*35ffd701SAndroid Build Coastguard Worker     for(uint8_t i = 1; i <= CreateParams.NoOfPlanes; i++)
1226*35ffd701SAndroid Build Coastguard Worker     {
1227*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.X[i] = CreateParams.PlaneOffset.X[i];
1228*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.Y[i] = CreateParams.PlaneOffset.Y[i];
1229*35ffd701SAndroid Build Coastguard Worker     }
1230*35ffd701SAndroid Build Coastguard Worker     pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes = CreateParams.NoOfPlanes;
1231*35ffd701SAndroid Build Coastguard Worker }
1232*35ffd701SAndroid Build Coastguard Worker #endif
1233*35ffd701SAndroid Build Coastguard Worker 
SetPlaneUnAlignedTexOffsetInfo(GMM_TEXTURE_INFO * pTexInfo,uint32_t YHeight,uint32_t VHeight)1234*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmXe_LPGTextureCalc::SetPlaneUnAlignedTexOffsetInfo(GMM_TEXTURE_INFO *pTexInfo, uint32_t YHeight, uint32_t VHeight)
1235*35ffd701SAndroid Build Coastguard Worker {
1236*35ffd701SAndroid Build Coastguard Worker     uint32_t UmdUHeight = 0, UmdVHeight = 0;
1237*35ffd701SAndroid Build Coastguard Worker 
1238*35ffd701SAndroid Build Coastguard Worker     pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_Y] = YHeight;
1239*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 2)
1240*35ffd701SAndroid Build Coastguard Worker     {
1241*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_U] = VHeight;
1242*35ffd701SAndroid Build Coastguard Worker         UmdUHeight                                                     = (GMM_GLOBAL_GFX_SIZE_T)((pTexInfo->Size / pTexInfo->Pitch) - pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_U]);
1243*35ffd701SAndroid Build Coastguard Worker     }
1244*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 3)
1245*35ffd701SAndroid Build Coastguard Worker     {
1246*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_U] =
1247*35ffd701SAndroid Build Coastguard Worker         pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_V] = VHeight;
1248*35ffd701SAndroid Build Coastguard Worker         UmdUHeight                                                     = (GMM_GLOBAL_GFX_SIZE_T)(pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_V] - pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_U]);
1249*35ffd701SAndroid Build Coastguard Worker         UmdVHeight                                                     = (GMM_GLOBAL_GFX_SIZE_T)(((pTexInfo->Size / pTexInfo->Pitch) - pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_U]) / 2);
1250*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERTPTR((UmdUHeight == UmdVHeight), VOIDRETURN);
1251*35ffd701SAndroid Build Coastguard Worker     }
1252*35ffd701SAndroid Build Coastguard Worker 
1253*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(((pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_U] == YHeight) && (UmdUHeight == VHeight)), VOIDRETURN);
1254*35ffd701SAndroid Build Coastguard Worker }
1255*35ffd701SAndroid Build Coastguard Worker 
IsTileAlignedPlanes(GMM_TEXTURE_INFO * pTexInfo)1256*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmXe_LPGTextureCalc::IsTileAlignedPlanes(GMM_TEXTURE_INFO *pTexInfo)
1257*35ffd701SAndroid Build Coastguard Worker {
1258*35ffd701SAndroid Build Coastguard Worker     return pTexInfo->OffsetInfo.PlaneXe_LPG.IsTileAlignedPlanes;
1259*35ffd701SAndroid Build Coastguard Worker }
1260*35ffd701SAndroid Build Coastguard Worker 
GetNumberOfPlanes(GMM_TEXTURE_INFO * pTexInfo)1261*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmXe_LPGTextureCalc::GetNumberOfPlanes(GMM_TEXTURE_INFO *pTexInfo)
1262*35ffd701SAndroid Build Coastguard Worker {
1263*35ffd701SAndroid Build Coastguard Worker     return pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes;
1264*35ffd701SAndroid Build Coastguard Worker }
1265*35ffd701SAndroid Build Coastguard Worker 
GetPlaneIdForCpuBlt(GMM_TEXTURE_INFO * pTexInfo,GMM_RES_COPY_BLT * pBlt,uint32_t * PlaneId)1266*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmXe_LPGTextureCalc::GetPlaneIdForCpuBlt(GMM_TEXTURE_INFO *pTexInfo, GMM_RES_COPY_BLT *pBlt, uint32_t *PlaneId)
1267*35ffd701SAndroid Build Coastguard Worker {
1268*35ffd701SAndroid Build Coastguard Worker     uint32_t TotalHeight = 0;
1269*35ffd701SAndroid Build Coastguard Worker 
1270*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 2)
1271*35ffd701SAndroid Build Coastguard Worker     {
1272*35ffd701SAndroid Build Coastguard Worker         TotalHeight = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_Y] +
1273*35ffd701SAndroid Build Coastguard Worker                                      pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_U]);
1274*35ffd701SAndroid Build Coastguard Worker     }
1275*35ffd701SAndroid Build Coastguard Worker     else if(pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 3)
1276*35ffd701SAndroid Build Coastguard Worker     {
1277*35ffd701SAndroid Build Coastguard Worker         TotalHeight = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_Y] +
1278*35ffd701SAndroid Build Coastguard Worker                                      pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_U] +
1279*35ffd701SAndroid Build Coastguard Worker                                      pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_V]);
1280*35ffd701SAndroid Build Coastguard Worker     }
1281*35ffd701SAndroid Build Coastguard Worker     else
1282*35ffd701SAndroid Build Coastguard Worker     {
1283*35ffd701SAndroid Build Coastguard Worker         TotalHeight = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_Y]); //YV12 exception
1284*35ffd701SAndroid Build Coastguard Worker     }
1285*35ffd701SAndroid Build Coastguard Worker 
1286*35ffd701SAndroid Build Coastguard Worker     // Determine if BLT rectange is for monolithic surface or contained in specific Y/UV plane
1287*35ffd701SAndroid Build Coastguard Worker     if(((pBlt->Gpu.OffsetY + pBlt->Blt.Height <= pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_U]) || pTexInfo->OffsetInfo.PlaneXe_LPG.NoOfPlanes == 1) &&
1288*35ffd701SAndroid Build Coastguard Worker        (pBlt->Gpu.OffsetX + pBlt->Blt.Width <= pTexInfo->BaseWidth))
1289*35ffd701SAndroid Build Coastguard Worker     {
1290*35ffd701SAndroid Build Coastguard Worker         *PlaneId = GMM_PLANE_Y;
1291*35ffd701SAndroid Build Coastguard Worker     }
1292*35ffd701SAndroid Build Coastguard Worker     else if(pBlt->Gpu.OffsetY >= pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_U] &&
1293*35ffd701SAndroid Build Coastguard Worker             (pBlt->Gpu.OffsetY + pBlt->Blt.Height <= (pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_U] + pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_U])) &&
1294*35ffd701SAndroid Build Coastguard Worker             (pBlt->Gpu.OffsetX + pBlt->Blt.Width <= pTexInfo->BaseWidth))
1295*35ffd701SAndroid Build Coastguard Worker     {
1296*35ffd701SAndroid Build Coastguard Worker         *PlaneId = GMM_PLANE_U;
1297*35ffd701SAndroid Build Coastguard Worker     }
1298*35ffd701SAndroid Build Coastguard Worker     else if(pBlt->Gpu.OffsetY >= pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_V] &&
1299*35ffd701SAndroid Build Coastguard Worker             (pBlt->Gpu.OffsetY + pBlt->Blt.Height <= (pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_V] + pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_U])) &&
1300*35ffd701SAndroid Build Coastguard Worker             (pBlt->Gpu.OffsetX + pBlt->Blt.Width <= pTexInfo->BaseWidth))
1301*35ffd701SAndroid Build Coastguard Worker     {
1302*35ffd701SAndroid Build Coastguard Worker         *PlaneId = GMM_PLANE_V;
1303*35ffd701SAndroid Build Coastguard Worker     }
1304*35ffd701SAndroid Build Coastguard Worker 
1305*35ffd701SAndroid Build Coastguard Worker     // For smaller surface, BLT rect may fall in Y Plane due to tile alignment but user may have requested monolithic BLT
1306*35ffd701SAndroid Build Coastguard Worker     if(pBlt->Gpu.OffsetX == 0 &&
1307*35ffd701SAndroid Build Coastguard Worker        pBlt->Gpu.OffsetY == 0 &&
1308*35ffd701SAndroid Build Coastguard Worker        pBlt->Blt.Height >= TotalHeight)
1309*35ffd701SAndroid Build Coastguard Worker     {
1310*35ffd701SAndroid Build Coastguard Worker         *PlaneId = GMM_MAX_PLANE;
1311*35ffd701SAndroid Build Coastguard Worker     }
1312*35ffd701SAndroid Build Coastguard Worker }
1313*35ffd701SAndroid Build Coastguard Worker 
GetBltInfoPerPlane(GMM_TEXTURE_INFO * pTexInfo,GMM_RES_COPY_BLT * pBlt,uint32_t PlaneId)1314*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmXe_LPGTextureCalc::GetBltInfoPerPlane(GMM_TEXTURE_INFO *pTexInfo, GMM_RES_COPY_BLT *pBlt, uint32_t PlaneId)
1315*35ffd701SAndroid Build Coastguard Worker {
1316*35ffd701SAndroid Build Coastguard Worker     if(PlaneId == GMM_PLANE_Y)
1317*35ffd701SAndroid Build Coastguard Worker     {
1318*35ffd701SAndroid Build Coastguard Worker         pBlt->Gpu.OffsetX = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.X[GMM_PLANE_Y]);
1319*35ffd701SAndroid Build Coastguard Worker         pBlt->Gpu.OffsetY = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_Y]);
1320*35ffd701SAndroid Build Coastguard Worker         pBlt->Blt.Height  = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_Y]);
1321*35ffd701SAndroid Build Coastguard Worker     }
1322*35ffd701SAndroid Build Coastguard Worker     else if(PlaneId == GMM_PLANE_U)
1323*35ffd701SAndroid Build Coastguard Worker     {
1324*35ffd701SAndroid Build Coastguard Worker         pBlt->Gpu.OffsetX = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.X[GMM_PLANE_U]);
1325*35ffd701SAndroid Build Coastguard Worker         pBlt->Gpu.OffsetY = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_U]);
1326*35ffd701SAndroid Build Coastguard Worker 
1327*35ffd701SAndroid Build Coastguard Worker         pBlt->Sys.pData  = (char *)pBlt->Sys.pData + uint32_t(pBlt->Blt.Height * pBlt->Sys.RowPitch);
1328*35ffd701SAndroid Build Coastguard Worker         pBlt->Blt.Height = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_U]);
1329*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Info.RedecribedPlanes)
1330*35ffd701SAndroid Build Coastguard Worker         {
1331*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(0);
1332*35ffd701SAndroid Build Coastguard Worker         }
1333*35ffd701SAndroid Build Coastguard Worker     }
1334*35ffd701SAndroid Build Coastguard Worker     else
1335*35ffd701SAndroid Build Coastguard Worker     {
1336*35ffd701SAndroid Build Coastguard Worker         pBlt->Gpu.OffsetX = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.X[GMM_PLANE_V]);
1337*35ffd701SAndroid Build Coastguard Worker         pBlt->Gpu.OffsetY = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.Y[GMM_PLANE_V]);
1338*35ffd701SAndroid Build Coastguard Worker         pBlt->Blt.Height  = GFX_ULONG_CAST(pTexInfo->OffsetInfo.PlaneXe_LPG.UnAligned.Height[GMM_PLANE_U]);
1339*35ffd701SAndroid Build Coastguard Worker         pBlt->Sys.pData   = (char *)pBlt->Sys.pData + uint32_t(pBlt->Blt.Height * pBlt->Sys.RowPitch);
1340*35ffd701SAndroid Build Coastguard Worker     }
1341*35ffd701SAndroid Build Coastguard Worker }
1342