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