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