xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/Utility/GmmUtility.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
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