xref: /aosp_15_r20/external/mesa3d/src/panfrost/lib/pan_format.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright (C) 2019 Collabora, Ltd.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  *
23  * Authors:
24  *   Alyssa Rosenzweig <[email protected]>
25  */
26 
27 #include "pan_format.h"
28 #include "genxml/gen_macros.h"
29 #include "util/format/u_format.h"
30 
31 /* Convenience */
32 
33 #if PAN_ARCH == 6
34 #define MALI_RGBA_SWIZZLE         PAN_V6_SWIZZLE(R, G, B, A)
35 #define MALI_RGB1_SWIZZLE         PAN_V6_SWIZZLE(R, G, B, A)
36 #else
37 #define MALI_RGBA_SWIZZLE         MALI_RGB_COMPONENT_ORDER_RGBA
38 #define MALI_RGB1_SWIZZLE         MALI_RGB_COMPONENT_ORDER_RGB1
39 #endif
40 
41 #define MALI_BLEND_AU_R8G8B8A8    (MALI_RGBA8_TB << 12)    | MALI_RGBA_SWIZZLE
42 #define MALI_BLEND_PU_R8G8B8A8    (MALI_RGBA8_TB << 12)    | MALI_RGBA_SWIZZLE
43 #define MALI_BLEND_AU_R10G10B10A2 (MALI_RGB10_A2_TB << 12) | MALI_RGBA_SWIZZLE
44 #define MALI_BLEND_PU_R10G10B10A2 (MALI_RGB10_A2_TB << 12) | MALI_RGBA_SWIZZLE
45 #define MALI_BLEND_AU_R8G8B8A2    (MALI_RGB8_A2_AU << 12)  | MALI_RGBA_SWIZZLE
46 #define MALI_BLEND_PU_R8G8B8A2    (MALI_RGB8_A2_PU << 12)  | MALI_RGBA_SWIZZLE
47 #define MALI_BLEND_AU_R4G4B4A4    (MALI_RGBA4_AU << 12)    | MALI_RGBA_SWIZZLE
48 #define MALI_BLEND_PU_R4G4B4A4    (MALI_RGBA4_PU << 12)    | MALI_RGBA_SWIZZLE
49 #define MALI_BLEND_AU_R5G6B5A0    (MALI_R5G6B5_AU << 12)   | MALI_RGB1_SWIZZLE
50 #define MALI_BLEND_PU_R5G6B5A0    (MALI_R5G6B5_PU << 12)   | MALI_RGB1_SWIZZLE
51 #define MALI_BLEND_AU_R5G5B5A1    (MALI_RGB5_A1_AU << 12)  | MALI_RGBA_SWIZZLE
52 #define MALI_BLEND_PU_R5G5B5A1    (MALI_RGB5_A1_PU << 12)  | MALI_RGBA_SWIZZLE
53 
54 #if PAN_ARCH <= 5
55 #define BFMT2(pipe, internal, writeback, srgb)                                 \
56    [PIPE_FORMAT_##pipe] = {                                                    \
57       MALI_COLOR_BUFFER_INTERNAL_FORMAT_##internal,                            \
58       MALI_COLOR_FORMAT_##writeback,                                           \
59       { 0, 0 },                                                                \
60    }
61 #else
62 #define BFMT2(pipe, internal, writeback, srgb)                                 \
63    [PIPE_FORMAT_##pipe] = {                                                    \
64       MALI_COLOR_BUFFER_INTERNAL_FORMAT_##internal,                            \
65       MALI_COLOR_FORMAT_##writeback,                                           \
66       {                                                                        \
67          MALI_BLEND_PU_##internal | (srgb ? (1 << 20) : 0),                    \
68          MALI_BLEND_AU_##internal | (srgb ? (1 << 20) : 0),                    \
69       },                                                                       \
70    }
71 #endif
72 
73 #define BFMT(pipe, internal_and_writeback)                                     \
74    BFMT2(pipe, internal_and_writeback, internal_and_writeback, 0)
75 
76 #define BFMT_SRGB(pipe, writeback)                                             \
77    BFMT2(pipe##_UNORM, R8G8B8A8, writeback, 0),                                \
78       BFMT2(pipe##_SRGB, R8G8B8A8, writeback, 1)
79 
80 const struct pan_blendable_format
81    GENX(panfrost_blendable_formats)[PIPE_FORMAT_COUNT] = {
82       BFMT_SRGB(L8, R8),
83       BFMT_SRGB(L8A8, R8G8),
84       BFMT_SRGB(R8, R8),
85       BFMT_SRGB(R8G8, R8G8),
86       BFMT_SRGB(R8G8B8, R8G8B8),
87 
88       BFMT_SRGB(B8G8R8A8, R8G8B8A8),
89       BFMT_SRGB(B8G8R8X8, R8G8B8A8),
90       BFMT_SRGB(A8R8G8B8, R8G8B8A8),
91       BFMT_SRGB(X8R8G8B8, R8G8B8A8),
92       BFMT_SRGB(A8B8G8R8, R8G8B8A8),
93       BFMT_SRGB(X8B8G8R8, R8G8B8A8),
94       BFMT_SRGB(R8G8B8X8, R8G8B8A8),
95       BFMT_SRGB(R8G8B8A8, R8G8B8A8),
96 
97       BFMT2(A8_UNORM, R8G8B8A8, R8, 0),
98       BFMT2(I8_UNORM, R8G8B8A8, R8, 0),
99       BFMT2(R5G6B5_UNORM, R5G6B5A0, R5G6B5, 0),
100       BFMT2(B5G6R5_UNORM, R5G6B5A0, R5G6B5, 0),
101 
102       BFMT(A4B4G4R4_UNORM, R4G4B4A4),
103       BFMT(B4G4R4A4_UNORM, R4G4B4A4),
104       BFMT(R4G4B4A4_UNORM, R4G4B4A4),
105 
106       BFMT(R10G10B10A2_UNORM, R10G10B10A2),
107       BFMT(B10G10R10A2_UNORM, R10G10B10A2),
108       BFMT(R10G10B10X2_UNORM, R10G10B10A2),
109       BFMT(B10G10R10X2_UNORM, R10G10B10A2),
110 
111       BFMT(B5G5R5A1_UNORM, R5G5B5A1),
112       BFMT(R5G5B5A1_UNORM, R5G5B5A1),
113       BFMT(B5G5R5X1_UNORM, R5G5B5A1),
114 };
115 
116 /* Convenience */
117 
118 #define _V PAN_BIND_VERTEX_BUFFER
119 #define _T PAN_BIND_SAMPLER_VIEW
120 #define _R PAN_BIND_RENDER_TARGET
121 #define _Z PAN_BIND_DEPTH_STENCIL
122 
123 #define FLAGS_V___ (_V)
124 #define FLAGS__T__ (_T)
125 #define FLAGS_VTR_ (_V | _T | _R)
126 #define FLAGS_VT__ (_V | _T)
127 #define FLAGS__T_Z (_T | _Z)
128 
129 #define FMT(pipe, mali, swizzle, srgb, flags)                                  \
130    [PIPE_FORMAT_##pipe] = {                                                    \
131       .hw = MALI_PACK_FMT(mali, swizzle, srgb),                                \
132       .bind = FLAGS_##flags,                                                   \
133    }
134 
135 #if PAN_ARCH >= 7
136 #define YUV_NO_SWAP (0)
137 #define YUV_SWAP    (1)
138 
139 #define FMT_YUV(pipe, mali, swizzle, swap, siting, flags)                      \
140    [PIPE_FORMAT_##pipe] = {                                                    \
141       .hw = (MALI_YUV_SWIZZLE_##swizzle) | ((YUV_##swap) << 3) |               \
142             ((MALI_YUV_CR_SITING_##siting) << 9) | ((MALI_##mali) << 12),      \
143       .bind = FLAGS_##flags,                                                   \
144    }
145 #endif
146 
147 /* clang-format off */
148 const struct panfrost_format GENX(panfrost_pipe_format)[PIPE_FORMAT_COUNT] = {
149    FMT(NONE,                    CONSTANT,        0000, L, VTR_),
150 
151 #if PAN_ARCH >= 7
152    /* Multiplane formats */
153    FMT_YUV(R8G8_R8B8_UNORM, YUYV8, UVYA, NO_SWAP, CENTER_Y, _T__),
154    FMT_YUV(G8R8_B8R8_UNORM, VYUY8, UYVA, SWAP,    CENTER_Y, _T__),
155    FMT_YUV(R8B8_R8G8_UNORM, YUYV8, VYUA, NO_SWAP, CENTER_Y, _T__),
156    FMT_YUV(B8R8_G8R8_UNORM, VYUY8, VUYA, SWAP,    CENTER_Y, _T__),
157    FMT_YUV(R8_G8B8_420_UNORM, Y8_UV8_420, YUVA, NO_SWAP, CENTER, _T__),
158    FMT_YUV(R8_B8G8_420_UNORM, Y8_UV8_420, YVUA, NO_SWAP, CENTER, _T__),
159    FMT_YUV(R8_G8_B8_420_UNORM, Y8_U8_V8_420, YUVA, NO_SWAP, CENTER, _T__),
160    FMT_YUV(R8_B8_G8_420_UNORM, Y8_U8_V8_420, YVUA, NO_SWAP, CENTER, _T__),
161 #endif
162 
163 #if PAN_ARCH <= 7
164    FMT(ETC1_RGB8,               ETC2_RGB8,       RGB1, L, _T__),
165    FMT(ETC2_RGB8,               ETC2_RGB8,       RGB1, L, _T__),
166    FMT(ETC2_SRGB8,              ETC2_RGB8,       RGB1, S, _T__),
167    FMT(ETC2_R11_UNORM,          ETC2_R11_UNORM,  R001, L, _T__),
168    FMT(ETC2_RGBA8,              ETC2_RGBA8,      RGBA, L, _T__),
169    FMT(ETC2_SRGBA8,             ETC2_RGBA8,      RGBA, S, _T__),
170    FMT(ETC2_RG11_UNORM,         ETC2_RG11_UNORM, RG01, L, _T__),
171    FMT(ETC2_R11_SNORM,          ETC2_R11_SNORM,  R001, L, _T__),
172    FMT(ETC2_RG11_SNORM,         ETC2_RG11_SNORM, RG01, L, _T__),
173    FMT(ETC2_RGB8A1,             ETC2_RGB8A1,     RGBA, L, _T__),
174    FMT(ETC2_SRGB8A1,            ETC2_RGB8A1,     RGBA, S, _T__),
175    FMT(DXT1_RGB,                BC1_UNORM,       RGB1, L, _T__),
176    FMT(DXT1_RGBA,               BC1_UNORM,       RGBA, L, _T__),
177    FMT(DXT1_SRGB,               BC1_UNORM,       RGB1, S, _T__),
178    FMT(DXT1_SRGBA,              BC1_UNORM,       RGBA, S, _T__),
179    FMT(DXT3_RGBA,               BC2_UNORM,       RGBA, L, _T__),
180    FMT(DXT3_SRGBA,              BC2_UNORM,       RGBA, S, _T__),
181    FMT(DXT5_RGBA,               BC3_UNORM,       RGBA, L, _T__),
182    FMT(DXT5_SRGBA,              BC3_UNORM,       RGBA, S, _T__),
183    FMT(RGTC1_UNORM,             BC4_UNORM,       R001, L, _T__),
184    FMT(RGTC1_SNORM,             BC4_SNORM,       R001, L, _T__),
185    FMT(RGTC2_UNORM,             BC5_UNORM,       RG01, L, _T__),
186    FMT(RGTC2_SNORM,             BC5_SNORM,       RG01, L, _T__),
187    FMT(BPTC_RGB_FLOAT,          BC6H_SF16,       RGB1, L, _T__),
188    FMT(BPTC_RGB_UFLOAT,         BC6H_UF16,       RGB1, L, _T__),
189    FMT(BPTC_RGBA_UNORM,         BC7_UNORM,       RGBA, L, _T__),
190    FMT(BPTC_SRGBA,              BC7_UNORM,       RGBA, S, _T__),
191    FMT(ASTC_4x4,                ASTC_2D_HDR,     RGBA, L, _T__),
192    FMT(ASTC_5x4,                ASTC_2D_HDR,     RGBA, L, _T__),
193    FMT(ASTC_5x5,                ASTC_2D_HDR,     RGBA, L, _T__),
194    FMT(ASTC_6x5,                ASTC_2D_HDR,     RGBA, L, _T__),
195    FMT(ASTC_6x6,                ASTC_2D_HDR,     RGBA, L, _T__),
196    FMT(ASTC_8x5,                ASTC_2D_HDR,     RGBA, L, _T__),
197    FMT(ASTC_8x6,                ASTC_2D_HDR,     RGBA, L, _T__),
198    FMT(ASTC_8x8,                ASTC_2D_HDR,     RGBA, L, _T__),
199    FMT(ASTC_10x5,               ASTC_2D_HDR,     RGBA, L, _T__),
200    FMT(ASTC_10x6,               ASTC_2D_HDR,     RGBA, L, _T__),
201    FMT(ASTC_10x8,               ASTC_2D_HDR,     RGBA, L, _T__),
202    FMT(ASTC_10x10,              ASTC_2D_HDR,     RGBA, L, _T__),
203    FMT(ASTC_12x10,              ASTC_2D_HDR,     RGBA, L, _T__),
204    FMT(ASTC_12x12,              ASTC_2D_HDR,     RGBA, L, _T__),
205    FMT(ASTC_4x4_SRGB,           ASTC_2D_LDR,     RGBA, S, _T__),
206    FMT(ASTC_5x4_SRGB,           ASTC_2D_LDR,     RGBA, S, _T__),
207    FMT(ASTC_5x5_SRGB,           ASTC_2D_LDR,     RGBA, S, _T__),
208    FMT(ASTC_6x5_SRGB,           ASTC_2D_LDR,     RGBA, S, _T__),
209    FMT(ASTC_6x6_SRGB,           ASTC_2D_LDR,     RGBA, S, _T__),
210    FMT(ASTC_8x5_SRGB,           ASTC_2D_LDR,     RGBA, S, _T__),
211    FMT(ASTC_8x6_SRGB,           ASTC_2D_LDR,     RGBA, S, _T__),
212    FMT(ASTC_8x8_SRGB,           ASTC_2D_LDR,     RGBA, S, _T__),
213    FMT(ASTC_10x5_SRGB,          ASTC_2D_LDR,     RGBA, S, _T__),
214    FMT(ASTC_10x6_SRGB,          ASTC_2D_LDR,     RGBA, S, _T__),
215    FMT(ASTC_10x8_SRGB,          ASTC_2D_LDR,     RGBA, S, _T__),
216    FMT(ASTC_10x10_SRGB,         ASTC_2D_LDR,     RGBA, S, _T__),
217    FMT(ASTC_12x10_SRGB,         ASTC_2D_LDR,     RGBA, S, _T__),
218    FMT(ASTC_12x12_SRGB,         ASTC_2D_LDR,     RGBA, S, _T__),
219    FMT(ASTC_3x3x3,              ASTC_3D_HDR,     RGBA, L, _T__),
220    FMT(ASTC_4x3x3,              ASTC_3D_HDR,     RGBA, L, _T__),
221    FMT(ASTC_4x4x3,              ASTC_3D_HDR,     RGBA, L, _T__),
222    FMT(ASTC_4x4x4,              ASTC_3D_HDR,     RGBA, L, _T__),
223    FMT(ASTC_5x4x4,              ASTC_3D_HDR,     RGBA, L, _T__),
224    FMT(ASTC_5x5x4,              ASTC_3D_HDR,     RGBA, L, _T__),
225    FMT(ASTC_5x5x5,              ASTC_3D_HDR,     RGBA, L, _T__),
226    FMT(ASTC_6x5x5,              ASTC_3D_HDR,     RGBA, L, _T__),
227    FMT(ASTC_6x6x5,              ASTC_3D_HDR,     RGBA, L, _T__),
228    FMT(ASTC_6x6x6,              ASTC_3D_HDR,     RGBA, L, _T__),
229    FMT(ASTC_3x3x3_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
230    FMT(ASTC_4x3x3_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
231    FMT(ASTC_4x4x3_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
232    FMT(ASTC_4x4x4_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
233    FMT(ASTC_5x4x4_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
234    FMT(ASTC_5x5x4_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
235    FMT(ASTC_5x5x5_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
236    FMT(ASTC_6x5x5_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
237    FMT(ASTC_6x6x5_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
238    FMT(ASTC_6x6x6_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
239 #else
240    /* Map to interchange format, as compression is specified in the plane
241     * descriptor on Valhall.
242     */
243    FMT(ETC1_RGB8,               RGBA8_UNORM,     RGB1, L, _T__),
244    FMT(ETC2_RGB8,               RGBA8_UNORM,     RGB1, L, _T__),
245    FMT(ETC2_SRGB8,              RGBA8_UNORM,     RGB1, S, _T__),
246    FMT(ETC2_R11_UNORM,          R16_UNORM,       R001, L, _T__),
247    FMT(ETC2_RGBA8,              RGBA8_UNORM,     RGBA, L, _T__),
248    FMT(ETC2_SRGBA8,             RGBA8_UNORM,     RGBA, S, _T__),
249    FMT(ETC2_RG11_UNORM,         RG16_UNORM,      RG01, L, _T__),
250    FMT(ETC2_R11_SNORM,          R16_SNORM,       R001, L, _T__),
251    FMT(ETC2_RG11_SNORM,         RG16_SNORM,      RG01, L, _T__),
252    FMT(ETC2_RGB8A1,             RGBA8_UNORM,     RGBA, L, _T__),
253    FMT(ETC2_SRGB8A1,            RGBA8_UNORM,     RGBA, S, _T__),
254    FMT(DXT1_RGB,                RGBA8_UNORM,     RGB1, L, _T__),
255    FMT(DXT1_RGBA,               RGBA8_UNORM,     RGBA, L, _T__),
256    FMT(DXT1_SRGB,               RGBA8_UNORM,     RGB1, S, _T__),
257    FMT(DXT1_SRGBA,              RGBA8_UNORM,     RGBA, S, _T__),
258    FMT(DXT3_RGBA,               RGBA8_UNORM,     RGBA, L, _T__),
259    FMT(DXT3_SRGBA,              RGBA8_UNORM,     RGBA, S, _T__),
260    FMT(DXT5_RGBA,               RGBA8_UNORM,     RGBA, L, _T__),
261    FMT(DXT5_SRGBA,              RGBA8_UNORM,     RGBA, S, _T__),
262    FMT(RGTC1_UNORM,             R16_UNORM,       R001, L, _T__),
263    FMT(RGTC1_SNORM,             R16_SNORM,       R001, L, _T__),
264    FMT(RGTC2_UNORM,             RG16_UNORM,      RG01, L, _T__),
265    FMT(RGTC2_SNORM,             RG16_SNORM,      RG01, L, _T__),
266    FMT(BPTC_RGB_FLOAT,          RGBA16F,         RGB1, L, _T__),
267    FMT(BPTC_RGB_UFLOAT,         RGBA16F,         RGB1, L, _T__),
268    FMT(BPTC_RGBA_UNORM,         RGBA8_UNORM,     RGBA, L, _T__),
269    FMT(BPTC_SRGBA,              RGBA8_UNORM,     RGBA, S, _T__),
270 
271    /* If astc decode mode is set to RGBA8, the hardware format
272     * will be overriden to RGBA8_UNORM later on.
273     */
274    FMT(ASTC_4x4,                RGBA16F,         RGBA, L, _T__),
275    FMT(ASTC_5x4,                RGBA16F,         RGBA, L, _T__),
276    FMT(ASTC_5x5,                RGBA16F,         RGBA, L, _T__),
277    FMT(ASTC_6x5,                RGBA16F,         RGBA, L, _T__),
278    FMT(ASTC_6x6,                RGBA16F,         RGBA, L, _T__),
279    FMT(ASTC_8x5,                RGBA16F,         RGBA, L, _T__),
280    FMT(ASTC_8x6,                RGBA16F,         RGBA, L, _T__),
281    FMT(ASTC_8x8,                RGBA16F,         RGBA, L, _T__),
282    FMT(ASTC_10x5,               RGBA16F,         RGBA, L, _T__),
283    FMT(ASTC_10x6,               RGBA16F,         RGBA, L, _T__),
284    FMT(ASTC_10x8,               RGBA16F,         RGBA, L, _T__),
285    FMT(ASTC_10x10,              RGBA16F,         RGBA, L, _T__),
286    FMT(ASTC_12x10,              RGBA16F,         RGBA, L, _T__),
287    FMT(ASTC_12x12,              RGBA16F,         RGBA, L, _T__),
288    FMT(ASTC_3x3x3,              RGBA16F,         RGBA, L, _T__),
289    FMT(ASTC_4x3x3,              RGBA16F,         RGBA, L, _T__),
290    FMT(ASTC_4x4x3,              RGBA16F,         RGBA, L, _T__),
291    FMT(ASTC_4x4x4,              RGBA16F,         RGBA, L, _T__),
292    FMT(ASTC_5x4x4,              RGBA16F,         RGBA, L, _T__),
293    FMT(ASTC_5x5x4,              RGBA16F,         RGBA, L, _T__),
294    FMT(ASTC_5x5x5,              RGBA16F,         RGBA, L, _T__),
295    FMT(ASTC_6x5x5,              RGBA16F,         RGBA, L, _T__),
296    FMT(ASTC_6x6x5,              RGBA16F,         RGBA, L, _T__),
297    FMT(ASTC_6x6x6,              RGBA16F,         RGBA, L, _T__),
298 
299    /* By definition, sRGB formats are narrow */
300    FMT(ASTC_4x4_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
301    FMT(ASTC_5x4_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
302    FMT(ASTC_5x5_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
303    FMT(ASTC_6x5_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
304    FMT(ASTC_6x6_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
305    FMT(ASTC_8x5_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
306    FMT(ASTC_8x6_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
307    FMT(ASTC_8x8_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
308    FMT(ASTC_10x5_SRGB,          RGBA8_UNORM,     RGBA, S, _T__),
309    FMT(ASTC_10x6_SRGB,          RGBA8_UNORM,     RGBA, S, _T__),
310    FMT(ASTC_10x8_SRGB,          RGBA8_UNORM,     RGBA, S, _T__),
311    FMT(ASTC_10x10_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
312    FMT(ASTC_12x10_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
313    FMT(ASTC_12x12_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
314    FMT(ASTC_3x3x3_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
315    FMT(ASTC_4x3x3_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
316    FMT(ASTC_4x4x3_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
317    FMT(ASTC_4x4x4_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
318    FMT(ASTC_5x4x4_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
319    FMT(ASTC_5x5x4_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
320    FMT(ASTC_5x5x5_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
321    FMT(ASTC_6x5x5_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
322    FMT(ASTC_6x6x5_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
323 #endif
324 
325    FMT(R5G6B5_UNORM,            RGB565,          RGB1, L, VTR_),
326    FMT(B5G6R5_UNORM,            RGB565,          BGR1, L, VTR_),
327    FMT(R5G5B5X1_UNORM,          RGB5_A1_UNORM,   RGB1, L, VT__),
328    FMT(B5G5R5X1_UNORM,          RGB5_A1_UNORM,   BGR1, L, VT__),
329    FMT(R5G5B5A1_UNORM,          RGB5_A1_UNORM,   RGBA, L, VTR_),
330    FMT(B5G5R5A1_UNORM,          RGB5_A1_UNORM,   BGRA, L, VTR_),
331    FMT(R10G10B10X2_UNORM,       RGB10_A2_UNORM,  RGB1, L, VTR_),
332    FMT(B10G10R10X2_UNORM,       RGB10_A2_UNORM,  BGR1, L, VTR_),
333    FMT(R10G10B10A2_UNORM,       RGB10_A2_UNORM,  RGBA, L, VTR_),
334    FMT(B10G10R10A2_UNORM,       RGB10_A2_UNORM,  BGRA, L, VTR_),
335 #if PAN_ARCH <= 5
336    FMT(R10G10B10X2_SNORM,       RGB10_A2_SNORM,  RGB1, L, VT__),
337    FMT(R10G10B10A2_SNORM,       RGB10_A2_SNORM,  RGBA, L, VT__),
338    FMT(B10G10R10A2_SNORM,       RGB10_A2_SNORM,  BGRA, L, VT__),
339    FMT(R3G3B2_UNORM,            RGB332_UNORM,    RGB1, L, VT__),
340 #else
341    FMT(R10G10B10X2_SNORM,       RGB10_A2_SNORM,  RGB1, L, V___),
342    FMT(R10G10B10A2_SNORM,       RGB10_A2_SNORM,  RGBA, L, V___),
343    FMT(B10G10R10A2_SNORM,       RGB10_A2_SNORM,  BGRA, L, V___),
344 #endif
345    FMT(R10G10B10A2_UINT,        RGB10_A2UI,      RGBA, L, VTR_),
346    FMT(B10G10R10A2_UINT,        RGB10_A2UI,      BGRA, L, VTR_),
347    FMT(R10G10B10A2_USCALED,     RGB10_A2UI,      RGBA, L, V___),
348    FMT(B10G10R10A2_USCALED,     RGB10_A2UI,      BGRA, L, V___),
349    FMT(R10G10B10A2_SINT,        RGB10_A2I,       RGBA, L, VTR_),
350    FMT(B10G10R10A2_SINT,        RGB10_A2I,       BGRA, L, VTR_),
351    FMT(R10G10B10A2_SSCALED,     RGB10_A2I,       RGBA, L, V___),
352    FMT(B10G10R10A2_SSCALED,     RGB10_A2I,       BGRA, L, V___),
353    FMT(R8_SSCALED,              R8I,             R001, L, V___),
354    FMT(R8G8_SSCALED,            RG8I,            RG01, L, V___),
355    FMT(R8G8B8_SSCALED,          RGB8I,           RGB1, L, V___),
356    FMT(B8G8R8_SSCALED,          RGB8I,           BGR1, L, V___),
357    FMT(R8G8B8A8_SSCALED,        RGBA8I,          RGBA, L, V___),
358    FMT(B8G8R8A8_SSCALED,        RGBA8I,          BGRA, L, V___),
359    FMT(A8B8G8R8_SSCALED,        RGBA8I,          ABGR, L, V___),
360    FMT(R8_USCALED,              R8UI,            R001, L, V___),
361    FMT(R8G8_USCALED,            RG8UI,           RG01, L, V___),
362    FMT(R8G8B8_USCALED,          RGB8UI,          RGB1, L, V___),
363    FMT(B8G8R8_USCALED,          RGB8UI,          BGR1, L, V___),
364    FMT(R8G8B8A8_USCALED,        RGBA8UI,         RGBA, L, V___),
365    FMT(B8G8R8A8_USCALED,        RGBA8UI,         BGRA, L, V___),
366    FMT(A8B8G8R8_USCALED,        RGBA8UI,         ABGR, L, V___),
367    FMT(R16_USCALED,             R16UI,           R001, L, V___),
368    FMT(R16G16_USCALED,          RG16UI,          RG01, L, V___),
369    FMT(R16G16B16A16_USCALED,    RGBA16UI,        RGBA, L, V___),
370    FMT(R16_SSCALED,             R16I,            R001, L, V___),
371    FMT(R16G16_SSCALED,          RG16I,           RG01, L, V___),
372    FMT(R16G16B16A16_SSCALED,    RGBA16I,         RGBA, L, V___),
373    FMT(R32_USCALED,             R32UI,           R001, L, V___),
374    FMT(R32G32_USCALED,          RG32UI,          RG01, L, V___),
375    FMT(R32G32B32_USCALED,       RGB32UI,         RGB1, L, V___),
376    FMT(R32G32B32A32_USCALED,    RGBA32UI,        RGBA, L, V___),
377    FMT(R32_SSCALED,             R32I,            R001, L, V___),
378    FMT(R32G32_SSCALED,          RG32I,           RG01, L, V___),
379    FMT(R32G32B32_SSCALED,       RGB32I,          RGB1, L, V___),
380    FMT(R32G32B32A32_SSCALED,    RGBA32I,         RGBA, L, V___),
381    FMT(R32_FIXED,               R32_FIXED,       R001, L, V___),
382    FMT(R32G32_FIXED,            RG32_FIXED,      RG01, L, V___),
383    FMT(R32G32B32_FIXED,         RGB32_FIXED,     RGB1, L, V___),
384    FMT(R32G32B32A32_FIXED,      RGBA32_FIXED,    RGBA, L, V___),
385    FMT(R11G11B10_FLOAT,         R11F_G11F_B10F,  RGB1, L, VTR_),
386    FMT(R9G9B9E5_FLOAT,          R9F_G9F_B9F_E5F, RGB1, L, VT__),
387 #if PAN_ARCH >= 6
388    /* SNORM is renderable on Bifrost (with blend shaders) */
389    FMT(R8_SNORM,                R8_SNORM,        R001, L, VTR_),
390    FMT(R16_SNORM,               R16_SNORM,       R001, L, VTR_),
391    FMT(R8G8_SNORM,              RG8_SNORM,       RG01, L, VTR_),
392    FMT(R16G16_SNORM,            RG16_SNORM,      RG01, L, VTR_),
393    FMT(R8G8B8_SNORM,            RGB8_SNORM,      RGB1, L, VTR_),
394    FMT(R8G8B8A8_SNORM,          RGBA8_SNORM,     RGBA, L, VTR_),
395    FMT(B8G8R8A8_SNORM,          RGBA8_SNORM,     BGRA, L, VTR_),
396    FMT(R16G16B16A16_SNORM,      RGBA16_SNORM,    RGBA, L, VTR_),
397 #else
398    /* So far we haven't needed SNORM rendering on Midgard */
399    FMT(R8_SNORM,                R8_SNORM,        R001, L, VT__),
400    FMT(R16_SNORM,               R16_SNORM,       R001, L, VT__),
401    FMT(R8G8_SNORM,              RG8_SNORM,       RG01, L, VT__),
402    FMT(R16G16_SNORM,            RG16_SNORM,      RG01, L, VT__),
403    FMT(R8G8B8_SNORM,            RGB8_SNORM,      RGB1, L, VT__),
404    FMT(R8G8B8A8_SNORM,          RGBA8_SNORM,     RGBA, L, VT__),
405    FMT(B8G8R8A8_SNORM,          RGBA8_SNORM,     BGRA, L, VT__),
406    FMT(R16G16B16A16_SNORM,      RGBA16_SNORM,    RGBA, L, VT__),
407 #endif
408    FMT(I8_SINT,                 R8I,             RRRR, L, VTR_),
409    FMT(L8_SINT,                 R8I,             RRR1, L, VTR_),
410    FMT(I8_UINT,                 R8UI,            RRRR, L, VTR_),
411    FMT(L8_UINT,                 R8UI,            RRR1, L, VTR_),
412    FMT(I16_SINT,                R16I,            RRRR, L, VTR_),
413    FMT(L16_SINT,                R16I,            RRR1, L, VTR_),
414    FMT(I16_UINT,                R16UI,           RRRR, L, VTR_),
415    FMT(L16_UINT,                R16UI,           RRR1, L, VTR_),
416    FMT(I32_SINT,                R32I,            RRRR, L, VTR_),
417    FMT(L32_SINT,                R32I,            RRR1, L, VTR_),
418    FMT(I32_UINT,                R32UI,           RRRR, L, VTR_),
419    FMT(L32_UINT,                R32UI,           RRR1, L, VTR_),
420    FMT(B8G8R8_UINT,             RGB8UI,          BGR1, L, V___),
421    FMT(B8G8R8_SINT,             RGB8I,           BGR1, L, V___),
422    FMT(B8G8R8A8_UINT,           RGBA8UI,         BGRA, L, VTR_),
423    FMT(B8G8R8A8_SINT,           RGBA8I,          BGRA, L, VTR_),
424    FMT(A8R8G8B8_UINT,           RGBA8UI,         GBAR, L, VTR_),
425    FMT(A8B8G8R8_UINT,           RGBA8UI,         ABGR, L, VTR_),
426    FMT(R8_UINT,                 R8UI,            R001, L, VTR_),
427    FMT(R16_UINT,                R16UI,           R001, L, VTR_),
428    FMT(R32_UINT,                R32UI,           R001, L, VTR_),
429    FMT(R8G8_UINT,               RG8UI,           RG01, L, VTR_),
430    FMT(R16G16_UINT,             RG16UI,          RG01, L, VTR_),
431    FMT(R32G32_UINT,             RG32UI,          RG01, L, VTR_),
432    FMT(R8G8B8_UINT,             RGB8UI,          RGB1, L, V___),
433    FMT(R32G32B32_UINT,          RGB32UI,         RGB1, L, VTR_),
434    FMT(R8G8B8A8_UINT,           RGBA8UI,         RGBA, L, VTR_),
435    FMT(R16G16B16A16_UINT,       RGBA16UI,        RGBA, L, VTR_),
436    FMT(R32G32B32A32_UINT,       RGBA32UI,        RGBA, L, VTR_),
437    FMT(R32_FLOAT,               R32F,            R001, L, VTR_),
438    FMT(R32G32_FLOAT,            RG32F,           RG01, L, VTR_),
439    FMT(R32G32B32_FLOAT,         RGB32F,          RGB1, L, VTR_),
440    FMT(R32G32B32A32_FLOAT,      RGBA32F,         RGBA, L, VTR_),
441    FMT(R8_UNORM,                R8_UNORM,        R001, L, VTR_),
442    FMT(R16_UNORM,               R16_UNORM,       R001, L, VTR_),
443    FMT(R8G8_UNORM,              RG8_UNORM,       RG01, L, VTR_),
444    FMT(R16G16_UNORM,            RG16_UNORM,      RG01, L, VTR_),
445    FMT(R8G8B8_UNORM,            RGB8_UNORM,      RGB1, L, V___),
446 
447    /* 32-bit NORM is not texturable in v7 onwards. It's renderable
448     * everywhere, but rendering without texturing is not useful.
449     */
450 #if PAN_ARCH <= 6
451    FMT(R32_UNORM,               R32_UNORM,       R001, L, VTR_),
452    FMT(R32G32_UNORM,            RG32_UNORM,      RG01, L, VTR_),
453    FMT(R32G32B32_UNORM,         RGB32_UNORM,     RGB1, L, VT__),
454    FMT(R32G32B32A32_UNORM,      RGBA32_UNORM,    RGBA, L, VTR_),
455    FMT(R32_SNORM,               R32_SNORM,       R001, L, VT__),
456    FMT(R32G32_SNORM,            RG32_SNORM,      RG01, L, VT__),
457    FMT(R32G32B32_SNORM,         RGB32_SNORM,     RGB1, L, VT__),
458    FMT(R32G32B32A32_SNORM,      RGBA32_SNORM,    RGBA, L, VT__),
459 #else
460    FMT(R32_UNORM,               R32_UNORM,       R001, L, V___),
461    FMT(R32G32_UNORM,            RG32_UNORM,      RG01, L, V___),
462    FMT(R32G32B32_UNORM,         RGB32_UNORM,     RGB1, L, V___),
463    FMT(R32G32B32A32_UNORM,      RGBA32_UNORM,    RGBA, L, V___),
464    FMT(R32_SNORM,               R32_SNORM,       R001, L, V___),
465    FMT(R32G32_SNORM,            RG32_SNORM,      RG01, L, V___),
466    FMT(R32G32B32_SNORM,         RGB32_SNORM,     RGB1, L, V___),
467    FMT(R32G32B32A32_SNORM,      RGBA32_SNORM,    RGBA, L, V___),
468 #endif
469 
470    /* Don't allow render/texture for 48-bit  */
471    FMT(R16G16B16_UNORM,         RGB16_UNORM,     RGB1, L, V___),
472    FMT(R16G16B16_SINT,          RGB16I,          RGB1, L, V___),
473    FMT(R16G16B16_FLOAT,         RGB16F,          RGB1, L, V___),
474    FMT(R16G16B16_USCALED,       RGB16UI,         RGB1, L, V___),
475    FMT(R16G16B16_SSCALED,       RGB16I,          RGB1, L, V___),
476    FMT(R16G16B16_SNORM,         RGB16_SNORM,     RGB1, L, V___),
477    FMT(R16G16B16_UINT,          RGB16UI,         RGB1, L, V___),
478    FMT(R4G4B4A4_UNORM,          RGBA4_UNORM,     RGBA, L, VTR_),
479    FMT(B4G4R4A4_UNORM,          RGBA4_UNORM,     BGRA, L, VTR_),
480    FMT(R16G16B16A16_UNORM,      RGBA16_UNORM,    RGBA, L, VTR_),
481    FMT(B8G8R8A8_UNORM,          RGBA8_UNORM,     BGRA, L, VTR_),
482    FMT(B8G8R8X8_UNORM,          RGBA8_UNORM,     BGR1, L, VTR_),
483    FMT(A8R8G8B8_UNORM,          RGBA8_UNORM,     GBAR, L, VTR_),
484    FMT(X8R8G8B8_UNORM,          RGBA8_UNORM,     GBA1, L, VTR_),
485    FMT(A8B8G8R8_UNORM,          RGBA8_UNORM,     ABGR, L, VTR_),
486    FMT(X8B8G8R8_UNORM,          RGBA8_UNORM,     ABG1, L, VTR_),
487    FMT(R8G8B8X8_UNORM,          RGBA8_UNORM,     RGB1, L, VTR_),
488    FMT(R8G8B8A8_UNORM,          RGBA8_UNORM,     RGBA, L, VTR_),
489    FMT(R8G8B8X8_SNORM,          RGBA8_SNORM,     RGB1, L, VT__),
490    FMT(R8G8B8X8_SRGB,           RGBA8_UNORM,     RGB1, S, VTR_),
491    FMT(R8G8B8X8_UINT,           RGBA8UI,         RGB1, L, VTR_),
492    FMT(R8G8B8X8_SINT,           RGBA8I,          RGB1, L, VTR_),
493    FMT(L8_UNORM,                R8_UNORM,        RRR1, L, VTR_),
494    FMT(I8_UNORM,                R8_UNORM,        RRRR, L, VTR_),
495    FMT(L16_UNORM,               R16_UNORM,       RRR1, L, VT__),
496    FMT(I16_UNORM,               R16_UNORM,       RRRR, L, VT__),
497    FMT(L8_SNORM,                R8_SNORM,        RRR1, L, VT__),
498    FMT(I8_SNORM,                R8_SNORM,        RRRR, L, VT__),
499    FMT(L16_SNORM,               R16_SNORM,       RRR1, L, VT__),
500    FMT(I16_SNORM,               R16_SNORM,       RRRR, L, VT__),
501    FMT(L16_FLOAT,               R16F,            RRR1, L, VTR_),
502    FMT(I16_FLOAT,               RG16F,           RRRR, L, VTR_),
503    FMT(L8_SRGB,                 R8_UNORM,        RRR1, S, VTR_),
504    FMT(R8_SRGB,                 R8_UNORM,        R001, S, VTR_),
505    FMT(R8G8_SRGB,               RG8_UNORM,       RG01, S, VTR_),
506    FMT(R8G8B8_SRGB,             RGB8_UNORM,      RGB1, S, V___),
507    FMT(B8G8R8_SRGB,             RGB8_UNORM,      BGR1, S, V___),
508    FMT(R8G8B8A8_SRGB,           RGBA8_UNORM,     RGBA, S, VTR_),
509    FMT(A8B8G8R8_SRGB,           RGBA8_UNORM,     ABGR, S, VTR_),
510    FMT(X8B8G8R8_SRGB,           RGBA8_UNORM,     ABG1, S, VTR_),
511    FMT(B8G8R8A8_SRGB,           RGBA8_UNORM,     BGRA, S, VTR_),
512    FMT(B8G8R8X8_SRGB,           RGBA8_UNORM,     BGR1, S, VTR_),
513    FMT(A8R8G8B8_SRGB,           RGBA8_UNORM,     GBAR, S, VTR_),
514    FMT(X8R8G8B8_SRGB,           RGBA8_UNORM,     GBA1, S, VTR_),
515    FMT(R8_SINT,                 R8I,             R001, L, VTR_),
516    FMT(R16_SINT,                R16I,            R001, L, VTR_),
517    FMT(R32_SINT,                R32I,            R001, L, VTR_),
518    FMT(R16_FLOAT,               R16F,            R001, L, VTR_),
519    FMT(R8G8_SINT,               RG8I,            RG01, L, VTR_),
520    FMT(R16G16_SINT,             RG16I,           RG01, L, VTR_),
521    FMT(R32G32_SINT,             RG32I,           RG01, L, VTR_),
522    FMT(R16G16_FLOAT,            RG16F,           RG01, L, VTR_),
523    FMT(R8G8B8_SINT,             RGB8I,           RGB1, L, V___),
524    FMT(R32G32B32_SINT,          RGB32I,          RGB1, L, VTR_),
525    FMT(R8G8B8A8_SINT,           RGBA8I,          RGBA, L, VTR_),
526    FMT(R16G16B16A16_SINT,       RGBA16I,         RGBA, L, VTR_),
527    FMT(R32G32B32A32_SINT,       RGBA32I,         RGBA, L, VTR_),
528    FMT(R16G16B16A16_FLOAT,      RGBA16F,         RGBA, L, VTR_),
529    FMT(R16G16B16X16_UNORM,      RGBA16_UNORM,    RGB1, L, VTR_),
530    FMT(R16G16B16X16_SNORM,      RGBA16_SNORM,    RGB1, L, VT__),
531    FMT(R16G16B16X16_FLOAT,      RGBA16F,         RGB1, L, VTR_),
532    FMT(R16G16B16X16_UINT,       RGBA16UI,        RGB1, L, VTR_),
533    FMT(R16G16B16X16_SINT,       RGBA16I,         RGB1, L, VTR_),
534    FMT(R32G32B32X32_FLOAT,      RGBA32F,         RGB1, L, VTR_),
535    FMT(R32G32B32X32_UINT,       RGBA32UI,        RGB1, L, VTR_),
536    FMT(R32G32B32X32_SINT,       RGBA32I,         RGB1, L, VTR_),
537 
538 #if PAN_ARCH <= 6
539    FMT(Z16_UNORM,               R16_UNORM,       RRRR, L, _T_Z),
540    FMT(Z24_UNORM_S8_UINT,       Z24X8_UNORM,     RRRR, L, _T_Z),
541    FMT(Z24X8_UNORM,             Z24X8_UNORM,     RRRR, L, _T_Z),
542    FMT(Z32_FLOAT,               R32F,            RRRR, L, _T_Z),
543    FMT(Z32_FLOAT_S8X24_UINT,    RG32F,           RRRR, L, _T_Z),
544    FMT(X32_S8X24_UINT,          X32_S8X24,       GGGG, L, _T_Z),
545    FMT(X24S8_UINT,              RGBA8UI,         AAAA, L, _T_Z),
546    FMT(S8_UINT,                 R8UI,            RRRR, L, _T__),
547 
548    FMT(A8_UNORM,                R8_UNORM,        000R, L, VTR_),
549    FMT(L8A8_UNORM,              RG8_UNORM,       RRRG, L, VTR_),
550    FMT(L8A8_SRGB,               RG8_UNORM,       RRRG, S, VTR_),
551 
552    /* These formats were removed in v7 */
553    FMT(A8_SNORM,                R8_SNORM,        000R, L, VT__),
554    FMT(A8_SINT,                 R8I,             000R, L, VTR_),
555    FMT(A8_UINT,                 R8UI,            000R, L, VTR_),
556    FMT(A16_SINT,                R16I,            000R, L, VTR_),
557    FMT(A16_UINT,                R16UI,           000R, L, VTR_),
558    FMT(A32_SINT,                R32I,            000R, L, VTR_),
559    FMT(A32_UINT,                R32UI,           000R, L, VTR_),
560    FMT(A16_UNORM,               R16_UNORM,       000R, L, VT__),
561    FMT(A16_SNORM,               R16_SNORM,       000R, L, VT__),
562    FMT(A16_FLOAT,               R16F,            000R, L, VTR_),
563 
564 #else
565    FMT(Z16_UNORM,               Z16_UNORM,       RGBA, L, _T_Z),
566    FMT(Z24_UNORM_S8_UINT,       Z24X8_UNORM,     RGBA, L, _T_Z),
567    FMT(Z24X8_UNORM,             Z24X8_UNORM,     RGBA, L, _T_Z),
568    FMT(Z32_FLOAT,               R32F,            RGBA, L, _T_Z),
569 
570 #if PAN_ARCH >= 9
571    /* Specify interchange formats, the actual format for depth/stencil is
572     * determined by the plane descriptor on Valhall.
573     *
574     * On Valhall, S8 logically acts like "X8S8", so "S8 RGBA" is logically
575     * "0s00" and "S8 GRBA" is logically "s000". For Bifrost compatibility
576     * we want stencil in the red channel, so we use the GRBA swizzles.
577     */
578    FMT(Z32_FLOAT_S8X24_UINT,    R32F,            GRBA, L, _T_Z),
579    FMT(X32_S8X24_UINT,          S8,              GRBA, L, _T__),
580    FMT(X24S8_UINT,              S8,              GRBA, L, _T_Z),
581    FMT(S8_UINT,                 S8,              GRBA, L, _T__),
582 
583 #else
584    /* Specify real formats on Bifrost */
585    FMT(Z32_FLOAT_S8X24_UINT,    Z32_X32,         RGBA, L, _T_Z),
586    FMT(X32_S8X24_UINT,          X32_S8X24,       GRBA, L, _T__),
587    FMT(X24S8_UINT,              X24S8,           GRBA, L, _T_Z),
588    FMT(S8_UINT,                 S8,              GRBA, L, _T__),
589 
590    /* Obsolete formats removed in Valhall */
591    FMT(A8_UNORM,                A8_UNORM,        000A, L, VTR_),
592    FMT(L8A8_UNORM,              R8A8_UNORM,      RRRA, L, VTR_),
593    FMT(L8A8_SRGB,               R8A8_UNORM,      RRRA, S, VTR_),
594 #endif
595 
596 #endif
597 };
598 /* clang-format on */
599 
600 #if PAN_ARCH == 7 || PAN_ARCH >= 10
601 /*
602  * Decompose a component ordering swizzle into a component ordering (applied
603  * first) and a swizzle (applied second). The output ordering "pre" is allowed
604  * with compression and the swizzle "post" is a bijection.
605  *
606  * These properties allow any component ordering to be used with compression, by
607  * using the output "pre" ordering, composing the API swizzle with the "post"
608  * ordering, and applying the inverse of the "post" ordering to the border
609  * colour to undo what we compose into the API swizzle.
610  *
611  * Note that "post" is a swizzle, not a component ordering, which means it is
612  * inverted from the ordering. E.g. ARGB ordering uses a GBAR (YZWX) swizzle.
613  */
614 struct pan_decomposed_swizzle
GENX(pan_decompose_swizzle)615 GENX(pan_decompose_swizzle)(enum mali_rgb_component_order order)
616 {
617 #define CASE(case_, pre_, R_, G_, B_, A_)                                      \
618    case MALI_RGB_COMPONENT_ORDER_##case_:                                      \
619       return (struct pan_decomposed_swizzle){                                  \
620          MALI_RGB_COMPONENT_ORDER_##pre_,                                      \
621          {                                                                     \
622             PIPE_SWIZZLE_##R_,                                                 \
623             PIPE_SWIZZLE_##G_,                                                 \
624             PIPE_SWIZZLE_##B_,                                                 \
625             PIPE_SWIZZLE_##A_,                                                 \
626          },                                                                    \
627       };
628 
629    switch (order) {
630       CASE(RGBA, RGBA, X, Y, Z, W);
631       CASE(GRBA, RGBA, Y, X, Z, W);
632       CASE(BGRA, RGBA, Z, Y, X, W);
633       CASE(ARGB, RGBA, Y, Z, W, X);
634       CASE(AGRB, RGBA, Z, Y, W, X);
635       CASE(ABGR, RGBA, W, Z, Y, X);
636       CASE(RGB1, RGB1, X, Y, Z, W);
637       CASE(GRB1, RGB1, Y, X, Z, W);
638       CASE(BGR1, RGB1, Z, Y, X, W);
639       CASE(1RGB, RGB1, Y, Z, W, X);
640       CASE(1GRB, RGB1, Z, Y, W, X);
641       CASE(1BGR, RGB1, W, Z, Y, X);
642       CASE(RRRR, RRRR, X, Y, Z, W);
643       CASE(RRR1, RRR1, X, Y, Z, W);
644       CASE(RRRA, RRRA, X, Y, Z, W);
645       CASE(000A, 000A, X, Y, Z, W);
646       CASE(0001, 0001, X, Y, Z, W);
647       CASE(0000, 0000, X, Y, Z, W);
648    default:
649       unreachable("Invalid case for texturing");
650    }
651 
652 #undef CASE
653 }
654 #endif
655