Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 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_query_levels:
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
   case ir_tg4:
78
      handle_rvalue(&ir->lod_info.component);
79
      break;
80
   }
81
 
82
   return visit_continue;
83
}
84
 
85
ir_visitor_status
86
ir_rvalue_base_visitor::rvalue_visit(ir_swizzle *ir)
87
{
88
   handle_rvalue(&ir->val);
89
   return visit_continue;
90
}
91
 
92
ir_visitor_status
93
ir_rvalue_base_visitor::rvalue_visit(ir_dereference_array *ir)
94
{
95
   /* The array index is not the target of the assignment, so clear the
96
    * 'in_assignee' flag.  Restore it after returning from the array index.
97
    */
98
   const bool was_in_assignee = this->in_assignee;
99
   this->in_assignee = false;
100
   handle_rvalue(&ir->array_index);
101
   this->in_assignee = was_in_assignee;
102
 
103
   handle_rvalue(&ir->array);
104
   return visit_continue;
105
}
106
 
107
ir_visitor_status
108
ir_rvalue_base_visitor::rvalue_visit(ir_dereference_record *ir)
109
{
110
   handle_rvalue(&ir->record);
111
   return visit_continue;
112
}
113
 
114
ir_visitor_status
115
ir_rvalue_base_visitor::rvalue_visit(ir_assignment *ir)
116
{
117
   handle_rvalue(&ir->rhs);
118
   handle_rvalue(&ir->condition);
119
 
120
   return visit_continue;
121
}
122
 
123
ir_visitor_status
124
ir_rvalue_base_visitor::rvalue_visit(ir_call *ir)
125
{
126
   foreach_in_list_safe(ir_rvalue, param, &ir->actual_parameters) {
127
      ir_rvalue *new_param = param;
128
      handle_rvalue(&new_param);
129
 
130
      if (new_param != param) {
131
	 param->replace_with(new_param);
132
      }
133
   }
134
   return visit_continue;
135
}
136
 
137
ir_visitor_status
138
ir_rvalue_base_visitor::rvalue_visit(ir_discard *ir)
139
{
140
   handle_rvalue(&ir->condition);
141
   return visit_continue;
142
}
143
 
144
ir_visitor_status
145
ir_rvalue_base_visitor::rvalue_visit(ir_return *ir)
146
{
147
   handle_rvalue(&ir->value);;
148
   return visit_continue;
149
}
150
 
151
ir_visitor_status
152
ir_rvalue_base_visitor::rvalue_visit(ir_if *ir)
153
{
154
   handle_rvalue(&ir->condition);
155
   return visit_continue;
156
}
157
 
158
ir_visitor_status
159
ir_rvalue_base_visitor::rvalue_visit(ir_emit_vertex *ir)
160
{
161
   handle_rvalue(&ir->stream);
162
   return visit_continue;
163
}
164
 
165
ir_visitor_status
166
ir_rvalue_base_visitor::rvalue_visit(ir_end_primitive *ir)
167
{
168
   handle_rvalue(&ir->stream);
169
   return visit_continue;
170
}
171
 
172
ir_visitor_status
173
ir_rvalue_visitor::visit_leave(ir_expression *ir)
174
{
175
   return rvalue_visit(ir);
176
}
177
 
178
ir_visitor_status
179
ir_rvalue_visitor::visit_leave(ir_texture *ir)
180
{
181
   return rvalue_visit(ir);
182
}
183
 
184
ir_visitor_status
185
ir_rvalue_visitor::visit_leave(ir_swizzle *ir)
186
{
187
   return rvalue_visit(ir);
188
}
189
 
190
ir_visitor_status
191
ir_rvalue_visitor::visit_leave(ir_dereference_array *ir)
192
{
193
   return rvalue_visit(ir);
194
}
195
 
196
ir_visitor_status
197
ir_rvalue_visitor::visit_leave(ir_dereference_record *ir)
198
{
199
   return rvalue_visit(ir);
200
}
201
 
202
ir_visitor_status
203
ir_rvalue_visitor::visit_leave(ir_assignment *ir)
204
{
205
   return rvalue_visit(ir);
206
}
207
 
208
ir_visitor_status
209
ir_rvalue_visitor::visit_leave(ir_call *ir)
210
{
211
   return rvalue_visit(ir);
212
}
213
 
214
ir_visitor_status
215
ir_rvalue_visitor::visit_leave(ir_discard *ir)
216
{
217
   return rvalue_visit(ir);
218
}
219
 
220
ir_visitor_status
221
ir_rvalue_visitor::visit_leave(ir_return *ir)
222
{
223
   return rvalue_visit(ir);
224
}
225
 
226
ir_visitor_status
227
ir_rvalue_visitor::visit_leave(ir_if *ir)
228
{
229
   return rvalue_visit(ir);
230
}
231
 
232
ir_visitor_status
233
ir_rvalue_visitor::visit_leave(ir_emit_vertex *ir)
234
{
235
   return rvalue_visit(ir);
236
}
237
 
238
ir_visitor_status
239
ir_rvalue_visitor::visit_leave(ir_end_primitive *ir)
240
{
241
   return rvalue_visit(ir);
242
}
243
 
244
ir_visitor_status
245
ir_rvalue_enter_visitor::visit_enter(ir_expression *ir)
246
{
247
   return rvalue_visit(ir);
248
}
249
 
250
ir_visitor_status
251
ir_rvalue_enter_visitor::visit_enter(ir_texture *ir)
252
{
253
   return rvalue_visit(ir);
254
}
255
 
256
ir_visitor_status
257
ir_rvalue_enter_visitor::visit_enter(ir_swizzle *ir)
258
{
259
   return rvalue_visit(ir);
260
}
261
 
262
ir_visitor_status
263
ir_rvalue_enter_visitor::visit_enter(ir_dereference_array *ir)
264
{
265
   return rvalue_visit(ir);
266
}
267
 
268
ir_visitor_status
269
ir_rvalue_enter_visitor::visit_enter(ir_dereference_record *ir)
270
{
271
   return rvalue_visit(ir);
272
}
273
 
274
ir_visitor_status
275
ir_rvalue_enter_visitor::visit_enter(ir_assignment *ir)
276
{
277
   return rvalue_visit(ir);
278
}
279
 
280
ir_visitor_status
281
ir_rvalue_enter_visitor::visit_enter(ir_call *ir)
282
{
283
   return rvalue_visit(ir);
284
}
285
 
286
ir_visitor_status
287
ir_rvalue_enter_visitor::visit_enter(ir_discard *ir)
288
{
289
   return rvalue_visit(ir);
290
}
291
 
292
ir_visitor_status
293
ir_rvalue_enter_visitor::visit_enter(ir_return *ir)
294
{
295
   return rvalue_visit(ir);
296
}
297
 
298
ir_visitor_status
299
ir_rvalue_enter_visitor::visit_enter(ir_if *ir)
300
{
301
   return rvalue_visit(ir);
302
}
303
 
304
ir_visitor_status
305
ir_rvalue_enter_visitor::visit_enter(ir_emit_vertex *ir)
306
{
307
   return rvalue_visit(ir);
308
}
309
 
310
ir_visitor_status
311
ir_rvalue_enter_visitor::visit_enter(ir_end_primitive *ir)
312
{
313
   return rvalue_visit(ir);
314
}