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 #ifdef _WIN32
25*35ffd701SAndroid Build Coastguard Worker #include <intrin.h>
26*35ffd701SAndroid Build Coastguard Worker #endif
27*35ffd701SAndroid Build Coastguard Worker
28*35ffd701SAndroid Build Coastguard Worker //64KB Undefined Swizzle Descriptors #########################################
29*35ffd701SAndroid Build Coastguard Worker // !! TODO (critical): Provide mapping helper function to UMD to map in non-TR
30*35ffd701SAndroid Build Coastguard Worker // Undefined64KBSwizzle resources. Also check if support
31*35ffd701SAndroid Build Coastguard Worker // for it is needed in GmmResCpuBlt.
32*35ffd701SAndroid Build Coastguard Worker //
33*35ffd701SAndroid Build Coastguard Worker // Note: These 64KB swizzles are not really hardware tile swizzles, so leave
34*35ffd701SAndroid Build Coastguard Worker // them out of the CpuSwizzleBlt.c
35*35ffd701SAndroid Build Coastguard Worker
36*35ffd701SAndroid Build Coastguard Worker /* On systems that do not support Std Swizzle (IGFX_GEN7_5_CORE / IGFX_GEN8_CORE),
37*35ffd701SAndroid Build Coastguard Worker we still have to support 64KB tiles. These 64KB tiles will be made of 16 4KB
38*35ffd701SAndroid Build Coastguard Worker tiles -- we'll be using TileY to create these 64KB tiles. The table below shows
39*35ffd701SAndroid Build Coastguard Worker how the 64KB tile shape changes depending on the bpp and how we need to arrange
40*35ffd701SAndroid Build Coastguard Worker (in columns X rows) the 4KB tiles to fit that shape.
41*35ffd701SAndroid Build Coastguard Worker
42*35ffd701SAndroid Build Coastguard Worker bpp Tile Size (in pixels) Tile Size (in bytes) 4K tile config
43*35ffd701SAndroid Build Coastguard Worker --- -------------------- -------------------- --------------
44*35ffd701SAndroid Build Coastguard Worker 8bpp 256x256 256x256 2x8
45*35ffd701SAndroid Build Coastguard Worker 16bpp 256x128 512x128 4x4
46*35ffd701SAndroid Build Coastguard Worker 32bpp 128x128 512x128 4x4
47*35ffd701SAndroid Build Coastguard Worker 64bpp 128x64 1024x64 8x2
48*35ffd701SAndroid Build Coastguard Worker 128bpp 64x64 1024x64 8x2
49*35ffd701SAndroid Build Coastguard Worker
50*35ffd701SAndroid Build Coastguard Worker We need 3 different swizzle pattern to support all configs above. The swizzle
51*35ffd701SAndroid Build Coastguard Worker patterns are:
52*35ffd701SAndroid Build Coastguard Worker
53*35ffd701SAndroid Build Coastguard Worker |-Rows-| |-Column-| |-TileY Swizzle-|
54*35ffd701SAndroid Build Coastguard Worker 8bpp: YYY X XXXYYYYYXXXX
55*35ffd701SAndroid Build Coastguard Worker 16/32bpp: YY XX XXXYYYYYXXXX
56*35ffd701SAndroid Build Coastguard Worker 64/128bpp: Y XXX XXXYYYYYXXXX
57*35ffd701SAndroid Build Coastguard Worker
58*35ffd701SAndroid Build Coastguard Worker The translation of these Xs and Ys to bitmap is shown below */
59*35ffd701SAndroid Build Coastguard Worker extern const SWIZZLE_DESCRIPTOR INTEL_64KB_UNDEFINED_8bpp = {0x1E0F, 0xE1F0, 0};
60*35ffd701SAndroid Build Coastguard Worker extern const SWIZZLE_DESCRIPTOR INTEL_64KB_UNDEFINED_16_32bpp = {0x3E0F, 0xC1F0, 0};
61*35ffd701SAndroid Build Coastguard Worker extern const SWIZZLE_DESCRIPTOR INTEL_64KB_UNDEFINED_64_128bpp = {0x7E0F, 0x81F0, 0};
62*35ffd701SAndroid Build Coastguard Worker //#############################################################################
63*35ffd701SAndroid Build Coastguard Worker
64*35ffd701SAndroid Build Coastguard Worker //=============================================================================
65*35ffd701SAndroid Build Coastguard Worker // Function:
66*35ffd701SAndroid Build Coastguard Worker // GmmIsRedecribedPlanes
67*35ffd701SAndroid Build Coastguard Worker //
68*35ffd701SAndroid Build Coastguard Worker // Description:
69*35ffd701SAndroid Build Coastguard Worker // Checks if the resource has redescribed planes
70*35ffd701SAndroid Build Coastguard Worker //
71*35ffd701SAndroid Build Coastguard Worker // Arguments: <Look at Function Header)
72*35ffd701SAndroid Build Coastguard Worker //
73*35ffd701SAndroid Build Coastguard Worker // Return:
74*35ffd701SAndroid Build Coastguard Worker // 1 or 0
75*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmIsRedecribedPlanes(GMM_RESOURCE_INFO * pGmmResource)76*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmIsRedecribedPlanes(GMM_RESOURCE_INFO *pGmmResource)
77*35ffd701SAndroid Build Coastguard Worker {
78*35ffd701SAndroid Build Coastguard Worker return pGmmResource->GetResFlags().Info.RedecribedPlanes;
79*35ffd701SAndroid Build Coastguard Worker }
80*35ffd701SAndroid Build Coastguard Worker
81*35ffd701SAndroid Build Coastguard Worker //=============================================================================
82*35ffd701SAndroid Build Coastguard Worker // Function:
83*35ffd701SAndroid Build Coastguard Worker // GmmGetLosslessCompressionType
84*35ffd701SAndroid Build Coastguard Worker //
85*35ffd701SAndroid Build Coastguard Worker // Description:
86*35ffd701SAndroid Build Coastguard Worker // Returns the format's E2E compression format.
87*35ffd701SAndroid Build Coastguard Worker //
88*35ffd701SAndroid Build Coastguard Worker // Arguments: <Look at Function Header)
89*35ffd701SAndroid Build Coastguard Worker //
90*35ffd701SAndroid Build Coastguard Worker // Return:
91*35ffd701SAndroid Build Coastguard Worker // GMM_E2ECOMP_FORMAT
92*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmGetLosslessCompressionType(void * pLibContext,GMM_RESOURCE_FORMAT Format)93*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmGetLosslessCompressionType(void *pLibContext, GMM_RESOURCE_FORMAT Format)
94*35ffd701SAndroid Build Coastguard Worker {
95*35ffd701SAndroid Build Coastguard Worker GMM_LIB_CONTEXT *pGmmLibContext = (GMM_LIB_CONTEXT *)pLibContext;
96*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT((Format > GMM_FORMAT_INVALID) && (Format < GMM_RESOURCE_FORMATS));
97*35ffd701SAndroid Build Coastguard Worker
98*35ffd701SAndroid Build Coastguard Worker return pGmmLibContext->GetPlatformInfo().FormatTable[Format].CompressionFormat.AuxL1eFormat;
99*35ffd701SAndroid Build Coastguard Worker }
100*35ffd701SAndroid Build Coastguard Worker
101*35ffd701SAndroid Build Coastguard Worker //=============================================================================
102*35ffd701SAndroid Build Coastguard Worker // Function:
103*35ffd701SAndroid Build Coastguard Worker // GmmIsUVPacked
104*35ffd701SAndroid Build Coastguard Worker //
105*35ffd701SAndroid Build Coastguard Worker // Description:
106*35ffd701SAndroid Build Coastguard Worker // Checks if format has packed UV plane
107*35ffd701SAndroid Build Coastguard Worker //
108*35ffd701SAndroid Build Coastguard Worker // Arguments: <Look at Function Header)
109*35ffd701SAndroid Build Coastguard Worker //
110*35ffd701SAndroid Build Coastguard Worker // Return:
111*35ffd701SAndroid Build Coastguard Worker // 1 or 0
112*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmIsUVPacked(GMM_RESOURCE_FORMAT Format)113*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmIsUVPacked(GMM_RESOURCE_FORMAT Format)
114*35ffd701SAndroid Build Coastguard Worker {
115*35ffd701SAndroid Build Coastguard Worker uint8_t Status = 0;
116*35ffd701SAndroid Build Coastguard Worker
117*35ffd701SAndroid Build Coastguard Worker switch(Format)
118*35ffd701SAndroid Build Coastguard Worker {
119*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV11:
120*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV12:
121*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV21:
122*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
123*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
124*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
125*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P208:
126*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P216:
127*35ffd701SAndroid Build Coastguard Worker Status = 1;
128*35ffd701SAndroid Build Coastguard Worker break;
129*35ffd701SAndroid Build Coastguard Worker default:
130*35ffd701SAndroid Build Coastguard Worker Status = 0;
131*35ffd701SAndroid Build Coastguard Worker break;
132*35ffd701SAndroid Build Coastguard Worker }
133*35ffd701SAndroid Build Coastguard Worker return Status;
134*35ffd701SAndroid Build Coastguard Worker }
135*35ffd701SAndroid Build Coastguard Worker
136*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
137*35ffd701SAndroid Build Coastguard Worker /// Checks if format can be accessed by LCU
138*35ffd701SAndroid Build Coastguard Worker ///
139*35ffd701SAndroid Build Coastguard Worker /// @param[in] pSurf: ptr to ::GMM_TEXTURE_INFO of main surface
140*35ffd701SAndroid Build Coastguard Worker /// @param[in] pAuxTexInfo: ptr to ::GMM_TEXTURE_INFO of Aux surface
141*35ffd701SAndroid Build Coastguard Worker ///
142*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmIsYUVFormatLCUAligned(GMM_RESOURCE_FORMAT Format)143*35ffd701SAndroid Build Coastguard Worker bool GMM_STDCALL GmmIsYUVFormatLCUAligned(GMM_RESOURCE_FORMAT Format)
144*35ffd701SAndroid Build Coastguard Worker {
145*35ffd701SAndroid Build Coastguard Worker bool Status = 0;
146*35ffd701SAndroid Build Coastguard Worker
147*35ffd701SAndroid Build Coastguard Worker switch(Format)
148*35ffd701SAndroid Build Coastguard Worker {
149*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV12:
150*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
151*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
152*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YUY2:
153*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y210:
154*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y410:
155*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y216:
156*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y416:
157*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_AYUV:
158*35ffd701SAndroid Build Coastguard Worker Status = true;
159*35ffd701SAndroid Build Coastguard Worker break;
160*35ffd701SAndroid Build Coastguard Worker default:
161*35ffd701SAndroid Build Coastguard Worker Status = false;
162*35ffd701SAndroid Build Coastguard Worker break;
163*35ffd701SAndroid Build Coastguard Worker }
164*35ffd701SAndroid Build Coastguard Worker return Status;
165*35ffd701SAndroid Build Coastguard Worker }
166*35ffd701SAndroid Build Coastguard Worker
167*35ffd701SAndroid Build Coastguard Worker //=============================================================================
168*35ffd701SAndroid Build Coastguard Worker // Function:
169*35ffd701SAndroid Build Coastguard Worker // GmmIsYUVPacked
170*35ffd701SAndroid Build Coastguard Worker //
171*35ffd701SAndroid Build Coastguard Worker // Description:
172*35ffd701SAndroid Build Coastguard Worker // Checks if format is a YCRCB_xxx format supported by the sampler.
173*35ffd701SAndroid Build Coastguard Worker //
174*35ffd701SAndroid Build Coastguard Worker // Arguments: <Look at Function Header)
175*35ffd701SAndroid Build Coastguard Worker //
176*35ffd701SAndroid Build Coastguard Worker // Return:
177*35ffd701SAndroid Build Coastguard Worker // 1 or 0
178*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmIsYUVPacked(GMM_RESOURCE_FORMAT Format)179*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmIsYUVPacked(GMM_RESOURCE_FORMAT Format)
180*35ffd701SAndroid Build Coastguard Worker {
181*35ffd701SAndroid Build Coastguard Worker uint8_t Status = 0;
182*35ffd701SAndroid Build Coastguard Worker
183*35ffd701SAndroid Build Coastguard Worker switch(Format)
184*35ffd701SAndroid Build Coastguard Worker {
185*35ffd701SAndroid Build Coastguard Worker // YCRCB_xxx Format Supported by the Sampler...
186*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YUY2:
187*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YVYU:
188*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_UYVY:
189*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_VYUY:
190*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YUY2_2x1:
191*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YVYU_2x1:
192*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_UYVY_2x1:
193*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_VYUY_2x1:
194*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y210:
195*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y212:
196*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y216:
197*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y410:
198*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y412:
199*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y416:
200*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_AYUV:
201*35ffd701SAndroid Build Coastguard Worker Status = 1;
202*35ffd701SAndroid Build Coastguard Worker break;
203*35ffd701SAndroid Build Coastguard Worker default:
204*35ffd701SAndroid Build Coastguard Worker Status = 0;
205*35ffd701SAndroid Build Coastguard Worker break;
206*35ffd701SAndroid Build Coastguard Worker }
207*35ffd701SAndroid Build Coastguard Worker return Status;
208*35ffd701SAndroid Build Coastguard Worker }
209*35ffd701SAndroid Build Coastguard Worker
210*35ffd701SAndroid Build Coastguard Worker //=============================================================================
211*35ffd701SAndroid Build Coastguard Worker // Function:
212*35ffd701SAndroid Build Coastguard Worker // GmmIsPlanar
213*35ffd701SAndroid Build Coastguard Worker //
214*35ffd701SAndroid Build Coastguard Worker // Description:
215*35ffd701SAndroid Build Coastguard Worker // Checks if format is YUV planar
216*35ffd701SAndroid Build Coastguard Worker //
217*35ffd701SAndroid Build Coastguard Worker // Arguments: <Look at Function Header)
218*35ffd701SAndroid Build Coastguard Worker //
219*35ffd701SAndroid Build Coastguard Worker // Return:
220*35ffd701SAndroid Build Coastguard Worker // 1 or 0
221*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmIsPlanar(GMM_RESOURCE_FORMAT Format)222*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmIsPlanar(GMM_RESOURCE_FORMAT Format)
223*35ffd701SAndroid Build Coastguard Worker {
224*35ffd701SAndroid Build Coastguard Worker uint8_t Status = 0;
225*35ffd701SAndroid Build Coastguard Worker
226*35ffd701SAndroid Build Coastguard Worker switch(Format)
227*35ffd701SAndroid Build Coastguard Worker {
228*35ffd701SAndroid Build Coastguard Worker // YUV Planar Formats
229*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_BGRP:
230*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC1:
231*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC2:
232*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC3:
233*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC4:
234*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_I420: //Same as IYUV.
235*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IYUV:
236*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411:
237*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411R:
238*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV420:
239*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422H:
240*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422V:
241*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV444:
242*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_RGBP:
243*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YV12:
244*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YVU9:
245*35ffd701SAndroid Build Coastguard Worker // YUV Hybrid Formats - GMM treats as Planar
246*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV11:
247*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV12:
248*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV21:
249*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
250*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
251*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
252*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P208:
253*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P216:
254*35ffd701SAndroid Build Coastguard Worker Status = 1;
255*35ffd701SAndroid Build Coastguard Worker break;
256*35ffd701SAndroid Build Coastguard Worker default:
257*35ffd701SAndroid Build Coastguard Worker Status = 0;
258*35ffd701SAndroid Build Coastguard Worker break;
259*35ffd701SAndroid Build Coastguard Worker }
260*35ffd701SAndroid Build Coastguard Worker return Status;
261*35ffd701SAndroid Build Coastguard Worker }
262*35ffd701SAndroid Build Coastguard Worker
263*35ffd701SAndroid Build Coastguard Worker //=============================================================================
264*35ffd701SAndroid Build Coastguard Worker // Function:
265*35ffd701SAndroid Build Coastguard Worker // GmmIsReconstructableSurface
266*35ffd701SAndroid Build Coastguard Worker //
267*35ffd701SAndroid Build Coastguard Worker // Description:
268*35ffd701SAndroid Build Coastguard Worker // Checks if format is GmmIsReconstructableSurface
269*35ffd701SAndroid Build Coastguard Worker //
270*35ffd701SAndroid Build Coastguard Worker // Arguments: <Look at Function Header)
271*35ffd701SAndroid Build Coastguard Worker //
272*35ffd701SAndroid Build Coastguard Worker // Return:
273*35ffd701SAndroid Build Coastguard Worker // 1 or 0
274*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmIsReconstructableSurface(GMM_RESOURCE_FORMAT Format)275*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmIsReconstructableSurface(GMM_RESOURCE_FORMAT Format)
276*35ffd701SAndroid Build Coastguard Worker {
277*35ffd701SAndroid Build Coastguard Worker uint8_t Status = 0;
278*35ffd701SAndroid Build Coastguard Worker
279*35ffd701SAndroid Build Coastguard Worker switch(Format)
280*35ffd701SAndroid Build Coastguard Worker {
281*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_AYUV:
282*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
283*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
284*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
285*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y210:
286*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y216:
287*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y212:
288*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y410:
289*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y416:
290*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P8:
291*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV12:
292*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YUY2_2x1:
293*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YUY2:
294*35ffd701SAndroid Build Coastguard Worker Status = 1;
295*35ffd701SAndroid Build Coastguard Worker break;
296*35ffd701SAndroid Build Coastguard Worker default:
297*35ffd701SAndroid Build Coastguard Worker Status = 0;
298*35ffd701SAndroid Build Coastguard Worker break;
299*35ffd701SAndroid Build Coastguard Worker }
300*35ffd701SAndroid Build Coastguard Worker return Status;
301*35ffd701SAndroid Build Coastguard Worker }
302*35ffd701SAndroid Build Coastguard Worker
303*35ffd701SAndroid Build Coastguard Worker //=============================================================================
304*35ffd701SAndroid Build Coastguard Worker // Function:
305*35ffd701SAndroid Build Coastguard Worker // GmmIsP0xx
306*35ffd701SAndroid Build Coastguard Worker //
307*35ffd701SAndroid Build Coastguard Worker // Description:
308*35ffd701SAndroid Build Coastguard Worker // Checks if format is P0xx
309*35ffd701SAndroid Build Coastguard Worker //
310*35ffd701SAndroid Build Coastguard Worker // Arguments: <Look at Function Header)
311*35ffd701SAndroid Build Coastguard Worker //
312*35ffd701SAndroid Build Coastguard Worker // Return:
313*35ffd701SAndroid Build Coastguard Worker // 1 or 0
314*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmIsP0xx(GMM_RESOURCE_FORMAT Format)315*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmIsP0xx(GMM_RESOURCE_FORMAT Format)
316*35ffd701SAndroid Build Coastguard Worker {
317*35ffd701SAndroid Build Coastguard Worker uint8_t Status = 0;
318*35ffd701SAndroid Build Coastguard Worker
319*35ffd701SAndroid Build Coastguard Worker switch(Format)
320*35ffd701SAndroid Build Coastguard Worker {
321*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
322*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
323*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
324*35ffd701SAndroid Build Coastguard Worker Status = 1;
325*35ffd701SAndroid Build Coastguard Worker break;
326*35ffd701SAndroid Build Coastguard Worker default:
327*35ffd701SAndroid Build Coastguard Worker Status = 0;
328*35ffd701SAndroid Build Coastguard Worker break;
329*35ffd701SAndroid Build Coastguard Worker }
330*35ffd701SAndroid Build Coastguard Worker
331*35ffd701SAndroid Build Coastguard Worker return Status;
332*35ffd701SAndroid Build Coastguard Worker }
333*35ffd701SAndroid Build Coastguard Worker
334*35ffd701SAndroid Build Coastguard Worker //=============================================================================
335*35ffd701SAndroid Build Coastguard Worker // Function:
336*35ffd701SAndroid Build Coastguard Worker // GmmIsCompressed
337*35ffd701SAndroid Build Coastguard Worker //
338*35ffd701SAndroid Build Coastguard Worker // Description:
339*35ffd701SAndroid Build Coastguard Worker // Checks if format is compressed
340*35ffd701SAndroid Build Coastguard Worker //
341*35ffd701SAndroid Build Coastguard Worker // Arguments: <Look at Function Header)
342*35ffd701SAndroid Build Coastguard Worker //
343*35ffd701SAndroid Build Coastguard Worker // Return:
344*35ffd701SAndroid Build Coastguard Worker // 1 or 0
345*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmIsCompressed(void * pLibContext,GMM_RESOURCE_FORMAT Format)346*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmIsCompressed(void *pLibContext, GMM_RESOURCE_FORMAT Format)
347*35ffd701SAndroid Build Coastguard Worker {
348*35ffd701SAndroid Build Coastguard Worker GMM_LIB_CONTEXT *pGmmLibContext = (GMM_LIB_CONTEXT *)pLibContext;
349*35ffd701SAndroid Build Coastguard Worker
350*35ffd701SAndroid Build Coastguard Worker return (Format > GMM_FORMAT_INVALID) &&
351*35ffd701SAndroid Build Coastguard Worker (Format < GMM_RESOURCE_FORMATS) &&
352*35ffd701SAndroid Build Coastguard Worker pGmmLibContext->GetPlatformInfo().FormatTable[Format].Compressed;
353*35ffd701SAndroid Build Coastguard Worker }
354*35ffd701SAndroid Build Coastguard Worker
355*35ffd701SAndroid Build Coastguard Worker //=============================================================================
356*35ffd701SAndroid Build Coastguard Worker // Function:
357*35ffd701SAndroid Build Coastguard Worker // GmmGetCacheSizes
358*35ffd701SAndroid Build Coastguard Worker //
359*35ffd701SAndroid Build Coastguard Worker // Description:
360*35ffd701SAndroid Build Coastguard Worker // This function returns the L3, LLC and EDRAM cache sizes.
361*35ffd701SAndroid Build Coastguard Worker //
362*35ffd701SAndroid Build Coastguard Worker // Arguments:
363*35ffd701SAndroid Build Coastguard Worker // pCacheSizes ==> ptr to GMM_CACHE_SIZES struct
364*35ffd701SAndroid Build Coastguard Worker //
365*35ffd701SAndroid Build Coastguard Worker // Return:
366*35ffd701SAndroid Build Coastguard Worker // void
367*35ffd701SAndroid Build Coastguard Worker //
368*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmGetCacheSizes(GMM_LIB_CONTEXT * pGmmLibContext,GMM_CACHE_SIZES * pCacheSizes)369*35ffd701SAndroid Build Coastguard Worker void GMM_STDCALL GmmGetCacheSizes(GMM_LIB_CONTEXT *pGmmLibContext, GMM_CACHE_SIZES *pCacheSizes)
370*35ffd701SAndroid Build Coastguard Worker {
371*35ffd701SAndroid Build Coastguard Worker const GT_SYSTEM_INFO *pGtSysInfo;
372*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pCacheSizes != NULL);
373*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pGmmLibContext != NULL);
374*35ffd701SAndroid Build Coastguard Worker
375*35ffd701SAndroid Build Coastguard Worker GMM_DPF_ENTER;
376*35ffd701SAndroid Build Coastguard Worker pGtSysInfo = pGmmLibContext->GetGtSysInfoPtr();
377*35ffd701SAndroid Build Coastguard Worker pCacheSizes->TotalEDRAM = GMM_KBYTE(pGtSysInfo->EdramSizeInKb);
378*35ffd701SAndroid Build Coastguard Worker pCacheSizes->TotalLLCCache = GMM_KBYTE(pGtSysInfo->LLCCacheSizeInKb);
379*35ffd701SAndroid Build Coastguard Worker pCacheSizes->TotalL3Cache = GMM_KBYTE(pGtSysInfo->L3CacheSizeInKb);
380*35ffd701SAndroid Build Coastguard Worker
381*35ffd701SAndroid Build Coastguard Worker GMM_DPF_EXIT;
382*35ffd701SAndroid Build Coastguard Worker }
383*35ffd701SAndroid Build Coastguard Worker namespace GmmLib
384*35ffd701SAndroid Build Coastguard Worker {
385*35ffd701SAndroid Build Coastguard Worker namespace Utility
386*35ffd701SAndroid Build Coastguard Worker {
387*35ffd701SAndroid Build Coastguard Worker //=============================================================================
388*35ffd701SAndroid Build Coastguard Worker // Function:
389*35ffd701SAndroid Build Coastguard Worker // GmmGetNumPlanes
390*35ffd701SAndroid Build Coastguard Worker //
391*35ffd701SAndroid Build Coastguard Worker // Description:
392*35ffd701SAndroid Build Coastguard Worker // Returns number of planes for given format
393*35ffd701SAndroid Build Coastguard Worker //
394*35ffd701SAndroid Build Coastguard Worker // Arguments: <Look at Function Header)
395*35ffd701SAndroid Build Coastguard Worker //
396*35ffd701SAndroid Build Coastguard Worker // Return:
397*35ffd701SAndroid Build Coastguard Worker // uint32_t number of planes
398*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmGetNumPlanes(GMM_RESOURCE_FORMAT Format)399*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmGetNumPlanes(GMM_RESOURCE_FORMAT Format)
400*35ffd701SAndroid Build Coastguard Worker {
401*35ffd701SAndroid Build Coastguard Worker uint32_t Planes = 1;
402*35ffd701SAndroid Build Coastguard Worker
403*35ffd701SAndroid Build Coastguard Worker switch(Format)
404*35ffd701SAndroid Build Coastguard Worker {
405*35ffd701SAndroid Build Coastguard Worker // YUV Planar Formats
406*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_BGRP:
407*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC1:
408*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC2:
409*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC3:
410*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IMC4:
411*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_I420:
412*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_IYUV:
413*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411:
414*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV411R:
415*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV420:
416*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422H:
417*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV422V:
418*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_MFX_JPEG_YUV444:
419*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_RGBP:
420*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YV12:
421*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_YVU9:
422*35ffd701SAndroid Build Coastguard Worker Planes = 3;
423*35ffd701SAndroid Build Coastguard Worker break;
424*35ffd701SAndroid Build Coastguard Worker // YUV Hybrid Formats - GMM treats as Planar
425*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV11:
426*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV12:
427*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_NV21:
428*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
429*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
430*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016:
431*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P208:
432*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P216:
433*35ffd701SAndroid Build Coastguard Worker Planes = 2;
434*35ffd701SAndroid Build Coastguard Worker break;
435*35ffd701SAndroid Build Coastguard Worker default:
436*35ffd701SAndroid Build Coastguard Worker Planes = 1;
437*35ffd701SAndroid Build Coastguard Worker break;
438*35ffd701SAndroid Build Coastguard Worker }
439*35ffd701SAndroid Build Coastguard Worker return Planes;
440*35ffd701SAndroid Build Coastguard Worker }
441*35ffd701SAndroid Build Coastguard Worker
442*35ffd701SAndroid Build Coastguard Worker //==============================================================================
443*35ffd701SAndroid Build Coastguard Worker //
444*35ffd701SAndroid Build Coastguard Worker // Function:
445*35ffd701SAndroid Build Coastguard Worker // GmmGetFormatForASTC
446*35ffd701SAndroid Build Coastguard Worker //
447*35ffd701SAndroid Build Coastguard Worker // Description: See below.
448*35ffd701SAndroid Build Coastguard Worker //
449*35ffd701SAndroid Build Coastguard Worker // Returns:
450*35ffd701SAndroid Build Coastguard Worker // GMM_RESOURCE_FORMAT for described ASTC format or GMM_FORMAT_INVALID(0)
451*35ffd701SAndroid Build Coastguard Worker // if invalid params specified.
452*35ffd701SAndroid Build Coastguard Worker //
453*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmGetFormatForASTC(uint8_t HDR,uint8_t Float,uint32_t BlockWidth,uint32_t BlockHeight,uint32_t BlockDepth)454*35ffd701SAndroid Build Coastguard Worker GMM_RESOURCE_FORMAT GMM_STDCALL GmmGetFormatForASTC(uint8_t HDR, uint8_t Float, uint32_t BlockWidth, uint32_t BlockHeight, uint32_t BlockDepth)
455*35ffd701SAndroid Build Coastguard Worker {
456*35ffd701SAndroid Build Coastguard Worker // Full enums/etc. in case we ever need to typedef them...
457*35ffd701SAndroid Build Coastguard Worker enum GMM_SURFACESTATE_FORMAT_ASTC_DYNAMIC_RANGE
458*35ffd701SAndroid Build Coastguard Worker {
459*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_DYNAMIC_RANGE_LDR = 0,
460*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_DYNAMIC_RANGE_HDR = 1,
461*35ffd701SAndroid Build Coastguard Worker };
462*35ffd701SAndroid Build Coastguard Worker
463*35ffd701SAndroid Build Coastguard Worker enum GMM_SURFACESTATE_FORMAT_ASTC_BLOCK_DIMENSION
464*35ffd701SAndroid Build Coastguard Worker {
465*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_BLOCK_DIMENSION_2D = 0,
466*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_BLOCK_DIMENSION_3D = 1,
467*35ffd701SAndroid Build Coastguard Worker };
468*35ffd701SAndroid Build Coastguard Worker
469*35ffd701SAndroid Build Coastguard Worker enum GMM_SURFACESTATE_FORMAT_ASTC_DECODE_FORMAT
470*35ffd701SAndroid Build Coastguard Worker {
471*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_DECODE_FORMAT_UNORM8_sRGB = 0,
472*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_DECODE_FORMAT_FLOAT16 = 1,
473*35ffd701SAndroid Build Coastguard Worker };
474*35ffd701SAndroid Build Coastguard Worker
475*35ffd701SAndroid Build Coastguard Worker enum GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE
476*35ffd701SAndroid Build Coastguard Worker {
477*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_4px = 0,
478*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_5px = 1,
479*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_6px = 2,
480*35ffd701SAndroid Build Coastguard Worker __GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_0x3 = 3,
481*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_8px = 4,
482*35ffd701SAndroid Build Coastguard Worker __GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_0x5 = 5,
483*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_10px = 6,
484*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_12px = 7,
485*35ffd701SAndroid Build Coastguard Worker };
486*35ffd701SAndroid Build Coastguard Worker
487*35ffd701SAndroid Build Coastguard Worker enum GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE
488*35ffd701SAndroid Build Coastguard Worker {
489*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_3px = 0,
490*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_4px = 1,
491*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_5px = 2,
492*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_6px = 3,
493*35ffd701SAndroid Build Coastguard Worker };
494*35ffd701SAndroid Build Coastguard Worker
495*35ffd701SAndroid Build Coastguard Worker union GMM_SURFACESTATE_FORMAT_ASTC {
496*35ffd701SAndroid Build Coastguard Worker struct // Common Fields...
497*35ffd701SAndroid Build Coastguard Worker {
498*35ffd701SAndroid Build Coastguard Worker uint32_t Reserved1 : 6; // [2D/3D-Specific Fields]
499*35ffd701SAndroid Build Coastguard Worker uint32_t DecodeFormat : 1; // GMM_SURFACESTATE_FORMAT_ASTC_DECODE_FORMAT
500*35ffd701SAndroid Build Coastguard Worker uint32_t BlockDimension : 1; // GMM_SURFACESTATE_FORMAT_ASTC_BLOCK_DIMENSION
501*35ffd701SAndroid Build Coastguard Worker uint32_t DynamicRange : 1; // GMM_SURFACESTATE_FORMAT_ASTC_DYNAMIC_RANGE
502*35ffd701SAndroid Build Coastguard Worker uint32_t Reserved2 : 23;
503*35ffd701SAndroid Build Coastguard Worker };
504*35ffd701SAndroid Build Coastguard Worker struct // 2D-Specific Fields...
505*35ffd701SAndroid Build Coastguard Worker {
506*35ffd701SAndroid Build Coastguard Worker uint32_t BlockHeight2D : 3; // GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE
507*35ffd701SAndroid Build Coastguard Worker uint32_t BlockWidth2D : 3; // GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE
508*35ffd701SAndroid Build Coastguard Worker uint32_t Reserved3 : 3; // [Common Fields]
509*35ffd701SAndroid Build Coastguard Worker uint32_t Reserved4 : 23;
510*35ffd701SAndroid Build Coastguard Worker };
511*35ffd701SAndroid Build Coastguard Worker struct // 3D-Specific Fields...
512*35ffd701SAndroid Build Coastguard Worker {
513*35ffd701SAndroid Build Coastguard Worker uint32_t BlockDepth3D : 2; // GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE
514*35ffd701SAndroid Build Coastguard Worker uint32_t BlockHeight3D : 2; // GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE
515*35ffd701SAndroid Build Coastguard Worker uint32_t BlockWidth3D : 2; // GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE
516*35ffd701SAndroid Build Coastguard Worker uint32_t Reserved5 : 3; // [Common Fields]
517*35ffd701SAndroid Build Coastguard Worker uint32_t Reserved6 : 23;
518*35ffd701SAndroid Build Coastguard Worker };
519*35ffd701SAndroid Build Coastguard Worker struct
520*35ffd701SAndroid Build Coastguard Worker {
521*35ffd701SAndroid Build Coastguard Worker uint32_t Value : 9;
522*35ffd701SAndroid Build Coastguard Worker uint32_t Reserved7 : 23;
523*35ffd701SAndroid Build Coastguard Worker };
524*35ffd701SAndroid Build Coastguard Worker } Format = {0};
525*35ffd701SAndroid Build Coastguard Worker C_ASSERT(sizeof(union GMM_SURFACESTATE_FORMAT_ASTC) == sizeof(uint32_t));
526*35ffd701SAndroid Build Coastguard Worker
527*35ffd701SAndroid Build Coastguard Worker // TODO(Minor): Verify and fail for invalid HDR/sRGB combinations.
528*35ffd701SAndroid Build Coastguard Worker
529*35ffd701SAndroid Build Coastguard Worker if(BlockDepth == 0)
530*35ffd701SAndroid Build Coastguard Worker BlockDepth = 1;
531*35ffd701SAndroid Build Coastguard Worker
532*35ffd701SAndroid Build Coastguard Worker Format.DynamicRange = HDR ?
533*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_DYNAMIC_RANGE_HDR :
534*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_DYNAMIC_RANGE_LDR;
535*35ffd701SAndroid Build Coastguard Worker
536*35ffd701SAndroid Build Coastguard Worker Format.DecodeFormat = Float ?
537*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_DECODE_FORMAT_FLOAT16 :
538*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_DECODE_FORMAT_UNORM8_sRGB;
539*35ffd701SAndroid Build Coastguard Worker
540*35ffd701SAndroid Build Coastguard Worker // Validate Block Dimensions...
541*35ffd701SAndroid Build Coastguard Worker if(!(
542*35ffd701SAndroid Build Coastguard Worker #define GMM_FORMAT_INCLUDE_ASTC_FORMATS_ONLY
543*35ffd701SAndroid Build Coastguard Worker #define GMM_FORMAT(Name, bpe, Width, Height, Depth, IsRT, IsASTC, RcsSurfaceFormat, SSCompressionFmt, Availability) \
544*35ffd701SAndroid Build Coastguard Worker ((BlockWidth == (Width)) && (BlockHeight == (Height)) && (BlockDepth == (Depth))) ||
545*35ffd701SAndroid Build Coastguard Worker #include "External/Common/GmmFormatTable.h"
546*35ffd701SAndroid Build Coastguard Worker 0)) // <-- 0 benignly terminates the chain of OR expressions.
547*35ffd701SAndroid Build Coastguard Worker {
548*35ffd701SAndroid Build Coastguard Worker goto Invalid;
549*35ffd701SAndroid Build Coastguard Worker }
550*35ffd701SAndroid Build Coastguard Worker
551*35ffd701SAndroid Build Coastguard Worker if(BlockDepth <= 1)
552*35ffd701SAndroid Build Coastguard Worker {
553*35ffd701SAndroid Build Coastguard Worker Format.BlockDimension = GMM_SURFACESTATE_FORMAT_ASTC_BLOCK_DIMENSION_2D;
554*35ffd701SAndroid Build Coastguard Worker
555*35ffd701SAndroid Build Coastguard Worker // clang-format off
556*35ffd701SAndroid Build Coastguard Worker Format.BlockWidth2D =
557*35ffd701SAndroid Build Coastguard Worker (BlockWidth == 4) ? GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_4px :
558*35ffd701SAndroid Build Coastguard Worker (BlockWidth == 5) ? GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_5px :
559*35ffd701SAndroid Build Coastguard Worker (BlockWidth == 6) ? GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_6px :
560*35ffd701SAndroid Build Coastguard Worker (BlockWidth == 8) ? GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_8px :
561*35ffd701SAndroid Build Coastguard Worker (BlockWidth == 10) ? GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_10px :
562*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_12px;
563*35ffd701SAndroid Build Coastguard Worker Format.BlockHeight2D =
564*35ffd701SAndroid Build Coastguard Worker (BlockHeight == 4) ? GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_4px :
565*35ffd701SAndroid Build Coastguard Worker (BlockHeight == 5) ? GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_5px :
566*35ffd701SAndroid Build Coastguard Worker (BlockHeight == 6) ? GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_6px :
567*35ffd701SAndroid Build Coastguard Worker (BlockHeight == 8) ? GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_8px :
568*35ffd701SAndroid Build Coastguard Worker (BlockHeight == 10) ? GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_10px :
569*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_2D_BLOCK_SIZE_12px;
570*35ffd701SAndroid Build Coastguard Worker // clang-format on
571*35ffd701SAndroid Build Coastguard Worker }
572*35ffd701SAndroid Build Coastguard Worker else
573*35ffd701SAndroid Build Coastguard Worker {
574*35ffd701SAndroid Build Coastguard Worker Format.BlockDimension = GMM_SURFACESTATE_FORMAT_ASTC_BLOCK_DIMENSION_3D;
575*35ffd701SAndroid Build Coastguard Worker // clang-format off
576*35ffd701SAndroid Build Coastguard Worker Format.BlockWidth3D =
577*35ffd701SAndroid Build Coastguard Worker (BlockWidth == 3) ? GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_3px :
578*35ffd701SAndroid Build Coastguard Worker (BlockWidth == 4) ? GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_4px :
579*35ffd701SAndroid Build Coastguard Worker (BlockWidth == 5) ? GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_5px :
580*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_6px;
581*35ffd701SAndroid Build Coastguard Worker Format.BlockHeight3D =
582*35ffd701SAndroid Build Coastguard Worker (BlockHeight == 3) ? GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_3px :
583*35ffd701SAndroid Build Coastguard Worker (BlockHeight == 4) ? GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_4px :
584*35ffd701SAndroid Build Coastguard Worker (BlockHeight == 5) ? GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_5px :
585*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_6px;
586*35ffd701SAndroid Build Coastguard Worker Format.BlockDepth3D =
587*35ffd701SAndroid Build Coastguard Worker (BlockDepth == 3) ? GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_3px :
588*35ffd701SAndroid Build Coastguard Worker (BlockDepth == 4) ? GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_4px :
589*35ffd701SAndroid Build Coastguard Worker (BlockDepth == 5) ? GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_5px :
590*35ffd701SAndroid Build Coastguard Worker GMM_SURFACESTATE_FORMAT_ASTC_3D_BLOCK_SIZE_6px;
591*35ffd701SAndroid Build Coastguard Worker // clang-format on
592*35ffd701SAndroid Build Coastguard Worker }
593*35ffd701SAndroid Build Coastguard Worker
594*35ffd701SAndroid Build Coastguard Worker return ((GMM_RESOURCE_FORMAT)Format.Value);
595*35ffd701SAndroid Build Coastguard Worker Invalid:
596*35ffd701SAndroid Build Coastguard Worker return (GMM_FORMAT_INVALID);
597*35ffd701SAndroid Build Coastguard Worker }
598*35ffd701SAndroid Build Coastguard Worker
599*35ffd701SAndroid Build Coastguard Worker
600*35ffd701SAndroid Build Coastguard Worker } // namespace Utility
601*35ffd701SAndroid Build Coastguard Worker } // namespace GmmLib
602*35ffd701SAndroid Build Coastguard Worker
603*35ffd701SAndroid Build Coastguard Worker //=============================================================================
604*35ffd701SAndroid Build Coastguard Worker //
605*35ffd701SAndroid Build Coastguard Worker // Function: __GmmLog2
606*35ffd701SAndroid Build Coastguard Worker //
607*35ffd701SAndroid Build Coastguard Worker // Desc: Returns Log2 of passed value. Useful for indexing into arrays.
608*35ffd701SAndroid Build Coastguard Worker //
609*35ffd701SAndroid Build Coastguard Worker // Parameters:
610*35ffd701SAndroid Build Coastguard Worker // Value => Must be power of 2
611*35ffd701SAndroid Build Coastguard Worker //
612*35ffd701SAndroid Build Coastguard Worker // Returns:
613*35ffd701SAndroid Build Coastguard Worker // See desc.
614*35ffd701SAndroid Build Coastguard Worker // Example Value = 8 => Log2(Value) = 3
615*35ffd701SAndroid Build Coastguard Worker // Example Value = 32 => Log2(Value) = 5
616*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
__GmmLog2(uint32_t Value)617*35ffd701SAndroid Build Coastguard Worker uint32_t __GmmLog2(uint32_t Value)
618*35ffd701SAndroid Build Coastguard Worker {
619*35ffd701SAndroid Build Coastguard Worker uint32_t FirstSetBit = 0; // bit # of first set bit in Bpp.
620*35ffd701SAndroid Build Coastguard Worker
621*35ffd701SAndroid Build Coastguard Worker #if _MSC_VER
622*35ffd701SAndroid Build Coastguard Worker // Check that Value is pow2
623*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(__popcnt(Value) <= 1);
624*35ffd701SAndroid Build Coastguard Worker _BitScanReverse((DWORD *)&FirstSetBit, (DWORD)Value);
625*35ffd701SAndroid Build Coastguard Worker #else
626*35ffd701SAndroid Build Coastguard Worker // Check that Value is pow2
627*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(__builtin_popcount(Value) <= 1);
628*35ffd701SAndroid Build Coastguard Worker FirstSetBit = __builtin_ctz(Value);
629*35ffd701SAndroid Build Coastguard Worker #endif
630*35ffd701SAndroid Build Coastguard Worker
631*35ffd701SAndroid Build Coastguard Worker // Log2(Value) = FirstSetBit.
632*35ffd701SAndroid Build Coastguard Worker return FirstSetBit;
633*35ffd701SAndroid Build Coastguard Worker };
634*35ffd701SAndroid Build Coastguard Worker
635*35ffd701SAndroid Build Coastguard Worker // Table for converting the tile layout of DirectX tiled resources
636*35ffd701SAndroid Build Coastguard Worker // to TileY.
637*35ffd701SAndroid Build Coastguard Worker const uint32_t __GmmTileYConversionTable[5][2] =
638*35ffd701SAndroid Build Coastguard Worker {
639*35ffd701SAndroid Build Coastguard Worker //WxH 256x256, of 64KB tile in texels, BPP = 8
640*35ffd701SAndroid Build Coastguard Worker {2, 8}, // = (W * (BPP >> 3)) / 128, H / 32
641*35ffd701SAndroid Build Coastguard Worker //WxH 256x128, BPP = 16
642*35ffd701SAndroid Build Coastguard Worker {4, 4},
643*35ffd701SAndroid Build Coastguard Worker //WxH 128x128, BPP = 32
644*35ffd701SAndroid Build Coastguard Worker {4, 4},
645*35ffd701SAndroid Build Coastguard Worker //WxH 128x64, BPP = 64
646*35ffd701SAndroid Build Coastguard Worker {8, 2},
647*35ffd701SAndroid Build Coastguard Worker //WxH 64x64, BPP = 128
648*35ffd701SAndroid Build Coastguard Worker {8, 2}};
649*35ffd701SAndroid Build Coastguard Worker
650*35ffd701SAndroid Build Coastguard Worker // With MSAA, modify DirectX tile dimensions
651*35ffd701SAndroid Build Coastguard Worker // MSAA Divide Tile Dimensions (WxH) by
652*35ffd701SAndroid Build Coastguard Worker // 1 1x1
653*35ffd701SAndroid Build Coastguard Worker // 2 2x1
654*35ffd701SAndroid Build Coastguard Worker // 4 2x2
655*35ffd701SAndroid Build Coastguard Worker // 8 4x2
656*35ffd701SAndroid Build Coastguard Worker //16 4x4
657*35ffd701SAndroid Build Coastguard Worker const uint32_t __GmmMSAAConversion[5][2] =
658*35ffd701SAndroid Build Coastguard Worker {
659*35ffd701SAndroid Build Coastguard Worker // MSAA 1x
660*35ffd701SAndroid Build Coastguard Worker {1, 1},
661*35ffd701SAndroid Build Coastguard Worker // MSAA 2x
662*35ffd701SAndroid Build Coastguard Worker {2, 1},
663*35ffd701SAndroid Build Coastguard Worker // MSAA 4x
664*35ffd701SAndroid Build Coastguard Worker {2, 2},
665*35ffd701SAndroid Build Coastguard Worker // MSAA 8x
666*35ffd701SAndroid Build Coastguard Worker {4, 2},
667*35ffd701SAndroid Build Coastguard Worker // MSAA 16x
668*35ffd701SAndroid Build Coastguard Worker {4, 4}};
669