Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 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
      break;
61
   case ir_txb:
62
      handle_rvalue(&ir->lod_info.bias);
63
      break;
64
   case ir_txf:
65
   case ir_txl:
66
   case ir_txs:
67
      handle_rvalue(&ir->lod_info.lod);
68
      break;
69
   case ir_txf_ms:
70
      handle_rvalue(&ir->lod_info.sample_index);
71
      break;
72
   case ir_txd:
73
      handle_rvalue(&ir->lod_info.grad.dPdx);
74
      handle_rvalue(&ir->lod_info.grad.dPdy);
75
      break;
76
   }
77
 
78
   return visit_continue;
79
}
80
 
81
ir_visitor_status
82
ir_rvalue_base_visitor::rvalue_visit(ir_swizzle *ir)
83
{
84
   handle_rvalue(&ir->val);
85
   return visit_continue;
86
}
87
 
88
ir_visitor_status
89
ir_rvalue_base_visitor::rvalue_visit(ir_dereference_array *ir)
90
{
91
   /* The array index is not the target of the assignment, so clear the
92
    * 'in_assignee' flag.  Restore it after returning from the array index.
93
    */
94
   const bool was_in_assignee = this->in_assignee;
95
   this->in_assignee = false;
96
   handle_rvalue(&ir->array_index);
97
   this->in_assignee = was_in_assignee;
98
 
99
   handle_rvalue(&ir->array);
100
   return visit_continue;
101
}
102
 
103
ir_visitor_status
104
ir_rvalue_base_visitor::rvalue_visit(ir_dereference_record *ir)
105
{
106
   handle_rvalue(&ir->record);
107
   return visit_continue;
108
}
109
 
110
ir_visitor_status
111
ir_rvalue_base_visitor::rvalue_visit(ir_assignment *ir)
112
{
113
   handle_rvalue(&ir->rhs);
114
   handle_rvalue(&ir->condition);
115
 
116
   return visit_continue;
117
}
118
 
119
ir_visitor_status
120
ir_rvalue_base_visitor::rvalue_visit(ir_call *ir)
121
{
122
   foreach_iter(exec_list_iterator, iter, *ir) {
123
      ir_rvalue *param = (ir_rvalue *)iter.get();
124
      ir_rvalue *new_param = param;
125
      handle_rvalue(&new_param);
126
 
127
      if (new_param != param) {
128
	 param->replace_with(new_param);
129
      }
130
   }
131
   return visit_continue;
132
}
133
 
134
ir_visitor_status
135
ir_rvalue_base_visitor::rvalue_visit(ir_return *ir)
136
{
137
   handle_rvalue(&ir->value);;
138
   return visit_continue;
139
}
140
 
141
ir_visitor_status
142
ir_rvalue_base_visitor::rvalue_visit(ir_if *ir)
143
{
144
   handle_rvalue(&ir->condition);
145
   return visit_continue;
146
}
147
 
148
 
149
ir_visitor_status
150
ir_rvalue_visitor::visit_leave(ir_expression *ir)
151
{
152
   return rvalue_visit(ir);
153
}
154
 
155
ir_visitor_status
156
ir_rvalue_visitor::visit_leave(ir_texture *ir)
157
{
158
   return rvalue_visit(ir);
159
}
160
 
161
ir_visitor_status
162
ir_rvalue_visitor::visit_leave(ir_swizzle *ir)
163
{
164
   return rvalue_visit(ir);
165
}
166
 
167
ir_visitor_status
168
ir_rvalue_visitor::visit_leave(ir_dereference_array *ir)
169
{
170
   return rvalue_visit(ir);
171
}
172
 
173
ir_visitor_status
174
ir_rvalue_visitor::visit_leave(ir_dereference_record *ir)
175
{
176
   return rvalue_visit(ir);
177
}
178
 
179
ir_visitor_status
180
ir_rvalue_visitor::visit_leave(ir_assignment *ir)
181
{
182
   return rvalue_visit(ir);
183
}
184
 
185
ir_visitor_status
186
ir_rvalue_visitor::visit_leave(ir_call *ir)
187
{
188
   return rvalue_visit(ir);
189
}
190
 
191
ir_visitor_status
192
ir_rvalue_visitor::visit_leave(ir_return *ir)
193
{
194
   return rvalue_visit(ir);
195
}
196
 
197
ir_visitor_status
198
ir_rvalue_visitor::visit_leave(ir_if *ir)
199
{
200
   return rvalue_visit(ir);
201
}
202
 
203
ir_visitor_status
204
ir_rvalue_enter_visitor::visit_enter(ir_expression *ir)
205
{
206
   return rvalue_visit(ir);
207
}
208
 
209
ir_visitor_status
210
ir_rvalue_enter_visitor::visit_enter(ir_texture *ir)
211
{
212
   return rvalue_visit(ir);
213
}
214
 
215
ir_visitor_status
216
ir_rvalue_enter_visitor::visit_enter(ir_swizzle *ir)
217
{
218
   return rvalue_visit(ir);
219
}
220
 
221
ir_visitor_status
222
ir_rvalue_enter_visitor::visit_enter(ir_dereference_array *ir)
223
{
224
   return rvalue_visit(ir);
225
}
226
 
227
ir_visitor_status
228
ir_rvalue_enter_visitor::visit_enter(ir_dereference_record *ir)
229
{
230
   return rvalue_visit(ir);
231
}
232
 
233
ir_visitor_status
234
ir_rvalue_enter_visitor::visit_enter(ir_assignment *ir)
235
{
236
   return rvalue_visit(ir);
237
}
238
 
239
ir_visitor_status
240
ir_rvalue_enter_visitor::visit_enter(ir_call *ir)
241
{
242
   return rvalue_visit(ir);
243
}
244
 
245
ir_visitor_status
246
ir_rvalue_enter_visitor::visit_enter(ir_return *ir)
247
{
248
   return rvalue_visit(ir);
249
}
250
 
251
ir_visitor_status
252
ir_rvalue_enter_visitor::visit_enter(ir_if *ir)
253
{
254
   return rvalue_visit(ir);
255
}