Merge branch 'gallium-userbuf'
[mesa.git] / src / glsl / ir.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 #include <string.h>
24 #include "main/core.h" /* for MAX2 */
25 #include "ir.h"
26 #include "ir_visitor.h"
27 #include "glsl_types.h"
28
29 ir_rvalue::ir_rvalue()
30 {
31 this->type = glsl_type::error_type;
32 }
33
34 bool ir_rvalue::is_zero() const
35 {
36 return false;
37 }
38
39 bool ir_rvalue::is_one() const
40 {
41 return false;
42 }
43
44 bool ir_rvalue::is_negative_one() const
45 {
46 return false;
47 }
48
49 /**
50 * Modify the swizzle make to move one component to another
51 *
52 * \param m IR swizzle to be modified
53 * \param from Component in the RHS that is to be swizzled
54 * \param to Desired swizzle location of \c from
55 */
56 static void
57 update_rhs_swizzle(ir_swizzle_mask &m, unsigned from, unsigned to)
58 {
59 switch (to) {
60 case 0: m.x = from; break;
61 case 1: m.y = from; break;
62 case 2: m.z = from; break;
63 case 3: m.w = from; break;
64 default: assert(!"Should not get here.");
65 }
66
67 m.num_components = MAX2(m.num_components, (to + 1));
68 }
69
70 void
71 ir_assignment::set_lhs(ir_rvalue *lhs)
72 {
73 void *mem_ctx = this;
74 bool swizzled = false;
75
76 while (lhs != NULL) {
77 ir_swizzle *swiz = lhs->as_swizzle();
78
79 if (swiz == NULL)
80 break;
81
82 unsigned write_mask = 0;
83 ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
84
85 for (unsigned i = 0; i < swiz->mask.num_components; i++) {
86 unsigned c = 0;
87
88 switch (i) {
89 case 0: c = swiz->mask.x; break;
90 case 1: c = swiz->mask.y; break;
91 case 2: c = swiz->mask.z; break;
92 case 3: c = swiz->mask.w; break;
93 default: assert(!"Should not get here.");
94 }
95
96 write_mask |= (((this->write_mask >> i) & 1) << c);
97 update_rhs_swizzle(rhs_swiz, i, c);
98 }
99
100 this->write_mask = write_mask;
101 lhs = swiz->val;
102
103 this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
104 swizzled = true;
105 }
106
107 if (swizzled) {
108 /* Now, RHS channels line up with the LHS writemask. Collapse it
109 * to just the channels that will be written.
110 */
111 ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
112 int rhs_chan = 0;
113 for (int i = 0; i < 4; i++) {
114 if (write_mask & (1 << i))
115 update_rhs_swizzle(rhs_swiz, i, rhs_chan++);
116 }
117 this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
118 }
119
120 assert((lhs == NULL) || lhs->as_dereference());
121
122 this->lhs = (ir_dereference *) lhs;
123 }
124
125 ir_variable *
126 ir_assignment::whole_variable_written()
127 {
128 ir_variable *v = this->lhs->whole_variable_referenced();
129
130 if (v == NULL)
131 return NULL;
132
133 if (v->type->is_scalar())
134 return v;
135
136 if (v->type->is_vector()) {
137 const unsigned mask = (1U << v->type->vector_elements) - 1;
138
139 if (mask != this->write_mask)
140 return NULL;
141 }
142
143 /* Either all the vector components are assigned or the variable is some
144 * composite type (and the whole thing is assigned.
145 */
146 return v;
147 }
148
149 ir_assignment::ir_assignment(ir_dereference *lhs, ir_rvalue *rhs,
150 ir_rvalue *condition, unsigned write_mask)
151 {
152 this->ir_type = ir_type_assignment;
153 this->condition = condition;
154 this->rhs = rhs;
155 this->lhs = lhs;
156 this->write_mask = write_mask;
157
158 if (lhs->type->is_scalar() || lhs->type->is_vector()) {
159 int lhs_components = 0;
160 for (int i = 0; i < 4; i++) {
161 if (write_mask & (1 << i))
162 lhs_components++;
163 }
164
165 assert(lhs_components == this->rhs->type->vector_elements);
166 }
167 }
168
169 ir_assignment::ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs,
170 ir_rvalue *condition)
171 {
172 this->ir_type = ir_type_assignment;
173 this->condition = condition;
174 this->rhs = rhs;
175
176 /* If the RHS is a vector type, assume that all components of the vector
177 * type are being written to the LHS. The write mask comes from the RHS
178 * because we can have a case where the LHS is a vec4 and the RHS is a
179 * vec3. In that case, the assignment is:
180 *
181 * (assign (...) (xyz) (var_ref lhs) (var_ref rhs))
182 */
183 if (rhs->type->is_vector())
184 this->write_mask = (1U << rhs->type->vector_elements) - 1;
185 else if (rhs->type->is_scalar())
186 this->write_mask = 1;
187 else
188 this->write_mask = 0;
189
190 this->set_lhs(lhs);
191 }
192
193
194 ir_expression::ir_expression(int op, const struct glsl_type *type,
195 ir_rvalue *op0)
196 {
197 assert(get_num_operands(ir_expression_operation(op)) == 1);
198 this->ir_type = ir_type_expression;
199 this->type = type;
200 this->operation = ir_expression_operation(op);
201 this->operands[0] = op0;
202 this->operands[1] = NULL;
203 this->operands[2] = NULL;
204 this->operands[3] = NULL;
205 }
206
207 ir_expression::ir_expression(int op, const struct glsl_type *type,
208 ir_rvalue *op0, ir_rvalue *op1)
209 {
210 assert(((op1 == NULL) && (get_num_operands(ir_expression_operation(op)) == 1))
211 || (get_num_operands(ir_expression_operation(op)) == 2));
212 this->ir_type = ir_type_expression;
213 this->type = type;
214 this->operation = ir_expression_operation(op);
215 this->operands[0] = op0;
216 this->operands[1] = op1;
217 this->operands[2] = NULL;
218 this->operands[3] = NULL;
219 }
220
221 ir_expression::ir_expression(int op, const struct glsl_type *type,
222 ir_rvalue *op0, ir_rvalue *op1,
223 ir_rvalue *op2, ir_rvalue *op3)
224 {
225 this->ir_type = ir_type_expression;
226 this->type = type;
227 this->operation = ir_expression_operation(op);
228 this->operands[0] = op0;
229 this->operands[1] = op1;
230 this->operands[2] = op2;
231 this->operands[3] = op3;
232 }
233
234 ir_expression::ir_expression(int op, ir_rvalue *op0)
235 {
236 this->ir_type = ir_type_expression;
237
238 this->operation = ir_expression_operation(op);
239 this->operands[0] = op0;
240 this->operands[1] = NULL;
241 this->operands[2] = NULL;
242 this->operands[3] = NULL;
243
244 assert(op <= ir_last_unop);
245
246 switch (this->operation) {
247 case ir_unop_bit_not:
248 case ir_unop_logic_not:
249 case ir_unop_neg:
250 case ir_unop_abs:
251 case ir_unop_sign:
252 case ir_unop_rcp:
253 case ir_unop_rsq:
254 case ir_unop_sqrt:
255 case ir_unop_exp:
256 case ir_unop_log:
257 case ir_unop_exp2:
258 case ir_unop_log2:
259 case ir_unop_trunc:
260 case ir_unop_ceil:
261 case ir_unop_floor:
262 case ir_unop_fract:
263 case ir_unop_round_even:
264 case ir_unop_sin:
265 case ir_unop_cos:
266 case ir_unop_sin_reduced:
267 case ir_unop_cos_reduced:
268 case ir_unop_dFdx:
269 case ir_unop_dFdy:
270 this->type = op0->type;
271 break;
272
273 case ir_unop_f2i:
274 case ir_unop_b2i:
275 case ir_unop_u2i:
276 this->type = glsl_type::get_instance(GLSL_TYPE_INT,
277 op0->type->vector_elements, 1);
278 break;
279
280 case ir_unop_b2f:
281 case ir_unop_i2f:
282 case ir_unop_u2f:
283 this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT,
284 op0->type->vector_elements, 1);
285 break;
286
287 case ir_unop_f2b:
288 case ir_unop_i2b:
289 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
290 op0->type->vector_elements, 1);
291 break;
292
293 case ir_unop_i2u:
294 this->type = glsl_type::get_instance(GLSL_TYPE_UINT,
295 op0->type->vector_elements, 1);
296 break;
297
298 case ir_unop_noise:
299 this->type = glsl_type::float_type;
300 break;
301
302 case ir_unop_any:
303 this->type = glsl_type::bool_type;
304 break;
305
306 default:
307 assert(!"not reached: missing automatic type setup for ir_expression");
308 this->type = op0->type;
309 break;
310 }
311 }
312
313 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1)
314 {
315 this->ir_type = ir_type_expression;
316
317 this->operation = ir_expression_operation(op);
318 this->operands[0] = op0;
319 this->operands[1] = op1;
320 this->operands[2] = NULL;
321 this->operands[3] = NULL;
322
323 assert(op > ir_last_unop);
324
325 switch (this->operation) {
326 case ir_binop_all_equal:
327 case ir_binop_any_nequal:
328 this->type = glsl_type::bool_type;
329 break;
330
331 case ir_binop_add:
332 case ir_binop_sub:
333 case ir_binop_min:
334 case ir_binop_max:
335 case ir_binop_pow:
336 case ir_binop_mul:
337 case ir_binop_div:
338 case ir_binop_mod:
339 if (op0->type->is_scalar()) {
340 this->type = op1->type;
341 } else if (op1->type->is_scalar()) {
342 this->type = op0->type;
343 } else {
344 /* FINISHME: matrix types */
345 assert(!op0->type->is_matrix() && !op1->type->is_matrix());
346 assert(op0->type == op1->type);
347 this->type = op0->type;
348 }
349 break;
350
351 case ir_binop_logic_and:
352 case ir_binop_logic_xor:
353 case ir_binop_logic_or:
354 case ir_binop_bit_and:
355 case ir_binop_bit_xor:
356 case ir_binop_bit_or:
357 if (op0->type->is_scalar()) {
358 this->type = op1->type;
359 } else if (op1->type->is_scalar()) {
360 this->type = op0->type;
361 }
362 break;
363
364 case ir_binop_equal:
365 case ir_binop_nequal:
366 case ir_binop_lequal:
367 case ir_binop_gequal:
368 case ir_binop_less:
369 case ir_binop_greater:
370 assert(op0->type == op1->type);
371 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
372 op0->type->vector_elements, 1);
373 break;
374
375 case ir_binop_dot:
376 this->type = glsl_type::float_type;
377 break;
378
379 case ir_binop_lshift:
380 case ir_binop_rshift:
381 this->type = op0->type;
382 break;
383
384 default:
385 assert(!"not reached: missing automatic type setup for ir_expression");
386 this->type = glsl_type::float_type;
387 }
388 }
389
390 unsigned int
391 ir_expression::get_num_operands(ir_expression_operation op)
392 {
393 assert(op <= ir_last_opcode);
394
395 if (op <= ir_last_unop)
396 return 1;
397
398 if (op <= ir_last_binop)
399 return 2;
400
401 if (op == ir_quadop_vector)
402 return 4;
403
404 assert(false);
405 return 0;
406 }
407
408 static const char *const operator_strs[] = {
409 "~",
410 "!",
411 "neg",
412 "abs",
413 "sign",
414 "rcp",
415 "rsq",
416 "sqrt",
417 "exp",
418 "log",
419 "exp2",
420 "log2",
421 "f2i",
422 "i2f",
423 "f2b",
424 "b2f",
425 "i2b",
426 "b2i",
427 "u2f",
428 "i2u",
429 "u2i",
430 "any",
431 "trunc",
432 "ceil",
433 "floor",
434 "fract",
435 "round_even",
436 "sin",
437 "cos",
438 "sin_reduced",
439 "cos_reduced",
440 "dFdx",
441 "dFdy",
442 "noise",
443 "+",
444 "-",
445 "*",
446 "/",
447 "%",
448 "<",
449 ">",
450 "<=",
451 ">=",
452 "==",
453 "!=",
454 "all_equal",
455 "any_nequal",
456 "<<",
457 ">>",
458 "&",
459 "^",
460 "|",
461 "&&",
462 "^^",
463 "||",
464 "dot",
465 "min",
466 "max",
467 "pow",
468 "vector",
469 };
470
471 const char *ir_expression::operator_string(ir_expression_operation op)
472 {
473 assert((unsigned int) op < Elements(operator_strs));
474 assert(Elements(operator_strs) == (ir_quadop_vector + 1));
475 return operator_strs[op];
476 }
477
478 const char *ir_expression::operator_string()
479 {
480 return operator_string(this->operation);
481 }
482
483 const char*
484 depth_layout_string(ir_depth_layout layout)
485 {
486 switch(layout) {
487 case ir_depth_layout_none: return "";
488 case ir_depth_layout_any: return "depth_any";
489 case ir_depth_layout_greater: return "depth_greater";
490 case ir_depth_layout_less: return "depth_less";
491 case ir_depth_layout_unchanged: return "depth_unchanged";
492
493 default:
494 assert(0);
495 return "";
496 }
497 }
498
499 ir_expression_operation
500 ir_expression::get_operator(const char *str)
501 {
502 const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
503 for (int op = 0; op < operator_count; op++) {
504 if (strcmp(str, operator_strs[op]) == 0)
505 return (ir_expression_operation) op;
506 }
507 return (ir_expression_operation) -1;
508 }
509
510 ir_constant::ir_constant()
511 {
512 this->ir_type = ir_type_constant;
513 }
514
515 ir_constant::ir_constant(const struct glsl_type *type,
516 const ir_constant_data *data)
517 {
518 assert((type->base_type >= GLSL_TYPE_UINT)
519 && (type->base_type <= GLSL_TYPE_BOOL));
520
521 this->ir_type = ir_type_constant;
522 this->type = type;
523 memcpy(& this->value, data, sizeof(this->value));
524 }
525
526 ir_constant::ir_constant(float f)
527 {
528 this->ir_type = ir_type_constant;
529 this->type = glsl_type::float_type;
530 this->value.f[0] = f;
531 for (int i = 1; i < 16; i++) {
532 this->value.f[i] = 0;
533 }
534 }
535
536 ir_constant::ir_constant(unsigned int u)
537 {
538 this->ir_type = ir_type_constant;
539 this->type = glsl_type::uint_type;
540 this->value.u[0] = u;
541 for (int i = 1; i < 16; i++) {
542 this->value.u[i] = 0;
543 }
544 }
545
546 ir_constant::ir_constant(int i)
547 {
548 this->ir_type = ir_type_constant;
549 this->type = glsl_type::int_type;
550 this->value.i[0] = i;
551 for (int i = 1; i < 16; i++) {
552 this->value.i[i] = 0;
553 }
554 }
555
556 ir_constant::ir_constant(bool b)
557 {
558 this->ir_type = ir_type_constant;
559 this->type = glsl_type::bool_type;
560 this->value.b[0] = b;
561 for (int i = 1; i < 16; i++) {
562 this->value.b[i] = false;
563 }
564 }
565
566 ir_constant::ir_constant(const ir_constant *c, unsigned i)
567 {
568 this->ir_type = ir_type_constant;
569 this->type = c->type->get_base_type();
570
571 switch (this->type->base_type) {
572 case GLSL_TYPE_UINT: this->value.u[0] = c->value.u[i]; break;
573 case GLSL_TYPE_INT: this->value.i[0] = c->value.i[i]; break;
574 case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
575 case GLSL_TYPE_BOOL: this->value.b[0] = c->value.b[i]; break;
576 default: assert(!"Should not get here."); break;
577 }
578 }
579
580 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
581 {
582 this->ir_type = ir_type_constant;
583 this->type = type;
584
585 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
586 || type->is_record() || type->is_array());
587
588 if (type->is_array()) {
589 this->array_elements = ralloc_array(this, ir_constant *, type->length);
590 unsigned i = 0;
591 foreach_list(node, value_list) {
592 ir_constant *value = (ir_constant *) node;
593 assert(value->as_constant() != NULL);
594
595 this->array_elements[i++] = value;
596 }
597 return;
598 }
599
600 /* If the constant is a record, the types of each of the entries in
601 * value_list must be a 1-for-1 match with the structure components. Each
602 * entry must also be a constant. Just move the nodes from the value_list
603 * to the list in the ir_constant.
604 */
605 /* FINISHME: Should there be some type checking and / or assertions here? */
606 /* FINISHME: Should the new constant take ownership of the nodes from
607 * FINISHME: value_list, or should it make copies?
608 */
609 if (type->is_record()) {
610 value_list->move_nodes_to(& this->components);
611 return;
612 }
613
614 for (unsigned i = 0; i < 16; i++) {
615 this->value.u[i] = 0;
616 }
617
618 ir_constant *value = (ir_constant *) (value_list->head);
619
620 /* Constructors with exactly one scalar argument are special for vectors
621 * and matrices. For vectors, the scalar value is replicated to fill all
622 * the components. For matrices, the scalar fills the components of the
623 * diagonal while the rest is filled with 0.
624 */
625 if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
626 if (type->is_matrix()) {
627 /* Matrix - fill diagonal (rest is already set to 0) */
628 assert(type->base_type == GLSL_TYPE_FLOAT);
629 for (unsigned i = 0; i < type->matrix_columns; i++)
630 this->value.f[i * type->vector_elements + i] = value->value.f[0];
631 } else {
632 /* Vector or scalar - fill all components */
633 switch (type->base_type) {
634 case GLSL_TYPE_UINT:
635 case GLSL_TYPE_INT:
636 for (unsigned i = 0; i < type->components(); i++)
637 this->value.u[i] = value->value.u[0];
638 break;
639 case GLSL_TYPE_FLOAT:
640 for (unsigned i = 0; i < type->components(); i++)
641 this->value.f[i] = value->value.f[0];
642 break;
643 case GLSL_TYPE_BOOL:
644 for (unsigned i = 0; i < type->components(); i++)
645 this->value.b[i] = value->value.b[0];
646 break;
647 default:
648 assert(!"Should not get here.");
649 break;
650 }
651 }
652 return;
653 }
654
655 if (type->is_matrix() && value->type->is_matrix()) {
656 assert(value->next->is_tail_sentinel());
657
658 /* From section 5.4.2 of the GLSL 1.20 spec:
659 * "If a matrix is constructed from a matrix, then each component
660 * (column i, row j) in the result that has a corresponding component
661 * (column i, row j) in the argument will be initialized from there."
662 */
663 unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
664 unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
665 for (unsigned i = 0; i < cols; i++) {
666 for (unsigned j = 0; j < rows; j++) {
667 const unsigned src = i * value->type->vector_elements + j;
668 const unsigned dst = i * type->vector_elements + j;
669 this->value.f[dst] = value->value.f[src];
670 }
671 }
672
673 /* "All other components will be initialized to the identity matrix." */
674 for (unsigned i = cols; i < type->matrix_columns; i++)
675 this->value.f[i * type->vector_elements + i] = 1.0;
676
677 return;
678 }
679
680 /* Use each component from each entry in the value_list to initialize one
681 * component of the constant being constructed.
682 */
683 for (unsigned i = 0; i < type->components(); /* empty */) {
684 assert(value->as_constant() != NULL);
685 assert(!value->is_tail_sentinel());
686
687 for (unsigned j = 0; j < value->type->components(); j++) {
688 switch (type->base_type) {
689 case GLSL_TYPE_UINT:
690 this->value.u[i] = value->get_uint_component(j);
691 break;
692 case GLSL_TYPE_INT:
693 this->value.i[i] = value->get_int_component(j);
694 break;
695 case GLSL_TYPE_FLOAT:
696 this->value.f[i] = value->get_float_component(j);
697 break;
698 case GLSL_TYPE_BOOL:
699 this->value.b[i] = value->get_bool_component(j);
700 break;
701 default:
702 /* FINISHME: What to do? Exceptions are not the answer.
703 */
704 break;
705 }
706
707 i++;
708 if (i >= type->components())
709 break;
710 }
711
712 value = (ir_constant *) value->next;
713 }
714 }
715
716 ir_constant *
717 ir_constant::zero(void *mem_ctx, const glsl_type *type)
718 {
719 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
720 || type->is_record() || type->is_array());
721
722 ir_constant *c = new(mem_ctx) ir_constant;
723 c->type = type;
724 memset(&c->value, 0, sizeof(c->value));
725
726 if (type->is_array()) {
727 c->array_elements = ralloc_array(c, ir_constant *, type->length);
728
729 for (unsigned i = 0; i < type->length; i++)
730 c->array_elements[i] = ir_constant::zero(c, type->element_type());
731 }
732
733 if (type->is_record()) {
734 for (unsigned i = 0; i < type->length; i++) {
735 ir_constant *comp = ir_constant::zero(mem_ctx, type->fields.structure[i].type);
736 c->components.push_tail(comp);
737 }
738 }
739
740 return c;
741 }
742
743 bool
744 ir_constant::get_bool_component(unsigned i) const
745 {
746 switch (this->type->base_type) {
747 case GLSL_TYPE_UINT: return this->value.u[i] != 0;
748 case GLSL_TYPE_INT: return this->value.i[i] != 0;
749 case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
750 case GLSL_TYPE_BOOL: return this->value.b[i];
751 default: assert(!"Should not get here."); break;
752 }
753
754 /* Must return something to make the compiler happy. This is clearly an
755 * error case.
756 */
757 return false;
758 }
759
760 float
761 ir_constant::get_float_component(unsigned i) const
762 {
763 switch (this->type->base_type) {
764 case GLSL_TYPE_UINT: return (float) this->value.u[i];
765 case GLSL_TYPE_INT: return (float) this->value.i[i];
766 case GLSL_TYPE_FLOAT: return this->value.f[i];
767 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0 : 0.0;
768 default: assert(!"Should not get here."); break;
769 }
770
771 /* Must return something to make the compiler happy. This is clearly an
772 * error case.
773 */
774 return 0.0;
775 }
776
777 int
778 ir_constant::get_int_component(unsigned i) const
779 {
780 switch (this->type->base_type) {
781 case GLSL_TYPE_UINT: return this->value.u[i];
782 case GLSL_TYPE_INT: return this->value.i[i];
783 case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
784 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
785 default: assert(!"Should not get here."); break;
786 }
787
788 /* Must return something to make the compiler happy. This is clearly an
789 * error case.
790 */
791 return 0;
792 }
793
794 unsigned
795 ir_constant::get_uint_component(unsigned i) const
796 {
797 switch (this->type->base_type) {
798 case GLSL_TYPE_UINT: return this->value.u[i];
799 case GLSL_TYPE_INT: return this->value.i[i];
800 case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
801 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
802 default: assert(!"Should not get here."); break;
803 }
804
805 /* Must return something to make the compiler happy. This is clearly an
806 * error case.
807 */
808 return 0;
809 }
810
811 ir_constant *
812 ir_constant::get_array_element(unsigned i) const
813 {
814 assert(this->type->is_array());
815
816 /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
817 *
818 * "Behavior is undefined if a shader subscripts an array with an index
819 * less than 0 or greater than or equal to the size the array was
820 * declared with."
821 *
822 * Most out-of-bounds accesses are removed before things could get this far.
823 * There are cases where non-constant array index values can get constant
824 * folded.
825 */
826 if (int(i) < 0)
827 i = 0;
828 else if (i >= this->type->length)
829 i = this->type->length - 1;
830
831 return array_elements[i];
832 }
833
834 ir_constant *
835 ir_constant::get_record_field(const char *name)
836 {
837 int idx = this->type->field_index(name);
838
839 if (idx < 0)
840 return NULL;
841
842 if (this->components.is_empty())
843 return NULL;
844
845 exec_node *node = this->components.head;
846 for (int i = 0; i < idx; i++) {
847 node = node->next;
848
849 /* If the end of the list is encountered before the element matching the
850 * requested field is found, return NULL.
851 */
852 if (node->is_tail_sentinel())
853 return NULL;
854 }
855
856 return (ir_constant *) node;
857 }
858
859 void
860 ir_constant::copy_offset(ir_constant *src, int offset)
861 {
862 switch (this->type->base_type) {
863 case GLSL_TYPE_UINT:
864 case GLSL_TYPE_INT:
865 case GLSL_TYPE_FLOAT:
866 case GLSL_TYPE_BOOL: {
867 unsigned int size = src->type->components();
868 assert (size <= this->type->components() - offset);
869 for (unsigned int i=0; i<size; i++) {
870 switch (this->type->base_type) {
871 case GLSL_TYPE_UINT:
872 value.u[i+offset] = src->get_uint_component(i);
873 break;
874 case GLSL_TYPE_INT:
875 value.i[i+offset] = src->get_int_component(i);
876 break;
877 case GLSL_TYPE_FLOAT:
878 value.f[i+offset] = src->get_float_component(i);
879 break;
880 case GLSL_TYPE_BOOL:
881 value.b[i+offset] = src->get_bool_component(i);
882 break;
883 default: // Shut up the compiler
884 break;
885 }
886 }
887 break;
888 }
889
890 case GLSL_TYPE_STRUCT: {
891 assert (src->type == this->type);
892 this->components.make_empty();
893 foreach_list(node, &src->components) {
894 ir_constant *const orig = (ir_constant *) node;
895
896 this->components.push_tail(orig->clone(this, NULL));
897 }
898 break;
899 }
900
901 case GLSL_TYPE_ARRAY: {
902 assert (src->type == this->type);
903 for (unsigned i = 0; i < this->type->length; i++) {
904 this->array_elements[i] = src->array_elements[i]->clone(this, NULL);
905 }
906 break;
907 }
908
909 default:
910 assert(!"Should not get here.");
911 break;
912 }
913 }
914
915 void
916 ir_constant::copy_masked_offset(ir_constant *src, int offset, unsigned int mask)
917 {
918 assert (!type->is_array() && !type->is_record());
919
920 if (!type->is_vector() && !type->is_matrix()) {
921 offset = 0;
922 mask = 1;
923 }
924
925 int id = 0;
926 for (int i=0; i<4; i++) {
927 if (mask & (1 << i)) {
928 switch (this->type->base_type) {
929 case GLSL_TYPE_UINT:
930 value.u[i+offset] = src->get_uint_component(id++);
931 break;
932 case GLSL_TYPE_INT:
933 value.i[i+offset] = src->get_int_component(id++);
934 break;
935 case GLSL_TYPE_FLOAT:
936 value.f[i+offset] = src->get_float_component(id++);
937 break;
938 case GLSL_TYPE_BOOL:
939 value.b[i+offset] = src->get_bool_component(id++);
940 break;
941 default:
942 assert(!"Should not get here.");
943 return;
944 }
945 }
946 }
947 }
948
949 bool
950 ir_constant::has_value(const ir_constant *c) const
951 {
952 if (this->type != c->type)
953 return false;
954
955 if (this->type->is_array()) {
956 for (unsigned i = 0; i < this->type->length; i++) {
957 if (!this->array_elements[i]->has_value(c->array_elements[i]))
958 return false;
959 }
960 return true;
961 }
962
963 if (this->type->base_type == GLSL_TYPE_STRUCT) {
964 const exec_node *a_node = this->components.head;
965 const exec_node *b_node = c->components.head;
966
967 while (!a_node->is_tail_sentinel()) {
968 assert(!b_node->is_tail_sentinel());
969
970 const ir_constant *const a_field = (ir_constant *) a_node;
971 const ir_constant *const b_field = (ir_constant *) b_node;
972
973 if (!a_field->has_value(b_field))
974 return false;
975
976 a_node = a_node->next;
977 b_node = b_node->next;
978 }
979
980 return true;
981 }
982
983 for (unsigned i = 0; i < this->type->components(); i++) {
984 switch (this->type->base_type) {
985 case GLSL_TYPE_UINT:
986 if (this->value.u[i] != c->value.u[i])
987 return false;
988 break;
989 case GLSL_TYPE_INT:
990 if (this->value.i[i] != c->value.i[i])
991 return false;
992 break;
993 case GLSL_TYPE_FLOAT:
994 if (this->value.f[i] != c->value.f[i])
995 return false;
996 break;
997 case GLSL_TYPE_BOOL:
998 if (this->value.b[i] != c->value.b[i])
999 return false;
1000 break;
1001 default:
1002 assert(!"Should not get here.");
1003 return false;
1004 }
1005 }
1006
1007 return true;
1008 }
1009
1010 bool
1011 ir_constant::is_zero() const
1012 {
1013 if (!this->type->is_scalar() && !this->type->is_vector())
1014 return false;
1015
1016 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1017 switch (this->type->base_type) {
1018 case GLSL_TYPE_FLOAT:
1019 if (this->value.f[c] != 0.0)
1020 return false;
1021 break;
1022 case GLSL_TYPE_INT:
1023 if (this->value.i[c] != 0)
1024 return false;
1025 break;
1026 case GLSL_TYPE_UINT:
1027 if (this->value.u[c] != 0)
1028 return false;
1029 break;
1030 case GLSL_TYPE_BOOL:
1031 if (this->value.b[c] != false)
1032 return false;
1033 break;
1034 default:
1035 /* The only other base types are structures, arrays, and samplers.
1036 * Samplers cannot be constants, and the others should have been
1037 * filtered out above.
1038 */
1039 assert(!"Should not get here.");
1040 return false;
1041 }
1042 }
1043
1044 return true;
1045 }
1046
1047 bool
1048 ir_constant::is_one() const
1049 {
1050 if (!this->type->is_scalar() && !this->type->is_vector())
1051 return false;
1052
1053 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1054 switch (this->type->base_type) {
1055 case GLSL_TYPE_FLOAT:
1056 if (this->value.f[c] != 1.0)
1057 return false;
1058 break;
1059 case GLSL_TYPE_INT:
1060 if (this->value.i[c] != 1)
1061 return false;
1062 break;
1063 case GLSL_TYPE_UINT:
1064 if (this->value.u[c] != 1)
1065 return false;
1066 break;
1067 case GLSL_TYPE_BOOL:
1068 if (this->value.b[c] != true)
1069 return false;
1070 break;
1071 default:
1072 /* The only other base types are structures, arrays, and samplers.
1073 * Samplers cannot be constants, and the others should have been
1074 * filtered out above.
1075 */
1076 assert(!"Should not get here.");
1077 return false;
1078 }
1079 }
1080
1081 return true;
1082 }
1083
1084 bool
1085 ir_constant::is_negative_one() const
1086 {
1087 if (!this->type->is_scalar() && !this->type->is_vector())
1088 return false;
1089
1090 if (this->type->is_boolean())
1091 return false;
1092
1093 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1094 switch (this->type->base_type) {
1095 case GLSL_TYPE_FLOAT:
1096 if (this->value.f[c] != -1.0)
1097 return false;
1098 break;
1099 case GLSL_TYPE_INT:
1100 if (this->value.i[c] != -1)
1101 return false;
1102 break;
1103 case GLSL_TYPE_UINT:
1104 if (int(this->value.u[c]) != -1)
1105 return false;
1106 break;
1107 default:
1108 /* The only other base types are structures, arrays, samplers, and
1109 * booleans. Samplers cannot be constants, and the others should
1110 * have been filtered out above.
1111 */
1112 assert(!"Should not get here.");
1113 return false;
1114 }
1115 }
1116
1117 return true;
1118 }
1119
1120 ir_loop::ir_loop()
1121 {
1122 this->ir_type = ir_type_loop;
1123 this->cmp = ir_unop_neg;
1124 this->from = NULL;
1125 this->to = NULL;
1126 this->increment = NULL;
1127 this->counter = NULL;
1128 }
1129
1130
1131 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
1132 {
1133 assert(var != NULL);
1134
1135 this->ir_type = ir_type_dereference_variable;
1136 this->var = var;
1137 this->type = var->type;
1138 }
1139
1140
1141 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
1142 ir_rvalue *array_index)
1143 {
1144 this->ir_type = ir_type_dereference_array;
1145 this->array_index = array_index;
1146 this->set_array(value);
1147 }
1148
1149
1150 ir_dereference_array::ir_dereference_array(ir_variable *var,
1151 ir_rvalue *array_index)
1152 {
1153 void *ctx = ralloc_parent(var);
1154
1155 this->ir_type = ir_type_dereference_array;
1156 this->array_index = array_index;
1157 this->set_array(new(ctx) ir_dereference_variable(var));
1158 }
1159
1160
1161 void
1162 ir_dereference_array::set_array(ir_rvalue *value)
1163 {
1164 assert(value != NULL);
1165
1166 this->array = value;
1167
1168 const glsl_type *const vt = this->array->type;
1169
1170 if (vt->is_array()) {
1171 type = vt->element_type();
1172 } else if (vt->is_matrix()) {
1173 type = vt->column_type();
1174 } else if (vt->is_vector()) {
1175 type = vt->get_base_type();
1176 }
1177 }
1178
1179
1180 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
1181 const char *field)
1182 {
1183 assert(value != NULL);
1184
1185 this->ir_type = ir_type_dereference_record;
1186 this->record = value;
1187 this->field = ralloc_strdup(this, field);
1188 this->type = this->record->type->field_type(field);
1189 }
1190
1191
1192 ir_dereference_record::ir_dereference_record(ir_variable *var,
1193 const char *field)
1194 {
1195 void *ctx = ralloc_parent(var);
1196
1197 this->ir_type = ir_type_dereference_record;
1198 this->record = new(ctx) ir_dereference_variable(var);
1199 this->field = ralloc_strdup(this, field);
1200 this->type = this->record->type->field_type(field);
1201 }
1202
1203 bool
1204 ir_dereference::is_lvalue() const
1205 {
1206 ir_variable *var = this->variable_referenced();
1207
1208 /* Every l-value derference chain eventually ends in a variable.
1209 */
1210 if ((var == NULL) || var->read_only)
1211 return false;
1212
1213 /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
1214 *
1215 * "Samplers cannot be treated as l-values; hence cannot be used
1216 * as out or inout function parameters, nor can they be
1217 * assigned into."
1218 */
1219 if (this->type->contains_sampler())
1220 return false;
1221
1222 return true;
1223 }
1224
1225
1226 const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf", "txs" };
1227
1228 const char *ir_texture::opcode_string()
1229 {
1230 assert((unsigned int) op <=
1231 sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
1232 return tex_opcode_strs[op];
1233 }
1234
1235 ir_texture_opcode
1236 ir_texture::get_opcode(const char *str)
1237 {
1238 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
1239 for (int op = 0; op < count; op++) {
1240 if (strcmp(str, tex_opcode_strs[op]) == 0)
1241 return (ir_texture_opcode) op;
1242 }
1243 return (ir_texture_opcode) -1;
1244 }
1245
1246
1247 void
1248 ir_texture::set_sampler(ir_dereference *sampler, const glsl_type *type)
1249 {
1250 assert(sampler != NULL);
1251 assert(type != NULL);
1252 this->sampler = sampler;
1253 this->type = type;
1254
1255 if (this->op == ir_txs) {
1256 assert(type->base_type == GLSL_TYPE_INT);
1257 } else {
1258 assert(sampler->type->sampler_type == (int) type->base_type);
1259 if (sampler->type->sampler_shadow)
1260 assert(type->vector_elements == 4 || type->vector_elements == 1);
1261 else
1262 assert(type->vector_elements == 4);
1263 }
1264 }
1265
1266
1267 void
1268 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
1269 {
1270 assert((count >= 1) && (count <= 4));
1271
1272 memset(&this->mask, 0, sizeof(this->mask));
1273 this->mask.num_components = count;
1274
1275 unsigned dup_mask = 0;
1276 switch (count) {
1277 case 4:
1278 assert(comp[3] <= 3);
1279 dup_mask |= (1U << comp[3])
1280 & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
1281 this->mask.w = comp[3];
1282
1283 case 3:
1284 assert(comp[2] <= 3);
1285 dup_mask |= (1U << comp[2])
1286 & ((1U << comp[0]) | (1U << comp[1]));
1287 this->mask.z = comp[2];
1288
1289 case 2:
1290 assert(comp[1] <= 3);
1291 dup_mask |= (1U << comp[1])
1292 & ((1U << comp[0]));
1293 this->mask.y = comp[1];
1294
1295 case 1:
1296 assert(comp[0] <= 3);
1297 this->mask.x = comp[0];
1298 }
1299
1300 this->mask.has_duplicates = dup_mask != 0;
1301
1302 /* Based on the number of elements in the swizzle and the base type
1303 * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
1304 * generate the type of the resulting value.
1305 */
1306 type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
1307 }
1308
1309 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
1310 unsigned w, unsigned count)
1311 : val(val)
1312 {
1313 const unsigned components[4] = { x, y, z, w };
1314 this->ir_type = ir_type_swizzle;
1315 this->init_mask(components, count);
1316 }
1317
1318 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
1319 unsigned count)
1320 : val(val)
1321 {
1322 this->ir_type = ir_type_swizzle;
1323 this->init_mask(comp, count);
1324 }
1325
1326 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
1327 {
1328 this->ir_type = ir_type_swizzle;
1329 this->val = val;
1330 this->mask = mask;
1331 this->type = glsl_type::get_instance(val->type->base_type,
1332 mask.num_components, 1);
1333 }
1334
1335 #define X 1
1336 #define R 5
1337 #define S 9
1338 #define I 13
1339
1340 ir_swizzle *
1341 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
1342 {
1343 void *ctx = ralloc_parent(val);
1344
1345 /* For each possible swizzle character, this table encodes the value in
1346 * \c idx_map that represents the 0th element of the vector. For invalid
1347 * swizzle characters (e.g., 'k'), a special value is used that will allow
1348 * detection of errors.
1349 */
1350 static const unsigned char base_idx[26] = {
1351 /* a b c d e f g h i j k l m */
1352 R, R, I, I, I, I, R, I, I, I, I, I, I,
1353 /* n o p q r s t u v w x y z */
1354 I, I, S, S, R, S, S, I, I, X, X, X, X
1355 };
1356
1357 /* Each valid swizzle character has an entry in the previous table. This
1358 * table encodes the base index encoded in the previous table plus the actual
1359 * index of the swizzle character. When processing swizzles, the first
1360 * character in the string is indexed in the previous table. Each character
1361 * in the string is indexed in this table, and the value found there has the
1362 * value form the first table subtracted. The result must be on the range
1363 * [0,3].
1364 *
1365 * For example, the string "wzyx" will get X from the first table. Each of
1366 * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After
1367 * subtraction, the swizzle values are { 3, 2, 1, 0 }.
1368 *
1369 * The string "wzrg" will get X from the first table. Each of the characters
1370 * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the
1371 * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range
1372 * [0,3], the error is detected.
1373 */
1374 static const unsigned char idx_map[26] = {
1375 /* a b c d e f g h i j k l m */
1376 R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0,
1377 /* n o p q r s t u v w x y z */
1378 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2
1379 };
1380
1381 int swiz_idx[4] = { 0, 0, 0, 0 };
1382 unsigned i;
1383
1384
1385 /* Validate the first character in the swizzle string and look up the base
1386 * index value as described above.
1387 */
1388 if ((str[0] < 'a') || (str[0] > 'z'))
1389 return NULL;
1390
1391 const unsigned base = base_idx[str[0] - 'a'];
1392
1393
1394 for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
1395 /* Validate the next character, and, as described above, convert it to a
1396 * swizzle index.
1397 */
1398 if ((str[i] < 'a') || (str[i] > 'z'))
1399 return NULL;
1400
1401 swiz_idx[i] = idx_map[str[i] - 'a'] - base;
1402 if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
1403 return NULL;
1404 }
1405
1406 if (str[i] != '\0')
1407 return NULL;
1408
1409 return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
1410 swiz_idx[3], i);
1411 }
1412
1413 #undef X
1414 #undef R
1415 #undef S
1416 #undef I
1417
1418 ir_variable *
1419 ir_swizzle::variable_referenced() const
1420 {
1421 return this->val->variable_referenced();
1422 }
1423
1424
1425 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
1426 ir_variable_mode mode)
1427 : max_array_access(0), read_only(false), centroid(false), invariant(false),
1428 mode(mode), interpolation(INTERP_QUALIFIER_NONE)
1429 {
1430 this->ir_type = ir_type_variable;
1431 this->type = type;
1432 this->name = ralloc_strdup(this, name);
1433 this->explicit_location = false;
1434 this->has_initializer = false;
1435 this->location = -1;
1436 this->warn_extension = NULL;
1437 this->constant_value = NULL;
1438 this->constant_initializer = NULL;
1439 this->origin_upper_left = false;
1440 this->pixel_center_integer = false;
1441 this->depth_layout = ir_depth_layout_none;
1442 this->used = false;
1443
1444 if (type && type->base_type == GLSL_TYPE_SAMPLER)
1445 this->read_only = true;
1446 }
1447
1448
1449 const char *
1450 ir_variable::interpolation_string() const
1451 {
1452 switch (this->interpolation) {
1453 case INTERP_QUALIFIER_NONE: return "no";
1454 case INTERP_QUALIFIER_SMOOTH: return "smooth";
1455 case INTERP_QUALIFIER_FLAT: return "flat";
1456 case INTERP_QUALIFIER_NOPERSPECTIVE: return "noperspective";
1457 }
1458
1459 assert(!"Should not get here.");
1460 return "";
1461 }
1462
1463
1464 glsl_interp_qualifier
1465 ir_variable::determine_interpolation_mode(bool flat_shade)
1466 {
1467 if (this->interpolation != INTERP_QUALIFIER_NONE)
1468 return (glsl_interp_qualifier) this->interpolation;
1469 int location = this->location;
1470 bool is_gl_Color =
1471 location == FRAG_ATTRIB_COL0 || location == FRAG_ATTRIB_COL1;
1472 if (flat_shade && is_gl_Color)
1473 return INTERP_QUALIFIER_FLAT;
1474 else
1475 return INTERP_QUALIFIER_SMOOTH;
1476 }
1477
1478
1479 ir_function_signature::ir_function_signature(const glsl_type *return_type)
1480 : return_type(return_type), is_defined(false), _function(NULL)
1481 {
1482 this->ir_type = ir_type_function_signature;
1483 this->is_builtin = false;
1484 this->origin = NULL;
1485 }
1486
1487
1488 static bool
1489 modes_match(unsigned a, unsigned b)
1490 {
1491 if (a == b)
1492 return true;
1493
1494 /* Accept "in" vs. "const in" */
1495 if ((a == ir_var_const_in && b == ir_var_in) ||
1496 (b == ir_var_const_in && a == ir_var_in))
1497 return true;
1498
1499 return false;
1500 }
1501
1502
1503 const char *
1504 ir_function_signature::qualifiers_match(exec_list *params)
1505 {
1506 exec_list_iterator iter_a = parameters.iterator();
1507 exec_list_iterator iter_b = params->iterator();
1508
1509 /* check that the qualifiers match. */
1510 while (iter_a.has_next()) {
1511 ir_variable *a = (ir_variable *)iter_a.get();
1512 ir_variable *b = (ir_variable *)iter_b.get();
1513
1514 if (a->read_only != b->read_only ||
1515 !modes_match(a->mode, b->mode) ||
1516 a->interpolation != b->interpolation ||
1517 a->centroid != b->centroid) {
1518
1519 /* parameter a's qualifiers don't match */
1520 return a->name;
1521 }
1522
1523 iter_a.next();
1524 iter_b.next();
1525 }
1526 return NULL;
1527 }
1528
1529
1530 void
1531 ir_function_signature::replace_parameters(exec_list *new_params)
1532 {
1533 /* Destroy all of the previous parameter information. If the previous
1534 * parameter information comes from the function prototype, it may either
1535 * specify incorrect parameter names or not have names at all.
1536 */
1537 foreach_iter(exec_list_iterator, iter, parameters) {
1538 assert(((ir_instruction *) iter.get())->as_variable() != NULL);
1539
1540 iter.remove();
1541 }
1542
1543 new_params->move_nodes_to(&parameters);
1544 }
1545
1546
1547 ir_function::ir_function(const char *name)
1548 {
1549 this->ir_type = ir_type_function;
1550 this->name = ralloc_strdup(this, name);
1551 }
1552
1553
1554 bool
1555 ir_function::has_user_signature()
1556 {
1557 foreach_list(n, &this->signatures) {
1558 ir_function_signature *const sig = (ir_function_signature *) n;
1559 if (!sig->is_builtin)
1560 return true;
1561 }
1562 return false;
1563 }
1564
1565
1566 ir_rvalue *
1567 ir_rvalue::error_value(void *mem_ctx)
1568 {
1569 ir_rvalue *v = new(mem_ctx) ir_rvalue;
1570
1571 v->type = glsl_type::error_type;
1572 return v;
1573 }
1574
1575
1576 void
1577 visit_exec_list(exec_list *list, ir_visitor *visitor)
1578 {
1579 foreach_iter(exec_list_iterator, iter, *list) {
1580 ((ir_instruction *)iter.get())->accept(visitor);
1581 }
1582 }
1583
1584
1585 static void
1586 steal_memory(ir_instruction *ir, void *new_ctx)
1587 {
1588 ir_variable *var = ir->as_variable();
1589 ir_constant *constant = ir->as_constant();
1590 if (var != NULL && var->constant_value != NULL)
1591 steal_memory(var->constant_value, ir);
1592
1593 if (var != NULL && var->constant_initializer != NULL)
1594 steal_memory(var->constant_initializer, ir);
1595
1596 /* The components of aggregate constants are not visited by the normal
1597 * visitor, so steal their values by hand.
1598 */
1599 if (constant != NULL) {
1600 if (constant->type->is_record()) {
1601 foreach_iter(exec_list_iterator, iter, constant->components) {
1602 ir_constant *field = (ir_constant *)iter.get();
1603 steal_memory(field, ir);
1604 }
1605 } else if (constant->type->is_array()) {
1606 for (unsigned int i = 0; i < constant->type->length; i++) {
1607 steal_memory(constant->array_elements[i], ir);
1608 }
1609 }
1610 }
1611
1612 ralloc_steal(new_ctx, ir);
1613 }
1614
1615
1616 void
1617 reparent_ir(exec_list *list, void *mem_ctx)
1618 {
1619 foreach_list(node, list) {
1620 visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
1621 }
1622 }
1623
1624
1625 static ir_rvalue *
1626 try_min_one(ir_rvalue *ir)
1627 {
1628 ir_expression *expr = ir->as_expression();
1629
1630 if (!expr || expr->operation != ir_binop_min)
1631 return NULL;
1632
1633 if (expr->operands[0]->is_one())
1634 return expr->operands[1];
1635
1636 if (expr->operands[1]->is_one())
1637 return expr->operands[0];
1638
1639 return NULL;
1640 }
1641
1642 static ir_rvalue *
1643 try_max_zero(ir_rvalue *ir)
1644 {
1645 ir_expression *expr = ir->as_expression();
1646
1647 if (!expr || expr->operation != ir_binop_max)
1648 return NULL;
1649
1650 if (expr->operands[0]->is_zero())
1651 return expr->operands[1];
1652
1653 if (expr->operands[1]->is_zero())
1654 return expr->operands[0];
1655
1656 return NULL;
1657 }
1658
1659 ir_rvalue *
1660 ir_rvalue::as_rvalue_to_saturate()
1661 {
1662 ir_expression *expr = this->as_expression();
1663
1664 if (!expr)
1665 return NULL;
1666
1667 ir_rvalue *max_zero = try_max_zero(expr);
1668 if (max_zero) {
1669 return try_min_one(max_zero);
1670 } else {
1671 ir_rvalue *min_one = try_min_one(expr);
1672 if (min_one) {
1673 return try_max_zero(min_one);
1674 }
1675 }
1676
1677 return NULL;
1678 }