nir: Use _snprintf on Windows.
[mesa.git] / src / compiler / nir / nir_print.c
1 /*
2 * Copyright © 2014 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 *
23 * Authors:
24 * Connor Abbott (cwabbott0@gmail.com)
25 *
26 */
27
28 #include "nir.h"
29 #include "compiler/shader_enums.h"
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <inttypes.h> /* for PRIx64 macro */
33
34 #if defined(_WIN32) && !defined(snprintf)
35 #define snprintf _snprintf
36 #endif
37
38 static void
39 print_tabs(unsigned num_tabs, FILE *fp)
40 {
41 for (unsigned i = 0; i < num_tabs; i++)
42 fprintf(fp, "\t");
43 }
44
45 typedef struct {
46 FILE *fp;
47 nir_shader *shader;
48 /** map from nir_variable -> printable name */
49 struct hash_table *ht;
50
51 /** set of names used so far for nir_variables */
52 struct set *syms;
53
54 /* an index used to make new non-conflicting names */
55 unsigned index;
56 } print_state;
57
58 static void
59 print_register(nir_register *reg, print_state *state)
60 {
61 FILE *fp = state->fp;
62 if (reg->name != NULL)
63 fprintf(fp, "/* %s */ ", reg->name);
64 if (reg->is_global)
65 fprintf(fp, "gr%u", reg->index);
66 else
67 fprintf(fp, "r%u", reg->index);
68 }
69
70 static const char *sizes[] = { "error", "vec1", "vec2", "vec3", "vec4" };
71
72 static void
73 print_register_decl(nir_register *reg, print_state *state)
74 {
75 FILE *fp = state->fp;
76 fprintf(fp, "decl_reg %s %u ", sizes[reg->num_components], reg->bit_size);
77 if (reg->is_packed)
78 fprintf(fp, "(packed) ");
79 print_register(reg, state);
80 if (reg->num_array_elems != 0)
81 fprintf(fp, "[%u]", reg->num_array_elems);
82 fprintf(fp, "\n");
83 }
84
85 static void
86 print_ssa_def(nir_ssa_def *def, print_state *state)
87 {
88 FILE *fp = state->fp;
89 if (def->name != NULL)
90 fprintf(fp, "/* %s */ ", def->name);
91 fprintf(fp, "%s %u ssa_%u", sizes[def->num_components], def->bit_size,
92 def->index);
93 }
94
95 static void
96 print_ssa_use(nir_ssa_def *def, print_state *state)
97 {
98 FILE *fp = state->fp;
99 if (def->name != NULL)
100 fprintf(fp, "/* %s */ ", def->name);
101 fprintf(fp, "ssa_%u", def->index);
102 }
103
104 static void print_src(nir_src *src, print_state *state);
105
106 static void
107 print_reg_src(nir_reg_src *src, print_state *state)
108 {
109 FILE *fp = state->fp;
110 print_register(src->reg, state);
111 if (src->reg->num_array_elems != 0) {
112 fprintf(fp, "[%u", src->base_offset);
113 if (src->indirect != NULL) {
114 fprintf(fp, " + ");
115 print_src(src->indirect, state);
116 }
117 fprintf(fp, "]");
118 }
119 }
120
121 static void
122 print_reg_dest(nir_reg_dest *dest, print_state *state)
123 {
124 FILE *fp = state->fp;
125 print_register(dest->reg, state);
126 if (dest->reg->num_array_elems != 0) {
127 fprintf(fp, "[%u", dest->base_offset);
128 if (dest->indirect != NULL) {
129 fprintf(fp, " + ");
130 print_src(dest->indirect, state);
131 }
132 fprintf(fp, "]");
133 }
134 }
135
136 static void
137 print_src(nir_src *src, print_state *state)
138 {
139 if (src->is_ssa)
140 print_ssa_use(src->ssa, state);
141 else
142 print_reg_src(&src->reg, state);
143 }
144
145 static void
146 print_dest(nir_dest *dest, print_state *state)
147 {
148 if (dest->is_ssa)
149 print_ssa_def(&dest->ssa, state);
150 else
151 print_reg_dest(&dest->reg, state);
152 }
153
154 static void
155 print_alu_src(nir_alu_instr *instr, unsigned src, print_state *state)
156 {
157 FILE *fp = state->fp;
158
159 if (instr->src[src].negate)
160 fprintf(fp, "-");
161 if (instr->src[src].abs)
162 fprintf(fp, "abs(");
163
164 print_src(&instr->src[src].src, state);
165
166 bool print_swizzle = false;
167 for (unsigned i = 0; i < 4; i++) {
168 if (!nir_alu_instr_channel_used(instr, src, i))
169 continue;
170
171 if (instr->src[src].swizzle[i] != i) {
172 print_swizzle = true;
173 break;
174 }
175 }
176
177 if (print_swizzle) {
178 fprintf(fp, ".");
179 for (unsigned i = 0; i < 4; i++) {
180 if (!nir_alu_instr_channel_used(instr, src, i))
181 continue;
182
183 fprintf(fp, "%c", "xyzw"[instr->src[src].swizzle[i]]);
184 }
185 }
186
187 if (instr->src[src].abs)
188 fprintf(fp, ")");
189 }
190
191 static void
192 print_alu_dest(nir_alu_dest *dest, print_state *state)
193 {
194 FILE *fp = state->fp;
195 /* we're going to print the saturate modifier later, after the opcode */
196
197 print_dest(&dest->dest, state);
198
199 if (!dest->dest.is_ssa &&
200 dest->write_mask != (1 << dest->dest.reg.reg->num_components) - 1) {
201 fprintf(fp, ".");
202 for (unsigned i = 0; i < 4; i++)
203 if ((dest->write_mask >> i) & 1)
204 fprintf(fp, "%c", "xyzw"[i]);
205 }
206 }
207
208 static void
209 print_alu_instr(nir_alu_instr *instr, print_state *state)
210 {
211 FILE *fp = state->fp;
212
213 print_alu_dest(&instr->dest, state);
214
215 fprintf(fp, " = %s", nir_op_infos[instr->op].name);
216 if (instr->exact)
217 fprintf(fp, "!");
218 if (instr->dest.saturate)
219 fprintf(fp, ".sat");
220 fprintf(fp, " ");
221
222 for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++) {
223 if (i != 0)
224 fprintf(fp, ", ");
225
226 print_alu_src(instr, i, state);
227 }
228 }
229
230 static const char *
231 get_var_name(nir_variable *var, print_state *state)
232 {
233 if (state->ht == NULL)
234 return var->name;
235
236 assert(state->syms);
237
238 struct hash_entry *entry = _mesa_hash_table_search(state->ht, var);
239 if (entry)
240 return entry->data;
241
242 char *name;
243 if (var->name == NULL) {
244 name = ralloc_asprintf(state->syms, "@%u", state->index++);
245 } else {
246 struct set_entry *set_entry = _mesa_set_search(state->syms, var->name);
247 if (set_entry != NULL) {
248 /* we have a collision with another name, append an @ + a unique
249 * index */
250 name = ralloc_asprintf(state->syms, "%s@%u", var->name,
251 state->index++);
252 } else {
253 /* Mark this one as seen */
254 _mesa_set_add(state->syms, var->name);
255 name = var->name;
256 }
257 }
258
259 _mesa_hash_table_insert(state->ht, var, name);
260
261 return name;
262 }
263
264 static void
265 print_constant(nir_constant *c, const struct glsl_type *type, print_state *state)
266 {
267 FILE *fp = state->fp;
268 unsigned total_elems = glsl_get_components(type);
269 unsigned i;
270
271 switch (glsl_get_base_type(type)) {
272 case GLSL_TYPE_UINT:
273 case GLSL_TYPE_INT:
274 case GLSL_TYPE_BOOL:
275 for (i = 0; i < total_elems; i++) {
276 if (i > 0) fprintf(fp, ", ");
277 fprintf(fp, "0x%08x", c->value.u[i]);
278 }
279 break;
280
281 case GLSL_TYPE_FLOAT:
282 for (i = 0; i < total_elems; i++) {
283 if (i > 0) fprintf(fp, ", ");
284 fprintf(fp, "%f", c->value.f[i]);
285 }
286 break;
287
288 case GLSL_TYPE_DOUBLE:
289 for (i = 0; i < total_elems; i++) {
290 if (i > 0) fprintf(fp, ", ");
291 fprintf(fp, "%f", c->value.d[i]);
292 }
293 break;
294
295 case GLSL_TYPE_STRUCT:
296 for (i = 0; i < c->num_elements; i++) {
297 if (i > 0) fprintf(fp, ", ");
298 fprintf(fp, "{ ");
299 print_constant(c->elements[i], glsl_get_struct_field(type, i), state);
300 fprintf(fp, " }");
301 }
302 break;
303
304 case GLSL_TYPE_ARRAY:
305 for (i = 0; i < c->num_elements; i++) {
306 if (i > 0) fprintf(fp, ", ");
307 fprintf(fp, "{ ");
308 print_constant(c->elements[i], glsl_get_array_element(type), state);
309 fprintf(fp, " }");
310 }
311 break;
312
313 default:
314 unreachable("not reached");
315 }
316 }
317
318 static void
319 print_var_decl(nir_variable *var, print_state *state)
320 {
321 FILE *fp = state->fp;
322
323 fprintf(fp, "decl_var ");
324
325 const char *const cent = (var->data.centroid) ? "centroid " : "";
326 const char *const samp = (var->data.sample) ? "sample " : "";
327 const char *const patch = (var->data.patch) ? "patch " : "";
328 const char *const inv = (var->data.invariant) ? "invariant " : "";
329 const char *const mode[] = { "shader_in ", "shader_out ", "", "",
330 "uniform ", "shader_storage ", "shared ",
331 "system "};
332
333 fprintf(fp, "%s%s%s%s%s%s ",
334 cent, samp, patch, inv, mode[var->data.mode],
335 glsl_interp_qualifier_name(var->data.interpolation));
336
337 glsl_print_type(var->type, fp);
338
339 fprintf(fp, " %s", get_var_name(var, state));
340
341 if (var->data.mode == nir_var_shader_in ||
342 var->data.mode == nir_var_shader_out ||
343 var->data.mode == nir_var_uniform ||
344 var->data.mode == nir_var_shader_storage) {
345 const char *loc = NULL;
346 char buf[4];
347
348 switch (state->shader->stage) {
349 case MESA_SHADER_VERTEX:
350 if (var->data.mode == nir_var_shader_in)
351 loc = gl_vert_attrib_name(var->data.location);
352 else if (var->data.mode == nir_var_shader_out)
353 loc = gl_varying_slot_name(var->data.location);
354 break;
355 case MESA_SHADER_GEOMETRY:
356 if ((var->data.mode == nir_var_shader_in) ||
357 (var->data.mode == nir_var_shader_out))
358 loc = gl_varying_slot_name(var->data.location);
359 break;
360 case MESA_SHADER_FRAGMENT:
361 if (var->data.mode == nir_var_shader_in)
362 loc = gl_varying_slot_name(var->data.location);
363 else if (var->data.mode == nir_var_shader_out)
364 loc = gl_frag_result_name(var->data.location);
365 break;
366 case MESA_SHADER_TESS_CTRL:
367 case MESA_SHADER_TESS_EVAL:
368 case MESA_SHADER_COMPUTE:
369 default:
370 /* TODO */
371 break;
372 }
373
374 if (!loc) {
375 snprintf(buf, sizeof(buf), "%u", var->data.location);
376 loc = buf;
377 }
378
379 fprintf(fp, " (%s, %u)", loc, var->data.driver_location);
380 }
381
382 if (var->constant_initializer) {
383 fprintf(fp, " = { ");
384 print_constant(var->constant_initializer, var->type, state);
385 fprintf(fp, " }");
386 }
387
388 fprintf(fp, "\n");
389 }
390
391 static void
392 print_var(nir_variable *var, print_state *state)
393 {
394 FILE *fp = state->fp;
395 fprintf(fp, "%s", get_var_name(var, state));
396 }
397
398 static void
399 print_arg(nir_variable *var, print_state *state)
400 {
401 FILE *fp = state->fp;
402 glsl_print_type(var->type, fp);
403 fprintf(fp, " %s", get_var_name(var, state));
404 }
405
406 static void
407 print_deref_var(nir_deref_var *deref, print_state *state)
408 {
409 print_var(deref->var, state);
410 }
411
412 static void
413 print_deref_array(nir_deref_array *deref, print_state *state)
414 {
415 FILE *fp = state->fp;
416 fprintf(fp, "[");
417 switch (deref->deref_array_type) {
418 case nir_deref_array_type_direct:
419 fprintf(fp, "%u", deref->base_offset);
420 break;
421 case nir_deref_array_type_indirect:
422 if (deref->base_offset != 0)
423 fprintf(fp, "%u + ", deref->base_offset);
424 print_src(&deref->indirect, state);
425 break;
426 case nir_deref_array_type_wildcard:
427 fprintf(fp, "*");
428 break;
429 }
430 fprintf(fp, "]");
431 }
432
433 static void
434 print_deref_struct(nir_deref_struct *deref, const struct glsl_type *parent_type,
435 print_state *state)
436 {
437 FILE *fp = state->fp;
438 fprintf(fp, ".%s", glsl_get_struct_elem_name(parent_type, deref->index));
439 }
440
441 static void
442 print_deref(nir_deref_var *deref, print_state *state)
443 {
444 nir_deref *tail = &deref->deref;
445 nir_deref *pretail = NULL;
446 while (tail != NULL) {
447 switch (tail->deref_type) {
448 case nir_deref_type_var:
449 assert(pretail == NULL);
450 assert(tail == &deref->deref);
451 print_deref_var(deref, state);
452 break;
453
454 case nir_deref_type_array:
455 assert(pretail != NULL);
456 print_deref_array(nir_deref_as_array(tail), state);
457 break;
458
459 case nir_deref_type_struct:
460 assert(pretail != NULL);
461 print_deref_struct(nir_deref_as_struct(tail),
462 pretail->type, state);
463 break;
464
465 default:
466 unreachable("Invalid deref type");
467 }
468
469 pretail = tail;
470 tail = pretail->child;
471 }
472 }
473
474 static void
475 print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
476 {
477 const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic];
478 unsigned num_srcs = info->num_srcs;
479 FILE *fp = state->fp;
480
481 if (info->has_dest) {
482 print_dest(&instr->dest, state);
483 fprintf(fp, " = ");
484 }
485
486 fprintf(fp, "intrinsic %s (", info->name);
487
488 for (unsigned i = 0; i < num_srcs; i++) {
489 if (i != 0)
490 fprintf(fp, ", ");
491
492 print_src(&instr->src[i], state);
493 }
494
495 fprintf(fp, ") (");
496
497 for (unsigned i = 0; i < info->num_variables; i++) {
498 if (i != 0)
499 fprintf(fp, ", ");
500
501 print_deref(instr->variables[i], state);
502 }
503
504 fprintf(fp, ") (");
505
506 for (unsigned i = 0; i < info->num_indices; i++) {
507 if (i != 0)
508 fprintf(fp, ", ");
509
510 fprintf(fp, "%d", instr->const_index[i]);
511 }
512
513 fprintf(fp, ")");
514
515 static const char *index_name[NIR_INTRINSIC_NUM_INDEX_FLAGS] = {
516 [NIR_INTRINSIC_BASE] = "base",
517 [NIR_INTRINSIC_WRMASK] = "wrmask",
518 [NIR_INTRINSIC_STREAM_ID] = "stream-id",
519 [NIR_INTRINSIC_UCP_ID] = "ucp-id",
520 };
521 for (unsigned idx = 1; idx < NIR_INTRINSIC_NUM_INDEX_FLAGS; idx++) {
522 if (!info->index_map[idx])
523 continue;
524 fprintf(fp, " /*");
525 if (idx == NIR_INTRINSIC_WRMASK) {
526 /* special case wrmask to show it as a writemask.. */
527 unsigned wrmask = nir_intrinsic_write_mask(instr);
528 fprintf(fp, " wrmask=");
529 for (unsigned i = 0; i < 4; i++)
530 if ((wrmask >> i) & 1)
531 fprintf(fp, "%c", "xyzw"[i]);
532 } else {
533 unsigned off = info->index_map[idx] - 1;
534 assert(index_name[idx]); /* forgot to update index_name table? */
535 fprintf(fp, " %s=%d", index_name[idx], instr->const_index[off]);
536 }
537 fprintf(fp, " */");
538 }
539
540 if (!state->shader)
541 return;
542
543 struct exec_list *var_list = NULL;
544
545 switch (instr->intrinsic) {
546 case nir_intrinsic_load_uniform:
547 var_list = &state->shader->uniforms;
548 break;
549 case nir_intrinsic_load_input:
550 case nir_intrinsic_load_per_vertex_input:
551 var_list = &state->shader->inputs;
552 break;
553 case nir_intrinsic_load_output:
554 case nir_intrinsic_store_output:
555 case nir_intrinsic_store_per_vertex_output:
556 var_list = &state->shader->outputs;
557 break;
558 default:
559 return;
560 }
561
562 nir_foreach_variable(var, var_list) {
563 if ((var->data.driver_location == nir_intrinsic_base(instr)) &&
564 var->name) {
565 fprintf(fp, "\t/* %s */", var->name);
566 break;
567 }
568 }
569 }
570
571 static void
572 print_tex_instr(nir_tex_instr *instr, print_state *state)
573 {
574 FILE *fp = state->fp;
575
576 print_dest(&instr->dest, state);
577
578 fprintf(fp, " = ");
579
580 switch (instr->op) {
581 case nir_texop_tex:
582 fprintf(fp, "tex ");
583 break;
584 case nir_texop_txb:
585 fprintf(fp, "txb ");
586 break;
587 case nir_texop_txl:
588 fprintf(fp, "txl ");
589 break;
590 case nir_texop_txd:
591 fprintf(fp, "txd ");
592 break;
593 case nir_texop_txf:
594 fprintf(fp, "txf ");
595 break;
596 case nir_texop_txf_ms:
597 fprintf(fp, "txf_ms ");
598 break;
599 case nir_texop_txs:
600 fprintf(fp, "txs ");
601 break;
602 case nir_texop_lod:
603 fprintf(fp, "lod ");
604 break;
605 case nir_texop_tg4:
606 fprintf(fp, "tg4 ");
607 break;
608 case nir_texop_query_levels:
609 fprintf(fp, "query_levels ");
610 break;
611 case nir_texop_texture_samples:
612 fprintf(fp, "texture_samples ");
613 break;
614 case nir_texop_samples_identical:
615 fprintf(fp, "samples_identical ");
616 break;
617 default:
618 unreachable("Invalid texture operation");
619 break;
620 }
621
622 for (unsigned i = 0; i < instr->num_srcs; i++) {
623 print_src(&instr->src[i].src, state);
624
625 fprintf(fp, " ");
626
627 switch(instr->src[i].src_type) {
628 case nir_tex_src_coord:
629 fprintf(fp, "(coord)");
630 break;
631 case nir_tex_src_projector:
632 fprintf(fp, "(projector)");
633 break;
634 case nir_tex_src_comparitor:
635 fprintf(fp, "(comparitor)");
636 break;
637 case nir_tex_src_offset:
638 fprintf(fp, "(offset)");
639 break;
640 case nir_tex_src_bias:
641 fprintf(fp, "(bias)");
642 break;
643 case nir_tex_src_lod:
644 fprintf(fp, "(lod)");
645 break;
646 case nir_tex_src_ms_index:
647 fprintf(fp, "(ms_index)");
648 break;
649 case nir_tex_src_ddx:
650 fprintf(fp, "(ddx)");
651 break;
652 case nir_tex_src_ddy:
653 fprintf(fp, "(ddy)");
654 break;
655 case nir_tex_src_texture_offset:
656 fprintf(fp, "(texture_offset)");
657 break;
658 case nir_tex_src_sampler_offset:
659 fprintf(fp, "(sampler_offset)");
660 break;
661
662 default:
663 unreachable("Invalid texture source type");
664 break;
665 }
666
667 fprintf(fp, ", ");
668 }
669
670 if (instr->op == nir_texop_tg4) {
671 fprintf(fp, "%u (gather_component), ", instr->component);
672 }
673
674 if (instr->texture) {
675 print_deref(instr->texture, state);
676 fprintf(fp, " (texture)");
677 if (instr->sampler) {
678 print_deref(instr->sampler, state);
679 fprintf(fp, " (sampler)");
680 }
681 } else {
682 assert(instr->sampler == NULL);
683 fprintf(fp, "%u (texture) %u (sampler)",
684 instr->texture_index, instr->sampler_index);
685 }
686 }
687
688 static void
689 print_call_instr(nir_call_instr *instr, print_state *state)
690 {
691 FILE *fp = state->fp;
692
693 fprintf(fp, "call %s ", instr->callee->name);
694
695 for (unsigned i = 0; i < instr->num_params; i++) {
696 if (i != 0)
697 fprintf(fp, ", ");
698
699 print_deref(instr->params[i], state);
700 }
701
702 if (instr->return_deref != NULL) {
703 if (instr->num_params != 0)
704 fprintf(fp, ", ");
705 fprintf(fp, "returning ");
706 print_deref(instr->return_deref, state);
707 }
708 }
709
710 static void
711 print_load_const_instr(nir_load_const_instr *instr, print_state *state)
712 {
713 FILE *fp = state->fp;
714
715 print_ssa_def(&instr->def, state);
716
717 fprintf(fp, " = load_const (");
718
719 for (unsigned i = 0; i < instr->def.num_components; i++) {
720 if (i != 0)
721 fprintf(fp, ", ");
722
723 /*
724 * we don't really know the type of the constant (if it will be used as a
725 * float or an int), so just print the raw constant in hex for fidelity
726 * and then print the float in a comment for readability.
727 */
728
729 if (instr->def.bit_size == 64)
730 fprintf(fp, "0x%16" PRIx64 " /* %f */", instr->value.u64[i],
731 instr->value.f64[i]);
732 else
733 fprintf(fp, "0x%08x /* %f */", instr->value.u32[i], instr->value.f32[i]);
734 }
735
736 fprintf(fp, ")");
737 }
738
739 static void
740 print_jump_instr(nir_jump_instr *instr, print_state *state)
741 {
742 FILE *fp = state->fp;
743
744 switch (instr->type) {
745 case nir_jump_break:
746 fprintf(fp, "break");
747 break;
748
749 case nir_jump_continue:
750 fprintf(fp, "continue");
751 break;
752
753 case nir_jump_return:
754 fprintf(fp, "return");
755 break;
756 }
757 }
758
759 static void
760 print_ssa_undef_instr(nir_ssa_undef_instr* instr, print_state *state)
761 {
762 FILE *fp = state->fp;
763 print_ssa_def(&instr->def, state);
764 fprintf(fp, " = undefined");
765 }
766
767 static void
768 print_phi_instr(nir_phi_instr *instr, print_state *state)
769 {
770 FILE *fp = state->fp;
771 print_dest(&instr->dest, state);
772 fprintf(fp, " = phi ");
773 nir_foreach_phi_src(instr, src) {
774 if (&src->node != exec_list_get_head(&instr->srcs))
775 fprintf(fp, ", ");
776
777 fprintf(fp, "block_%u: ", src->pred->index);
778 print_src(&src->src, state);
779 }
780 }
781
782 static void
783 print_parallel_copy_instr(nir_parallel_copy_instr *instr, print_state *state)
784 {
785 FILE *fp = state->fp;
786 nir_foreach_parallel_copy_entry(instr, entry) {
787 if (&entry->node != exec_list_get_head(&instr->entries))
788 fprintf(fp, "; ");
789
790 print_dest(&entry->dest, state);
791 fprintf(fp, " = ");
792 print_src(&entry->src, state);
793 }
794 }
795
796 static void
797 print_instr(const nir_instr *instr, print_state *state, unsigned tabs)
798 {
799 FILE *fp = state->fp;
800 print_tabs(tabs, fp);
801
802 switch (instr->type) {
803 case nir_instr_type_alu:
804 print_alu_instr(nir_instr_as_alu(instr), state);
805 break;
806
807 case nir_instr_type_call:
808 print_call_instr(nir_instr_as_call(instr), state);
809 break;
810
811 case nir_instr_type_intrinsic:
812 print_intrinsic_instr(nir_instr_as_intrinsic(instr), state);
813 break;
814
815 case nir_instr_type_tex:
816 print_tex_instr(nir_instr_as_tex(instr), state);
817 break;
818
819 case nir_instr_type_load_const:
820 print_load_const_instr(nir_instr_as_load_const(instr), state);
821 break;
822
823 case nir_instr_type_jump:
824 print_jump_instr(nir_instr_as_jump(instr), state);
825 break;
826
827 case nir_instr_type_ssa_undef:
828 print_ssa_undef_instr(nir_instr_as_ssa_undef(instr), state);
829 break;
830
831 case nir_instr_type_phi:
832 print_phi_instr(nir_instr_as_phi(instr), state);
833 break;
834
835 case nir_instr_type_parallel_copy:
836 print_parallel_copy_instr(nir_instr_as_parallel_copy(instr), state);
837 break;
838
839 default:
840 unreachable("Invalid instruction type");
841 break;
842 }
843 }
844
845 static int
846 compare_block_index(const void *p1, const void *p2)
847 {
848 const nir_block *block1 = *((const nir_block **) p1);
849 const nir_block *block2 = *((const nir_block **) p2);
850
851 return (int) block1->index - (int) block2->index;
852 }
853
854 static void print_cf_node(nir_cf_node *node, print_state *state,
855 unsigned tabs);
856
857 static void
858 print_block(nir_block *block, print_state *state, unsigned tabs)
859 {
860 FILE *fp = state->fp;
861
862 print_tabs(tabs, fp);
863 fprintf(fp, "block block_%u:\n", block->index);
864
865 /* sort the predecessors by index so we consistently print the same thing */
866
867 nir_block **preds =
868 malloc(block->predecessors->entries * sizeof(nir_block *));
869
870 struct set_entry *entry;
871 unsigned i = 0;
872 set_foreach(block->predecessors, entry) {
873 preds[i++] = (nir_block *) entry->key;
874 }
875
876 qsort(preds, block->predecessors->entries, sizeof(nir_block *),
877 compare_block_index);
878
879 print_tabs(tabs, fp);
880 fprintf(fp, "/* preds: ");
881 for (unsigned i = 0; i < block->predecessors->entries; i++) {
882 fprintf(fp, "block_%u ", preds[i]->index);
883 }
884 fprintf(fp, "*/\n");
885
886 free(preds);
887
888 nir_foreach_instr(block, instr) {
889 print_instr(instr, state, tabs);
890 fprintf(fp, "\n");
891 }
892
893 print_tabs(tabs, fp);
894 fprintf(fp, "/* succs: ");
895 for (unsigned i = 0; i < 2; i++)
896 if (block->successors[i]) {
897 fprintf(fp, "block_%u ", block->successors[i]->index);
898 }
899 fprintf(fp, "*/\n");
900 }
901
902 static void
903 print_if(nir_if *if_stmt, print_state *state, unsigned tabs)
904 {
905 FILE *fp = state->fp;
906
907 print_tabs(tabs, fp);
908 fprintf(fp, "if ");
909 print_src(&if_stmt->condition, state);
910 fprintf(fp, " {\n");
911 foreach_list_typed(nir_cf_node, node, node, &if_stmt->then_list) {
912 print_cf_node(node, state, tabs + 1);
913 }
914 print_tabs(tabs, fp);
915 fprintf(fp, "} else {\n");
916 foreach_list_typed(nir_cf_node, node, node, &if_stmt->else_list) {
917 print_cf_node(node, state, tabs + 1);
918 }
919 print_tabs(tabs, fp);
920 fprintf(fp, "}\n");
921 }
922
923 static void
924 print_loop(nir_loop *loop, print_state *state, unsigned tabs)
925 {
926 FILE *fp = state->fp;
927
928 print_tabs(tabs, fp);
929 fprintf(fp, "loop {\n");
930 foreach_list_typed(nir_cf_node, node, node, &loop->body) {
931 print_cf_node(node, state, tabs + 1);
932 }
933 print_tabs(tabs, fp);
934 fprintf(fp, "}\n");
935 }
936
937 static void
938 print_cf_node(nir_cf_node *node, print_state *state, unsigned int tabs)
939 {
940 switch (node->type) {
941 case nir_cf_node_block:
942 print_block(nir_cf_node_as_block(node), state, tabs);
943 break;
944
945 case nir_cf_node_if:
946 print_if(nir_cf_node_as_if(node), state, tabs);
947 break;
948
949 case nir_cf_node_loop:
950 print_loop(nir_cf_node_as_loop(node), state, tabs);
951 break;
952
953 default:
954 unreachable("Invalid CFG node type");
955 }
956 }
957
958 static void
959 print_function_impl(nir_function_impl *impl, print_state *state)
960 {
961 FILE *fp = state->fp;
962
963 fprintf(fp, "\nimpl %s ", impl->function->name);
964
965 for (unsigned i = 0; i < impl->num_params; i++) {
966 if (i != 0)
967 fprintf(fp, ", ");
968
969 print_arg(impl->params[i], state);
970 }
971
972 if (impl->return_var != NULL) {
973 if (impl->num_params != 0)
974 fprintf(fp, ", ");
975 fprintf(fp, "returning ");
976 print_arg(impl->return_var, state);
977 }
978
979 fprintf(fp, "{\n");
980
981 nir_foreach_variable(var, &impl->locals) {
982 fprintf(fp, "\t");
983 print_var_decl(var, state);
984 }
985
986 foreach_list_typed(nir_register, reg, node, &impl->registers) {
987 fprintf(fp, "\t");
988 print_register_decl(reg, state);
989 }
990
991 nir_index_blocks(impl);
992
993 foreach_list_typed(nir_cf_node, node, node, &impl->body) {
994 print_cf_node(node, state, 1);
995 }
996
997 fprintf(fp, "\tblock block_%u:\n}\n\n", impl->end_block->index);
998 }
999
1000 static void
1001 print_function(nir_function *function, print_state *state)
1002 {
1003 FILE *fp = state->fp;
1004
1005 fprintf(fp, "decl_function %s ", function->name);
1006
1007 for (unsigned i = 0; i < function->num_params; i++) {
1008 if (i != 0)
1009 fprintf(fp, ", ");
1010
1011 switch (function->params[i].param_type) {
1012 case nir_parameter_in:
1013 fprintf(fp, "in ");
1014 break;
1015 case nir_parameter_out:
1016 fprintf(fp, "out ");
1017 break;
1018 case nir_parameter_inout:
1019 fprintf(fp, "inout ");
1020 break;
1021 default:
1022 unreachable("Invalid parameter type");
1023 }
1024
1025 glsl_print_type(function->params[i].type, fp);
1026 }
1027
1028 if (function->return_type != NULL) {
1029 if (function->num_params != 0)
1030 fprintf(fp, ", ");
1031 fprintf(fp, "returning ");
1032 glsl_print_type(function->return_type, fp);
1033 }
1034
1035 fprintf(fp, "\n");
1036
1037 if (function->impl != NULL) {
1038 print_function_impl(function->impl, state);
1039 return;
1040 }
1041 }
1042
1043 static void
1044 init_print_state(print_state *state, nir_shader *shader, FILE *fp)
1045 {
1046 state->fp = fp;
1047 state->shader = shader;
1048 state->ht = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
1049 _mesa_key_pointer_equal);
1050 state->syms = _mesa_set_create(NULL, _mesa_key_hash_string,
1051 _mesa_key_string_equal);
1052 state->index = 0;
1053 }
1054
1055 static void
1056 destroy_print_state(print_state *state)
1057 {
1058 _mesa_hash_table_destroy(state->ht, NULL);
1059 _mesa_set_destroy(state->syms, NULL);
1060 }
1061
1062 void
1063 nir_print_shader(nir_shader *shader, FILE *fp)
1064 {
1065 print_state state;
1066 init_print_state(&state, shader, fp);
1067
1068 fprintf(fp, "shader: %s\n", gl_shader_stage_name(shader->stage));
1069
1070 if (shader->info.name)
1071 fprintf(fp, "name: %s\n", shader->info.name);
1072
1073 if (shader->info.label)
1074 fprintf(fp, "label: %s\n", shader->info.label);
1075
1076 fprintf(fp, "inputs: %u\n", shader->num_inputs);
1077 fprintf(fp, "outputs: %u\n", shader->num_outputs);
1078 fprintf(fp, "uniforms: %u\n", shader->num_uniforms);
1079 fprintf(fp, "shared: %u\n", shader->num_shared);
1080
1081 nir_foreach_variable(var, &shader->uniforms) {
1082 print_var_decl(var, &state);
1083 }
1084
1085 nir_foreach_variable(var, &shader->inputs) {
1086 print_var_decl(var, &state);
1087 }
1088
1089 nir_foreach_variable(var, &shader->outputs) {
1090 print_var_decl(var, &state);
1091 }
1092
1093 nir_foreach_variable(var, &shader->shared) {
1094 print_var_decl(var, &state);
1095 }
1096
1097 nir_foreach_variable(var, &shader->globals) {
1098 print_var_decl(var, &state);
1099 }
1100
1101 nir_foreach_variable(var, &shader->system_values) {
1102 print_var_decl(var, &state);
1103 }
1104
1105 foreach_list_typed(nir_register, reg, node, &shader->registers) {
1106 print_register_decl(reg, &state);
1107 }
1108
1109 foreach_list_typed(nir_function, func, node, &shader->functions) {
1110 print_function(func, &state);
1111 }
1112
1113 destroy_print_state(&state);
1114 }
1115
1116 void
1117 nir_print_instr(const nir_instr *instr, FILE *fp)
1118 {
1119 print_state state = {
1120 .fp = fp,
1121 };
1122 print_instr(instr, &state, 0);
1123
1124 }