xref: /aosp_15_r20/external/mesa3d/src/nouveau/compiler/nak_private.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2022 Collabora, Ltd.
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #ifndef NAK_PRIVATE_H
7*61046927SAndroid Build Coastguard Worker #define NAK_PRIVATE_H
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include "nak.h"
10*61046927SAndroid Build Coastguard Worker #include "nir.h"
11*61046927SAndroid Build Coastguard Worker #include "nv_device_info.h"
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
14*61046927SAndroid Build Coastguard Worker extern "C" {
15*61046927SAndroid Build Coastguard Worker #endif
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker bool nak_should_print_nir(void);
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker struct nak_compiler {
20*61046927SAndroid Build Coastguard Worker    uint8_t sm;
21*61046927SAndroid Build Coastguard Worker    uint8_t warps_per_sm;
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker    struct nir_shader_compiler_options nir_options;
24*61046927SAndroid Build Coastguard Worker };
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED nak_attr {
27*61046927SAndroid Build Coastguard Worker    /* System values A */
28*61046927SAndroid Build Coastguard Worker    NAK_ATTR_TESS_LOD_LEFT     = 0x000,
29*61046927SAndroid Build Coastguard Worker    NAK_ATTR_TESS_LOD_RIGHT    = 0x004,
30*61046927SAndroid Build Coastguard Worker    NAK_ATTR_TESS_LOD_BOTTOM   = 0x008,
31*61046927SAndroid Build Coastguard Worker    NAK_ATTR_TESS_LOD_TOP      = 0x00c,
32*61046927SAndroid Build Coastguard Worker    NAK_ATTR_TESS_LOD          = NAK_ATTR_TESS_LOD_LEFT,
33*61046927SAndroid Build Coastguard Worker    NAK_ATTR_TESS_INTERRIOR_U  = 0x010,
34*61046927SAndroid Build Coastguard Worker    NAK_ATTR_TESS_INTERRIOR_V  = 0x014,
35*61046927SAndroid Build Coastguard Worker    NAK_ATTR_TESS_INTERRIOR    = NAK_ATTR_TESS_INTERRIOR_U,
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker    /* Patch attributes */
38*61046927SAndroid Build Coastguard Worker    NAK_ATTR_PATCH_START       = 0x020,
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker    /* System values B */
41*61046927SAndroid Build Coastguard Worker    NAK_ATTR_PRIMITIVE_ID      = 0x060,
42*61046927SAndroid Build Coastguard Worker    NAK_ATTR_RT_ARRAY_INDEX    = 0x064,
43*61046927SAndroid Build Coastguard Worker    NAK_ATTR_VIEWPORT_INDEX    = 0x068,
44*61046927SAndroid Build Coastguard Worker    NAK_ATTR_POINT_SIZE        = 0x06c,
45*61046927SAndroid Build Coastguard Worker    NAK_ATTR_POSITION_X        = 0x070,
46*61046927SAndroid Build Coastguard Worker    NAK_ATTR_POSITION_Y        = 0x074,
47*61046927SAndroid Build Coastguard Worker    NAK_ATTR_POSITION_Z        = 0x078,
48*61046927SAndroid Build Coastguard Worker    NAK_ATTR_POSITION_W        = 0x07c,
49*61046927SAndroid Build Coastguard Worker    NAK_ATTR_POSITION          = NAK_ATTR_POSITION_X,
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker    /* Generic attributes */
52*61046927SAndroid Build Coastguard Worker    NAK_ATTR_GENERIC_START     = 0x080,
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker    /* System values C */
55*61046927SAndroid Build Coastguard Worker    NAK_ATTR_CLIP_CULL_DIST_0  = 0x2c0,
56*61046927SAndroid Build Coastguard Worker    NAK_ATTR_CLIP_CULL_DIST_1  = 0x2c4,
57*61046927SAndroid Build Coastguard Worker    NAK_ATTR_CLIP_CULL_DIST_2  = 0x2c8,
58*61046927SAndroid Build Coastguard Worker    NAK_ATTR_CLIP_CULL_DIST_3  = 0x2cc,
59*61046927SAndroid Build Coastguard Worker    NAK_ATTR_CLIP_CULL_DIST_4  = 0x2d0,
60*61046927SAndroid Build Coastguard Worker    NAK_ATTR_CLIP_CULL_DIST_5  = 0x2d4,
61*61046927SAndroid Build Coastguard Worker    NAK_ATTR_CLIP_CULL_DIST_6  = 0x2d8,
62*61046927SAndroid Build Coastguard Worker    NAK_ATTR_CLIP_CULL_DIST_7  = 0x2dc,
63*61046927SAndroid Build Coastguard Worker    NAK_ATTR_CLIP_CULL_DIST    = NAK_ATTR_CLIP_CULL_DIST_0,
64*61046927SAndroid Build Coastguard Worker    NAK_ATTR_POINT_SPRITE_S    = 0x2e0,
65*61046927SAndroid Build Coastguard Worker    NAK_ATTR_POINT_SPRITE_T    = 0x2e4,
66*61046927SAndroid Build Coastguard Worker    NAK_ATTR_POINT_SPRITE      = NAK_ATTR_POINT_SPRITE_S,
67*61046927SAndroid Build Coastguard Worker    NAK_ATTR_FOG_COORD         = 0x2e8,
68*61046927SAndroid Build Coastguard Worker    /* Reserved                  0x2ec */
69*61046927SAndroid Build Coastguard Worker    NAK_ATTR_TESS_COORD_X      = 0x2f0,
70*61046927SAndroid Build Coastguard Worker    NAK_ATTR_TESS_COORD_Y      = 0x2f4,
71*61046927SAndroid Build Coastguard Worker    NAK_ATTR_TESS_COORD        = NAK_ATTR_TESS_COORD_X,
72*61046927SAndroid Build Coastguard Worker    NAK_ATTR_INSTANCE_ID       = 0x2f8,
73*61046927SAndroid Build Coastguard Worker    NAK_ATTR_VERTEX_ID         = 0x2fc,
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker    NAK_ATTR_BARY_COORD_NO_PERSP_X = 0x3a8,
76*61046927SAndroid Build Coastguard Worker    NAK_ATTR_BARY_COORD_NO_PERSP_Y = 0x3ac,
77*61046927SAndroid Build Coastguard Worker    NAK_ATTR_BARY_COORD_NO_PERSP_Z = 0x3b0,
78*61046927SAndroid Build Coastguard Worker    NAK_ATTR_BARY_COORD_NO_PERSP = NAK_ATTR_BARY_COORD_NO_PERSP_X,
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker    NAK_ATTR_BARY_COORD_X = 0x3b4,
81*61046927SAndroid Build Coastguard Worker    NAK_ATTR_BARY_COORD_Y = 0x3b8,
82*61046927SAndroid Build Coastguard Worker    NAK_ATTR_BARY_COORD_Z = 0x3bc,
83*61046927SAndroid Build Coastguard Worker    NAK_ATTR_BARY_COORD = NAK_ATTR_BARY_COORD_X,
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker    /* Not in SPH */
86*61046927SAndroid Build Coastguard Worker    NAK_ATTR_FRONT_FACE        = 0x3fc,
87*61046927SAndroid Build Coastguard Worker };
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker static inline uint16_t
nak_attribute_attr_addr(gl_vert_attrib attrib)90*61046927SAndroid Build Coastguard Worker nak_attribute_attr_addr(gl_vert_attrib attrib)
91*61046927SAndroid Build Coastguard Worker {
92*61046927SAndroid Build Coastguard Worker    assert(attrib >= VERT_ATTRIB_GENERIC0);
93*61046927SAndroid Build Coastguard Worker    return NAK_ATTR_GENERIC_START + (attrib - VERT_ATTRIB_GENERIC0) * 0x10;
94*61046927SAndroid Build Coastguard Worker }
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker uint16_t nak_varying_attr_addr(gl_varying_slot slot);
97*61046927SAndroid Build Coastguard Worker uint16_t nak_sysval_attr_addr(gl_system_value sysval);
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED nak_sv {
100*61046927SAndroid Build Coastguard Worker    NAK_SV_LANE_ID          = 0x00,
101*61046927SAndroid Build Coastguard Worker    NAK_SV_VIRTCFG          = 0x02,
102*61046927SAndroid Build Coastguard Worker    NAK_SV_VIRTID           = 0x03,
103*61046927SAndroid Build Coastguard Worker    NAK_SV_VERTEX_COUNT     = 0x10,
104*61046927SAndroid Build Coastguard Worker    NAK_SV_INVOCATION_ID    = 0x11,
105*61046927SAndroid Build Coastguard Worker    NAK_SV_THREAD_KILL      = 0x13,
106*61046927SAndroid Build Coastguard Worker    NAK_SV_INVOCATION_INFO  = 0x1d,
107*61046927SAndroid Build Coastguard Worker    NAK_SV_COMBINED_TID     = 0x20,
108*61046927SAndroid Build Coastguard Worker    NAK_SV_TID_X            = 0x21,
109*61046927SAndroid Build Coastguard Worker    NAK_SV_TID_Y            = 0x22,
110*61046927SAndroid Build Coastguard Worker    NAK_SV_TID_Z            = 0x23,
111*61046927SAndroid Build Coastguard Worker    NAK_SV_TID              = NAK_SV_TID_X,
112*61046927SAndroid Build Coastguard Worker    NAK_SV_CTAID_X          = 0x25,
113*61046927SAndroid Build Coastguard Worker    NAK_SV_CTAID_Y          = 0x26,
114*61046927SAndroid Build Coastguard Worker    NAK_SV_CTAID_Z          = 0x27,
115*61046927SAndroid Build Coastguard Worker    NAK_SV_CTAID            = NAK_SV_CTAID_X,
116*61046927SAndroid Build Coastguard Worker    NAK_SV_LANEMASK_EQ      = 0x38,
117*61046927SAndroid Build Coastguard Worker    NAK_SV_LANEMASK_LT      = 0x39,
118*61046927SAndroid Build Coastguard Worker    NAK_SV_LANEMASK_LE      = 0x3a,
119*61046927SAndroid Build Coastguard Worker    NAK_SV_LANEMASK_GT      = 0x3b,
120*61046927SAndroid Build Coastguard Worker    NAK_SV_LANEMASK_GE      = 0x3c,
121*61046927SAndroid Build Coastguard Worker    NAK_SV_CLOCK_LO         = 0x50,
122*61046927SAndroid Build Coastguard Worker    NAK_SV_CLOCK_HI         = 0x51,
123*61046927SAndroid Build Coastguard Worker    NAK_SV_CLOCK            = NAK_SV_CLOCK_LO,
124*61046927SAndroid Build Coastguard Worker };
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker bool nak_nir_workgroup_has_one_subgroup(const nir_shader *nir);
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker struct nak_xfb_info
129*61046927SAndroid Build Coastguard Worker nak_xfb_from_nir(const struct nir_xfb_info *nir_xfb);
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker struct nak_io_addr_offset {
132*61046927SAndroid Build Coastguard Worker    nir_scalar base;
133*61046927SAndroid Build Coastguard Worker    int32_t offset;
134*61046927SAndroid Build Coastguard Worker };
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker struct nak_io_addr_offset
137*61046927SAndroid Build Coastguard Worker nak_get_io_addr_offset(nir_def *addr, uint8_t imm_bits);
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker enum nak_nir_lod_mode {
140*61046927SAndroid Build Coastguard Worker    NAK_NIR_LOD_MODE_AUTO = 0,
141*61046927SAndroid Build Coastguard Worker    NAK_NIR_LOD_MODE_ZERO,
142*61046927SAndroid Build Coastguard Worker    NAK_NIR_LOD_MODE_BIAS,
143*61046927SAndroid Build Coastguard Worker    NAK_NIR_LOD_MODE_LOD,
144*61046927SAndroid Build Coastguard Worker    NAK_NIR_LOD_MODE_CLAMP,
145*61046927SAndroid Build Coastguard Worker    NAK_NIR_LOD_MODE_BIAS_CLAMP,
146*61046927SAndroid Build Coastguard Worker };
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker enum nak_nir_offset_mode {
149*61046927SAndroid Build Coastguard Worker    NAK_NIR_OFFSET_MODE_NONE = 0,
150*61046927SAndroid Build Coastguard Worker    NAK_NIR_OFFSET_MODE_AOFFI,
151*61046927SAndroid Build Coastguard Worker    NAK_NIR_OFFSET_MODE_PER_PX,
152*61046927SAndroid Build Coastguard Worker };
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker struct nak_nir_tex_flags {
155*61046927SAndroid Build Coastguard Worker    enum nak_nir_lod_mode lod_mode:3;
156*61046927SAndroid Build Coastguard Worker    enum nak_nir_offset_mode offset_mode:2;
157*61046927SAndroid Build Coastguard Worker    bool has_z_cmpr:1;
158*61046927SAndroid Build Coastguard Worker    bool is_sparse:1;
159*61046927SAndroid Build Coastguard Worker    uint32_t pad:25;
160*61046927SAndroid Build Coastguard Worker };
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker bool nak_nir_lower_scan_reduce(nir_shader *shader);
163*61046927SAndroid Build Coastguard Worker bool nak_nir_lower_tex(nir_shader *nir, const struct nak_compiler *nak);
164*61046927SAndroid Build Coastguard Worker bool nak_nir_lower_gs_intrinsics(nir_shader *shader);
165*61046927SAndroid Build Coastguard Worker bool nak_nir_lower_algebraic_late(nir_shader *nir, const struct nak_compiler *nak);
166*61046927SAndroid Build Coastguard Worker 
167*61046927SAndroid Build Coastguard Worker struct nak_nir_attr_io_flags {
168*61046927SAndroid Build Coastguard Worker    bool output : 1;
169*61046927SAndroid Build Coastguard Worker    bool patch : 1;
170*61046927SAndroid Build Coastguard Worker    bool phys : 1;
171*61046927SAndroid Build Coastguard Worker    uint32_t pad:29;
172*61046927SAndroid Build Coastguard Worker };
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker bool nak_nir_lower_vtg_io(nir_shader *nir, const struct nak_compiler *nak);
175*61046927SAndroid Build Coastguard Worker 
176*61046927SAndroid Build Coastguard Worker enum nak_interp_mode {
177*61046927SAndroid Build Coastguard Worker    NAK_INTERP_MODE_PERSPECTIVE,
178*61046927SAndroid Build Coastguard Worker    NAK_INTERP_MODE_SCREEN_LINEAR,
179*61046927SAndroid Build Coastguard Worker    NAK_INTERP_MODE_CONSTANT,
180*61046927SAndroid Build Coastguard Worker };
181*61046927SAndroid Build Coastguard Worker 
182*61046927SAndroid Build Coastguard Worker enum nak_interp_freq {
183*61046927SAndroid Build Coastguard Worker     NAK_INTERP_FREQ_PASS,
184*61046927SAndroid Build Coastguard Worker     NAK_INTERP_FREQ_PASS_MUL_W,
185*61046927SAndroid Build Coastguard Worker     NAK_INTERP_FREQ_CONSTANT,
186*61046927SAndroid Build Coastguard Worker     NAK_INTERP_FREQ_STATE,
187*61046927SAndroid Build Coastguard Worker };
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker enum nak_interp_loc {
190*61046927SAndroid Build Coastguard Worker    NAK_INTERP_LOC_DEFAULT,
191*61046927SAndroid Build Coastguard Worker    NAK_INTERP_LOC_CENTROID,
192*61046927SAndroid Build Coastguard Worker    NAK_INTERP_LOC_OFFSET,
193*61046927SAndroid Build Coastguard Worker };
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker struct nak_nir_ipa_flags {
196*61046927SAndroid Build Coastguard Worker    enum nak_interp_mode interp_mode:2;
197*61046927SAndroid Build Coastguard Worker    enum nak_interp_freq interp_freq:2;
198*61046927SAndroid Build Coastguard Worker    enum nak_interp_loc interp_loc:2;
199*61046927SAndroid Build Coastguard Worker    uint32_t pad:26;
200*61046927SAndroid Build Coastguard Worker };
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker bool nak_nir_lower_fs_inputs(nir_shader *nir,
203*61046927SAndroid Build Coastguard Worker                              const struct nak_compiler *nak,
204*61046927SAndroid Build Coastguard Worker                              const struct nak_fs_key *fs_key);
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker enum nak_fs_out {
207*61046927SAndroid Build Coastguard Worker    NAK_FS_OUT_COLOR0 = 0x00,
208*61046927SAndroid Build Coastguard Worker    NAK_FS_OUT_COLOR1 = 0x10,
209*61046927SAndroid Build Coastguard Worker    NAK_FS_OUT_COLOR2 = 0x20,
210*61046927SAndroid Build Coastguard Worker    NAK_FS_OUT_COLOR3 = 0x30,
211*61046927SAndroid Build Coastguard Worker    NAK_FS_OUT_COLOR4 = 0x40,
212*61046927SAndroid Build Coastguard Worker    NAK_FS_OUT_COLOR5 = 0x50,
213*61046927SAndroid Build Coastguard Worker    NAK_FS_OUT_COLOR6 = 0x60,
214*61046927SAndroid Build Coastguard Worker    NAK_FS_OUT_COLOR7 = 0x70,
215*61046927SAndroid Build Coastguard Worker    NAK_FS_OUT_SAMPLE_MASK = 0x80,
216*61046927SAndroid Build Coastguard Worker    NAK_FS_OUT_DEPTH = 0x84,
217*61046927SAndroid Build Coastguard Worker };
218*61046927SAndroid Build Coastguard Worker 
219*61046927SAndroid Build Coastguard Worker #define NAK_FS_OUT_COLOR(n) (NAK_FS_OUT_COLOR0 + (n) * 16)
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker bool nak_nir_split_64bit_conversions(nir_shader *nir);
222*61046927SAndroid Build Coastguard Worker bool nak_nir_lower_non_uniform_ldcx(nir_shader *nir);
223*61046927SAndroid Build Coastguard Worker bool nak_nir_add_barriers(nir_shader *nir, const struct nak_compiler *nak);
224*61046927SAndroid Build Coastguard Worker bool nak_nir_lower_cf(nir_shader *nir);
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker void nak_optimize_nir(nir_shader *nir, const struct nak_compiler *nak);
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker struct nak_memstream {
229*61046927SAndroid Build Coastguard Worker    FILE *stream;
230*61046927SAndroid Build Coastguard Worker    char *buffer;
231*61046927SAndroid Build Coastguard Worker    size_t written;
232*61046927SAndroid Build Coastguard Worker };
233*61046927SAndroid Build Coastguard Worker 
234*61046927SAndroid Build Coastguard Worker void nak_open_memstream(struct nak_memstream *memstream);
235*61046927SAndroid Build Coastguard Worker void nak_close_memstream(struct nak_memstream *memstream);
236*61046927SAndroid Build Coastguard Worker void nak_flush_memstream(struct nak_memstream *memstream);
237*61046927SAndroid Build Coastguard Worker void nak_clear_memstream(struct nak_memstream *memstream);
238*61046927SAndroid Build Coastguard Worker void nak_nir_asprint_instr(struct nak_memstream *memstream, const nir_instr *instr);
239*61046927SAndroid Build Coastguard Worker 
240*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
241*61046927SAndroid Build Coastguard Worker }
242*61046927SAndroid Build Coastguard Worker #endif
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker #endif /* NAK_PRIVATE */
245