• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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