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