Merge remote branch 'origin/master' into nv50-compiler
[mesa.git] / src / glsl / ir_hierarchical_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
24 #include "ir.h"
25 #include "ir_hierarchical_visitor.h"
26
27 ir_hierarchical_visitor::ir_hierarchical_visitor()
28 {
29 this->base_ir = NULL;
30 this->callback = NULL;
31 this->data = NULL;
32 }
33
34 ir_visitor_status
35 ir_hierarchical_visitor::visit(ir_variable *ir)
36 {
37 if (this->callback != NULL)
38 this->callback(ir, this->data);
39
40 return visit_continue;
41 }
42
43 ir_visitor_status
44 ir_hierarchical_visitor::visit(ir_constant *ir)
45 {
46 if (this->callback != NULL)
47 this->callback(ir, this->data);
48
49 return visit_continue;
50 }
51
52 ir_visitor_status
53 ir_hierarchical_visitor::visit(ir_loop_jump *ir)
54 {
55 if (this->callback != NULL)
56 this->callback(ir, this->data);
57
58 return visit_continue;
59 }
60
61 ir_visitor_status
62 ir_hierarchical_visitor::visit(ir_dereference_variable *ir)
63 {
64 if (this->callback != NULL)
65 this->callback(ir, this->data);
66
67 return visit_continue;
68 }
69
70 ir_visitor_status
71 ir_hierarchical_visitor::visit_enter(ir_loop *ir)
72 {
73 if (this->callback != NULL)
74 this->callback(ir, this->data);
75
76 return visit_continue;
77 }
78
79 ir_visitor_status
80 ir_hierarchical_visitor::visit_leave(ir_loop *ir)
81 {
82 (void) ir;
83 return visit_continue;
84 }
85
86 ir_visitor_status
87 ir_hierarchical_visitor::visit_enter(ir_function_signature *ir)
88 {
89 if (this->callback != NULL)
90 this->callback(ir, this->data);
91
92 return visit_continue;
93 }
94
95 ir_visitor_status
96 ir_hierarchical_visitor::visit_leave(ir_function_signature *ir)
97 {
98 (void) ir;
99 return visit_continue;
100 }
101
102 ir_visitor_status
103 ir_hierarchical_visitor::visit_enter(ir_function *ir)
104 {
105 if (this->callback != NULL)
106 this->callback(ir, this->data);
107
108 return visit_continue;
109 }
110
111 ir_visitor_status
112 ir_hierarchical_visitor::visit_leave(ir_function *ir)
113 {
114 (void) ir;
115 return visit_continue;
116 }
117
118 ir_visitor_status
119 ir_hierarchical_visitor::visit_enter(ir_expression *ir)
120 {
121 if (this->callback != NULL)
122 this->callback(ir, this->data);
123
124 return visit_continue;
125 }
126
127 ir_visitor_status
128 ir_hierarchical_visitor::visit_leave(ir_expression *ir)
129 {
130 (void) ir;
131 return visit_continue;
132 }
133
134 ir_visitor_status
135 ir_hierarchical_visitor::visit_enter(ir_texture *ir)
136 {
137 if (this->callback != NULL)
138 this->callback(ir, this->data);
139
140 return visit_continue;
141 }
142
143 ir_visitor_status
144 ir_hierarchical_visitor::visit_leave(ir_texture *ir)
145 {
146 (void) ir;
147 return visit_continue;
148 }
149
150 ir_visitor_status
151 ir_hierarchical_visitor::visit_enter(ir_swizzle *ir)
152 {
153 if (this->callback != NULL)
154 this->callback(ir, this->data);
155
156 return visit_continue;
157 }
158
159 ir_visitor_status
160 ir_hierarchical_visitor::visit_leave(ir_swizzle *ir)
161 {
162 (void) ir;
163 return visit_continue;
164 }
165
166 ir_visitor_status
167 ir_hierarchical_visitor::visit_enter(ir_dereference_array *ir)
168 {
169 if (this->callback != NULL)
170 this->callback(ir, this->data);
171
172 return visit_continue;
173 }
174
175 ir_visitor_status
176 ir_hierarchical_visitor::visit_leave(ir_dereference_array *ir)
177 {
178 (void) ir;
179 return visit_continue;
180 }
181
182 ir_visitor_status
183 ir_hierarchical_visitor::visit_enter(ir_dereference_record *ir)
184 {
185 if (this->callback != NULL)
186 this->callback(ir, this->data);
187
188 return visit_continue;
189 }
190
191 ir_visitor_status
192 ir_hierarchical_visitor::visit_leave(ir_dereference_record *ir)
193 {
194 (void) ir;
195 return visit_continue;
196 }
197
198 ir_visitor_status
199 ir_hierarchical_visitor::visit_enter(ir_assignment *ir)
200 {
201 if (this->callback != NULL)
202 this->callback(ir, this->data);
203
204 return visit_continue;
205 }
206
207 ir_visitor_status
208 ir_hierarchical_visitor::visit_leave(ir_assignment *ir)
209 {
210 (void) ir;
211 return visit_continue;
212 }
213
214 ir_visitor_status
215 ir_hierarchical_visitor::visit_enter(ir_call *ir)
216 {
217 if (this->callback != NULL)
218 this->callback(ir, this->data);
219
220 return visit_continue;
221 }
222
223 ir_visitor_status
224 ir_hierarchical_visitor::visit_leave(ir_call *ir)
225 {
226 (void) ir;
227 return visit_continue;
228 }
229
230 ir_visitor_status
231 ir_hierarchical_visitor::visit_enter(ir_return *ir)
232 {
233 if (this->callback != NULL)
234 this->callback(ir, this->data);
235
236 return visit_continue;
237 }
238
239 ir_visitor_status
240 ir_hierarchical_visitor::visit_leave(ir_return *ir)
241 {
242 (void) ir;
243 return visit_continue;
244 }
245
246 ir_visitor_status
247 ir_hierarchical_visitor::visit_enter(ir_discard *ir)
248 {
249 if (this->callback != NULL)
250 this->callback(ir, this->data);
251
252 return visit_continue;
253 }
254
255 ir_visitor_status
256 ir_hierarchical_visitor::visit_leave(ir_discard *ir)
257 {
258 (void) ir;
259 return visit_continue;
260 }
261
262 ir_visitor_status
263 ir_hierarchical_visitor::visit_enter(ir_if *ir)
264 {
265 if (this->callback != NULL)
266 this->callback(ir, this->data);
267
268 return visit_continue;
269 }
270
271 ir_visitor_status
272 ir_hierarchical_visitor::visit_leave(ir_if *ir)
273 {
274 (void) ir;
275 return visit_continue;
276 }
277
278 void
279 ir_hierarchical_visitor::run(exec_list *instructions)
280 {
281 visit_list_elements(this, instructions);
282 }
283
284
285 void
286 visit_tree(ir_instruction *ir,
287 void (*callback)(class ir_instruction *ir, void *data),
288 void *data)
289 {
290 ir_hierarchical_visitor v;
291
292 v.callback = callback;
293 v.data = data;
294
295 ir->accept(&v);
296 }