xref: /aosp_15_r20/external/mesa3d/src/nouveau/compiler/nak.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_H
7*61046927SAndroid Build Coastguard Worker #define NAK_H
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include "compiler/shader_enums.h"
10*61046927SAndroid Build Coastguard Worker #include "nir.h"
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #include <assert.h>
13*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
14*61046927SAndroid Build Coastguard Worker #include <stdint.h>
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
17*61046927SAndroid Build Coastguard Worker extern "C" {
18*61046927SAndroid Build Coastguard Worker #endif
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker #define NAK_SUBGROUP_SIZE 32
21*61046927SAndroid Build Coastguard Worker 
22*61046927SAndroid Build Coastguard Worker struct nak_compiler;
23*61046927SAndroid Build Coastguard Worker struct nir_shader_compiler_options;
24*61046927SAndroid Build Coastguard Worker struct nv_device_info;
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker struct nak_compiler *nak_compiler_create(const struct nv_device_info *dev);
27*61046927SAndroid Build Coastguard Worker void nak_compiler_destroy(struct nak_compiler *nak);
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker uint64_t nak_debug_flags(const struct nak_compiler *nak);
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker const struct nir_shader_compiler_options *
32*61046927SAndroid Build Coastguard Worker nak_nir_options(const struct nak_compiler *nak);
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker void nak_preprocess_nir(nir_shader *nir, const struct nak_compiler *nak);
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker struct nak_sample_location {
37*61046927SAndroid Build Coastguard Worker    uint8_t x_u4 : 4;
38*61046927SAndroid Build Coastguard Worker    uint8_t y_u4 : 4;
39*61046927SAndroid Build Coastguard Worker };
40*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct nak_sample_location) == 1,
41*61046927SAndroid Build Coastguard Worker               "This struct has no holes");
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker struct nak_sample_mask {
44*61046927SAndroid Build Coastguard Worker    uint16_t sample_mask;
45*61046927SAndroid Build Coastguard Worker };
46*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct nak_sample_mask) == 2,
47*61046927SAndroid Build Coastguard Worker               "This struct has no holes");
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker PRAGMA_DIAGNOSTIC_PUSH
50*61046927SAndroid Build Coastguard Worker PRAGMA_DIAGNOSTIC_ERROR(-Wpadded)
51*61046927SAndroid Build Coastguard Worker struct nak_fs_key {
52*61046927SAndroid Build Coastguard Worker    bool zs_self_dep;
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker    /** True if sample shading is forced on via an API knob such as
55*61046927SAndroid Build Coastguard Worker     * VkPipelineMultisampleStateCreateInfo::minSampleShading
56*61046927SAndroid Build Coastguard Worker     */
57*61046927SAndroid Build Coastguard Worker    bool force_sample_shading;
58*61046927SAndroid Build Coastguard Worker    bool uses_underestimate;
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    /**
61*61046927SAndroid Build Coastguard Worker     * The constant buffer index and offset at which the sample locations and
62*61046927SAndroid Build Coastguard Worker     * pass sample masks tables lives.
63*61046927SAndroid Build Coastguard Worker     */
64*61046927SAndroid Build Coastguard Worker    uint8_t sample_info_cb;
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    /**
67*61046927SAndroid Build Coastguard Worker     * The offset into sample_info_cb at which the sample locations live.  The
68*61046927SAndroid Build Coastguard Worker     * sample locations table is an array of nak_sample_location where each
69*61046927SAndroid Build Coastguard Worker     * sample location is two 4-bit unorm values packed into an 8-bit value
70*61046927SAndroid Build Coastguard Worker     * with the bottom 4 bits for x and the top 4 bits for y.
71*61046927SAndroid Build Coastguard Worker     */
72*61046927SAndroid Build Coastguard Worker    uint32_t sample_locations_offset;
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker    /**
75*61046927SAndroid Build Coastguard Worker     * The offset into sample_info_cb at which the sample masks table lives.
76*61046927SAndroid Build Coastguard Worker     * The sample masks table is an array of nak_sample_mask where each entry
77*61046927SAndroid Build Coastguard Worker     * represents the set of samples covered by that pass corresponding to that
78*61046927SAndroid Build Coastguard Worker     * sample in a multi-pass fragment shader invocaiton.
79*61046927SAndroid Build Coastguard Worker     */
80*61046927SAndroid Build Coastguard Worker    uint32_t sample_masks_offset;
81*61046927SAndroid Build Coastguard Worker };
82*61046927SAndroid Build Coastguard Worker PRAGMA_DIAGNOSTIC_POP
83*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct nak_fs_key) == 12, "This struct has no holes");
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker void nak_postprocess_nir(nir_shader *nir, const struct nak_compiler *nak,
87*61046927SAndroid Build Coastguard Worker                          nir_variable_mode robust2_modes,
88*61046927SAndroid Build Coastguard Worker                          const struct nak_fs_key *fs_key);
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED nak_ts_domain {
91*61046927SAndroid Build Coastguard Worker    NAK_TS_DOMAIN_ISOLINE = 0,
92*61046927SAndroid Build Coastguard Worker    NAK_TS_DOMAIN_TRIANGLE = 1,
93*61046927SAndroid Build Coastguard Worker    NAK_TS_DOMAIN_QUAD = 2,
94*61046927SAndroid Build Coastguard Worker };
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED nak_ts_spacing {
97*61046927SAndroid Build Coastguard Worker    NAK_TS_SPACING_INTEGER = 0,
98*61046927SAndroid Build Coastguard Worker    NAK_TS_SPACING_FRACT_ODD = 1,
99*61046927SAndroid Build Coastguard Worker    NAK_TS_SPACING_FRACT_EVEN = 2,
100*61046927SAndroid Build Coastguard Worker };
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED nak_ts_prims {
103*61046927SAndroid Build Coastguard Worker    NAK_TS_PRIMS_POINTS = 0,
104*61046927SAndroid Build Coastguard Worker    NAK_TS_PRIMS_LINES = 1,
105*61046927SAndroid Build Coastguard Worker    NAK_TS_PRIMS_TRIANGLES_CW = 2,
106*61046927SAndroid Build Coastguard Worker    NAK_TS_PRIMS_TRIANGLES_CCW = 3,
107*61046927SAndroid Build Coastguard Worker };
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker struct nak_xfb_info {
110*61046927SAndroid Build Coastguard Worker    uint32_t stride[4];
111*61046927SAndroid Build Coastguard Worker    uint8_t stream[4];
112*61046927SAndroid Build Coastguard Worker    uint8_t attr_count[4];
113*61046927SAndroid Build Coastguard Worker    uint8_t attr_index[4][128];
114*61046927SAndroid Build Coastguard Worker };
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker /* This struct MUST have explicit padding fields to ensure that all padding is
117*61046927SAndroid Build Coastguard Worker  * zeroed and the zeros get properly copied, even across API boundaries.
118*61046927SAndroid Build Coastguard Worker  */
119*61046927SAndroid Build Coastguard Worker #pragma GCC diagnostic push
120*61046927SAndroid Build Coastguard Worker #pragma GCC diagnostic error "-Wpadded"
121*61046927SAndroid Build Coastguard Worker struct nak_shader_info {
122*61046927SAndroid Build Coastguard Worker    gl_shader_stage stage;
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    /** Shader model */
125*61046927SAndroid Build Coastguard Worker    uint8_t sm;
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker    /** Number of GPRs used */
128*61046927SAndroid Build Coastguard Worker    uint8_t num_gprs;
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker    /**
131*61046927SAndroid Build Coastguard Worker     * Number of control barriers used
132*61046927SAndroid Build Coastguard Worker     *
133*61046927SAndroid Build Coastguard Worker     * These are barriers in the sense of glsl barrier(), not reconvergence
134*61046927SAndroid Build Coastguard Worker     * barriers. In CUDA, these barriers have an index, but we currently
135*61046927SAndroid Build Coastguard Worker     * only use index zero for vulkan, which means this will be at most 1.
136*61046927SAndroid Build Coastguard Worker     */
137*61046927SAndroid Build Coastguard Worker    uint8_t num_control_barriers;
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    uint8_t _pad0;
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker    /** Number of instructions used */
142*61046927SAndroid Build Coastguard Worker    uint32_t num_instrs;
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker    /** Size of shader local (scratch) memory */
145*61046927SAndroid Build Coastguard Worker    uint32_t slm_size;
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    /** Size of call/return stack in bytes/warp */
148*61046927SAndroid Build Coastguard Worker    uint32_t crs_size;
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker    union {
151*61046927SAndroid Build Coastguard Worker       struct {
152*61046927SAndroid Build Coastguard Worker          /* Local workgroup size */
153*61046927SAndroid Build Coastguard Worker          uint16_t local_size[3];
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker          /* Shared memory size */
156*61046927SAndroid Build Coastguard Worker          uint16_t smem_size;
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker          uint8_t _pad[4];
159*61046927SAndroid Build Coastguard Worker       } cs;
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker       struct {
162*61046927SAndroid Build Coastguard Worker          bool writes_depth;
163*61046927SAndroid Build Coastguard Worker          bool reads_sample_mask;
164*61046927SAndroid Build Coastguard Worker          bool post_depth_coverage;
165*61046927SAndroid Build Coastguard Worker          bool uses_sample_shading;
166*61046927SAndroid Build Coastguard Worker          bool early_fragment_tests;
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker          uint8_t _pad[7];
169*61046927SAndroid Build Coastguard Worker       } fs;
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker       struct {
172*61046927SAndroid Build Coastguard Worker          enum nak_ts_domain domain;
173*61046927SAndroid Build Coastguard Worker          enum nak_ts_spacing spacing;
174*61046927SAndroid Build Coastguard Worker          enum nak_ts_prims prims;
175*61046927SAndroid Build Coastguard Worker 
176*61046927SAndroid Build Coastguard Worker          uint8_t _pad[9];
177*61046927SAndroid Build Coastguard Worker       } ts;
178*61046927SAndroid Build Coastguard Worker 
179*61046927SAndroid Build Coastguard Worker       /* Used to initialize the union for other stages */
180*61046927SAndroid Build Coastguard Worker       uint8_t _pad[12];
181*61046927SAndroid Build Coastguard Worker    };
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker    struct {
184*61046927SAndroid Build Coastguard Worker       bool writes_layer;
185*61046927SAndroid Build Coastguard Worker       bool writes_point_size;
186*61046927SAndroid Build Coastguard Worker       uint8_t clip_enable;
187*61046927SAndroid Build Coastguard Worker       uint8_t cull_enable;
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker       struct nak_xfb_info xfb;
190*61046927SAndroid Build Coastguard Worker    } vtg;
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker    /** Shader header for 3D stages */
193*61046927SAndroid Build Coastguard Worker    uint32_t hdr[32];
194*61046927SAndroid Build Coastguard Worker };
195*61046927SAndroid Build Coastguard Worker #pragma GCC diagnostic pop
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker struct nak_shader_bin {
198*61046927SAndroid Build Coastguard Worker    struct nak_shader_info info;
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker    uint32_t code_size;
201*61046927SAndroid Build Coastguard Worker    const void *code;
202*61046927SAndroid Build Coastguard Worker 
203*61046927SAndroid Build Coastguard Worker    const char *asm_str;
204*61046927SAndroid Build Coastguard Worker };
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker void nak_shader_bin_destroy(struct nak_shader_bin *bin);
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker struct nak_shader_bin *
209*61046927SAndroid Build Coastguard Worker nak_compile_shader(nir_shader *nir, bool dump_asm,
210*61046927SAndroid Build Coastguard Worker                    const struct nak_compiler *nak,
211*61046927SAndroid Build Coastguard Worker                    nir_variable_mode robust2_modes,
212*61046927SAndroid Build Coastguard Worker                    const struct nak_fs_key *fs_key);
213*61046927SAndroid Build Coastguard Worker 
214*61046927SAndroid Build Coastguard Worker struct nak_qmd_cbuf {
215*61046927SAndroid Build Coastguard Worker    uint32_t index;
216*61046927SAndroid Build Coastguard Worker    uint32_t size;
217*61046927SAndroid Build Coastguard Worker    uint64_t addr;
218*61046927SAndroid Build Coastguard Worker };
219*61046927SAndroid Build Coastguard Worker 
220*61046927SAndroid Build Coastguard Worker struct nak_qmd_info {
221*61046927SAndroid Build Coastguard Worker    uint64_t addr;
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker    uint16_t smem_size;
224*61046927SAndroid Build Coastguard Worker    uint16_t smem_max;
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker    uint32_t global_size[3];
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker    uint32_t num_cbufs;
229*61046927SAndroid Build Coastguard Worker    struct nak_qmd_cbuf cbufs[8];
230*61046927SAndroid Build Coastguard Worker };
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker void nak_fill_qmd(const struct nv_device_info *dev,
233*61046927SAndroid Build Coastguard Worker                   const struct nak_shader_info *info,
234*61046927SAndroid Build Coastguard Worker                   const struct nak_qmd_info *qmd_info,
235*61046927SAndroid Build Coastguard Worker                   void *qmd_out, size_t qmd_size);
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker struct nak_qmd_dispatch_size_layout {
238*61046927SAndroid Build Coastguard Worker    uint16_t x_start, x_end;
239*61046927SAndroid Build Coastguard Worker    uint16_t y_start, y_end;
240*61046927SAndroid Build Coastguard Worker    uint16_t z_start, z_end;
241*61046927SAndroid Build Coastguard Worker };
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker struct nak_qmd_dispatch_size_layout
244*61046927SAndroid Build Coastguard Worker nak_get_qmd_dispatch_size_layout(const struct nv_device_info *dev);
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
247*61046927SAndroid Build Coastguard Worker }
248*61046927SAndroid Build Coastguard Worker #endif
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker #endif /* NAK_H */
251