1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2014 Intel Corporation
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker *
23*61046927SAndroid Build Coastguard Worker * Authors:
24*61046927SAndroid Build Coastguard Worker * Connor Abbott ([email protected])
25*61046927SAndroid Build Coastguard Worker *
26*61046927SAndroid Build Coastguard Worker */
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker #include <inttypes.h> /* for PRIx64 macro */
29*61046927SAndroid Build Coastguard Worker #include <math.h>
30*61046927SAndroid Build Coastguard Worker #include <stdio.h>
31*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
32*61046927SAndroid Build Coastguard Worker #include "compiler/shader_enums.h"
33*61046927SAndroid Build Coastguard Worker #include "util/half_float.h"
34*61046927SAndroid Build Coastguard Worker #include "util/memstream.h"
35*61046927SAndroid Build Coastguard Worker #include "util/mesa-blake3.h"
36*61046927SAndroid Build Coastguard Worker #include "vulkan/vulkan_core.h"
37*61046927SAndroid Build Coastguard Worker #include "nir.h"
38*61046927SAndroid Build Coastguard Worker #include "nir_builder.h"
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker static void
print_indentation(unsigned levels,FILE * fp)41*61046927SAndroid Build Coastguard Worker print_indentation(unsigned levels, FILE *fp)
42*61046927SAndroid Build Coastguard Worker {
43*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < levels; i++)
44*61046927SAndroid Build Coastguard Worker fprintf(fp, " ");
45*61046927SAndroid Build Coastguard Worker }
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard Worker typedef struct {
48*61046927SAndroid Build Coastguard Worker FILE *fp;
49*61046927SAndroid Build Coastguard Worker nir_shader *shader;
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker const char *def_prefix;
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker /** map from nir_variable -> printable name */
54*61046927SAndroid Build Coastguard Worker struct hash_table *ht;
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker /** set of names used so far for nir_variables */
57*61046927SAndroid Build Coastguard Worker struct set *syms;
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker /* an index used to make new non-conflicting names */
60*61046927SAndroid Build Coastguard Worker unsigned index;
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker /* Used with nir_gather_types() to identify best representation
63*61046927SAndroid Build Coastguard Worker * to print terse inline constant values together with SSA sources.
64*61046927SAndroid Build Coastguard Worker * Updated per nir_function_impl being printed.
65*61046927SAndroid Build Coastguard Worker */
66*61046927SAndroid Build Coastguard Worker BITSET_WORD *float_types;
67*61046927SAndroid Build Coastguard Worker BITSET_WORD *int_types;
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker /**
70*61046927SAndroid Build Coastguard Worker * Optional table of annotations mapping nir object
71*61046927SAndroid Build Coastguard Worker * (such as instr or var) to message to print.
72*61046927SAndroid Build Coastguard Worker */
73*61046927SAndroid Build Coastguard Worker struct hash_table *annotations;
74*61046927SAndroid Build Coastguard Worker
75*61046927SAndroid Build Coastguard Worker /* Maximum length for SSA or Reg index in the current impl */
76*61046927SAndroid Build Coastguard Worker unsigned max_dest_index;
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker /* Padding for instructions without destination to make
79*61046927SAndroid Build Coastguard Worker * them align with the `=` for instructions with destination.
80*61046927SAndroid Build Coastguard Worker */
81*61046927SAndroid Build Coastguard Worker unsigned padding_for_no_dest;
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker nir_debug_info_instr **debug_info;
84*61046927SAndroid Build Coastguard Worker } print_state;
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker static void
print_annotation(print_state * state,void * obj)87*61046927SAndroid Build Coastguard Worker print_annotation(print_state *state, void *obj)
88*61046927SAndroid Build Coastguard Worker {
89*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
90*61046927SAndroid Build Coastguard Worker
91*61046927SAndroid Build Coastguard Worker if (!state->annotations)
92*61046927SAndroid Build Coastguard Worker return;
93*61046927SAndroid Build Coastguard Worker
94*61046927SAndroid Build Coastguard Worker struct hash_entry *entry = _mesa_hash_table_search(state->annotations, obj);
95*61046927SAndroid Build Coastguard Worker if (!entry)
96*61046927SAndroid Build Coastguard Worker return;
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker const char *note = entry->data;
99*61046927SAndroid Build Coastguard Worker _mesa_hash_table_remove(state->annotations, entry);
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s\n\n", note);
102*61046927SAndroid Build Coastguard Worker }
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker /* For 1 element, the size is intentionally omitted. */
105*61046927SAndroid Build Coastguard Worker static const char *sizes[] = { "x??", " ", "x2 ", "x3 ", "x4 ",
106*61046927SAndroid Build Coastguard Worker "x5 ", "x??", "x??", "x8 ",
107*61046927SAndroid Build Coastguard Worker "x??", "x??", "x??", "x??",
108*61046927SAndroid Build Coastguard Worker "x??", "x??", "x??", "x16" };
109*61046927SAndroid Build Coastguard Worker
110*61046927SAndroid Build Coastguard Worker static const char *
divergence_status(print_state * state,bool divergent)111*61046927SAndroid Build Coastguard Worker divergence_status(print_state *state, bool divergent)
112*61046927SAndroid Build Coastguard Worker {
113*61046927SAndroid Build Coastguard Worker if (state->shader->info.divergence_analysis_run)
114*61046927SAndroid Build Coastguard Worker return divergent ? "div " : "con ";
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker return "";
117*61046927SAndroid Build Coastguard Worker }
118*61046927SAndroid Build Coastguard Worker
119*61046927SAndroid Build Coastguard Worker static unsigned
count_digits(unsigned n)120*61046927SAndroid Build Coastguard Worker count_digits(unsigned n)
121*61046927SAndroid Build Coastguard Worker {
122*61046927SAndroid Build Coastguard Worker return n ? (unsigned)floor(log10(n)) + 1u : 1u;
123*61046927SAndroid Build Coastguard Worker }
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker static void
print_def(nir_def * def,print_state * state)126*61046927SAndroid Build Coastguard Worker print_def(nir_def *def, print_state *state)
127*61046927SAndroid Build Coastguard Worker {
128*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
129*61046927SAndroid Build Coastguard Worker
130*61046927SAndroid Build Coastguard Worker const unsigned ssa_padding = state->max_dest_index ? count_digits(state->max_dest_index) - count_digits(def->index) : 0;
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker const unsigned padding = (def->bit_size == 1) + 1 + ssa_padding;
133*61046927SAndroid Build Coastguard Worker
134*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s%u%s%*s%s%u",
135*61046927SAndroid Build Coastguard Worker divergence_status(state, def->divergent),
136*61046927SAndroid Build Coastguard Worker def->bit_size, sizes[def->num_components],
137*61046927SAndroid Build Coastguard Worker padding, "", state->def_prefix, def->index);
138*61046927SAndroid Build Coastguard Worker }
139*61046927SAndroid Build Coastguard Worker
140*61046927SAndroid Build Coastguard Worker static unsigned
calculate_padding_for_no_dest(print_state * state)141*61046927SAndroid Build Coastguard Worker calculate_padding_for_no_dest(print_state *state)
142*61046927SAndroid Build Coastguard Worker {
143*61046927SAndroid Build Coastguard Worker const unsigned div = state->shader->info.divergence_analysis_run ? 4 : 0;
144*61046927SAndroid Build Coastguard Worker const unsigned ssa_size = 5;
145*61046927SAndroid Build Coastguard Worker const unsigned percent = 1;
146*61046927SAndroid Build Coastguard Worker const unsigned ssa_index = count_digits(state->max_dest_index);
147*61046927SAndroid Build Coastguard Worker const unsigned equals = 1;
148*61046927SAndroid Build Coastguard Worker return ssa_size + 1 + div + percent + ssa_index + 1 + equals + 1;
149*61046927SAndroid Build Coastguard Worker }
150*61046927SAndroid Build Coastguard Worker
151*61046927SAndroid Build Coastguard Worker static void
print_no_dest_padding(print_state * state)152*61046927SAndroid Build Coastguard Worker print_no_dest_padding(print_state *state)
153*61046927SAndroid Build Coastguard Worker {
154*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker if (state->padding_for_no_dest)
157*61046927SAndroid Build Coastguard Worker fprintf(fp, "%*s", state->padding_for_no_dest, "");
158*61046927SAndroid Build Coastguard Worker }
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Worker static void
print_hex_padded_const_value(const nir_const_value * value,unsigned bit_size,FILE * fp)161*61046927SAndroid Build Coastguard Worker print_hex_padded_const_value(const nir_const_value *value, unsigned bit_size, FILE *fp)
162*61046927SAndroid Build Coastguard Worker {
163*61046927SAndroid Build Coastguard Worker switch (bit_size) {
164*61046927SAndroid Build Coastguard Worker case 64:
165*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%016" PRIx64, value->u64);
166*61046927SAndroid Build Coastguard Worker break;
167*61046927SAndroid Build Coastguard Worker case 32:
168*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%08x", value->u32);
169*61046927SAndroid Build Coastguard Worker break;
170*61046927SAndroid Build Coastguard Worker case 16:
171*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%04x", value->u16);
172*61046927SAndroid Build Coastguard Worker break;
173*61046927SAndroid Build Coastguard Worker case 8:
174*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%02x", value->u8);
175*61046927SAndroid Build Coastguard Worker break;
176*61046927SAndroid Build Coastguard Worker default:
177*61046927SAndroid Build Coastguard Worker unreachable("unhandled bit size");
178*61046927SAndroid Build Coastguard Worker }
179*61046927SAndroid Build Coastguard Worker }
180*61046927SAndroid Build Coastguard Worker
181*61046927SAndroid Build Coastguard Worker static void
print_hex_terse_const_value(const nir_const_value * value,unsigned bit_size,FILE * fp)182*61046927SAndroid Build Coastguard Worker print_hex_terse_const_value(const nir_const_value *value, unsigned bit_size, FILE *fp)
183*61046927SAndroid Build Coastguard Worker {
184*61046927SAndroid Build Coastguard Worker switch (bit_size) {
185*61046927SAndroid Build Coastguard Worker case 64:
186*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%" PRIx64, value->u64);
187*61046927SAndroid Build Coastguard Worker break;
188*61046927SAndroid Build Coastguard Worker case 32:
189*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%x", value->u32);
190*61046927SAndroid Build Coastguard Worker break;
191*61046927SAndroid Build Coastguard Worker case 16:
192*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%x", value->u16);
193*61046927SAndroid Build Coastguard Worker break;
194*61046927SAndroid Build Coastguard Worker case 8:
195*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%x", value->u8);
196*61046927SAndroid Build Coastguard Worker break;
197*61046927SAndroid Build Coastguard Worker default:
198*61046927SAndroid Build Coastguard Worker unreachable("unhandled bit size");
199*61046927SAndroid Build Coastguard Worker }
200*61046927SAndroid Build Coastguard Worker }
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker static void
print_float_const_value(const nir_const_value * value,unsigned bit_size,FILE * fp)203*61046927SAndroid Build Coastguard Worker print_float_const_value(const nir_const_value *value, unsigned bit_size, FILE *fp)
204*61046927SAndroid Build Coastguard Worker {
205*61046927SAndroid Build Coastguard Worker switch (bit_size) {
206*61046927SAndroid Build Coastguard Worker case 64:
207*61046927SAndroid Build Coastguard Worker fprintf(fp, "%f", value->f64);
208*61046927SAndroid Build Coastguard Worker break;
209*61046927SAndroid Build Coastguard Worker case 32:
210*61046927SAndroid Build Coastguard Worker fprintf(fp, "%f", value->f32);
211*61046927SAndroid Build Coastguard Worker break;
212*61046927SAndroid Build Coastguard Worker case 16:
213*61046927SAndroid Build Coastguard Worker fprintf(fp, "%f", _mesa_half_to_float(value->u16));
214*61046927SAndroid Build Coastguard Worker break;
215*61046927SAndroid Build Coastguard Worker default:
216*61046927SAndroid Build Coastguard Worker unreachable("unhandled bit size");
217*61046927SAndroid Build Coastguard Worker }
218*61046927SAndroid Build Coastguard Worker }
219*61046927SAndroid Build Coastguard Worker
220*61046927SAndroid Build Coastguard Worker static void
print_int_const_value(const nir_const_value * value,unsigned bit_size,FILE * fp)221*61046927SAndroid Build Coastguard Worker print_int_const_value(const nir_const_value *value, unsigned bit_size, FILE *fp)
222*61046927SAndroid Build Coastguard Worker {
223*61046927SAndroid Build Coastguard Worker switch (bit_size) {
224*61046927SAndroid Build Coastguard Worker case 64:
225*61046927SAndroid Build Coastguard Worker fprintf(fp, "%+" PRIi64, value->i64);
226*61046927SAndroid Build Coastguard Worker break;
227*61046927SAndroid Build Coastguard Worker case 32:
228*61046927SAndroid Build Coastguard Worker fprintf(fp, "%+d", value->i32);
229*61046927SAndroid Build Coastguard Worker break;
230*61046927SAndroid Build Coastguard Worker case 16:
231*61046927SAndroid Build Coastguard Worker fprintf(fp, "%+d", value->i16);
232*61046927SAndroid Build Coastguard Worker break;
233*61046927SAndroid Build Coastguard Worker case 8:
234*61046927SAndroid Build Coastguard Worker fprintf(fp, "%+d", value->i8);
235*61046927SAndroid Build Coastguard Worker break;
236*61046927SAndroid Build Coastguard Worker default:
237*61046927SAndroid Build Coastguard Worker unreachable("unhandled bit size");
238*61046927SAndroid Build Coastguard Worker }
239*61046927SAndroid Build Coastguard Worker }
240*61046927SAndroid Build Coastguard Worker
241*61046927SAndroid Build Coastguard Worker static void
print_uint_const_value(const nir_const_value * value,unsigned bit_size,FILE * fp)242*61046927SAndroid Build Coastguard Worker print_uint_const_value(const nir_const_value *value, unsigned bit_size, FILE *fp)
243*61046927SAndroid Build Coastguard Worker {
244*61046927SAndroid Build Coastguard Worker switch (bit_size) {
245*61046927SAndroid Build Coastguard Worker case 64:
246*61046927SAndroid Build Coastguard Worker fprintf(fp, "%" PRIu64, value->u64);
247*61046927SAndroid Build Coastguard Worker break;
248*61046927SAndroid Build Coastguard Worker case 32:
249*61046927SAndroid Build Coastguard Worker fprintf(fp, "%u", value->u32);
250*61046927SAndroid Build Coastguard Worker break;
251*61046927SAndroid Build Coastguard Worker case 16:
252*61046927SAndroid Build Coastguard Worker fprintf(fp, "%u", value->u16);
253*61046927SAndroid Build Coastguard Worker break;
254*61046927SAndroid Build Coastguard Worker case 8:
255*61046927SAndroid Build Coastguard Worker fprintf(fp, "%u", value->u8);
256*61046927SAndroid Build Coastguard Worker break;
257*61046927SAndroid Build Coastguard Worker default:
258*61046927SAndroid Build Coastguard Worker unreachable("unhandled bit size");
259*61046927SAndroid Build Coastguard Worker }
260*61046927SAndroid Build Coastguard Worker }
261*61046927SAndroid Build Coastguard Worker
262*61046927SAndroid Build Coastguard Worker static void
print_const_from_load(nir_load_const_instr * instr,print_state * state,nir_alu_type type)263*61046927SAndroid Build Coastguard Worker print_const_from_load(nir_load_const_instr *instr, print_state *state, nir_alu_type type)
264*61046927SAndroid Build Coastguard Worker {
265*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
266*61046927SAndroid Build Coastguard Worker
267*61046927SAndroid Build Coastguard Worker const unsigned bit_size = instr->def.bit_size;
268*61046927SAndroid Build Coastguard Worker const unsigned num_components = instr->def.num_components;
269*61046927SAndroid Build Coastguard Worker
270*61046927SAndroid Build Coastguard Worker type = nir_alu_type_get_base_type(type);
271*61046927SAndroid Build Coastguard Worker
272*61046927SAndroid Build Coastguard Worker /* There's only one way to print booleans. */
273*61046927SAndroid Build Coastguard Worker if (bit_size == 1 || type == nir_type_bool) {
274*61046927SAndroid Build Coastguard Worker fprintf(fp, "(");
275*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_components; i++) {
276*61046927SAndroid Build Coastguard Worker if (i != 0)
277*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
278*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", instr->value[i].b ? "true" : "false");
279*61046927SAndroid Build Coastguard Worker }
280*61046927SAndroid Build Coastguard Worker fprintf(fp, ")");
281*61046927SAndroid Build Coastguard Worker return;
282*61046927SAndroid Build Coastguard Worker }
283*61046927SAndroid Build Coastguard Worker
284*61046927SAndroid Build Coastguard Worker fprintf(fp, "(");
285*61046927SAndroid Build Coastguard Worker
286*61046927SAndroid Build Coastguard Worker if (type != nir_type_invalid) {
287*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_components; i++) {
288*61046927SAndroid Build Coastguard Worker const nir_const_value *v = &instr->value[i];
289*61046927SAndroid Build Coastguard Worker if (i != 0)
290*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
291*61046927SAndroid Build Coastguard Worker switch (type) {
292*61046927SAndroid Build Coastguard Worker case nir_type_float:
293*61046927SAndroid Build Coastguard Worker print_float_const_value(v, bit_size, fp);
294*61046927SAndroid Build Coastguard Worker break;
295*61046927SAndroid Build Coastguard Worker case nir_type_int:
296*61046927SAndroid Build Coastguard Worker case nir_type_uint:
297*61046927SAndroid Build Coastguard Worker print_hex_terse_const_value(v, bit_size, fp);
298*61046927SAndroid Build Coastguard Worker break;
299*61046927SAndroid Build Coastguard Worker
300*61046927SAndroid Build Coastguard Worker default:
301*61046927SAndroid Build Coastguard Worker unreachable("invalid nir alu base type");
302*61046927SAndroid Build Coastguard Worker }
303*61046927SAndroid Build Coastguard Worker }
304*61046927SAndroid Build Coastguard Worker } else {
305*61046927SAndroid Build Coastguard Worker #define PRINT_VALUES(F) \
306*61046927SAndroid Build Coastguard Worker do { \
307*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_components; i++) { \
308*61046927SAndroid Build Coastguard Worker if (i != 0) \
309*61046927SAndroid Build Coastguard Worker fprintf(fp, ", "); \
310*61046927SAndroid Build Coastguard Worker F(&instr->value[i], bit_size, fp); \
311*61046927SAndroid Build Coastguard Worker } \
312*61046927SAndroid Build Coastguard Worker } while (0)
313*61046927SAndroid Build Coastguard Worker
314*61046927SAndroid Build Coastguard Worker #define SEPARATOR() \
315*61046927SAndroid Build Coastguard Worker if (num_components > 1) \
316*61046927SAndroid Build Coastguard Worker fprintf(fp, ") = ("); \
317*61046927SAndroid Build Coastguard Worker else \
318*61046927SAndroid Build Coastguard Worker fprintf(fp, " = ")
319*61046927SAndroid Build Coastguard Worker
320*61046927SAndroid Build Coastguard Worker bool needs_float = bit_size > 8;
321*61046927SAndroid Build Coastguard Worker bool needs_signed = false;
322*61046927SAndroid Build Coastguard Worker bool needs_decimal = false;
323*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_components; i++) {
324*61046927SAndroid Build Coastguard Worker const nir_const_value *v = &instr->value[i];
325*61046927SAndroid Build Coastguard Worker switch (bit_size) {
326*61046927SAndroid Build Coastguard Worker case 64:
327*61046927SAndroid Build Coastguard Worker needs_signed |= v->i64 < 0;
328*61046927SAndroid Build Coastguard Worker needs_decimal |= v->u64 >= 10;
329*61046927SAndroid Build Coastguard Worker break;
330*61046927SAndroid Build Coastguard Worker case 32:
331*61046927SAndroid Build Coastguard Worker needs_signed |= v->i32 < 0;
332*61046927SAndroid Build Coastguard Worker needs_decimal |= v->u32 >= 10;
333*61046927SAndroid Build Coastguard Worker break;
334*61046927SAndroid Build Coastguard Worker case 16:
335*61046927SAndroid Build Coastguard Worker needs_signed |= v->i16 < 0;
336*61046927SAndroid Build Coastguard Worker needs_decimal |= v->u16 >= 10;
337*61046927SAndroid Build Coastguard Worker break;
338*61046927SAndroid Build Coastguard Worker case 8:
339*61046927SAndroid Build Coastguard Worker needs_signed |= v->i8 < 0;
340*61046927SAndroid Build Coastguard Worker needs_decimal |= v->u8 >= 10;
341*61046927SAndroid Build Coastguard Worker break;
342*61046927SAndroid Build Coastguard Worker default:
343*61046927SAndroid Build Coastguard Worker unreachable("invalid bit size");
344*61046927SAndroid Build Coastguard Worker }
345*61046927SAndroid Build Coastguard Worker }
346*61046927SAndroid Build Coastguard Worker
347*61046927SAndroid Build Coastguard Worker if (state->int_types) {
348*61046927SAndroid Build Coastguard Worker const unsigned index = instr->def.index;
349*61046927SAndroid Build Coastguard Worker const bool inferred_int = BITSET_TEST(state->int_types, index);
350*61046927SAndroid Build Coastguard Worker const bool inferred_float = BITSET_TEST(state->float_types, index);
351*61046927SAndroid Build Coastguard Worker
352*61046927SAndroid Build Coastguard Worker if (inferred_int && !inferred_float) {
353*61046927SAndroid Build Coastguard Worker needs_float = false;
354*61046927SAndroid Build Coastguard Worker } else if (inferred_float && !inferred_int) {
355*61046927SAndroid Build Coastguard Worker needs_signed = false;
356*61046927SAndroid Build Coastguard Worker needs_decimal = false;
357*61046927SAndroid Build Coastguard Worker }
358*61046927SAndroid Build Coastguard Worker }
359*61046927SAndroid Build Coastguard Worker
360*61046927SAndroid Build Coastguard Worker PRINT_VALUES(print_hex_padded_const_value);
361*61046927SAndroid Build Coastguard Worker
362*61046927SAndroid Build Coastguard Worker if (needs_float) {
363*61046927SAndroid Build Coastguard Worker SEPARATOR();
364*61046927SAndroid Build Coastguard Worker PRINT_VALUES(print_float_const_value);
365*61046927SAndroid Build Coastguard Worker }
366*61046927SAndroid Build Coastguard Worker
367*61046927SAndroid Build Coastguard Worker if (needs_signed) {
368*61046927SAndroid Build Coastguard Worker SEPARATOR();
369*61046927SAndroid Build Coastguard Worker PRINT_VALUES(print_int_const_value);
370*61046927SAndroid Build Coastguard Worker }
371*61046927SAndroid Build Coastguard Worker
372*61046927SAndroid Build Coastguard Worker if (needs_decimal) {
373*61046927SAndroid Build Coastguard Worker SEPARATOR();
374*61046927SAndroid Build Coastguard Worker PRINT_VALUES(print_uint_const_value);
375*61046927SAndroid Build Coastguard Worker }
376*61046927SAndroid Build Coastguard Worker }
377*61046927SAndroid Build Coastguard Worker
378*61046927SAndroid Build Coastguard Worker fprintf(fp, ")");
379*61046927SAndroid Build Coastguard Worker }
380*61046927SAndroid Build Coastguard Worker
381*61046927SAndroid Build Coastguard Worker static void
print_load_const_instr(nir_load_const_instr * instr,print_state * state)382*61046927SAndroid Build Coastguard Worker print_load_const_instr(nir_load_const_instr *instr, print_state *state)
383*61046927SAndroid Build Coastguard Worker {
384*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
385*61046927SAndroid Build Coastguard Worker
386*61046927SAndroid Build Coastguard Worker print_def(&instr->def, state);
387*61046927SAndroid Build Coastguard Worker
388*61046927SAndroid Build Coastguard Worker fprintf(fp, " = load_const ");
389*61046927SAndroid Build Coastguard Worker
390*61046927SAndroid Build Coastguard Worker /* In the definition, print all interpretations of the value. */
391*61046927SAndroid Build Coastguard Worker print_const_from_load(instr, state, nir_type_invalid);
392*61046927SAndroid Build Coastguard Worker }
393*61046927SAndroid Build Coastguard Worker
394*61046927SAndroid Build Coastguard Worker static void
print_src(const nir_src * src,print_state * state,nir_alu_type src_type)395*61046927SAndroid Build Coastguard Worker print_src(const nir_src *src, print_state *state, nir_alu_type src_type)
396*61046927SAndroid Build Coastguard Worker {
397*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
398*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s%u", state->def_prefix, src->ssa->index);
399*61046927SAndroid Build Coastguard Worker nir_instr *instr = src->ssa->parent_instr;
400*61046927SAndroid Build Coastguard Worker
401*61046927SAndroid Build Coastguard Worker if (instr->type == nir_instr_type_load_const && !NIR_DEBUG(PRINT_NO_INLINE_CONSTS)) {
402*61046927SAndroid Build Coastguard Worker nir_load_const_instr *load_const = nir_instr_as_load_const(instr);
403*61046927SAndroid Build Coastguard Worker fprintf(fp, " ");
404*61046927SAndroid Build Coastguard Worker
405*61046927SAndroid Build Coastguard Worker nir_alu_type type = nir_alu_type_get_base_type(src_type);
406*61046927SAndroid Build Coastguard Worker
407*61046927SAndroid Build Coastguard Worker if (type == nir_type_invalid && state->int_types) {
408*61046927SAndroid Build Coastguard Worker const unsigned index = load_const->def.index;
409*61046927SAndroid Build Coastguard Worker const bool inferred_int = BITSET_TEST(state->int_types, index);
410*61046927SAndroid Build Coastguard Worker const bool inferred_float = BITSET_TEST(state->float_types, index);
411*61046927SAndroid Build Coastguard Worker
412*61046927SAndroid Build Coastguard Worker if (inferred_float && !inferred_int)
413*61046927SAndroid Build Coastguard Worker type = nir_type_float;
414*61046927SAndroid Build Coastguard Worker }
415*61046927SAndroid Build Coastguard Worker
416*61046927SAndroid Build Coastguard Worker if (type == nir_type_invalid)
417*61046927SAndroid Build Coastguard Worker type = nir_type_uint;
418*61046927SAndroid Build Coastguard Worker
419*61046927SAndroid Build Coastguard Worker /* For a constant in a source, always pick one interpretation. */
420*61046927SAndroid Build Coastguard Worker assert(type != nir_type_invalid);
421*61046927SAndroid Build Coastguard Worker print_const_from_load(load_const, state, type);
422*61046927SAndroid Build Coastguard Worker }
423*61046927SAndroid Build Coastguard Worker }
424*61046927SAndroid Build Coastguard Worker
425*61046927SAndroid Build Coastguard Worker static const char *
comp_mask_string(unsigned num_components)426*61046927SAndroid Build Coastguard Worker comp_mask_string(unsigned num_components)
427*61046927SAndroid Build Coastguard Worker {
428*61046927SAndroid Build Coastguard Worker return (num_components > 4) ? "abcdefghijklmnop" : "xyzw";
429*61046927SAndroid Build Coastguard Worker }
430*61046927SAndroid Build Coastguard Worker
431*61046927SAndroid Build Coastguard Worker static void
print_alu_src(nir_alu_instr * instr,unsigned src,print_state * state)432*61046927SAndroid Build Coastguard Worker print_alu_src(nir_alu_instr *instr, unsigned src, print_state *state)
433*61046927SAndroid Build Coastguard Worker {
434*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
435*61046927SAndroid Build Coastguard Worker
436*61046927SAndroid Build Coastguard Worker const nir_op_info *info = &nir_op_infos[instr->op];
437*61046927SAndroid Build Coastguard Worker print_src(&instr->src[src].src, state, info->input_types[src]);
438*61046927SAndroid Build Coastguard Worker
439*61046927SAndroid Build Coastguard Worker bool print_swizzle = false;
440*61046927SAndroid Build Coastguard Worker nir_component_mask_t used_channels = 0;
441*61046927SAndroid Build Coastguard Worker
442*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++) {
443*61046927SAndroid Build Coastguard Worker if (!nir_alu_instr_channel_used(instr, src, i))
444*61046927SAndroid Build Coastguard Worker continue;
445*61046927SAndroid Build Coastguard Worker
446*61046927SAndroid Build Coastguard Worker used_channels++;
447*61046927SAndroid Build Coastguard Worker
448*61046927SAndroid Build Coastguard Worker if (instr->src[src].swizzle[i] != i) {
449*61046927SAndroid Build Coastguard Worker print_swizzle = true;
450*61046927SAndroid Build Coastguard Worker break;
451*61046927SAndroid Build Coastguard Worker }
452*61046927SAndroid Build Coastguard Worker }
453*61046927SAndroid Build Coastguard Worker
454*61046927SAndroid Build Coastguard Worker unsigned live_channels = nir_src_num_components(instr->src[src].src);
455*61046927SAndroid Build Coastguard Worker
456*61046927SAndroid Build Coastguard Worker if (print_swizzle || used_channels != live_channels) {
457*61046927SAndroid Build Coastguard Worker fprintf(fp, ".");
458*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++) {
459*61046927SAndroid Build Coastguard Worker if (!nir_alu_instr_channel_used(instr, src, i))
460*61046927SAndroid Build Coastguard Worker continue;
461*61046927SAndroid Build Coastguard Worker
462*61046927SAndroid Build Coastguard Worker fprintf(fp, "%c", comp_mask_string(live_channels)[instr->src[src].swizzle[i]]);
463*61046927SAndroid Build Coastguard Worker }
464*61046927SAndroid Build Coastguard Worker }
465*61046927SAndroid Build Coastguard Worker }
466*61046927SAndroid Build Coastguard Worker
467*61046927SAndroid Build Coastguard Worker static void
print_alu_instr(nir_alu_instr * instr,print_state * state)468*61046927SAndroid Build Coastguard Worker print_alu_instr(nir_alu_instr *instr, print_state *state)
469*61046927SAndroid Build Coastguard Worker {
470*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
471*61046927SAndroid Build Coastguard Worker
472*61046927SAndroid Build Coastguard Worker print_def(&instr->def, state);
473*61046927SAndroid Build Coastguard Worker
474*61046927SAndroid Build Coastguard Worker fprintf(fp, " = %s", nir_op_infos[instr->op].name);
475*61046927SAndroid Build Coastguard Worker if (instr->exact)
476*61046927SAndroid Build Coastguard Worker fprintf(fp, "!");
477*61046927SAndroid Build Coastguard Worker if (instr->no_signed_wrap)
478*61046927SAndroid Build Coastguard Worker fprintf(fp, ".nsw");
479*61046927SAndroid Build Coastguard Worker if (instr->no_unsigned_wrap)
480*61046927SAndroid Build Coastguard Worker fprintf(fp, ".nuw");
481*61046927SAndroid Build Coastguard Worker fprintf(fp, " ");
482*61046927SAndroid Build Coastguard Worker
483*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++) {
484*61046927SAndroid Build Coastguard Worker if (i != 0)
485*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
486*61046927SAndroid Build Coastguard Worker
487*61046927SAndroid Build Coastguard Worker print_alu_src(instr, i, state);
488*61046927SAndroid Build Coastguard Worker }
489*61046927SAndroid Build Coastguard Worker }
490*61046927SAndroid Build Coastguard Worker
491*61046927SAndroid Build Coastguard Worker static const char *
get_var_name(nir_variable * var,print_state * state)492*61046927SAndroid Build Coastguard Worker get_var_name(nir_variable *var, print_state *state)
493*61046927SAndroid Build Coastguard Worker {
494*61046927SAndroid Build Coastguard Worker if (state->ht == NULL)
495*61046927SAndroid Build Coastguard Worker return var->name ? var->name : "unnamed";
496*61046927SAndroid Build Coastguard Worker
497*61046927SAndroid Build Coastguard Worker assert(state->syms);
498*61046927SAndroid Build Coastguard Worker
499*61046927SAndroid Build Coastguard Worker struct hash_entry *entry = _mesa_hash_table_search(state->ht, var);
500*61046927SAndroid Build Coastguard Worker if (entry)
501*61046927SAndroid Build Coastguard Worker return entry->data;
502*61046927SAndroid Build Coastguard Worker
503*61046927SAndroid Build Coastguard Worker char *name;
504*61046927SAndroid Build Coastguard Worker if (var->name == NULL) {
505*61046927SAndroid Build Coastguard Worker name = ralloc_asprintf(state->syms, "#%u", state->index++);
506*61046927SAndroid Build Coastguard Worker } else {
507*61046927SAndroid Build Coastguard Worker struct set_entry *set_entry = _mesa_set_search(state->syms, var->name);
508*61046927SAndroid Build Coastguard Worker if (set_entry != NULL) {
509*61046927SAndroid Build Coastguard Worker /* we have a collision with another name, append an # + a unique
510*61046927SAndroid Build Coastguard Worker * index */
511*61046927SAndroid Build Coastguard Worker name = ralloc_asprintf(state->syms, "%s#%u", var->name,
512*61046927SAndroid Build Coastguard Worker state->index++);
513*61046927SAndroid Build Coastguard Worker } else {
514*61046927SAndroid Build Coastguard Worker /* Mark this one as seen */
515*61046927SAndroid Build Coastguard Worker _mesa_set_add(state->syms, var->name);
516*61046927SAndroid Build Coastguard Worker name = var->name;
517*61046927SAndroid Build Coastguard Worker }
518*61046927SAndroid Build Coastguard Worker }
519*61046927SAndroid Build Coastguard Worker
520*61046927SAndroid Build Coastguard Worker _mesa_hash_table_insert(state->ht, var, name);
521*61046927SAndroid Build Coastguard Worker
522*61046927SAndroid Build Coastguard Worker return name;
523*61046927SAndroid Build Coastguard Worker }
524*61046927SAndroid Build Coastguard Worker
525*61046927SAndroid Build Coastguard Worker static const char *
get_constant_sampler_addressing_mode(enum cl_sampler_addressing_mode mode)526*61046927SAndroid Build Coastguard Worker get_constant_sampler_addressing_mode(enum cl_sampler_addressing_mode mode)
527*61046927SAndroid Build Coastguard Worker {
528*61046927SAndroid Build Coastguard Worker switch (mode) {
529*61046927SAndroid Build Coastguard Worker case SAMPLER_ADDRESSING_MODE_NONE:
530*61046927SAndroid Build Coastguard Worker return "none";
531*61046927SAndroid Build Coastguard Worker case SAMPLER_ADDRESSING_MODE_CLAMP_TO_EDGE:
532*61046927SAndroid Build Coastguard Worker return "clamp_to_edge";
533*61046927SAndroid Build Coastguard Worker case SAMPLER_ADDRESSING_MODE_CLAMP:
534*61046927SAndroid Build Coastguard Worker return "clamp";
535*61046927SAndroid Build Coastguard Worker case SAMPLER_ADDRESSING_MODE_REPEAT:
536*61046927SAndroid Build Coastguard Worker return "repeat";
537*61046927SAndroid Build Coastguard Worker case SAMPLER_ADDRESSING_MODE_REPEAT_MIRRORED:
538*61046927SAndroid Build Coastguard Worker return "repeat_mirrored";
539*61046927SAndroid Build Coastguard Worker default:
540*61046927SAndroid Build Coastguard Worker unreachable("Invalid addressing mode");
541*61046927SAndroid Build Coastguard Worker }
542*61046927SAndroid Build Coastguard Worker }
543*61046927SAndroid Build Coastguard Worker
544*61046927SAndroid Build Coastguard Worker static const char *
get_constant_sampler_filter_mode(enum cl_sampler_filter_mode mode)545*61046927SAndroid Build Coastguard Worker get_constant_sampler_filter_mode(enum cl_sampler_filter_mode mode)
546*61046927SAndroid Build Coastguard Worker {
547*61046927SAndroid Build Coastguard Worker switch (mode) {
548*61046927SAndroid Build Coastguard Worker case SAMPLER_FILTER_MODE_NEAREST:
549*61046927SAndroid Build Coastguard Worker return "nearest";
550*61046927SAndroid Build Coastguard Worker case SAMPLER_FILTER_MODE_LINEAR:
551*61046927SAndroid Build Coastguard Worker return "linear";
552*61046927SAndroid Build Coastguard Worker default:
553*61046927SAndroid Build Coastguard Worker unreachable("Invalid filter mode");
554*61046927SAndroid Build Coastguard Worker }
555*61046927SAndroid Build Coastguard Worker }
556*61046927SAndroid Build Coastguard Worker
557*61046927SAndroid Build Coastguard Worker static void
print_constant(nir_constant * c,const struct glsl_type * type,print_state * state)558*61046927SAndroid Build Coastguard Worker print_constant(nir_constant *c, const struct glsl_type *type, print_state *state)
559*61046927SAndroid Build Coastguard Worker {
560*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
561*61046927SAndroid Build Coastguard Worker const unsigned rows = glsl_get_vector_elements(type);
562*61046927SAndroid Build Coastguard Worker const unsigned cols = glsl_get_matrix_columns(type);
563*61046927SAndroid Build Coastguard Worker unsigned i;
564*61046927SAndroid Build Coastguard Worker
565*61046927SAndroid Build Coastguard Worker switch (glsl_get_base_type(type)) {
566*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_BOOL:
567*61046927SAndroid Build Coastguard Worker /* Only float base types can be matrices. */
568*61046927SAndroid Build Coastguard Worker assert(cols == 1);
569*61046927SAndroid Build Coastguard Worker
570*61046927SAndroid Build Coastguard Worker for (i = 0; i < rows; i++) {
571*61046927SAndroid Build Coastguard Worker if (i > 0)
572*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
573*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", c->values[i].b ? "true" : "false");
574*61046927SAndroid Build Coastguard Worker }
575*61046927SAndroid Build Coastguard Worker break;
576*61046927SAndroid Build Coastguard Worker
577*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_UINT8:
578*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_INT8:
579*61046927SAndroid Build Coastguard Worker /* Only float base types can be matrices. */
580*61046927SAndroid Build Coastguard Worker assert(cols == 1);
581*61046927SAndroid Build Coastguard Worker
582*61046927SAndroid Build Coastguard Worker for (i = 0; i < rows; i++) {
583*61046927SAndroid Build Coastguard Worker if (i > 0)
584*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
585*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%02x", c->values[i].u8);
586*61046927SAndroid Build Coastguard Worker }
587*61046927SAndroid Build Coastguard Worker break;
588*61046927SAndroid Build Coastguard Worker
589*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_UINT16:
590*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_INT16:
591*61046927SAndroid Build Coastguard Worker /* Only float base types can be matrices. */
592*61046927SAndroid Build Coastguard Worker assert(cols == 1);
593*61046927SAndroid Build Coastguard Worker
594*61046927SAndroid Build Coastguard Worker for (i = 0; i < rows; i++) {
595*61046927SAndroid Build Coastguard Worker if (i > 0)
596*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
597*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%04x", c->values[i].u16);
598*61046927SAndroid Build Coastguard Worker }
599*61046927SAndroid Build Coastguard Worker break;
600*61046927SAndroid Build Coastguard Worker
601*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_UINT:
602*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_INT:
603*61046927SAndroid Build Coastguard Worker /* Only float base types can be matrices. */
604*61046927SAndroid Build Coastguard Worker assert(cols == 1);
605*61046927SAndroid Build Coastguard Worker
606*61046927SAndroid Build Coastguard Worker for (i = 0; i < rows; i++) {
607*61046927SAndroid Build Coastguard Worker if (i > 0)
608*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
609*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%08x", c->values[i].u32);
610*61046927SAndroid Build Coastguard Worker }
611*61046927SAndroid Build Coastguard Worker break;
612*61046927SAndroid Build Coastguard Worker
613*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_FLOAT16:
614*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_FLOAT:
615*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_DOUBLE:
616*61046927SAndroid Build Coastguard Worker if (cols > 1) {
617*61046927SAndroid Build Coastguard Worker for (i = 0; i < cols; i++) {
618*61046927SAndroid Build Coastguard Worker if (i > 0)
619*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
620*61046927SAndroid Build Coastguard Worker print_constant(c->elements[i], glsl_get_column_type(type), state);
621*61046927SAndroid Build Coastguard Worker }
622*61046927SAndroid Build Coastguard Worker } else {
623*61046927SAndroid Build Coastguard Worker switch (glsl_get_base_type(type)) {
624*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_FLOAT16:
625*61046927SAndroid Build Coastguard Worker for (i = 0; i < rows; i++) {
626*61046927SAndroid Build Coastguard Worker if (i > 0)
627*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
628*61046927SAndroid Build Coastguard Worker fprintf(fp, "%f", _mesa_half_to_float(c->values[i].u16));
629*61046927SAndroid Build Coastguard Worker }
630*61046927SAndroid Build Coastguard Worker break;
631*61046927SAndroid Build Coastguard Worker
632*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_FLOAT:
633*61046927SAndroid Build Coastguard Worker for (i = 0; i < rows; i++) {
634*61046927SAndroid Build Coastguard Worker if (i > 0)
635*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
636*61046927SAndroid Build Coastguard Worker fprintf(fp, "%f", c->values[i].f32);
637*61046927SAndroid Build Coastguard Worker }
638*61046927SAndroid Build Coastguard Worker break;
639*61046927SAndroid Build Coastguard Worker
640*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_DOUBLE:
641*61046927SAndroid Build Coastguard Worker for (i = 0; i < rows; i++) {
642*61046927SAndroid Build Coastguard Worker if (i > 0)
643*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
644*61046927SAndroid Build Coastguard Worker fprintf(fp, "%f", c->values[i].f64);
645*61046927SAndroid Build Coastguard Worker }
646*61046927SAndroid Build Coastguard Worker break;
647*61046927SAndroid Build Coastguard Worker
648*61046927SAndroid Build Coastguard Worker default:
649*61046927SAndroid Build Coastguard Worker unreachable("Cannot get here from the first level switch");
650*61046927SAndroid Build Coastguard Worker }
651*61046927SAndroid Build Coastguard Worker }
652*61046927SAndroid Build Coastguard Worker break;
653*61046927SAndroid Build Coastguard Worker
654*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_UINT64:
655*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_INT64:
656*61046927SAndroid Build Coastguard Worker /* Only float base types can be matrices. */
657*61046927SAndroid Build Coastguard Worker assert(cols == 1);
658*61046927SAndroid Build Coastguard Worker
659*61046927SAndroid Build Coastguard Worker for (i = 0; i < cols; i++) {
660*61046927SAndroid Build Coastguard Worker if (i > 0)
661*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
662*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%08" PRIx64, c->values[i].u64);
663*61046927SAndroid Build Coastguard Worker }
664*61046927SAndroid Build Coastguard Worker break;
665*61046927SAndroid Build Coastguard Worker
666*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_STRUCT:
667*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_INTERFACE:
668*61046927SAndroid Build Coastguard Worker for (i = 0; i < c->num_elements; i++) {
669*61046927SAndroid Build Coastguard Worker if (i > 0)
670*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
671*61046927SAndroid Build Coastguard Worker fprintf(fp, "{ ");
672*61046927SAndroid Build Coastguard Worker print_constant(c->elements[i], glsl_get_struct_field(type, i), state);
673*61046927SAndroid Build Coastguard Worker fprintf(fp, " }");
674*61046927SAndroid Build Coastguard Worker }
675*61046927SAndroid Build Coastguard Worker break;
676*61046927SAndroid Build Coastguard Worker
677*61046927SAndroid Build Coastguard Worker case GLSL_TYPE_ARRAY:
678*61046927SAndroid Build Coastguard Worker for (i = 0; i < c->num_elements; i++) {
679*61046927SAndroid Build Coastguard Worker if (i > 0)
680*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
681*61046927SAndroid Build Coastguard Worker fprintf(fp, "{ ");
682*61046927SAndroid Build Coastguard Worker print_constant(c->elements[i], glsl_get_array_element(type), state);
683*61046927SAndroid Build Coastguard Worker fprintf(fp, " }");
684*61046927SAndroid Build Coastguard Worker }
685*61046927SAndroid Build Coastguard Worker break;
686*61046927SAndroid Build Coastguard Worker
687*61046927SAndroid Build Coastguard Worker default:
688*61046927SAndroid Build Coastguard Worker unreachable("not reached");
689*61046927SAndroid Build Coastguard Worker }
690*61046927SAndroid Build Coastguard Worker }
691*61046927SAndroid Build Coastguard Worker
692*61046927SAndroid Build Coastguard Worker static const char *
get_variable_mode_str(nir_variable_mode mode,bool want_local_global_mode)693*61046927SAndroid Build Coastguard Worker get_variable_mode_str(nir_variable_mode mode, bool want_local_global_mode)
694*61046927SAndroid Build Coastguard Worker {
695*61046927SAndroid Build Coastguard Worker switch (mode) {
696*61046927SAndroid Build Coastguard Worker case nir_var_shader_in:
697*61046927SAndroid Build Coastguard Worker return "shader_in";
698*61046927SAndroid Build Coastguard Worker case nir_var_shader_out:
699*61046927SAndroid Build Coastguard Worker return "shader_out";
700*61046927SAndroid Build Coastguard Worker case nir_var_uniform:
701*61046927SAndroid Build Coastguard Worker return "uniform";
702*61046927SAndroid Build Coastguard Worker case nir_var_mem_ubo:
703*61046927SAndroid Build Coastguard Worker return "ubo";
704*61046927SAndroid Build Coastguard Worker case nir_var_system_value:
705*61046927SAndroid Build Coastguard Worker return "system";
706*61046927SAndroid Build Coastguard Worker case nir_var_mem_ssbo:
707*61046927SAndroid Build Coastguard Worker return "ssbo";
708*61046927SAndroid Build Coastguard Worker case nir_var_mem_shared:
709*61046927SAndroid Build Coastguard Worker return "shared";
710*61046927SAndroid Build Coastguard Worker case nir_var_mem_global:
711*61046927SAndroid Build Coastguard Worker return "global";
712*61046927SAndroid Build Coastguard Worker case nir_var_mem_push_const:
713*61046927SAndroid Build Coastguard Worker return "push_const";
714*61046927SAndroid Build Coastguard Worker case nir_var_mem_constant:
715*61046927SAndroid Build Coastguard Worker return "constant";
716*61046927SAndroid Build Coastguard Worker case nir_var_image:
717*61046927SAndroid Build Coastguard Worker return "image";
718*61046927SAndroid Build Coastguard Worker case nir_var_shader_temp:
719*61046927SAndroid Build Coastguard Worker return want_local_global_mode ? "shader_temp" : "";
720*61046927SAndroid Build Coastguard Worker case nir_var_function_temp:
721*61046927SAndroid Build Coastguard Worker return want_local_global_mode ? "function_temp" : "";
722*61046927SAndroid Build Coastguard Worker case nir_var_shader_call_data:
723*61046927SAndroid Build Coastguard Worker return "shader_call_data";
724*61046927SAndroid Build Coastguard Worker case nir_var_ray_hit_attrib:
725*61046927SAndroid Build Coastguard Worker return "ray_hit_attrib";
726*61046927SAndroid Build Coastguard Worker case nir_var_mem_task_payload:
727*61046927SAndroid Build Coastguard Worker return "task_payload";
728*61046927SAndroid Build Coastguard Worker case nir_var_mem_node_payload:
729*61046927SAndroid Build Coastguard Worker return "node_payload";
730*61046927SAndroid Build Coastguard Worker case nir_var_mem_node_payload_in:
731*61046927SAndroid Build Coastguard Worker return "node_payload_in";
732*61046927SAndroid Build Coastguard Worker default:
733*61046927SAndroid Build Coastguard Worker if (mode && (mode & nir_var_mem_generic) == mode)
734*61046927SAndroid Build Coastguard Worker return "generic";
735*61046927SAndroid Build Coastguard Worker return "";
736*61046927SAndroid Build Coastguard Worker }
737*61046927SAndroid Build Coastguard Worker }
738*61046927SAndroid Build Coastguard Worker
739*61046927SAndroid Build Coastguard Worker static const char *
get_location_str(unsigned location,gl_shader_stage stage,nir_variable_mode mode,char * buf)740*61046927SAndroid Build Coastguard Worker get_location_str(unsigned location, gl_shader_stage stage,
741*61046927SAndroid Build Coastguard Worker nir_variable_mode mode, char *buf)
742*61046927SAndroid Build Coastguard Worker {
743*61046927SAndroid Build Coastguard Worker switch (stage) {
744*61046927SAndroid Build Coastguard Worker case MESA_SHADER_VERTEX:
745*61046927SAndroid Build Coastguard Worker if (mode == nir_var_shader_in)
746*61046927SAndroid Build Coastguard Worker return gl_vert_attrib_name(location);
747*61046927SAndroid Build Coastguard Worker else if (mode == nir_var_shader_out)
748*61046927SAndroid Build Coastguard Worker return gl_varying_slot_name_for_stage(location, stage);
749*61046927SAndroid Build Coastguard Worker
750*61046927SAndroid Build Coastguard Worker break;
751*61046927SAndroid Build Coastguard Worker case MESA_SHADER_TESS_CTRL:
752*61046927SAndroid Build Coastguard Worker case MESA_SHADER_TESS_EVAL:
753*61046927SAndroid Build Coastguard Worker case MESA_SHADER_TASK:
754*61046927SAndroid Build Coastguard Worker case MESA_SHADER_MESH:
755*61046927SAndroid Build Coastguard Worker case MESA_SHADER_GEOMETRY:
756*61046927SAndroid Build Coastguard Worker if (mode == nir_var_shader_in || mode == nir_var_shader_out)
757*61046927SAndroid Build Coastguard Worker return gl_varying_slot_name_for_stage(location, stage);
758*61046927SAndroid Build Coastguard Worker
759*61046927SAndroid Build Coastguard Worker break;
760*61046927SAndroid Build Coastguard Worker case MESA_SHADER_FRAGMENT:
761*61046927SAndroid Build Coastguard Worker if (mode == nir_var_shader_in)
762*61046927SAndroid Build Coastguard Worker return gl_varying_slot_name_for_stage(location, stage);
763*61046927SAndroid Build Coastguard Worker else if (mode == nir_var_shader_out)
764*61046927SAndroid Build Coastguard Worker return gl_frag_result_name(location);
765*61046927SAndroid Build Coastguard Worker
766*61046927SAndroid Build Coastguard Worker break;
767*61046927SAndroid Build Coastguard Worker case MESA_SHADER_COMPUTE:
768*61046927SAndroid Build Coastguard Worker case MESA_SHADER_KERNEL:
769*61046927SAndroid Build Coastguard Worker default:
770*61046927SAndroid Build Coastguard Worker /* TODO */
771*61046927SAndroid Build Coastguard Worker break;
772*61046927SAndroid Build Coastguard Worker }
773*61046927SAndroid Build Coastguard Worker
774*61046927SAndroid Build Coastguard Worker if (mode == nir_var_system_value)
775*61046927SAndroid Build Coastguard Worker return gl_system_value_name(location);
776*61046927SAndroid Build Coastguard Worker
777*61046927SAndroid Build Coastguard Worker if (location == ~0) {
778*61046927SAndroid Build Coastguard Worker return "~0";
779*61046927SAndroid Build Coastguard Worker } else {
780*61046927SAndroid Build Coastguard Worker snprintf(buf, 4, "%u", location);
781*61046927SAndroid Build Coastguard Worker return buf;
782*61046927SAndroid Build Coastguard Worker }
783*61046927SAndroid Build Coastguard Worker }
784*61046927SAndroid Build Coastguard Worker
785*61046927SAndroid Build Coastguard Worker static void
print_access(enum gl_access_qualifier access,print_state * state,const char * separator)786*61046927SAndroid Build Coastguard Worker print_access(enum gl_access_qualifier access, print_state *state, const char *separator)
787*61046927SAndroid Build Coastguard Worker {
788*61046927SAndroid Build Coastguard Worker if (!access) {
789*61046927SAndroid Build Coastguard Worker fputs("none", state->fp);
790*61046927SAndroid Build Coastguard Worker return;
791*61046927SAndroid Build Coastguard Worker }
792*61046927SAndroid Build Coastguard Worker
793*61046927SAndroid Build Coastguard Worker static const struct {
794*61046927SAndroid Build Coastguard Worker enum gl_access_qualifier bit;
795*61046927SAndroid Build Coastguard Worker const char *name;
796*61046927SAndroid Build Coastguard Worker } modes[] = {
797*61046927SAndroid Build Coastguard Worker { ACCESS_COHERENT, "coherent" },
798*61046927SAndroid Build Coastguard Worker { ACCESS_VOLATILE, "volatile" },
799*61046927SAndroid Build Coastguard Worker { ACCESS_RESTRICT, "restrict" },
800*61046927SAndroid Build Coastguard Worker { ACCESS_NON_WRITEABLE, "readonly" },
801*61046927SAndroid Build Coastguard Worker { ACCESS_NON_READABLE, "writeonly" },
802*61046927SAndroid Build Coastguard Worker { ACCESS_CAN_REORDER, "reorderable" },
803*61046927SAndroid Build Coastguard Worker { ACCESS_CAN_SPECULATE, "speculatable" },
804*61046927SAndroid Build Coastguard Worker { ACCESS_NON_TEMPORAL, "non-temporal" },
805*61046927SAndroid Build Coastguard Worker { ACCESS_INCLUDE_HELPERS, "include-helpers" },
806*61046927SAndroid Build Coastguard Worker { ACCESS_CP_GE_COHERENT_AMD, "cp-ge-coherent-amd" },
807*61046927SAndroid Build Coastguard Worker };
808*61046927SAndroid Build Coastguard Worker
809*61046927SAndroid Build Coastguard Worker bool first = true;
810*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(modes); ++i) {
811*61046927SAndroid Build Coastguard Worker if (access & modes[i].bit) {
812*61046927SAndroid Build Coastguard Worker fprintf(state->fp, "%s%s", first ? "" : separator, modes[i].name);
813*61046927SAndroid Build Coastguard Worker first = false;
814*61046927SAndroid Build Coastguard Worker }
815*61046927SAndroid Build Coastguard Worker }
816*61046927SAndroid Build Coastguard Worker }
817*61046927SAndroid Build Coastguard Worker
818*61046927SAndroid Build Coastguard Worker static void
print_var_decl(nir_variable * var,print_state * state)819*61046927SAndroid Build Coastguard Worker print_var_decl(nir_variable *var, print_state *state)
820*61046927SAndroid Build Coastguard Worker {
821*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
822*61046927SAndroid Build Coastguard Worker
823*61046927SAndroid Build Coastguard Worker fprintf(fp, "decl_var ");
824*61046927SAndroid Build Coastguard Worker
825*61046927SAndroid Build Coastguard Worker const char *const bindless = (var->data.bindless) ? "bindless " : "";
826*61046927SAndroid Build Coastguard Worker const char *const cent = (var->data.centroid) ? "centroid " : "";
827*61046927SAndroid Build Coastguard Worker const char *const samp = (var->data.sample) ? "sample " : "";
828*61046927SAndroid Build Coastguard Worker const char *const patch = (var->data.patch) ? "patch " : "";
829*61046927SAndroid Build Coastguard Worker const char *const inv = (var->data.invariant) ? "invariant " : "";
830*61046927SAndroid Build Coastguard Worker const char *const per_view = (var->data.per_view) ? "per_view " : "";
831*61046927SAndroid Build Coastguard Worker const char *const per_primitive = (var->data.per_primitive) ? "per_primitive " : "";
832*61046927SAndroid Build Coastguard Worker const char *const ray_query = (var->data.ray_query) ? "ray_query " : "";
833*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s%s%s%s%s%s%s%s%s %s ",
834*61046927SAndroid Build Coastguard Worker bindless, cent, samp, patch, inv, per_view, per_primitive, ray_query,
835*61046927SAndroid Build Coastguard Worker get_variable_mode_str(var->data.mode, false),
836*61046927SAndroid Build Coastguard Worker glsl_interp_mode_name(var->data.interpolation));
837*61046927SAndroid Build Coastguard Worker
838*61046927SAndroid Build Coastguard Worker print_access(var->data.access, state, " ");
839*61046927SAndroid Build Coastguard Worker fprintf(fp, " ");
840*61046927SAndroid Build Coastguard Worker
841*61046927SAndroid Build Coastguard Worker if (glsl_get_base_type(glsl_without_array(var->type)) == GLSL_TYPE_IMAGE) {
842*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s ", util_format_short_name(var->data.image.format));
843*61046927SAndroid Build Coastguard Worker }
844*61046927SAndroid Build Coastguard Worker
845*61046927SAndroid Build Coastguard Worker if (var->data.precision) {
846*61046927SAndroid Build Coastguard Worker const char *precisions[] = {
847*61046927SAndroid Build Coastguard Worker "",
848*61046927SAndroid Build Coastguard Worker "highp",
849*61046927SAndroid Build Coastguard Worker "mediump",
850*61046927SAndroid Build Coastguard Worker "lowp",
851*61046927SAndroid Build Coastguard Worker };
852*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s ", precisions[var->data.precision]);
853*61046927SAndroid Build Coastguard Worker }
854*61046927SAndroid Build Coastguard Worker
855*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s %s", glsl_get_type_name(var->type),
856*61046927SAndroid Build Coastguard Worker get_var_name(var, state));
857*61046927SAndroid Build Coastguard Worker
858*61046927SAndroid Build Coastguard Worker if (var->data.mode & (nir_var_shader_in |
859*61046927SAndroid Build Coastguard Worker nir_var_shader_out |
860*61046927SAndroid Build Coastguard Worker nir_var_uniform |
861*61046927SAndroid Build Coastguard Worker nir_var_system_value |
862*61046927SAndroid Build Coastguard Worker nir_var_mem_ubo |
863*61046927SAndroid Build Coastguard Worker nir_var_mem_ssbo |
864*61046927SAndroid Build Coastguard Worker nir_var_image)) {
865*61046927SAndroid Build Coastguard Worker char buf[4];
866*61046927SAndroid Build Coastguard Worker const char *loc = get_location_str(var->data.location,
867*61046927SAndroid Build Coastguard Worker state->shader->info.stage,
868*61046927SAndroid Build Coastguard Worker var->data.mode, buf);
869*61046927SAndroid Build Coastguard Worker
870*61046927SAndroid Build Coastguard Worker /* For shader I/O vars that have been split to components or packed,
871*61046927SAndroid Build Coastguard Worker * print the fractional location within the input/output.
872*61046927SAndroid Build Coastguard Worker */
873*61046927SAndroid Build Coastguard Worker unsigned int num_components =
874*61046927SAndroid Build Coastguard Worker glsl_get_components(glsl_without_array(var->type));
875*61046927SAndroid Build Coastguard Worker const char *components = "";
876*61046927SAndroid Build Coastguard Worker char components_local[18] = { '.' /* the rest is 0-filled */ };
877*61046927SAndroid Build Coastguard Worker switch (var->data.mode) {
878*61046927SAndroid Build Coastguard Worker case nir_var_shader_in:
879*61046927SAndroid Build Coastguard Worker case nir_var_shader_out:
880*61046927SAndroid Build Coastguard Worker if (num_components < 16 && num_components != 0) {
881*61046927SAndroid Build Coastguard Worker const char *xyzw = comp_mask_string(num_components);
882*61046927SAndroid Build Coastguard Worker for (int i = 0; i < num_components; i++)
883*61046927SAndroid Build Coastguard Worker components_local[i + 1] = xyzw[i + var->data.location_frac];
884*61046927SAndroid Build Coastguard Worker
885*61046927SAndroid Build Coastguard Worker components = components_local;
886*61046927SAndroid Build Coastguard Worker }
887*61046927SAndroid Build Coastguard Worker break;
888*61046927SAndroid Build Coastguard Worker default:
889*61046927SAndroid Build Coastguard Worker break;
890*61046927SAndroid Build Coastguard Worker }
891*61046927SAndroid Build Coastguard Worker
892*61046927SAndroid Build Coastguard Worker if (var->data.mode & nir_var_system_value) {
893*61046927SAndroid Build Coastguard Worker fprintf(fp, " (%s%s)", loc, components);
894*61046927SAndroid Build Coastguard Worker } else {
895*61046927SAndroid Build Coastguard Worker fprintf(fp, " (%s%s, %u, %u)%s", loc,
896*61046927SAndroid Build Coastguard Worker components,
897*61046927SAndroid Build Coastguard Worker var->data.driver_location, var->data.binding,
898*61046927SAndroid Build Coastguard Worker var->data.compact ? " compact" : "");
899*61046927SAndroid Build Coastguard Worker }
900*61046927SAndroid Build Coastguard Worker }
901*61046927SAndroid Build Coastguard Worker
902*61046927SAndroid Build Coastguard Worker if (var->constant_initializer) {
903*61046927SAndroid Build Coastguard Worker if (var->constant_initializer->is_null_constant) {
904*61046927SAndroid Build Coastguard Worker fprintf(fp, " = null");
905*61046927SAndroid Build Coastguard Worker } else {
906*61046927SAndroid Build Coastguard Worker fprintf(fp, " = { ");
907*61046927SAndroid Build Coastguard Worker print_constant(var->constant_initializer, var->type, state);
908*61046927SAndroid Build Coastguard Worker fprintf(fp, " }");
909*61046927SAndroid Build Coastguard Worker }
910*61046927SAndroid Build Coastguard Worker }
911*61046927SAndroid Build Coastguard Worker if (glsl_type_is_sampler(var->type) && var->data.sampler.is_inline_sampler) {
912*61046927SAndroid Build Coastguard Worker fprintf(fp, " = { %s, %s, %s }",
913*61046927SAndroid Build Coastguard Worker get_constant_sampler_addressing_mode(var->data.sampler.addressing_mode),
914*61046927SAndroid Build Coastguard Worker var->data.sampler.normalized_coordinates ? "true" : "false",
915*61046927SAndroid Build Coastguard Worker get_constant_sampler_filter_mode(var->data.sampler.filter_mode));
916*61046927SAndroid Build Coastguard Worker }
917*61046927SAndroid Build Coastguard Worker if (var->pointer_initializer)
918*61046927SAndroid Build Coastguard Worker fprintf(fp, " = &%s", get_var_name(var->pointer_initializer, state));
919*61046927SAndroid Build Coastguard Worker
920*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
921*61046927SAndroid Build Coastguard Worker print_annotation(state, var);
922*61046927SAndroid Build Coastguard Worker }
923*61046927SAndroid Build Coastguard Worker
924*61046927SAndroid Build Coastguard Worker static void
print_deref_link(const nir_deref_instr * instr,bool whole_chain,print_state * state)925*61046927SAndroid Build Coastguard Worker print_deref_link(const nir_deref_instr *instr, bool whole_chain, print_state *state)
926*61046927SAndroid Build Coastguard Worker {
927*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
928*61046927SAndroid Build Coastguard Worker
929*61046927SAndroid Build Coastguard Worker if (instr->deref_type == nir_deref_type_var) {
930*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", get_var_name(instr->var, state));
931*61046927SAndroid Build Coastguard Worker return;
932*61046927SAndroid Build Coastguard Worker } else if (instr->deref_type == nir_deref_type_cast) {
933*61046927SAndroid Build Coastguard Worker fprintf(fp, "(%s *)", glsl_get_type_name(instr->type));
934*61046927SAndroid Build Coastguard Worker print_src(&instr->parent, state, nir_type_invalid);
935*61046927SAndroid Build Coastguard Worker return;
936*61046927SAndroid Build Coastguard Worker }
937*61046927SAndroid Build Coastguard Worker
938*61046927SAndroid Build Coastguard Worker nir_deref_instr *parent =
939*61046927SAndroid Build Coastguard Worker nir_instr_as_deref(instr->parent.ssa->parent_instr);
940*61046927SAndroid Build Coastguard Worker
941*61046927SAndroid Build Coastguard Worker /* Is the parent we're going to print a bare cast? */
942*61046927SAndroid Build Coastguard Worker const bool is_parent_cast =
943*61046927SAndroid Build Coastguard Worker whole_chain && parent->deref_type == nir_deref_type_cast;
944*61046927SAndroid Build Coastguard Worker
945*61046927SAndroid Build Coastguard Worker /* If we're not printing the whole chain, the parent we print will be a SSA
946*61046927SAndroid Build Coastguard Worker * value that represents a pointer. The only deref type that naturally
947*61046927SAndroid Build Coastguard Worker * gives a pointer is a cast.
948*61046927SAndroid Build Coastguard Worker */
949*61046927SAndroid Build Coastguard Worker const bool is_parent_pointer =
950*61046927SAndroid Build Coastguard Worker !whole_chain || parent->deref_type == nir_deref_type_cast;
951*61046927SAndroid Build Coastguard Worker
952*61046927SAndroid Build Coastguard Worker /* Struct derefs have a nice syntax that works on pointers, arrays derefs
953*61046927SAndroid Build Coastguard Worker * do not.
954*61046927SAndroid Build Coastguard Worker */
955*61046927SAndroid Build Coastguard Worker const bool need_deref =
956*61046927SAndroid Build Coastguard Worker is_parent_pointer && instr->deref_type != nir_deref_type_struct;
957*61046927SAndroid Build Coastguard Worker
958*61046927SAndroid Build Coastguard Worker /* Cast need extra parens and so * dereferences */
959*61046927SAndroid Build Coastguard Worker if (is_parent_cast || need_deref)
960*61046927SAndroid Build Coastguard Worker fprintf(fp, "(");
961*61046927SAndroid Build Coastguard Worker
962*61046927SAndroid Build Coastguard Worker if (need_deref)
963*61046927SAndroid Build Coastguard Worker fprintf(fp, "*");
964*61046927SAndroid Build Coastguard Worker
965*61046927SAndroid Build Coastguard Worker if (whole_chain) {
966*61046927SAndroid Build Coastguard Worker print_deref_link(parent, whole_chain, state);
967*61046927SAndroid Build Coastguard Worker } else {
968*61046927SAndroid Build Coastguard Worker print_src(&instr->parent, state, nir_type_invalid);
969*61046927SAndroid Build Coastguard Worker }
970*61046927SAndroid Build Coastguard Worker
971*61046927SAndroid Build Coastguard Worker if (is_parent_cast || need_deref)
972*61046927SAndroid Build Coastguard Worker fprintf(fp, ")");
973*61046927SAndroid Build Coastguard Worker
974*61046927SAndroid Build Coastguard Worker switch (instr->deref_type) {
975*61046927SAndroid Build Coastguard Worker case nir_deref_type_struct:
976*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s%s", is_parent_pointer ? "->" : ".",
977*61046927SAndroid Build Coastguard Worker glsl_get_struct_elem_name(parent->type, instr->strct.index));
978*61046927SAndroid Build Coastguard Worker break;
979*61046927SAndroid Build Coastguard Worker
980*61046927SAndroid Build Coastguard Worker case nir_deref_type_array:
981*61046927SAndroid Build Coastguard Worker case nir_deref_type_ptr_as_array: {
982*61046927SAndroid Build Coastguard Worker if (nir_src_is_const(instr->arr.index)) {
983*61046927SAndroid Build Coastguard Worker fprintf(fp, "[%" PRId64 "]", nir_src_as_int(instr->arr.index));
984*61046927SAndroid Build Coastguard Worker } else {
985*61046927SAndroid Build Coastguard Worker fprintf(fp, "[");
986*61046927SAndroid Build Coastguard Worker print_src(&instr->arr.index, state, nir_type_invalid);
987*61046927SAndroid Build Coastguard Worker fprintf(fp, "]");
988*61046927SAndroid Build Coastguard Worker }
989*61046927SAndroid Build Coastguard Worker break;
990*61046927SAndroid Build Coastguard Worker }
991*61046927SAndroid Build Coastguard Worker
992*61046927SAndroid Build Coastguard Worker case nir_deref_type_array_wildcard:
993*61046927SAndroid Build Coastguard Worker fprintf(fp, "[*]");
994*61046927SAndroid Build Coastguard Worker break;
995*61046927SAndroid Build Coastguard Worker
996*61046927SAndroid Build Coastguard Worker default:
997*61046927SAndroid Build Coastguard Worker unreachable("Invalid deref instruction type");
998*61046927SAndroid Build Coastguard Worker }
999*61046927SAndroid Build Coastguard Worker }
1000*61046927SAndroid Build Coastguard Worker
1001*61046927SAndroid Build Coastguard Worker static void
print_deref_instr(nir_deref_instr * instr,print_state * state)1002*61046927SAndroid Build Coastguard Worker print_deref_instr(nir_deref_instr *instr, print_state *state)
1003*61046927SAndroid Build Coastguard Worker {
1004*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
1005*61046927SAndroid Build Coastguard Worker
1006*61046927SAndroid Build Coastguard Worker print_def(&instr->def, state);
1007*61046927SAndroid Build Coastguard Worker
1008*61046927SAndroid Build Coastguard Worker switch (instr->deref_type) {
1009*61046927SAndroid Build Coastguard Worker case nir_deref_type_var:
1010*61046927SAndroid Build Coastguard Worker fprintf(fp, " = deref_var ");
1011*61046927SAndroid Build Coastguard Worker break;
1012*61046927SAndroid Build Coastguard Worker case nir_deref_type_array:
1013*61046927SAndroid Build Coastguard Worker case nir_deref_type_array_wildcard:
1014*61046927SAndroid Build Coastguard Worker fprintf(fp, " = deref_array ");
1015*61046927SAndroid Build Coastguard Worker break;
1016*61046927SAndroid Build Coastguard Worker case nir_deref_type_struct:
1017*61046927SAndroid Build Coastguard Worker fprintf(fp, " = deref_struct ");
1018*61046927SAndroid Build Coastguard Worker break;
1019*61046927SAndroid Build Coastguard Worker case nir_deref_type_cast:
1020*61046927SAndroid Build Coastguard Worker fprintf(fp, " = deref_cast ");
1021*61046927SAndroid Build Coastguard Worker break;
1022*61046927SAndroid Build Coastguard Worker case nir_deref_type_ptr_as_array:
1023*61046927SAndroid Build Coastguard Worker fprintf(fp, " = deref_ptr_as_array ");
1024*61046927SAndroid Build Coastguard Worker break;
1025*61046927SAndroid Build Coastguard Worker default:
1026*61046927SAndroid Build Coastguard Worker unreachable("Invalid deref instruction type");
1027*61046927SAndroid Build Coastguard Worker }
1028*61046927SAndroid Build Coastguard Worker
1029*61046927SAndroid Build Coastguard Worker /* Only casts naturally return a pointer type */
1030*61046927SAndroid Build Coastguard Worker if (instr->deref_type != nir_deref_type_cast)
1031*61046927SAndroid Build Coastguard Worker fprintf(fp, "&");
1032*61046927SAndroid Build Coastguard Worker
1033*61046927SAndroid Build Coastguard Worker print_deref_link(instr, false, state);
1034*61046927SAndroid Build Coastguard Worker
1035*61046927SAndroid Build Coastguard Worker fprintf(fp, " (");
1036*61046927SAndroid Build Coastguard Worker unsigned modes = instr->modes;
1037*61046927SAndroid Build Coastguard Worker while (modes) {
1038*61046927SAndroid Build Coastguard Worker int m = u_bit_scan(&modes);
1039*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s%s", get_variable_mode_str(1 << m, true),
1040*61046927SAndroid Build Coastguard Worker modes ? "|" : "");
1041*61046927SAndroid Build Coastguard Worker }
1042*61046927SAndroid Build Coastguard Worker fprintf(fp, " %s)", glsl_get_type_name(instr->type));
1043*61046927SAndroid Build Coastguard Worker
1044*61046927SAndroid Build Coastguard Worker if (instr->deref_type == nir_deref_type_cast) {
1045*61046927SAndroid Build Coastguard Worker fprintf(fp, " (ptr_stride=%u, align_mul=%u, align_offset=%u)",
1046*61046927SAndroid Build Coastguard Worker instr->cast.ptr_stride,
1047*61046927SAndroid Build Coastguard Worker instr->cast.align_mul, instr->cast.align_offset);
1048*61046927SAndroid Build Coastguard Worker }
1049*61046927SAndroid Build Coastguard Worker
1050*61046927SAndroid Build Coastguard Worker if (instr->deref_type != nir_deref_type_var &&
1051*61046927SAndroid Build Coastguard Worker instr->deref_type != nir_deref_type_cast) {
1052*61046927SAndroid Build Coastguard Worker /* Print the entire chain as a comment */
1053*61046927SAndroid Build Coastguard Worker fprintf(fp, " // &");
1054*61046927SAndroid Build Coastguard Worker print_deref_link(instr, true, state);
1055*61046927SAndroid Build Coastguard Worker }
1056*61046927SAndroid Build Coastguard Worker }
1057*61046927SAndroid Build Coastguard Worker
1058*61046927SAndroid Build Coastguard Worker static const char *
vulkan_descriptor_type_name(VkDescriptorType type)1059*61046927SAndroid Build Coastguard Worker vulkan_descriptor_type_name(VkDescriptorType type)
1060*61046927SAndroid Build Coastguard Worker {
1061*61046927SAndroid Build Coastguard Worker switch (type) {
1062*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_SAMPLER:
1063*61046927SAndroid Build Coastguard Worker return "sampler";
1064*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
1065*61046927SAndroid Build Coastguard Worker return "texture+sampler";
1066*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
1067*61046927SAndroid Build Coastguard Worker return "texture";
1068*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
1069*61046927SAndroid Build Coastguard Worker return "image";
1070*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
1071*61046927SAndroid Build Coastguard Worker return "texture-buffer";
1072*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
1073*61046927SAndroid Build Coastguard Worker return "image-buffer";
1074*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
1075*61046927SAndroid Build Coastguard Worker return "UBO";
1076*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
1077*61046927SAndroid Build Coastguard Worker return "SSBO";
1078*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
1079*61046927SAndroid Build Coastguard Worker return "UBO";
1080*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
1081*61046927SAndroid Build Coastguard Worker return "SSBO";
1082*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
1083*61046927SAndroid Build Coastguard Worker return "input-att";
1084*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK:
1085*61046927SAndroid Build Coastguard Worker return "inline-UBO";
1086*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
1087*61046927SAndroid Build Coastguard Worker return "accel-struct";
1088*61046927SAndroid Build Coastguard Worker default:
1089*61046927SAndroid Build Coastguard Worker return "unknown";
1090*61046927SAndroid Build Coastguard Worker }
1091*61046927SAndroid Build Coastguard Worker }
1092*61046927SAndroid Build Coastguard Worker
1093*61046927SAndroid Build Coastguard Worker static void
print_alu_type(nir_alu_type type,print_state * state)1094*61046927SAndroid Build Coastguard Worker print_alu_type(nir_alu_type type, print_state *state)
1095*61046927SAndroid Build Coastguard Worker {
1096*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
1097*61046927SAndroid Build Coastguard Worker unsigned size = nir_alu_type_get_type_size(type);
1098*61046927SAndroid Build Coastguard Worker const char *name;
1099*61046927SAndroid Build Coastguard Worker
1100*61046927SAndroid Build Coastguard Worker switch (nir_alu_type_get_base_type(type)) {
1101*61046927SAndroid Build Coastguard Worker case nir_type_int:
1102*61046927SAndroid Build Coastguard Worker name = "int";
1103*61046927SAndroid Build Coastguard Worker break;
1104*61046927SAndroid Build Coastguard Worker case nir_type_uint:
1105*61046927SAndroid Build Coastguard Worker name = "uint";
1106*61046927SAndroid Build Coastguard Worker break;
1107*61046927SAndroid Build Coastguard Worker case nir_type_bool:
1108*61046927SAndroid Build Coastguard Worker name = "bool";
1109*61046927SAndroid Build Coastguard Worker break;
1110*61046927SAndroid Build Coastguard Worker case nir_type_float:
1111*61046927SAndroid Build Coastguard Worker name = "float";
1112*61046927SAndroid Build Coastguard Worker break;
1113*61046927SAndroid Build Coastguard Worker default:
1114*61046927SAndroid Build Coastguard Worker name = "invalid";
1115*61046927SAndroid Build Coastguard Worker }
1116*61046927SAndroid Build Coastguard Worker if (size)
1117*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s%u", name, size);
1118*61046927SAndroid Build Coastguard Worker else
1119*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", name);
1120*61046927SAndroid Build Coastguard Worker }
1121*61046927SAndroid Build Coastguard Worker
1122*61046927SAndroid Build Coastguard Worker static void
print_intrinsic_instr(nir_intrinsic_instr * instr,print_state * state)1123*61046927SAndroid Build Coastguard Worker print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
1124*61046927SAndroid Build Coastguard Worker {
1125*61046927SAndroid Build Coastguard Worker const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic];
1126*61046927SAndroid Build Coastguard Worker unsigned num_srcs = info->num_srcs;
1127*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
1128*61046927SAndroid Build Coastguard Worker
1129*61046927SAndroid Build Coastguard Worker if (info->has_dest) {
1130*61046927SAndroid Build Coastguard Worker print_def(&instr->def, state);
1131*61046927SAndroid Build Coastguard Worker fprintf(fp, " = ");
1132*61046927SAndroid Build Coastguard Worker } else {
1133*61046927SAndroid Build Coastguard Worker print_no_dest_padding(state);
1134*61046927SAndroid Build Coastguard Worker }
1135*61046927SAndroid Build Coastguard Worker
1136*61046927SAndroid Build Coastguard Worker fprintf(fp, "@%s", info->name);
1137*61046927SAndroid Build Coastguard Worker
1138*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_srcs; i++) {
1139*61046927SAndroid Build Coastguard Worker if (i == 0)
1140*61046927SAndroid Build Coastguard Worker fprintf(fp, " (");
1141*61046927SAndroid Build Coastguard Worker else
1142*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
1143*61046927SAndroid Build Coastguard Worker
1144*61046927SAndroid Build Coastguard Worker print_src(&instr->src[i], state, nir_intrinsic_instr_src_type(instr, i));
1145*61046927SAndroid Build Coastguard Worker }
1146*61046927SAndroid Build Coastguard Worker
1147*61046927SAndroid Build Coastguard Worker if (num_srcs)
1148*61046927SAndroid Build Coastguard Worker fprintf(fp, ")");
1149*61046927SAndroid Build Coastguard Worker
1150*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < info->num_indices; i++) {
1151*61046927SAndroid Build Coastguard Worker unsigned idx = info->indices[i];
1152*61046927SAndroid Build Coastguard Worker if (i == 0)
1153*61046927SAndroid Build Coastguard Worker fprintf(fp, " (");
1154*61046927SAndroid Build Coastguard Worker else
1155*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
1156*61046927SAndroid Build Coastguard Worker switch (idx) {
1157*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_WRITE_MASK: {
1158*61046927SAndroid Build Coastguard Worker /* special case wrmask to show it as a writemask.. */
1159*61046927SAndroid Build Coastguard Worker unsigned wrmask = nir_intrinsic_write_mask(instr);
1160*61046927SAndroid Build Coastguard Worker fprintf(fp, "wrmask=");
1161*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < instr->num_components; i++)
1162*61046927SAndroid Build Coastguard Worker if ((wrmask >> i) & 1)
1163*61046927SAndroid Build Coastguard Worker fprintf(fp, "%c", comp_mask_string(instr->num_components)[i]);
1164*61046927SAndroid Build Coastguard Worker break;
1165*61046927SAndroid Build Coastguard Worker }
1166*61046927SAndroid Build Coastguard Worker
1167*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_REDUCTION_OP: {
1168*61046927SAndroid Build Coastguard Worker nir_op reduction_op = nir_intrinsic_reduction_op(instr);
1169*61046927SAndroid Build Coastguard Worker fprintf(fp, "reduction_op=%s", nir_op_infos[reduction_op].name);
1170*61046927SAndroid Build Coastguard Worker break;
1171*61046927SAndroid Build Coastguard Worker }
1172*61046927SAndroid Build Coastguard Worker
1173*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_ATOMIC_OP: {
1174*61046927SAndroid Build Coastguard Worker nir_atomic_op atomic_op = nir_intrinsic_atomic_op(instr);
1175*61046927SAndroid Build Coastguard Worker fprintf(fp, "atomic_op=");
1176*61046927SAndroid Build Coastguard Worker
1177*61046927SAndroid Build Coastguard Worker switch (atomic_op) {
1178*61046927SAndroid Build Coastguard Worker case nir_atomic_op_iadd:
1179*61046927SAndroid Build Coastguard Worker fprintf(fp, "iadd");
1180*61046927SAndroid Build Coastguard Worker break;
1181*61046927SAndroid Build Coastguard Worker case nir_atomic_op_imin:
1182*61046927SAndroid Build Coastguard Worker fprintf(fp, "imin");
1183*61046927SAndroid Build Coastguard Worker break;
1184*61046927SAndroid Build Coastguard Worker case nir_atomic_op_umin:
1185*61046927SAndroid Build Coastguard Worker fprintf(fp, "umin");
1186*61046927SAndroid Build Coastguard Worker break;
1187*61046927SAndroid Build Coastguard Worker case nir_atomic_op_imax:
1188*61046927SAndroid Build Coastguard Worker fprintf(fp, "imax");
1189*61046927SAndroid Build Coastguard Worker break;
1190*61046927SAndroid Build Coastguard Worker case nir_atomic_op_umax:
1191*61046927SAndroid Build Coastguard Worker fprintf(fp, "umax");
1192*61046927SAndroid Build Coastguard Worker break;
1193*61046927SAndroid Build Coastguard Worker case nir_atomic_op_iand:
1194*61046927SAndroid Build Coastguard Worker fprintf(fp, "iand");
1195*61046927SAndroid Build Coastguard Worker break;
1196*61046927SAndroid Build Coastguard Worker case nir_atomic_op_ior:
1197*61046927SAndroid Build Coastguard Worker fprintf(fp, "ior");
1198*61046927SAndroid Build Coastguard Worker break;
1199*61046927SAndroid Build Coastguard Worker case nir_atomic_op_ixor:
1200*61046927SAndroid Build Coastguard Worker fprintf(fp, "ixor");
1201*61046927SAndroid Build Coastguard Worker break;
1202*61046927SAndroid Build Coastguard Worker case nir_atomic_op_xchg:
1203*61046927SAndroid Build Coastguard Worker fprintf(fp, "xchg");
1204*61046927SAndroid Build Coastguard Worker break;
1205*61046927SAndroid Build Coastguard Worker case nir_atomic_op_fadd:
1206*61046927SAndroid Build Coastguard Worker fprintf(fp, "fadd");
1207*61046927SAndroid Build Coastguard Worker break;
1208*61046927SAndroid Build Coastguard Worker case nir_atomic_op_fmin:
1209*61046927SAndroid Build Coastguard Worker fprintf(fp, "fmin");
1210*61046927SAndroid Build Coastguard Worker break;
1211*61046927SAndroid Build Coastguard Worker case nir_atomic_op_fmax:
1212*61046927SAndroid Build Coastguard Worker fprintf(fp, "fmax");
1213*61046927SAndroid Build Coastguard Worker break;
1214*61046927SAndroid Build Coastguard Worker case nir_atomic_op_cmpxchg:
1215*61046927SAndroid Build Coastguard Worker fprintf(fp, "cmpxchg");
1216*61046927SAndroid Build Coastguard Worker break;
1217*61046927SAndroid Build Coastguard Worker case nir_atomic_op_fcmpxchg:
1218*61046927SAndroid Build Coastguard Worker fprintf(fp, "fcmpxchg");
1219*61046927SAndroid Build Coastguard Worker break;
1220*61046927SAndroid Build Coastguard Worker case nir_atomic_op_inc_wrap:
1221*61046927SAndroid Build Coastguard Worker fprintf(fp, "inc_wrap");
1222*61046927SAndroid Build Coastguard Worker break;
1223*61046927SAndroid Build Coastguard Worker case nir_atomic_op_dec_wrap:
1224*61046927SAndroid Build Coastguard Worker fprintf(fp, "dec_wrap");
1225*61046927SAndroid Build Coastguard Worker break;
1226*61046927SAndroid Build Coastguard Worker case nir_atomic_op_ordered_add_gfx12_amd:
1227*61046927SAndroid Build Coastguard Worker fprintf(fp, "ordered_add");
1228*61046927SAndroid Build Coastguard Worker break;
1229*61046927SAndroid Build Coastguard Worker }
1230*61046927SAndroid Build Coastguard Worker break;
1231*61046927SAndroid Build Coastguard Worker }
1232*61046927SAndroid Build Coastguard Worker
1233*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_IMAGE_DIM: {
1234*61046927SAndroid Build Coastguard Worker static const char *dim_name[] = {
1235*61046927SAndroid Build Coastguard Worker [GLSL_SAMPLER_DIM_1D] = "1D",
1236*61046927SAndroid Build Coastguard Worker [GLSL_SAMPLER_DIM_2D] = "2D",
1237*61046927SAndroid Build Coastguard Worker [GLSL_SAMPLER_DIM_3D] = "3D",
1238*61046927SAndroid Build Coastguard Worker [GLSL_SAMPLER_DIM_CUBE] = "Cube",
1239*61046927SAndroid Build Coastguard Worker [GLSL_SAMPLER_DIM_RECT] = "Rect",
1240*61046927SAndroid Build Coastguard Worker [GLSL_SAMPLER_DIM_BUF] = "Buf",
1241*61046927SAndroid Build Coastguard Worker [GLSL_SAMPLER_DIM_MS] = "2D-MSAA",
1242*61046927SAndroid Build Coastguard Worker [GLSL_SAMPLER_DIM_SUBPASS] = "Subpass",
1243*61046927SAndroid Build Coastguard Worker [GLSL_SAMPLER_DIM_SUBPASS_MS] = "Subpass-MSAA",
1244*61046927SAndroid Build Coastguard Worker };
1245*61046927SAndroid Build Coastguard Worker enum glsl_sampler_dim dim = nir_intrinsic_image_dim(instr);
1246*61046927SAndroid Build Coastguard Worker assert(dim < ARRAY_SIZE(dim_name) && dim_name[dim]);
1247*61046927SAndroid Build Coastguard Worker fprintf(fp, "image_dim=%s", dim_name[dim]);
1248*61046927SAndroid Build Coastguard Worker break;
1249*61046927SAndroid Build Coastguard Worker }
1250*61046927SAndroid Build Coastguard Worker
1251*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_IMAGE_ARRAY: {
1252*61046927SAndroid Build Coastguard Worker bool array = nir_intrinsic_image_array(instr);
1253*61046927SAndroid Build Coastguard Worker fprintf(fp, "image_array=%s", array ? "true" : "false");
1254*61046927SAndroid Build Coastguard Worker break;
1255*61046927SAndroid Build Coastguard Worker }
1256*61046927SAndroid Build Coastguard Worker
1257*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_FORMAT: {
1258*61046927SAndroid Build Coastguard Worker enum pipe_format format = nir_intrinsic_format(instr);
1259*61046927SAndroid Build Coastguard Worker fprintf(fp, "format=%s", util_format_short_name(format));
1260*61046927SAndroid Build Coastguard Worker break;
1261*61046927SAndroid Build Coastguard Worker }
1262*61046927SAndroid Build Coastguard Worker
1263*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_DESC_TYPE: {
1264*61046927SAndroid Build Coastguard Worker VkDescriptorType desc_type = nir_intrinsic_desc_type(instr);
1265*61046927SAndroid Build Coastguard Worker fprintf(fp, "desc_type=%s", vulkan_descriptor_type_name(desc_type));
1266*61046927SAndroid Build Coastguard Worker break;
1267*61046927SAndroid Build Coastguard Worker }
1268*61046927SAndroid Build Coastguard Worker
1269*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_SRC_TYPE: {
1270*61046927SAndroid Build Coastguard Worker fprintf(fp, "src_type=");
1271*61046927SAndroid Build Coastguard Worker print_alu_type(nir_intrinsic_src_type(instr), state);
1272*61046927SAndroid Build Coastguard Worker break;
1273*61046927SAndroid Build Coastguard Worker }
1274*61046927SAndroid Build Coastguard Worker
1275*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_DEST_TYPE: {
1276*61046927SAndroid Build Coastguard Worker fprintf(fp, "dest_type=");
1277*61046927SAndroid Build Coastguard Worker print_alu_type(nir_intrinsic_dest_type(instr), state);
1278*61046927SAndroid Build Coastguard Worker break;
1279*61046927SAndroid Build Coastguard Worker }
1280*61046927SAndroid Build Coastguard Worker
1281*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_SWIZZLE_MASK: {
1282*61046927SAndroid Build Coastguard Worker fprintf(fp, "swizzle_mask=");
1283*61046927SAndroid Build Coastguard Worker unsigned mask = nir_intrinsic_swizzle_mask(instr);
1284*61046927SAndroid Build Coastguard Worker if (instr->intrinsic == nir_intrinsic_quad_swizzle_amd) {
1285*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < 4; i++)
1286*61046927SAndroid Build Coastguard Worker fprintf(fp, "%d", (mask >> (i * 2) & 3));
1287*61046927SAndroid Build Coastguard Worker } else if (instr->intrinsic == nir_intrinsic_masked_swizzle_amd) {
1288*61046927SAndroid Build Coastguard Worker fprintf(fp, "((id & %d) | %d) ^ %d", mask & 0x1F,
1289*61046927SAndroid Build Coastguard Worker (mask >> 5) & 0x1F,
1290*61046927SAndroid Build Coastguard Worker (mask >> 10) & 0x1F);
1291*61046927SAndroid Build Coastguard Worker } else {
1292*61046927SAndroid Build Coastguard Worker fprintf(fp, "%d", mask);
1293*61046927SAndroid Build Coastguard Worker }
1294*61046927SAndroid Build Coastguard Worker break;
1295*61046927SAndroid Build Coastguard Worker }
1296*61046927SAndroid Build Coastguard Worker
1297*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_MEMORY_SEMANTICS: {
1298*61046927SAndroid Build Coastguard Worker nir_memory_semantics semantics = nir_intrinsic_memory_semantics(instr);
1299*61046927SAndroid Build Coastguard Worker fprintf(fp, "mem_semantics=");
1300*61046927SAndroid Build Coastguard Worker switch (semantics & (NIR_MEMORY_ACQUIRE | NIR_MEMORY_RELEASE)) {
1301*61046927SAndroid Build Coastguard Worker case 0:
1302*61046927SAndroid Build Coastguard Worker fprintf(fp, "NONE");
1303*61046927SAndroid Build Coastguard Worker break;
1304*61046927SAndroid Build Coastguard Worker case NIR_MEMORY_ACQUIRE:
1305*61046927SAndroid Build Coastguard Worker fprintf(fp, "ACQ");
1306*61046927SAndroid Build Coastguard Worker break;
1307*61046927SAndroid Build Coastguard Worker case NIR_MEMORY_RELEASE:
1308*61046927SAndroid Build Coastguard Worker fprintf(fp, "REL");
1309*61046927SAndroid Build Coastguard Worker break;
1310*61046927SAndroid Build Coastguard Worker default:
1311*61046927SAndroid Build Coastguard Worker fprintf(fp, "ACQ|REL");
1312*61046927SAndroid Build Coastguard Worker break;
1313*61046927SAndroid Build Coastguard Worker }
1314*61046927SAndroid Build Coastguard Worker if (semantics & (NIR_MEMORY_MAKE_AVAILABLE))
1315*61046927SAndroid Build Coastguard Worker fprintf(fp, "|AVAILABLE");
1316*61046927SAndroid Build Coastguard Worker if (semantics & (NIR_MEMORY_MAKE_VISIBLE))
1317*61046927SAndroid Build Coastguard Worker fprintf(fp, "|VISIBLE");
1318*61046927SAndroid Build Coastguard Worker break;
1319*61046927SAndroid Build Coastguard Worker }
1320*61046927SAndroid Build Coastguard Worker
1321*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_MEMORY_MODES: {
1322*61046927SAndroid Build Coastguard Worker fprintf(fp, "mem_modes=");
1323*61046927SAndroid Build Coastguard Worker unsigned int modes = nir_intrinsic_memory_modes(instr);
1324*61046927SAndroid Build Coastguard Worker if (modes == 0)
1325*61046927SAndroid Build Coastguard Worker fputc('0', fp);
1326*61046927SAndroid Build Coastguard Worker while (modes) {
1327*61046927SAndroid Build Coastguard Worker nir_variable_mode m = u_bit_scan(&modes);
1328*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s%s", get_variable_mode_str(1 << m, true), modes ? "|" : "");
1329*61046927SAndroid Build Coastguard Worker }
1330*61046927SAndroid Build Coastguard Worker break;
1331*61046927SAndroid Build Coastguard Worker }
1332*61046927SAndroid Build Coastguard Worker
1333*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_EXECUTION_SCOPE:
1334*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_MEMORY_SCOPE: {
1335*61046927SAndroid Build Coastguard Worker mesa_scope scope =
1336*61046927SAndroid Build Coastguard Worker idx == NIR_INTRINSIC_MEMORY_SCOPE ? nir_intrinsic_memory_scope(instr)
1337*61046927SAndroid Build Coastguard Worker : nir_intrinsic_execution_scope(instr);
1338*61046927SAndroid Build Coastguard Worker const char *name = mesa_scope_name(scope);
1339*61046927SAndroid Build Coastguard Worker static const char prefix[] = "SCOPE_";
1340*61046927SAndroid Build Coastguard Worker if (strncmp(name, prefix, sizeof(prefix) - 1) == 0)
1341*61046927SAndroid Build Coastguard Worker name += sizeof(prefix) - 1;
1342*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s=%s", nir_intrinsic_index_names[idx], name);
1343*61046927SAndroid Build Coastguard Worker break;
1344*61046927SAndroid Build Coastguard Worker }
1345*61046927SAndroid Build Coastguard Worker
1346*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_IO_SEMANTICS: {
1347*61046927SAndroid Build Coastguard Worker struct nir_io_semantics io = nir_intrinsic_io_semantics(instr);
1348*61046927SAndroid Build Coastguard Worker
1349*61046927SAndroid Build Coastguard Worker /* Try to figure out the mode so we can interpret the location */
1350*61046927SAndroid Build Coastguard Worker nir_variable_mode mode = nir_var_mem_generic;
1351*61046927SAndroid Build Coastguard Worker switch (instr->intrinsic) {
1352*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_input:
1353*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_per_primitive_input:
1354*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_interpolated_input:
1355*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_per_vertex_input:
1356*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_input_vertex:
1357*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_coefficients_agx:
1358*61046927SAndroid Build Coastguard Worker mode = nir_var_shader_in;
1359*61046927SAndroid Build Coastguard Worker break;
1360*61046927SAndroid Build Coastguard Worker
1361*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_output:
1362*61046927SAndroid Build Coastguard Worker case nir_intrinsic_store_output:
1363*61046927SAndroid Build Coastguard Worker case nir_intrinsic_store_per_primitive_output:
1364*61046927SAndroid Build Coastguard Worker case nir_intrinsic_store_per_vertex_output:
1365*61046927SAndroid Build Coastguard Worker mode = nir_var_shader_out;
1366*61046927SAndroid Build Coastguard Worker break;
1367*61046927SAndroid Build Coastguard Worker
1368*61046927SAndroid Build Coastguard Worker default:
1369*61046927SAndroid Build Coastguard Worker break;
1370*61046927SAndroid Build Coastguard Worker }
1371*61046927SAndroid Build Coastguard Worker
1372*61046927SAndroid Build Coastguard Worker /* Using that mode, we should be able to name the location */
1373*61046927SAndroid Build Coastguard Worker char buf[4];
1374*61046927SAndroid Build Coastguard Worker const char *loc = get_location_str(io.location,
1375*61046927SAndroid Build Coastguard Worker state->shader->info.stage, mode,
1376*61046927SAndroid Build Coastguard Worker buf);
1377*61046927SAndroid Build Coastguard Worker
1378*61046927SAndroid Build Coastguard Worker fprintf(fp, "io location=%s slots=%u", loc, io.num_slots);
1379*61046927SAndroid Build Coastguard Worker
1380*61046927SAndroid Build Coastguard Worker if (io.interp_explicit_strict)
1381*61046927SAndroid Build Coastguard Worker fprintf(fp, " explicit_strict");
1382*61046927SAndroid Build Coastguard Worker
1383*61046927SAndroid Build Coastguard Worker if (io.dual_source_blend_index)
1384*61046927SAndroid Build Coastguard Worker fprintf(fp, " dualsrc");
1385*61046927SAndroid Build Coastguard Worker
1386*61046927SAndroid Build Coastguard Worker if (io.fb_fetch_output)
1387*61046927SAndroid Build Coastguard Worker fprintf(fp, " fbfetch");
1388*61046927SAndroid Build Coastguard Worker
1389*61046927SAndroid Build Coastguard Worker if (io.per_view)
1390*61046927SAndroid Build Coastguard Worker fprintf(fp, " perview");
1391*61046927SAndroid Build Coastguard Worker
1392*61046927SAndroid Build Coastguard Worker if (io.medium_precision)
1393*61046927SAndroid Build Coastguard Worker fprintf(fp, " mediump");
1394*61046927SAndroid Build Coastguard Worker
1395*61046927SAndroid Build Coastguard Worker if (io.high_16bits)
1396*61046927SAndroid Build Coastguard Worker fprintf(fp, " high_16bits");
1397*61046927SAndroid Build Coastguard Worker
1398*61046927SAndroid Build Coastguard Worker if (io.invariant)
1399*61046927SAndroid Build Coastguard Worker fprintf(fp, " invariant");
1400*61046927SAndroid Build Coastguard Worker
1401*61046927SAndroid Build Coastguard Worker if (io.high_dvec2)
1402*61046927SAndroid Build Coastguard Worker fprintf(fp, " high_dvec2");
1403*61046927SAndroid Build Coastguard Worker
1404*61046927SAndroid Build Coastguard Worker if (io.no_varying)
1405*61046927SAndroid Build Coastguard Worker fprintf(fp, " no_varying");
1406*61046927SAndroid Build Coastguard Worker
1407*61046927SAndroid Build Coastguard Worker if (io.no_sysval_output)
1408*61046927SAndroid Build Coastguard Worker fprintf(fp, " no_sysval_output");
1409*61046927SAndroid Build Coastguard Worker
1410*61046927SAndroid Build Coastguard Worker if (state->shader &&
1411*61046927SAndroid Build Coastguard Worker state->shader->info.stage == MESA_SHADER_GEOMETRY &&
1412*61046927SAndroid Build Coastguard Worker (instr->intrinsic == nir_intrinsic_store_output ||
1413*61046927SAndroid Build Coastguard Worker instr->intrinsic == nir_intrinsic_store_per_primitive_output ||
1414*61046927SAndroid Build Coastguard Worker instr->intrinsic == nir_intrinsic_store_per_vertex_output)) {
1415*61046927SAndroid Build Coastguard Worker unsigned gs_streams = io.gs_streams;
1416*61046927SAndroid Build Coastguard Worker fprintf(fp, " gs_streams(");
1417*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < 4; i++) {
1418*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s%c=%u", i ? " " : "", "xyzw"[i],
1419*61046927SAndroid Build Coastguard Worker (gs_streams >> (i * 2)) & 0x3);
1420*61046927SAndroid Build Coastguard Worker }
1421*61046927SAndroid Build Coastguard Worker fprintf(fp, ")");
1422*61046927SAndroid Build Coastguard Worker }
1423*61046927SAndroid Build Coastguard Worker
1424*61046927SAndroid Build Coastguard Worker break;
1425*61046927SAndroid Build Coastguard Worker }
1426*61046927SAndroid Build Coastguard Worker
1427*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_IO_XFB:
1428*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_IO_XFB2: {
1429*61046927SAndroid Build Coastguard Worker /* This prints both IO_XFB and IO_XFB2. */
1430*61046927SAndroid Build Coastguard Worker fprintf(fp, "xfb%s(", idx == NIR_INTRINSIC_IO_XFB ? "" : "2");
1431*61046927SAndroid Build Coastguard Worker bool first = true;
1432*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < 2; i++) {
1433*61046927SAndroid Build Coastguard Worker unsigned start_comp = (idx == NIR_INTRINSIC_IO_XFB ? 0 : 2) + i;
1434*61046927SAndroid Build Coastguard Worker nir_io_xfb xfb = start_comp < 2 ? nir_intrinsic_io_xfb(instr) : nir_intrinsic_io_xfb2(instr);
1435*61046927SAndroid Build Coastguard Worker
1436*61046927SAndroid Build Coastguard Worker if (!xfb.out[i].num_components)
1437*61046927SAndroid Build Coastguard Worker continue;
1438*61046927SAndroid Build Coastguard Worker
1439*61046927SAndroid Build Coastguard Worker if (!first)
1440*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
1441*61046927SAndroid Build Coastguard Worker first = false;
1442*61046927SAndroid Build Coastguard Worker
1443*61046927SAndroid Build Coastguard Worker if (xfb.out[i].num_components > 1) {
1444*61046927SAndroid Build Coastguard Worker fprintf(fp, "components=%u..%u",
1445*61046927SAndroid Build Coastguard Worker start_comp, start_comp + xfb.out[i].num_components - 1);
1446*61046927SAndroid Build Coastguard Worker } else {
1447*61046927SAndroid Build Coastguard Worker fprintf(fp, "component=%u", start_comp);
1448*61046927SAndroid Build Coastguard Worker }
1449*61046927SAndroid Build Coastguard Worker fprintf(fp, " buffer=%u offset=%u",
1450*61046927SAndroid Build Coastguard Worker xfb.out[i].buffer, (uint32_t)xfb.out[i].offset * 4);
1451*61046927SAndroid Build Coastguard Worker }
1452*61046927SAndroid Build Coastguard Worker fprintf(fp, ")");
1453*61046927SAndroid Build Coastguard Worker break;
1454*61046927SAndroid Build Coastguard Worker }
1455*61046927SAndroid Build Coastguard Worker
1456*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_ROUNDING_MODE: {
1457*61046927SAndroid Build Coastguard Worker fprintf(fp, "rounding_mode=");
1458*61046927SAndroid Build Coastguard Worker switch (nir_intrinsic_rounding_mode(instr)) {
1459*61046927SAndroid Build Coastguard Worker case nir_rounding_mode_undef:
1460*61046927SAndroid Build Coastguard Worker fprintf(fp, "undef");
1461*61046927SAndroid Build Coastguard Worker break;
1462*61046927SAndroid Build Coastguard Worker case nir_rounding_mode_rtne:
1463*61046927SAndroid Build Coastguard Worker fprintf(fp, "rtne");
1464*61046927SAndroid Build Coastguard Worker break;
1465*61046927SAndroid Build Coastguard Worker case nir_rounding_mode_ru:
1466*61046927SAndroid Build Coastguard Worker fprintf(fp, "ru");
1467*61046927SAndroid Build Coastguard Worker break;
1468*61046927SAndroid Build Coastguard Worker case nir_rounding_mode_rd:
1469*61046927SAndroid Build Coastguard Worker fprintf(fp, "rd");
1470*61046927SAndroid Build Coastguard Worker break;
1471*61046927SAndroid Build Coastguard Worker case nir_rounding_mode_rtz:
1472*61046927SAndroid Build Coastguard Worker fprintf(fp, "rtz");
1473*61046927SAndroid Build Coastguard Worker break;
1474*61046927SAndroid Build Coastguard Worker default:
1475*61046927SAndroid Build Coastguard Worker fprintf(fp, "unknown");
1476*61046927SAndroid Build Coastguard Worker break;
1477*61046927SAndroid Build Coastguard Worker }
1478*61046927SAndroid Build Coastguard Worker break;
1479*61046927SAndroid Build Coastguard Worker }
1480*61046927SAndroid Build Coastguard Worker
1481*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_RAY_QUERY_VALUE: {
1482*61046927SAndroid Build Coastguard Worker fprintf(fp, "ray_query_value=");
1483*61046927SAndroid Build Coastguard Worker switch (nir_intrinsic_ray_query_value(instr)) {
1484*61046927SAndroid Build Coastguard Worker #define VAL(_name) \
1485*61046927SAndroid Build Coastguard Worker case nir_ray_query_value_##_name: \
1486*61046927SAndroid Build Coastguard Worker fprintf(fp, #_name); \
1487*61046927SAndroid Build Coastguard Worker break
1488*61046927SAndroid Build Coastguard Worker VAL(intersection_type);
1489*61046927SAndroid Build Coastguard Worker VAL(intersection_t);
1490*61046927SAndroid Build Coastguard Worker VAL(intersection_instance_custom_index);
1491*61046927SAndroid Build Coastguard Worker VAL(intersection_instance_id);
1492*61046927SAndroid Build Coastguard Worker VAL(intersection_instance_sbt_index);
1493*61046927SAndroid Build Coastguard Worker VAL(intersection_geometry_index);
1494*61046927SAndroid Build Coastguard Worker VAL(intersection_primitive_index);
1495*61046927SAndroid Build Coastguard Worker VAL(intersection_barycentrics);
1496*61046927SAndroid Build Coastguard Worker VAL(intersection_front_face);
1497*61046927SAndroid Build Coastguard Worker VAL(intersection_object_ray_direction);
1498*61046927SAndroid Build Coastguard Worker VAL(intersection_object_ray_origin);
1499*61046927SAndroid Build Coastguard Worker VAL(intersection_object_to_world);
1500*61046927SAndroid Build Coastguard Worker VAL(intersection_world_to_object);
1501*61046927SAndroid Build Coastguard Worker VAL(intersection_candidate_aabb_opaque);
1502*61046927SAndroid Build Coastguard Worker VAL(tmin);
1503*61046927SAndroid Build Coastguard Worker VAL(flags);
1504*61046927SAndroid Build Coastguard Worker VAL(world_ray_direction);
1505*61046927SAndroid Build Coastguard Worker VAL(world_ray_origin);
1506*61046927SAndroid Build Coastguard Worker #undef VAL
1507*61046927SAndroid Build Coastguard Worker default:
1508*61046927SAndroid Build Coastguard Worker fprintf(fp, "unknown");
1509*61046927SAndroid Build Coastguard Worker break;
1510*61046927SAndroid Build Coastguard Worker }
1511*61046927SAndroid Build Coastguard Worker break;
1512*61046927SAndroid Build Coastguard Worker }
1513*61046927SAndroid Build Coastguard Worker
1514*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_RESOURCE_ACCESS_INTEL: {
1515*61046927SAndroid Build Coastguard Worker fprintf(fp, "resource_intel=");
1516*61046927SAndroid Build Coastguard Worker unsigned int modes = nir_intrinsic_resource_access_intel(instr);
1517*61046927SAndroid Build Coastguard Worker if (modes == 0)
1518*61046927SAndroid Build Coastguard Worker fputc('0', fp);
1519*61046927SAndroid Build Coastguard Worker while (modes) {
1520*61046927SAndroid Build Coastguard Worker nir_resource_data_intel i = 1u << u_bit_scan(&modes);
1521*61046927SAndroid Build Coastguard Worker switch (i) {
1522*61046927SAndroid Build Coastguard Worker case nir_resource_intel_bindless:
1523*61046927SAndroid Build Coastguard Worker fprintf(fp, "bindless");
1524*61046927SAndroid Build Coastguard Worker break;
1525*61046927SAndroid Build Coastguard Worker case nir_resource_intel_pushable:
1526*61046927SAndroid Build Coastguard Worker fprintf(fp, "pushable");
1527*61046927SAndroid Build Coastguard Worker break;
1528*61046927SAndroid Build Coastguard Worker case nir_resource_intel_sampler:
1529*61046927SAndroid Build Coastguard Worker fprintf(fp, "sampler");
1530*61046927SAndroid Build Coastguard Worker break;
1531*61046927SAndroid Build Coastguard Worker case nir_resource_intel_non_uniform:
1532*61046927SAndroid Build Coastguard Worker fprintf(fp, "non-uniform");
1533*61046927SAndroid Build Coastguard Worker break;
1534*61046927SAndroid Build Coastguard Worker case nir_resource_intel_sampler_embedded:
1535*61046927SAndroid Build Coastguard Worker fprintf(fp, "sampler-embedded");
1536*61046927SAndroid Build Coastguard Worker break;
1537*61046927SAndroid Build Coastguard Worker default:
1538*61046927SAndroid Build Coastguard Worker fprintf(fp, "unknown");
1539*61046927SAndroid Build Coastguard Worker break;
1540*61046927SAndroid Build Coastguard Worker }
1541*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", modes ? "|" : "");
1542*61046927SAndroid Build Coastguard Worker }
1543*61046927SAndroid Build Coastguard Worker break;
1544*61046927SAndroid Build Coastguard Worker }
1545*61046927SAndroid Build Coastguard Worker
1546*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_ACCESS: {
1547*61046927SAndroid Build Coastguard Worker fprintf(fp, "access=");
1548*61046927SAndroid Build Coastguard Worker print_access(nir_intrinsic_access(instr), state, "|");
1549*61046927SAndroid Build Coastguard Worker break;
1550*61046927SAndroid Build Coastguard Worker }
1551*61046927SAndroid Build Coastguard Worker
1552*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_MATRIX_LAYOUT: {
1553*61046927SAndroid Build Coastguard Worker fprintf(fp, "matrix_layout=");
1554*61046927SAndroid Build Coastguard Worker switch (nir_intrinsic_matrix_layout(instr)) {
1555*61046927SAndroid Build Coastguard Worker case GLSL_MATRIX_LAYOUT_ROW_MAJOR:
1556*61046927SAndroid Build Coastguard Worker fprintf(fp, "row_major");
1557*61046927SAndroid Build Coastguard Worker break;
1558*61046927SAndroid Build Coastguard Worker case GLSL_MATRIX_LAYOUT_COLUMN_MAJOR:
1559*61046927SAndroid Build Coastguard Worker fprintf(fp, "col_major");
1560*61046927SAndroid Build Coastguard Worker break;
1561*61046927SAndroid Build Coastguard Worker default:
1562*61046927SAndroid Build Coastguard Worker fprintf(fp, "unknown");
1563*61046927SAndroid Build Coastguard Worker break;
1564*61046927SAndroid Build Coastguard Worker }
1565*61046927SAndroid Build Coastguard Worker break;
1566*61046927SAndroid Build Coastguard Worker }
1567*61046927SAndroid Build Coastguard Worker
1568*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_CMAT_DESC: {
1569*61046927SAndroid Build Coastguard Worker struct glsl_cmat_description desc = nir_intrinsic_cmat_desc(instr);
1570*61046927SAndroid Build Coastguard Worker const struct glsl_type *t = glsl_cmat_type(&desc);
1571*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", glsl_get_type_name(t));
1572*61046927SAndroid Build Coastguard Worker break;
1573*61046927SAndroid Build Coastguard Worker }
1574*61046927SAndroid Build Coastguard Worker
1575*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_CMAT_SIGNED_MASK: {
1576*61046927SAndroid Build Coastguard Worker fprintf(fp, "cmat_signed=");
1577*61046927SAndroid Build Coastguard Worker unsigned int mask = nir_intrinsic_cmat_signed_mask(instr);
1578*61046927SAndroid Build Coastguard Worker if (mask == 0)
1579*61046927SAndroid Build Coastguard Worker fputc('0', fp);
1580*61046927SAndroid Build Coastguard Worker while (mask) {
1581*61046927SAndroid Build Coastguard Worker nir_cmat_signed i = 1u << u_bit_scan(&mask);
1582*61046927SAndroid Build Coastguard Worker switch (i) {
1583*61046927SAndroid Build Coastguard Worker case NIR_CMAT_A_SIGNED:
1584*61046927SAndroid Build Coastguard Worker fputc('A', fp);
1585*61046927SAndroid Build Coastguard Worker break;
1586*61046927SAndroid Build Coastguard Worker case NIR_CMAT_B_SIGNED:
1587*61046927SAndroid Build Coastguard Worker fputc('B', fp);
1588*61046927SAndroid Build Coastguard Worker break;
1589*61046927SAndroid Build Coastguard Worker case NIR_CMAT_C_SIGNED:
1590*61046927SAndroid Build Coastguard Worker fputc('C', fp);
1591*61046927SAndroid Build Coastguard Worker break;
1592*61046927SAndroid Build Coastguard Worker case NIR_CMAT_RESULT_SIGNED:
1593*61046927SAndroid Build Coastguard Worker fprintf(fp, "Result");
1594*61046927SAndroid Build Coastguard Worker break;
1595*61046927SAndroid Build Coastguard Worker default:
1596*61046927SAndroid Build Coastguard Worker fprintf(fp, "unknown");
1597*61046927SAndroid Build Coastguard Worker break;
1598*61046927SAndroid Build Coastguard Worker }
1599*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", mask ? "|" : "");
1600*61046927SAndroid Build Coastguard Worker }
1601*61046927SAndroid Build Coastguard Worker break;
1602*61046927SAndroid Build Coastguard Worker }
1603*61046927SAndroid Build Coastguard Worker
1604*61046927SAndroid Build Coastguard Worker case NIR_INTRINSIC_ALU_OP: {
1605*61046927SAndroid Build Coastguard Worker nir_op alu_op = nir_intrinsic_alu_op(instr);
1606*61046927SAndroid Build Coastguard Worker fprintf(fp, "alu_op=%s", nir_op_infos[alu_op].name);
1607*61046927SAndroid Build Coastguard Worker break;
1608*61046927SAndroid Build Coastguard Worker }
1609*61046927SAndroid Build Coastguard Worker
1610*61046927SAndroid Build Coastguard Worker default: {
1611*61046927SAndroid Build Coastguard Worker unsigned off = info->index_map[idx] - 1;
1612*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s=%d", nir_intrinsic_index_names[idx], instr->const_index[off]);
1613*61046927SAndroid Build Coastguard Worker break;
1614*61046927SAndroid Build Coastguard Worker }
1615*61046927SAndroid Build Coastguard Worker }
1616*61046927SAndroid Build Coastguard Worker }
1617*61046927SAndroid Build Coastguard Worker if (info->num_indices)
1618*61046927SAndroid Build Coastguard Worker fprintf(fp, ")");
1619*61046927SAndroid Build Coastguard Worker
1620*61046927SAndroid Build Coastguard Worker if (!state->shader)
1621*61046927SAndroid Build Coastguard Worker return;
1622*61046927SAndroid Build Coastguard Worker
1623*61046927SAndroid Build Coastguard Worker nir_variable_mode var_mode;
1624*61046927SAndroid Build Coastguard Worker switch (instr->intrinsic) {
1625*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_uniform:
1626*61046927SAndroid Build Coastguard Worker var_mode = nir_var_uniform;
1627*61046927SAndroid Build Coastguard Worker break;
1628*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_input:
1629*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_per_primitive_input:
1630*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_interpolated_input:
1631*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_per_vertex_input:
1632*61046927SAndroid Build Coastguard Worker var_mode = nir_var_shader_in;
1633*61046927SAndroid Build Coastguard Worker break;
1634*61046927SAndroid Build Coastguard Worker case nir_intrinsic_load_output:
1635*61046927SAndroid Build Coastguard Worker case nir_intrinsic_store_output:
1636*61046927SAndroid Build Coastguard Worker case nir_intrinsic_store_per_vertex_output:
1637*61046927SAndroid Build Coastguard Worker var_mode = nir_var_shader_out;
1638*61046927SAndroid Build Coastguard Worker break;
1639*61046927SAndroid Build Coastguard Worker default:
1640*61046927SAndroid Build Coastguard Worker return;
1641*61046927SAndroid Build Coastguard Worker }
1642*61046927SAndroid Build Coastguard Worker
1643*61046927SAndroid Build Coastguard Worker if (instr->name) {
1644*61046927SAndroid Build Coastguard Worker fprintf(fp, " // %s", instr->name);
1645*61046927SAndroid Build Coastguard Worker return;
1646*61046927SAndroid Build Coastguard Worker }
1647*61046927SAndroid Build Coastguard Worker
1648*61046927SAndroid Build Coastguard Worker nir_foreach_variable_with_modes(var, state->shader, var_mode) {
1649*61046927SAndroid Build Coastguard Worker if (!var->name)
1650*61046927SAndroid Build Coastguard Worker continue;
1651*61046927SAndroid Build Coastguard Worker
1652*61046927SAndroid Build Coastguard Worker bool match;
1653*61046927SAndroid Build Coastguard Worker if (instr->intrinsic == nir_intrinsic_load_uniform) {
1654*61046927SAndroid Build Coastguard Worker match = var->data.driver_location == nir_intrinsic_base(instr);
1655*61046927SAndroid Build Coastguard Worker } else {
1656*61046927SAndroid Build Coastguard Worker match = nir_intrinsic_component(instr) >= var->data.location_frac &&
1657*61046927SAndroid Build Coastguard Worker nir_intrinsic_component(instr) <
1658*61046927SAndroid Build Coastguard Worker (var->data.location_frac + glsl_get_components(var->type));
1659*61046927SAndroid Build Coastguard Worker }
1660*61046927SAndroid Build Coastguard Worker
1661*61046927SAndroid Build Coastguard Worker if (match) {
1662*61046927SAndroid Build Coastguard Worker fprintf(fp, " // %s", var->name);
1663*61046927SAndroid Build Coastguard Worker break;
1664*61046927SAndroid Build Coastguard Worker }
1665*61046927SAndroid Build Coastguard Worker }
1666*61046927SAndroid Build Coastguard Worker }
1667*61046927SAndroid Build Coastguard Worker
1668*61046927SAndroid Build Coastguard Worker static void
print_tex_instr(nir_tex_instr * instr,print_state * state)1669*61046927SAndroid Build Coastguard Worker print_tex_instr(nir_tex_instr *instr, print_state *state)
1670*61046927SAndroid Build Coastguard Worker {
1671*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
1672*61046927SAndroid Build Coastguard Worker
1673*61046927SAndroid Build Coastguard Worker print_def(&instr->def, state);
1674*61046927SAndroid Build Coastguard Worker
1675*61046927SAndroid Build Coastguard Worker fprintf(fp, " = (");
1676*61046927SAndroid Build Coastguard Worker print_alu_type(instr->dest_type, state);
1677*61046927SAndroid Build Coastguard Worker fprintf(fp, ")");
1678*61046927SAndroid Build Coastguard Worker
1679*61046927SAndroid Build Coastguard Worker switch (instr->op) {
1680*61046927SAndroid Build Coastguard Worker case nir_texop_tex:
1681*61046927SAndroid Build Coastguard Worker fprintf(fp, "tex ");
1682*61046927SAndroid Build Coastguard Worker break;
1683*61046927SAndroid Build Coastguard Worker case nir_texop_txb:
1684*61046927SAndroid Build Coastguard Worker fprintf(fp, "txb ");
1685*61046927SAndroid Build Coastguard Worker break;
1686*61046927SAndroid Build Coastguard Worker case nir_texop_txl:
1687*61046927SAndroid Build Coastguard Worker fprintf(fp, "txl ");
1688*61046927SAndroid Build Coastguard Worker break;
1689*61046927SAndroid Build Coastguard Worker case nir_texop_txd:
1690*61046927SAndroid Build Coastguard Worker fprintf(fp, "txd ");
1691*61046927SAndroid Build Coastguard Worker break;
1692*61046927SAndroid Build Coastguard Worker case nir_texop_txf:
1693*61046927SAndroid Build Coastguard Worker fprintf(fp, "txf ");
1694*61046927SAndroid Build Coastguard Worker break;
1695*61046927SAndroid Build Coastguard Worker case nir_texop_txf_ms:
1696*61046927SAndroid Build Coastguard Worker fprintf(fp, "txf_ms ");
1697*61046927SAndroid Build Coastguard Worker break;
1698*61046927SAndroid Build Coastguard Worker case nir_texop_txf_ms_fb:
1699*61046927SAndroid Build Coastguard Worker fprintf(fp, "txf_ms_fb ");
1700*61046927SAndroid Build Coastguard Worker break;
1701*61046927SAndroid Build Coastguard Worker case nir_texop_txf_ms_mcs_intel:
1702*61046927SAndroid Build Coastguard Worker fprintf(fp, "txf_ms_mcs_intel ");
1703*61046927SAndroid Build Coastguard Worker break;
1704*61046927SAndroid Build Coastguard Worker case nir_texop_txs:
1705*61046927SAndroid Build Coastguard Worker fprintf(fp, "txs ");
1706*61046927SAndroid Build Coastguard Worker break;
1707*61046927SAndroid Build Coastguard Worker case nir_texop_lod:
1708*61046927SAndroid Build Coastguard Worker fprintf(fp, "lod ");
1709*61046927SAndroid Build Coastguard Worker break;
1710*61046927SAndroid Build Coastguard Worker case nir_texop_tg4:
1711*61046927SAndroid Build Coastguard Worker fprintf(fp, "tg4 ");
1712*61046927SAndroid Build Coastguard Worker break;
1713*61046927SAndroid Build Coastguard Worker case nir_texop_query_levels:
1714*61046927SAndroid Build Coastguard Worker fprintf(fp, "query_levels ");
1715*61046927SAndroid Build Coastguard Worker break;
1716*61046927SAndroid Build Coastguard Worker case nir_texop_texture_samples:
1717*61046927SAndroid Build Coastguard Worker fprintf(fp, "texture_samples ");
1718*61046927SAndroid Build Coastguard Worker break;
1719*61046927SAndroid Build Coastguard Worker case nir_texop_samples_identical:
1720*61046927SAndroid Build Coastguard Worker fprintf(fp, "samples_identical ");
1721*61046927SAndroid Build Coastguard Worker break;
1722*61046927SAndroid Build Coastguard Worker case nir_texop_tex_prefetch:
1723*61046927SAndroid Build Coastguard Worker fprintf(fp, "tex (pre-dispatchable) ");
1724*61046927SAndroid Build Coastguard Worker break;
1725*61046927SAndroid Build Coastguard Worker case nir_texop_fragment_fetch_amd:
1726*61046927SAndroid Build Coastguard Worker fprintf(fp, "fragment_fetch_amd ");
1727*61046927SAndroid Build Coastguard Worker break;
1728*61046927SAndroid Build Coastguard Worker case nir_texop_fragment_mask_fetch_amd:
1729*61046927SAndroid Build Coastguard Worker fprintf(fp, "fragment_mask_fetch_amd ");
1730*61046927SAndroid Build Coastguard Worker break;
1731*61046927SAndroid Build Coastguard Worker case nir_texop_descriptor_amd:
1732*61046927SAndroid Build Coastguard Worker fprintf(fp, "descriptor_amd ");
1733*61046927SAndroid Build Coastguard Worker break;
1734*61046927SAndroid Build Coastguard Worker case nir_texop_sampler_descriptor_amd:
1735*61046927SAndroid Build Coastguard Worker fprintf(fp, "sampler_descriptor_amd ");
1736*61046927SAndroid Build Coastguard Worker break;
1737*61046927SAndroid Build Coastguard Worker case nir_texop_lod_bias_agx:
1738*61046927SAndroid Build Coastguard Worker fprintf(fp, "lod_bias_agx ");
1739*61046927SAndroid Build Coastguard Worker break;
1740*61046927SAndroid Build Coastguard Worker case nir_texop_has_custom_border_color_agx:
1741*61046927SAndroid Build Coastguard Worker fprintf(fp, "has_custom_border_color_agx ");
1742*61046927SAndroid Build Coastguard Worker break;
1743*61046927SAndroid Build Coastguard Worker case nir_texop_custom_border_color_agx:
1744*61046927SAndroid Build Coastguard Worker fprintf(fp, "custom_border_color_agx ");
1745*61046927SAndroid Build Coastguard Worker break;
1746*61046927SAndroid Build Coastguard Worker case nir_texop_hdr_dim_nv:
1747*61046927SAndroid Build Coastguard Worker fprintf(fp, "hdr_dim_nv ");
1748*61046927SAndroid Build Coastguard Worker break;
1749*61046927SAndroid Build Coastguard Worker case nir_texop_tex_type_nv:
1750*61046927SAndroid Build Coastguard Worker fprintf(fp, "tex_type_nv ");
1751*61046927SAndroid Build Coastguard Worker break;
1752*61046927SAndroid Build Coastguard Worker default:
1753*61046927SAndroid Build Coastguard Worker unreachable("Invalid texture operation");
1754*61046927SAndroid Build Coastguard Worker break;
1755*61046927SAndroid Build Coastguard Worker }
1756*61046927SAndroid Build Coastguard Worker
1757*61046927SAndroid Build Coastguard Worker bool has_texture_deref = false, has_sampler_deref = false;
1758*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < instr->num_srcs; i++) {
1759*61046927SAndroid Build Coastguard Worker if (i > 0) {
1760*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
1761*61046927SAndroid Build Coastguard Worker }
1762*61046927SAndroid Build Coastguard Worker
1763*61046927SAndroid Build Coastguard Worker print_src(&instr->src[i].src, state, nir_tex_instr_src_type(instr, i));
1764*61046927SAndroid Build Coastguard Worker fprintf(fp, " ");
1765*61046927SAndroid Build Coastguard Worker
1766*61046927SAndroid Build Coastguard Worker switch (instr->src[i].src_type) {
1767*61046927SAndroid Build Coastguard Worker case nir_tex_src_backend1:
1768*61046927SAndroid Build Coastguard Worker fprintf(fp, "(backend1)");
1769*61046927SAndroid Build Coastguard Worker break;
1770*61046927SAndroid Build Coastguard Worker case nir_tex_src_backend2:
1771*61046927SAndroid Build Coastguard Worker fprintf(fp, "(backend2)");
1772*61046927SAndroid Build Coastguard Worker break;
1773*61046927SAndroid Build Coastguard Worker case nir_tex_src_coord:
1774*61046927SAndroid Build Coastguard Worker fprintf(fp, "(coord)");
1775*61046927SAndroid Build Coastguard Worker break;
1776*61046927SAndroid Build Coastguard Worker case nir_tex_src_projector:
1777*61046927SAndroid Build Coastguard Worker fprintf(fp, "(projector)");
1778*61046927SAndroid Build Coastguard Worker break;
1779*61046927SAndroid Build Coastguard Worker case nir_tex_src_comparator:
1780*61046927SAndroid Build Coastguard Worker fprintf(fp, "(comparator)");
1781*61046927SAndroid Build Coastguard Worker break;
1782*61046927SAndroid Build Coastguard Worker case nir_tex_src_offset:
1783*61046927SAndroid Build Coastguard Worker fprintf(fp, "(offset)");
1784*61046927SAndroid Build Coastguard Worker break;
1785*61046927SAndroid Build Coastguard Worker case nir_tex_src_bias:
1786*61046927SAndroid Build Coastguard Worker fprintf(fp, "(bias)");
1787*61046927SAndroid Build Coastguard Worker break;
1788*61046927SAndroid Build Coastguard Worker case nir_tex_src_lod:
1789*61046927SAndroid Build Coastguard Worker fprintf(fp, "(lod)");
1790*61046927SAndroid Build Coastguard Worker break;
1791*61046927SAndroid Build Coastguard Worker case nir_tex_src_min_lod:
1792*61046927SAndroid Build Coastguard Worker fprintf(fp, "(min_lod)");
1793*61046927SAndroid Build Coastguard Worker break;
1794*61046927SAndroid Build Coastguard Worker case nir_tex_src_ms_index:
1795*61046927SAndroid Build Coastguard Worker fprintf(fp, "(ms_index)");
1796*61046927SAndroid Build Coastguard Worker break;
1797*61046927SAndroid Build Coastguard Worker case nir_tex_src_ms_mcs_intel:
1798*61046927SAndroid Build Coastguard Worker fprintf(fp, "(ms_mcs_intel)");
1799*61046927SAndroid Build Coastguard Worker break;
1800*61046927SAndroid Build Coastguard Worker case nir_tex_src_ddx:
1801*61046927SAndroid Build Coastguard Worker fprintf(fp, "(ddx)");
1802*61046927SAndroid Build Coastguard Worker break;
1803*61046927SAndroid Build Coastguard Worker case nir_tex_src_ddy:
1804*61046927SAndroid Build Coastguard Worker fprintf(fp, "(ddy)");
1805*61046927SAndroid Build Coastguard Worker break;
1806*61046927SAndroid Build Coastguard Worker case nir_tex_src_sampler_deref_intrinsic:
1807*61046927SAndroid Build Coastguard Worker has_texture_deref = true;
1808*61046927SAndroid Build Coastguard Worker fprintf(fp, "(sampler_deref_intrinsic)");
1809*61046927SAndroid Build Coastguard Worker break;
1810*61046927SAndroid Build Coastguard Worker case nir_tex_src_texture_deref_intrinsic:
1811*61046927SAndroid Build Coastguard Worker has_texture_deref = true;
1812*61046927SAndroid Build Coastguard Worker fprintf(fp, "(texture_deref_intrinsic)");
1813*61046927SAndroid Build Coastguard Worker break;
1814*61046927SAndroid Build Coastguard Worker case nir_tex_src_texture_deref:
1815*61046927SAndroid Build Coastguard Worker has_texture_deref = true;
1816*61046927SAndroid Build Coastguard Worker fprintf(fp, "(texture_deref)");
1817*61046927SAndroid Build Coastguard Worker break;
1818*61046927SAndroid Build Coastguard Worker case nir_tex_src_sampler_deref:
1819*61046927SAndroid Build Coastguard Worker has_sampler_deref = true;
1820*61046927SAndroid Build Coastguard Worker fprintf(fp, "(sampler_deref)");
1821*61046927SAndroid Build Coastguard Worker break;
1822*61046927SAndroid Build Coastguard Worker case nir_tex_src_texture_offset:
1823*61046927SAndroid Build Coastguard Worker fprintf(fp, "(texture_offset)");
1824*61046927SAndroid Build Coastguard Worker break;
1825*61046927SAndroid Build Coastguard Worker case nir_tex_src_sampler_offset:
1826*61046927SAndroid Build Coastguard Worker fprintf(fp, "(sampler_offset)");
1827*61046927SAndroid Build Coastguard Worker break;
1828*61046927SAndroid Build Coastguard Worker case nir_tex_src_texture_handle:
1829*61046927SAndroid Build Coastguard Worker fprintf(fp, "(texture_handle)");
1830*61046927SAndroid Build Coastguard Worker break;
1831*61046927SAndroid Build Coastguard Worker case nir_tex_src_sampler_handle:
1832*61046927SAndroid Build Coastguard Worker fprintf(fp, "(sampler_handle)");
1833*61046927SAndroid Build Coastguard Worker break;
1834*61046927SAndroid Build Coastguard Worker case nir_tex_src_plane:
1835*61046927SAndroid Build Coastguard Worker fprintf(fp, "(plane)");
1836*61046927SAndroid Build Coastguard Worker break;
1837*61046927SAndroid Build Coastguard Worker
1838*61046927SAndroid Build Coastguard Worker default:
1839*61046927SAndroid Build Coastguard Worker unreachable("Invalid texture source type");
1840*61046927SAndroid Build Coastguard Worker break;
1841*61046927SAndroid Build Coastguard Worker }
1842*61046927SAndroid Build Coastguard Worker }
1843*61046927SAndroid Build Coastguard Worker
1844*61046927SAndroid Build Coastguard Worker if (instr->is_gather_implicit_lod)
1845*61046927SAndroid Build Coastguard Worker fprintf(fp, ", implicit lod");
1846*61046927SAndroid Build Coastguard Worker
1847*61046927SAndroid Build Coastguard Worker if (instr->op == nir_texop_tg4) {
1848*61046927SAndroid Build Coastguard Worker fprintf(fp, ", %u (gather_component)", instr->component);
1849*61046927SAndroid Build Coastguard Worker }
1850*61046927SAndroid Build Coastguard Worker
1851*61046927SAndroid Build Coastguard Worker if (nir_tex_instr_has_explicit_tg4_offsets(instr)) {
1852*61046927SAndroid Build Coastguard Worker fprintf(fp, ", { (%i, %i)", instr->tg4_offsets[0][0], instr->tg4_offsets[0][1]);
1853*61046927SAndroid Build Coastguard Worker for (unsigned i = 1; i < 4; ++i)
1854*61046927SAndroid Build Coastguard Worker fprintf(fp, ", (%i, %i)", instr->tg4_offsets[i][0],
1855*61046927SAndroid Build Coastguard Worker instr->tg4_offsets[i][1]);
1856*61046927SAndroid Build Coastguard Worker fprintf(fp, " } (offsets)");
1857*61046927SAndroid Build Coastguard Worker }
1858*61046927SAndroid Build Coastguard Worker
1859*61046927SAndroid Build Coastguard Worker if (instr->op != nir_texop_txf_ms_fb && !has_texture_deref) {
1860*61046927SAndroid Build Coastguard Worker fprintf(fp, ", %u (texture)", instr->texture_index);
1861*61046927SAndroid Build Coastguard Worker }
1862*61046927SAndroid Build Coastguard Worker
1863*61046927SAndroid Build Coastguard Worker if (nir_tex_instr_need_sampler(instr) && !has_sampler_deref) {
1864*61046927SAndroid Build Coastguard Worker fprintf(fp, ", %u (sampler)", instr->sampler_index);
1865*61046927SAndroid Build Coastguard Worker }
1866*61046927SAndroid Build Coastguard Worker
1867*61046927SAndroid Build Coastguard Worker if (instr->texture_non_uniform) {
1868*61046927SAndroid Build Coastguard Worker fprintf(fp, ", texture non-uniform");
1869*61046927SAndroid Build Coastguard Worker }
1870*61046927SAndroid Build Coastguard Worker
1871*61046927SAndroid Build Coastguard Worker if (instr->sampler_non_uniform) {
1872*61046927SAndroid Build Coastguard Worker fprintf(fp, ", sampler non-uniform");
1873*61046927SAndroid Build Coastguard Worker }
1874*61046927SAndroid Build Coastguard Worker
1875*61046927SAndroid Build Coastguard Worker if (instr->is_sparse) {
1876*61046927SAndroid Build Coastguard Worker fprintf(fp, ", sparse");
1877*61046927SAndroid Build Coastguard Worker }
1878*61046927SAndroid Build Coastguard Worker }
1879*61046927SAndroid Build Coastguard Worker
1880*61046927SAndroid Build Coastguard Worker static void
print_call_instr(nir_call_instr * instr,print_state * state)1881*61046927SAndroid Build Coastguard Worker print_call_instr(nir_call_instr *instr, print_state *state)
1882*61046927SAndroid Build Coastguard Worker {
1883*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
1884*61046927SAndroid Build Coastguard Worker
1885*61046927SAndroid Build Coastguard Worker print_no_dest_padding(state);
1886*61046927SAndroid Build Coastguard Worker
1887*61046927SAndroid Build Coastguard Worker fprintf(fp, "call %s ", instr->callee->name);
1888*61046927SAndroid Build Coastguard Worker
1889*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < instr->num_params; i++) {
1890*61046927SAndroid Build Coastguard Worker if (i != 0)
1891*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
1892*61046927SAndroid Build Coastguard Worker
1893*61046927SAndroid Build Coastguard Worker print_src(&instr->params[i], state, nir_type_invalid);
1894*61046927SAndroid Build Coastguard Worker }
1895*61046927SAndroid Build Coastguard Worker }
1896*61046927SAndroid Build Coastguard Worker
1897*61046927SAndroid Build Coastguard Worker static void
print_jump_instr(nir_jump_instr * instr,print_state * state)1898*61046927SAndroid Build Coastguard Worker print_jump_instr(nir_jump_instr *instr, print_state *state)
1899*61046927SAndroid Build Coastguard Worker {
1900*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
1901*61046927SAndroid Build Coastguard Worker
1902*61046927SAndroid Build Coastguard Worker print_no_dest_padding(state);
1903*61046927SAndroid Build Coastguard Worker
1904*61046927SAndroid Build Coastguard Worker switch (instr->type) {
1905*61046927SAndroid Build Coastguard Worker case nir_jump_break:
1906*61046927SAndroid Build Coastguard Worker fprintf(fp, "break");
1907*61046927SAndroid Build Coastguard Worker break;
1908*61046927SAndroid Build Coastguard Worker
1909*61046927SAndroid Build Coastguard Worker case nir_jump_continue:
1910*61046927SAndroid Build Coastguard Worker fprintf(fp, "continue");
1911*61046927SAndroid Build Coastguard Worker break;
1912*61046927SAndroid Build Coastguard Worker
1913*61046927SAndroid Build Coastguard Worker case nir_jump_return:
1914*61046927SAndroid Build Coastguard Worker fprintf(fp, "return");
1915*61046927SAndroid Build Coastguard Worker break;
1916*61046927SAndroid Build Coastguard Worker
1917*61046927SAndroid Build Coastguard Worker case nir_jump_halt:
1918*61046927SAndroid Build Coastguard Worker fprintf(fp, "halt");
1919*61046927SAndroid Build Coastguard Worker break;
1920*61046927SAndroid Build Coastguard Worker
1921*61046927SAndroid Build Coastguard Worker case nir_jump_goto:
1922*61046927SAndroid Build Coastguard Worker fprintf(fp, "goto b%u",
1923*61046927SAndroid Build Coastguard Worker instr->target ? instr->target->index : -1);
1924*61046927SAndroid Build Coastguard Worker break;
1925*61046927SAndroid Build Coastguard Worker
1926*61046927SAndroid Build Coastguard Worker case nir_jump_goto_if:
1927*61046927SAndroid Build Coastguard Worker fprintf(fp, "goto b%u if ",
1928*61046927SAndroid Build Coastguard Worker instr->target ? instr->target->index : -1);
1929*61046927SAndroid Build Coastguard Worker print_src(&instr->condition, state, nir_type_invalid);
1930*61046927SAndroid Build Coastguard Worker fprintf(fp, " else b%u",
1931*61046927SAndroid Build Coastguard Worker instr->else_target ? instr->else_target->index : -1);
1932*61046927SAndroid Build Coastguard Worker break;
1933*61046927SAndroid Build Coastguard Worker }
1934*61046927SAndroid Build Coastguard Worker }
1935*61046927SAndroid Build Coastguard Worker
1936*61046927SAndroid Build Coastguard Worker static void
print_ssa_undef_instr(nir_undef_instr * instr,print_state * state)1937*61046927SAndroid Build Coastguard Worker print_ssa_undef_instr(nir_undef_instr *instr, print_state *state)
1938*61046927SAndroid Build Coastguard Worker {
1939*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
1940*61046927SAndroid Build Coastguard Worker print_def(&instr->def, state);
1941*61046927SAndroid Build Coastguard Worker fprintf(fp, " = undefined");
1942*61046927SAndroid Build Coastguard Worker }
1943*61046927SAndroid Build Coastguard Worker
1944*61046927SAndroid Build Coastguard Worker static void
print_phi_instr(nir_phi_instr * instr,print_state * state)1945*61046927SAndroid Build Coastguard Worker print_phi_instr(nir_phi_instr *instr, print_state *state)
1946*61046927SAndroid Build Coastguard Worker {
1947*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
1948*61046927SAndroid Build Coastguard Worker print_def(&instr->def, state);
1949*61046927SAndroid Build Coastguard Worker fprintf(fp, " = phi ");
1950*61046927SAndroid Build Coastguard Worker nir_foreach_phi_src(src, instr) {
1951*61046927SAndroid Build Coastguard Worker if (&src->node != exec_list_get_head(&instr->srcs))
1952*61046927SAndroid Build Coastguard Worker fprintf(fp, ", ");
1953*61046927SAndroid Build Coastguard Worker
1954*61046927SAndroid Build Coastguard Worker fprintf(fp, "b%u: ", src->pred->index);
1955*61046927SAndroid Build Coastguard Worker print_src(&src->src, state, nir_type_invalid);
1956*61046927SAndroid Build Coastguard Worker }
1957*61046927SAndroid Build Coastguard Worker }
1958*61046927SAndroid Build Coastguard Worker
1959*61046927SAndroid Build Coastguard Worker static void
print_parallel_copy_instr(nir_parallel_copy_instr * instr,print_state * state)1960*61046927SAndroid Build Coastguard Worker print_parallel_copy_instr(nir_parallel_copy_instr *instr, print_state *state)
1961*61046927SAndroid Build Coastguard Worker {
1962*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
1963*61046927SAndroid Build Coastguard Worker nir_foreach_parallel_copy_entry(entry, instr) {
1964*61046927SAndroid Build Coastguard Worker if (&entry->node != exec_list_get_head(&instr->entries))
1965*61046927SAndroid Build Coastguard Worker fprintf(fp, "; ");
1966*61046927SAndroid Build Coastguard Worker
1967*61046927SAndroid Build Coastguard Worker if (entry->dest_is_reg) {
1968*61046927SAndroid Build Coastguard Worker fprintf(fp, "*");
1969*61046927SAndroid Build Coastguard Worker print_src(&entry->dest.reg, state, nir_type_invalid);
1970*61046927SAndroid Build Coastguard Worker } else {
1971*61046927SAndroid Build Coastguard Worker print_def(&entry->dest.def, state);
1972*61046927SAndroid Build Coastguard Worker }
1973*61046927SAndroid Build Coastguard Worker fprintf(fp, " = ");
1974*61046927SAndroid Build Coastguard Worker
1975*61046927SAndroid Build Coastguard Worker if (entry->src_is_reg)
1976*61046927SAndroid Build Coastguard Worker fprintf(fp, "*");
1977*61046927SAndroid Build Coastguard Worker print_src(&entry->src, state, nir_type_invalid);
1978*61046927SAndroid Build Coastguard Worker }
1979*61046927SAndroid Build Coastguard Worker }
1980*61046927SAndroid Build Coastguard Worker
1981*61046927SAndroid Build Coastguard Worker static void
print_debug_info_instr(nir_debug_info_instr * instr,print_state * state)1982*61046927SAndroid Build Coastguard Worker print_debug_info_instr(nir_debug_info_instr *instr, print_state *state)
1983*61046927SAndroid Build Coastguard Worker {
1984*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
1985*61046927SAndroid Build Coastguard Worker
1986*61046927SAndroid Build Coastguard Worker switch (instr->type) {
1987*61046927SAndroid Build Coastguard Worker case nir_debug_info_src_loc:
1988*61046927SAndroid Build Coastguard Worker fprintf(fp, "// 0x%x", instr->src_loc.spirv_offset);
1989*61046927SAndroid Build Coastguard Worker if (instr->src_loc.line)
1990*61046927SAndroid Build Coastguard Worker fprintf(fp, " %s:%u:%u", nir_src_as_string(instr->src_loc.filename), instr->src_loc.line, instr->src_loc.column);
1991*61046927SAndroid Build Coastguard Worker return;
1992*61046927SAndroid Build Coastguard Worker case nir_debug_info_string:
1993*61046927SAndroid Build Coastguard Worker return; /* Strings are printed for their uses. */
1994*61046927SAndroid Build Coastguard Worker }
1995*61046927SAndroid Build Coastguard Worker
1996*61046927SAndroid Build Coastguard Worker unreachable("Unimplemented nir_debug_info_type");
1997*61046927SAndroid Build Coastguard Worker }
1998*61046927SAndroid Build Coastguard Worker
1999*61046927SAndroid Build Coastguard Worker static void
print_instr(const nir_instr * instr,print_state * state,unsigned tabs)2000*61046927SAndroid Build Coastguard Worker print_instr(const nir_instr *instr, print_state *state, unsigned tabs)
2001*61046927SAndroid Build Coastguard Worker {
2002*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
2003*61046927SAndroid Build Coastguard Worker
2004*61046927SAndroid Build Coastguard Worker if (state->debug_info) {
2005*61046927SAndroid Build Coastguard Worker nir_debug_info_instr *di = state->debug_info[instr->index];
2006*61046927SAndroid Build Coastguard Worker di->src_loc.column = (uint32_t)ftell(fp);
2007*61046927SAndroid Build Coastguard Worker }
2008*61046927SAndroid Build Coastguard Worker
2009*61046927SAndroid Build Coastguard Worker print_indentation(tabs, fp);
2010*61046927SAndroid Build Coastguard Worker
2011*61046927SAndroid Build Coastguard Worker switch (instr->type) {
2012*61046927SAndroid Build Coastguard Worker case nir_instr_type_alu:
2013*61046927SAndroid Build Coastguard Worker print_alu_instr(nir_instr_as_alu(instr), state);
2014*61046927SAndroid Build Coastguard Worker break;
2015*61046927SAndroid Build Coastguard Worker
2016*61046927SAndroid Build Coastguard Worker case nir_instr_type_deref:
2017*61046927SAndroid Build Coastguard Worker print_deref_instr(nir_instr_as_deref(instr), state);
2018*61046927SAndroid Build Coastguard Worker break;
2019*61046927SAndroid Build Coastguard Worker
2020*61046927SAndroid Build Coastguard Worker case nir_instr_type_call:
2021*61046927SAndroid Build Coastguard Worker print_call_instr(nir_instr_as_call(instr), state);
2022*61046927SAndroid Build Coastguard Worker break;
2023*61046927SAndroid Build Coastguard Worker
2024*61046927SAndroid Build Coastguard Worker case nir_instr_type_intrinsic:
2025*61046927SAndroid Build Coastguard Worker print_intrinsic_instr(nir_instr_as_intrinsic(instr), state);
2026*61046927SAndroid Build Coastguard Worker break;
2027*61046927SAndroid Build Coastguard Worker
2028*61046927SAndroid Build Coastguard Worker case nir_instr_type_tex:
2029*61046927SAndroid Build Coastguard Worker print_tex_instr(nir_instr_as_tex(instr), state);
2030*61046927SAndroid Build Coastguard Worker break;
2031*61046927SAndroid Build Coastguard Worker
2032*61046927SAndroid Build Coastguard Worker case nir_instr_type_load_const:
2033*61046927SAndroid Build Coastguard Worker print_load_const_instr(nir_instr_as_load_const(instr), state);
2034*61046927SAndroid Build Coastguard Worker break;
2035*61046927SAndroid Build Coastguard Worker
2036*61046927SAndroid Build Coastguard Worker case nir_instr_type_jump:
2037*61046927SAndroid Build Coastguard Worker print_jump_instr(nir_instr_as_jump(instr), state);
2038*61046927SAndroid Build Coastguard Worker break;
2039*61046927SAndroid Build Coastguard Worker
2040*61046927SAndroid Build Coastguard Worker case nir_instr_type_undef:
2041*61046927SAndroid Build Coastguard Worker print_ssa_undef_instr(nir_instr_as_undef(instr), state);
2042*61046927SAndroid Build Coastguard Worker break;
2043*61046927SAndroid Build Coastguard Worker
2044*61046927SAndroid Build Coastguard Worker case nir_instr_type_phi:
2045*61046927SAndroid Build Coastguard Worker print_phi_instr(nir_instr_as_phi(instr), state);
2046*61046927SAndroid Build Coastguard Worker break;
2047*61046927SAndroid Build Coastguard Worker
2048*61046927SAndroid Build Coastguard Worker case nir_instr_type_parallel_copy:
2049*61046927SAndroid Build Coastguard Worker print_parallel_copy_instr(nir_instr_as_parallel_copy(instr), state);
2050*61046927SAndroid Build Coastguard Worker break;
2051*61046927SAndroid Build Coastguard Worker
2052*61046927SAndroid Build Coastguard Worker case nir_instr_type_debug_info:
2053*61046927SAndroid Build Coastguard Worker print_debug_info_instr(nir_instr_as_debug_info(instr), state);
2054*61046927SAndroid Build Coastguard Worker break;
2055*61046927SAndroid Build Coastguard Worker
2056*61046927SAndroid Build Coastguard Worker default:
2057*61046927SAndroid Build Coastguard Worker unreachable("Invalid instruction type");
2058*61046927SAndroid Build Coastguard Worker break;
2059*61046927SAndroid Build Coastguard Worker }
2060*61046927SAndroid Build Coastguard Worker
2061*61046927SAndroid Build Coastguard Worker if (NIR_DEBUG(PRINT_PASS_FLAGS) && instr->pass_flags)
2062*61046927SAndroid Build Coastguard Worker fprintf(fp, " (pass_flags: 0x%x)", instr->pass_flags);
2063*61046927SAndroid Build Coastguard Worker }
2064*61046927SAndroid Build Coastguard Worker
2065*61046927SAndroid Build Coastguard Worker static bool
block_has_instruction_with_dest(nir_block * block)2066*61046927SAndroid Build Coastguard Worker block_has_instruction_with_dest(nir_block *block)
2067*61046927SAndroid Build Coastguard Worker {
2068*61046927SAndroid Build Coastguard Worker nir_foreach_instr(instr, block) {
2069*61046927SAndroid Build Coastguard Worker switch (instr->type) {
2070*61046927SAndroid Build Coastguard Worker case nir_instr_type_load_const:
2071*61046927SAndroid Build Coastguard Worker case nir_instr_type_deref:
2072*61046927SAndroid Build Coastguard Worker case nir_instr_type_alu:
2073*61046927SAndroid Build Coastguard Worker case nir_instr_type_tex:
2074*61046927SAndroid Build Coastguard Worker case nir_instr_type_undef:
2075*61046927SAndroid Build Coastguard Worker case nir_instr_type_phi:
2076*61046927SAndroid Build Coastguard Worker case nir_instr_type_parallel_copy:
2077*61046927SAndroid Build Coastguard Worker return true;
2078*61046927SAndroid Build Coastguard Worker
2079*61046927SAndroid Build Coastguard Worker case nir_instr_type_intrinsic: {
2080*61046927SAndroid Build Coastguard Worker nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
2081*61046927SAndroid Build Coastguard Worker const nir_intrinsic_info *info = &nir_intrinsic_infos[intrin->intrinsic];
2082*61046927SAndroid Build Coastguard Worker if (info->has_dest)
2083*61046927SAndroid Build Coastguard Worker return true;
2084*61046927SAndroid Build Coastguard Worker
2085*61046927SAndroid Build Coastguard Worker /* Doesn't define a new value. */
2086*61046927SAndroid Build Coastguard Worker break;
2087*61046927SAndroid Build Coastguard Worker }
2088*61046927SAndroid Build Coastguard Worker
2089*61046927SAndroid Build Coastguard Worker case nir_instr_type_jump:
2090*61046927SAndroid Build Coastguard Worker case nir_instr_type_call:
2091*61046927SAndroid Build Coastguard Worker case nir_instr_type_debug_info:
2092*61046927SAndroid Build Coastguard Worker /* Doesn't define a new value. */
2093*61046927SAndroid Build Coastguard Worker break;
2094*61046927SAndroid Build Coastguard Worker }
2095*61046927SAndroid Build Coastguard Worker }
2096*61046927SAndroid Build Coastguard Worker
2097*61046927SAndroid Build Coastguard Worker return false;
2098*61046927SAndroid Build Coastguard Worker }
2099*61046927SAndroid Build Coastguard Worker
2100*61046927SAndroid Build Coastguard Worker static void print_cf_node(nir_cf_node *node, print_state *state,
2101*61046927SAndroid Build Coastguard Worker unsigned tabs);
2102*61046927SAndroid Build Coastguard Worker
2103*61046927SAndroid Build Coastguard Worker static void
print_block_preds(nir_block * block,print_state * state)2104*61046927SAndroid Build Coastguard Worker print_block_preds(nir_block *block, print_state *state)
2105*61046927SAndroid Build Coastguard Worker {
2106*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
2107*61046927SAndroid Build Coastguard Worker nir_block **preds = nir_block_get_predecessors_sorted(block, NULL);
2108*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < block->predecessors->entries; i++) {
2109*61046927SAndroid Build Coastguard Worker if (i != 0)
2110*61046927SAndroid Build Coastguard Worker fprintf(fp, " ");
2111*61046927SAndroid Build Coastguard Worker fprintf(fp, "b%u", preds[i]->index);
2112*61046927SAndroid Build Coastguard Worker }
2113*61046927SAndroid Build Coastguard Worker ralloc_free(preds);
2114*61046927SAndroid Build Coastguard Worker }
2115*61046927SAndroid Build Coastguard Worker
2116*61046927SAndroid Build Coastguard Worker static void
print_block_succs(nir_block * block,print_state * state)2117*61046927SAndroid Build Coastguard Worker print_block_succs(nir_block *block, print_state *state)
2118*61046927SAndroid Build Coastguard Worker {
2119*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
2120*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < 2; i++) {
2121*61046927SAndroid Build Coastguard Worker if (block->successors[i]) {
2122*61046927SAndroid Build Coastguard Worker fprintf(fp, "b%u ", block->successors[i]->index);
2123*61046927SAndroid Build Coastguard Worker }
2124*61046927SAndroid Build Coastguard Worker }
2125*61046927SAndroid Build Coastguard Worker }
2126*61046927SAndroid Build Coastguard Worker
2127*61046927SAndroid Build Coastguard Worker static void
print_block(nir_block * block,print_state * state,unsigned tabs)2128*61046927SAndroid Build Coastguard Worker print_block(nir_block *block, print_state *state, unsigned tabs)
2129*61046927SAndroid Build Coastguard Worker {
2130*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
2131*61046927SAndroid Build Coastguard Worker
2132*61046927SAndroid Build Coastguard Worker if (block_has_instruction_with_dest(block))
2133*61046927SAndroid Build Coastguard Worker state->padding_for_no_dest = calculate_padding_for_no_dest(state);
2134*61046927SAndroid Build Coastguard Worker else
2135*61046927SAndroid Build Coastguard Worker state->padding_for_no_dest = 0;
2136*61046927SAndroid Build Coastguard Worker
2137*61046927SAndroid Build Coastguard Worker print_indentation(tabs, fp);
2138*61046927SAndroid Build Coastguard Worker fprintf(fp, "%sblock b%u:",
2139*61046927SAndroid Build Coastguard Worker divergence_status(state, block->divergent),
2140*61046927SAndroid Build Coastguard Worker block->index);
2141*61046927SAndroid Build Coastguard Worker
2142*61046927SAndroid Build Coastguard Worker const bool empty_block = exec_list_is_empty(&block->instr_list);
2143*61046927SAndroid Build Coastguard Worker if (empty_block) {
2144*61046927SAndroid Build Coastguard Worker fprintf(fp, " // preds: ");
2145*61046927SAndroid Build Coastguard Worker print_block_preds(block, state);
2146*61046927SAndroid Build Coastguard Worker fprintf(fp, ", succs: ");
2147*61046927SAndroid Build Coastguard Worker print_block_succs(block, state);
2148*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
2149*61046927SAndroid Build Coastguard Worker return;
2150*61046927SAndroid Build Coastguard Worker }
2151*61046927SAndroid Build Coastguard Worker
2152*61046927SAndroid Build Coastguard Worker const unsigned block_length = 7 + count_digits(block->index) + 1;
2153*61046927SAndroid Build Coastguard Worker const unsigned pred_padding = block_length < state->padding_for_no_dest ? state->padding_for_no_dest - block_length : 0;
2154*61046927SAndroid Build Coastguard Worker
2155*61046927SAndroid Build Coastguard Worker fprintf(fp, "%*s// preds: ", pred_padding, "");
2156*61046927SAndroid Build Coastguard Worker print_block_preds(block, state);
2157*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
2158*61046927SAndroid Build Coastguard Worker
2159*61046927SAndroid Build Coastguard Worker nir_foreach_instr(instr, block) {
2160*61046927SAndroid Build Coastguard Worker print_instr(instr, state, tabs);
2161*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
2162*61046927SAndroid Build Coastguard Worker print_annotation(state, instr);
2163*61046927SAndroid Build Coastguard Worker }
2164*61046927SAndroid Build Coastguard Worker
2165*61046927SAndroid Build Coastguard Worker print_indentation(tabs, fp);
2166*61046927SAndroid Build Coastguard Worker fprintf(fp, "%*s// succs: ", state->padding_for_no_dest, "");
2167*61046927SAndroid Build Coastguard Worker print_block_succs(block, state);
2168*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
2169*61046927SAndroid Build Coastguard Worker }
2170*61046927SAndroid Build Coastguard Worker
2171*61046927SAndroid Build Coastguard Worker static void
print_if(nir_if * if_stmt,print_state * state,unsigned tabs)2172*61046927SAndroid Build Coastguard Worker print_if(nir_if *if_stmt, print_state *state, unsigned tabs)
2173*61046927SAndroid Build Coastguard Worker {
2174*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
2175*61046927SAndroid Build Coastguard Worker
2176*61046927SAndroid Build Coastguard Worker print_indentation(tabs, fp);
2177*61046927SAndroid Build Coastguard Worker fprintf(fp, "if ");
2178*61046927SAndroid Build Coastguard Worker print_src(&if_stmt->condition, state, nir_type_invalid);
2179*61046927SAndroid Build Coastguard Worker switch (if_stmt->control) {
2180*61046927SAndroid Build Coastguard Worker case nir_selection_control_flatten:
2181*61046927SAndroid Build Coastguard Worker fprintf(fp, " // flatten");
2182*61046927SAndroid Build Coastguard Worker break;
2183*61046927SAndroid Build Coastguard Worker case nir_selection_control_dont_flatten:
2184*61046927SAndroid Build Coastguard Worker fprintf(fp, " // don't flatten");
2185*61046927SAndroid Build Coastguard Worker break;
2186*61046927SAndroid Build Coastguard Worker case nir_selection_control_divergent_always_taken:
2187*61046927SAndroid Build Coastguard Worker fprintf(fp, " // divergent always taken");
2188*61046927SAndroid Build Coastguard Worker break;
2189*61046927SAndroid Build Coastguard Worker case nir_selection_control_none:
2190*61046927SAndroid Build Coastguard Worker default:
2191*61046927SAndroid Build Coastguard Worker break;
2192*61046927SAndroid Build Coastguard Worker }
2193*61046927SAndroid Build Coastguard Worker fprintf(fp, " {\n");
2194*61046927SAndroid Build Coastguard Worker foreach_list_typed(nir_cf_node, node, node, &if_stmt->then_list) {
2195*61046927SAndroid Build Coastguard Worker print_cf_node(node, state, tabs + 1);
2196*61046927SAndroid Build Coastguard Worker }
2197*61046927SAndroid Build Coastguard Worker print_indentation(tabs, fp);
2198*61046927SAndroid Build Coastguard Worker fprintf(fp, "} else {\n");
2199*61046927SAndroid Build Coastguard Worker foreach_list_typed(nir_cf_node, node, node, &if_stmt->else_list) {
2200*61046927SAndroid Build Coastguard Worker print_cf_node(node, state, tabs + 1);
2201*61046927SAndroid Build Coastguard Worker }
2202*61046927SAndroid Build Coastguard Worker print_indentation(tabs, fp);
2203*61046927SAndroid Build Coastguard Worker fprintf(fp, "}\n");
2204*61046927SAndroid Build Coastguard Worker }
2205*61046927SAndroid Build Coastguard Worker
2206*61046927SAndroid Build Coastguard Worker static void
print_loop(nir_loop * loop,print_state * state,unsigned tabs)2207*61046927SAndroid Build Coastguard Worker print_loop(nir_loop *loop, print_state *state, unsigned tabs)
2208*61046927SAndroid Build Coastguard Worker {
2209*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
2210*61046927SAndroid Build Coastguard Worker
2211*61046927SAndroid Build Coastguard Worker print_indentation(tabs, fp);
2212*61046927SAndroid Build Coastguard Worker fprintf(fp, "%sloop {\n", divergence_status(state, loop->divergent));
2213*61046927SAndroid Build Coastguard Worker foreach_list_typed(nir_cf_node, node, node, &loop->body) {
2214*61046927SAndroid Build Coastguard Worker print_cf_node(node, state, tabs + 1);
2215*61046927SAndroid Build Coastguard Worker }
2216*61046927SAndroid Build Coastguard Worker print_indentation(tabs, fp);
2217*61046927SAndroid Build Coastguard Worker
2218*61046927SAndroid Build Coastguard Worker if (nir_loop_has_continue_construct(loop)) {
2219*61046927SAndroid Build Coastguard Worker fprintf(fp, "} continue {\n");
2220*61046927SAndroid Build Coastguard Worker foreach_list_typed(nir_cf_node, node, node, &loop->continue_list) {
2221*61046927SAndroid Build Coastguard Worker print_cf_node(node, state, tabs + 1);
2222*61046927SAndroid Build Coastguard Worker }
2223*61046927SAndroid Build Coastguard Worker print_indentation(tabs, fp);
2224*61046927SAndroid Build Coastguard Worker }
2225*61046927SAndroid Build Coastguard Worker
2226*61046927SAndroid Build Coastguard Worker fprintf(fp, "}\n");
2227*61046927SAndroid Build Coastguard Worker }
2228*61046927SAndroid Build Coastguard Worker
2229*61046927SAndroid Build Coastguard Worker static void
print_cf_node(nir_cf_node * node,print_state * state,unsigned int tabs)2230*61046927SAndroid Build Coastguard Worker print_cf_node(nir_cf_node *node, print_state *state, unsigned int tabs)
2231*61046927SAndroid Build Coastguard Worker {
2232*61046927SAndroid Build Coastguard Worker switch (node->type) {
2233*61046927SAndroid Build Coastguard Worker case nir_cf_node_block:
2234*61046927SAndroid Build Coastguard Worker print_block(nir_cf_node_as_block(node), state, tabs);
2235*61046927SAndroid Build Coastguard Worker break;
2236*61046927SAndroid Build Coastguard Worker
2237*61046927SAndroid Build Coastguard Worker case nir_cf_node_if:
2238*61046927SAndroid Build Coastguard Worker print_if(nir_cf_node_as_if(node), state, tabs);
2239*61046927SAndroid Build Coastguard Worker break;
2240*61046927SAndroid Build Coastguard Worker
2241*61046927SAndroid Build Coastguard Worker case nir_cf_node_loop:
2242*61046927SAndroid Build Coastguard Worker print_loop(nir_cf_node_as_loop(node), state, tabs);
2243*61046927SAndroid Build Coastguard Worker break;
2244*61046927SAndroid Build Coastguard Worker
2245*61046927SAndroid Build Coastguard Worker default:
2246*61046927SAndroid Build Coastguard Worker unreachable("Invalid CFG node type");
2247*61046927SAndroid Build Coastguard Worker }
2248*61046927SAndroid Build Coastguard Worker }
2249*61046927SAndroid Build Coastguard Worker
2250*61046927SAndroid Build Coastguard Worker static void
print_function_impl(nir_function_impl * impl,print_state * state)2251*61046927SAndroid Build Coastguard Worker print_function_impl(nir_function_impl *impl, print_state *state)
2252*61046927SAndroid Build Coastguard Worker {
2253*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
2254*61046927SAndroid Build Coastguard Worker
2255*61046927SAndroid Build Coastguard Worker state->max_dest_index = impl->ssa_alloc;
2256*61046927SAndroid Build Coastguard Worker
2257*61046927SAndroid Build Coastguard Worker fprintf(fp, "\nimpl %s ", impl->function->name);
2258*61046927SAndroid Build Coastguard Worker
2259*61046927SAndroid Build Coastguard Worker fprintf(fp, "{\n");
2260*61046927SAndroid Build Coastguard Worker
2261*61046927SAndroid Build Coastguard Worker if (impl->preamble) {
2262*61046927SAndroid Build Coastguard Worker print_indentation(1, fp);
2263*61046927SAndroid Build Coastguard Worker fprintf(fp, "preamble %s\n", impl->preamble->name);
2264*61046927SAndroid Build Coastguard Worker }
2265*61046927SAndroid Build Coastguard Worker
2266*61046927SAndroid Build Coastguard Worker if (!NIR_DEBUG(PRINT_NO_INLINE_CONSTS)) {
2267*61046927SAndroid Build Coastguard Worker /* Don't reindex the SSA as suggested by nir_gather_types() because
2268*61046927SAndroid Build Coastguard Worker * nir_print don't modify the shader. If needed, a limit for ssa_alloc
2269*61046927SAndroid Build Coastguard Worker * can be added.
2270*61046927SAndroid Build Coastguard Worker */
2271*61046927SAndroid Build Coastguard Worker state->float_types = calloc(BITSET_WORDS(impl->ssa_alloc), sizeof(BITSET_WORD));
2272*61046927SAndroid Build Coastguard Worker state->int_types = calloc(BITSET_WORDS(impl->ssa_alloc), sizeof(BITSET_WORD));
2273*61046927SAndroid Build Coastguard Worker nir_gather_types(impl, state->float_types, state->int_types);
2274*61046927SAndroid Build Coastguard Worker }
2275*61046927SAndroid Build Coastguard Worker
2276*61046927SAndroid Build Coastguard Worker nir_foreach_function_temp_variable(var, impl) {
2277*61046927SAndroid Build Coastguard Worker print_indentation(1, fp);
2278*61046927SAndroid Build Coastguard Worker print_var_decl(var, state);
2279*61046927SAndroid Build Coastguard Worker }
2280*61046927SAndroid Build Coastguard Worker
2281*61046927SAndroid Build Coastguard Worker nir_index_blocks(impl);
2282*61046927SAndroid Build Coastguard Worker
2283*61046927SAndroid Build Coastguard Worker foreach_list_typed(nir_cf_node, node, node, &impl->body) {
2284*61046927SAndroid Build Coastguard Worker print_cf_node(node, state, 1);
2285*61046927SAndroid Build Coastguard Worker }
2286*61046927SAndroid Build Coastguard Worker
2287*61046927SAndroid Build Coastguard Worker print_indentation(1, fp);
2288*61046927SAndroid Build Coastguard Worker fprintf(fp, "block b%u:\n}\n\n", impl->end_block->index);
2289*61046927SAndroid Build Coastguard Worker
2290*61046927SAndroid Build Coastguard Worker free(state->float_types);
2291*61046927SAndroid Build Coastguard Worker free(state->int_types);
2292*61046927SAndroid Build Coastguard Worker state->max_dest_index = 0;
2293*61046927SAndroid Build Coastguard Worker }
2294*61046927SAndroid Build Coastguard Worker
2295*61046927SAndroid Build Coastguard Worker static void
print_function(nir_function * function,print_state * state)2296*61046927SAndroid Build Coastguard Worker print_function(nir_function *function, print_state *state)
2297*61046927SAndroid Build Coastguard Worker {
2298*61046927SAndroid Build Coastguard Worker FILE *fp = state->fp;
2299*61046927SAndroid Build Coastguard Worker
2300*61046927SAndroid Build Coastguard Worker /* clang-format off */
2301*61046927SAndroid Build Coastguard Worker fprintf(fp, "decl_function %s (%d params)%s%s", function->name,
2302*61046927SAndroid Build Coastguard Worker function->num_params,
2303*61046927SAndroid Build Coastguard Worker function->dont_inline ? " (noinline)" :
2304*61046927SAndroid Build Coastguard Worker function->should_inline ? " (inline)" : "",
2305*61046927SAndroid Build Coastguard Worker function->is_exported ? " (exported)" : "");
2306*61046927SAndroid Build Coastguard Worker /* clang-format on */
2307*61046927SAndroid Build Coastguard Worker
2308*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
2309*61046927SAndroid Build Coastguard Worker
2310*61046927SAndroid Build Coastguard Worker if (function->impl != NULL) {
2311*61046927SAndroid Build Coastguard Worker print_function_impl(function->impl, state);
2312*61046927SAndroid Build Coastguard Worker return;
2313*61046927SAndroid Build Coastguard Worker }
2314*61046927SAndroid Build Coastguard Worker }
2315*61046927SAndroid Build Coastguard Worker
2316*61046927SAndroid Build Coastguard Worker static void
init_print_state(print_state * state,nir_shader * shader,FILE * fp)2317*61046927SAndroid Build Coastguard Worker init_print_state(print_state *state, nir_shader *shader, FILE *fp)
2318*61046927SAndroid Build Coastguard Worker {
2319*61046927SAndroid Build Coastguard Worker state->fp = fp;
2320*61046927SAndroid Build Coastguard Worker state->shader = shader;
2321*61046927SAndroid Build Coastguard Worker state->ht = _mesa_pointer_hash_table_create(NULL);
2322*61046927SAndroid Build Coastguard Worker state->syms = _mesa_set_create(NULL, _mesa_hash_string,
2323*61046927SAndroid Build Coastguard Worker _mesa_key_string_equal);
2324*61046927SAndroid Build Coastguard Worker state->index = 0;
2325*61046927SAndroid Build Coastguard Worker state->int_types = NULL;
2326*61046927SAndroid Build Coastguard Worker state->float_types = NULL;
2327*61046927SAndroid Build Coastguard Worker state->max_dest_index = 0;
2328*61046927SAndroid Build Coastguard Worker state->padding_for_no_dest = 0;
2329*61046927SAndroid Build Coastguard Worker }
2330*61046927SAndroid Build Coastguard Worker
2331*61046927SAndroid Build Coastguard Worker static void
destroy_print_state(print_state * state)2332*61046927SAndroid Build Coastguard Worker destroy_print_state(print_state *state)
2333*61046927SAndroid Build Coastguard Worker {
2334*61046927SAndroid Build Coastguard Worker _mesa_hash_table_destroy(state->ht, NULL);
2335*61046927SAndroid Build Coastguard Worker _mesa_set_destroy(state->syms, NULL);
2336*61046927SAndroid Build Coastguard Worker }
2337*61046927SAndroid Build Coastguard Worker
2338*61046927SAndroid Build Coastguard Worker static const char *
primitive_name(unsigned primitive)2339*61046927SAndroid Build Coastguard Worker primitive_name(unsigned primitive)
2340*61046927SAndroid Build Coastguard Worker {
2341*61046927SAndroid Build Coastguard Worker #define PRIM(X) \
2342*61046927SAndroid Build Coastguard Worker case MESA_PRIM_##X: \
2343*61046927SAndroid Build Coastguard Worker return #X
2344*61046927SAndroid Build Coastguard Worker switch (primitive) {
2345*61046927SAndroid Build Coastguard Worker PRIM(POINTS);
2346*61046927SAndroid Build Coastguard Worker PRIM(LINES);
2347*61046927SAndroid Build Coastguard Worker PRIM(LINE_LOOP);
2348*61046927SAndroid Build Coastguard Worker PRIM(LINE_STRIP);
2349*61046927SAndroid Build Coastguard Worker PRIM(TRIANGLES);
2350*61046927SAndroid Build Coastguard Worker PRIM(TRIANGLE_STRIP);
2351*61046927SAndroid Build Coastguard Worker PRIM(TRIANGLE_FAN);
2352*61046927SAndroid Build Coastguard Worker PRIM(QUADS);
2353*61046927SAndroid Build Coastguard Worker PRIM(QUAD_STRIP);
2354*61046927SAndroid Build Coastguard Worker PRIM(POLYGON);
2355*61046927SAndroid Build Coastguard Worker PRIM(LINES_ADJACENCY);
2356*61046927SAndroid Build Coastguard Worker PRIM(TRIANGLES_ADJACENCY);
2357*61046927SAndroid Build Coastguard Worker default:
2358*61046927SAndroid Build Coastguard Worker return "UNKNOWN";
2359*61046927SAndroid Build Coastguard Worker }
2360*61046927SAndroid Build Coastguard Worker }
2361*61046927SAndroid Build Coastguard Worker
2362*61046927SAndroid Build Coastguard Worker static void
print_bitset(FILE * fp,const char * label,const unsigned * words,int size)2363*61046927SAndroid Build Coastguard Worker print_bitset(FILE *fp, const char *label, const unsigned *words, int size)
2364*61046927SAndroid Build Coastguard Worker {
2365*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s: ", label);
2366*61046927SAndroid Build Coastguard Worker /* Iterate back-to-front to get proper digit order (most significant first). */
2367*61046927SAndroid Build Coastguard Worker for (int i = size - 1; i >= 0; --i) {
2368*61046927SAndroid Build Coastguard Worker fprintf(fp, (i == size - 1) ? "0x%08x" : "'%08x", words[i]);
2369*61046927SAndroid Build Coastguard Worker }
2370*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
2371*61046927SAndroid Build Coastguard Worker }
2372*61046927SAndroid Build Coastguard Worker
2373*61046927SAndroid Build Coastguard Worker /* Print bitset, only if some bits are set */
2374*61046927SAndroid Build Coastguard Worker static void
print_nz_bitset(FILE * fp,const char * label,const unsigned * words,int size)2375*61046927SAndroid Build Coastguard Worker print_nz_bitset(FILE *fp, const char *label, const unsigned *words, int size)
2376*61046927SAndroid Build Coastguard Worker {
2377*61046927SAndroid Build Coastguard Worker bool is_all_zero = true;
2378*61046927SAndroid Build Coastguard Worker for (int i = 0; i < size; ++i) {
2379*61046927SAndroid Build Coastguard Worker if (words[i]) {
2380*61046927SAndroid Build Coastguard Worker is_all_zero = false;
2381*61046927SAndroid Build Coastguard Worker break;
2382*61046927SAndroid Build Coastguard Worker }
2383*61046927SAndroid Build Coastguard Worker }
2384*61046927SAndroid Build Coastguard Worker
2385*61046927SAndroid Build Coastguard Worker if (!is_all_zero)
2386*61046927SAndroid Build Coastguard Worker print_bitset(fp, label, words, size);
2387*61046927SAndroid Build Coastguard Worker }
2388*61046927SAndroid Build Coastguard Worker
2389*61046927SAndroid Build Coastguard Worker /* Print uint64_t value, only if non-zero.
2390*61046927SAndroid Build Coastguard Worker * The value is printed by enumerating the ranges of bits that are set.
2391*61046927SAndroid Build Coastguard Worker * E.g. inputs_read: 0,15-17
2392*61046927SAndroid Build Coastguard Worker */
2393*61046927SAndroid Build Coastguard Worker static void
print_nz_x64(FILE * fp,const char * label,uint64_t value)2394*61046927SAndroid Build Coastguard Worker print_nz_x64(FILE *fp, const char *label, uint64_t value)
2395*61046927SAndroid Build Coastguard Worker {
2396*61046927SAndroid Build Coastguard Worker if (value) {
2397*61046927SAndroid Build Coastguard Worker char acc[256] = { 0 };
2398*61046927SAndroid Build Coastguard Worker char buf[32];
2399*61046927SAndroid Build Coastguard Worker int start = 0;
2400*61046927SAndroid Build Coastguard Worker int count = 0;
2401*61046927SAndroid Build Coastguard Worker while (value) {
2402*61046927SAndroid Build Coastguard Worker u_bit_scan_consecutive_range64(&value, &start, &count);
2403*61046927SAndroid Build Coastguard Worker assert(count > 0);
2404*61046927SAndroid Build Coastguard Worker bool is_first = !acc[0];
2405*61046927SAndroid Build Coastguard Worker if (count > 1) {
2406*61046927SAndroid Build Coastguard Worker snprintf(buf, sizeof(buf), is_first ? "%d-%d" : ",%d-%d", start, start + count - 1);
2407*61046927SAndroid Build Coastguard Worker } else {
2408*61046927SAndroid Build Coastguard Worker snprintf(buf, sizeof(buf), is_first ? "%d" : ",%d", start);
2409*61046927SAndroid Build Coastguard Worker }
2410*61046927SAndroid Build Coastguard Worker assert(strlen(acc) + strlen(buf) + 1 < sizeof(acc));
2411*61046927SAndroid Build Coastguard Worker strcat(acc, buf);
2412*61046927SAndroid Build Coastguard Worker }
2413*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s: %s\n", label, acc);
2414*61046927SAndroid Build Coastguard Worker }
2415*61046927SAndroid Build Coastguard Worker }
2416*61046927SAndroid Build Coastguard Worker
2417*61046927SAndroid Build Coastguard Worker /* Print uint32_t value in hex, only if non-zero */
2418*61046927SAndroid Build Coastguard Worker static void
print_nz_x32(FILE * fp,const char * label,uint32_t value)2419*61046927SAndroid Build Coastguard Worker print_nz_x32(FILE *fp, const char *label, uint32_t value)
2420*61046927SAndroid Build Coastguard Worker {
2421*61046927SAndroid Build Coastguard Worker if (value)
2422*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s: 0x%08" PRIx32 "\n", label, value);
2423*61046927SAndroid Build Coastguard Worker }
2424*61046927SAndroid Build Coastguard Worker
2425*61046927SAndroid Build Coastguard Worker /* Print uint16_t value in hex, only if non-zero */
2426*61046927SAndroid Build Coastguard Worker static void
print_nz_x16(FILE * fp,const char * label,uint16_t value)2427*61046927SAndroid Build Coastguard Worker print_nz_x16(FILE *fp, const char *label, uint16_t value)
2428*61046927SAndroid Build Coastguard Worker {
2429*61046927SAndroid Build Coastguard Worker if (value)
2430*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s: 0x%04x\n", label, value);
2431*61046927SAndroid Build Coastguard Worker }
2432*61046927SAndroid Build Coastguard Worker
2433*61046927SAndroid Build Coastguard Worker /* Print uint8_t value in hex, only if non-zero */
2434*61046927SAndroid Build Coastguard Worker static void
print_nz_x8(FILE * fp,const char * label,uint8_t value)2435*61046927SAndroid Build Coastguard Worker print_nz_x8(FILE *fp, const char *label, uint8_t value)
2436*61046927SAndroid Build Coastguard Worker {
2437*61046927SAndroid Build Coastguard Worker if (value)
2438*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s: 0x%02x\n", label, value);
2439*61046927SAndroid Build Coastguard Worker }
2440*61046927SAndroid Build Coastguard Worker
2441*61046927SAndroid Build Coastguard Worker /* Print unsigned value in decimal, only if non-zero */
2442*61046927SAndroid Build Coastguard Worker static void
print_nz_unsigned(FILE * fp,const char * label,unsigned value)2443*61046927SAndroid Build Coastguard Worker print_nz_unsigned(FILE *fp, const char *label, unsigned value)
2444*61046927SAndroid Build Coastguard Worker {
2445*61046927SAndroid Build Coastguard Worker if (value)
2446*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s: %u\n", label, value);
2447*61046927SAndroid Build Coastguard Worker }
2448*61046927SAndroid Build Coastguard Worker
2449*61046927SAndroid Build Coastguard Worker /* Print bool only if set */
2450*61046927SAndroid Build Coastguard Worker static void
print_nz_bool(FILE * fp,const char * label,bool value)2451*61046927SAndroid Build Coastguard Worker print_nz_bool(FILE *fp, const char *label, bool value)
2452*61046927SAndroid Build Coastguard Worker {
2453*61046927SAndroid Build Coastguard Worker if (value)
2454*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s: true\n", label);
2455*61046927SAndroid Build Coastguard Worker }
2456*61046927SAndroid Build Coastguard Worker
2457*61046927SAndroid Build Coastguard Worker static void
print_shader_info(const struct shader_info * info,FILE * fp)2458*61046927SAndroid Build Coastguard Worker print_shader_info(const struct shader_info *info, FILE *fp)
2459*61046927SAndroid Build Coastguard Worker {
2460*61046927SAndroid Build Coastguard Worker fprintf(fp, "shader: %s\n", gl_shader_stage_name(info->stage));
2461*61046927SAndroid Build Coastguard Worker
2462*61046927SAndroid Build Coastguard Worker fprintf(fp, "source_blake3: {");
2463*61046927SAndroid Build Coastguard Worker _mesa_blake3_print(fp, info->source_blake3);
2464*61046927SAndroid Build Coastguard Worker fprintf(fp, "}\n");
2465*61046927SAndroid Build Coastguard Worker
2466*61046927SAndroid Build Coastguard Worker if (info->name)
2467*61046927SAndroid Build Coastguard Worker fprintf(fp, "name: %s\n", info->name);
2468*61046927SAndroid Build Coastguard Worker
2469*61046927SAndroid Build Coastguard Worker if (info->label)
2470*61046927SAndroid Build Coastguard Worker fprintf(fp, "label: %s\n", info->label);
2471*61046927SAndroid Build Coastguard Worker
2472*61046927SAndroid Build Coastguard Worker fprintf(fp, "internal: %s\n", info->internal ? "true" : "false");
2473*61046927SAndroid Build Coastguard Worker
2474*61046927SAndroid Build Coastguard Worker if (gl_shader_stage_uses_workgroup(info->stage)) {
2475*61046927SAndroid Build Coastguard Worker fprintf(fp, "workgroup_size: %u, %u, %u%s\n",
2476*61046927SAndroid Build Coastguard Worker info->workgroup_size[0],
2477*61046927SAndroid Build Coastguard Worker info->workgroup_size[1],
2478*61046927SAndroid Build Coastguard Worker info->workgroup_size[2],
2479*61046927SAndroid Build Coastguard Worker info->workgroup_size_variable ? " (variable)" : "");
2480*61046927SAndroid Build Coastguard Worker }
2481*61046927SAndroid Build Coastguard Worker
2482*61046927SAndroid Build Coastguard Worker fprintf(fp, "stage: %d\n"
2483*61046927SAndroid Build Coastguard Worker "next_stage: %d\n",
2484*61046927SAndroid Build Coastguard Worker info->stage, info->next_stage);
2485*61046927SAndroid Build Coastguard Worker
2486*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "num_textures", info->num_textures);
2487*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "num_ubos", info->num_ubos);
2488*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "num_abos", info->num_abos);
2489*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "num_ssbos", info->num_ssbos);
2490*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "num_images", info->num_images);
2491*61046927SAndroid Build Coastguard Worker
2492*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "inputs_read", info->inputs_read);
2493*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "dual_slot_inputs", info->dual_slot_inputs);
2494*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "outputs_written", info->outputs_written);
2495*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "outputs_read", info->outputs_read);
2496*61046927SAndroid Build Coastguard Worker
2497*61046927SAndroid Build Coastguard Worker print_nz_bitset(fp, "system_values_read", info->system_values_read, ARRAY_SIZE(info->system_values_read));
2498*61046927SAndroid Build Coastguard Worker
2499*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "per_primitive_inputs", info->per_primitive_inputs);
2500*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "per_primitive_outputs", info->per_primitive_outputs);
2501*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "per_view_outputs", info->per_view_outputs);
2502*61046927SAndroid Build Coastguard Worker
2503*61046927SAndroid Build Coastguard Worker print_nz_x16(fp, "inputs_read_16bit", info->inputs_read_16bit);
2504*61046927SAndroid Build Coastguard Worker print_nz_x16(fp, "outputs_written_16bit", info->outputs_written_16bit);
2505*61046927SAndroid Build Coastguard Worker print_nz_x16(fp, "outputs_read_16bit", info->outputs_read_16bit);
2506*61046927SAndroid Build Coastguard Worker print_nz_x16(fp, "inputs_read_indirectly_16bit", info->inputs_read_indirectly_16bit);
2507*61046927SAndroid Build Coastguard Worker print_nz_x16(fp, "outputs_accessed_indirectly_16bit", info->outputs_accessed_indirectly_16bit);
2508*61046927SAndroid Build Coastguard Worker
2509*61046927SAndroid Build Coastguard Worker print_nz_x32(fp, "patch_inputs_read", info->patch_inputs_read);
2510*61046927SAndroid Build Coastguard Worker print_nz_x32(fp, "patch_outputs_written", info->patch_outputs_written);
2511*61046927SAndroid Build Coastguard Worker print_nz_x32(fp, "patch_outputs_read", info->patch_outputs_read);
2512*61046927SAndroid Build Coastguard Worker
2513*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "inputs_read_indirectly", info->inputs_read_indirectly);
2514*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "outputs_accessed_indirectly", info->outputs_accessed_indirectly);
2515*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "patch_inputs_read_indirectly", info->patch_inputs_read_indirectly);
2516*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "patch_outputs_accessed_indirectly", info->patch_outputs_accessed_indirectly);
2517*61046927SAndroid Build Coastguard Worker
2518*61046927SAndroid Build Coastguard Worker print_nz_bitset(fp, "textures_used", info->textures_used, ARRAY_SIZE(info->textures_used));
2519*61046927SAndroid Build Coastguard Worker print_nz_bitset(fp, "textures_used_by_txf", info->textures_used_by_txf, ARRAY_SIZE(info->textures_used_by_txf));
2520*61046927SAndroid Build Coastguard Worker print_nz_bitset(fp, "samplers_used", info->samplers_used, ARRAY_SIZE(info->samplers_used));
2521*61046927SAndroid Build Coastguard Worker print_nz_bitset(fp, "images_used", info->images_used, ARRAY_SIZE(info->images_used));
2522*61046927SAndroid Build Coastguard Worker print_nz_bitset(fp, "image_buffers", info->image_buffers, ARRAY_SIZE(info->image_buffers));
2523*61046927SAndroid Build Coastguard Worker print_nz_bitset(fp, "msaa_images", info->msaa_images, ARRAY_SIZE(info->msaa_images));
2524*61046927SAndroid Build Coastguard Worker
2525*61046927SAndroid Build Coastguard Worker print_nz_x32(fp, "float_controls_execution_mode", info->float_controls_execution_mode);
2526*61046927SAndroid Build Coastguard Worker
2527*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "shared_size", info->shared_size);
2528*61046927SAndroid Build Coastguard Worker
2529*61046927SAndroid Build Coastguard Worker if (info->stage == MESA_SHADER_MESH || info->stage == MESA_SHADER_TASK) {
2530*61046927SAndroid Build Coastguard Worker fprintf(fp, "task_payload_size: %u\n", info->task_payload_size);
2531*61046927SAndroid Build Coastguard Worker }
2532*61046927SAndroid Build Coastguard Worker
2533*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "ray queries", info->ray_queries);
2534*61046927SAndroid Build Coastguard Worker
2535*61046927SAndroid Build Coastguard Worker fprintf(fp, "subgroup_size: %u\n", info->subgroup_size);
2536*61046927SAndroid Build Coastguard Worker
2537*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "uses_wide_subgroup_intrinsics", info->uses_wide_subgroup_intrinsics);
2538*61046927SAndroid Build Coastguard Worker
2539*61046927SAndroid Build Coastguard Worker bool has_xfb_stride = info->xfb_stride[0] || info->xfb_stride[1] || info->xfb_stride[2] || info->xfb_stride[3];
2540*61046927SAndroid Build Coastguard Worker if (has_xfb_stride)
2541*61046927SAndroid Build Coastguard Worker fprintf(fp, "xfb_stride: {%u, %u, %u, %u}\n",
2542*61046927SAndroid Build Coastguard Worker info->xfb_stride[0],
2543*61046927SAndroid Build Coastguard Worker info->xfb_stride[1],
2544*61046927SAndroid Build Coastguard Worker info->xfb_stride[2],
2545*61046927SAndroid Build Coastguard Worker info->xfb_stride[3]);
2546*61046927SAndroid Build Coastguard Worker
2547*61046927SAndroid Build Coastguard Worker bool has_inlinable_uniform_dw_offsets = info->inlinable_uniform_dw_offsets[0] || info->inlinable_uniform_dw_offsets[1] || info->inlinable_uniform_dw_offsets[2] || info->inlinable_uniform_dw_offsets[3];
2548*61046927SAndroid Build Coastguard Worker if (has_inlinable_uniform_dw_offsets)
2549*61046927SAndroid Build Coastguard Worker fprintf(fp, "inlinable_uniform_dw_offsets: {%u, %u, %u, %u}\n",
2550*61046927SAndroid Build Coastguard Worker info->inlinable_uniform_dw_offsets[0],
2551*61046927SAndroid Build Coastguard Worker info->inlinable_uniform_dw_offsets[1],
2552*61046927SAndroid Build Coastguard Worker info->inlinable_uniform_dw_offsets[2],
2553*61046927SAndroid Build Coastguard Worker info->inlinable_uniform_dw_offsets[3]);
2554*61046927SAndroid Build Coastguard Worker
2555*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "num_inlinable_uniforms", info->num_inlinable_uniforms);
2556*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "clip_distance_array_size", info->clip_distance_array_size);
2557*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "cull_distance_array_size", info->cull_distance_array_size);
2558*61046927SAndroid Build Coastguard Worker
2559*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "uses_texture_gather", info->uses_texture_gather);
2560*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "uses_resource_info_query", info->uses_resource_info_query);
2561*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "uses_fddx_fddy", info->uses_fddx_fddy);
2562*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "divergence_analysis_run", info->divergence_analysis_run);
2563*61046927SAndroid Build Coastguard Worker
2564*61046927SAndroid Build Coastguard Worker print_nz_x8(fp, "bit_sizes_float", info->bit_sizes_float);
2565*61046927SAndroid Build Coastguard Worker print_nz_x8(fp, "bit_sizes_int", info->bit_sizes_int);
2566*61046927SAndroid Build Coastguard Worker
2567*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "first_ubo_is_default_ubo", info->first_ubo_is_default_ubo);
2568*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "separate_shader", info->separate_shader);
2569*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "has_transform_feedback_varyings", info->has_transform_feedback_varyings);
2570*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "flrp_lowered", info->flrp_lowered);
2571*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "io_lowered", info->io_lowered);
2572*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "writes_memory", info->writes_memory);
2573*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "derivative_group", info->derivative_group);
2574*61046927SAndroid Build Coastguard Worker
2575*61046927SAndroid Build Coastguard Worker switch (info->stage) {
2576*61046927SAndroid Build Coastguard Worker case MESA_SHADER_VERTEX:
2577*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "double_inputs", info->vs.double_inputs);
2578*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "blit_sgprs_amd", info->vs.blit_sgprs_amd);
2579*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "window_space_position", info->vs.window_space_position);
2580*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "needs_edge_flag", info->vs.needs_edge_flag);
2581*61046927SAndroid Build Coastguard Worker break;
2582*61046927SAndroid Build Coastguard Worker
2583*61046927SAndroid Build Coastguard Worker case MESA_SHADER_TESS_CTRL:
2584*61046927SAndroid Build Coastguard Worker case MESA_SHADER_TESS_EVAL:
2585*61046927SAndroid Build Coastguard Worker fprintf(fp, "primitive_mode: %u\n", info->tess._primitive_mode);
2586*61046927SAndroid Build Coastguard Worker fprintf(fp, "tcs_vertices_out: %u\n", info->tess.tcs_vertices_out);
2587*61046927SAndroid Build Coastguard Worker fprintf(fp, "spacing: %u\n", info->tess.spacing);
2588*61046927SAndroid Build Coastguard Worker
2589*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "ccw", info->tess.ccw);
2590*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "point_mode", info->tess.point_mode);
2591*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "tcs_cross_invocation_inputs_read", info->tess.tcs_cross_invocation_inputs_read);
2592*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "tcs_cross_invocation_outputs_read", info->tess.tcs_cross_invocation_outputs_read);
2593*61046927SAndroid Build Coastguard Worker break;
2594*61046927SAndroid Build Coastguard Worker
2595*61046927SAndroid Build Coastguard Worker case MESA_SHADER_GEOMETRY:
2596*61046927SAndroid Build Coastguard Worker fprintf(fp, "output_primitive: %s\n", primitive_name(info->gs.output_primitive));
2597*61046927SAndroid Build Coastguard Worker fprintf(fp, "input_primitive: %s\n", primitive_name(info->gs.input_primitive));
2598*61046927SAndroid Build Coastguard Worker fprintf(fp, "vertices_out: %u\n", info->gs.vertices_out);
2599*61046927SAndroid Build Coastguard Worker fprintf(fp, "invocations: %u\n", info->gs.invocations);
2600*61046927SAndroid Build Coastguard Worker fprintf(fp, "vertices_in: %u\n", info->gs.vertices_in);
2601*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "uses_end_primitive", info->gs.uses_end_primitive);
2602*61046927SAndroid Build Coastguard Worker fprintf(fp, "active_stream_mask: 0x%02x\n", info->gs.active_stream_mask);
2603*61046927SAndroid Build Coastguard Worker break;
2604*61046927SAndroid Build Coastguard Worker
2605*61046927SAndroid Build Coastguard Worker case MESA_SHADER_FRAGMENT:
2606*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "uses_discard", info->fs.uses_discard);
2607*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "uses_fbfetch_output", info->fs.uses_fbfetch_output);
2608*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "color_is_dual_source", info->fs.color_is_dual_source);
2609*61046927SAndroid Build Coastguard Worker
2610*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "require_full_quads", info->fs.require_full_quads);
2611*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "needs_quad_helper_invocations", info->fs.needs_quad_helper_invocations);
2612*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "uses_sample_qualifier", info->fs.uses_sample_qualifier);
2613*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "uses_sample_shading", info->fs.uses_sample_shading);
2614*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "early_fragment_tests", info->fs.early_fragment_tests);
2615*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "inner_coverage", info->fs.inner_coverage);
2616*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "post_depth_coverage", info->fs.post_depth_coverage);
2617*61046927SAndroid Build Coastguard Worker
2618*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "pixel_center_integer", info->fs.pixel_center_integer);
2619*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "origin_upper_left", info->fs.origin_upper_left);
2620*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "pixel_interlock_ordered", info->fs.pixel_interlock_ordered);
2621*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "pixel_interlock_unordered", info->fs.pixel_interlock_unordered);
2622*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "sample_interlock_ordered", info->fs.sample_interlock_ordered);
2623*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "sample_interlock_unordered", info->fs.sample_interlock_unordered);
2624*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "untyped_color_outputs", info->fs.untyped_color_outputs);
2625*61046927SAndroid Build Coastguard Worker
2626*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "depth_layout", info->fs.depth_layout);
2627*61046927SAndroid Build Coastguard Worker
2628*61046927SAndroid Build Coastguard Worker if (info->fs.color0_interp != INTERP_MODE_NONE) {
2629*61046927SAndroid Build Coastguard Worker fprintf(fp, "color0_interp: %s\n",
2630*61046927SAndroid Build Coastguard Worker glsl_interp_mode_name(info->fs.color0_interp));
2631*61046927SAndroid Build Coastguard Worker }
2632*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "color0_sample", info->fs.color0_sample);
2633*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "color0_centroid", info->fs.color0_centroid);
2634*61046927SAndroid Build Coastguard Worker
2635*61046927SAndroid Build Coastguard Worker if (info->fs.color1_interp != INTERP_MODE_NONE) {
2636*61046927SAndroid Build Coastguard Worker fprintf(fp, "color1_interp: %s\n",
2637*61046927SAndroid Build Coastguard Worker glsl_interp_mode_name(info->fs.color1_interp));
2638*61046927SAndroid Build Coastguard Worker }
2639*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "color1_sample", info->fs.color1_sample);
2640*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "color1_centroid", info->fs.color1_centroid);
2641*61046927SAndroid Build Coastguard Worker
2642*61046927SAndroid Build Coastguard Worker print_nz_x32(fp, "advanced_blend_modes", info->fs.advanced_blend_modes);
2643*61046927SAndroid Build Coastguard Worker break;
2644*61046927SAndroid Build Coastguard Worker
2645*61046927SAndroid Build Coastguard Worker case MESA_SHADER_COMPUTE:
2646*61046927SAndroid Build Coastguard Worker case MESA_SHADER_KERNEL:
2647*61046927SAndroid Build Coastguard Worker if (info->cs.workgroup_size_hint[0] || info->cs.workgroup_size_hint[1] || info->cs.workgroup_size_hint[2])
2648*61046927SAndroid Build Coastguard Worker fprintf(fp, "workgroup_size_hint: {%u, %u, %u}\n",
2649*61046927SAndroid Build Coastguard Worker info->cs.workgroup_size_hint[0],
2650*61046927SAndroid Build Coastguard Worker info->cs.workgroup_size_hint[1],
2651*61046927SAndroid Build Coastguard Worker info->cs.workgroup_size_hint[2]);
2652*61046927SAndroid Build Coastguard Worker print_nz_unsigned(fp, "user_data_components_amd", info->cs.user_data_components_amd);
2653*61046927SAndroid Build Coastguard Worker fprintf(fp, "ptr_size: %u\n", info->cs.ptr_size);
2654*61046927SAndroid Build Coastguard Worker break;
2655*61046927SAndroid Build Coastguard Worker
2656*61046927SAndroid Build Coastguard Worker case MESA_SHADER_MESH:
2657*61046927SAndroid Build Coastguard Worker print_nz_x64(fp, "ms_cross_invocation_output_access", info->mesh.ms_cross_invocation_output_access);
2658*61046927SAndroid Build Coastguard Worker fprintf(fp, "max_vertices_out: %u\n", info->mesh.max_vertices_out);
2659*61046927SAndroid Build Coastguard Worker fprintf(fp, "max_primitives_out: %u\n", info->mesh.max_primitives_out);
2660*61046927SAndroid Build Coastguard Worker fprintf(fp, "primitive_type: %s\n", primitive_name(info->mesh.primitive_type));
2661*61046927SAndroid Build Coastguard Worker print_nz_bool(fp, "nv", info->mesh.nv);
2662*61046927SAndroid Build Coastguard Worker break;
2663*61046927SAndroid Build Coastguard Worker
2664*61046927SAndroid Build Coastguard Worker default:
2665*61046927SAndroid Build Coastguard Worker fprintf(fp, "Unhandled stage %d\n", info->stage);
2666*61046927SAndroid Build Coastguard Worker }
2667*61046927SAndroid Build Coastguard Worker }
2668*61046927SAndroid Build Coastguard Worker
2669*61046927SAndroid Build Coastguard Worker static void
_nir_print_shader_annotated(nir_shader * shader,FILE * fp,struct hash_table * annotations,nir_debug_info_instr ** debug_info)2670*61046927SAndroid Build Coastguard Worker _nir_print_shader_annotated(nir_shader *shader, FILE *fp,
2671*61046927SAndroid Build Coastguard Worker struct hash_table *annotations,
2672*61046927SAndroid Build Coastguard Worker nir_debug_info_instr **debug_info)
2673*61046927SAndroid Build Coastguard Worker {
2674*61046927SAndroid Build Coastguard Worker print_state state;
2675*61046927SAndroid Build Coastguard Worker init_print_state(&state, shader, fp);
2676*61046927SAndroid Build Coastguard Worker state.def_prefix = debug_info ? "ssa_" : "%";
2677*61046927SAndroid Build Coastguard Worker state.annotations = annotations;
2678*61046927SAndroid Build Coastguard Worker state.debug_info = debug_info;
2679*61046927SAndroid Build Coastguard Worker
2680*61046927SAndroid Build Coastguard Worker print_shader_info(&shader->info, fp);
2681*61046927SAndroid Build Coastguard Worker
2682*61046927SAndroid Build Coastguard Worker fprintf(fp, "inputs: %u\n", shader->num_inputs);
2683*61046927SAndroid Build Coastguard Worker fprintf(fp, "outputs: %u\n", shader->num_outputs);
2684*61046927SAndroid Build Coastguard Worker fprintf(fp, "uniforms: %u\n", shader->num_uniforms);
2685*61046927SAndroid Build Coastguard Worker if (shader->scratch_size)
2686*61046927SAndroid Build Coastguard Worker fprintf(fp, "scratch: %u\n", shader->scratch_size);
2687*61046927SAndroid Build Coastguard Worker if (shader->constant_data_size)
2688*61046927SAndroid Build Coastguard Worker fprintf(fp, "constants: %u\n", shader->constant_data_size);
2689*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < nir_num_variable_modes; i++) {
2690*61046927SAndroid Build Coastguard Worker nir_variable_mode mode = BITFIELD_BIT(i);
2691*61046927SAndroid Build Coastguard Worker if (mode == nir_var_function_temp)
2692*61046927SAndroid Build Coastguard Worker continue;
2693*61046927SAndroid Build Coastguard Worker
2694*61046927SAndroid Build Coastguard Worker if (mode == nir_var_shader_in || mode == nir_var_shader_out) {
2695*61046927SAndroid Build Coastguard Worker for (unsigned j = 0; j < 128; j++) {
2696*61046927SAndroid Build Coastguard Worker nir_variable *vars[NIR_MAX_VEC_COMPONENTS] = {0};
2697*61046927SAndroid Build Coastguard Worker nir_foreach_variable_with_modes(var, shader, mode) {
2698*61046927SAndroid Build Coastguard Worker if (var->data.location == j)
2699*61046927SAndroid Build Coastguard Worker vars[var->data.location_frac] = var;
2700*61046927SAndroid Build Coastguard Worker }
2701*61046927SAndroid Build Coastguard Worker for (unsigned j = 0; j < ARRAY_SIZE(vars); j++)
2702*61046927SAndroid Build Coastguard Worker if (vars[j]) {
2703*61046927SAndroid Build Coastguard Worker print_var_decl(vars[j], &state);
2704*61046927SAndroid Build Coastguard Worker }
2705*61046927SAndroid Build Coastguard Worker }
2706*61046927SAndroid Build Coastguard Worker } else {
2707*61046927SAndroid Build Coastguard Worker nir_foreach_variable_with_modes(var, shader, mode)
2708*61046927SAndroid Build Coastguard Worker print_var_decl(var, &state);
2709*61046927SAndroid Build Coastguard Worker }
2710*61046927SAndroid Build Coastguard Worker }
2711*61046927SAndroid Build Coastguard Worker
2712*61046927SAndroid Build Coastguard Worker foreach_list_typed(nir_function, func, node, &shader->functions) {
2713*61046927SAndroid Build Coastguard Worker print_function(func, &state);
2714*61046927SAndroid Build Coastguard Worker }
2715*61046927SAndroid Build Coastguard Worker
2716*61046927SAndroid Build Coastguard Worker destroy_print_state(&state);
2717*61046927SAndroid Build Coastguard Worker }
2718*61046927SAndroid Build Coastguard Worker
2719*61046927SAndroid Build Coastguard Worker void
nir_print_shader_annotated(nir_shader * shader,FILE * fp,struct hash_table * annotations)2720*61046927SAndroid Build Coastguard Worker nir_print_shader_annotated(nir_shader *shader, FILE *fp,
2721*61046927SAndroid Build Coastguard Worker struct hash_table *annotations)
2722*61046927SAndroid Build Coastguard Worker {
2723*61046927SAndroid Build Coastguard Worker _nir_print_shader_annotated(shader, fp, annotations, NULL);
2724*61046927SAndroid Build Coastguard Worker }
2725*61046927SAndroid Build Coastguard Worker
2726*61046927SAndroid Build Coastguard Worker void
nir_print_shader(nir_shader * shader,FILE * fp)2727*61046927SAndroid Build Coastguard Worker nir_print_shader(nir_shader *shader, FILE *fp)
2728*61046927SAndroid Build Coastguard Worker {
2729*61046927SAndroid Build Coastguard Worker nir_print_shader_annotated(shader, fp, NULL);
2730*61046927SAndroid Build Coastguard Worker fflush(fp);
2731*61046927SAndroid Build Coastguard Worker }
2732*61046927SAndroid Build Coastguard Worker
2733*61046927SAndroid Build Coastguard Worker static char *
_nir_shader_as_str_annotated(nir_shader * nir,struct hash_table * annotations,void * mem_ctx,nir_debug_info_instr ** debug_info)2734*61046927SAndroid Build Coastguard Worker _nir_shader_as_str_annotated(nir_shader *nir, struct hash_table *annotations, void *mem_ctx,
2735*61046927SAndroid Build Coastguard Worker nir_debug_info_instr **debug_info)
2736*61046927SAndroid Build Coastguard Worker {
2737*61046927SAndroid Build Coastguard Worker char *stream_data = NULL;
2738*61046927SAndroid Build Coastguard Worker size_t stream_size = 0;
2739*61046927SAndroid Build Coastguard Worker struct u_memstream mem;
2740*61046927SAndroid Build Coastguard Worker if (u_memstream_open(&mem, &stream_data, &stream_size)) {
2741*61046927SAndroid Build Coastguard Worker FILE *const stream = u_memstream_get(&mem);
2742*61046927SAndroid Build Coastguard Worker _nir_print_shader_annotated(nir, stream, annotations, debug_info);
2743*61046927SAndroid Build Coastguard Worker u_memstream_close(&mem);
2744*61046927SAndroid Build Coastguard Worker }
2745*61046927SAndroid Build Coastguard Worker
2746*61046927SAndroid Build Coastguard Worker char *str = ralloc_size(mem_ctx, stream_size + 1);
2747*61046927SAndroid Build Coastguard Worker memcpy(str, stream_data, stream_size);
2748*61046927SAndroid Build Coastguard Worker str[stream_size] = '\0';
2749*61046927SAndroid Build Coastguard Worker
2750*61046927SAndroid Build Coastguard Worker free(stream_data);
2751*61046927SAndroid Build Coastguard Worker
2752*61046927SAndroid Build Coastguard Worker return str;
2753*61046927SAndroid Build Coastguard Worker }
2754*61046927SAndroid Build Coastguard Worker
2755*61046927SAndroid Build Coastguard Worker char *
nir_shader_as_str_annotated(nir_shader * nir,struct hash_table * annotations,void * mem_ctx)2756*61046927SAndroid Build Coastguard Worker nir_shader_as_str_annotated(nir_shader *nir, struct hash_table *annotations, void *mem_ctx)
2757*61046927SAndroid Build Coastguard Worker {
2758*61046927SAndroid Build Coastguard Worker return _nir_shader_as_str_annotated(nir, annotations, mem_ctx, NULL);
2759*61046927SAndroid Build Coastguard Worker }
2760*61046927SAndroid Build Coastguard Worker
2761*61046927SAndroid Build Coastguard Worker char *
nir_shader_as_str(nir_shader * nir,void * mem_ctx)2762*61046927SAndroid Build Coastguard Worker nir_shader_as_str(nir_shader *nir, void *mem_ctx)
2763*61046927SAndroid Build Coastguard Worker {
2764*61046927SAndroid Build Coastguard Worker return nir_shader_as_str_annotated(nir, NULL, mem_ctx);
2765*61046927SAndroid Build Coastguard Worker }
2766*61046927SAndroid Build Coastguard Worker
2767*61046927SAndroid Build Coastguard Worker void
nir_print_instr(const nir_instr * instr,FILE * fp)2768*61046927SAndroid Build Coastguard Worker nir_print_instr(const nir_instr *instr, FILE *fp)
2769*61046927SAndroid Build Coastguard Worker {
2770*61046927SAndroid Build Coastguard Worker print_state state = {
2771*61046927SAndroid Build Coastguard Worker .fp = fp,
2772*61046927SAndroid Build Coastguard Worker .def_prefix = "%",
2773*61046927SAndroid Build Coastguard Worker };
2774*61046927SAndroid Build Coastguard Worker if (instr->block) {
2775*61046927SAndroid Build Coastguard Worker nir_function_impl *impl = nir_cf_node_get_function(&instr->block->cf_node);
2776*61046927SAndroid Build Coastguard Worker state.shader = impl->function->shader;
2777*61046927SAndroid Build Coastguard Worker }
2778*61046927SAndroid Build Coastguard Worker
2779*61046927SAndroid Build Coastguard Worker print_instr(instr, &state, 0);
2780*61046927SAndroid Build Coastguard Worker }
2781*61046927SAndroid Build Coastguard Worker
2782*61046927SAndroid Build Coastguard Worker char *
nir_instr_as_str(const nir_instr * instr,void * mem_ctx)2783*61046927SAndroid Build Coastguard Worker nir_instr_as_str(const nir_instr *instr, void *mem_ctx)
2784*61046927SAndroid Build Coastguard Worker {
2785*61046927SAndroid Build Coastguard Worker char *stream_data = NULL;
2786*61046927SAndroid Build Coastguard Worker size_t stream_size = 0;
2787*61046927SAndroid Build Coastguard Worker struct u_memstream mem;
2788*61046927SAndroid Build Coastguard Worker if (u_memstream_open(&mem, &stream_data, &stream_size)) {
2789*61046927SAndroid Build Coastguard Worker FILE *const stream = u_memstream_get(&mem);
2790*61046927SAndroid Build Coastguard Worker nir_print_instr(instr, stream);
2791*61046927SAndroid Build Coastguard Worker u_memstream_close(&mem);
2792*61046927SAndroid Build Coastguard Worker }
2793*61046927SAndroid Build Coastguard Worker
2794*61046927SAndroid Build Coastguard Worker char *str = ralloc_size(mem_ctx, stream_size + 1);
2795*61046927SAndroid Build Coastguard Worker memcpy(str, stream_data, stream_size);
2796*61046927SAndroid Build Coastguard Worker str[stream_size] = '\0';
2797*61046927SAndroid Build Coastguard Worker
2798*61046927SAndroid Build Coastguard Worker free(stream_data);
2799*61046927SAndroid Build Coastguard Worker
2800*61046927SAndroid Build Coastguard Worker return str;
2801*61046927SAndroid Build Coastguard Worker }
2802*61046927SAndroid Build Coastguard Worker
2803*61046927SAndroid Build Coastguard Worker void
nir_print_deref(const nir_deref_instr * deref,FILE * fp)2804*61046927SAndroid Build Coastguard Worker nir_print_deref(const nir_deref_instr *deref, FILE *fp)
2805*61046927SAndroid Build Coastguard Worker {
2806*61046927SAndroid Build Coastguard Worker print_state state = {
2807*61046927SAndroid Build Coastguard Worker .fp = fp,
2808*61046927SAndroid Build Coastguard Worker .def_prefix = "%",
2809*61046927SAndroid Build Coastguard Worker };
2810*61046927SAndroid Build Coastguard Worker print_deref_link(deref, true, &state);
2811*61046927SAndroid Build Coastguard Worker }
2812*61046927SAndroid Build Coastguard Worker
2813*61046927SAndroid Build Coastguard Worker void
nir_log_shader_annotated_tagged(enum mesa_log_level level,const char * tag,nir_shader * shader,struct hash_table * annotations)2814*61046927SAndroid Build Coastguard Worker nir_log_shader_annotated_tagged(enum mesa_log_level level, const char *tag,
2815*61046927SAndroid Build Coastguard Worker nir_shader *shader, struct hash_table *annotations)
2816*61046927SAndroid Build Coastguard Worker {
2817*61046927SAndroid Build Coastguard Worker char *str = nir_shader_as_str_annotated(shader, annotations, NULL);
2818*61046927SAndroid Build Coastguard Worker _mesa_log_multiline(level, tag, str);
2819*61046927SAndroid Build Coastguard Worker ralloc_free(str);
2820*61046927SAndroid Build Coastguard Worker }
2821*61046927SAndroid Build Coastguard Worker
2822*61046927SAndroid Build Coastguard Worker char *
nir_shader_gather_debug_info(nir_shader * shader,const char * filename)2823*61046927SAndroid Build Coastguard Worker nir_shader_gather_debug_info(nir_shader *shader, const char *filename)
2824*61046927SAndroid Build Coastguard Worker {
2825*61046927SAndroid Build Coastguard Worker uint32_t instr_count = 0;
2826*61046927SAndroid Build Coastguard Worker nir_foreach_function_impl(impl, shader) {
2827*61046927SAndroid Build Coastguard Worker nir_foreach_block(block, impl) {
2828*61046927SAndroid Build Coastguard Worker nir_foreach_instr(instr, block) {
2829*61046927SAndroid Build Coastguard Worker instr->index = instr_count;
2830*61046927SAndroid Build Coastguard Worker instr_count++;
2831*61046927SAndroid Build Coastguard Worker }
2832*61046927SAndroid Build Coastguard Worker }
2833*61046927SAndroid Build Coastguard Worker }
2834*61046927SAndroid Build Coastguard Worker
2835*61046927SAndroid Build Coastguard Worker if (!instr_count)
2836*61046927SAndroid Build Coastguard Worker return nir_shader_as_str(shader, NULL);
2837*61046927SAndroid Build Coastguard Worker
2838*61046927SAndroid Build Coastguard Worker nir_debug_info_instr **debug_info = rzalloc_array(shader, nir_debug_info_instr *, instr_count);
2839*61046927SAndroid Build Coastguard Worker
2840*61046927SAndroid Build Coastguard Worker instr_count = 0;
2841*61046927SAndroid Build Coastguard Worker nir_foreach_function_impl(impl, shader) {
2842*61046927SAndroid Build Coastguard Worker nir_builder b = nir_builder_at(nir_before_cf_list(&impl->body));
2843*61046927SAndroid Build Coastguard Worker nir_def *filename_def = nir_build_string(&b, filename);
2844*61046927SAndroid Build Coastguard Worker
2845*61046927SAndroid Build Coastguard Worker nir_foreach_block(block, impl) {
2846*61046927SAndroid Build Coastguard Worker nir_foreach_instr_safe(instr, block) {
2847*61046927SAndroid Build Coastguard Worker if (instr->type == nir_instr_type_debug_info)
2848*61046927SAndroid Build Coastguard Worker continue;
2849*61046927SAndroid Build Coastguard Worker
2850*61046927SAndroid Build Coastguard Worker nir_debug_info_instr *di = nir_debug_info_instr_create(shader, nir_debug_info_src_loc, 0);
2851*61046927SAndroid Build Coastguard Worker di->src_loc.filename = nir_src_for_ssa(filename_def);
2852*61046927SAndroid Build Coastguard Worker di->src_loc.source = nir_debug_info_nir;
2853*61046927SAndroid Build Coastguard Worker debug_info[instr_count++] = di;
2854*61046927SAndroid Build Coastguard Worker }
2855*61046927SAndroid Build Coastguard Worker }
2856*61046927SAndroid Build Coastguard Worker }
2857*61046927SAndroid Build Coastguard Worker
2858*61046927SAndroid Build Coastguard Worker char *str = _nir_shader_as_str_annotated(shader, NULL, NULL, debug_info);
2859*61046927SAndroid Build Coastguard Worker
2860*61046927SAndroid Build Coastguard Worker uint32_t line = 1;
2861*61046927SAndroid Build Coastguard Worker uint32_t character_index = 0;
2862*61046927SAndroid Build Coastguard Worker
2863*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < instr_count; i++) {
2864*61046927SAndroid Build Coastguard Worker nir_debug_info_instr *di = debug_info[i];
2865*61046927SAndroid Build Coastguard Worker
2866*61046927SAndroid Build Coastguard Worker while (character_index < di->src_loc.column) {
2867*61046927SAndroid Build Coastguard Worker if (str[character_index] == '\n')
2868*61046927SAndroid Build Coastguard Worker line++;
2869*61046927SAndroid Build Coastguard Worker character_index++;
2870*61046927SAndroid Build Coastguard Worker }
2871*61046927SAndroid Build Coastguard Worker
2872*61046927SAndroid Build Coastguard Worker di->src_loc.line = line;
2873*61046927SAndroid Build Coastguard Worker di->src_loc.column = 0;
2874*61046927SAndroid Build Coastguard Worker }
2875*61046927SAndroid Build Coastguard Worker
2876*61046927SAndroid Build Coastguard Worker instr_count = 0;
2877*61046927SAndroid Build Coastguard Worker nir_foreach_function_impl(impl, shader) {
2878*61046927SAndroid Build Coastguard Worker nir_foreach_block(block, impl) {
2879*61046927SAndroid Build Coastguard Worker nir_foreach_instr_safe(instr, block) {
2880*61046927SAndroid Build Coastguard Worker if (instr->type != nir_instr_type_debug_info)
2881*61046927SAndroid Build Coastguard Worker nir_instr_insert_before(instr, &debug_info[instr_count++]->instr);
2882*61046927SAndroid Build Coastguard Worker }
2883*61046927SAndroid Build Coastguard Worker }
2884*61046927SAndroid Build Coastguard Worker }
2885*61046927SAndroid Build Coastguard Worker
2886*61046927SAndroid Build Coastguard Worker return str;
2887*61046927SAndroid Build Coastguard Worker }
2888