1 /*
2 * Copyright © 2022 Collabora Ltd.
3 * SPDX-License-Identifier: MIT
4 */
5 #include "nil_format.h"
6
7 #include "nouveau_device.h"
8
9 #include "cl9097.h"
10 #include "cl9097tex.h"
11 #include "cla297.h"
12 #include "clb097.h"
13 #include "clb097tex.h"
14
15 enum nil_format_support_flags {
16 NIL_FORMAT_SUPPORTS_TEXTURE_BIT = BITFIELD_BIT(0),
17 NIL_FORMAT_SUPPORTS_BUFFER_BIT = BITFIELD_BIT(1),
18 NIL_FORMAT_SUPPORTS_STORAGE_BIT = BITFIELD_BIT(2),
19 NIL_FORMAT_SUPPORTS_RENDER_BIT = BITFIELD_BIT(3),
20 NIL_FORMAT_SUPPORTS_ALPHA_BLEND_BIT = BITFIELD_BIT(4),
21 NIL_FORMAT_SUPPORTS_DEPTH_STENCIL_BIT = BITFIELD_BIT(5),
22 NIL_FORMAT_SUPPORTS_SCANOUT_BIT = BITFIELD_BIT(6),
23 };
24
25 struct nil_format_info {
26 /* Color of depth/stencil target format */
27 unsigned czt:8;
28 unsigned support:24;
29 struct nil_tic_format tic;
30 };
31
32 /* Abbreviated usage masks:
33 * T: texturing
34 * B: texture buffer, implies T
35 * R: render target
36 * A: render target, alpha-blendable
37 * C: render target (color), blendable only on nvc0
38 * D: scanout/display target, blendable
39 * Z: depth/stencil
40 * I: image / surface, implies T
41 * S: image / surface only
42 */
43 #define U_T NIL_FORMAT_SUPPORTS_TEXTURE_BIT
44 #define U_S NIL_FORMAT_SUPPORTS_STORAGE_BIT
45 #define U_B U_T | NIL_FORMAT_SUPPORTS_BUFFER_BIT
46 #define U_I U_B | U_S
47 #define U_TR NIL_FORMAT_SUPPORTS_RENDER_BIT | U_T
48 #define U_BR NIL_FORMAT_SUPPORTS_RENDER_BIT | U_B
49 #define U_IR NIL_FORMAT_SUPPORTS_RENDER_BIT | U_I
50 #define U_TA NIL_FORMAT_SUPPORTS_ALPHA_BLEND_BIT | U_TR
51 #define U_IA NIL_FORMAT_SUPPORTS_ALPHA_BLEND_BIT | U_IR
52 #define U_TD NIL_FORMAT_SUPPORTS_SCANOUT_BIT | U_TA
53 #define U_TZ NIL_FORMAT_SUPPORTS_DEPTH_STENCIL_BIT | U_T
54 #define U_ID U_TD | U_I
55 #define U_TC U_TA
56 #define U_IC U_IA
57 #define U_t U_T
58
59 #define SF_A(sz) NV9097_TEXHEAD0_COMPONENT_SIZES_##sz
60 #define SF_B(sz) NV9097_TEXHEAD0_COMPONENT_SIZES_##sz
61 #define SF_C(sz) NV9097_TEXHEAD0_COMPONENT_SIZES_##sz
62 #define SF_D(sz) NVB097_TEXHEAD_BL_COMPONENTS_SIZES_##sz
63 #define SF(c, pf, sf, r, g, b, a, t0, t1, t2, t3, sz, u) \
64 [PIPE_FORMAT_##pf] = { \
65 .czt = sf, \
66 .support = U_##u, \
67 .tic = { \
68 SF_##c(sz), \
69 NV9097_TEXHEAD0_R_DATA_TYPE_NUM_##t0, \
70 NV9097_TEXHEAD0_G_DATA_TYPE_NUM_##t1, \
71 NV9097_TEXHEAD0_B_DATA_TYPE_NUM_##t2, \
72 NV9097_TEXHEAD0_A_DATA_TYPE_NUM_##t3, \
73 NV9097_TEXHEAD0_X_SOURCE_IN_##r, \
74 NV9097_TEXHEAD0_Y_SOURCE_IN_##g, \
75 NV9097_TEXHEAD0_Z_SOURCE_IN_##b, \
76 NV9097_TEXHEAD0_W_SOURCE_IN_##a, \
77 } \
78 }
79
80 #define NV9097_SET_COLOR_TARGET_FORMAT_V_NONE \
81 NV9097_SET_COLOR_TARGET_FORMAT_V_DISABLED
82
83 #define C4(c, p, n, r, g, b, a, t, s, u) \
84 SF(c, p, NV9097_SET_COLOR_TARGET_FORMAT_V_##n, r, g, b, a, t, t, t, t, s, u)
85
86 #define ZX(c, p, n, r, t, s, u) \
87 SF(c, p, NV9097_SET_ZT_FORMAT_V_##n, \
88 r, ZERO, ZERO, ONE_FLOAT, t, UINT, UINT, UINT, s, u)
89 #define ZS(c, p, n, r, t, s, u) \
90 SF(c, p, NV9097_SET_ZT_FORMAT_V_##n, \
91 r, ZERO, ZERO, ONE_FLOAT, t, UINT, UINT, UINT, s, u)
92 #define SZ(c, p, n, r, t, s, u) \
93 SF(c, p, NV9097_SET_ZT_FORMAT_V_##n, \
94 r, ZERO, ZERO, ONE_FLOAT, UINT, t, UINT, UINT, s, u)
95 #define SX(c, p, r, s, u) \
96 SF(c, p, 0, r, ZERO, ZERO, ONE_INT, UINT, UINT, UINT, UINT, s, u)
97
98 #define F3(c, p, n, r, g, b, a, t, s, u) \
99 C4(c, p, n, r, g, b, ONE_FLOAT, t, s, u)
100 #define I3(c, p, n, r, g, b, a, t, s, u) \
101 C4(c, p, n, r, g, b, ONE_INT, t, s, u)
102
103 #define F2(c, p, n, r, g, b, a, t, s, u) \
104 C4(c, p, n, r, g, ZERO, ONE_FLOAT, t, s, u)
105 #define I2(c, p, n, r, g, b, a, t, s, u) \
106 C4(c, p, n, r, g, ZERO, ONE_INT, t, s, u)
107
108 #define F1(c, p, n, r, g, b, a, t, s, u) \
109 C4(c, p, n, r, ZERO, ZERO, ONE_FLOAT, t, s, u)
110 #define I1(c, p, n, r, g, b, a, t, s, u) \
111 C4(c, p, n, r, ZERO, ZERO, ONE_INT, t, s, u)
112
113 #define A1(c, p, n, r, g, b, a, t, s, u) \
114 C4(c, p, n, ZERO, ZERO, ZERO, a, t, s, u)
115
116 static const struct nil_format_info nil_format_infos[PIPE_FORMAT_COUNT] =
117 {
118 C4(A, B8G8R8A8_UNORM, A8R8G8B8, B, G, R, A, UNORM, A8B8G8R8, ID),
119 F3(A, B8G8R8X8_UNORM, X8R8G8B8, B, G, R, x, UNORM, A8B8G8R8, TD),
120 C4(A, B8G8R8A8_SRGB, A8RL8GL8BL8, B, G, R, A, UNORM, A8B8G8R8, TD),
121 F3(A, B8G8R8X8_SRGB, X8RL8GL8BL8, B, G, R, x, UNORM, A8B8G8R8, TD),
122 C4(A, R8G8B8A8_UNORM, A8B8G8R8, R, G, B, A, UNORM, A8B8G8R8, IA),
123 F3(A, R8G8B8X8_UNORM, X8B8G8R8, R, G, B, x, UNORM, A8B8G8R8, TA),
124 C4(A, R8G8B8A8_SRGB, A8BL8GL8RL8, R, G, B, A, UNORM, A8B8G8R8, TA),
125 F3(A, R8G8B8X8_SRGB, X8BL8GL8RL8, R, G, B, x, UNORM, A8B8G8R8, TA),
126
127 ZX(B, Z16_UNORM, Z16, R, UNORM, Z16, TZ),
128 ZX(A, Z32_FLOAT, ZF32, R, FLOAT, ZF32, TZ),
129 ZX(A, Z24X8_UNORM, X8Z24, R, UNORM, X8Z24, TZ),
130 SZ(A, X8Z24_UNORM, Z24S8, G, UNORM, Z24S8, TZ),
131 ZS(A, Z24_UNORM_S8_UINT, S8Z24, R, UNORM, S8Z24, TZ),
132 SZ(A, S8_UINT_Z24_UNORM, Z24S8, G, UNORM, Z24S8, TZ),
133 ZS(A, Z32_FLOAT_S8X24_UINT, ZF32_X24S8, R, FLOAT, ZF32_X24S8, TZ),
134
135 SX(A, S8_UINT, R, R8, T),
136 SX(A, X24S8_UINT, G, G8R24, T),
137 SX(A, S8X24_UINT, R, G24R8, T),
138 SX(A, X32_S8X24_UINT, G, R32_B24G8, T),
139
140 F3(A, B5G6R5_UNORM, R5G6B5, B, G, R, x, UNORM, B5G6R5, TD),
141 C4(A, R5G5B5A1_UNORM, NONE, R, G, B, A, UNORM, A1B5G5R5, T),
142 C4(A, B5G5R5A1_UNORM, A1R5G5B5, B, G, R, A, UNORM, A1B5G5R5, TD),
143 F3(A, B5G5R5X1_UNORM, X1R5G5B5, B, G, R, x, UNORM, A1B5G5R5, TD),
144 C4(A, A4B4G4R4_UNORM, NONE, A, B, G, R, UNORM, A4B4G4R4, T),
145 C4(A, A4R4G4B4_UNORM, NONE, G, B, A, R, UNORM, A4B4G4R4, T),
146 C4(A, B4G4R4A4_UNORM, NONE, B, G, R, A, UNORM, A4B4G4R4, T),
147 F3(A, B4G4R4X4_UNORM, NONE, B, G, R, x, UNORM, A4B4G4R4, T),
148 C4(A, R4G4B4A4_UNORM, NONE, R, G, B, A, UNORM, A4B4G4R4, T),
149 F3(A, R4G4B4X4_UNORM, NONE, R, G, B, x, UNORM, A4B4G4R4, T),
150
151 F3(A, R9G9B9E5_FLOAT, NONE, R, G, B, xx, FLOAT, E5B9G9R9_SHAREDEXP, T),
152
153 C4(A, R10G10B10A2_UNORM, A2B10G10R10, R, G, B, A, UNORM, A2B10G10R10, ID),
154 F3(A, R10G10B10X2_UNORM, A2B10G10R10, R, G, B, x, UNORM, A2B10G10R10, T),
155 C4(A, B10G10R10A2_UNORM, A2R10G10B10, B, G, R, A, UNORM, A2B10G10R10, TA),
156 F3(A, B10G10R10X2_UNORM, A2R10G10B10, B, G, R, x, UNORM, A2B10G10R10, T),
157 C4(A, R10G10B10A2_SNORM, NONE, R, G, B, A, SNORM, A2B10G10R10, T),
158 C4(A, B10G10R10A2_SNORM, NONE, B, G, R, A, SNORM, A2B10G10R10, T),
159 C4(A, R10G10B10A2_UINT, AU2BU10GU10RU10, R, G, B, A, UINT, A2B10G10R10, IR),
160 C4(A, B10G10R10A2_UINT, NONE, B, G, R, A, UINT, A2B10G10R10, B),
161
162 F3(A, R11G11B10_FLOAT, BF10GF11RF11, R, G, B, x, FLOAT, BF10GF11RF11, IA),
163
164 F3(A, L8_UNORM, R8, R, R, R, x, UNORM, R8, TA),
165 F3(A, L8_SRGB, NONE, R, R, R, x, UNORM, R8, T),
166 F3(A, L8_SNORM, RN8, R, R, R, x, SNORM, R8, TC),
167 I3(A, L8_SINT, RS8, R, R, R, x, SINT, R8, TR),
168 I3(A, L8_UINT, RU8, R, R, R, x, UINT, R8, TR),
169 F3(A, L16_UNORM, R16, R, R, R, x, UNORM, R16, TC),
170 F3(A, L16_SNORM, RN16, R, R, R, x, SNORM, R16, TC),
171 F3(A, L16_FLOAT, RF16, R, R, R, x, FLOAT, R16, TA),
172 I3(A, L16_SINT, RS16, R, R, R, x, SINT, R16, TR),
173 I3(A, L16_UINT, RU16, R, R, R, x, UINT, R16, TR),
174 F3(A, L32_FLOAT, RF32, R, R, R, x, FLOAT, R32, TA),
175 I3(A, L32_SINT, RS32, R, R, R, x, SINT, R32, TR),
176 I3(A, L32_UINT, RU32, R, R, R, x, UINT, R32, TR),
177
178 C4(A, I8_UNORM, R8, R, R, R, R, UNORM, R8, TR),
179 C4(A, I8_SNORM, RN8, R, R, R, R, SNORM, R8, TR),
180 C4(A, I8_SINT, RS8, R, R, R, R, SINT, R8, TR),
181 C4(A, I8_UINT, RU8, R, R, R, R, UINT, R8, TR),
182 C4(A, I16_UNORM, R16, R, R, R, R, UNORM, R16, TR),
183 C4(A, I16_SNORM, RN16, R, R, R, R, SNORM, R16, TR),
184 C4(A, I16_FLOAT, RF16, R, R, R, R, FLOAT, R16, TR),
185 C4(A, I16_SINT, RS16, R, R, R, R, SINT, R16, TR),
186 C4(A, I16_UINT, RU16, R, R, R, R, UINT, R16, TR),
187 C4(A, I32_FLOAT, RF32, R, R, R, R, FLOAT, R32, TR),
188 C4(A, I32_SINT, RS32, R, R, R, R, SINT, R32, TR),
189 C4(A, I32_UINT, RU32, R, R, R, R, UINT, R32, TR),
190
191 A1(A, A8_UNORM, A8, x, x, x, R, UNORM, R8, TA),
192 A1(A, A8_SNORM, RN8, x, x, x, R, SNORM, R8, T),
193 A1(A, A8_SINT, RS8, x, x, x, R, SINT, R8, T),
194 A1(A, A8_UINT, RU8, x, x, x, R, UINT, R8, T),
195 A1(A, A16_UNORM, R16, x, x, x, R, UNORM, R16, T),
196 A1(A, A16_SNORM, RN16, x, x, x, R, SNORM, R16, T),
197 A1(A, A16_FLOAT, AF16, x, x, x, R, FLOAT, R16, T),
198 A1(A, A16_SINT, RS16, x, x, x, R, SINT, R16, T),
199 A1(A, A16_UINT, RU16, x, x, x, R, UINT, R16, T),
200 A1(A, A32_FLOAT, AF32, x, x, x, R, FLOAT, R32, T),
201 A1(A, A32_SINT, RS32, x, x, x, R, SINT, R32, T),
202 A1(A, A32_UINT, RU32, x, x, x, R, UINT, R32, T),
203
204 C4(A, L4A4_UNORM, NONE, R, R, R, G, UNORM, G4R4, T),
205 C4(A, L8A8_UNORM, G8R8, R, R, R, G, UNORM, G8R8, T),
206 C4(A, L8A8_SNORM, GN8RN8, R, R, R, G, SNORM, G8R8, T),
207 C4(A, L8A8_SRGB, NONE, R, R, R, G, UNORM, G8R8, T),
208 C4(A, L8A8_SINT, GS8RS8, R, R, R, G, SINT, G8R8, T),
209 C4(A, L8A8_UINT, GU8RU8, R, R, R, G, UINT, G8R8, T),
210 C4(A, L16A16_UNORM, R16_G16, R, R, R, G, UNORM, R16_G16, T),
211 C4(A, L16A16_SNORM, RN16_GN16, R, R, R, G, SNORM, R16_G16, T),
212 C4(A, L16A16_FLOAT, RF16_GF16, R, R, R, G, FLOAT, R16_G16, T),
213 C4(A, L16A16_SINT, RS16_GS16, R, R, R, G, SINT, R16_G16, T),
214 C4(A, L16A16_UINT, RU16_GU16, R, R, R, G, UINT, R16_G16, T),
215 C4(A, L32A32_FLOAT, RF32_GF32, R, R, R, G, FLOAT, R32_G32, T),
216 C4(A, L32A32_SINT, RS32_GS32, R, R, R, G, SINT, R32_G32, T),
217 C4(A, L32A32_UINT, RU32_GU32, R, R, R, G, UINT, R32_G32, T),
218
219 F3(A, DXT1_RGB, NONE, R, G, B, xx, UNORM, DXT1, T),
220 F3(A, DXT1_SRGB, NONE, R, G, B, xx, UNORM, DXT1, T),
221 C4(A, DXT1_RGBA, NONE, R, G, B, A, UNORM, DXT1, T),
222 C4(A, DXT1_SRGBA, NONE, R, G, B, A, UNORM, DXT1, T),
223 C4(A, DXT3_RGBA, NONE, R, G, B, A, UNORM, DXT23, T),
224 C4(A, DXT3_SRGBA, NONE, R, G, B, A, UNORM, DXT23, T),
225 C4(A, DXT5_RGBA, NONE, R, G, B, A, UNORM, DXT45, T),
226 C4(A, DXT5_SRGBA, NONE, R, G, B, A, UNORM, DXT45, T),
227
228 F1(A, RGTC1_UNORM, NONE, R, xx, xx, xx, UNORM, DXN1, T),
229 F1(A, RGTC1_SNORM, NONE, R, xx, xx, xx, SNORM, DXN1, T),
230 F2(A, RGTC2_UNORM, NONE, R, G, xx, xx, UNORM, DXN2, T),
231 F2(A, RGTC2_SNORM, NONE, R, G, xx, xx, SNORM, DXN2, T),
232 F3(A, LATC1_UNORM, NONE, R, R, R, xx, UNORM, DXN1, T),
233 F3(A, LATC1_SNORM, NONE, R, R, R, xx, SNORM, DXN1, T),
234 C4(A, LATC2_UNORM, NONE, R, R, R, G, UNORM, DXN2, T),
235 C4(A, LATC2_SNORM, NONE, R, R, R, G, SNORM, DXN2, T),
236
237 C4(C, BPTC_RGBA_UNORM, NONE, R, G, B, A, UNORM, BC7U, t),
238 C4(C, BPTC_SRGBA, NONE, R, G, B, A, UNORM, BC7U, t),
239 F3(C, BPTC_RGB_FLOAT, NONE, R, G, B, xx, FLOAT, BC6H_SF16, t),
240 F3(C, BPTC_RGB_UFLOAT, NONE, R, G, B, xx, FLOAT, BC6H_UF16, t),
241
242 F3(D, ETC1_RGB8, NONE, R, G, B, xx, UNORM, ETC2_RGB, t),
243 F3(D, ETC2_RGB8, NONE, R, G, B, xx, UNORM, ETC2_RGB, t),
244 F3(D, ETC2_SRGB8, NONE, R, G, B, xx, UNORM, ETC2_RGB, t),
245 C4(D, ETC2_RGB8A1, NONE, R, G, B, A, UNORM, ETC2_RGB_PTA, t),
246 C4(D, ETC2_SRGB8A1, NONE, R, G, B, A, UNORM, ETC2_RGB_PTA, t),
247 C4(D, ETC2_RGBA8, NONE, R, G, B, A, UNORM, ETC2_RGBA, t),
248 C4(D, ETC2_SRGBA8, NONE, R, G, B, A, UNORM, ETC2_RGBA, t),
249 F1(D, ETC2_R11_UNORM, NONE, R, xx, xx, xx, UNORM, EAC, t),
250 F1(D, ETC2_R11_SNORM, NONE, R, xx, xx, xx, SNORM, EAC, t),
251 F2(D, ETC2_RG11_UNORM, NONE, R, G, xx, xx, UNORM, EACX2, t),
252 F2(D, ETC2_RG11_SNORM, NONE, R, G, xx, xx, SNORM, EACX2, t),
253
254 C4(D, ASTC_4x4, NONE, R, G, B, A, UNORM, ASTC_2D_4X4, t),
255 C4(D, ASTC_5x4, NONE, R, G, B, A, UNORM, ASTC_2D_5X4, t),
256 C4(D, ASTC_5x5, NONE, R, G, B, A, UNORM, ASTC_2D_5X5, t),
257 C4(D, ASTC_6x5, NONE, R, G, B, A, UNORM, ASTC_2D_6X5, t),
258 C4(D, ASTC_6x6, NONE, R, G, B, A, UNORM, ASTC_2D_6X6, t),
259 C4(D, ASTC_8x5, NONE, R, G, B, A, UNORM, ASTC_2D_8X5, t),
260 C4(D, ASTC_8x6, NONE, R, G, B, A, UNORM, ASTC_2D_8X6, t),
261 C4(D, ASTC_8x8, NONE, R, G, B, A, UNORM, ASTC_2D_8X8, t),
262 C4(D, ASTC_10x5, NONE, R, G, B, A, UNORM, ASTC_2D_10X5, t),
263 C4(D, ASTC_10x6, NONE, R, G, B, A, UNORM, ASTC_2D_10X6, t),
264 C4(D, ASTC_10x8, NONE, R, G, B, A, UNORM, ASTC_2D_10X8, t),
265 C4(D, ASTC_10x10, NONE, R, G, B, A, UNORM, ASTC_2D_10X10, t),
266 C4(D, ASTC_12x10, NONE, R, G, B, A, UNORM, ASTC_2D_12X10, t),
267 C4(D, ASTC_12x12, NONE, R, G, B, A, UNORM, ASTC_2D_12X12, t),
268
269 C4(D, ASTC_4x4_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_4X4, t),
270 C4(D, ASTC_5x4_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_5X4, t),
271 C4(D, ASTC_5x5_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_5X5, t),
272 C4(D, ASTC_6x5_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_6X5, t),
273 C4(D, ASTC_6x6_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_6X6, t),
274 C4(D, ASTC_8x5_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_8X5, t),
275 C4(D, ASTC_8x6_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_8X6, t),
276 C4(D, ASTC_8x8_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_8X8, t),
277 C4(D, ASTC_10x5_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_10X5, t),
278 C4(D, ASTC_10x6_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_10X6, t),
279 C4(D, ASTC_10x8_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_10X8, t),
280 C4(D, ASTC_10x10_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_10X10, t),
281 C4(D, ASTC_12x10_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_12X10, t),
282 C4(D, ASTC_12x12_SRGB, NONE, R, G, B, A, UNORM, ASTC_2D_12X12, t),
283
284 C4(A, R32G32B32A32_FLOAT, RF32_GF32_BF32_AF32, R, G, B, A, FLOAT, R32_G32_B32_A32, IA),
285 C4(A, R32G32B32A32_UNORM, NONE, R, G, B, A, UNORM, R32_G32_B32_A32, T),
286 C4(A, R32G32B32A32_SNORM, NONE, R, G, B, A, SNORM, R32_G32_B32_A32, T),
287 C4(A, R32G32B32A32_SINT, RS32_GS32_BS32_AS32, R, G, B, A, SINT, R32_G32_B32_A32, IR),
288 C4(A, R32G32B32A32_UINT, RU32_GU32_BU32_AU32, R, G, B, A, UINT, R32_G32_B32_A32, IR),
289 F3(A, R32G32B32X32_FLOAT, RF32_GF32_BF32_X32, R, G, B, x, FLOAT, R32_G32_B32_A32, TA),
290 I3(A, R32G32B32X32_SINT, RS32_GS32_BS32_X32, R, G, B, x, SINT, R32_G32_B32_A32, TR),
291 I3(A, R32G32B32X32_UINT, RU32_GU32_BU32_X32, R, G, B, x, UINT, R32_G32_B32_A32, TR),
292
293 F3(C, R32G32B32_FLOAT, NONE, R, G, B, xx, FLOAT, R32_G32_B32, B),
294 I3(C, R32G32B32_SINT, NONE, R, G, B, xx, SINT, R32_G32_B32, B),
295 I3(C, R32G32B32_UINT, NONE, R, G, B, xx, UINT, R32_G32_B32, B),
296
297 F2(A, R32G32_FLOAT, RF32_GF32, R, G, x, x, FLOAT, R32_G32, IA),
298 F2(A, R32G32_UNORM, NONE, R, G, x, x, UNORM, R32_G32, T),
299 F2(A, R32G32_SNORM, NONE, R, G, x, x, SNORM, R32_G32, T),
300 I2(A, R32G32_SINT, RS32_GS32, R, G, x, x, SINT, R32_G32, IR),
301 I2(A, R32G32_UINT, RU32_GU32, R, G, x, x, UINT, R32_G32, IR),
302
303 F1(A, R32_FLOAT, RF32, R, x, x, x, FLOAT, R32, IA),
304 F1(A, R32_UNORM, NONE, R, x, x, x, UNORM, R32, T),
305 F1(A, R32_SNORM, NONE, R, x, x, x, SNORM, R32, T),
306 I1(A, R32_SINT, RS32, R, x, x, x, SINT, R32, IR),
307 I1(A, R32_UINT, RU32, R, x, x, x, UINT, R32, IR),
308
309 I2(A, R64_SINT, NONE, R, G, x, x, SINT, R32_G32, S),
310 I2(A, R64_UINT, NONE, R, G, x, x, UINT, R32_G32, S),
311
312 C4(A, R16G16B16A16_FLOAT, RF16_GF16_BF16_AF16, R, G, B, A, FLOAT, R16_G16_B16_A16, IA),
313 C4(A, R16G16B16A16_UNORM, R16_G16_B16_A16, R, G, B, A, UNORM, R16_G16_B16_A16, IC),
314 C4(A, R16G16B16A16_SNORM, RN16_GN16_BN16_AN16, R, G, B, A, SNORM, R16_G16_B16_A16, IC),
315 C4(A, R16G16B16A16_SINT, RS16_GS16_BS16_AS16, R, G, B, A, SINT, R16_G16_B16_A16, IR),
316 C4(A, R16G16B16A16_UINT, RU16_GU16_BU16_AU16, R, G, B, A, UINT, R16_G16_B16_A16, IR),
317 F3(A, R16G16B16X16_FLOAT, RF16_GF16_BF16_X16, R, G, B, x, FLOAT, R16_G16_B16_A16, TA),
318 F3(A, R16G16B16X16_UNORM, R16_G16_B16_A16, R, G, B, x, UNORM, R16_G16_B16_A16, T),
319 F3(A, R16G16B16X16_SNORM, RN16_GN16_BN16_AN16, R, G, B, x, SNORM, R16_G16_B16_A16, T),
320 I3(A, R16G16B16X16_SINT, RS16_GS16_BS16_AS16, R, G, B, x, SINT, R16_G16_B16_A16, TR),
321 I3(A, R16G16B16X16_UINT, RU16_GU16_BU16_AU16, R, G, B, x, UINT, R16_G16_B16_A16, TR),
322
323 F2(A, R16G16_FLOAT, RF16_GF16, R, G, x, x, FLOAT, R16_G16, IA),
324 F2(A, R16G16_UNORM, R16_G16, R, G, x, x, UNORM, R16_G16, IC),
325 F2(A, R16G16_SNORM, RN16_GN16, R, G, x, x, SNORM, R16_G16, IC),
326 I2(A, R16G16_SINT, RS16_GS16, R, G, x, x, SINT, R16_G16, IR),
327 I2(A, R16G16_UINT, RU16_GU16, R, G, x, x, UINT, R16_G16, IR),
328
329 F1(A, R16_FLOAT, RF16, R, x, x, x, FLOAT, R16, IA),
330 F1(A, R16_UNORM, R16, R, x, x, x, UNORM, R16, IC),
331 F1(A, R16_SNORM, RN16, R, x, x, x, SNORM, R16, IC),
332 I1(A, R16_SINT, RS16, R, x, x, x, SINT, R16, IR),
333 I1(A, R16_UINT, RU16, R, x, x, x, UINT, R16, IR),
334
335 C4(A, R8G8B8A8_SNORM, AN8BN8GN8RN8, R, G, B, A, SNORM, A8B8G8R8, IC),
336 C4(A, R8G8B8A8_SINT, AS8BS8GS8RS8, R, G, B, A, SINT, A8B8G8R8, IR),
337 C4(A, R8G8B8A8_UINT, AU8BU8GU8RU8, R, G, B, A, UINT, A8B8G8R8, IR),
338 F3(A, R8G8B8X8_SNORM, AN8BN8GN8RN8, R, G, B, x, SNORM, A8B8G8R8, T),
339 I3(A, R8G8B8X8_SINT, AS8BS8GS8RS8, R, G, B, x, SINT, A8B8G8R8, TR),
340 I3(A, R8G8B8X8_UINT, AU8BU8GU8RU8, R, G, B, x, UINT, A8B8G8R8, TR),
341
342 F2(A, R8G8_UNORM, G8R8, R, G, x, x, UNORM, G8R8, IA),
343 F2(A, R8G8_SNORM, GN8RN8, R, G, x, x, SNORM, G8R8, IC),
344 I2(A, R8G8_SINT, GS8RS8, R, G, x, x, SINT, G8R8, IR),
345 I2(A, R8G8_UINT, GU8RU8, R, G, x, x, UINT, G8R8, IR),
346 #if 0
347 /* On Fermi+, the green component doesn't get decoding? */
348 F2(A, R8G8_SRGB, NONE, R, G, x, x, UNORM, G8R8, T),
349 #endif
350
351 F1(A, R8_UNORM, R8, R, x, x, x, UNORM, R8, IA),
352 F1(A, R8_SNORM, RN8, R, x, x, x, SNORM, R8, IC),
353 I1(A, R8_SINT, RS8, R, x, x, x, SINT, R8, IR),
354 I1(A, R8_UINT, RU8, R, x, x, x, UINT, R8, IR),
355 F1(A, R8_SRGB, NONE, R, x, x, x, UNORM, R8, T),
356
357 F3(A, R8G8_B8G8_UNORM, NONE, R, G, B, xx, UNORM, G8B8G8R8, T),
358 F3(A, G8R8_B8R8_UNORM, NONE, G, R, B, xx, UNORM, G8B8G8R8, T),
359 F3(A, G8R8_G8B8_UNORM, NONE, R, G, B, xx, UNORM, B8G8R8G8, T),
360 F3(A, R8G8_R8B8_UNORM, NONE, G, R, B, xx, UNORM, B8G8R8G8, T),
361 F3(A, G8B8_G8R8_UNORM, NONE, B, G, R, xx, UNORM, B8G8R8G8, T),
362 F3(A, B8G8_R8G8_UNORM, NONE, B, G, R, xx, UNORM, G8B8G8R8, T),
363
364 F1(A, R1_UNORM, NONE, R, xx, xx, xx, UNORM, R1, T),
365
366 C4(A, R4A4_UNORM, NONE, R, ZERO, ZERO, G, UNORM, G4R4, T),
367 C4(A, R8A8_UNORM, NONE, R, ZERO, ZERO, G, UNORM, G8R8, T),
368 C4(A, A4R4_UNORM, NONE, G, ZERO, ZERO, R, UNORM, G4R4, T),
369 C4(A, A8R8_UNORM, NONE, G, ZERO, ZERO, R, UNORM, G8R8, T),
370
371 SF(A, R8SG8SB8UX8U_NORM, 0, R, G, B, ONE_FLOAT, SNORM, SNORM, UNORM, UNORM, A8B8G8R8, T),
372 SF(A, R5SG5SB6U_NORM, 0, R, G, B, ONE_FLOAT, SNORM, SNORM, UNORM, UNORM, B6G5R5, T),
373 };
374
375 bool
nil_format_supports_texturing(struct nv_device_info * dev,enum pipe_format format)376 nil_format_supports_texturing(struct nv_device_info *dev,
377 enum pipe_format format)
378 {
379 assert(format < PIPE_FORMAT_COUNT);
380 const struct nil_format_info *fmt = &nil_format_infos[format];
381 if (!(fmt->support & NIL_FORMAT_SUPPORTS_TEXTURE_BIT))
382 return false;
383
384 /* The image/texture hardware doesn't clamp 2-bit SNORM alpha components to
385 * [-1, 1] which is out-of-spec according to Vulkan. Fortunately, as of
386 * September 14, 2022, according to vulkan.gpuinfo.org, these formats are
387 * only supported by lavapipe and a handful of mobile phones.
388 */
389 if (fmt->tic.comp_sizes == NV9097_TEXHEAD0_COMPONENT_SIZES_A2B10G10R10 &&
390 fmt->tic.type_r == NV9097_TEXHEAD0_A_DATA_TYPE_NUM_SNORM)
391 return false;
392
393 const struct util_format_description *desc = util_format_description(format);
394 if (desc->layout == UTIL_FORMAT_LAYOUT_ETC ||
395 desc->layout == UTIL_FORMAT_LAYOUT_ASTC) {
396 return dev->type == NV_DEVICE_TYPE_SOC && dev->cls_eng3d >= KEPLER_C;
397 }
398
399 return true;
400 }
401
402 bool
nil_format_supports_filtering(struct nv_device_info * dev,enum pipe_format format)403 nil_format_supports_filtering(struct nv_device_info *dev,
404 enum pipe_format format)
405 {
406 return nil_format_supports_texturing(dev, format) &&
407 !util_format_is_pure_integer(format);
408 }
409
410 bool
nil_format_supports_buffer(struct nv_device_info * dev,enum pipe_format format)411 nil_format_supports_buffer(struct nv_device_info *dev,
412 enum pipe_format format)
413 {
414 assert(format < PIPE_FORMAT_COUNT);
415 const struct nil_format_info *fmt = &nil_format_infos[format];
416 return fmt->support & NIL_FORMAT_SUPPORTS_BUFFER_BIT;
417 }
418
419 bool
nil_format_supports_storage(struct nv_device_info * dev,enum pipe_format format)420 nil_format_supports_storage(struct nv_device_info *dev,
421 enum pipe_format format)
422 {
423 if ((format == PIPE_FORMAT_R64_UINT || format == PIPE_FORMAT_R64_SINT) &&
424 dev->cls_eng3d < MAXWELL_A)
425 return false;
426
427 assert(format < PIPE_FORMAT_COUNT);
428 const struct nil_format_info *fmt = &nil_format_infos[format];
429 return fmt->support & NIL_FORMAT_SUPPORTS_STORAGE_BIT;
430 }
431
432 bool
nil_format_supports_color_targets(struct nv_device_info * dev,enum pipe_format format)433 nil_format_supports_color_targets(struct nv_device_info *dev,
434 enum pipe_format format)
435 {
436 assert(format < PIPE_FORMAT_COUNT);
437 const struct nil_format_info *fmt = &nil_format_infos[format];
438 return fmt->support & NIL_FORMAT_SUPPORTS_RENDER_BIT;
439 }
440
441 bool
nil_format_supports_blending(struct nv_device_info * dev,enum pipe_format format)442 nil_format_supports_blending(struct nv_device_info *dev,
443 enum pipe_format format)
444 {
445 assert(format < PIPE_FORMAT_COUNT);
446 const struct nil_format_info *fmt = &nil_format_infos[format];
447 return fmt->support & NIL_FORMAT_SUPPORTS_ALPHA_BLEND_BIT;
448 }
449
450 bool
nil_format_supports_depth_stencil(struct nv_device_info * dev,enum pipe_format format)451 nil_format_supports_depth_stencil(struct nv_device_info *dev,
452 enum pipe_format format)
453 {
454 assert(format < PIPE_FORMAT_COUNT);
455 const struct nil_format_info *fmt = &nil_format_infos[format];
456 return fmt->support & NIL_FORMAT_SUPPORTS_DEPTH_STENCIL_BIT;
457 }
458
459 uint8_t
nil_format_to_color_target(enum pipe_format format)460 nil_format_to_color_target(enum pipe_format format)
461 {
462 assert(format < PIPE_FORMAT_COUNT);
463 const struct nil_format_info *fmt = &nil_format_infos[format];
464 assert(fmt->support & NIL_FORMAT_SUPPORTS_RENDER_BIT);
465 return fmt->czt;
466 }
467
468 uint8_t
nil_format_to_depth_stencil(enum pipe_format format)469 nil_format_to_depth_stencil(enum pipe_format format)
470 {
471 assert(format < PIPE_FORMAT_COUNT);
472 const struct nil_format_info *fmt = &nil_format_infos[format];
473 assert(fmt->support & NIL_FORMAT_SUPPORTS_DEPTH_STENCIL_BIT);
474 return fmt->czt;
475 }
476
477 const struct nil_tic_format *
nil_tic_format_for_pipe(enum pipe_format format)478 nil_tic_format_for_pipe(enum pipe_format format)
479 {
480 assert(format < PIPE_FORMAT_COUNT);
481 const struct nil_format_info *fmt = &nil_format_infos[format];
482 return fmt->tic.comp_sizes == 0 ? NULL : &fmt->tic;
483 }
484