glsl: add texture gather changes
[mesa.git] / src / glsl / ir_rvalue_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 /**
25 * \file ir_rvalue_visitor.cpp
26 *
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
29 * class.
30 */
31
32 #include "ir.h"
33 #include "ir_visitor.h"
34 #include "ir_rvalue_visitor.h"
35 #include "glsl_types.h"
36
37 ir_visitor_status
38 ir_rvalue_base_visitor::rvalue_visit(ir_expression *ir)
39 {
40 unsigned int operand;
41
42 for (operand = 0; operand < ir->get_num_operands(); operand++) {
43 handle_rvalue(&ir->operands[operand]);
44 }
45
46 return visit_continue;
47 }
48
49 ir_visitor_status
50 ir_rvalue_base_visitor::rvalue_visit(ir_texture *ir)
51 {
52 handle_rvalue(&ir->coordinate);
53 handle_rvalue(&ir->projector);
54 handle_rvalue(&ir->shadow_comparitor);
55 handle_rvalue(&ir->offset);
56
57 switch (ir->op) {
58 case ir_tex:
59 case ir_lod:
60 case ir_tg4:
61 break;
62 case ir_txb:
63 handle_rvalue(&ir->lod_info.bias);
64 break;
65 case ir_txf:
66 case ir_txl:
67 case ir_txs:
68 handle_rvalue(&ir->lod_info.lod);
69 break;
70 case ir_txf_ms:
71 handle_rvalue(&ir->lod_info.sample_index);
72 break;
73 case ir_txd:
74 handle_rvalue(&ir->lod_info.grad.dPdx);
75 handle_rvalue(&ir->lod_info.grad.dPdy);
76 break;
77 }
78
79 return visit_continue;
80 }
81
82 ir_visitor_status
83 ir_rvalue_base_visitor::rvalue_visit(ir_swizzle *ir)
84 {
85 handle_rvalue(&ir->val);
86 return visit_continue;
87 }
88
89 ir_visitor_status
90 ir_rvalue_base_visitor::rvalue_visit(ir_dereference_array *ir)
91 {
92 /* The array index is not the target of the assignment, so clear the
93 * 'in_assignee' flag. Restore it after returning from the array index.
94 */
95 const bool was_in_assignee = this->in_assignee;
96 this->in_assignee = false;
97 handle_rvalue(&ir->array_index);
98 this->in_assignee = was_in_assignee;
99
100 handle_rvalue(&ir->array);
101 return visit_continue;
102 }
103
104 ir_visitor_status
105 ir_rvalue_base_visitor::rvalue_visit(ir_dereference_record *ir)
106 {
107 handle_rvalue(&ir->record);
108 return visit_continue;
109 }
110
111 ir_visitor_status
112 ir_rvalue_base_visitor::rvalue_visit(ir_assignment *ir)
113 {
114 handle_rvalue(&ir->rhs);
115 handle_rvalue(&ir->condition);
116
117 return visit_continue;
118 }
119
120 ir_visitor_status
121 ir_rvalue_base_visitor::rvalue_visit(ir_call *ir)
122 {
123 foreach_iter(exec_list_iterator, iter, *ir) {
124 ir_rvalue *param = (ir_rvalue *)iter.get();
125 ir_rvalue *new_param = param;
126 handle_rvalue(&new_param);
127
128 if (new_param != param) {
129 param->replace_with(new_param);
130 }
131 }
132 return visit_continue;
133 }
134
135 ir_visitor_status
136 ir_rvalue_base_visitor::rvalue_visit(ir_return *ir)
137 {
138 handle_rvalue(&ir->value);;
139 return visit_continue;
140 }
141
142 ir_visitor_status
143 ir_rvalue_base_visitor::rvalue_visit(ir_if *ir)
144 {
145 handle_rvalue(&ir->condition);
146 return visit_continue;
147 }
148
149
150 ir_visitor_status
151 ir_rvalue_visitor::visit_leave(ir_expression *ir)
152 {
153 return rvalue_visit(ir);
154 }
155
156 ir_visitor_status
157 ir_rvalue_visitor::visit_leave(ir_texture *ir)
158 {
159 return rvalue_visit(ir);
160 }
161
162 ir_visitor_status
163 ir_rvalue_visitor::visit_leave(ir_swizzle *ir)
164 {
165 return rvalue_visit(ir);
166 }
167
168 ir_visitor_status
169 ir_rvalue_visitor::visit_leave(ir_dereference_array *ir)
170 {
171 return rvalue_visit(ir);
172 }
173
174 ir_visitor_status
175 ir_rvalue_visitor::visit_leave(ir_dereference_record *ir)
176 {
177 return rvalue_visit(ir);
178 }
179
180 ir_visitor_status
181 ir_rvalue_visitor::visit_leave(ir_assignment *ir)
182 {
183 return rvalue_visit(ir);
184 }
185
186 ir_visitor_status
187 ir_rvalue_visitor::visit_leave(ir_call *ir)
188 {
189 return rvalue_visit(ir);
190 }
191
192 ir_visitor_status
193 ir_rvalue_visitor::visit_leave(ir_return *ir)
194 {
195 return rvalue_visit(ir);
196 }
197
198 ir_visitor_status
199 ir_rvalue_visitor::visit_leave(ir_if *ir)
200 {
201 return rvalue_visit(ir);
202 }
203
204 ir_visitor_status
205 ir_rvalue_enter_visitor::visit_enter(ir_expression *ir)
206 {
207 return rvalue_visit(ir);
208 }
209
210 ir_visitor_status
211 ir_rvalue_enter_visitor::visit_enter(ir_texture *ir)
212 {
213 return rvalue_visit(ir);
214 }
215
216 ir_visitor_status
217 ir_rvalue_enter_visitor::visit_enter(ir_swizzle *ir)
218 {
219 return rvalue_visit(ir);
220 }
221
222 ir_visitor_status
223 ir_rvalue_enter_visitor::visit_enter(ir_dereference_array *ir)
224 {
225 return rvalue_visit(ir);
226 }
227
228 ir_visitor_status
229 ir_rvalue_enter_visitor::visit_enter(ir_dereference_record *ir)
230 {
231 return rvalue_visit(ir);
232 }
233
234 ir_visitor_status
235 ir_rvalue_enter_visitor::visit_enter(ir_assignment *ir)
236 {
237 return rvalue_visit(ir);
238 }
239
240 ir_visitor_status
241 ir_rvalue_enter_visitor::visit_enter(ir_call *ir)
242 {
243 return rvalue_visit(ir);
244 }
245
246 ir_visitor_status
247 ir_rvalue_enter_visitor::visit_enter(ir_return *ir)
248 {
249 return rvalue_visit(ir);
250 }
251
252 ir_visitor_status
253 ir_rvalue_enter_visitor::visit_enter(ir_if *ir)
254 {
255 return rvalue_visit(ir);
256 }