OSDN Git Service

glsl: Implement ARB_texture_query_lod
[android-x86/external-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 "ir_print_visitor.h"
36 #include "glsl_types.h"
37
38 ir_visitor_status
39 ir_rvalue_base_visitor::rvalue_visit(ir_expression *ir)
40 {
41    unsigned int operand;
42
43    for (operand = 0; operand < ir->get_num_operands(); operand++) {
44       handle_rvalue(&ir->operands[operand]);
45    }
46
47    return visit_continue;
48 }
49
50 ir_visitor_status
51 ir_rvalue_base_visitor::rvalue_visit(ir_texture *ir)
52 {
53    handle_rvalue(&ir->coordinate);
54    handle_rvalue(&ir->projector);
55    handle_rvalue(&ir->shadow_comparitor);
56    handle_rvalue(&ir->offset);
57
58    switch (ir->op) {
59    case ir_tex:
60    case ir_lod:
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 }