2
* Copyright © 2010 Intel Corporation
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:
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
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.
25
* \file ir_rvalue_visitor.cpp
27
* Generic class to implement the common pattern we have of wanting to
28
* visit each ir_rvalue * and possibly change that node to a different
33
#include "ir_visitor.h"
34
#include "ir_rvalue_visitor.h"
35
#include "compiler/glsl_types.h"
38
ir_rvalue_base_visitor::rvalue_visit(ir_expression *ir)
42
for (operand = 0; operand < ir->num_operands; operand++) {
43
handle_rvalue(&ir->operands[operand]);
46
return visit_continue;
50
ir_rvalue_base_visitor::rvalue_visit(ir_texture *ir)
52
handle_rvalue(&ir->coordinate);
53
handle_rvalue(&ir->projector);
54
handle_rvalue(&ir->shadow_comparator);
55
handle_rvalue(&ir->offset);
56
handle_rvalue(&ir->clamp);
62
case ir_texture_samples:
63
case ir_samples_identical:
66
handle_rvalue(&ir->lod_info.bias);
71
handle_rvalue(&ir->lod_info.lod);
74
handle_rvalue(&ir->lod_info.sample_index);
77
handle_rvalue(&ir->lod_info.grad.dPdx);
78
handle_rvalue(&ir->lod_info.grad.dPdy);
81
handle_rvalue(&ir->lod_info.component);
85
return visit_continue;
89
ir_rvalue_base_visitor::rvalue_visit(ir_swizzle *ir)
91
handle_rvalue(&ir->val);
92
return visit_continue;
96
ir_rvalue_base_visitor::rvalue_visit(ir_dereference_array *ir)
98
/* The array index is not the target of the assignment, so clear the
99
* 'in_assignee' flag. Restore it after returning from the array index.
101
const bool was_in_assignee = this->in_assignee;
102
this->in_assignee = false;
103
handle_rvalue(&ir->array_index);
104
this->in_assignee = was_in_assignee;
106
handle_rvalue(&ir->array);
107
return visit_continue;
111
ir_rvalue_base_visitor::rvalue_visit(ir_dereference_record *ir)
113
handle_rvalue(&ir->record);
114
return visit_continue;
118
ir_rvalue_base_visitor::rvalue_visit(ir_assignment *ir)
120
handle_rvalue(&ir->rhs);
121
return visit_continue;
125
ir_rvalue_base_visitor::rvalue_visit(ir_call *ir)
127
foreach_in_list_safe(ir_rvalue, param, &ir->actual_parameters) {
128
ir_rvalue *new_param = param;
129
handle_rvalue(&new_param);
131
if (new_param != param) {
132
param->replace_with(new_param);
135
return visit_continue;
139
ir_rvalue_base_visitor::rvalue_visit(ir_discard *ir)
141
handle_rvalue(&ir->condition);
142
return visit_continue;
146
ir_rvalue_base_visitor::rvalue_visit(ir_return *ir)
148
handle_rvalue(&ir->value);
149
return visit_continue;
153
ir_rvalue_base_visitor::rvalue_visit(ir_if *ir)
155
handle_rvalue(&ir->condition);
156
return visit_continue;
160
ir_rvalue_base_visitor::rvalue_visit(ir_emit_vertex *ir)
162
handle_rvalue(&ir->stream);
163
return visit_continue;
167
ir_rvalue_base_visitor::rvalue_visit(ir_end_primitive *ir)
169
handle_rvalue(&ir->stream);
170
return visit_continue;
174
ir_rvalue_visitor::visit_leave(ir_expression *ir)
176
return rvalue_visit(ir);
180
ir_rvalue_visitor::visit_leave(ir_texture *ir)
182
return rvalue_visit(ir);
186
ir_rvalue_visitor::visit_leave(ir_swizzle *ir)
188
return rvalue_visit(ir);
192
ir_rvalue_visitor::visit_leave(ir_dereference_array *ir)
194
return rvalue_visit(ir);
198
ir_rvalue_visitor::visit_leave(ir_dereference_record *ir)
200
return rvalue_visit(ir);
204
ir_rvalue_visitor::visit_leave(ir_assignment *ir)
206
return rvalue_visit(ir);
210
ir_rvalue_visitor::visit_leave(ir_call *ir)
212
return rvalue_visit(ir);
216
ir_rvalue_visitor::visit_leave(ir_discard *ir)
218
return rvalue_visit(ir);
222
ir_rvalue_visitor::visit_leave(ir_return *ir)
224
return rvalue_visit(ir);
228
ir_rvalue_visitor::visit_leave(ir_if *ir)
230
return rvalue_visit(ir);
234
ir_rvalue_visitor::visit_leave(ir_emit_vertex *ir)
236
return rvalue_visit(ir);
240
ir_rvalue_visitor::visit_leave(ir_end_primitive *ir)
242
return rvalue_visit(ir);
246
ir_rvalue_enter_visitor::visit_enter(ir_expression *ir)
248
return rvalue_visit(ir);
252
ir_rvalue_enter_visitor::visit_enter(ir_texture *ir)
254
return rvalue_visit(ir);
258
ir_rvalue_enter_visitor::visit_enter(ir_swizzle *ir)
260
return rvalue_visit(ir);
264
ir_rvalue_enter_visitor::visit_enter(ir_dereference_array *ir)
266
return rvalue_visit(ir);
270
ir_rvalue_enter_visitor::visit_enter(ir_dereference_record *ir)
272
return rvalue_visit(ir);
276
ir_rvalue_enter_visitor::visit_enter(ir_assignment *ir)
278
return rvalue_visit(ir);
282
ir_rvalue_enter_visitor::visit_enter(ir_call *ir)
284
return rvalue_visit(ir);
288
ir_rvalue_enter_visitor::visit_enter(ir_discard *ir)
290
return rvalue_visit(ir);
294
ir_rvalue_enter_visitor::visit_enter(ir_return *ir)
296
return rvalue_visit(ir);
300
ir_rvalue_enter_visitor::visit_enter(ir_if *ir)
302
return rvalue_visit(ir);
306
ir_rvalue_enter_visitor::visit_enter(ir_emit_vertex *ir)
308
return rvalue_visit(ir);
312
ir_rvalue_enter_visitor::visit_enter(ir_end_primitive *ir)
314
return rvalue_visit(ir);