1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker
23*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
24*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/Texture/GmmGen10TextureCalc.h"
25*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/Texture/GmmGen11TextureCalc.h"
26*35ffd701SAndroid Build Coastguard Worker
27*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
28*35ffd701SAndroid Build Coastguard Worker /// This function calculates the (X,Y) address of each given plane. X is in bytes
29*35ffd701SAndroid Build Coastguard Worker /// and Y is in scanlines.
30*35ffd701SAndroid Build Coastguard Worker ///
31*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO
32*35ffd701SAndroid Build Coastguard Worker ///
33*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillPlanarOffsetAddress(GMM_TEXTURE_INFO * pTexInfo)34*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmGen11TextureCalc::FillPlanarOffsetAddress(GMM_TEXTURE_INFO *pTexInfo)
35*35ffd701SAndroid Build Coastguard Worker {
36*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T *pUOffsetX, *pUOffsetY;
37*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T *pVOffsetX, *pVOffsetY;
38*35ffd701SAndroid Build Coastguard Worker uint32_t YHeight = 0, VHeight = 0;
39*35ffd701SAndroid Build Coastguard Worker bool UVPacked = false;
40*35ffd701SAndroid Build Coastguard Worker uint32_t Height;
41*35ffd701SAndroid Build Coastguard Worker uint32_t WidthBytesPhysical = GFX_ULONG_CAST(pTexInfo->BaseWidth) * pTexInfo->BitsPerPixel >> 3;
42*35ffd701SAndroid Build Coastguard Worker
43*35ffd701SAndroid Build Coastguard Worker #define SWAP_UV() \
44*35ffd701SAndroid Build Coastguard Worker { \
45*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T *pTemp; \
46*35ffd701SAndroid Build Coastguard Worker \
47*35ffd701SAndroid Build Coastguard Worker pTemp = pUOffsetX; \
48*35ffd701SAndroid Build Coastguard Worker pUOffsetX = pVOffsetX; \
49*35ffd701SAndroid Build Coastguard Worker pVOffsetX = pTemp; \
50*35ffd701SAndroid Build Coastguard Worker \
51*35ffd701SAndroid Build Coastguard Worker pTemp = pUOffsetY; \
52*35ffd701SAndroid Build Coastguard Worker pUOffsetY = pVOffsetY; \
53*35ffd701SAndroid Build Coastguard Worker pVOffsetY = pTemp; \
54*35ffd701SAndroid Build Coastguard Worker }
55*35ffd701SAndroid Build Coastguard Worker
56*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pTexInfo, VOIDRETURN);
57*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(((pTexInfo->TileMode < GMM_TILE_MODES) && (pTexInfo->TileMode >= TILE_NONE)), VOIDRETURN);
58*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
59*35ffd701SAndroid Build Coastguard Worker
60*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
61*35ffd701SAndroid Build Coastguard Worker
62*35ffd701SAndroid Build Coastguard Worker // GMM_PLANE_Y always at (0, 0)...
63*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.X[GMM_PLANE_Y] = 0;
64*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_Y] = 0;
65*35ffd701SAndroid Build Coastguard Worker
66*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_Y] = 0;
67*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_Y] = 0;
68*35ffd701SAndroid Build Coastguard Worker
69*35ffd701SAndroid Build Coastguard Worker Height = pTexInfo->BaseHeight;
70*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
71*35ffd701SAndroid Build Coastguard Worker {
72*35ffd701SAndroid Build Coastguard Worker Height = __GMM_EXPAND_HEIGHT(this, Height, pTexInfo->Alignment.VAlign, pTexInfo);
73*35ffd701SAndroid Build Coastguard Worker Height = ScaleTextureHeight(pTexInfo, Height);
74*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.UnifiedAuxSurface)
75*35ffd701SAndroid Build Coastguard Worker {
76*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_Y] = 0;
77*35ffd701SAndroid Build Coastguard Worker }
78*35ffd701SAndroid Build Coastguard Worker }
79*35ffd701SAndroid Build Coastguard Worker
80*35ffd701SAndroid Build Coastguard Worker // GMM_PLANE_U/V Planes...
81*35ffd701SAndroid Build Coastguard Worker pUOffsetX = &pTexInfo->OffsetInfo.Plane.X[GMM_PLANE_U];
82*35ffd701SAndroid Build Coastguard Worker pUOffsetY = &pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_U];
83*35ffd701SAndroid Build Coastguard Worker pVOffsetX = &pTexInfo->OffsetInfo.Plane.X[GMM_PLANE_V];
84*35ffd701SAndroid Build Coastguard Worker pVOffsetY = &pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_V];
85*35ffd701SAndroid Build Coastguard Worker
86*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->Format)
87*35ffd701SAndroid Build Coastguard Worker {
88*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC1:
89*35ffd701SAndroid Build Coastguard Worker SWAP_UV(); // IMC1 = IMC3 with Swapped U/V
90*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC3:
91*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV420: // Same as IMC3.
92*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
93*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
94*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
95*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
96*35ffd701SAndroid Build Coastguard Worker // UUUU
97*35ffd701SAndroid Build Coastguard Worker // UUUU
98*35ffd701SAndroid Build Coastguard Worker // VVVV
99*35ffd701SAndroid Build Coastguard Worker // VVVV
100*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422V: // Similar to IMC3 but U/V are full width.
101*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
102*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
103*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
104*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
105*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
106*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
107*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
108*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
109*35ffd701SAndroid Build Coastguard Worker {
110*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
111*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
112*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
113*35ffd701SAndroid Build Coastguard Worker
114*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
115*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
116*35ffd701SAndroid Build Coastguard Worker *pVOffsetY =
117*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) +
118*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
119*35ffd701SAndroid Build Coastguard Worker
120*35ffd701SAndroid Build Coastguard Worker break;
121*35ffd701SAndroid Build Coastguard Worker }
122*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411R_TYPE: //Similar to IMC3 but U/V are quarther height and full width.
123*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
124*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
125*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
126*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
127*35ffd701SAndroid Build Coastguard Worker //UUUUUUUU
128*35ffd701SAndroid Build Coastguard Worker //VVVVVVVV
129*35ffd701SAndroid Build Coastguard Worker {
130*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
131*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
132*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
133*35ffd701SAndroid Build Coastguard Worker
134*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
135*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
136*35ffd701SAndroid Build Coastguard Worker *pVOffsetY =
137*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) +
138*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
139*35ffd701SAndroid Build Coastguard Worker
140*35ffd701SAndroid Build Coastguard Worker break;
141*35ffd701SAndroid Build Coastguard Worker }
142*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411: // Similar to IMC3 but U/V are quarter width and full height.
143*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
144*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
145*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
146*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
147*35ffd701SAndroid Build Coastguard Worker // UU
148*35ffd701SAndroid Build Coastguard Worker // UU
149*35ffd701SAndroid Build Coastguard Worker // UU
150*35ffd701SAndroid Build Coastguard Worker // UU
151*35ffd701SAndroid Build Coastguard Worker // VV
152*35ffd701SAndroid Build Coastguard Worker // VV
153*35ffd701SAndroid Build Coastguard Worker // VV
154*35ffd701SAndroid Build Coastguard Worker // VV
155*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422H: // Similar to IMC3 but U/V are full height.
156*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
157*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
158*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
159*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
160*35ffd701SAndroid Build Coastguard Worker // UUUU
161*35ffd701SAndroid Build Coastguard Worker // UUUU
162*35ffd701SAndroid Build Coastguard Worker // UUUU
163*35ffd701SAndroid Build Coastguard Worker // UUUU
164*35ffd701SAndroid Build Coastguard Worker // VVVV
165*35ffd701SAndroid Build Coastguard Worker // VVVV
166*35ffd701SAndroid Build Coastguard Worker // VVVV
167*35ffd701SAndroid Build Coastguard Worker // VVVV
168*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV444: // Similar to IMC3 but U/V are full size.
169*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
170*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
171*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
172*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
173*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
174*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
175*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
176*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
177*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
178*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
179*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
180*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
181*35ffd701SAndroid Build Coastguard Worker {
182*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
183*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
184*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
185*35ffd701SAndroid Build Coastguard Worker
186*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
187*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
188*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) * 2;
189*35ffd701SAndroid Build Coastguard Worker
190*35ffd701SAndroid Build Coastguard Worker break;
191*35ffd701SAndroid Build Coastguard Worker }
192*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_BGRP:
193*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_RGBP:
194*35ffd701SAndroid Build Coastguard Worker {
195*35ffd701SAndroid Build Coastguard Worker //For RGBP linear Tile keep resource Offset non aligned and for other Tile format to be 16-bit aligned
196*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.Linear)
197*35ffd701SAndroid Build Coastguard Worker {
198*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
199*35ffd701SAndroid Build Coastguard Worker YHeight = pTexInfo->BaseHeight;
200*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = pTexInfo->BaseHeight;
201*35ffd701SAndroid Build Coastguard Worker
202*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
203*35ffd701SAndroid Build Coastguard Worker VHeight = pTexInfo->BaseHeight;
204*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = (GMM_GFX_SIZE_T)pTexInfo->BaseHeight * 2;
205*35ffd701SAndroid Build Coastguard Worker }
206*35ffd701SAndroid Build Coastguard Worker else //Tiled
207*35ffd701SAndroid Build Coastguard Worker {
208*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
209*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
210*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
211*35ffd701SAndroid Build Coastguard Worker
212*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
213*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
214*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = (GMM_GFX_SIZE_T)GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) * 2;
215*35ffd701SAndroid Build Coastguard Worker }
216*35ffd701SAndroid Build Coastguard Worker break;
217*35ffd701SAndroid Build Coastguard Worker }
218*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC2:
219*35ffd701SAndroid Build Coastguard Worker SWAP_UV(); // IMC2 = IMC4 with Swapped U/V
220*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC4:
221*35ffd701SAndroid Build Coastguard Worker {
222*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
223*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
224*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
225*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
226*35ffd701SAndroid Build Coastguard Worker // UUUUVVVV
227*35ffd701SAndroid Build Coastguard Worker // UUUUVVVV
228*35ffd701SAndroid Build Coastguard Worker
229*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT((pTexInfo->Pitch & 1) == 0);
230*35ffd701SAndroid Build Coastguard Worker
231*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
232*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
233*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
234*35ffd701SAndroid Build Coastguard Worker
235*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = pTexInfo->Pitch / 2;
236*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_CEIL_DIV(YHeight, 2);
237*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
238*35ffd701SAndroid Build Coastguard Worker
239*35ffd701SAndroid Build Coastguard Worker // Not technically UV packed but sizing works out the same
240*35ffd701SAndroid Build Coastguard Worker UVPacked = true;
241*35ffd701SAndroid Build Coastguard Worker
242*35ffd701SAndroid Build Coastguard Worker break;
243*35ffd701SAndroid Build Coastguard Worker }
244*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_I420: // I420 = IYUV
245*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IYUV:
246*35ffd701SAndroid Build Coastguard Worker SWAP_UV(); // I420/IYUV = YV12 with Swapped U/V
247*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YV12:
248*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YVU9:
249*35ffd701SAndroid Build Coastguard Worker {
250*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
251*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
252*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
253*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
254*35ffd701SAndroid Build Coastguard Worker // VVVVVV.. <-- V and U planes follow the Y plane, as linear
255*35ffd701SAndroid Build Coastguard Worker // ..UUUUUU arrays--without respect to pitch.
256*35ffd701SAndroid Build Coastguard Worker
257*35ffd701SAndroid Build Coastguard Worker uint32_t YSize, YVSizeRShift, VSize, UOffset;
258*35ffd701SAndroid Build Coastguard Worker uint32_t YSizeForUVPurposes, YSizeForUVPurposesDimensionalAlignment;
259*35ffd701SAndroid Build Coastguard Worker
260*35ffd701SAndroid Build Coastguard Worker YSize = GFX_ULONG_CAST(pTexInfo->Pitch) * pTexInfo->BaseHeight;
261*35ffd701SAndroid Build Coastguard Worker
262*35ffd701SAndroid Build Coastguard Worker // YVU9 has one U/V pixel for each 4x4 Y block.
263*35ffd701SAndroid Build Coastguard Worker // The others have one U/V pixel for each 2x2 Y block.
264*35ffd701SAndroid Build Coastguard Worker
265*35ffd701SAndroid Build Coastguard Worker // YVU9 has a Y:V size ratio of 16 (4x4 --> 1).
266*35ffd701SAndroid Build Coastguard Worker // The others have a ratio of 4 (2x2 --> 1).
267*35ffd701SAndroid Build Coastguard Worker YVSizeRShift = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
268*35ffd701SAndroid Build Coastguard Worker
269*35ffd701SAndroid Build Coastguard Worker // If a Y plane isn't fully-aligned to its Y-->U/V block size, the
270*35ffd701SAndroid Build Coastguard Worker // extra/unaligned Y pixels still need corresponding U/V pixels--So
271*35ffd701SAndroid Build Coastguard Worker // for the purpose of computing the UVSize, we must consider a
272*35ffd701SAndroid Build Coastguard Worker // dimensionally "rounded-up" YSize. (E.g. a 13x5 YVU9 Y plane would
273*35ffd701SAndroid Build Coastguard Worker // require 4x2 U/V planes--the same UVSize as a fully-aligned 16x8 Y.)
274*35ffd701SAndroid Build Coastguard Worker YSizeForUVPurposesDimensionalAlignment = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
275*35ffd701SAndroid Build Coastguard Worker YSizeForUVPurposes =
276*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(GFX_ULONG_CAST(pTexInfo->Pitch), YSizeForUVPurposesDimensionalAlignment) *
277*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(pTexInfo->BaseHeight, YSizeForUVPurposesDimensionalAlignment);
278*35ffd701SAndroid Build Coastguard Worker
279*35ffd701SAndroid Build Coastguard Worker VSize = (YSizeForUVPurposes >> YVSizeRShift);
280*35ffd701SAndroid Build Coastguard Worker UOffset = YSize + VSize;
281*35ffd701SAndroid Build Coastguard Worker
282*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
283*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = pTexInfo->BaseHeight;
284*35ffd701SAndroid Build Coastguard Worker
285*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = UOffset % pTexInfo->Pitch;
286*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = UOffset / pTexInfo->Pitch;
287*35ffd701SAndroid Build Coastguard Worker
288*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_CEIL_DIV(YSize + 2 * VSize, WidthBytesPhysical);
289*35ffd701SAndroid Build Coastguard Worker
290*35ffd701SAndroid Build Coastguard Worker break;
291*35ffd701SAndroid Build Coastguard Worker }
292*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV12:
293*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV21:
294*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV11:
295*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
296*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
297*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
298*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P208:
299*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P216:
300*35ffd701SAndroid Build Coastguard Worker {
301*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
302*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
303*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
304*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
305*35ffd701SAndroid Build Coastguard Worker // [UV-Packing]
306*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = *pVOffsetX = 0;
307*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(Height, __GMM_EVEN_ROW);
308*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = *pVOffsetY = YHeight;
309*35ffd701SAndroid Build Coastguard Worker
310*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Format == GMM_FORMAT_NV12) ||
311*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_NV21) ||
312*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P010) ||
313*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P012) ||
314*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P016))
315*35ffd701SAndroid Build Coastguard Worker {
316*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_CEIL_DIV(Height, 2);
317*35ffd701SAndroid Build Coastguard Worker }
318*35ffd701SAndroid Build Coastguard Worker else
319*35ffd701SAndroid Build Coastguard Worker {
320*35ffd701SAndroid Build Coastguard Worker VHeight = YHeight; // U/V plane is same as Y
321*35ffd701SAndroid Build Coastguard Worker }
322*35ffd701SAndroid Build Coastguard Worker
323*35ffd701SAndroid Build Coastguard Worker UVPacked = true;
324*35ffd701SAndroid Build Coastguard Worker break;
325*35ffd701SAndroid Build Coastguard Worker }
326*35ffd701SAndroid Build Coastguard Worker default:
327*35ffd701SAndroid Build Coastguard Worker {
328*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Unknown Video Format U\n");
329*35ffd701SAndroid Build Coastguard Worker break;
330*35ffd701SAndroid Build Coastguard Worker }
331*35ffd701SAndroid Build Coastguard Worker }
332*35ffd701SAndroid Build Coastguard Worker
333*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_Y] = YHeight;
334*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->OffsetInfo.Plane.NoOfPlanes == 2)
335*35ffd701SAndroid Build Coastguard Worker {
336*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_U] = VHeight;
337*35ffd701SAndroid Build Coastguard Worker }
338*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->OffsetInfo.Plane.NoOfPlanes == 3)
339*35ffd701SAndroid Build Coastguard Worker {
340*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_U] =
341*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_V] = VHeight;
342*35ffd701SAndroid Build Coastguard Worker }
343*35ffd701SAndroid Build Coastguard Worker
344*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]) || pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
345*35ffd701SAndroid Build Coastguard Worker {
346*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T TileHeight = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight;
347*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T TileWidth = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth;
348*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T PhysicalTileHeight = TileHeight;
349*35ffd701SAndroid Build Coastguard Worker if(GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) > IGFX_GEN11LP_CORE)
350*35ffd701SAndroid Build Coastguard Worker {
351*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.CCS && !pGmmLibContext->GetSkuTable().FtrFlatPhysCCS)
352*35ffd701SAndroid Build Coastguard Worker {
353*35ffd701SAndroid Build Coastguard Worker //U/V must be aligned to AuxT granularity, 4x pitchalign enforces 16K-align for 4KB tile,
354*35ffd701SAndroid Build Coastguard Worker //add extra padding for 64K AuxT, 1MB AuxT
355*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_64KB_TILE(pTexInfo->Flags))
356*35ffd701SAndroid Build Coastguard Worker {
357*35ffd701SAndroid Build Coastguard Worker TileHeight *= (!WA64K(pGmmLibContext) && !WA16K(pGmmLibContext)) ? 16 : 1; // For 64Kb Tile mode: Multiply TileHeight by 16 for 1 MB alignment
358*35ffd701SAndroid Build Coastguard Worker }
359*35ffd701SAndroid Build Coastguard Worker else
360*35ffd701SAndroid Build Coastguard Worker {
361*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
362*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
363*35ffd701SAndroid Build Coastguard Worker }
364*35ffd701SAndroid Build Coastguard Worker }
365*35ffd701SAndroid Build Coastguard Worker }
366*35ffd701SAndroid Build Coastguard Worker
367*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = GFX_ALIGN(*pUOffsetX, TileWidth);
368*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(*pUOffsetY, TileHeight);
369*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = GFX_ALIGN(*pVOffsetX, TileWidth);
370*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = UVPacked ?
371*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(*pVOffsetY, TileHeight) :
372*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(YHeight, TileHeight) + GFX_ALIGN(VHeight, TileHeight);
373*35ffd701SAndroid Build Coastguard Worker
374*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.UnifiedAuxSurface && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
375*35ffd701SAndroid Build Coastguard Worker {
376*35ffd701SAndroid Build Coastguard Worker *pUOffsetY += pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_Y];
377*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = *pUOffsetY;
378*35ffd701SAndroid Build Coastguard Worker }
379*35ffd701SAndroid Build Coastguard Worker
380*35ffd701SAndroid Build Coastguard Worker // This is needed for FtrDisplayPageTables
381*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetSkuTable().FtrDisplayPageTables)
382*35ffd701SAndroid Build Coastguard Worker {
383*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.Aligned.Height[GMM_PLANE_Y] = GFX_ALIGN(YHeight, TileHeight);
384*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->OffsetInfo.Plane.NoOfPlanes == 2)
385*35ffd701SAndroid Build Coastguard Worker {
386*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.Aligned.Height[GMM_PLANE_U] = GFX_ALIGN(VHeight, TileHeight);
387*35ffd701SAndroid Build Coastguard Worker }
388*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->OffsetInfo.Plane.NoOfPlanes == 3)
389*35ffd701SAndroid Build Coastguard Worker {
390*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.Aligned.Height[GMM_PLANE_U] =
391*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.Aligned.Height[GMM_PLANE_V] = GFX_ALIGN(VHeight, TileHeight);
392*35ffd701SAndroid Build Coastguard Worker }
393*35ffd701SAndroid Build Coastguard Worker }
394*35ffd701SAndroid Build Coastguard Worker }
395*35ffd701SAndroid Build Coastguard Worker
396*35ffd701SAndroid Build Coastguard Worker //Special case LKF MMC compressed surfaces
397*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.MMC &&
398*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.UnifiedAuxSurface &&
399*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledY)
400*35ffd701SAndroid Build Coastguard Worker {
401*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T TileHeight = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileHeight;
402*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T TileWidth = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileWidth;
403*35ffd701SAndroid Build Coastguard Worker
404*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = GFX_ALIGN(*pUOffsetX, TileWidth);
405*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(*pUOffsetY, TileHeight);
406*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = GFX_ALIGN(*pVOffsetX, TileWidth);
407*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = GFX_ALIGN(*pVOffsetY, TileHeight);
408*35ffd701SAndroid Build Coastguard Worker }
409*35ffd701SAndroid Build Coastguard Worker
410*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
411*35ffd701SAndroid Build Coastguard Worker
412*35ffd701SAndroid Build Coastguard Worker #undef SWAP_UV
413*35ffd701SAndroid Build Coastguard Worker }
414*35ffd701SAndroid Build Coastguard Worker
415*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
416*35ffd701SAndroid Build Coastguard Worker /// Returns the mip offset of given LOD in Mip Tail
417*35ffd701SAndroid Build Coastguard Worker ///
418*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
419*35ffd701SAndroid Build Coastguard Worker /// MipLevel: mip-map level
420*35ffd701SAndroid Build Coastguard Worker ///
421*35ffd701SAndroid Build Coastguard Worker /// @return offset value of LOD in bytes
422*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetMipTailByteOffset(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)423*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmGen11TextureCalc::GetMipTailByteOffset(GMM_TEXTURE_INFO *pTexInfo,
424*35ffd701SAndroid Build Coastguard Worker uint32_t MipLevel)
425*35ffd701SAndroid Build Coastguard Worker {
426*35ffd701SAndroid Build Coastguard Worker uint32_t ByteOffset = 0, Slot = 0xff;
427*35ffd701SAndroid Build Coastguard Worker
428*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
429*35ffd701SAndroid Build Coastguard Worker
430*35ffd701SAndroid Build Coastguard Worker // 3D textures follow the Gen10 mip tail format
431*35ffd701SAndroid Build Coastguard Worker if(!pGmmLibContext->GetSkuTable().FtrStandardMipTailFormat)
432*35ffd701SAndroid Build Coastguard Worker {
433*35ffd701SAndroid Build Coastguard Worker return GmmGen9TextureCalc::GetMipTailByteOffset(pTexInfo, MipLevel);
434*35ffd701SAndroid Build Coastguard Worker }
435*35ffd701SAndroid Build Coastguard Worker
436*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Type == RESOURCE_1D) || (pTexInfo->Type == RESOURCE_3D))
437*35ffd701SAndroid Build Coastguard Worker {
438*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod +
439*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf ? 4 : 0);
440*35ffd701SAndroid Build Coastguard Worker }
441*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Type == RESOURCE_2D || pTexInfo->Type == RESOURCE_CUBE)
442*35ffd701SAndroid Build Coastguard Worker {
443*35ffd701SAndroid Build Coastguard Worker // clang-format off
444*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod +
445*35ffd701SAndroid Build Coastguard Worker // TileYs
446*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 16) ? 4 :
447*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 8) ? 3 :
448*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 4) ? 2 :
449*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 2) ? 1 :
450*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs ) ? 0 :
451*35ffd701SAndroid Build Coastguard Worker // TileYf
452*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf && pTexInfo->MSAA.NumSamples == 16) ? 11:
453*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf && pTexInfo->MSAA.NumSamples == 8) ? 10:
454*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf && pTexInfo->MSAA.NumSamples == 4) ? 8:
455*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf && pTexInfo->MSAA.NumSamples == 2) ? 5:
456*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf ) ? 4: 0);
457*35ffd701SAndroid Build Coastguard Worker // clang-format on
458*35ffd701SAndroid Build Coastguard Worker }
459*35ffd701SAndroid Build Coastguard Worker
460*35ffd701SAndroid Build Coastguard Worker switch(Slot)
461*35ffd701SAndroid Build Coastguard Worker {
462*35ffd701SAndroid Build Coastguard Worker case 0:
463*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(32);
464*35ffd701SAndroid Build Coastguard Worker break;
465*35ffd701SAndroid Build Coastguard Worker case 1:
466*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(16);
467*35ffd701SAndroid Build Coastguard Worker break;
468*35ffd701SAndroid Build Coastguard Worker case 2:
469*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(8);
470*35ffd701SAndroid Build Coastguard Worker break;
471*35ffd701SAndroid Build Coastguard Worker case 3:
472*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(4);
473*35ffd701SAndroid Build Coastguard Worker break;
474*35ffd701SAndroid Build Coastguard Worker case 4:
475*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_KBYTE(2);
476*35ffd701SAndroid Build Coastguard Worker break;
477*35ffd701SAndroid Build Coastguard Worker case 5:
478*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(1536);
479*35ffd701SAndroid Build Coastguard Worker break;
480*35ffd701SAndroid Build Coastguard Worker case 6:
481*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(1280);
482*35ffd701SAndroid Build Coastguard Worker break;
483*35ffd701SAndroid Build Coastguard Worker case 7:
484*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(1024);
485*35ffd701SAndroid Build Coastguard Worker break;
486*35ffd701SAndroid Build Coastguard Worker case 8:
487*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(768);
488*35ffd701SAndroid Build Coastguard Worker break;
489*35ffd701SAndroid Build Coastguard Worker case 9:
490*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(512);
491*35ffd701SAndroid Build Coastguard Worker break;
492*35ffd701SAndroid Build Coastguard Worker case 10:
493*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(256);
494*35ffd701SAndroid Build Coastguard Worker break;
495*35ffd701SAndroid Build Coastguard Worker case 11:
496*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(0);
497*35ffd701SAndroid Build Coastguard Worker break;
498*35ffd701SAndroid Build Coastguard Worker case 12:
499*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(64);
500*35ffd701SAndroid Build Coastguard Worker break;
501*35ffd701SAndroid Build Coastguard Worker case 13:
502*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(128);
503*35ffd701SAndroid Build Coastguard Worker break;
504*35ffd701SAndroid Build Coastguard Worker case 14:
505*35ffd701SAndroid Build Coastguard Worker ByteOffset = GMM_BYTES(196);
506*35ffd701SAndroid Build Coastguard Worker break;
507*35ffd701SAndroid Build Coastguard Worker default:
508*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
509*35ffd701SAndroid Build Coastguard Worker }
510*35ffd701SAndroid Build Coastguard Worker
511*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
512*35ffd701SAndroid Build Coastguard Worker
513*35ffd701SAndroid Build Coastguard Worker return (ByteOffset);
514*35ffd701SAndroid Build Coastguard Worker }
515*35ffd701SAndroid Build Coastguard Worker
516*35ffd701SAndroid Build Coastguard Worker
517*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
518*35ffd701SAndroid Build Coastguard Worker /// Returns the mip-map offset in geometric OffsetX, Y, Z for a given LOD in Mip Tail on Gen11.
519*35ffd701SAndroid Build Coastguard Worker ///
520*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO,
521*35ffd701SAndroid Build Coastguard Worker /// MipLevel: mip-map level
522*35ffd701SAndroid Build Coastguard Worker /// OffsetX: ptr to Offset in X direction (in bytes)
523*35ffd701SAndroid Build Coastguard Worker /// OffsetY: ptr to Offset in Y direction (in pixels)
524*35ffd701SAndroid Build Coastguard Worker /// OffsetZ: ptr to Offset in Z direction (in pixels)
525*35ffd701SAndroid Build Coastguard Worker ///
526*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
527*35ffd701SAndroid Build Coastguard Worker
528*35ffd701SAndroid Build Coastguard Worker GMM_MIPTAIL_SLOT_OFFSET Gen11MipTailSlotOffset1DSurface[15][5] = GEN11_MIPTAIL_SLOT_OFFSET_1D_SURFACE;
529*35ffd701SAndroid Build Coastguard Worker GMM_MIPTAIL_SLOT_OFFSET Gen11MipTailSlotOffset2DSurface[15][5] = GEN11_MIPTAIL_SLOT_OFFSET_2D_SURFACE;
530*35ffd701SAndroid Build Coastguard Worker GMM_MIPTAIL_SLOT_OFFSET Gen11MipTailSlotOffset3DSurface[15][5] = GEN11_MIPTAIL_SLOT_OFFSET_3D_SURFACE;
531*35ffd701SAndroid Build Coastguard Worker
GetMipTailGeometryOffset(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel,uint32_t * OffsetX,uint32_t * OffsetY,uint32_t * OffsetZ)532*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmGen11TextureCalc::GetMipTailGeometryOffset(GMM_TEXTURE_INFO *pTexInfo,
533*35ffd701SAndroid Build Coastguard Worker uint32_t MipLevel,
534*35ffd701SAndroid Build Coastguard Worker uint32_t * OffsetX,
535*35ffd701SAndroid Build Coastguard Worker uint32_t * OffsetY,
536*35ffd701SAndroid Build Coastguard Worker uint32_t * OffsetZ)
537*35ffd701SAndroid Build Coastguard Worker {
538*35ffd701SAndroid Build Coastguard Worker uint32_t ArrayIndex = 0;
539*35ffd701SAndroid Build Coastguard Worker uint32_t Slot = 0;
540*35ffd701SAndroid Build Coastguard Worker
541*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
542*35ffd701SAndroid Build Coastguard Worker
543*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->BitsPerPixel)
544*35ffd701SAndroid Build Coastguard Worker {
545*35ffd701SAndroid Build Coastguard Worker case 128:
546*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 0;
547*35ffd701SAndroid Build Coastguard Worker break;
548*35ffd701SAndroid Build Coastguard Worker case 64:
549*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 1;
550*35ffd701SAndroid Build Coastguard Worker break;
551*35ffd701SAndroid Build Coastguard Worker case 32:
552*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 2;
553*35ffd701SAndroid Build Coastguard Worker break;
554*35ffd701SAndroid Build Coastguard Worker case 16:
555*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 3;
556*35ffd701SAndroid Build Coastguard Worker break;
557*35ffd701SAndroid Build Coastguard Worker case 8:
558*35ffd701SAndroid Build Coastguard Worker ArrayIndex = 4;
559*35ffd701SAndroid Build Coastguard Worker break;
560*35ffd701SAndroid Build Coastguard Worker default:
561*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
562*35ffd701SAndroid Build Coastguard Worker break;
563*35ffd701SAndroid Build Coastguard Worker }
564*35ffd701SAndroid Build Coastguard Worker
565*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Type == RESOURCE_1D)
566*35ffd701SAndroid Build Coastguard Worker {
567*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod;
568*35ffd701SAndroid Build Coastguard Worker
569*35ffd701SAndroid Build Coastguard Worker *OffsetX = Gen11MipTailSlotOffset1DSurface[Slot][ArrayIndex].X * pTexInfo->BitsPerPixel / 8;
570*35ffd701SAndroid Build Coastguard Worker *OffsetY = Gen11MipTailSlotOffset1DSurface[Slot][ArrayIndex].Y;
571*35ffd701SAndroid Build Coastguard Worker *OffsetZ = Gen11MipTailSlotOffset1DSurface[Slot][ArrayIndex].Z;
572*35ffd701SAndroid Build Coastguard Worker }
573*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Type == RESOURCE_2D || pTexInfo->Type == RESOURCE_CUBE)
574*35ffd701SAndroid Build Coastguard Worker {
575*35ffd701SAndroid Build Coastguard Worker // clang-format off
576*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod +
577*35ffd701SAndroid Build Coastguard Worker // TileYs
578*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 16) ? 4 :
579*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 8) ? 3 :
580*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 4) ? 2 :
581*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs && pTexInfo->MSAA.NumSamples == 2) ? 1 :
582*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYs) ? 0 :
583*35ffd701SAndroid Build Coastguard Worker // TileYf
584*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf && pTexInfo->MSAA.NumSamples == 16) ? 11 :
585*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf && pTexInfo->MSAA.NumSamples == 8) ? 10 :
586*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf && pTexInfo->MSAA.NumSamples == 4) ? 8 :
587*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf && pTexInfo->MSAA.NumSamples == 2) ? 5 :
588*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledYf) ? 4 : 0);
589*35ffd701SAndroid Build Coastguard Worker // clang-format on
590*35ffd701SAndroid Build Coastguard Worker
591*35ffd701SAndroid Build Coastguard Worker *OffsetX = Gen11MipTailSlotOffset2DSurface[Slot][ArrayIndex].X * pTexInfo->BitsPerPixel / 8;
592*35ffd701SAndroid Build Coastguard Worker *OffsetY = Gen11MipTailSlotOffset2DSurface[Slot][ArrayIndex].Y;
593*35ffd701SAndroid Build Coastguard Worker *OffsetZ = Gen11MipTailSlotOffset2DSurface[Slot][ArrayIndex].Z;
594*35ffd701SAndroid Build Coastguard Worker }
595*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->Type == RESOURCE_3D)
596*35ffd701SAndroid Build Coastguard Worker {
597*35ffd701SAndroid Build Coastguard Worker Slot = MipLevel - pTexInfo->Alignment.MipTailStartLod;
598*35ffd701SAndroid Build Coastguard Worker
599*35ffd701SAndroid Build Coastguard Worker *OffsetX = Gen11MipTailSlotOffset3DSurface[Slot][ArrayIndex].X * pTexInfo->BitsPerPixel / 8;
600*35ffd701SAndroid Build Coastguard Worker *OffsetY = Gen11MipTailSlotOffset3DSurface[Slot][ArrayIndex].Y;
601*35ffd701SAndroid Build Coastguard Worker *OffsetZ = Gen11MipTailSlotOffset3DSurface[Slot][ArrayIndex].Z;
602*35ffd701SAndroid Build Coastguard Worker }
603*35ffd701SAndroid Build Coastguard Worker
604*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
605*35ffd701SAndroid Build Coastguard Worker return;
606*35ffd701SAndroid Build Coastguard Worker }
607*35ffd701SAndroid Build Coastguard Worker
FillLinearCCS(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)608*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmGen11TextureCalc::FillLinearCCS(GMM_TEXTURE_INFO * pTexInfo,
609*35ffd701SAndroid Build Coastguard Worker __GMM_BUFFER_TYPE *pRestrictions)
610*35ffd701SAndroid Build Coastguard Worker {
611*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T PaddedSize;
612*35ffd701SAndroid Build Coastguard Worker uint32_t TileHeight;
613*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T YCcsSize = 0;
614*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T UVCcsSize = 0;
615*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T TotalHeight = 0;
616*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
617*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
618*35ffd701SAndroid Build Coastguard Worker
619*35ffd701SAndroid Build Coastguard Worker
620*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo->Flags.Gpu.MMC &&
621*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.UnifiedAuxSurface &&
622*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.__NonMsaaLinearCCS);
623*35ffd701SAndroid Build Coastguard Worker
624*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_U] > 0);
625*35ffd701SAndroid Build Coastguard Worker TileHeight = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight;
626*35ffd701SAndroid Build Coastguard Worker
627*35ffd701SAndroid Build Coastguard Worker // Vinante : CCS or Tile status buffer is computed by giving 2bit for every 256bytes of origional pixel data.
628*35ffd701SAndroid Build Coastguard Worker // For YUV Planar surfaces, UV Plane follow immediately after Y plane. Y and UV surfaces have their own
629*35ffd701SAndroid Build Coastguard Worker // control surfaces. So AuxSurf will be linear buffer with CCS for Y plane followed by CCS for UV plane.
630*35ffd701SAndroid Build Coastguard Worker // Y and UV control surface must be 4kb base aligned and they store the control data for full tiles covering Y and UV
631*35ffd701SAndroid Build Coastguard Worker // planes respectively.
632*35ffd701SAndroid Build Coastguard Worker // GMM will also allocate cacheline aligned 64-byte to hold the LKF's software controlled media compression state.
633*35ffd701SAndroid Build Coastguard Worker // GMM will calculate YAuxOffset, UVAuxOffset and MediaCompression State offset on the fly. Refer GmmResGetAuxSurfaceOffset().
634*35ffd701SAndroid Build Coastguard Worker
635*35ffd701SAndroid Build Coastguard Worker YCcsSize = pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_U] * pTexInfo->Pitch / 1024;
636*35ffd701SAndroid Build Coastguard Worker YCcsSize = GFX_ALIGN(YCcsSize, PAGE_SIZE);
637*35ffd701SAndroid Build Coastguard Worker
638*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->ArraySize > 1)
639*35ffd701SAndroid Build Coastguard Worker {
640*35ffd701SAndroid Build Coastguard Worker TotalHeight = pTexInfo->OffsetInfo.Plane.ArrayQPitch / pTexInfo->Pitch;
641*35ffd701SAndroid Build Coastguard Worker }
642*35ffd701SAndroid Build Coastguard Worker else
643*35ffd701SAndroid Build Coastguard Worker {
644*35ffd701SAndroid Build Coastguard Worker TotalHeight = pTexInfo->Size / pTexInfo->Pitch;
645*35ffd701SAndroid Build Coastguard Worker }
646*35ffd701SAndroid Build Coastguard Worker
647*35ffd701SAndroid Build Coastguard Worker UVCcsSize = (TotalHeight - pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_U]) * pTexInfo->Pitch / 1024;
648*35ffd701SAndroid Build Coastguard Worker UVCcsSize = GFX_ALIGN(UVCcsSize, PAGE_SIZE);
649*35ffd701SAndroid Build Coastguard Worker
650*35ffd701SAndroid Build Coastguard Worker pTexInfo->Size = GFX_ALIGN(YCcsSize + UVCcsSize + GMM_MEDIA_COMPRESSION_STATE_SIZE, pRestrictions->MinAllocationSize);
651*35ffd701SAndroid Build Coastguard Worker pTexInfo->Pitch = 0;
652*35ffd701SAndroid Build Coastguard Worker
653*35ffd701SAndroid Build Coastguard Worker //Store the dimension of linear surface in OffsetInfo.Plane.X.
654*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.X[GMM_PLANE_Y] = YCcsSize;
655*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.X[GMM_PLANE_U] =
656*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.X[GMM_PLANE_V] = UVCcsSize;
657*35ffd701SAndroid Build Coastguard Worker
658*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_Y] =
659*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_U] =
660*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_V] = 0;
661*35ffd701SAndroid Build Coastguard Worker
662*35ffd701SAndroid Build Coastguard Worker // Planar & hybrid 2D arrays supported in DX11.1+ spec but not HW. Memory layout
663*35ffd701SAndroid Build Coastguard Worker // is defined by SW requirements; Y plane must be 4KB aligned.
664*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->ArraySize > 1)
665*35ffd701SAndroid Build Coastguard Worker {
666*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T ElementSizeBytes = pTexInfo->Size;
667*35ffd701SAndroid Build Coastguard Worker int64_t LargeSize;
668*35ffd701SAndroid Build Coastguard Worker
669*35ffd701SAndroid Build Coastguard Worker // Size should always be page aligned.
670*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT((pTexInfo->Size % PAGE_SIZE) == 0);
671*35ffd701SAndroid Build Coastguard Worker
672*35ffd701SAndroid Build Coastguard Worker if((LargeSize = (int64_t)ElementSizeBytes * pTexInfo->ArraySize) <= pPlatform->SurfaceMaxSize)
673*35ffd701SAndroid Build Coastguard Worker {
674*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.ArrayQPitch = ElementSizeBytes;
675*35ffd701SAndroid Build Coastguard Worker pTexInfo->Size = LargeSize;
676*35ffd701SAndroid Build Coastguard Worker }
677*35ffd701SAndroid Build Coastguard Worker else
678*35ffd701SAndroid Build Coastguard Worker {
679*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Surface too large!");
680*35ffd701SAndroid Build Coastguard Worker return GMM_ERROR;
681*35ffd701SAndroid Build Coastguard Worker }
682*35ffd701SAndroid Build Coastguard Worker }
683*35ffd701SAndroid Build Coastguard Worker
684*35ffd701SAndroid Build Coastguard Worker return GMM_SUCCESS;
685*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
686*35ffd701SAndroid Build Coastguard Worker }
687*35ffd701SAndroid Build Coastguard Worker
688*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
689*35ffd701SAndroid Build Coastguard Worker /// This function will Setup a planar surface allocation.
690*35ffd701SAndroid Build Coastguard Worker ///
691*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: Reference to ::GMM_TEXTURE_INFO
692*35ffd701SAndroid Build Coastguard Worker /// @param[in] pRestrictions: Reference to surface alignment and size restrictions.
693*35ffd701SAndroid Build Coastguard Worker ///
694*35ffd701SAndroid Build Coastguard Worker /// @return ::GMM_STATUS
695*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillTexPlanar(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)696*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmGen11TextureCalc::FillTexPlanar(GMM_TEXTURE_INFO * pTexInfo,
697*35ffd701SAndroid Build Coastguard Worker __GMM_BUFFER_TYPE *pRestrictions)
698*35ffd701SAndroid Build Coastguard Worker {
699*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
700*35ffd701SAndroid Build Coastguard Worker
701*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
702*35ffd701SAndroid Build Coastguard Worker uint32_t WidthBytesPhysical, Height, YHeight, VHeight;
703*35ffd701SAndroid Build Coastguard Worker uint32_t AdjustedVHeight = 0;
704*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status;
705*35ffd701SAndroid Build Coastguard Worker bool UVPacked = false;
706*35ffd701SAndroid Build Coastguard Worker
707*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
708*35ffd701SAndroid Build Coastguard Worker
709*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pTexInfo, GMM_ERROR);
710*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pRestrictions, GMM_ERROR);
711*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(!pTexInfo->Flags.Info.TiledW);
712*35ffd701SAndroid Build Coastguard Worker
713*35ffd701SAndroid Build Coastguard Worker pTexInfo->TileMode = TILE_NONE;
714*35ffd701SAndroid Build Coastguard Worker
715*35ffd701SAndroid Build Coastguard Worker WidthBytesPhysical = GFX_ULONG_CAST(pTexInfo->BaseWidth) * pTexInfo->BitsPerPixel >> 3;
716*35ffd701SAndroid Build Coastguard Worker Height = VHeight = 0;
717*35ffd701SAndroid Build Coastguard Worker
718*35ffd701SAndroid Build Coastguard Worker YHeight = pTexInfo->BaseHeight;
719*35ffd701SAndroid Build Coastguard Worker
720*35ffd701SAndroid Build Coastguard Worker //[History]
721*35ffd701SAndroid Build Coastguard Worker // When planar surfaces are tiled, there are HW alignment
722*35ffd701SAndroid Build Coastguard Worker // restrictions about where the U and V planes can be located.
723*35ffd701SAndroid Build Coastguard Worker // Prior to SURFACE_STATE.X/YOffset support, planes needed to start
724*35ffd701SAndroid Build Coastguard Worker // on tile boundaries; with X/YOffset support, the alignment
725*35ffd701SAndroid Build Coastguard Worker // restrictions were reduced (but not eliminated).
726*35ffd701SAndroid Build Coastguard Worker //
727*35ffd701SAndroid Build Coastguard Worker // Horizontal alignment is only an issue for IMC2/4 surfaces, since
728*35ffd701SAndroid Build Coastguard Worker // the planes of all other formats are always on the left-edge.
729*35ffd701SAndroid Build Coastguard Worker //
730*35ffd701SAndroid Build Coastguard Worker // For IMC1/3 surfaces, we must ensure that both the U/V planes are
731*35ffd701SAndroid Build Coastguard Worker // properly aligned--That is, both the YHeight and VHeight must be
732*35ffd701SAndroid Build Coastguard Worker // properly aligned. For all other surfaces (since the U/V data
733*35ffd701SAndroid Build Coastguard Worker // starts at a common vertical location) only YHeight must be
734*35ffd701SAndroid Build Coastguard Worker // properly aligned.
735*35ffd701SAndroid Build Coastguard Worker
736*35ffd701SAndroid Build Coastguard Worker // [Current] :
737*35ffd701SAndroid Build Coastguard Worker // For Tiled surfaces, even though h/w supports U and V plane alignment
738*35ffd701SAndroid Build Coastguard Worker // at lower granularities GMM will align all the planes at Tiled boundary
739*35ffd701SAndroid Build Coastguard Worker // to unify the implementation across all platforms and GMM will add
740*35ffd701SAndroid Build Coastguard Worker // handling for removing the extra padding when UMDs request for ResCpuBlt
741*35ffd701SAndroid Build Coastguard Worker // operations.
742*35ffd701SAndroid Build Coastguard Worker // For Linear surfaces, GMM will continue to support minimal aligment restrictions
743*35ffd701SAndroid Build Coastguard Worker
744*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->Format)
745*35ffd701SAndroid Build Coastguard Worker {
746*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC1: // IMC1 = IMC3 with Swapped U/V
747*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC3:
748*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV420: // Same as IMC3.
749*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
750*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
751*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
752*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
753*35ffd701SAndroid Build Coastguard Worker // UUUU
754*35ffd701SAndroid Build Coastguard Worker // UUUU
755*35ffd701SAndroid Build Coastguard Worker // VVVV
756*35ffd701SAndroid Build Coastguard Worker // VVVV
757*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422V: // Similar to IMC3 but U/V are full width.
758*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
759*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
760*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
761*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
762*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
763*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
764*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
765*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
766*35ffd701SAndroid Build Coastguard Worker {
767*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(GFX_CEIL_DIV(YHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
768*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
769*35ffd701SAndroid Build Coastguard Worker
770*35ffd701SAndroid Build Coastguard Worker Height = YHeight + 2 * VHeight; // One VHeight for V and one for U.
771*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
772*35ffd701SAndroid Build Coastguard Worker break;
773*35ffd701SAndroid Build Coastguard Worker }
774*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411R_TYPE: //Similar to IMC3 but U/V are quarther height and full width.
775*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
776*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
777*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
778*35ffd701SAndroid Build Coastguard Worker //YYYYYYYY
779*35ffd701SAndroid Build Coastguard Worker //UUUUUUUU
780*35ffd701SAndroid Build Coastguard Worker //VVVVVVVV
781*35ffd701SAndroid Build Coastguard Worker {
782*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(GFX_CEIL_DIV(YHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
783*35ffd701SAndroid Build Coastguard Worker
784*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
785*35ffd701SAndroid Build Coastguard Worker
786*35ffd701SAndroid Build Coastguard Worker Height = YHeight + 2 * VHeight;
787*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
788*35ffd701SAndroid Build Coastguard Worker break;
789*35ffd701SAndroid Build Coastguard Worker }
790*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411: // Similar to IMC3 but U/V are quarter width and full height.
791*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
792*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
793*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
794*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
795*35ffd701SAndroid Build Coastguard Worker // UU
796*35ffd701SAndroid Build Coastguard Worker // UU
797*35ffd701SAndroid Build Coastguard Worker // UU
798*35ffd701SAndroid Build Coastguard Worker // UU
799*35ffd701SAndroid Build Coastguard Worker // VV
800*35ffd701SAndroid Build Coastguard Worker // VV
801*35ffd701SAndroid Build Coastguard Worker // VV
802*35ffd701SAndroid Build Coastguard Worker // VV
803*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422H: // Similar to IMC3 but U/V are full height.
804*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
805*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
806*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
807*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
808*35ffd701SAndroid Build Coastguard Worker // UUUU
809*35ffd701SAndroid Build Coastguard Worker // UUUU
810*35ffd701SAndroid Build Coastguard Worker // UUUU
811*35ffd701SAndroid Build Coastguard Worker // UUUU
812*35ffd701SAndroid Build Coastguard Worker // VVVV
813*35ffd701SAndroid Build Coastguard Worker // VVVV
814*35ffd701SAndroid Build Coastguard Worker // VVVV
815*35ffd701SAndroid Build Coastguard Worker // VVVV
816*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV444: // Similar to IMC3 but U/V are full size.
817*35ffd701SAndroid Build Coastguard Worker #if _WIN32
818*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_WGBOX_YUV444:
819*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_WGBOX_PLANAR_YUV444:
820*35ffd701SAndroid Build Coastguard Worker #endif
821*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
822*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
823*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
824*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
825*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
826*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
827*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
828*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
829*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
830*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
831*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
832*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
833*35ffd701SAndroid Build Coastguard Worker {
834*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
835*35ffd701SAndroid Build Coastguard Worker VHeight = YHeight;
836*35ffd701SAndroid Build Coastguard Worker
837*35ffd701SAndroid Build Coastguard Worker Height = YHeight + 2 * VHeight;
838*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
839*35ffd701SAndroid Build Coastguard Worker break;
840*35ffd701SAndroid Build Coastguard Worker }
841*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_BGRP:
842*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_RGBP:
843*35ffd701SAndroid Build Coastguard Worker {
844*35ffd701SAndroid Build Coastguard Worker //For RGBP linear Tile keep resource Offset non aligned and for other Tile format to be 16-bit aligned
845*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.Linear)
846*35ffd701SAndroid Build Coastguard Worker {
847*35ffd701SAndroid Build Coastguard Worker VHeight = YHeight;
848*35ffd701SAndroid Build Coastguard Worker
849*35ffd701SAndroid Build Coastguard Worker Height = YHeight + 2 * VHeight;
850*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
851*35ffd701SAndroid Build Coastguard Worker }
852*35ffd701SAndroid Build Coastguard Worker else //Tiled
853*35ffd701SAndroid Build Coastguard Worker {
854*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
855*35ffd701SAndroid Build Coastguard Worker VHeight = YHeight;
856*35ffd701SAndroid Build Coastguard Worker
857*35ffd701SAndroid Build Coastguard Worker Height = YHeight + 2 * VHeight;
858*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 3;
859*35ffd701SAndroid Build Coastguard Worker }
860*35ffd701SAndroid Build Coastguard Worker break;
861*35ffd701SAndroid Build Coastguard Worker }
862*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC2: // IMC2 = IMC4 with Swapped U/V
863*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC4:
864*35ffd701SAndroid Build Coastguard Worker {
865*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
866*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
867*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
868*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
869*35ffd701SAndroid Build Coastguard Worker // UUUUVVVV
870*35ffd701SAndroid Build Coastguard Worker // UUUUVVVV
871*35ffd701SAndroid Build Coastguard Worker
872*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(YHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
873*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_CEIL_DIV(YHeight, 2);
874*35ffd701SAndroid Build Coastguard Worker
875*35ffd701SAndroid Build Coastguard Worker WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical, 2); // If odd YWidth, pitch bumps-up to fit rounded-up U/V planes.
876*35ffd701SAndroid Build Coastguard Worker
877*35ffd701SAndroid Build Coastguard Worker Height = YHeight + VHeight;
878*35ffd701SAndroid Build Coastguard Worker
879*35ffd701SAndroid Build Coastguard Worker // With SURFACE_STATE.XOffset support, the U-V interface has
880*35ffd701SAndroid Build Coastguard Worker // much lighter restrictions--which will be naturally met by
881*35ffd701SAndroid Build Coastguard Worker // surface pitch restrictions (i.e. dividing an IMC2/4 pitch
882*35ffd701SAndroid Build Coastguard Worker // by 2--to get the U/V interface--will always produce a safe
883*35ffd701SAndroid Build Coastguard Worker // XOffset value).
884*35ffd701SAndroid Build Coastguard Worker
885*35ffd701SAndroid Build Coastguard Worker // Not technically UV packed but sizing works out the same
886*35ffd701SAndroid Build Coastguard Worker // if the resource is std swizzled
887*35ffd701SAndroid Build Coastguard Worker UVPacked = true;
888*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 2;
889*35ffd701SAndroid Build Coastguard Worker
890*35ffd701SAndroid Build Coastguard Worker break;
891*35ffd701SAndroid Build Coastguard Worker }
892*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV12:
893*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV21:
894*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV11:
895*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
896*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
897*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
898*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P208:
899*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P216:
900*35ffd701SAndroid Build Coastguard Worker {
901*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
902*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
903*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
904*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
905*35ffd701SAndroid Build Coastguard Worker // [UV-Packing]
906*35ffd701SAndroid Build Coastguard Worker
907*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Format == GMM_FORMAT_NV12) ||
908*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_NV21) ||
909*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P010) ||
910*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P012) ||
911*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P016))
912*35ffd701SAndroid Build Coastguard Worker {
913*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_CEIL_DIV(YHeight, 2); // U/V plane half of Y
914*35ffd701SAndroid Build Coastguard Worker Height = YHeight + VHeight;
915*35ffd701SAndroid Build Coastguard Worker }
916*35ffd701SAndroid Build Coastguard Worker else
917*35ffd701SAndroid Build Coastguard Worker {
918*35ffd701SAndroid Build Coastguard Worker VHeight = YHeight; // U/V plane is same as Y
919*35ffd701SAndroid Build Coastguard Worker Height = YHeight + VHeight;
920*35ffd701SAndroid Build Coastguard Worker }
921*35ffd701SAndroid Build Coastguard Worker
922*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Format == GMM_FORMAT_NV12) ||
923*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_NV21) ||
924*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P010) ||
925*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P012) ||
926*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P016) ||
927*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P208) ||
928*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P216))
929*35ffd701SAndroid Build Coastguard Worker {
930*35ffd701SAndroid Build Coastguard Worker WidthBytesPhysical = GFX_ALIGN(WidthBytesPhysical, 2); // If odd YWidth, pitch bumps-up to fit rounded-up U/V planes.
931*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 2;
932*35ffd701SAndroid Build Coastguard Worker }
933*35ffd701SAndroid Build Coastguard Worker else //if(pTexInfo->Format == GMM_FORMAT_NV11)
934*35ffd701SAndroid Build Coastguard Worker {
935*35ffd701SAndroid Build Coastguard Worker // Tiling not supported, since YPitch != UVPitch...
936*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledY = 0;
937*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledYf = 0;
938*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledYs = 0;
939*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledX = 0;
940*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.Linear = 1;
941*35ffd701SAndroid Build Coastguard Worker }
942*35ffd701SAndroid Build Coastguard Worker
943*35ffd701SAndroid Build Coastguard Worker UVPacked = true;
944*35ffd701SAndroid Build Coastguard Worker break;
945*35ffd701SAndroid Build Coastguard Worker }
946*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_I420: // IYUV & I420: are identical to YV12 except,
947*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IYUV: // U & V pl.s are reversed.
948*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YV12:
949*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YVU9:
950*35ffd701SAndroid Build Coastguard Worker {
951*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
952*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
953*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
954*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
955*35ffd701SAndroid Build Coastguard Worker // VVVVVV.. <-- V and U planes follow the Y plane, as linear
956*35ffd701SAndroid Build Coastguard Worker // ..UUUUUU arrays--without respect to pitch.
957*35ffd701SAndroid Build Coastguard Worker
958*35ffd701SAndroid Build Coastguard Worker uint32_t YSize, UVSize, YVSizeRShift;
959*35ffd701SAndroid Build Coastguard Worker uint32_t YSizeForUVPurposes, YSizeForUVPurposesDimensionalAlignment;
960*35ffd701SAndroid Build Coastguard Worker
961*35ffd701SAndroid Build Coastguard Worker YSize = WidthBytesPhysical * YHeight;
962*35ffd701SAndroid Build Coastguard Worker
963*35ffd701SAndroid Build Coastguard Worker // YVU9 has one U/V pixel for each 4x4 Y block.
964*35ffd701SAndroid Build Coastguard Worker // The others have one U/V pixel for each 2x2 Y block.
965*35ffd701SAndroid Build Coastguard Worker
966*35ffd701SAndroid Build Coastguard Worker // YVU9 has a Y:V size ratio of 16 (4x4 --> 1).
967*35ffd701SAndroid Build Coastguard Worker // The others have a ratio of 4 (2x2 --> 1).
968*35ffd701SAndroid Build Coastguard Worker YVSizeRShift = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
969*35ffd701SAndroid Build Coastguard Worker
970*35ffd701SAndroid Build Coastguard Worker // If a Y plane isn't fully-aligned to its Y-->U/V block size, the
971*35ffd701SAndroid Build Coastguard Worker // extra/unaligned Y pixels still need corresponding U/V pixels--So
972*35ffd701SAndroid Build Coastguard Worker // for the purpose of computing the UVSize, we must consider a
973*35ffd701SAndroid Build Coastguard Worker // dimensionally "rounded-up" YSize. (E.g. a 13x5 YVU9 Y plane would
974*35ffd701SAndroid Build Coastguard Worker // require 4x2 U/V planes--the same UVSize as a fully-aligned 16x8 Y.)
975*35ffd701SAndroid Build Coastguard Worker YSizeForUVPurposesDimensionalAlignment = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
976*35ffd701SAndroid Build Coastguard Worker YSizeForUVPurposes =
977*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(WidthBytesPhysical, YSizeForUVPurposesDimensionalAlignment) *
978*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(YHeight, YSizeForUVPurposesDimensionalAlignment);
979*35ffd701SAndroid Build Coastguard Worker
980*35ffd701SAndroid Build Coastguard Worker UVSize = 2 * // <-- U + V
981*35ffd701SAndroid Build Coastguard Worker (YSizeForUVPurposes >> YVSizeRShift);
982*35ffd701SAndroid Build Coastguard Worker
983*35ffd701SAndroid Build Coastguard Worker Height = GFX_CEIL_DIV(YSize + UVSize, WidthBytesPhysical);
984*35ffd701SAndroid Build Coastguard Worker
985*35ffd701SAndroid Build Coastguard Worker // Tiling not supported, since YPitch != UVPitch...
986*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledY = 0;
987*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledYf = 0;
988*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledYs = 0;
989*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledX = 0;
990*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.Linear = 1;
991*35ffd701SAndroid Build Coastguard Worker
992*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.NoOfPlanes = 1;
993*35ffd701SAndroid Build Coastguard Worker break;
994*35ffd701SAndroid Build Coastguard Worker }
995*35ffd701SAndroid Build Coastguard Worker default:
996*35ffd701SAndroid Build Coastguard Worker {
997*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Unexpected format");
998*35ffd701SAndroid Build Coastguard Worker return GMM_ERROR;
999*35ffd701SAndroid Build Coastguard Worker }
1000*35ffd701SAndroid Build Coastguard Worker }
1001*35ffd701SAndroid Build Coastguard Worker
1002*35ffd701SAndroid Build Coastguard Worker // Align Height to even row to avoid hang if HW over-fetch
1003*35ffd701SAndroid Build Coastguard Worker Height = GFX_ALIGN(Height, __GMM_EVEN_ROW);
1004*35ffd701SAndroid Build Coastguard Worker
1005*35ffd701SAndroid Build Coastguard Worker SetTileMode(pTexInfo);
1006*35ffd701SAndroid Build Coastguard Worker
1007*35ffd701SAndroid Build Coastguard Worker // MMC is not supported for linear formats.
1008*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.MMC)
1009*35ffd701SAndroid Build Coastguard Worker {
1010*35ffd701SAndroid Build Coastguard Worker if(!(pTexInfo->Flags.Info.TiledY || pTexInfo->Flags.Info.TiledYf || pTexInfo->Flags.Info.TiledYs))
1011*35ffd701SAndroid Build Coastguard Worker {
1012*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.MMC = 0;
1013*35ffd701SAndroid Build Coastguard Worker }
1014*35ffd701SAndroid Build Coastguard Worker }
1015*35ffd701SAndroid Build Coastguard Worker
1016*35ffd701SAndroid Build Coastguard Worker // Legacy Planar "Linear Video" Restrictions...
1017*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.Linear && !pTexInfo->Flags.Wa.NoLegacyPlanarLinearVideoRestrictions)
1018*35ffd701SAndroid Build Coastguard Worker {
1019*35ffd701SAndroid Build Coastguard Worker pRestrictions->LockPitchAlignment = GFX_MAX(pRestrictions->LockPitchAlignment, GMM_BYTES(64));
1020*35ffd701SAndroid Build Coastguard Worker pRestrictions->MinPitch = GFX_MAX(pRestrictions->MinPitch, GMM_BYTES(64));
1021*35ffd701SAndroid Build Coastguard Worker pRestrictions->PitchAlignment = GFX_MAX(pRestrictions->PitchAlignment, GMM_BYTES(64));
1022*35ffd701SAndroid Build Coastguard Worker pRestrictions->RenderPitchAlignment = GFX_MAX(pRestrictions->RenderPitchAlignment, GMM_BYTES(64));
1023*35ffd701SAndroid Build Coastguard Worker }
1024*35ffd701SAndroid Build Coastguard Worker
1025*35ffd701SAndroid Build Coastguard Worker // Multiply overall pitch alignment for surfaces whose U/V planes have a
1026*35ffd701SAndroid Build Coastguard Worker // pitch down-scaled from that of Y--Since the U/V pitches must meet the
1027*35ffd701SAndroid Build Coastguard Worker // original restriction, the Y pitch must meet a scaled-up multiple.
1028*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Format == GMM_FORMAT_I420) ||
1029*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_IYUV) ||
1030*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_NV11) ||
1031*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_YV12) ||
1032*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_YVU9))
1033*35ffd701SAndroid Build Coastguard Worker {
1034*35ffd701SAndroid Build Coastguard Worker uint32_t LShift =
1035*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format != GMM_FORMAT_YVU9) ?
1036*35ffd701SAndroid Build Coastguard Worker 1 : // UVPitch = 1/2 YPitch
1037*35ffd701SAndroid Build Coastguard Worker 2; // UVPitch = 1/4 YPitch
1038*35ffd701SAndroid Build Coastguard Worker
1039*35ffd701SAndroid Build Coastguard Worker pRestrictions->LockPitchAlignment <<= LShift;
1040*35ffd701SAndroid Build Coastguard Worker pRestrictions->MinPitch <<= LShift;
1041*35ffd701SAndroid Build Coastguard Worker pRestrictions->PitchAlignment <<= LShift;
1042*35ffd701SAndroid Build Coastguard Worker pRestrictions->RenderPitchAlignment <<= LShift;
1043*35ffd701SAndroid Build Coastguard Worker }
1044*35ffd701SAndroid Build Coastguard Worker
1045*35ffd701SAndroid Build Coastguard Worker AdjustedVHeight = VHeight;
1046*35ffd701SAndroid Build Coastguard Worker // In case of Planar surfaces, only the last Plane has to be aligned to 64 for LCU access
1047*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetWaTable().WaAlignYUVResourceToLCU && GmmIsYUVFormatLCUAligned(pTexInfo->Format) && VHeight > 0)
1048*35ffd701SAndroid Build Coastguard Worker {
1049*35ffd701SAndroid Build Coastguard Worker AdjustedVHeight = GFX_ALIGN(VHeight, GMM_SCANLINES(GMM_MAX_LCU_SIZE));
1050*35ffd701SAndroid Build Coastguard Worker Height += AdjustedVHeight - VHeight;
1051*35ffd701SAndroid Build Coastguard Worker }
1052*35ffd701SAndroid Build Coastguard Worker
1053*35ffd701SAndroid Build Coastguard Worker // For Tiled Planar surfaces, the planes must be tile-boundary aligned.
1054*35ffd701SAndroid Build Coastguard Worker // Actual alignment is handled in FillPlanarOffsetAddress, but height
1055*35ffd701SAndroid Build Coastguard Worker // and width must be adjusted for correct size calculation
1056*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]))
1057*35ffd701SAndroid Build Coastguard Worker {
1058*35ffd701SAndroid Build Coastguard Worker uint32_t TileHeight = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileHeight;
1059*35ffd701SAndroid Build Coastguard Worker uint32_t TileWidth = pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileWidth;
1060*35ffd701SAndroid Build Coastguard Worker
1061*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.IsTileAlignedPlanes = true;
1062*35ffd701SAndroid Build Coastguard Worker
1063*35ffd701SAndroid Build Coastguard Worker //for separate U and V planes, use U plane unaligned and V plane aligned
1064*35ffd701SAndroid Build Coastguard Worker Height = GFX_ALIGN(YHeight, TileHeight) + (UVPacked ? GFX_ALIGN(AdjustedVHeight, TileHeight) :
1065*35ffd701SAndroid Build Coastguard Worker (GFX_ALIGN(VHeight, TileHeight) + GFX_ALIGN(AdjustedVHeight, TileHeight)));
1066*35ffd701SAndroid Build Coastguard Worker
1067*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Format == GMM_FORMAT_IMC2 || // IMC2, IMC4 needs even tile columns
1068*35ffd701SAndroid Build Coastguard Worker pTexInfo->Format == GMM_FORMAT_IMC4)
1069*35ffd701SAndroid Build Coastguard Worker {
1070*35ffd701SAndroid Build Coastguard Worker // If the U & V planes are side-by-side then the surface pitch must be
1071*35ffd701SAndroid Build Coastguard Worker // padded out so that U and V planes will being on a tile boundary.
1072*35ffd701SAndroid Build Coastguard Worker // This means that an odd Y plane width must be padded out
1073*35ffd701SAndroid Build Coastguard Worker // with an additional tile. Even widths do not need padding
1074*35ffd701SAndroid Build Coastguard Worker uint32_t TileCols = GFX_CEIL_DIV(WidthBytesPhysical, TileWidth);
1075*35ffd701SAndroid Build Coastguard Worker if(TileCols % 2)
1076*35ffd701SAndroid Build Coastguard Worker {
1077*35ffd701SAndroid Build Coastguard Worker WidthBytesPhysical = (TileCols + 1) * TileWidth;
1078*35ffd701SAndroid Build Coastguard Worker }
1079*35ffd701SAndroid Build Coastguard Worker }
1080*35ffd701SAndroid Build Coastguard Worker
1081*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.TiledYs || pTexInfo->Flags.Info.TiledYf)
1082*35ffd701SAndroid Build Coastguard Worker {
1083*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.RedecribedPlanes = 1;
1084*35ffd701SAndroid Build Coastguard Worker }
1085*35ffd701SAndroid Build Coastguard Worker }
1086*35ffd701SAndroid Build Coastguard Worker
1087*35ffd701SAndroid Build Coastguard Worker // Vary wide planar tiled planar formats do not support MMC pre gen11. All formats do not support
1088*35ffd701SAndroid Build Coastguard Worker //Special case LKF MMC compressed surfaces
1089*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.MMC &&
1090*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.UnifiedAuxSurface &&
1091*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Info.TiledY)
1092*35ffd701SAndroid Build Coastguard Worker {
1093*35ffd701SAndroid Build Coastguard Worker uint32_t TileHeight = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileHeight;
1094*35ffd701SAndroid Build Coastguard Worker
1095*35ffd701SAndroid Build Coastguard Worker Height = GFX_ALIGN(YHeight, TileHeight) + GFX_ALIGN(AdjustedVHeight, TileHeight);
1096*35ffd701SAndroid Build Coastguard Worker }
1097*35ffd701SAndroid Build Coastguard Worker
1098*35ffd701SAndroid Build Coastguard Worker // Vary wide planar tiled planar formats do not support MMC pre gen11. All formats do not support
1099*35ffd701SAndroid Build Coastguard Worker // Very wide planar tiled planar formats do not support MMC pre gen11. All formats do not support
1100*35ffd701SAndroid Build Coastguard Worker // MMC above 16k bytes wide, while Yf NV12 does not support above 8k - 128 bytes.
1101*35ffd701SAndroid Build Coastguard Worker if((GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) <= IGFX_GEN10_CORE) &&
1102*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Info.TiledY || pTexInfo->Flags.Info.TiledYf || pTexInfo->Flags.Info.TiledYs))
1103*35ffd701SAndroid Build Coastguard Worker {
1104*35ffd701SAndroid Build Coastguard Worker if(((pTexInfo->BaseWidth * pTexInfo->BitsPerPixel / 8) >= GMM_KBYTE(16)) ||
1105*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_NV12 && pTexInfo->Flags.Info.TiledYf &&
1106*35ffd701SAndroid Build Coastguard Worker (pTexInfo->BaseWidth * pTexInfo->BitsPerPixel / 8) >= (GMM_KBYTE(8) - 128)))
1107*35ffd701SAndroid Build Coastguard Worker {
1108*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.MMC = 0;
1109*35ffd701SAndroid Build Coastguard Worker }
1110*35ffd701SAndroid Build Coastguard Worker }
1111*35ffd701SAndroid Build Coastguard Worker
1112*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.RedecribedPlanes)
1113*35ffd701SAndroid Build Coastguard Worker {
1114*35ffd701SAndroid Build Coastguard Worker if(false == RedescribeTexturePlanes(pTexInfo, &WidthBytesPhysical))
1115*35ffd701SAndroid Build Coastguard Worker {
1116*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(false);
1117*35ffd701SAndroid Build Coastguard Worker }
1118*35ffd701SAndroid Build Coastguard Worker }
1119*35ffd701SAndroid Build Coastguard Worker
1120*35ffd701SAndroid Build Coastguard Worker if((Status = // <-- Note assignment.
1121*35ffd701SAndroid Build Coastguard Worker FillTexPitchAndSize(
1122*35ffd701SAndroid Build Coastguard Worker pTexInfo, WidthBytesPhysical, Height, pRestrictions)) == GMM_SUCCESS)
1123*35ffd701SAndroid Build Coastguard Worker {
1124*35ffd701SAndroid Build Coastguard Worker FillPlanarOffsetAddress(pTexInfo);
1125*35ffd701SAndroid Build Coastguard Worker }
1126*35ffd701SAndroid Build Coastguard Worker
1127*35ffd701SAndroid Build Coastguard Worker // Planar & hybrid 2D arrays supported in DX11.1+ spec but not HW. Memory layout
1128*35ffd701SAndroid Build Coastguard Worker // is defined by SW requirements; Y plane must be 4KB aligned.
1129*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->ArraySize > 1)
1130*35ffd701SAndroid Build Coastguard Worker {
1131*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T ElementSizeBytes = pTexInfo->Size;
1132*35ffd701SAndroid Build Coastguard Worker int64_t LargeSize;
1133*35ffd701SAndroid Build Coastguard Worker
1134*35ffd701SAndroid Build Coastguard Worker // Size should always be page aligned.
1135*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT((pTexInfo->Size % PAGE_SIZE) == 0);
1136*35ffd701SAndroid Build Coastguard Worker
1137*35ffd701SAndroid Build Coastguard Worker if((LargeSize = (int64_t)ElementSizeBytes * pTexInfo->ArraySize) <= pPlatform->SurfaceMaxSize)
1138*35ffd701SAndroid Build Coastguard Worker {
1139*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.ArrayQPitch = ElementSizeBytes;
1140*35ffd701SAndroid Build Coastguard Worker pTexInfo->Size = LargeSize;
1141*35ffd701SAndroid Build Coastguard Worker }
1142*35ffd701SAndroid Build Coastguard Worker else
1143*35ffd701SAndroid Build Coastguard Worker {
1144*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Surface too large!");
1145*35ffd701SAndroid Build Coastguard Worker Status = GMM_ERROR;
1146*35ffd701SAndroid Build Coastguard Worker }
1147*35ffd701SAndroid Build Coastguard Worker }
1148*35ffd701SAndroid Build Coastguard Worker
1149*35ffd701SAndroid Build Coastguard Worker //LKF specific Restrictions
1150*35ffd701SAndroid Build Coastguard Worker if(GFX_GET_CURRENT_PRODUCT(pPlatform->Platform) == IGFX_LAKEFIELD)
1151*35ffd701SAndroid Build Coastguard Worker {
1152*35ffd701SAndroid Build Coastguard Worker // If GMM fall backs TileY to Linear then reset the UnifiedAuxSurface flag.
1153*35ffd701SAndroid Build Coastguard Worker if(!pTexInfo->Flags.Gpu.MMC &&
1154*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.UnifiedAuxSurface &&
1155*35ffd701SAndroid Build Coastguard Worker !pTexInfo->Flags.Gpu.__NonMsaaLinearCCS)
1156*35ffd701SAndroid Build Coastguard Worker {
1157*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "MMC TileY is fallback to Linear surface!");
1158*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.UnifiedAuxSurface = 0;
1159*35ffd701SAndroid Build Coastguard Worker }
1160*35ffd701SAndroid Build Coastguard Worker
1161*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.MMC &&
1162*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.UnifiedAuxSurface &&
1163*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.__NonMsaaLinearCCS)
1164*35ffd701SAndroid Build Coastguard Worker {
1165*35ffd701SAndroid Build Coastguard Worker FillLinearCCS(pTexInfo, pRestrictions);
1166*35ffd701SAndroid Build Coastguard Worker }
1167*35ffd701SAndroid Build Coastguard Worker }
1168*35ffd701SAndroid Build Coastguard Worker
1169*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
1170*35ffd701SAndroid Build Coastguard Worker
1171*35ffd701SAndroid Build Coastguard Worker return GMM_SUCCESS;
1172*35ffd701SAndroid Build Coastguard Worker }
1173