1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker
23*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
24*35ffd701SAndroid Build Coastguard Worker
25*35ffd701SAndroid Build Coastguard Worker
26*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
27*35ffd701SAndroid Build Coastguard Worker /// This function calculates the (X,Y) address of each given plane. X is in bytes
28*35ffd701SAndroid Build Coastguard Worker /// and Y is in scanlines.
29*35ffd701SAndroid Build Coastguard Worker ///
30*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO
31*35ffd701SAndroid Build Coastguard Worker ///
32*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FillPlanarOffsetAddress(GMM_TEXTURE_INFO * pTexInfo)33*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmTextureCalc::FillPlanarOffsetAddress(GMM_TEXTURE_INFO *pTexInfo)
34*35ffd701SAndroid Build Coastguard Worker {
35*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T *pUOffsetX, *pUOffsetY;
36*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T *pVOffsetX, *pVOffsetY;
37*35ffd701SAndroid Build Coastguard Worker uint32_t YHeight = 0, VHeight = 0;
38*35ffd701SAndroid Build Coastguard Worker bool UVPacked = false;
39*35ffd701SAndroid Build Coastguard Worker uint32_t Height;
40*35ffd701SAndroid Build Coastguard Worker uint32_t WidthBytesPhysical = GFX_ULONG_CAST(pTexInfo->BaseWidth) * pTexInfo->BitsPerPixel >> 3;
41*35ffd701SAndroid Build Coastguard Worker
42*35ffd701SAndroid Build Coastguard Worker #define SWAP_UV() \
43*35ffd701SAndroid Build Coastguard Worker { \
44*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T *pTemp; \
45*35ffd701SAndroid Build Coastguard Worker \
46*35ffd701SAndroid Build Coastguard Worker pTemp = pUOffsetX; \
47*35ffd701SAndroid Build Coastguard Worker pUOffsetX = pVOffsetX; \
48*35ffd701SAndroid Build Coastguard Worker pVOffsetX = pTemp; \
49*35ffd701SAndroid Build Coastguard Worker \
50*35ffd701SAndroid Build Coastguard Worker pTemp = pUOffsetY; \
51*35ffd701SAndroid Build Coastguard Worker pUOffsetY = pVOffsetY; \
52*35ffd701SAndroid Build Coastguard Worker pVOffsetY = pTemp; \
53*35ffd701SAndroid Build Coastguard Worker }
54*35ffd701SAndroid Build Coastguard Worker
55*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pTexInfo, VOIDRETURN);
56*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(((pTexInfo->TileMode < GMM_TILE_MODES) && (pTexInfo->TileMode >= TILE_NONE)), VOIDRETURN);
57*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
58*35ffd701SAndroid Build Coastguard Worker
59*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
60*35ffd701SAndroid Build Coastguard Worker
61*35ffd701SAndroid Build Coastguard Worker // GMM_PLANE_Y always at (0, 0)...
62*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.X[GMM_PLANE_Y] = 0;
63*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_Y] = 0;
64*35ffd701SAndroid Build Coastguard Worker
65*35ffd701SAndroid Build Coastguard Worker Height = pTexInfo->BaseHeight;
66*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
67*35ffd701SAndroid Build Coastguard Worker {
68*35ffd701SAndroid Build Coastguard Worker Height = __GMM_EXPAND_HEIGHT(this, Height, pTexInfo->Alignment.VAlign, pTexInfo);
69*35ffd701SAndroid Build Coastguard Worker Height = ScaleTextureHeight(pTexInfo, Height);
70*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.UnifiedAuxSurface)
71*35ffd701SAndroid Build Coastguard Worker {
72*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_Y] = 0;
73*35ffd701SAndroid Build Coastguard Worker }
74*35ffd701SAndroid Build Coastguard Worker }
75*35ffd701SAndroid Build Coastguard Worker
76*35ffd701SAndroid Build Coastguard Worker // GMM_PLANE_U/V Planes...
77*35ffd701SAndroid Build Coastguard Worker pUOffsetX = &pTexInfo->OffsetInfo.Plane.X[GMM_PLANE_U];
78*35ffd701SAndroid Build Coastguard Worker pUOffsetY = &pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_U];
79*35ffd701SAndroid Build Coastguard Worker pVOffsetX = &pTexInfo->OffsetInfo.Plane.X[GMM_PLANE_V];
80*35ffd701SAndroid Build Coastguard Worker pVOffsetY = &pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_V];
81*35ffd701SAndroid Build Coastguard Worker
82*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->Format)
83*35ffd701SAndroid Build Coastguard Worker {
84*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC1:
85*35ffd701SAndroid Build Coastguard Worker SWAP_UV(); // IMC1 = IMC3 with Swapped U/V
86*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC3:
87*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV420: // Same as IMC3.
88*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
89*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
90*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
91*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
92*35ffd701SAndroid Build Coastguard Worker // UUUU
93*35ffd701SAndroid Build Coastguard Worker // UUUU
94*35ffd701SAndroid Build Coastguard Worker // VVVV
95*35ffd701SAndroid Build Coastguard Worker // VVVV
96*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422V: // Similar to IMC3 but U/V are full width.
97*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
98*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
99*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
100*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
101*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
102*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
103*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
104*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
105*35ffd701SAndroid Build Coastguard Worker {
106*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
107*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
108*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
109*35ffd701SAndroid Build Coastguard Worker
110*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
111*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
112*35ffd701SAndroid Build Coastguard Worker *pVOffsetY =
113*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) +
114*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
115*35ffd701SAndroid Build Coastguard Worker
116*35ffd701SAndroid Build Coastguard Worker break;
117*35ffd701SAndroid Build Coastguard Worker }
118*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411R_TYPE: //Similar to IMC3 but U/V are quarther height and full width.
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 //UUUUUUUU
124*35ffd701SAndroid Build Coastguard Worker //VVVVVVVV
125*35ffd701SAndroid Build Coastguard Worker {
126*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
127*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
128*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
129*35ffd701SAndroid Build Coastguard Worker
130*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
131*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
132*35ffd701SAndroid Build Coastguard Worker *pVOffsetY =
133*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) +
134*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(GFX_CEIL_DIV(pTexInfo->BaseHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
135*35ffd701SAndroid Build Coastguard Worker
136*35ffd701SAndroid Build Coastguard Worker break;
137*35ffd701SAndroid Build Coastguard Worker }
138*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411: // Similar to IMC3 but U/V are quarter width and full height.
139*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
140*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
141*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
142*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
143*35ffd701SAndroid Build Coastguard Worker // UU
144*35ffd701SAndroid Build Coastguard Worker // UU
145*35ffd701SAndroid Build Coastguard Worker // UU
146*35ffd701SAndroid Build Coastguard Worker // UU
147*35ffd701SAndroid Build Coastguard Worker // VV
148*35ffd701SAndroid Build Coastguard Worker // VV
149*35ffd701SAndroid Build Coastguard Worker // VV
150*35ffd701SAndroid Build Coastguard Worker // VV
151*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422H: // Similar to IMC3 but U/V are full height.
152*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
153*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
154*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
155*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
156*35ffd701SAndroid Build Coastguard Worker // UUUU
157*35ffd701SAndroid Build Coastguard Worker // UUUU
158*35ffd701SAndroid Build Coastguard Worker // UUUU
159*35ffd701SAndroid Build Coastguard Worker // UUUU
160*35ffd701SAndroid Build Coastguard Worker // VVVV
161*35ffd701SAndroid Build Coastguard Worker // VVVV
162*35ffd701SAndroid Build Coastguard Worker // VVVV
163*35ffd701SAndroid Build Coastguard Worker // VVVV
164*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV444: // Similar to IMC3 but U/V are full size.
165*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
166*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
167*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
168*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
169*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
170*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
171*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
172*35ffd701SAndroid Build Coastguard Worker // UUUUUUUU
173*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
174*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
175*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
176*35ffd701SAndroid Build Coastguard Worker // VVVVVVVV
177*35ffd701SAndroid Build Coastguard Worker {
178*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
179*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
180*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
181*35ffd701SAndroid Build Coastguard Worker
182*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
183*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
184*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) * 2;
185*35ffd701SAndroid Build Coastguard Worker
186*35ffd701SAndroid Build Coastguard Worker break;
187*35ffd701SAndroid Build Coastguard Worker }
188*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_BGRP:
189*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_RGBP:
190*35ffd701SAndroid Build Coastguard Worker {
191*35ffd701SAndroid Build Coastguard Worker //For RGBP linear Tile keep resource Offset non aligned and for other Tile format to be 16-bit aligned
192*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Info.Linear)
193*35ffd701SAndroid Build Coastguard Worker {
194*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
195*35ffd701SAndroid Build Coastguard Worker YHeight = pTexInfo->BaseHeight;
196*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = pTexInfo->BaseHeight;
197*35ffd701SAndroid Build Coastguard Worker
198*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
199*35ffd701SAndroid Build Coastguard Worker VHeight = pTexInfo->BaseHeight;
200*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = (GMM_GFX_SIZE_T)pTexInfo->BaseHeight * 2;
201*35ffd701SAndroid Build Coastguard Worker }
202*35ffd701SAndroid Build Coastguard Worker else // Tiled
203*35ffd701SAndroid Build Coastguard Worker {
204*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
205*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
206*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
207*35ffd701SAndroid Build Coastguard Worker
208*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
209*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
210*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = (GMM_GFX_SIZE_T)GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT) * 2;
211*35ffd701SAndroid Build Coastguard Worker }
212*35ffd701SAndroid Build Coastguard Worker break;
213*35ffd701SAndroid Build Coastguard Worker }
214*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC2:
215*35ffd701SAndroid Build Coastguard Worker SWAP_UV(); // IMC2 = IMC4 with Swapped U/V
216*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC4:
217*35ffd701SAndroid Build Coastguard Worker {
218*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
219*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
220*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
221*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
222*35ffd701SAndroid Build Coastguard Worker // UUUUVVVV
223*35ffd701SAndroid Build Coastguard Worker // UUUUVVVV
224*35ffd701SAndroid Build Coastguard Worker
225*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT((pTexInfo->Pitch & 1) == 0);
226*35ffd701SAndroid Build Coastguard Worker
227*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = 0;
228*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
229*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
230*35ffd701SAndroid Build Coastguard Worker
231*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = pTexInfo->Pitch / 2;
232*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_CEIL_DIV(YHeight, 2);
233*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = GFX_ALIGN(pTexInfo->BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
234*35ffd701SAndroid Build Coastguard Worker
235*35ffd701SAndroid Build Coastguard Worker // Not technically UV packed but sizing works out the same
236*35ffd701SAndroid Build Coastguard Worker UVPacked = true;
237*35ffd701SAndroid Build Coastguard Worker
238*35ffd701SAndroid Build Coastguard Worker break;
239*35ffd701SAndroid Build Coastguard Worker }
240*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_I420: // I420 = IYUV
241*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IYUV:
242*35ffd701SAndroid Build Coastguard Worker SWAP_UV(); // I420/IYUV = YV12 with Swapped U/V
243*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YV12:
244*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YVU9:
245*35ffd701SAndroid Build Coastguard Worker {
246*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
247*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
248*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
249*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
250*35ffd701SAndroid Build Coastguard Worker // VVVVVV.. <-- V and U planes follow the Y plane, as linear
251*35ffd701SAndroid Build Coastguard Worker // ..UUUUUU arrays--without respect to pitch.
252*35ffd701SAndroid Build Coastguard Worker
253*35ffd701SAndroid Build Coastguard Worker uint32_t YSize, YVSizeRShift, VSize, UOffset;
254*35ffd701SAndroid Build Coastguard Worker uint32_t YSizeForUVPurposes, YSizeForUVPurposesDimensionalAlignment;
255*35ffd701SAndroid Build Coastguard Worker
256*35ffd701SAndroid Build Coastguard Worker YSize = GFX_ULONG_CAST(pTexInfo->Pitch) * pTexInfo->BaseHeight;
257*35ffd701SAndroid Build Coastguard Worker
258*35ffd701SAndroid Build Coastguard Worker // YVU9 has one U/V pixel for each 4x4 Y block.
259*35ffd701SAndroid Build Coastguard Worker // The others have one U/V pixel for each 2x2 Y block.
260*35ffd701SAndroid Build Coastguard Worker
261*35ffd701SAndroid Build Coastguard Worker // YVU9 has a Y:V size ratio of 16 (4x4 --> 1).
262*35ffd701SAndroid Build Coastguard Worker // The others have a ratio of 4 (2x2 --> 1).
263*35ffd701SAndroid Build Coastguard Worker YVSizeRShift = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
264*35ffd701SAndroid Build Coastguard Worker
265*35ffd701SAndroid Build Coastguard Worker // If a Y plane isn't fully-aligned to its Y-->U/V block size, the
266*35ffd701SAndroid Build Coastguard Worker // extra/unaligned Y pixels still need corresponding U/V pixels--So
267*35ffd701SAndroid Build Coastguard Worker // for the purpose of computing the UVSize, we must consider a
268*35ffd701SAndroid Build Coastguard Worker // dimensionally "rounded-up" YSize. (E.g. a 13x5 YVU9 Y plane would
269*35ffd701SAndroid Build Coastguard Worker // require 4x2 U/V planes--the same UVSize as a fully-aligned 16x8 Y.)
270*35ffd701SAndroid Build Coastguard Worker YSizeForUVPurposesDimensionalAlignment = (pTexInfo->Format != GMM_FORMAT_YVU9) ? 2 : 4;
271*35ffd701SAndroid Build Coastguard Worker YSizeForUVPurposes =
272*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(GFX_ULONG_CAST(pTexInfo->Pitch), YSizeForUVPurposesDimensionalAlignment) *
273*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(pTexInfo->BaseHeight, YSizeForUVPurposesDimensionalAlignment);
274*35ffd701SAndroid Build Coastguard Worker
275*35ffd701SAndroid Build Coastguard Worker VSize = (YSizeForUVPurposes >> YVSizeRShift);
276*35ffd701SAndroid Build Coastguard Worker UOffset = YSize + VSize;
277*35ffd701SAndroid Build Coastguard Worker
278*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = 0;
279*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = pTexInfo->BaseHeight;
280*35ffd701SAndroid Build Coastguard Worker
281*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = UOffset % pTexInfo->Pitch;
282*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = UOffset / pTexInfo->Pitch;
283*35ffd701SAndroid Build Coastguard Worker
284*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_CEIL_DIV(YSize + 2 * VSize, WidthBytesPhysical);
285*35ffd701SAndroid Build Coastguard Worker
286*35ffd701SAndroid Build Coastguard Worker break;
287*35ffd701SAndroid Build Coastguard Worker }
288*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV12:
289*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV21:
290*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV11:
291*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
292*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
293*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
294*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P208:
295*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P216:
296*35ffd701SAndroid Build Coastguard Worker {
297*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
298*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
299*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
300*35ffd701SAndroid Build Coastguard Worker // YYYYYYYY
301*35ffd701SAndroid Build Coastguard Worker // [UV-Packing]
302*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = *pVOffsetX = 0;
303*35ffd701SAndroid Build Coastguard Worker YHeight = GFX_ALIGN(Height, __GMM_EVEN_ROW);
304*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = *pVOffsetY = YHeight;
305*35ffd701SAndroid Build Coastguard Worker
306*35ffd701SAndroid Build Coastguard Worker if((pTexInfo->Format == GMM_FORMAT_NV12) ||
307*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_NV21) ||
308*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P010) ||
309*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P012) ||
310*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Format == GMM_FORMAT_P016))
311*35ffd701SAndroid Build Coastguard Worker {
312*35ffd701SAndroid Build Coastguard Worker VHeight = GFX_CEIL_DIV(Height, 2);
313*35ffd701SAndroid Build Coastguard Worker }
314*35ffd701SAndroid Build Coastguard Worker else
315*35ffd701SAndroid Build Coastguard Worker {
316*35ffd701SAndroid Build Coastguard Worker VHeight = YHeight; // U/V plane is same as Y
317*35ffd701SAndroid Build Coastguard Worker }
318*35ffd701SAndroid Build Coastguard Worker
319*35ffd701SAndroid Build Coastguard Worker UVPacked = true;
320*35ffd701SAndroid Build Coastguard Worker break;
321*35ffd701SAndroid Build Coastguard Worker }
322*35ffd701SAndroid Build Coastguard Worker default:
323*35ffd701SAndroid Build Coastguard Worker {
324*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Unknown Video Format U\n");
325*35ffd701SAndroid Build Coastguard Worker break;
326*35ffd701SAndroid Build Coastguard Worker }
327*35ffd701SAndroid Build Coastguard Worker }
328*35ffd701SAndroid Build Coastguard Worker
329*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_Y] = YHeight;
330*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->OffsetInfo.Plane.NoOfPlanes == 2)
331*35ffd701SAndroid Build Coastguard Worker {
332*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_U] = VHeight;
333*35ffd701SAndroid Build Coastguard Worker }
334*35ffd701SAndroid Build Coastguard Worker else if(pTexInfo->OffsetInfo.Plane.NoOfPlanes == 3)
335*35ffd701SAndroid Build Coastguard Worker {
336*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_U] =
337*35ffd701SAndroid Build Coastguard Worker pTexInfo->OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_V] = VHeight;
338*35ffd701SAndroid Build Coastguard Worker }
339*35ffd701SAndroid Build Coastguard Worker
340*35ffd701SAndroid Build Coastguard Worker
341*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]) || pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
342*35ffd701SAndroid Build Coastguard Worker {
343*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T TileHeight = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileHeight;
344*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T TileWidth = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileWidth;
345*35ffd701SAndroid Build Coastguard Worker
346*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = GFX_ALIGN(*pUOffsetX, TileWidth);
347*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(*pUOffsetY, TileHeight);
348*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = GFX_ALIGN(*pVOffsetX, TileWidth);
349*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = UVPacked ?
350*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(*pVOffsetY, TileHeight) :
351*35ffd701SAndroid Build Coastguard Worker GFX_ALIGN(YHeight, TileHeight) + GFX_ALIGN(VHeight, TileHeight);
352*35ffd701SAndroid Build Coastguard Worker
353*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.UnifiedAuxSurface && pTexInfo->Flags.Gpu.__NonMsaaTileYCcs)
354*35ffd701SAndroid Build Coastguard Worker {
355*35ffd701SAndroid Build Coastguard Worker *pUOffsetY += pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_Y];
356*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = *pUOffsetY;
357*35ffd701SAndroid Build Coastguard Worker }
358*35ffd701SAndroid Build Coastguard Worker }
359*35ffd701SAndroid Build Coastguard Worker
360*35ffd701SAndroid Build Coastguard Worker //Special case LKF MMC compressed surfaces
361*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->Flags.Gpu.MMC &&
362*35ffd701SAndroid Build Coastguard Worker pTexInfo->Flags.Gpu.UnifiedAuxSurface &&
363*35ffd701SAndroid Build Coastguard Worker GMM_IS_4KB_TILE(pTexInfo->Flags))
364*35ffd701SAndroid Build Coastguard Worker {
365*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T TileHeight = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileHeight;
366*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T TileWidth = pGmmLibContext->GetPlatformInfo().TileInfo[pTexInfo->TileMode].LogicalTileWidth;
367*35ffd701SAndroid Build Coastguard Worker
368*35ffd701SAndroid Build Coastguard Worker *pUOffsetX = GFX_ALIGN(*pUOffsetX, TileWidth);
369*35ffd701SAndroid Build Coastguard Worker *pUOffsetY = GFX_ALIGN(*pUOffsetY, TileHeight);
370*35ffd701SAndroid Build Coastguard Worker *pVOffsetX = GFX_ALIGN(*pVOffsetX, TileWidth);
371*35ffd701SAndroid Build Coastguard Worker *pVOffsetY = GFX_ALIGN(*pVOffsetY, TileHeight);
372*35ffd701SAndroid Build Coastguard Worker }
373*35ffd701SAndroid Build Coastguard Worker
374*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
375*35ffd701SAndroid Build Coastguard Worker
376*35ffd701SAndroid Build Coastguard Worker #undef SWAP_UV
377*35ffd701SAndroid Build Coastguard Worker }
378*35ffd701SAndroid Build Coastguard Worker
379*35ffd701SAndroid Build Coastguard Worker
380*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
381*35ffd701SAndroid Build Coastguard Worker /// Sibling function of GmmLib::GmmTextureCalc::ExpandWidth. it returns the given
382*35ffd701SAndroid Build Coastguard Worker /// Width, as appropriately scaled by the MSAA NumSamples parameter and aligned to the
383*35ffd701SAndroid Build Coastguard Worker /// given UnitAlignment.
384*35ffd701SAndroid Build Coastguard Worker ///
385*35ffd701SAndroid Build Coastguard Worker /// @param[in] Height: Height of the surface
386*35ffd701SAndroid Build Coastguard Worker /// @param[in] UnitAlignment: Unit alignment factor
387*35ffd701SAndroid Build Coastguard Worker /// @param[in] NumSamples: No of MSAA samples
388*35ffd701SAndroid Build Coastguard Worker ///
389*35ffd701SAndroid Build Coastguard Worker /// @return scaled height
390*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
ExpandHeight(uint32_t Height,uint32_t UnitAlignment,uint32_t NumSamples)391*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmTextureCalc::ExpandHeight(uint32_t Height, uint32_t UnitAlignment, uint32_t NumSamples)
392*35ffd701SAndroid Build Coastguard Worker {
393*35ffd701SAndroid Build Coastguard Worker // Implemented as separate function (instead of as a single function with a
394*35ffd701SAndroid Build Coastguard Worker // Width/Height parameter) so both functions can be later implemented without
395*35ffd701SAndroid Build Coastguard Worker // branches, if need be.
396*35ffd701SAndroid Build Coastguard Worker
397*35ffd701SAndroid Build Coastguard Worker return (
398*35ffd701SAndroid Build Coastguard Worker GmmLib::GmmTextureCalc::ExpandWidth(
399*35ffd701SAndroid Build Coastguard Worker Height, UnitAlignment,
400*35ffd701SAndroid Build Coastguard Worker (NumSamples == 2) ? 1 : // MSAA_2X: No height adjustment
401*35ffd701SAndroid Build Coastguard Worker ((NumSamples == 8) ? 4 : NumSamples))); // <-- MSAA_8X:Height = MSAA_4X:Height.
402*35ffd701SAndroid Build Coastguard Worker }
403*35ffd701SAndroid Build Coastguard Worker
404*35ffd701SAndroid Build Coastguard Worker
405*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
406*35ffd701SAndroid Build Coastguard Worker /// This function returns the given Width, as appropriately scaled by the MSAA
407*35ffd701SAndroid Build Coastguard Worker /// NumSamples parameter and aligned to the given UnitAlignment.
408*35ffd701SAndroid Build Coastguard Worker ///
409*35ffd701SAndroid Build Coastguard Worker /// @param[in] Width: Height of the surface
410*35ffd701SAndroid Build Coastguard Worker /// @param[in] UnitAlignment: Unit alignment factor
411*35ffd701SAndroid Build Coastguard Worker /// @param[in] NumSamples: No of MSAA samples
412*35ffd701SAndroid Build Coastguard Worker ///
413*35ffd701SAndroid Build Coastguard Worker /// @return scaled width
414*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
ExpandWidth(uint32_t Width,uint32_t UnitAlignment,uint32_t NumSamples)415*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmTextureCalc::ExpandWidth(uint32_t Width, uint32_t UnitAlignment, uint32_t NumSamples)
416*35ffd701SAndroid Build Coastguard Worker {
417*35ffd701SAndroid Build Coastguard Worker uint32_t ExpandedWidth;
418*35ffd701SAndroid Build Coastguard Worker
419*35ffd701SAndroid Build Coastguard Worker switch(NumSamples)
420*35ffd701SAndroid Build Coastguard Worker {
421*35ffd701SAndroid Build Coastguard Worker case 1:
422*35ffd701SAndroid Build Coastguard Worker ExpandedWidth = Width;
423*35ffd701SAndroid Build Coastguard Worker break;
424*35ffd701SAndroid Build Coastguard Worker case 2: // Same as 4x...
425*35ffd701SAndroid Build Coastguard Worker case 4:
426*35ffd701SAndroid Build Coastguard Worker ExpandedWidth = GFX_CEIL_DIV(GFX_MAX(Width, 1), 2) * 4;
427*35ffd701SAndroid Build Coastguard Worker break;
428*35ffd701SAndroid Build Coastguard Worker case 8: // Same as 16x...
429*35ffd701SAndroid Build Coastguard Worker case 16:
430*35ffd701SAndroid Build Coastguard Worker ExpandedWidth = GFX_CEIL_DIV(GFX_MAX(Width, 1), 2) * 8;
431*35ffd701SAndroid Build Coastguard Worker break;
432*35ffd701SAndroid Build Coastguard Worker default:
433*35ffd701SAndroid Build Coastguard Worker ExpandedWidth = Width;
434*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
435*35ffd701SAndroid Build Coastguard Worker }
436*35ffd701SAndroid Build Coastguard Worker
437*35ffd701SAndroid Build Coastguard Worker ExpandedWidth = GFX_MAX(ExpandedWidth, UnitAlignment);
438*35ffd701SAndroid Build Coastguard Worker ExpandedWidth = GFX_ALIGN_NP2(ExpandedWidth, UnitAlignment);
439*35ffd701SAndroid Build Coastguard Worker
440*35ffd701SAndroid Build Coastguard Worker return (ExpandedWidth);
441*35ffd701SAndroid Build Coastguard Worker }
442*35ffd701SAndroid Build Coastguard Worker
443*35ffd701SAndroid Build Coastguard Worker
444*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
445*35ffd701SAndroid Build Coastguard Worker /// This function calculates Mip Tail Start LOD using max mip tail dimensions and
446*35ffd701SAndroid Build Coastguard Worker /// populates pTexInfo->Alignment.MipTailStartLod
447*35ffd701SAndroid Build Coastguard Worker ///
448*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ptr to ::GMM_TEXTURE_INFO
449*35ffd701SAndroid Build Coastguard Worker ///
450*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
FindMipTailStartLod(GMM_TEXTURE_INFO * pTexInfo)451*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmTextureCalc::FindMipTailStartLod(GMM_TEXTURE_INFO *pTexInfo)
452*35ffd701SAndroid Build Coastguard Worker {
453*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
454*35ffd701SAndroid Build Coastguard Worker
455*35ffd701SAndroid Build Coastguard Worker if(!(pTexInfo->Flags.Info.TiledYf || GMM_IS_64KB_TILE(pTexInfo->Flags)) ||
456*35ffd701SAndroid Build Coastguard Worker (pTexInfo->MaxLod == 0) ||
457*35ffd701SAndroid Build Coastguard Worker (pTexInfo->Flags.Wa.DisablePackedMipTail))
458*35ffd701SAndroid Build Coastguard Worker {
459*35ffd701SAndroid Build Coastguard Worker // HW never ignores MipTailStartLod for Yf/Ys surfaces. If we do not
460*35ffd701SAndroid Build Coastguard Worker // want a mip tail, we set MipTailStartLod to be greater than MaxLod.
461*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.MipTailStartLod = GMM_TILED_RESOURCE_NO_MIP_TAIL;
462*35ffd701SAndroid Build Coastguard Worker }
463*35ffd701SAndroid Build Coastguard Worker else
464*35ffd701SAndroid Build Coastguard Worker {
465*35ffd701SAndroid Build Coastguard Worker uint32_t MipDepth, MipHeight, MipWidth, CompressWidth, CompressHeight, CompressDepth;
466*35ffd701SAndroid Build Coastguard Worker uint32_t Level = 0;
467*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
468*35ffd701SAndroid Build Coastguard Worker
469*35ffd701SAndroid Build Coastguard Worker MipDepth = pTexInfo->Depth;
470*35ffd701SAndroid Build Coastguard Worker MipHeight = pTexInfo->BaseHeight;
471*35ffd701SAndroid Build Coastguard Worker MipWidth = GFX_ULONG_CAST(pTexInfo->BaseWidth);
472*35ffd701SAndroid Build Coastguard Worker
473*35ffd701SAndroid Build Coastguard Worker //if compressed texture format, use compressed height, width
474*35ffd701SAndroid Build Coastguard Worker GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
475*35ffd701SAndroid Build Coastguard Worker
476*35ffd701SAndroid Build Coastguard Worker if(GmmIsCompressed(pGmmLibContext, pTexInfo->Format))
477*35ffd701SAndroid Build Coastguard Worker {
478*35ffd701SAndroid Build Coastguard Worker MipWidth = GFX_CEIL_DIV(MipWidth, CompressWidth);
479*35ffd701SAndroid Build Coastguard Worker MipHeight = GFX_CEIL_DIV(MipHeight, CompressHeight);
480*35ffd701SAndroid Build Coastguard Worker MipDepth = GFX_CEIL_DIV(MipDepth, CompressDepth);
481*35ffd701SAndroid Build Coastguard Worker }
482*35ffd701SAndroid Build Coastguard Worker
483*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo->TileMode < GMM_TILE_MODES);
484*35ffd701SAndroid Build Coastguard Worker
485*35ffd701SAndroid Build Coastguard Worker while((Level < pTexInfo->MaxLod) &&
486*35ffd701SAndroid Build Coastguard Worker (((pTexInfo->Type == RESOURCE_1D) &&
487*35ffd701SAndroid Build Coastguard Worker !(MipWidth <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartWidth)) ||
488*35ffd701SAndroid Build Coastguard Worker (((pTexInfo->Type == RESOURCE_2D) || (pTexInfo->Type == RESOURCE_CUBE)) &&
489*35ffd701SAndroid Build Coastguard Worker !((MipWidth <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartWidth) &&
490*35ffd701SAndroid Build Coastguard Worker (MipHeight <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartHeight))) ||
491*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Type == RESOURCE_3D) &&
492*35ffd701SAndroid Build Coastguard Worker !((MipWidth <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartWidth) &&
493*35ffd701SAndroid Build Coastguard Worker (MipHeight <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartHeight) &&
494*35ffd701SAndroid Build Coastguard Worker (MipDepth <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartDepth)))))
495*35ffd701SAndroid Build Coastguard Worker {
496*35ffd701SAndroid Build Coastguard Worker Level++;
497*35ffd701SAndroid Build Coastguard Worker
498*35ffd701SAndroid Build Coastguard Worker MipWidth = GFX_ULONG_CAST(GmmTexGetMipWidth(pTexInfo, Level));
499*35ffd701SAndroid Build Coastguard Worker MipHeight = GmmTexGetMipHeight(pTexInfo, Level);
500*35ffd701SAndroid Build Coastguard Worker MipDepth = GmmTexGetMipDepth(pTexInfo, Level);
501*35ffd701SAndroid Build Coastguard Worker
502*35ffd701SAndroid Build Coastguard Worker MipWidth = GFX_CEIL_DIV(MipWidth, CompressWidth);
503*35ffd701SAndroid Build Coastguard Worker MipHeight = GFX_CEIL_DIV(MipHeight, CompressHeight);
504*35ffd701SAndroid Build Coastguard Worker MipDepth = GFX_CEIL_DIV(MipDepth, CompressDepth);
505*35ffd701SAndroid Build Coastguard Worker }
506*35ffd701SAndroid Build Coastguard Worker
507*35ffd701SAndroid Build Coastguard Worker if(((pTexInfo->Type == RESOURCE_1D) &&
508*35ffd701SAndroid Build Coastguard Worker (MipWidth <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartWidth)) ||
509*35ffd701SAndroid Build Coastguard Worker (((pTexInfo->Type == RESOURCE_2D) || (pTexInfo->Type == RESOURCE_CUBE)) &&
510*35ffd701SAndroid Build Coastguard Worker ((MipWidth <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartWidth) &&
511*35ffd701SAndroid Build Coastguard Worker (MipHeight <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartHeight))) ||
512*35ffd701SAndroid Build Coastguard Worker ((pTexInfo->Type == RESOURCE_3D) &&
513*35ffd701SAndroid Build Coastguard Worker ((MipWidth <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartWidth) &&
514*35ffd701SAndroid Build Coastguard Worker (MipHeight <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartHeight) &&
515*35ffd701SAndroid Build Coastguard Worker (MipDepth <= pPlatform->TileInfo[pTexInfo->TileMode].MaxMipTailStartDepth))))
516*35ffd701SAndroid Build Coastguard Worker {
517*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.MipTailStartLod = Level;
518*35ffd701SAndroid Build Coastguard Worker }
519*35ffd701SAndroid Build Coastguard Worker else
520*35ffd701SAndroid Build Coastguard Worker {
521*35ffd701SAndroid Build Coastguard Worker pTexInfo->Alignment.MipTailStartLod = GMM_TILED_RESOURCE_NO_MIP_TAIL;
522*35ffd701SAndroid Build Coastguard Worker }
523*35ffd701SAndroid Build Coastguard Worker }
524*35ffd701SAndroid Build Coastguard Worker
525*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
526*35ffd701SAndroid Build Coastguard Worker }
527*35ffd701SAndroid Build Coastguard Worker
528*35ffd701SAndroid Build Coastguard Worker
529*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
530*35ffd701SAndroid Build Coastguard Worker /// This function returns the height, width and depth of the compression block for a
531*35ffd701SAndroid Build Coastguard Worker /// given surface format.
532*35ffd701SAndroid Build Coastguard Worker ///
533*35ffd701SAndroid Build Coastguard Worker /// @param[in] Format: ::GMM_RESOURCE_FORMAT
534*35ffd701SAndroid Build Coastguard Worker /// @param[in] pWidth: populates Width
535*35ffd701SAndroid Build Coastguard Worker /// @param[in] pHeight: populates Height
536*35ffd701SAndroid Build Coastguard Worker /// @param[in] pDepth: populates Depth
537*35ffd701SAndroid Build Coastguard Worker ///
538*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetCompressionBlockDimensions(GMM_RESOURCE_FORMAT Format,uint32_t * pWidth,uint32_t * pHeight,uint32_t * pDepth)539*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmTextureCalc::GetCompressionBlockDimensions(GMM_RESOURCE_FORMAT Format,
540*35ffd701SAndroid Build Coastguard Worker uint32_t * pWidth,
541*35ffd701SAndroid Build Coastguard Worker uint32_t * pHeight,
542*35ffd701SAndroid Build Coastguard Worker uint32_t * pDepth)
543*35ffd701SAndroid Build Coastguard Worker {
544*35ffd701SAndroid Build Coastguard Worker
545*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
546*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pWidth && pHeight && pDepth);
547*35ffd701SAndroid Build Coastguard Worker
548*35ffd701SAndroid Build Coastguard Worker if(pWidth && pHeight && pDepth)
549*35ffd701SAndroid Build Coastguard Worker {
550*35ffd701SAndroid Build Coastguard Worker if((Format > GMM_FORMAT_INVALID) && (Format < GMM_RESOURCE_FORMATS))
551*35ffd701SAndroid Build Coastguard Worker {
552*35ffd701SAndroid Build Coastguard Worker *pWidth = pGmmLibContext->GetPlatformInfo().FormatTable[Format].Element.Width;
553*35ffd701SAndroid Build Coastguard Worker *pHeight = pGmmLibContext->GetPlatformInfo().FormatTable[Format].Element.Height;
554*35ffd701SAndroid Build Coastguard Worker *pDepth = pGmmLibContext->GetPlatformInfo().FormatTable[Format].Element.Depth;
555*35ffd701SAndroid Build Coastguard Worker }
556*35ffd701SAndroid Build Coastguard Worker else
557*35ffd701SAndroid Build Coastguard Worker {
558*35ffd701SAndroid Build Coastguard Worker *pWidth = 1;
559*35ffd701SAndroid Build Coastguard Worker *pHeight = 1;
560*35ffd701SAndroid Build Coastguard Worker *pDepth = 1;
561*35ffd701SAndroid Build Coastguard Worker }
562*35ffd701SAndroid Build Coastguard Worker }
563*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
564*35ffd701SAndroid Build Coastguard Worker }
565*35ffd701SAndroid Build Coastguard Worker
566*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
567*35ffd701SAndroid Build Coastguard Worker /// This function Convert from d3d tile (64KB) to h/w tile
568*35ffd701SAndroid Build Coastguard Worker ///
569*35ffd701SAndroid Build Coastguard Worker /// @param[in] pTexInfo: ::GMM_TEXTURE_INFO
570*35ffd701SAndroid Build Coastguard Worker /// @param[in/out] pColFactor: populates Width
571*35ffd701SAndroid Build Coastguard Worker /// @param[in/out] pRowFactor: populates Height
572*35ffd701SAndroid Build Coastguard Worker /// @param[out] true on Success else false
573*35ffd701SAndroid Build Coastguard Worker ///
574*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmGetD3DToHwTileConversion(GMM_TEXTURE_INFO * pTexInfo,uint32_t * pColFactor,uint32_t * pRowFactor)575*35ffd701SAndroid Build Coastguard Worker bool GmmLib::GmmTextureCalc::GmmGetD3DToHwTileConversion(GMM_TEXTURE_INFO *pTexInfo,
576*35ffd701SAndroid Build Coastguard Worker uint32_t * pColFactor,
577*35ffd701SAndroid Build Coastguard Worker uint32_t * pRowFactor)
578*35ffd701SAndroid Build Coastguard Worker {
579*35ffd701SAndroid Build Coastguard Worker uint32_t i = 0;
580*35ffd701SAndroid Build Coastguard Worker uint32_t Bpp = pTexInfo->BitsPerPixel;
581*35ffd701SAndroid Build Coastguard Worker
582*35ffd701SAndroid Build Coastguard Worker // check for unsupported bpp
583*35ffd701SAndroid Build Coastguard Worker if(!(Bpp == 8 || Bpp == 16 || Bpp == 32 || Bpp == 64 || Bpp == 128))
584*35ffd701SAndroid Build Coastguard Worker {
585*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(false);
586*35ffd701SAndroid Build Coastguard Worker goto EXIT_ERROR;
587*35ffd701SAndroid Build Coastguard Worker }
588*35ffd701SAndroid Build Coastguard Worker
589*35ffd701SAndroid Build Coastguard Worker // for TileYS, no conversion
590*35ffd701SAndroid Build Coastguard Worker if(GMM_IS_64KB_TILE(pTexInfo->Flags) || pTexInfo->Flags.Info.Linear)
591*35ffd701SAndroid Build Coastguard Worker {
592*35ffd701SAndroid Build Coastguard Worker *pColFactor = 1;
593*35ffd701SAndroid Build Coastguard Worker *pRowFactor = 1;
594*35ffd701SAndroid Build Coastguard Worker }
595*35ffd701SAndroid Build Coastguard Worker else if(GMM_IS_4KB_TILE(pTexInfo->Flags))
596*35ffd701SAndroid Build Coastguard Worker {
597*35ffd701SAndroid Build Coastguard Worker // Logic for non-MSAA
598*35ffd701SAndroid Build Coastguard Worker {
599*35ffd701SAndroid Build Coastguard Worker // Bpp = 8 => i = 0 , Bpp = 16 => i = 1, ...
600*35ffd701SAndroid Build Coastguard Worker // Log2(Bpp = 8) = 3 => i = Log2(8) - 3.
601*35ffd701SAndroid Build Coastguard Worker
602*35ffd701SAndroid Build Coastguard Worker i = __GmmLog2(Bpp) - 3;
603*35ffd701SAndroid Build Coastguard Worker *pColFactor = __GmmTileYConversionTable[i][0];
604*35ffd701SAndroid Build Coastguard Worker *pRowFactor = __GmmTileYConversionTable[i][1];
605*35ffd701SAndroid Build Coastguard Worker }
606*35ffd701SAndroid Build Coastguard Worker
607*35ffd701SAndroid Build Coastguard Worker // Logic for MSAA
608*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->MSAA.NumSamples > 1)
609*35ffd701SAndroid Build Coastguard Worker {
610*35ffd701SAndroid Build Coastguard Worker
611*35ffd701SAndroid Build Coastguard Worker // For MSAA, the DirectX tile dimensions change, using the table __GmmMSAAConversion.
612*35ffd701SAndroid Build Coastguard Worker uint32_t W = __GmmMSAAConversion[__GmmLog2(pTexInfo->MSAA.NumSamples)][0];
613*35ffd701SAndroid Build Coastguard Worker uint32_t H = __GmmMSAAConversion[__GmmLog2(pTexInfo->MSAA.NumSamples)][1];
614*35ffd701SAndroid Build Coastguard Worker
615*35ffd701SAndroid Build Coastguard Worker // For the new DirectX tile dimensions the new Col and Row conversion factors are:
616*35ffd701SAndroid Build Coastguard Worker *pColFactor /= W;
617*35ffd701SAndroid Build Coastguard Worker *pRowFactor /= H;
618*35ffd701SAndroid Build Coastguard Worker }
619*35ffd701SAndroid Build Coastguard Worker }
620*35ffd701SAndroid Build Coastguard Worker else
621*35ffd701SAndroid Build Coastguard Worker {
622*35ffd701SAndroid Build Coastguard Worker // unsupported format.
623*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(false);
624*35ffd701SAndroid Build Coastguard Worker goto EXIT_ERROR;
625*35ffd701SAndroid Build Coastguard Worker }
626*35ffd701SAndroid Build Coastguard Worker
627*35ffd701SAndroid Build Coastguard Worker return true;
628*35ffd701SAndroid Build Coastguard Worker
629*35ffd701SAndroid Build Coastguard Worker EXIT_ERROR:
630*35ffd701SAndroid Build Coastguard Worker *pColFactor = 0;
631*35ffd701SAndroid Build Coastguard Worker *pRowFactor = 0;
632*35ffd701SAndroid Build Coastguard Worker return false;
633*35ffd701SAndroid Build Coastguard Worker }
634*35ffd701SAndroid Build Coastguard Worker
635*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
636*35ffd701SAndroid Build Coastguard Worker /// This function redescribes WidthBytesPhysical of main surface as per UV plane bpp and tilemode
637*35ffd701SAndroid Build Coastguard Worker ///
638*35ffd701SAndroid Build Coastguard Worker /// @return ::bool
639*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
RedescribeTexturePlanes(GMM_TEXTURE_INFO * pTexInfo,uint32_t * pWidthBytesPhysical)640*35ffd701SAndroid Build Coastguard Worker bool GmmLib::GmmTextureCalc::RedescribeTexturePlanes(GMM_TEXTURE_INFO *pTexInfo, uint32_t *pWidthBytesPhysical)
641*35ffd701SAndroid Build Coastguard Worker {
642*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status = GMM_SUCCESS;
643*35ffd701SAndroid Build Coastguard Worker GMM_TEXTURE_INFO TexInfoUVPlane;
644*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
645*35ffd701SAndroid Build Coastguard Worker
646*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo);
647*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo->Flags.Info.RedecribedPlanes);
648*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pWidthBytesPhysical);
649*35ffd701SAndroid Build Coastguard Worker
650*35ffd701SAndroid Build Coastguard Worker TexInfoUVPlane = *pTexInfo;
651*35ffd701SAndroid Build Coastguard Worker #ifdef _WIN32
652*35ffd701SAndroid Build Coastguard Worker memcpy_s(&TexInfoUVPlane, sizeof(GMM_TEXTURE_INFO), pTexInfo, sizeof(GMM_TEXTURE_INFO));
653*35ffd701SAndroid Build Coastguard Worker #else
654*35ffd701SAndroid Build Coastguard Worker memcpy(&TexInfoUVPlane, pTexInfo, sizeof(GMM_TEXTURE_INFO));
655*35ffd701SAndroid Build Coastguard Worker #endif // _WIN32
656*35ffd701SAndroid Build Coastguard Worker
657*35ffd701SAndroid Build Coastguard Worker
658*35ffd701SAndroid Build Coastguard Worker if(GmmIsUVPacked(pTexInfo->Format))
659*35ffd701SAndroid Build Coastguard Worker {
660*35ffd701SAndroid Build Coastguard Worker // UV packed resources must have two seperate
661*35ffd701SAndroid Build Coastguard Worker // tiling modes per plane, due to the packed
662*35ffd701SAndroid Build Coastguard Worker // UV plane having twice the bits per pixel
663*35ffd701SAndroid Build Coastguard Worker // as the Y plane.
664*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->Format)
665*35ffd701SAndroid Build Coastguard Worker {
666*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV12:
667*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV21:
668*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P208:
669*35ffd701SAndroid Build Coastguard Worker TexInfoUVPlane.BitsPerPixel = 16; // Redescribe bpp to 16 from 8
670*35ffd701SAndroid Build Coastguard Worker break;
671*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
672*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
673*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
674*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P216:
675*35ffd701SAndroid Build Coastguard Worker TexInfoUVPlane.BitsPerPixel = 32;
676*35ffd701SAndroid Build Coastguard Worker break;
677*35ffd701SAndroid Build Coastguard Worker default:
678*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Unsupported format/pixel size combo!");
679*35ffd701SAndroid Build Coastguard Worker Status = GMM_INVALIDPARAM;
680*35ffd701SAndroid Build Coastguard Worker goto ERROR_CASE;
681*35ffd701SAndroid Build Coastguard Worker break;
682*35ffd701SAndroid Build Coastguard Worker }
683*35ffd701SAndroid Build Coastguard Worker }
684*35ffd701SAndroid Build Coastguard Worker else
685*35ffd701SAndroid Build Coastguard Worker {
686*35ffd701SAndroid Build Coastguard Worker // Non-UV packed surfaces, TileMode and bpp of each plane is same as that of pTexInfo
687*35ffd701SAndroid Build Coastguard Worker }
688*35ffd701SAndroid Build Coastguard Worker
689*35ffd701SAndroid Build Coastguard Worker SetTileMode(&TexInfoUVPlane);
690*35ffd701SAndroid Build Coastguard Worker *pWidthBytesPhysical = GFX_ALIGN(*pWidthBytesPhysical, pPlatform->TileInfo[TexInfoUVPlane.TileMode].LogicalTileWidth);
691*35ffd701SAndroid Build Coastguard Worker
692*35ffd701SAndroid Build Coastguard Worker ERROR_CASE:
693*35ffd701SAndroid Build Coastguard Worker return (Status == GMM_SUCCESS) ? true : false;
694*35ffd701SAndroid Build Coastguard Worker }
695*35ffd701SAndroid Build Coastguard Worker
696*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
697*35ffd701SAndroid Build Coastguard Worker /// This function returns per plane redescribed parameters (pRedescribedTexInfo: fmt, tilemode,bpp, width, height, size) when main surface pTexInfo is passed
698*35ffd701SAndroid Build Coastguard Worker ///
699*35ffd701SAndroid Build Coastguard Worker /// @return ::bool
700*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetRedescribedPlaneParams(GMM_TEXTURE_INFO * pTexInfo,GMM_YUV_PLANE PlaneType,GMM_TEXTURE_INFO * pRedescribedTexInfo)701*35ffd701SAndroid Build Coastguard Worker bool GmmLib::GmmTextureCalc::GetRedescribedPlaneParams(GMM_TEXTURE_INFO *pTexInfo, GMM_YUV_PLANE PlaneType, GMM_TEXTURE_INFO *pRedescribedTexInfo)
702*35ffd701SAndroid Build Coastguard Worker {
703*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status = GMM_SUCCESS;
704*35ffd701SAndroid Build Coastguard Worker GMM_TEXTURE_INFO TexInfoUVPlane;
705*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
706*35ffd701SAndroid Build Coastguard Worker
707*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo);
708*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pTexInfo->Flags.Info.RedecribedPlanes);
709*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pRedescribedTexInfo);
710*35ffd701SAndroid Build Coastguard Worker
711*35ffd701SAndroid Build Coastguard Worker *pRedescribedTexInfo = *pTexInfo;
712*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->Flags.Info.RedecribedPlanes = 0;
713*35ffd701SAndroid Build Coastguard Worker #ifdef _WIN32
714*35ffd701SAndroid Build Coastguard Worker memcpy_s(&TexInfoUVPlane, sizeof(GMM_TEXTURE_INFO), pTexInfo, sizeof(GMM_TEXTURE_INFO));
715*35ffd701SAndroid Build Coastguard Worker #else
716*35ffd701SAndroid Build Coastguard Worker memcpy(&TexInfoUVPlane, pTexInfo, sizeof(GMM_TEXTURE_INFO));
717*35ffd701SAndroid Build Coastguard Worker #endif // _WIN32
718*35ffd701SAndroid Build Coastguard Worker
719*35ffd701SAndroid Build Coastguard Worker if(GmmIsUVPacked(pTexInfo->Format))
720*35ffd701SAndroid Build Coastguard Worker {
721*35ffd701SAndroid Build Coastguard Worker // UV packed resources must have two seperate
722*35ffd701SAndroid Build Coastguard Worker // tiling modes per plane, due to the packed
723*35ffd701SAndroid Build Coastguard Worker // UV plane having twice the bits per pixel
724*35ffd701SAndroid Build Coastguard Worker // as the Y plane.
725*35ffd701SAndroid Build Coastguard Worker if((PlaneType == GMM_PLANE_U) || (PlaneType == GMM_PLANE_V))
726*35ffd701SAndroid Build Coastguard Worker {
727*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->Format)
728*35ffd701SAndroid Build Coastguard Worker {
729*35ffd701SAndroid Build Coastguard Worker // GMM_FORMAT_NV11 : linear format, no tiling supported, hence no redescription supported
730*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV12:
731*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV21:
732*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BitsPerPixel = 16;
733*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseWidth = GFX_CEIL_DIV(pTexInfo->BaseWidth, 2);
734*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseHeight = GFX_CEIL_DIV(pTexInfo->BaseHeight, 2);
735*35ffd701SAndroid Build Coastguard Worker break;
736*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P208:
737*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BitsPerPixel = 16;
738*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseWidth = GFX_CEIL_DIV(pTexInfo->BaseWidth, 2);
739*35ffd701SAndroid Build Coastguard Worker // same base height as main surface
740*35ffd701SAndroid Build Coastguard Worker break;
741*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
742*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
743*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
744*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BitsPerPixel = 32;
745*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseWidth = GFX_CEIL_DIV(pTexInfo->BaseWidth, 2);
746*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseHeight = GFX_CEIL_DIV(pTexInfo->BaseHeight, 2);
747*35ffd701SAndroid Build Coastguard Worker break;
748*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P216:
749*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BitsPerPixel = 32;
750*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseWidth = GFX_CEIL_DIV(pTexInfo->BaseWidth, 2);
751*35ffd701SAndroid Build Coastguard Worker // same base height as main surface
752*35ffd701SAndroid Build Coastguard Worker break;
753*35ffd701SAndroid Build Coastguard Worker default:
754*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Unsupported format/pixel size combo!");
755*35ffd701SAndroid Build Coastguard Worker Status = GMM_INVALIDPARAM;
756*35ffd701SAndroid Build Coastguard Worker goto ERROR_CASE;
757*35ffd701SAndroid Build Coastguard Worker break;
758*35ffd701SAndroid Build Coastguard Worker }
759*35ffd701SAndroid Build Coastguard Worker }
760*35ffd701SAndroid Build Coastguard Worker }
761*35ffd701SAndroid Build Coastguard Worker else
762*35ffd701SAndroid Build Coastguard Worker {
763*35ffd701SAndroid Build Coastguard Worker // Non-UV packed surfaces TileMode of each plane is same as that of pTexInfo
764*35ffd701SAndroid Build Coastguard Worker if((PlaneType == GMM_PLANE_U) || (PlaneType == GMM_PLANE_V))
765*35ffd701SAndroid Build Coastguard Worker { // Non-UV packed surfaces only require the plane descriptors have proper height and width for each plane
766*35ffd701SAndroid Build Coastguard Worker switch(pTexInfo->Format)
767*35ffd701SAndroid Build Coastguard Worker {
768*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC1:
769*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC2:
770*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC3:
771*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC4:
772*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV420:
773*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseWidth = GFX_CEIL_DIV(pTexInfo->BaseWidth, 2);
774*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseHeight = GFX_CEIL_DIV(pTexInfo->BaseHeight, 2);
775*35ffd701SAndroid Build Coastguard Worker break;
776*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422V:
777*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseHeight = GFX_CEIL_DIV(pTexInfo->BaseHeight, 2);
778*35ffd701SAndroid Build Coastguard Worker break;
779*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411R_TYPE:
780*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseHeight = GFX_CEIL_DIV(pTexInfo->BaseHeight, 4);
781*35ffd701SAndroid Build Coastguard Worker break;
782*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411:
783*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseWidth = GFX_CEIL_DIV(pTexInfo->BaseWidth, 4);
784*35ffd701SAndroid Build Coastguard Worker break;
785*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422H:
786*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->BaseWidth = GFX_CEIL_DIV(pTexInfo->BaseWidth, 2);
787*35ffd701SAndroid Build Coastguard Worker break;
788*35ffd701SAndroid Build Coastguard Worker default:
789*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Unsupported format/pixel size combo!");
790*35ffd701SAndroid Build Coastguard Worker Status = GMM_INVALIDPARAM;
791*35ffd701SAndroid Build Coastguard Worker goto ERROR_CASE;
792*35ffd701SAndroid Build Coastguard Worker break;
793*35ffd701SAndroid Build Coastguard Worker }
794*35ffd701SAndroid Build Coastguard Worker }
795*35ffd701SAndroid Build Coastguard Worker }
796*35ffd701SAndroid Build Coastguard Worker
797*35ffd701SAndroid Build Coastguard Worker SetTileMode(pRedescribedTexInfo);
798*35ffd701SAndroid Build Coastguard Worker switch(pRedescribedTexInfo->BitsPerPixel)
799*35ffd701SAndroid Build Coastguard Worker {
800*35ffd701SAndroid Build Coastguard Worker case 8:
801*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->Format = GMM_FORMAT_R8_UINT;
802*35ffd701SAndroid Build Coastguard Worker break;
803*35ffd701SAndroid Build Coastguard Worker case 16:
804*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->Format = GMM_FORMAT_R16_UINT;
805*35ffd701SAndroid Build Coastguard Worker break;
806*35ffd701SAndroid Build Coastguard Worker case 32:
807*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->Format = GMM_FORMAT_R32_UINT;
808*35ffd701SAndroid Build Coastguard Worker break;
809*35ffd701SAndroid Build Coastguard Worker default:
810*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Unsupported format/pixel size combo!");
811*35ffd701SAndroid Build Coastguard Worker Status = GMM_INVALIDPARAM;
812*35ffd701SAndroid Build Coastguard Worker goto ERROR_CASE;
813*35ffd701SAndroid Build Coastguard Worker break;
814*35ffd701SAndroid Build Coastguard Worker }
815*35ffd701SAndroid Build Coastguard Worker if(pTexInfo->ArraySize > 1)
816*35ffd701SAndroid Build Coastguard Worker {
817*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->OffsetInfo.Plane.ArrayQPitch = 0; // no longer a planar format on redescription
818*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->Alignment.QPitch = GFX_ALIGN(pRedescribedTexInfo->BaseHeight, pTexInfo->Alignment.VAlign);
819*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchRender =
820*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchLock = pRedescribedTexInfo->Alignment.QPitch * pTexInfo->Pitch;
821*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->Size = pRedescribedTexInfo->Alignment.QPitch * pTexInfo->Pitch * pTexInfo->ArraySize;
822*35ffd701SAndroid Build Coastguard Worker }
823*35ffd701SAndroid Build Coastguard Worker else
824*35ffd701SAndroid Build Coastguard Worker {
825*35ffd701SAndroid Build Coastguard Worker pRedescribedTexInfo->Size = (GFX_ALIGN(pRedescribedTexInfo->BaseHeight, pTexInfo->Alignment.VAlign)) * pTexInfo->Pitch;
826*35ffd701SAndroid Build Coastguard Worker }
827*35ffd701SAndroid Build Coastguard Worker
828*35ffd701SAndroid Build Coastguard Worker ERROR_CASE:
829*35ffd701SAndroid Build Coastguard Worker return (Status == GMM_SUCCESS) ? true : false;
830*35ffd701SAndroid Build Coastguard Worker }
831