grub2: bring back build of aros-side grub2 tools
[AROS.git] / workbench / libs / mesa / src / glsl / ir.cpp
blob4e4cfdc5a8e4f0e80bd3381de77f1dd629cf3654
1 /*
2 * Copyright © 2010 Intel Corporation
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:
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.
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.
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"
29 ir_rvalue::ir_rvalue()
31 this->type = glsl_type::error_type;
34 bool ir_rvalue::is_zero() const
36 return false;
39 bool ir_rvalue::is_one() const
41 return false;
44 bool ir_rvalue::is_negative_one() const
46 return false;
49 /**
50 * Modify the swizzle make to move one component to another
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
56 static void
57 update_rhs_swizzle(ir_swizzle_mask &m, unsigned from, unsigned to)
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.");
67 m.num_components = MAX2(m.num_components, (to + 1));
70 void
71 ir_assignment::set_lhs(ir_rvalue *lhs)
73 void *mem_ctx = this;
74 bool swizzled = false;
76 while (lhs != NULL) {
77 ir_swizzle *swiz = lhs->as_swizzle();
79 if (swiz == NULL)
80 break;
82 unsigned write_mask = 0;
83 ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
85 for (unsigned i = 0; i < swiz->mask.num_components; i++) {
86 unsigned c = 0;
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.");
96 write_mask |= (((this->write_mask >> i) & 1) << c);
97 update_rhs_swizzle(rhs_swiz, i, c);
100 this->write_mask = write_mask;
101 lhs = swiz->val;
103 this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
104 swizzled = true;
107 if (swizzled) {
108 /* Now, RHS channels line up with the LHS writemask. Collapse it
109 * to just the channels that will be written.
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++);
117 this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
120 assert((lhs == NULL) || lhs->as_dereference());
122 this->lhs = (ir_dereference *) lhs;
125 ir_variable *
126 ir_assignment::whole_variable_written()
128 ir_variable *v = this->lhs->whole_variable_referenced();
130 if (v == NULL)
131 return NULL;
133 if (v->type->is_scalar())
134 return v;
136 if (v->type->is_vector()) {
137 const unsigned mask = (1U << v->type->vector_elements) - 1;
139 if (mask != this->write_mask)
140 return NULL;
143 /* Either all the vector components are assigned or the variable is some
144 * composite type (and the whole thing is assigned.
146 return v;
149 ir_assignment::ir_assignment(ir_dereference *lhs, ir_rvalue *rhs,
150 ir_rvalue *condition, unsigned write_mask)
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;
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++;
165 assert(lhs_components == this->rhs->type->vector_elements);
169 ir_assignment::ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs,
170 ir_rvalue *condition)
172 this->ir_type = ir_type_assignment;
173 this->condition = condition;
174 this->rhs = rhs;
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:
181 * (assign (...) (xyz) (var_ref lhs) (var_ref rhs))
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;
190 this->set_lhs(lhs);
194 ir_expression::ir_expression(int op, const struct glsl_type *type,
195 ir_rvalue *op0)
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;
207 ir_expression::ir_expression(int op, const struct glsl_type *type,
208 ir_rvalue *op0, ir_rvalue *op1)
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;
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)
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;
234 ir_expression::ir_expression(int op, ir_rvalue *op0)
236 this->ir_type = ir_type_expression;
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;
244 assert(op <= ir_last_unop);
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;
273 case ir_unop_f2i:
274 case ir_unop_b2i:
275 this->type = glsl_type::get_instance(GLSL_TYPE_INT,
276 op0->type->vector_elements, 1);
277 break;
279 case ir_unop_b2f:
280 case ir_unop_i2f:
281 case ir_unop_u2f:
282 this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT,
283 op0->type->vector_elements, 1);
284 break;
286 case ir_unop_f2b:
287 case ir_unop_i2b:
288 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
289 op0->type->vector_elements, 1);
290 break;
292 case ir_unop_noise:
293 this->type = glsl_type::float_type;
294 break;
296 case ir_unop_any:
297 this->type = glsl_type::bool_type;
298 break;
300 default:
301 assert(!"not reached: missing automatic type setup for ir_expression");
302 this->type = op0->type;
303 break;
307 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1)
309 this->ir_type = ir_type_expression;
311 this->operation = ir_expression_operation(op);
312 this->operands[0] = op0;
313 this->operands[1] = op1;
314 this->operands[2] = NULL;
315 this->operands[3] = NULL;
317 assert(op > ir_last_unop);
319 switch (this->operation) {
320 case ir_binop_all_equal:
321 case ir_binop_any_nequal:
322 this->type = glsl_type::bool_type;
323 break;
325 case ir_binop_add:
326 case ir_binop_sub:
327 case ir_binop_min:
328 case ir_binop_max:
329 case ir_binop_pow:
330 case ir_binop_mul:
331 case ir_binop_div:
332 case ir_binop_mod:
333 if (op0->type->is_scalar()) {
334 this->type = op1->type;
335 } else if (op1->type->is_scalar()) {
336 this->type = op0->type;
337 } else {
338 /* FINISHME: matrix types */
339 assert(!op0->type->is_matrix() && !op1->type->is_matrix());
340 assert(op0->type == op1->type);
341 this->type = op0->type;
343 break;
345 case ir_binop_logic_and:
346 case ir_binop_logic_xor:
347 case ir_binop_logic_or:
348 case ir_binop_bit_and:
349 case ir_binop_bit_xor:
350 case ir_binop_bit_or:
351 if (op0->type->is_scalar()) {
352 this->type = op1->type;
353 } else if (op1->type->is_scalar()) {
354 this->type = op0->type;
356 break;
358 case ir_binop_equal:
359 case ir_binop_nequal:
360 case ir_binop_lequal:
361 case ir_binop_gequal:
362 case ir_binop_less:
363 case ir_binop_greater:
364 assert(op0->type == op1->type);
365 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
366 op0->type->vector_elements, 1);
367 break;
369 case ir_binop_dot:
370 this->type = glsl_type::float_type;
371 break;
373 case ir_binop_lshift:
374 case ir_binop_rshift:
375 this->type = op0->type;
376 break;
378 default:
379 assert(!"not reached: missing automatic type setup for ir_expression");
380 this->type = glsl_type::float_type;
384 unsigned int
385 ir_expression::get_num_operands(ir_expression_operation op)
387 assert(op <= ir_last_opcode);
389 if (op <= ir_last_unop)
390 return 1;
392 if (op <= ir_last_binop)
393 return 2;
395 if (op == ir_quadop_vector)
396 return 4;
398 assert(false);
399 return 0;
402 static const char *const operator_strs[] = {
403 "~",
404 "!",
405 "neg",
406 "abs",
407 "sign",
408 "rcp",
409 "rsq",
410 "sqrt",
411 "exp",
412 "log",
413 "exp2",
414 "log2",
415 "f2i",
416 "i2f",
417 "f2b",
418 "b2f",
419 "i2b",
420 "b2i",
421 "u2f",
422 "any",
423 "trunc",
424 "ceil",
425 "floor",
426 "fract",
427 "round_even",
428 "sin",
429 "cos",
430 "sin_reduced",
431 "cos_reduced",
432 "dFdx",
433 "dFdy",
434 "noise",
435 "+",
436 "-",
437 "*",
438 "/",
439 "%",
440 "<",
441 ">",
442 "<=",
443 ">=",
444 "==",
445 "!=",
446 "all_equal",
447 "any_nequal",
448 "<<",
449 ">>",
450 "&",
451 "^",
452 "|",
453 "&&",
454 "^^",
455 "||",
456 "dot",
457 "min",
458 "max",
459 "pow",
460 "vector",
463 const char *ir_expression::operator_string(ir_expression_operation op)
465 assert((unsigned int) op < Elements(operator_strs));
466 assert(Elements(operator_strs) == (ir_quadop_vector + 1));
467 return operator_strs[op];
470 const char *ir_expression::operator_string()
472 return operator_string(this->operation);
475 const char*
476 depth_layout_string(ir_depth_layout layout)
478 switch(layout) {
479 case ir_depth_layout_none: return "";
480 case ir_depth_layout_any: return "depth_any";
481 case ir_depth_layout_greater: return "depth_greater";
482 case ir_depth_layout_less: return "depth_less";
483 case ir_depth_layout_unchanged: return "depth_unchanged";
485 default:
486 assert(0);
487 return "";
491 ir_expression_operation
492 ir_expression::get_operator(const char *str)
494 const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
495 for (int op = 0; op < operator_count; op++) {
496 if (strcmp(str, operator_strs[op]) == 0)
497 return (ir_expression_operation) op;
499 return (ir_expression_operation) -1;
502 ir_constant::ir_constant()
504 this->ir_type = ir_type_constant;
507 ir_constant::ir_constant(const struct glsl_type *type,
508 const ir_constant_data *data)
510 assert((type->base_type >= GLSL_TYPE_UINT)
511 && (type->base_type <= GLSL_TYPE_BOOL));
513 this->ir_type = ir_type_constant;
514 this->type = type;
515 memcpy(& this->value, data, sizeof(this->value));
518 ir_constant::ir_constant(float f)
520 this->ir_type = ir_type_constant;
521 this->type = glsl_type::float_type;
522 this->value.f[0] = f;
523 for (int i = 1; i < 16; i++) {
524 this->value.f[i] = 0;
528 ir_constant::ir_constant(unsigned int u)
530 this->ir_type = ir_type_constant;
531 this->type = glsl_type::uint_type;
532 this->value.u[0] = u;
533 for (int i = 1; i < 16; i++) {
534 this->value.u[i] = 0;
538 ir_constant::ir_constant(int i)
540 this->ir_type = ir_type_constant;
541 this->type = glsl_type::int_type;
542 this->value.i[0] = i;
543 for (int i = 1; i < 16; i++) {
544 this->value.i[i] = 0;
548 ir_constant::ir_constant(bool b)
550 this->ir_type = ir_type_constant;
551 this->type = glsl_type::bool_type;
552 this->value.b[0] = b;
553 for (int i = 1; i < 16; i++) {
554 this->value.b[i] = false;
558 ir_constant::ir_constant(const ir_constant *c, unsigned i)
560 this->ir_type = ir_type_constant;
561 this->type = c->type->get_base_type();
563 switch (this->type->base_type) {
564 case GLSL_TYPE_UINT: this->value.u[0] = c->value.u[i]; break;
565 case GLSL_TYPE_INT: this->value.i[0] = c->value.i[i]; break;
566 case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
567 case GLSL_TYPE_BOOL: this->value.b[0] = c->value.b[i]; break;
568 default: assert(!"Should not get here."); break;
572 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
574 this->ir_type = ir_type_constant;
575 this->type = type;
577 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
578 || type->is_record() || type->is_array());
580 if (type->is_array()) {
581 this->array_elements = ralloc_array(this, ir_constant *, type->length);
582 unsigned i = 0;
583 foreach_list(node, value_list) {
584 ir_constant *value = (ir_constant *) node;
585 assert(value->as_constant() != NULL);
587 this->array_elements[i++] = value;
589 return;
592 /* If the constant is a record, the types of each of the entries in
593 * value_list must be a 1-for-1 match with the structure components. Each
594 * entry must also be a constant. Just move the nodes from the value_list
595 * to the list in the ir_constant.
597 /* FINISHME: Should there be some type checking and / or assertions here? */
598 /* FINISHME: Should the new constant take ownership of the nodes from
599 * FINISHME: value_list, or should it make copies?
601 if (type->is_record()) {
602 value_list->move_nodes_to(& this->components);
603 return;
606 for (unsigned i = 0; i < 16; i++) {
607 this->value.u[i] = 0;
610 ir_constant *value = (ir_constant *) (value_list->head);
612 /* Constructors with exactly one scalar argument are special for vectors
613 * and matrices. For vectors, the scalar value is replicated to fill all
614 * the components. For matrices, the scalar fills the components of the
615 * diagonal while the rest is filled with 0.
617 if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
618 if (type->is_matrix()) {
619 /* Matrix - fill diagonal (rest is already set to 0) */
620 assert(type->base_type == GLSL_TYPE_FLOAT);
621 for (unsigned i = 0; i < type->matrix_columns; i++)
622 this->value.f[i * type->vector_elements + i] = value->value.f[0];
623 } else {
624 /* Vector or scalar - fill all components */
625 switch (type->base_type) {
626 case GLSL_TYPE_UINT:
627 case GLSL_TYPE_INT:
628 for (unsigned i = 0; i < type->components(); i++)
629 this->value.u[i] = value->value.u[0];
630 break;
631 case GLSL_TYPE_FLOAT:
632 for (unsigned i = 0; i < type->components(); i++)
633 this->value.f[i] = value->value.f[0];
634 break;
635 case GLSL_TYPE_BOOL:
636 for (unsigned i = 0; i < type->components(); i++)
637 this->value.b[i] = value->value.b[0];
638 break;
639 default:
640 assert(!"Should not get here.");
641 break;
644 return;
647 if (type->is_matrix() && value->type->is_matrix()) {
648 assert(value->next->is_tail_sentinel());
650 /* From section 5.4.2 of the GLSL 1.20 spec:
651 * "If a matrix is constructed from a matrix, then each component
652 * (column i, row j) in the result that has a corresponding component
653 * (column i, row j) in the argument will be initialized from there."
655 unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
656 unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
657 for (unsigned i = 0; i < cols; i++) {
658 for (unsigned j = 0; j < rows; j++) {
659 const unsigned src = i * value->type->vector_elements + j;
660 const unsigned dst = i * type->vector_elements + j;
661 this->value.f[dst] = value->value.f[src];
665 /* "All other components will be initialized to the identity matrix." */
666 for (unsigned i = cols; i < type->matrix_columns; i++)
667 this->value.f[i * type->vector_elements + i] = 1.0;
669 return;
672 /* Use each component from each entry in the value_list to initialize one
673 * component of the constant being constructed.
675 for (unsigned i = 0; i < type->components(); /* empty */) {
676 assert(value->as_constant() != NULL);
677 assert(!value->is_tail_sentinel());
679 for (unsigned j = 0; j < value->type->components(); j++) {
680 switch (type->base_type) {
681 case GLSL_TYPE_UINT:
682 this->value.u[i] = value->get_uint_component(j);
683 break;
684 case GLSL_TYPE_INT:
685 this->value.i[i] = value->get_int_component(j);
686 break;
687 case GLSL_TYPE_FLOAT:
688 this->value.f[i] = value->get_float_component(j);
689 break;
690 case GLSL_TYPE_BOOL:
691 this->value.b[i] = value->get_bool_component(j);
692 break;
693 default:
694 /* FINISHME: What to do? Exceptions are not the answer.
696 break;
699 i++;
700 if (i >= type->components())
701 break;
704 value = (ir_constant *) value->next;
708 ir_constant *
709 ir_constant::zero(void *mem_ctx, const glsl_type *type)
711 assert(type->is_numeric() || type->is_boolean());
713 ir_constant *c = new(mem_ctx) ir_constant;
714 c->type = type;
715 memset(&c->value, 0, sizeof(c->value));
717 return c;
720 bool
721 ir_constant::get_bool_component(unsigned i) const
723 switch (this->type->base_type) {
724 case GLSL_TYPE_UINT: return this->value.u[i] != 0;
725 case GLSL_TYPE_INT: return this->value.i[i] != 0;
726 case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
727 case GLSL_TYPE_BOOL: return this->value.b[i];
728 default: assert(!"Should not get here."); break;
731 /* Must return something to make the compiler happy. This is clearly an
732 * error case.
734 return false;
737 float
738 ir_constant::get_float_component(unsigned i) const
740 switch (this->type->base_type) {
741 case GLSL_TYPE_UINT: return (float) this->value.u[i];
742 case GLSL_TYPE_INT: return (float) this->value.i[i];
743 case GLSL_TYPE_FLOAT: return this->value.f[i];
744 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0 : 0.0;
745 default: assert(!"Should not get here."); break;
748 /* Must return something to make the compiler happy. This is clearly an
749 * error case.
751 return 0.0;
755 ir_constant::get_int_component(unsigned i) const
757 switch (this->type->base_type) {
758 case GLSL_TYPE_UINT: return this->value.u[i];
759 case GLSL_TYPE_INT: return this->value.i[i];
760 case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
761 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
762 default: assert(!"Should not get here."); break;
765 /* Must return something to make the compiler happy. This is clearly an
766 * error case.
768 return 0;
771 unsigned
772 ir_constant::get_uint_component(unsigned i) const
774 switch (this->type->base_type) {
775 case GLSL_TYPE_UINT: return this->value.u[i];
776 case GLSL_TYPE_INT: return this->value.i[i];
777 case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
778 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
779 default: assert(!"Should not get here."); break;
782 /* Must return something to make the compiler happy. This is clearly an
783 * error case.
785 return 0;
788 ir_constant *
789 ir_constant::get_array_element(unsigned i) const
791 assert(this->type->is_array());
793 /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
795 * "Behavior is undefined if a shader subscripts an array with an index
796 * less than 0 or greater than or equal to the size the array was
797 * declared with."
799 * Most out-of-bounds accesses are removed before things could get this far.
800 * There are cases where non-constant array index values can get constant
801 * folded.
803 if (int(i) < 0)
804 i = 0;
805 else if (i >= this->type->length)
806 i = this->type->length - 1;
808 return array_elements[i];
811 ir_constant *
812 ir_constant::get_record_field(const char *name)
814 int idx = this->type->field_index(name);
816 if (idx < 0)
817 return NULL;
819 if (this->components.is_empty())
820 return NULL;
822 exec_node *node = this->components.head;
823 for (int i = 0; i < idx; i++) {
824 node = node->next;
826 /* If the end of the list is encountered before the element matching the
827 * requested field is found, return NULL.
829 if (node->is_tail_sentinel())
830 return NULL;
833 return (ir_constant *) node;
837 bool
838 ir_constant::has_value(const ir_constant *c) const
840 if (this->type != c->type)
841 return false;
843 if (this->type->is_array()) {
844 for (unsigned i = 0; i < this->type->length; i++) {
845 if (!this->array_elements[i]->has_value(c->array_elements[i]))
846 return false;
848 return true;
851 if (this->type->base_type == GLSL_TYPE_STRUCT) {
852 const exec_node *a_node = this->components.head;
853 const exec_node *b_node = c->components.head;
855 while (!a_node->is_tail_sentinel()) {
856 assert(!b_node->is_tail_sentinel());
858 const ir_constant *const a_field = (ir_constant *) a_node;
859 const ir_constant *const b_field = (ir_constant *) b_node;
861 if (!a_field->has_value(b_field))
862 return false;
864 a_node = a_node->next;
865 b_node = b_node->next;
868 return true;
871 for (unsigned i = 0; i < this->type->components(); i++) {
872 switch (this->type->base_type) {
873 case GLSL_TYPE_UINT:
874 if (this->value.u[i] != c->value.u[i])
875 return false;
876 break;
877 case GLSL_TYPE_INT:
878 if (this->value.i[i] != c->value.i[i])
879 return false;
880 break;
881 case GLSL_TYPE_FLOAT:
882 if (this->value.f[i] != c->value.f[i])
883 return false;
884 break;
885 case GLSL_TYPE_BOOL:
886 if (this->value.b[i] != c->value.b[i])
887 return false;
888 break;
889 default:
890 assert(!"Should not get here.");
891 return false;
895 return true;
898 bool
899 ir_constant::is_zero() const
901 if (!this->type->is_scalar() && !this->type->is_vector())
902 return false;
904 for (unsigned c = 0; c < this->type->vector_elements; c++) {
905 switch (this->type->base_type) {
906 case GLSL_TYPE_FLOAT:
907 if (this->value.f[c] != 0.0)
908 return false;
909 break;
910 case GLSL_TYPE_INT:
911 if (this->value.i[c] != 0)
912 return false;
913 break;
914 case GLSL_TYPE_UINT:
915 if (this->value.u[c] != 0)
916 return false;
917 break;
918 case GLSL_TYPE_BOOL:
919 if (this->value.b[c] != false)
920 return false;
921 break;
922 default:
923 /* The only other base types are structures, arrays, and samplers.
924 * Samplers cannot be constants, and the others should have been
925 * filtered out above.
927 assert(!"Should not get here.");
928 return false;
932 return true;
935 bool
936 ir_constant::is_one() const
938 if (!this->type->is_scalar() && !this->type->is_vector())
939 return false;
941 for (unsigned c = 0; c < this->type->vector_elements; c++) {
942 switch (this->type->base_type) {
943 case GLSL_TYPE_FLOAT:
944 if (this->value.f[c] != 1.0)
945 return false;
946 break;
947 case GLSL_TYPE_INT:
948 if (this->value.i[c] != 1)
949 return false;
950 break;
951 case GLSL_TYPE_UINT:
952 if (this->value.u[c] != 1)
953 return false;
954 break;
955 case GLSL_TYPE_BOOL:
956 if (this->value.b[c] != true)
957 return false;
958 break;
959 default:
960 /* The only other base types are structures, arrays, and samplers.
961 * Samplers cannot be constants, and the others should have been
962 * filtered out above.
964 assert(!"Should not get here.");
965 return false;
969 return true;
972 bool
973 ir_constant::is_negative_one() const
975 if (!this->type->is_scalar() && !this->type->is_vector())
976 return false;
978 if (this->type->is_boolean())
979 return false;
981 for (unsigned c = 0; c < this->type->vector_elements; c++) {
982 switch (this->type->base_type) {
983 case GLSL_TYPE_FLOAT:
984 if (this->value.f[c] != -1.0)
985 return false;
986 break;
987 case GLSL_TYPE_INT:
988 if (this->value.i[c] != -1)
989 return false;
990 break;
991 case GLSL_TYPE_UINT:
992 if (int(this->value.u[c]) != -1)
993 return false;
994 break;
995 default:
996 /* The only other base types are structures, arrays, samplers, and
997 * booleans. Samplers cannot be constants, and the others should
998 * have been filtered out above.
1000 assert(!"Should not get here.");
1001 return false;
1005 return true;
1008 ir_loop::ir_loop()
1010 this->ir_type = ir_type_loop;
1011 this->cmp = ir_unop_neg;
1012 this->from = NULL;
1013 this->to = NULL;
1014 this->increment = NULL;
1015 this->counter = NULL;
1019 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
1021 this->ir_type = ir_type_dereference_variable;
1022 this->var = var;
1023 this->type = (var != NULL) ? var->type : glsl_type::error_type;
1027 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
1028 ir_rvalue *array_index)
1030 this->ir_type = ir_type_dereference_array;
1031 this->array_index = array_index;
1032 this->set_array(value);
1036 ir_dereference_array::ir_dereference_array(ir_variable *var,
1037 ir_rvalue *array_index)
1039 void *ctx = ralloc_parent(var);
1041 this->ir_type = ir_type_dereference_array;
1042 this->array_index = array_index;
1043 this->set_array(new(ctx) ir_dereference_variable(var));
1047 void
1048 ir_dereference_array::set_array(ir_rvalue *value)
1050 this->array = value;
1051 this->type = glsl_type::error_type;
1053 if (this->array != NULL) {
1054 const glsl_type *const vt = this->array->type;
1056 if (vt->is_array()) {
1057 type = vt->element_type();
1058 } else if (vt->is_matrix()) {
1059 type = vt->column_type();
1060 } else if (vt->is_vector()) {
1061 type = vt->get_base_type();
1067 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
1068 const char *field)
1070 this->ir_type = ir_type_dereference_record;
1071 this->record = value;
1072 this->field = ralloc_strdup(this, field);
1073 this->type = (this->record != NULL)
1074 ? this->record->type->field_type(field) : glsl_type::error_type;
1078 ir_dereference_record::ir_dereference_record(ir_variable *var,
1079 const char *field)
1081 void *ctx = ralloc_parent(var);
1083 this->ir_type = ir_type_dereference_record;
1084 this->record = new(ctx) ir_dereference_variable(var);
1085 this->field = ralloc_strdup(this, field);
1086 this->type = (this->record != NULL)
1087 ? this->record->type->field_type(field) : glsl_type::error_type;
1090 bool
1091 ir_dereference::is_lvalue()
1093 ir_variable *var = this->variable_referenced();
1095 /* Every l-value derference chain eventually ends in a variable.
1097 if ((var == NULL) || var->read_only)
1098 return false;
1100 if (this->type->is_array() && !var->array_lvalue)
1101 return false;
1103 /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
1105 * "Samplers cannot be treated as l-values; hence cannot be used
1106 * as out or inout function parameters, nor can they be
1107 * assigned into."
1109 if (this->type->contains_sampler())
1110 return false;
1112 return true;
1116 const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf" };
1118 const char *ir_texture::opcode_string()
1120 assert((unsigned int) op <=
1121 sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
1122 return tex_opcode_strs[op];
1125 ir_texture_opcode
1126 ir_texture::get_opcode(const char *str)
1128 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
1129 for (int op = 0; op < count; op++) {
1130 if (strcmp(str, tex_opcode_strs[op]) == 0)
1131 return (ir_texture_opcode) op;
1133 return (ir_texture_opcode) -1;
1137 void
1138 ir_texture::set_sampler(ir_dereference *sampler, const glsl_type *type)
1140 assert(sampler != NULL);
1141 assert(type != NULL);
1142 this->sampler = sampler;
1143 this->type = type;
1145 assert(sampler->type->sampler_type == (int) type->base_type);
1146 if (sampler->type->sampler_shadow)
1147 assert(type->vector_elements == 4 || type->vector_elements == 1);
1148 else
1149 assert(type->vector_elements == 4);
1153 void
1154 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
1156 assert((count >= 1) && (count <= 4));
1158 memset(&this->mask, 0, sizeof(this->mask));
1159 this->mask.num_components = count;
1161 unsigned dup_mask = 0;
1162 switch (count) {
1163 case 4:
1164 assert(comp[3] <= 3);
1165 dup_mask |= (1U << comp[3])
1166 & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
1167 this->mask.w = comp[3];
1169 case 3:
1170 assert(comp[2] <= 3);
1171 dup_mask |= (1U << comp[2])
1172 & ((1U << comp[0]) | (1U << comp[1]));
1173 this->mask.z = comp[2];
1175 case 2:
1176 assert(comp[1] <= 3);
1177 dup_mask |= (1U << comp[1])
1178 & ((1U << comp[0]));
1179 this->mask.y = comp[1];
1181 case 1:
1182 assert(comp[0] <= 3);
1183 this->mask.x = comp[0];
1186 this->mask.has_duplicates = dup_mask != 0;
1188 /* Based on the number of elements in the swizzle and the base type
1189 * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
1190 * generate the type of the resulting value.
1192 type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
1195 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
1196 unsigned w, unsigned count)
1197 : val(val)
1199 const unsigned components[4] = { x, y, z, w };
1200 this->ir_type = ir_type_swizzle;
1201 this->init_mask(components, count);
1204 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
1205 unsigned count)
1206 : val(val)
1208 this->ir_type = ir_type_swizzle;
1209 this->init_mask(comp, count);
1212 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
1214 this->ir_type = ir_type_swizzle;
1215 this->val = val;
1216 this->mask = mask;
1217 this->type = glsl_type::get_instance(val->type->base_type,
1218 mask.num_components, 1);
1221 #define X 1
1222 #define R 5
1223 #define S 9
1224 #define I 13
1226 ir_swizzle *
1227 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
1229 void *ctx = ralloc_parent(val);
1231 /* For each possible swizzle character, this table encodes the value in
1232 * \c idx_map that represents the 0th element of the vector. For invalid
1233 * swizzle characters (e.g., 'k'), a special value is used that will allow
1234 * detection of errors.
1236 static const unsigned char base_idx[26] = {
1237 /* a b c d e f g h i j k l m */
1238 R, R, I, I, I, I, R, I, I, I, I, I, I,
1239 /* n o p q r s t u v w x y z */
1240 I, I, S, S, R, S, S, I, I, X, X, X, X
1243 /* Each valid swizzle character has an entry in the previous table. This
1244 * table encodes the base index encoded in the previous table plus the actual
1245 * index of the swizzle character. When processing swizzles, the first
1246 * character in the string is indexed in the previous table. Each character
1247 * in the string is indexed in this table, and the value found there has the
1248 * value form the first table subtracted. The result must be on the range
1249 * [0,3].
1251 * For example, the string "wzyx" will get X from the first table. Each of
1252 * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After
1253 * subtraction, the swizzle values are { 3, 2, 1, 0 }.
1255 * The string "wzrg" will get X from the first table. Each of the characters
1256 * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the
1257 * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range
1258 * [0,3], the error is detected.
1260 static const unsigned char idx_map[26] = {
1261 /* a b c d e f g h i j k l m */
1262 R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0,
1263 /* n o p q r s t u v w x y z */
1264 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2
1267 int swiz_idx[4] = { 0, 0, 0, 0 };
1268 unsigned i;
1271 /* Validate the first character in the swizzle string and look up the base
1272 * index value as described above.
1274 if ((str[0] < 'a') || (str[0] > 'z'))
1275 return NULL;
1277 const unsigned base = base_idx[str[0] - 'a'];
1280 for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
1281 /* Validate the next character, and, as described above, convert it to a
1282 * swizzle index.
1284 if ((str[i] < 'a') || (str[i] > 'z'))
1285 return NULL;
1287 swiz_idx[i] = idx_map[str[i] - 'a'] - base;
1288 if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
1289 return NULL;
1292 if (str[i] != '\0')
1293 return NULL;
1295 return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
1296 swiz_idx[3], i);
1299 #undef X
1300 #undef R
1301 #undef S
1302 #undef I
1304 ir_variable *
1305 ir_swizzle::variable_referenced()
1307 return this->val->variable_referenced();
1311 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
1312 ir_variable_mode mode)
1313 : max_array_access(0), read_only(false), centroid(false), invariant(false),
1314 mode(mode), interpolation(ir_var_smooth), array_lvalue(false)
1316 this->ir_type = ir_type_variable;
1317 this->type = type;
1318 this->name = ralloc_strdup(this, name);
1319 this->explicit_location = false;
1320 this->location = -1;
1321 this->warn_extension = NULL;
1322 this->constant_value = NULL;
1323 this->origin_upper_left = false;
1324 this->pixel_center_integer = false;
1325 this->depth_layout = ir_depth_layout_none;
1326 this->used = false;
1328 if (type && type->base_type == GLSL_TYPE_SAMPLER)
1329 this->read_only = true;
1333 const char *
1334 ir_variable::interpolation_string() const
1336 switch (this->interpolation) {
1337 case ir_var_smooth: return "smooth";
1338 case ir_var_flat: return "flat";
1339 case ir_var_noperspective: return "noperspective";
1342 assert(!"Should not get here.");
1343 return "";
1347 unsigned
1348 ir_variable::component_slots() const
1350 /* FINISHME: Sparsely accessed arrays require fewer slots. */
1351 return this->type->component_slots();
1355 ir_function_signature::ir_function_signature(const glsl_type *return_type)
1356 : return_type(return_type), is_defined(false), _function(NULL)
1358 this->ir_type = ir_type_function_signature;
1359 this->is_builtin = false;
1363 static bool
1364 modes_match(unsigned a, unsigned b)
1366 if (a == b)
1367 return true;
1369 /* Accept "in" vs. "const in" */
1370 if ((a == ir_var_const_in && b == ir_var_in) ||
1371 (b == ir_var_const_in && a == ir_var_in))
1372 return true;
1374 return false;
1378 const char *
1379 ir_function_signature::qualifiers_match(exec_list *params)
1381 exec_list_iterator iter_a = parameters.iterator();
1382 exec_list_iterator iter_b = params->iterator();
1384 /* check that the qualifiers match. */
1385 while (iter_a.has_next()) {
1386 ir_variable *a = (ir_variable *)iter_a.get();
1387 ir_variable *b = (ir_variable *)iter_b.get();
1389 if (a->read_only != b->read_only ||
1390 !modes_match(a->mode, b->mode) ||
1391 a->interpolation != b->interpolation ||
1392 a->centroid != b->centroid) {
1394 /* parameter a's qualifiers don't match */
1395 return a->name;
1398 iter_a.next();
1399 iter_b.next();
1401 return NULL;
1405 void
1406 ir_function_signature::replace_parameters(exec_list *new_params)
1408 /* Destroy all of the previous parameter information. If the previous
1409 * parameter information comes from the function prototype, it may either
1410 * specify incorrect parameter names or not have names at all.
1412 foreach_iter(exec_list_iterator, iter, parameters) {
1413 assert(((ir_instruction *) iter.get())->as_variable() != NULL);
1415 iter.remove();
1418 new_params->move_nodes_to(&parameters);
1422 ir_function::ir_function(const char *name)
1424 this->ir_type = ir_type_function;
1425 this->name = ralloc_strdup(this, name);
1429 bool
1430 ir_function::has_user_signature()
1432 foreach_list(n, &this->signatures) {
1433 ir_function_signature *const sig = (ir_function_signature *) n;
1434 if (!sig->is_builtin)
1435 return true;
1437 return false;
1441 ir_call *
1442 ir_call::get_error_instruction(void *ctx)
1444 ir_call *call = new(ctx) ir_call;
1446 call->type = glsl_type::error_type;
1447 return call;
1450 void
1451 ir_call::set_callee(ir_function_signature *sig)
1453 assert((this->type == NULL) || (this->type == sig->return_type));
1455 this->callee = sig;
1458 void
1459 visit_exec_list(exec_list *list, ir_visitor *visitor)
1461 foreach_iter(exec_list_iterator, iter, *list) {
1462 ((ir_instruction *)iter.get())->accept(visitor);
1467 static void
1468 steal_memory(ir_instruction *ir, void *new_ctx)
1470 ir_variable *var = ir->as_variable();
1471 ir_constant *constant = ir->as_constant();
1472 if (var != NULL && var->constant_value != NULL)
1473 steal_memory(var->constant_value, ir);
1475 /* The components of aggregate constants are not visited by the normal
1476 * visitor, so steal their values by hand.
1478 if (constant != NULL) {
1479 if (constant->type->is_record()) {
1480 foreach_iter(exec_list_iterator, iter, constant->components) {
1481 ir_constant *field = (ir_constant *)iter.get();
1482 steal_memory(field, ir);
1484 } else if (constant->type->is_array()) {
1485 for (unsigned int i = 0; i < constant->type->length; i++) {
1486 steal_memory(constant->array_elements[i], ir);
1491 ralloc_steal(new_ctx, ir);
1495 void
1496 reparent_ir(exec_list *list, void *mem_ctx)
1498 foreach_list(node, list) {
1499 visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
1504 static ir_rvalue *
1505 try_min_one(ir_rvalue *ir)
1507 ir_expression *expr = ir->as_expression();
1509 if (!expr || expr->operation != ir_binop_min)
1510 return NULL;
1512 if (expr->operands[0]->is_one())
1513 return expr->operands[1];
1515 if (expr->operands[1]->is_one())
1516 return expr->operands[0];
1518 return NULL;
1521 static ir_rvalue *
1522 try_max_zero(ir_rvalue *ir)
1524 ir_expression *expr = ir->as_expression();
1526 if (!expr || expr->operation != ir_binop_max)
1527 return NULL;
1529 if (expr->operands[0]->is_zero())
1530 return expr->operands[1];
1532 if (expr->operands[1]->is_zero())
1533 return expr->operands[0];
1535 return NULL;
1538 ir_rvalue *
1539 ir_rvalue::as_rvalue_to_saturate()
1541 ir_expression *expr = this->as_expression();
1543 if (!expr)
1544 return NULL;
1546 ir_rvalue *max_zero = try_max_zero(expr);
1547 if (max_zero) {
1548 return try_min_one(max_zero);
1549 } else {
1550 ir_rvalue *min_one = try_min_one(expr);
1551 if (min_one) {
1552 return try_max_zero(min_one);
1556 return NULL;