c489547fa52672efd2d3c26aa68fa84782f52894
[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 "bitcast_i2f",
431 "bitcast_f2i",
432 "bitcast_u2f",
433 "bitcast_f2u",
434 "any",
435 "trunc",
436 "ceil",
437 "floor",
438 "fract",
439 "round_even",
440 "sin",
441 "cos",
442 "sin_reduced",
443 "cos_reduced",
444 "dFdx",
445 "dFdy",
446 "noise",
447 "+",
448 "-",
449 "*",
450 "/",
451 "%",
452 "<",
453 ">",
454 "<=",
455 ">=",
456 "==",
457 "!=",
458 "all_equal",
459 "any_nequal",
460 "<<",
461 ">>",
462 "&",
463 "^",
464 "|",
465 "&&",
466 "^^",
467 "||",
468 "dot",
469 "min",
470 "max",
471 "pow",
472 "vector",
473 };
474
475 const char *ir_expression::operator_string(ir_expression_operation op)
476 {
477 assert((unsigned int) op < Elements(operator_strs));
478 assert(Elements(operator_strs) == (ir_quadop_vector + 1));
479 return operator_strs[op];
480 }
481
482 const char *ir_expression::operator_string()
483 {
484 return operator_string(this->operation);
485 }
486
487 const char*
488 depth_layout_string(ir_depth_layout layout)
489 {
490 switch(layout) {
491 case ir_depth_layout_none: return "";
492 case ir_depth_layout_any: return "depth_any";
493 case ir_depth_layout_greater: return "depth_greater";
494 case ir_depth_layout_less: return "depth_less";
495 case ir_depth_layout_unchanged: return "depth_unchanged";
496
497 default:
498 assert(0);
499 return "";
500 }
501 }
502
503 ir_expression_operation
504 ir_expression::get_operator(const char *str)
505 {
506 const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
507 for (int op = 0; op < operator_count; op++) {
508 if (strcmp(str, operator_strs[op]) == 0)
509 return (ir_expression_operation) op;
510 }
511 return (ir_expression_operation) -1;
512 }
513
514 ir_constant::ir_constant()
515 {
516 this->ir_type = ir_type_constant;
517 }
518
519 ir_constant::ir_constant(const struct glsl_type *type,
520 const ir_constant_data *data)
521 {
522 assert((type->base_type >= GLSL_TYPE_UINT)
523 && (type->base_type <= GLSL_TYPE_BOOL));
524
525 this->ir_type = ir_type_constant;
526 this->type = type;
527 memcpy(& this->value, data, sizeof(this->value));
528 }
529
530 ir_constant::ir_constant(float f)
531 {
532 this->ir_type = ir_type_constant;
533 this->type = glsl_type::float_type;
534 this->value.f[0] = f;
535 for (int i = 1; i < 16; i++) {
536 this->value.f[i] = 0;
537 }
538 }
539
540 ir_constant::ir_constant(unsigned int u)
541 {
542 this->ir_type = ir_type_constant;
543 this->type = glsl_type::uint_type;
544 this->value.u[0] = u;
545 for (int i = 1; i < 16; i++) {
546 this->value.u[i] = 0;
547 }
548 }
549
550 ir_constant::ir_constant(int i)
551 {
552 this->ir_type = ir_type_constant;
553 this->type = glsl_type::int_type;
554 this->value.i[0] = i;
555 for (int i = 1; i < 16; i++) {
556 this->value.i[i] = 0;
557 }
558 }
559
560 ir_constant::ir_constant(bool b)
561 {
562 this->ir_type = ir_type_constant;
563 this->type = glsl_type::bool_type;
564 this->value.b[0] = b;
565 for (int i = 1; i < 16; i++) {
566 this->value.b[i] = false;
567 }
568 }
569
570 ir_constant::ir_constant(const ir_constant *c, unsigned i)
571 {
572 this->ir_type = ir_type_constant;
573 this->type = c->type->get_base_type();
574
575 switch (this->type->base_type) {
576 case GLSL_TYPE_UINT: this->value.u[0] = c->value.u[i]; break;
577 case GLSL_TYPE_INT: this->value.i[0] = c->value.i[i]; break;
578 case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
579 case GLSL_TYPE_BOOL: this->value.b[0] = c->value.b[i]; break;
580 default: assert(!"Should not get here."); break;
581 }
582 }
583
584 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
585 {
586 this->ir_type = ir_type_constant;
587 this->type = type;
588
589 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
590 || type->is_record() || type->is_array());
591
592 if (type->is_array()) {
593 this->array_elements = ralloc_array(this, ir_constant *, type->length);
594 unsigned i = 0;
595 foreach_list(node, value_list) {
596 ir_constant *value = (ir_constant *) node;
597 assert(value->as_constant() != NULL);
598
599 this->array_elements[i++] = value;
600 }
601 return;
602 }
603
604 /* If the constant is a record, the types of each of the entries in
605 * value_list must be a 1-for-1 match with the structure components. Each
606 * entry must also be a constant. Just move the nodes from the value_list
607 * to the list in the ir_constant.
608 */
609 /* FINISHME: Should there be some type checking and / or assertions here? */
610 /* FINISHME: Should the new constant take ownership of the nodes from
611 * FINISHME: value_list, or should it make copies?
612 */
613 if (type->is_record()) {
614 value_list->move_nodes_to(& this->components);
615 return;
616 }
617
618 for (unsigned i = 0; i < 16; i++) {
619 this->value.u[i] = 0;
620 }
621
622 ir_constant *value = (ir_constant *) (value_list->head);
623
624 /* Constructors with exactly one scalar argument are special for vectors
625 * and matrices. For vectors, the scalar value is replicated to fill all
626 * the components. For matrices, the scalar fills the components of the
627 * diagonal while the rest is filled with 0.
628 */
629 if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
630 if (type->is_matrix()) {
631 /* Matrix - fill diagonal (rest is already set to 0) */
632 assert(type->base_type == GLSL_TYPE_FLOAT);
633 for (unsigned i = 0; i < type->matrix_columns; i++)
634 this->value.f[i * type->vector_elements + i] = value->value.f[0];
635 } else {
636 /* Vector or scalar - fill all components */
637 switch (type->base_type) {
638 case GLSL_TYPE_UINT:
639 case GLSL_TYPE_INT:
640 for (unsigned i = 0; i < type->components(); i++)
641 this->value.u[i] = value->value.u[0];
642 break;
643 case GLSL_TYPE_FLOAT:
644 for (unsigned i = 0; i < type->components(); i++)
645 this->value.f[i] = value->value.f[0];
646 break;
647 case GLSL_TYPE_BOOL:
648 for (unsigned i = 0; i < type->components(); i++)
649 this->value.b[i] = value->value.b[0];
650 break;
651 default:
652 assert(!"Should not get here.");
653 break;
654 }
655 }
656 return;
657 }
658
659 if (type->is_matrix() && value->type->is_matrix()) {
660 assert(value->next->is_tail_sentinel());
661
662 /* From section 5.4.2 of the GLSL 1.20 spec:
663 * "If a matrix is constructed from a matrix, then each component
664 * (column i, row j) in the result that has a corresponding component
665 * (column i, row j) in the argument will be initialized from there."
666 */
667 unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
668 unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
669 for (unsigned i = 0; i < cols; i++) {
670 for (unsigned j = 0; j < rows; j++) {
671 const unsigned src = i * value->type->vector_elements + j;
672 const unsigned dst = i * type->vector_elements + j;
673 this->value.f[dst] = value->value.f[src];
674 }
675 }
676
677 /* "All other components will be initialized to the identity matrix." */
678 for (unsigned i = cols; i < type->matrix_columns; i++)
679 this->value.f[i * type->vector_elements + i] = 1.0;
680
681 return;
682 }
683
684 /* Use each component from each entry in the value_list to initialize one
685 * component of the constant being constructed.
686 */
687 for (unsigned i = 0; i < type->components(); /* empty */) {
688 assert(value->as_constant() != NULL);
689 assert(!value->is_tail_sentinel());
690
691 for (unsigned j = 0; j < value->type->components(); j++) {
692 switch (type->base_type) {
693 case GLSL_TYPE_UINT:
694 this->value.u[i] = value->get_uint_component(j);
695 break;
696 case GLSL_TYPE_INT:
697 this->value.i[i] = value->get_int_component(j);
698 break;
699 case GLSL_TYPE_FLOAT:
700 this->value.f[i] = value->get_float_component(j);
701 break;
702 case GLSL_TYPE_BOOL:
703 this->value.b[i] = value->get_bool_component(j);
704 break;
705 default:
706 /* FINISHME: What to do? Exceptions are not the answer.
707 */
708 break;
709 }
710
711 i++;
712 if (i >= type->components())
713 break;
714 }
715
716 value = (ir_constant *) value->next;
717 }
718 }
719
720 ir_constant *
721 ir_constant::zero(void *mem_ctx, const glsl_type *type)
722 {
723 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
724 || type->is_record() || type->is_array());
725
726 ir_constant *c = new(mem_ctx) ir_constant;
727 c->type = type;
728 memset(&c->value, 0, sizeof(c->value));
729
730 if (type->is_array()) {
731 c->array_elements = ralloc_array(c, ir_constant *, type->length);
732
733 for (unsigned i = 0; i < type->length; i++)
734 c->array_elements[i] = ir_constant::zero(c, type->element_type());
735 }
736
737 if (type->is_record()) {
738 for (unsigned i = 0; i < type->length; i++) {
739 ir_constant *comp = ir_constant::zero(mem_ctx, type->fields.structure[i].type);
740 c->components.push_tail(comp);
741 }
742 }
743
744 return c;
745 }
746
747 bool
748 ir_constant::get_bool_component(unsigned i) const
749 {
750 switch (this->type->base_type) {
751 case GLSL_TYPE_UINT: return this->value.u[i] != 0;
752 case GLSL_TYPE_INT: return this->value.i[i] != 0;
753 case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
754 case GLSL_TYPE_BOOL: return this->value.b[i];
755 default: assert(!"Should not get here."); break;
756 }
757
758 /* Must return something to make the compiler happy. This is clearly an
759 * error case.
760 */
761 return false;
762 }
763
764 float
765 ir_constant::get_float_component(unsigned i) const
766 {
767 switch (this->type->base_type) {
768 case GLSL_TYPE_UINT: return (float) this->value.u[i];
769 case GLSL_TYPE_INT: return (float) this->value.i[i];
770 case GLSL_TYPE_FLOAT: return this->value.f[i];
771 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0 : 0.0;
772 default: assert(!"Should not get here."); break;
773 }
774
775 /* Must return something to make the compiler happy. This is clearly an
776 * error case.
777 */
778 return 0.0;
779 }
780
781 int
782 ir_constant::get_int_component(unsigned i) const
783 {
784 switch (this->type->base_type) {
785 case GLSL_TYPE_UINT: return this->value.u[i];
786 case GLSL_TYPE_INT: return this->value.i[i];
787 case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
788 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
789 default: assert(!"Should not get here."); break;
790 }
791
792 /* Must return something to make the compiler happy. This is clearly an
793 * error case.
794 */
795 return 0;
796 }
797
798 unsigned
799 ir_constant::get_uint_component(unsigned i) const
800 {
801 switch (this->type->base_type) {
802 case GLSL_TYPE_UINT: return this->value.u[i];
803 case GLSL_TYPE_INT: return this->value.i[i];
804 case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
805 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
806 default: assert(!"Should not get here."); break;
807 }
808
809 /* Must return something to make the compiler happy. This is clearly an
810 * error case.
811 */
812 return 0;
813 }
814
815 ir_constant *
816 ir_constant::get_array_element(unsigned i) const
817 {
818 assert(this->type->is_array());
819
820 /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
821 *
822 * "Behavior is undefined if a shader subscripts an array with an index
823 * less than 0 or greater than or equal to the size the array was
824 * declared with."
825 *
826 * Most out-of-bounds accesses are removed before things could get this far.
827 * There are cases where non-constant array index values can get constant
828 * folded.
829 */
830 if (int(i) < 0)
831 i = 0;
832 else if (i >= this->type->length)
833 i = this->type->length - 1;
834
835 return array_elements[i];
836 }
837
838 ir_constant *
839 ir_constant::get_record_field(const char *name)
840 {
841 int idx = this->type->field_index(name);
842
843 if (idx < 0)
844 return NULL;
845
846 if (this->components.is_empty())
847 return NULL;
848
849 exec_node *node = this->components.head;
850 for (int i = 0; i < idx; i++) {
851 node = node->next;
852
853 /* If the end of the list is encountered before the element matching the
854 * requested field is found, return NULL.
855 */
856 if (node->is_tail_sentinel())
857 return NULL;
858 }
859
860 return (ir_constant *) node;
861 }
862
863 void
864 ir_constant::copy_offset(ir_constant *src, int offset)
865 {
866 switch (this->type->base_type) {
867 case GLSL_TYPE_UINT:
868 case GLSL_TYPE_INT:
869 case GLSL_TYPE_FLOAT:
870 case GLSL_TYPE_BOOL: {
871 unsigned int size = src->type->components();
872 assert (size <= this->type->components() - offset);
873 for (unsigned int i=0; i<size; i++) {
874 switch (this->type->base_type) {
875 case GLSL_TYPE_UINT:
876 value.u[i+offset] = src->get_uint_component(i);
877 break;
878 case GLSL_TYPE_INT:
879 value.i[i+offset] = src->get_int_component(i);
880 break;
881 case GLSL_TYPE_FLOAT:
882 value.f[i+offset] = src->get_float_component(i);
883 break;
884 case GLSL_TYPE_BOOL:
885 value.b[i+offset] = src->get_bool_component(i);
886 break;
887 default: // Shut up the compiler
888 break;
889 }
890 }
891 break;
892 }
893
894 case GLSL_TYPE_STRUCT: {
895 assert (src->type == this->type);
896 this->components.make_empty();
897 foreach_list(node, &src->components) {
898 ir_constant *const orig = (ir_constant *) node;
899
900 this->components.push_tail(orig->clone(this, NULL));
901 }
902 break;
903 }
904
905 case GLSL_TYPE_ARRAY: {
906 assert (src->type == this->type);
907 for (unsigned i = 0; i < this->type->length; i++) {
908 this->array_elements[i] = src->array_elements[i]->clone(this, NULL);
909 }
910 break;
911 }
912
913 default:
914 assert(!"Should not get here.");
915 break;
916 }
917 }
918
919 void
920 ir_constant::copy_masked_offset(ir_constant *src, int offset, unsigned int mask)
921 {
922 assert (!type->is_array() && !type->is_record());
923
924 if (!type->is_vector() && !type->is_matrix()) {
925 offset = 0;
926 mask = 1;
927 }
928
929 int id = 0;
930 for (int i=0; i<4; i++) {
931 if (mask & (1 << i)) {
932 switch (this->type->base_type) {
933 case GLSL_TYPE_UINT:
934 value.u[i+offset] = src->get_uint_component(id++);
935 break;
936 case GLSL_TYPE_INT:
937 value.i[i+offset] = src->get_int_component(id++);
938 break;
939 case GLSL_TYPE_FLOAT:
940 value.f[i+offset] = src->get_float_component(id++);
941 break;
942 case GLSL_TYPE_BOOL:
943 value.b[i+offset] = src->get_bool_component(id++);
944 break;
945 default:
946 assert(!"Should not get here.");
947 return;
948 }
949 }
950 }
951 }
952
953 bool
954 ir_constant::has_value(const ir_constant *c) const
955 {
956 if (this->type != c->type)
957 return false;
958
959 if (this->type->is_array()) {
960 for (unsigned i = 0; i < this->type->length; i++) {
961 if (!this->array_elements[i]->has_value(c->array_elements[i]))
962 return false;
963 }
964 return true;
965 }
966
967 if (this->type->base_type == GLSL_TYPE_STRUCT) {
968 const exec_node *a_node = this->components.head;
969 const exec_node *b_node = c->components.head;
970
971 while (!a_node->is_tail_sentinel()) {
972 assert(!b_node->is_tail_sentinel());
973
974 const ir_constant *const a_field = (ir_constant *) a_node;
975 const ir_constant *const b_field = (ir_constant *) b_node;
976
977 if (!a_field->has_value(b_field))
978 return false;
979
980 a_node = a_node->next;
981 b_node = b_node->next;
982 }
983
984 return true;
985 }
986
987 for (unsigned i = 0; i < this->type->components(); i++) {
988 switch (this->type->base_type) {
989 case GLSL_TYPE_UINT:
990 if (this->value.u[i] != c->value.u[i])
991 return false;
992 break;
993 case GLSL_TYPE_INT:
994 if (this->value.i[i] != c->value.i[i])
995 return false;
996 break;
997 case GLSL_TYPE_FLOAT:
998 if (this->value.f[i] != c->value.f[i])
999 return false;
1000 break;
1001 case GLSL_TYPE_BOOL:
1002 if (this->value.b[i] != c->value.b[i])
1003 return false;
1004 break;
1005 default:
1006 assert(!"Should not get here.");
1007 return false;
1008 }
1009 }
1010
1011 return true;
1012 }
1013
1014 bool
1015 ir_constant::is_zero() const
1016 {
1017 if (!this->type->is_scalar() && !this->type->is_vector())
1018 return false;
1019
1020 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1021 switch (this->type->base_type) {
1022 case GLSL_TYPE_FLOAT:
1023 if (this->value.f[c] != 0.0)
1024 return false;
1025 break;
1026 case GLSL_TYPE_INT:
1027 if (this->value.i[c] != 0)
1028 return false;
1029 break;
1030 case GLSL_TYPE_UINT:
1031 if (this->value.u[c] != 0)
1032 return false;
1033 break;
1034 case GLSL_TYPE_BOOL:
1035 if (this->value.b[c] != false)
1036 return false;
1037 break;
1038 default:
1039 /* The only other base types are structures, arrays, and samplers.
1040 * Samplers cannot be constants, and the others should have been
1041 * filtered out above.
1042 */
1043 assert(!"Should not get here.");
1044 return false;
1045 }
1046 }
1047
1048 return true;
1049 }
1050
1051 bool
1052 ir_constant::is_one() const
1053 {
1054 if (!this->type->is_scalar() && !this->type->is_vector())
1055 return false;
1056
1057 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1058 switch (this->type->base_type) {
1059 case GLSL_TYPE_FLOAT:
1060 if (this->value.f[c] != 1.0)
1061 return false;
1062 break;
1063 case GLSL_TYPE_INT:
1064 if (this->value.i[c] != 1)
1065 return false;
1066 break;
1067 case GLSL_TYPE_UINT:
1068 if (this->value.u[c] != 1)
1069 return false;
1070 break;
1071 case GLSL_TYPE_BOOL:
1072 if (this->value.b[c] != true)
1073 return false;
1074 break;
1075 default:
1076 /* The only other base types are structures, arrays, and samplers.
1077 * Samplers cannot be constants, and the others should have been
1078 * filtered out above.
1079 */
1080 assert(!"Should not get here.");
1081 return false;
1082 }
1083 }
1084
1085 return true;
1086 }
1087
1088 bool
1089 ir_constant::is_negative_one() const
1090 {
1091 if (!this->type->is_scalar() && !this->type->is_vector())
1092 return false;
1093
1094 if (this->type->is_boolean())
1095 return false;
1096
1097 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1098 switch (this->type->base_type) {
1099 case GLSL_TYPE_FLOAT:
1100 if (this->value.f[c] != -1.0)
1101 return false;
1102 break;
1103 case GLSL_TYPE_INT:
1104 if (this->value.i[c] != -1)
1105 return false;
1106 break;
1107 case GLSL_TYPE_UINT:
1108 if (int(this->value.u[c]) != -1)
1109 return false;
1110 break;
1111 default:
1112 /* The only other base types are structures, arrays, samplers, and
1113 * booleans. Samplers cannot be constants, and the others should
1114 * have been filtered out above.
1115 */
1116 assert(!"Should not get here.");
1117 return false;
1118 }
1119 }
1120
1121 return true;
1122 }
1123
1124 ir_loop::ir_loop()
1125 {
1126 this->ir_type = ir_type_loop;
1127 this->cmp = ir_unop_neg;
1128 this->from = NULL;
1129 this->to = NULL;
1130 this->increment = NULL;
1131 this->counter = NULL;
1132 }
1133
1134
1135 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
1136 {
1137 assert(var != NULL);
1138
1139 this->ir_type = ir_type_dereference_variable;
1140 this->var = var;
1141 this->type = var->type;
1142 }
1143
1144
1145 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
1146 ir_rvalue *array_index)
1147 {
1148 this->ir_type = ir_type_dereference_array;
1149 this->array_index = array_index;
1150 this->set_array(value);
1151 }
1152
1153
1154 ir_dereference_array::ir_dereference_array(ir_variable *var,
1155 ir_rvalue *array_index)
1156 {
1157 void *ctx = ralloc_parent(var);
1158
1159 this->ir_type = ir_type_dereference_array;
1160 this->array_index = array_index;
1161 this->set_array(new(ctx) ir_dereference_variable(var));
1162 }
1163
1164
1165 void
1166 ir_dereference_array::set_array(ir_rvalue *value)
1167 {
1168 assert(value != NULL);
1169
1170 this->array = value;
1171
1172 const glsl_type *const vt = this->array->type;
1173
1174 if (vt->is_array()) {
1175 type = vt->element_type();
1176 } else if (vt->is_matrix()) {
1177 type = vt->column_type();
1178 } else if (vt->is_vector()) {
1179 type = vt->get_base_type();
1180 }
1181 }
1182
1183
1184 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
1185 const char *field)
1186 {
1187 assert(value != NULL);
1188
1189 this->ir_type = ir_type_dereference_record;
1190 this->record = value;
1191 this->field = ralloc_strdup(this, field);
1192 this->type = this->record->type->field_type(field);
1193 }
1194
1195
1196 ir_dereference_record::ir_dereference_record(ir_variable *var,
1197 const char *field)
1198 {
1199 void *ctx = ralloc_parent(var);
1200
1201 this->ir_type = ir_type_dereference_record;
1202 this->record = new(ctx) ir_dereference_variable(var);
1203 this->field = ralloc_strdup(this, field);
1204 this->type = this->record->type->field_type(field);
1205 }
1206
1207 bool
1208 ir_dereference::is_lvalue() const
1209 {
1210 ir_variable *var = this->variable_referenced();
1211
1212 /* Every l-value derference chain eventually ends in a variable.
1213 */
1214 if ((var == NULL) || var->read_only)
1215 return false;
1216
1217 /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
1218 *
1219 * "Samplers cannot be treated as l-values; hence cannot be used
1220 * as out or inout function parameters, nor can they be
1221 * assigned into."
1222 */
1223 if (this->type->contains_sampler())
1224 return false;
1225
1226 return true;
1227 }
1228
1229
1230 const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf", "txs" };
1231
1232 const char *ir_texture::opcode_string()
1233 {
1234 assert((unsigned int) op <=
1235 sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
1236 return tex_opcode_strs[op];
1237 }
1238
1239 ir_texture_opcode
1240 ir_texture::get_opcode(const char *str)
1241 {
1242 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
1243 for (int op = 0; op < count; op++) {
1244 if (strcmp(str, tex_opcode_strs[op]) == 0)
1245 return (ir_texture_opcode) op;
1246 }
1247 return (ir_texture_opcode) -1;
1248 }
1249
1250
1251 void
1252 ir_texture::set_sampler(ir_dereference *sampler, const glsl_type *type)
1253 {
1254 assert(sampler != NULL);
1255 assert(type != NULL);
1256 this->sampler = sampler;
1257 this->type = type;
1258
1259 if (this->op == ir_txs) {
1260 assert(type->base_type == GLSL_TYPE_INT);
1261 } else {
1262 assert(sampler->type->sampler_type == (int) type->base_type);
1263 if (sampler->type->sampler_shadow)
1264 assert(type->vector_elements == 4 || type->vector_elements == 1);
1265 else
1266 assert(type->vector_elements == 4);
1267 }
1268 }
1269
1270
1271 void
1272 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
1273 {
1274 assert((count >= 1) && (count <= 4));
1275
1276 memset(&this->mask, 0, sizeof(this->mask));
1277 this->mask.num_components = count;
1278
1279 unsigned dup_mask = 0;
1280 switch (count) {
1281 case 4:
1282 assert(comp[3] <= 3);
1283 dup_mask |= (1U << comp[3])
1284 & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
1285 this->mask.w = comp[3];
1286
1287 case 3:
1288 assert(comp[2] <= 3);
1289 dup_mask |= (1U << comp[2])
1290 & ((1U << comp[0]) | (1U << comp[1]));
1291 this->mask.z = comp[2];
1292
1293 case 2:
1294 assert(comp[1] <= 3);
1295 dup_mask |= (1U << comp[1])
1296 & ((1U << comp[0]));
1297 this->mask.y = comp[1];
1298
1299 case 1:
1300 assert(comp[0] <= 3);
1301 this->mask.x = comp[0];
1302 }
1303
1304 this->mask.has_duplicates = dup_mask != 0;
1305
1306 /* Based on the number of elements in the swizzle and the base type
1307 * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
1308 * generate the type of the resulting value.
1309 */
1310 type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
1311 }
1312
1313 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
1314 unsigned w, unsigned count)
1315 : val(val)
1316 {
1317 const unsigned components[4] = { x, y, z, w };
1318 this->ir_type = ir_type_swizzle;
1319 this->init_mask(components, count);
1320 }
1321
1322 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
1323 unsigned count)
1324 : val(val)
1325 {
1326 this->ir_type = ir_type_swizzle;
1327 this->init_mask(comp, count);
1328 }
1329
1330 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
1331 {
1332 this->ir_type = ir_type_swizzle;
1333 this->val = val;
1334 this->mask = mask;
1335 this->type = glsl_type::get_instance(val->type->base_type,
1336 mask.num_components, 1);
1337 }
1338
1339 #define X 1
1340 #define R 5
1341 #define S 9
1342 #define I 13
1343
1344 ir_swizzle *
1345 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
1346 {
1347 void *ctx = ralloc_parent(val);
1348
1349 /* For each possible swizzle character, this table encodes the value in
1350 * \c idx_map that represents the 0th element of the vector. For invalid
1351 * swizzle characters (e.g., 'k'), a special value is used that will allow
1352 * detection of errors.
1353 */
1354 static const unsigned char base_idx[26] = {
1355 /* a b c d e f g h i j k l m */
1356 R, R, I, I, I, I, R, I, I, I, I, I, I,
1357 /* n o p q r s t u v w x y z */
1358 I, I, S, S, R, S, S, I, I, X, X, X, X
1359 };
1360
1361 /* Each valid swizzle character has an entry in the previous table. This
1362 * table encodes the base index encoded in the previous table plus the actual
1363 * index of the swizzle character. When processing swizzles, the first
1364 * character in the string is indexed in the previous table. Each character
1365 * in the string is indexed in this table, and the value found there has the
1366 * value form the first table subtracted. The result must be on the range
1367 * [0,3].
1368 *
1369 * For example, the string "wzyx" will get X from the first table. Each of
1370 * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After
1371 * subtraction, the swizzle values are { 3, 2, 1, 0 }.
1372 *
1373 * The string "wzrg" will get X from the first table. Each of the characters
1374 * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the
1375 * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range
1376 * [0,3], the error is detected.
1377 */
1378 static const unsigned char idx_map[26] = {
1379 /* a b c d e f g h i j k l m */
1380 R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0,
1381 /* n o p q r s t u v w x y z */
1382 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2
1383 };
1384
1385 int swiz_idx[4] = { 0, 0, 0, 0 };
1386 unsigned i;
1387
1388
1389 /* Validate the first character in the swizzle string and look up the base
1390 * index value as described above.
1391 */
1392 if ((str[0] < 'a') || (str[0] > 'z'))
1393 return NULL;
1394
1395 const unsigned base = base_idx[str[0] - 'a'];
1396
1397
1398 for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
1399 /* Validate the next character, and, as described above, convert it to a
1400 * swizzle index.
1401 */
1402 if ((str[i] < 'a') || (str[i] > 'z'))
1403 return NULL;
1404
1405 swiz_idx[i] = idx_map[str[i] - 'a'] - base;
1406 if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
1407 return NULL;
1408 }
1409
1410 if (str[i] != '\0')
1411 return NULL;
1412
1413 return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
1414 swiz_idx[3], i);
1415 }
1416
1417 #undef X
1418 #undef R
1419 #undef S
1420 #undef I
1421
1422 ir_variable *
1423 ir_swizzle::variable_referenced() const
1424 {
1425 return this->val->variable_referenced();
1426 }
1427
1428
1429 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
1430 ir_variable_mode mode)
1431 : max_array_access(0), read_only(false), centroid(false), invariant(false),
1432 mode(mode), interpolation(INTERP_QUALIFIER_NONE)
1433 {
1434 this->ir_type = ir_type_variable;
1435 this->type = type;
1436 this->name = ralloc_strdup(this, name);
1437 this->explicit_location = false;
1438 this->has_initializer = false;
1439 this->location = -1;
1440 this->warn_extension = NULL;
1441 this->constant_value = NULL;
1442 this->constant_initializer = NULL;
1443 this->origin_upper_left = false;
1444 this->pixel_center_integer = false;
1445 this->depth_layout = ir_depth_layout_none;
1446 this->used = false;
1447
1448 if (type && type->base_type == GLSL_TYPE_SAMPLER)
1449 this->read_only = true;
1450 }
1451
1452
1453 const char *
1454 ir_variable::interpolation_string() const
1455 {
1456 switch (this->interpolation) {
1457 case INTERP_QUALIFIER_NONE: return "no";
1458 case INTERP_QUALIFIER_SMOOTH: return "smooth";
1459 case INTERP_QUALIFIER_FLAT: return "flat";
1460 case INTERP_QUALIFIER_NOPERSPECTIVE: return "noperspective";
1461 }
1462
1463 assert(!"Should not get here.");
1464 return "";
1465 }
1466
1467
1468 glsl_interp_qualifier
1469 ir_variable::determine_interpolation_mode(bool flat_shade)
1470 {
1471 if (this->interpolation != INTERP_QUALIFIER_NONE)
1472 return (glsl_interp_qualifier) this->interpolation;
1473 int location = this->location;
1474 bool is_gl_Color =
1475 location == FRAG_ATTRIB_COL0 || location == FRAG_ATTRIB_COL1;
1476 if (flat_shade && is_gl_Color)
1477 return INTERP_QUALIFIER_FLAT;
1478 else
1479 return INTERP_QUALIFIER_SMOOTH;
1480 }
1481
1482
1483 ir_function_signature::ir_function_signature(const glsl_type *return_type)
1484 : return_type(return_type), is_defined(false), _function(NULL)
1485 {
1486 this->ir_type = ir_type_function_signature;
1487 this->is_builtin = false;
1488 this->origin = NULL;
1489 }
1490
1491
1492 static bool
1493 modes_match(unsigned a, unsigned b)
1494 {
1495 if (a == b)
1496 return true;
1497
1498 /* Accept "in" vs. "const in" */
1499 if ((a == ir_var_const_in && b == ir_var_in) ||
1500 (b == ir_var_const_in && a == ir_var_in))
1501 return true;
1502
1503 return false;
1504 }
1505
1506
1507 const char *
1508 ir_function_signature::qualifiers_match(exec_list *params)
1509 {
1510 exec_list_iterator iter_a = parameters.iterator();
1511 exec_list_iterator iter_b = params->iterator();
1512
1513 /* check that the qualifiers match. */
1514 while (iter_a.has_next()) {
1515 ir_variable *a = (ir_variable *)iter_a.get();
1516 ir_variable *b = (ir_variable *)iter_b.get();
1517
1518 if (a->read_only != b->read_only ||
1519 !modes_match(a->mode, b->mode) ||
1520 a->interpolation != b->interpolation ||
1521 a->centroid != b->centroid) {
1522
1523 /* parameter a's qualifiers don't match */
1524 return a->name;
1525 }
1526
1527 iter_a.next();
1528 iter_b.next();
1529 }
1530 return NULL;
1531 }
1532
1533
1534 void
1535 ir_function_signature::replace_parameters(exec_list *new_params)
1536 {
1537 /* Destroy all of the previous parameter information. If the previous
1538 * parameter information comes from the function prototype, it may either
1539 * specify incorrect parameter names or not have names at all.
1540 */
1541 foreach_iter(exec_list_iterator, iter, parameters) {
1542 assert(((ir_instruction *) iter.get())->as_variable() != NULL);
1543
1544 iter.remove();
1545 }
1546
1547 new_params->move_nodes_to(&parameters);
1548 }
1549
1550
1551 ir_function::ir_function(const char *name)
1552 {
1553 this->ir_type = ir_type_function;
1554 this->name = ralloc_strdup(this, name);
1555 }
1556
1557
1558 bool
1559 ir_function::has_user_signature()
1560 {
1561 foreach_list(n, &this->signatures) {
1562 ir_function_signature *const sig = (ir_function_signature *) n;
1563 if (!sig->is_builtin)
1564 return true;
1565 }
1566 return false;
1567 }
1568
1569
1570 ir_rvalue *
1571 ir_rvalue::error_value(void *mem_ctx)
1572 {
1573 ir_rvalue *v = new(mem_ctx) ir_rvalue;
1574
1575 v->type = glsl_type::error_type;
1576 return v;
1577 }
1578
1579
1580 void
1581 visit_exec_list(exec_list *list, ir_visitor *visitor)
1582 {
1583 foreach_iter(exec_list_iterator, iter, *list) {
1584 ((ir_instruction *)iter.get())->accept(visitor);
1585 }
1586 }
1587
1588
1589 static void
1590 steal_memory(ir_instruction *ir, void *new_ctx)
1591 {
1592 ir_variable *var = ir->as_variable();
1593 ir_constant *constant = ir->as_constant();
1594 if (var != NULL && var->constant_value != NULL)
1595 steal_memory(var->constant_value, ir);
1596
1597 if (var != NULL && var->constant_initializer != NULL)
1598 steal_memory(var->constant_initializer, ir);
1599
1600 /* The components of aggregate constants are not visited by the normal
1601 * visitor, so steal their values by hand.
1602 */
1603 if (constant != NULL) {
1604 if (constant->type->is_record()) {
1605 foreach_iter(exec_list_iterator, iter, constant->components) {
1606 ir_constant *field = (ir_constant *)iter.get();
1607 steal_memory(field, ir);
1608 }
1609 } else if (constant->type->is_array()) {
1610 for (unsigned int i = 0; i < constant->type->length; i++) {
1611 steal_memory(constant->array_elements[i], ir);
1612 }
1613 }
1614 }
1615
1616 ralloc_steal(new_ctx, ir);
1617 }
1618
1619
1620 void
1621 reparent_ir(exec_list *list, void *mem_ctx)
1622 {
1623 foreach_list(node, list) {
1624 visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
1625 }
1626 }
1627
1628
1629 static ir_rvalue *
1630 try_min_one(ir_rvalue *ir)
1631 {
1632 ir_expression *expr = ir->as_expression();
1633
1634 if (!expr || expr->operation != ir_binop_min)
1635 return NULL;
1636
1637 if (expr->operands[0]->is_one())
1638 return expr->operands[1];
1639
1640 if (expr->operands[1]->is_one())
1641 return expr->operands[0];
1642
1643 return NULL;
1644 }
1645
1646 static ir_rvalue *
1647 try_max_zero(ir_rvalue *ir)
1648 {
1649 ir_expression *expr = ir->as_expression();
1650
1651 if (!expr || expr->operation != ir_binop_max)
1652 return NULL;
1653
1654 if (expr->operands[0]->is_zero())
1655 return expr->operands[1];
1656
1657 if (expr->operands[1]->is_zero())
1658 return expr->operands[0];
1659
1660 return NULL;
1661 }
1662
1663 ir_rvalue *
1664 ir_rvalue::as_rvalue_to_saturate()
1665 {
1666 ir_expression *expr = this->as_expression();
1667
1668 if (!expr)
1669 return NULL;
1670
1671 ir_rvalue *max_zero = try_max_zero(expr);
1672 if (max_zero) {
1673 return try_min_one(max_zero);
1674 } else {
1675 ir_rvalue *min_one = try_min_one(expr);
1676 if (min_one) {
1677 return try_max_zero(min_one);
1678 }
1679 }
1680
1681 return NULL;
1682 }