ca9f75925200c0d01d5416326d3d0843481ec0ec
[mesa.git] / ir_print_visitor.cpp
1 /*
2 * Copyright © 2010 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
21 * DEALINGS IN THE SOFTWARE.
22 */
23 #include <cstdio>
24 #include "ir_print_visitor.h"
25 #include "glsl_types.h"
26
27 static void
28 print_type(const glsl_type *t)
29 {
30 if (t->base_type == GLSL_TYPE_ARRAY) {
31 printf("array (");
32 print_type(t->fields.array);
33 printf(") (%u))", t->length);
34 } else if (t->base_type == GLSL_TYPE_STRUCT) {
35 printf("struct (%s %u ", t->name ? t->name : "@", t->length);
36 printf("(FINISHME: structure fields go here) ");
37 printf(")");
38 } else {
39 printf("%s", t->name);
40 }
41 }
42
43
44 void ir_print_visitor::visit(ir_variable *ir)
45 {
46 if (deref_depth) {
47 printf("(%s)", ir->name);
48 } else {
49 printf("(declare ");
50
51 const char *const cent = (ir->centroid) ? "centroid " : "";
52 const char *const inv = (ir->invariant) ? "invariant " : "";
53 const char *const mode[] = { "", "uniform ", "in ", "out ", "inout " };
54 const char *const interp[] = { "", "flat", "noperspective" };
55
56 printf("(%s%s%s%s) ",
57 cent, inv, mode[ir->mode], interp[ir->interpolation]);
58
59 printf("(");
60 print_type(ir->type);
61 printf(") ");
62 printf("(%s)) ", ir->name);
63 }
64 }
65
66
67 void ir_print_visitor::visit(ir_label *ir)
68 {
69 printf("\n(label %s)", ir->label);
70 }
71
72
73 void ir_print_visitor::visit(ir_function_signature *ir)
74 {
75 printf("%s:%d:\n", __func__, __LINE__);
76 (void) ir;
77 }
78
79
80 void ir_print_visitor::visit(ir_function *ir)
81 {
82 printf("(function %s\n", ir->name);
83 printf(")\n");
84 }
85
86
87 void ir_print_visitor::visit(ir_expression *ir)
88 {
89 printf("(expression ");
90
91 printf("(FINISHME: operator) ");
92
93 printf("(");
94 if (ir->operands[0])
95 ir->operands[0]->accept(this);
96 printf(") ");
97
98 printf("(");
99 if (ir->operands[1])
100 ir->operands[1]->accept(this);
101 printf(")) ");
102 }
103
104
105 void ir_print_visitor::visit(ir_dereference *ir)
106 {
107 deref_depth++;
108
109 switch (ir->mode) {
110 case ir_dereference::ir_reference_variable: {
111 const unsigned swiz[4] = {
112 ir->selector.swizzle.x,
113 ir->selector.swizzle.y,
114 ir->selector.swizzle.z,
115 ir->selector.swizzle.w,
116 };
117
118 printf("(var_ref ");
119 ir->var->accept(this);
120 printf("(");
121 for (unsigned i = 0; i < ir->selector.swizzle.num_components; i++) {
122 printf("%c", "xyzw"[swiz[i]]);
123 }
124 printf(")) ");
125 break;
126 }
127 case ir_dereference::ir_reference_array:
128 printf("(array_ref ");
129 ir->var->accept(this);
130 ir->selector.array_index->accept(this);
131 printf(") ");
132 break;
133 case ir_dereference::ir_reference_record:
134 printf("(record_ref ");
135 ir->var->accept(this);
136 printf("(%s)) ", ir->selector.field);
137 break;
138 }
139
140 deref_depth--;
141 }
142
143
144 void ir_print_visitor::visit(ir_assignment *ir)
145 {
146 printf("(assign (");
147
148 if (ir->condition)
149 ir->condition->accept(this);
150 else
151 printf("true");
152
153 printf(") (");
154
155 ir->lhs->accept(this);
156
157 printf(") (");
158
159 ir->rhs->accept(this);
160 printf(") ");
161 }
162
163
164 void ir_print_visitor::visit(ir_constant *ir)
165 {
166 const glsl_type *const base_type = ir->type->get_base_type();
167
168 printf("(constant (");
169 print_type(base_type);
170 printf(") ");
171
172 const unsigned num_values = 1
173 * ((ir->type->vector_elements > 0) ? ir->type->vector_elements : 1)
174 * ((ir->type->matrix_columns > 0) ? ir->type->matrix_columns : 1);
175
176 printf("(%d) (", num_values);
177 for (unsigned i = 0; i < num_values; i++) {
178 if (i != 0)
179 printf(", ");
180
181 switch (base_type->base_type) {
182 case GLSL_TYPE_UINT: printf("%u", ir->value.u[i]); break;
183 case GLSL_TYPE_INT: printf("%d", ir->value.i[i]); break;
184 case GLSL_TYPE_FLOAT: printf("%f", ir->value.f[i]); break;
185 case GLSL_TYPE_BOOL: printf("%d", ir->value.b[i]); break;
186 default: assert(0);
187 }
188 }
189 printf(")) ");
190 }
191
192
193 void
194 ir_print_visitor::visit(ir_call *ir)
195 {
196 (void) ir;
197
198 printf("(call FINISHME: function name here\n");
199 printf(" (FINISHME: function paramaters here))\n");
200 }
201
202
203 void
204 ir_print_visitor::visit(ir_return *ir)
205 {
206 printf("(return");
207
208 ir_expression *const value = ir->get_value();
209 if (value) {
210 printf(" ");
211 value->accept(this);
212 }
213
214 printf(")");
215 }