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