glsl: Add proper handling for constant matrix-from-matrix constructors.
[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 /**
35 * Modify the swizzle make to move one component to another
36 *
37 * \param m IR swizzle to be modified
38 * \param from Component in the RHS that is to be swizzled
39 * \param to Desired swizzle location of \c from
40 */
41 static void
42 update_rhs_swizzle(ir_swizzle_mask &m, unsigned from, unsigned to)
43 {
44 switch (to) {
45 case 0: m.x = from; break;
46 case 1: m.y = from; break;
47 case 2: m.z = from; break;
48 case 3: m.w = from; break;
49 default: assert(!"Should not get here.");
50 }
51
52 m.num_components = MAX2(m.num_components, (to + 1));
53 }
54
55 void
56 ir_assignment::set_lhs(ir_rvalue *lhs)
57 {
58 while (lhs != NULL) {
59 ir_swizzle *swiz = lhs->as_swizzle();
60
61 if (swiz == NULL)
62 break;
63
64 unsigned write_mask = 0;
65 ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
66
67 for (unsigned i = 0; i < swiz->mask.num_components; i++) {
68 unsigned c = 0;
69
70 switch (i) {
71 case 0: c = swiz->mask.x; break;
72 case 1: c = swiz->mask.y; break;
73 case 2: c = swiz->mask.z; break;
74 case 3: c = swiz->mask.w; break;
75 default: assert(!"Should not get here.");
76 }
77
78 write_mask |= (((this->write_mask >> i) & 1) << c);
79 update_rhs_swizzle(rhs_swiz, i, c);
80 }
81
82 this->write_mask = write_mask;
83 lhs = swiz->val;
84
85 this->rhs = new(this) ir_swizzle(this->rhs, rhs_swiz);
86 }
87
88 assert((lhs == NULL) || lhs->as_dereference());
89
90 this->lhs = (ir_dereference *) lhs;
91 }
92
93 ir_variable *
94 ir_assignment::whole_variable_written()
95 {
96 ir_variable *v = this->lhs->whole_variable_referenced();
97
98 if (v == NULL)
99 return NULL;
100
101 if (v->type->is_scalar())
102 return v;
103
104 if (v->type->is_vector()) {
105 const unsigned mask = (1U << v->type->vector_elements) - 1;
106
107 if (mask != this->write_mask)
108 return NULL;
109 }
110
111 /* Either all the vector components are assigned or the variable is some
112 * composite type (and the whole thing is assigned.
113 */
114 return v;
115 }
116
117 ir_assignment::ir_assignment(ir_dereference *lhs, ir_rvalue *rhs,
118 ir_rvalue *condition, unsigned write_mask)
119 {
120 this->ir_type = ir_type_assignment;
121 this->condition = condition;
122 this->rhs = rhs;
123 this->lhs = lhs;
124 this->write_mask = write_mask;
125 }
126
127 ir_assignment::ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs,
128 ir_rvalue *condition)
129 {
130 this->ir_type = ir_type_assignment;
131 this->condition = condition;
132 this->rhs = rhs;
133
134 /* If the RHS is a vector type, assume that all components of the vector
135 * type are being written to the LHS. The write mask comes from the RHS
136 * because we can have a case where the LHS is a vec4 and the RHS is a
137 * vec3. In that case, the assignment is:
138 *
139 * (assign (...) (xyz) (var_ref lhs) (var_ref rhs))
140 */
141 if (rhs->type->is_vector())
142 this->write_mask = (1U << rhs->type->vector_elements) - 1;
143 else if (rhs->type->is_scalar())
144 this->write_mask = 1;
145 else
146 this->write_mask = 0;
147
148 this->set_lhs(lhs);
149 }
150
151
152 ir_expression::ir_expression(int op, const struct glsl_type *type,
153 ir_rvalue *op0, ir_rvalue *op1)
154 {
155 this->ir_type = ir_type_expression;
156 this->type = type;
157 this->operation = ir_expression_operation(op);
158 this->operands[0] = op0;
159 this->operands[1] = op1;
160 }
161
162 unsigned int
163 ir_expression::get_num_operands(ir_expression_operation op)
164 {
165 /* Update ir_print_visitor.cpp when updating this list. */
166 const int num_operands[] = {
167 1, /* ir_unop_bit_not */
168 1, /* ir_unop_logic_not */
169 1, /* ir_unop_neg */
170 1, /* ir_unop_abs */
171 1, /* ir_unop_sign */
172 1, /* ir_unop_rcp */
173 1, /* ir_unop_rsq */
174 1, /* ir_unop_sqrt */
175 1, /* ir_unop_exp */
176 1, /* ir_unop_log */
177 1, /* ir_unop_exp2 */
178 1, /* ir_unop_log2 */
179 1, /* ir_unop_f2i */
180 1, /* ir_unop_i2f */
181 1, /* ir_unop_f2b */
182 1, /* ir_unop_b2f */
183 1, /* ir_unop_i2b */
184 1, /* ir_unop_b2i */
185 1, /* ir_unop_u2f */
186 1, /* ir_unop_any */
187
188 1, /* ir_unop_trunc */
189 1, /* ir_unop_ceil */
190 1, /* ir_unop_floor */
191 1, /* ir_unop_fract */
192
193 1, /* ir_unop_sin */
194 1, /* ir_unop_cos */
195
196 1, /* ir_unop_dFdx */
197 1, /* ir_unop_dFdy */
198
199 2, /* ir_binop_add */
200 2, /* ir_binop_sub */
201 2, /* ir_binop_mul */
202 2, /* ir_binop_div */
203 2, /* ir_binop_mod */
204
205 2, /* ir_binop_less */
206 2, /* ir_binop_greater */
207 2, /* ir_binop_lequal */
208 2, /* ir_binop_gequal */
209 2, /* ir_binop_equal */
210 2, /* ir_binop_nequal */
211
212 2, /* ir_binop_lshift */
213 2, /* ir_binop_rshift */
214 2, /* ir_binop_bit_and */
215 2, /* ir_binop_bit_xor */
216 2, /* ir_binop_bit_or */
217
218 2, /* ir_binop_logic_and */
219 2, /* ir_binop_logic_xor */
220 2, /* ir_binop_logic_or */
221
222 2, /* ir_binop_dot */
223 2, /* ir_binop_cross */
224 2, /* ir_binop_min */
225 2, /* ir_binop_max */
226
227 2, /* ir_binop_pow */
228 };
229
230 assert(sizeof(num_operands) / sizeof(num_operands[0]) == ir_binop_pow + 1);
231
232 return num_operands[op];
233 }
234
235 static const char *const operator_strs[] = {
236 "~",
237 "!",
238 "neg",
239 "abs",
240 "sign",
241 "rcp",
242 "rsq",
243 "sqrt",
244 "exp",
245 "log",
246 "exp2",
247 "log2",
248 "f2i",
249 "i2f",
250 "f2b",
251 "b2f",
252 "i2b",
253 "b2i",
254 "u2f",
255 "any",
256 "trunc",
257 "ceil",
258 "floor",
259 "fract",
260 "sin",
261 "cos",
262 "dFdx",
263 "dFdy",
264 "+",
265 "-",
266 "*",
267 "/",
268 "%",
269 "<",
270 ">",
271 "<=",
272 ">=",
273 "==",
274 "!=",
275 "<<",
276 ">>",
277 "&",
278 "^",
279 "|",
280 "&&",
281 "^^",
282 "||",
283 "dot",
284 "cross",
285 "min",
286 "max",
287 "pow",
288 };
289
290 const char *ir_expression::operator_string()
291 {
292 assert((unsigned int) operation <=
293 sizeof(operator_strs) / sizeof(operator_strs[0]));
294 return operator_strs[operation];
295 }
296
297 ir_expression_operation
298 ir_expression::get_operator(const char *str)
299 {
300 const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
301 for (int op = 0; op < operator_count; op++) {
302 if (strcmp(str, operator_strs[op]) == 0)
303 return (ir_expression_operation) op;
304 }
305 return (ir_expression_operation) -1;
306 }
307
308 ir_constant::ir_constant()
309 {
310 this->ir_type = ir_type_constant;
311 }
312
313 ir_constant::ir_constant(const struct glsl_type *type,
314 const ir_constant_data *data)
315 {
316 assert((type->base_type >= GLSL_TYPE_UINT)
317 && (type->base_type <= GLSL_TYPE_BOOL));
318
319 this->ir_type = ir_type_constant;
320 this->type = type;
321 memcpy(& this->value, data, sizeof(this->value));
322 }
323
324 ir_constant::ir_constant(float f)
325 {
326 this->ir_type = ir_type_constant;
327 this->type = glsl_type::float_type;
328 this->value.f[0] = f;
329 for (int i = 1; i < 16; i++) {
330 this->value.f[i] = 0;
331 }
332 }
333
334 ir_constant::ir_constant(unsigned int u)
335 {
336 this->ir_type = ir_type_constant;
337 this->type = glsl_type::uint_type;
338 this->value.u[0] = u;
339 for (int i = 1; i < 16; i++) {
340 this->value.u[i] = 0;
341 }
342 }
343
344 ir_constant::ir_constant(int i)
345 {
346 this->ir_type = ir_type_constant;
347 this->type = glsl_type::int_type;
348 this->value.i[0] = i;
349 for (int i = 1; i < 16; i++) {
350 this->value.i[i] = 0;
351 }
352 }
353
354 ir_constant::ir_constant(bool b)
355 {
356 this->ir_type = ir_type_constant;
357 this->type = glsl_type::bool_type;
358 this->value.b[0] = b;
359 for (int i = 1; i < 16; i++) {
360 this->value.b[i] = false;
361 }
362 }
363
364 ir_constant::ir_constant(const ir_constant *c, unsigned i)
365 {
366 this->ir_type = ir_type_constant;
367 this->type = c->type->get_base_type();
368
369 switch (this->type->base_type) {
370 case GLSL_TYPE_UINT: this->value.u[0] = c->value.u[i]; break;
371 case GLSL_TYPE_INT: this->value.i[0] = c->value.i[i]; break;
372 case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
373 case GLSL_TYPE_BOOL: this->value.b[0] = c->value.b[i]; break;
374 default: assert(!"Should not get here."); break;
375 }
376 }
377
378 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
379 {
380 this->ir_type = ir_type_constant;
381 this->type = type;
382
383 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
384 || type->is_record() || type->is_array());
385
386 if (type->is_array()) {
387 this->array_elements = talloc_array(this, ir_constant *, type->length);
388 unsigned i = 0;
389 foreach_list(node, value_list) {
390 ir_constant *value = (ir_constant *) node;
391 assert(value->as_constant() != NULL);
392
393 this->array_elements[i++] = value;
394 }
395 return;
396 }
397
398 /* If the constant is a record, the types of each of the entries in
399 * value_list must be a 1-for-1 match with the structure components. Each
400 * entry must also be a constant. Just move the nodes from the value_list
401 * to the list in the ir_constant.
402 */
403 /* FINISHME: Should there be some type checking and / or assertions here? */
404 /* FINISHME: Should the new constant take ownership of the nodes from
405 * FINISHME: value_list, or should it make copies?
406 */
407 if (type->is_record()) {
408 value_list->move_nodes_to(& this->components);
409 return;
410 }
411
412 for (unsigned i = 0; i < 16; i++) {
413 this->value.u[i] = 0;
414 }
415
416 ir_constant *value = (ir_constant *) (value_list->head);
417
418 /* Constructors with exactly one scalar argument are special for vectors
419 * and matrices. For vectors, the scalar value is replicated to fill all
420 * the components. For matrices, the scalar fills the components of the
421 * diagonal while the rest is filled with 0.
422 */
423 if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
424 if (type->is_matrix()) {
425 /* Matrix - fill diagonal (rest is already set to 0) */
426 assert(type->base_type == GLSL_TYPE_FLOAT);
427 for (unsigned i = 0; i < type->matrix_columns; i++)
428 this->value.f[i * type->vector_elements + i] = value->value.f[0];
429 } else {
430 /* Vector or scalar - fill all components */
431 switch (type->base_type) {
432 case GLSL_TYPE_UINT:
433 case GLSL_TYPE_INT:
434 for (unsigned i = 0; i < type->components(); i++)
435 this->value.u[i] = value->value.u[0];
436 break;
437 case GLSL_TYPE_FLOAT:
438 for (unsigned i = 0; i < type->components(); i++)
439 this->value.f[i] = value->value.f[0];
440 break;
441 case GLSL_TYPE_BOOL:
442 for (unsigned i = 0; i < type->components(); i++)
443 this->value.b[i] = value->value.b[0];
444 break;
445 default:
446 assert(!"Should not get here.");
447 break;
448 }
449 }
450 return;
451 }
452
453 if (type->is_matrix() && value->type->is_matrix()) {
454 assert(value->next->is_tail_sentinel());
455
456 /* From section 5.4.2 of the GLSL 1.20 spec:
457 * "If a matrix is constructed from a matrix, then each component
458 * (column i, row j) in the result that has a corresponding component
459 * (column i, row j) in the argument will be initialized from there."
460 */
461 unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
462 unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
463 for (unsigned i = 0; i < cols; i++) {
464 for (unsigned j = 0; j < rows; j++) {
465 const unsigned src = i * value->type->vector_elements + j;
466 const unsigned dst = i * type->vector_elements + j;
467 this->value.f[dst] = value->value.f[src];
468 }
469 }
470
471 /* "All other components will be initialized to the identity matrix." */
472 for (unsigned i = cols; i < type->matrix_columns; i++)
473 this->value.f[i * type->vector_elements + i] = 1.0;
474
475 return;
476 }
477
478 /* Use each component from each entry in the value_list to initialize one
479 * component of the constant being constructed.
480 */
481 for (unsigned i = 0; i < type->components(); /* empty */) {
482 assert(value->as_constant() != NULL);
483 assert(!value->is_tail_sentinel());
484
485 for (unsigned j = 0; j < value->type->components(); j++) {
486 switch (type->base_type) {
487 case GLSL_TYPE_UINT:
488 this->value.u[i] = value->get_uint_component(j);
489 break;
490 case GLSL_TYPE_INT:
491 this->value.i[i] = value->get_int_component(j);
492 break;
493 case GLSL_TYPE_FLOAT:
494 this->value.f[i] = value->get_float_component(j);
495 break;
496 case GLSL_TYPE_BOOL:
497 this->value.b[i] = value->get_bool_component(j);
498 break;
499 default:
500 /* FINISHME: What to do? Exceptions are not the answer.
501 */
502 break;
503 }
504
505 i++;
506 if (i >= type->components())
507 break;
508 }
509
510 value = (ir_constant *) value->next;
511 }
512 }
513
514 ir_constant *
515 ir_constant::zero(void *mem_ctx, const glsl_type *type)
516 {
517 assert(type->is_numeric() || type->is_boolean());
518
519 ir_constant *c = new(mem_ctx) ir_constant;
520 c->type = type;
521 memset(&c->value, 0, sizeof(c->value));
522
523 return c;
524 }
525
526 bool
527 ir_constant::get_bool_component(unsigned i) const
528 {
529 switch (this->type->base_type) {
530 case GLSL_TYPE_UINT: return this->value.u[i] != 0;
531 case GLSL_TYPE_INT: return this->value.i[i] != 0;
532 case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
533 case GLSL_TYPE_BOOL: return this->value.b[i];
534 default: assert(!"Should not get here."); break;
535 }
536
537 /* Must return something to make the compiler happy. This is clearly an
538 * error case.
539 */
540 return false;
541 }
542
543 float
544 ir_constant::get_float_component(unsigned i) const
545 {
546 switch (this->type->base_type) {
547 case GLSL_TYPE_UINT: return (float) this->value.u[i];
548 case GLSL_TYPE_INT: return (float) this->value.i[i];
549 case GLSL_TYPE_FLOAT: return this->value.f[i];
550 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0 : 0.0;
551 default: assert(!"Should not get here."); break;
552 }
553
554 /* Must return something to make the compiler happy. This is clearly an
555 * error case.
556 */
557 return 0.0;
558 }
559
560 int
561 ir_constant::get_int_component(unsigned i) const
562 {
563 switch (this->type->base_type) {
564 case GLSL_TYPE_UINT: return this->value.u[i];
565 case GLSL_TYPE_INT: return this->value.i[i];
566 case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
567 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
568 default: assert(!"Should not get here."); break;
569 }
570
571 /* Must return something to make the compiler happy. This is clearly an
572 * error case.
573 */
574 return 0;
575 }
576
577 unsigned
578 ir_constant::get_uint_component(unsigned i) const
579 {
580 switch (this->type->base_type) {
581 case GLSL_TYPE_UINT: return this->value.u[i];
582 case GLSL_TYPE_INT: return this->value.i[i];
583 case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
584 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
585 default: assert(!"Should not get here."); break;
586 }
587
588 /* Must return something to make the compiler happy. This is clearly an
589 * error case.
590 */
591 return 0;
592 }
593
594 ir_constant *
595 ir_constant::get_array_element(unsigned i) const
596 {
597 assert(this->type->is_array());
598
599 /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
600 *
601 * "Behavior is undefined if a shader subscripts an array with an index
602 * less than 0 or greater than or equal to the size the array was
603 * declared with."
604 *
605 * Most out-of-bounds accesses are removed before things could get this far.
606 * There are cases where non-constant array index values can get constant
607 * folded.
608 */
609 if (int(i) < 0)
610 i = 0;
611 else if (i >= this->type->length)
612 i = this->type->length - 1;
613
614 return array_elements[i];
615 }
616
617 ir_constant *
618 ir_constant::get_record_field(const char *name)
619 {
620 int idx = this->type->field_index(name);
621
622 if (idx < 0)
623 return NULL;
624
625 if (this->components.is_empty())
626 return NULL;
627
628 exec_node *node = this->components.head;
629 for (int i = 0; i < idx; i++) {
630 node = node->next;
631
632 /* If the end of the list is encountered before the element matching the
633 * requested field is found, return NULL.
634 */
635 if (node->is_tail_sentinel())
636 return NULL;
637 }
638
639 return (ir_constant *) node;
640 }
641
642
643 bool
644 ir_constant::has_value(const ir_constant *c) const
645 {
646 if (this->type != c->type)
647 return false;
648
649 if (this->type->is_array()) {
650 for (unsigned i = 0; i < this->type->length; i++) {
651 if (this->array_elements[i]->has_value(c->array_elements[i]))
652 return false;
653 }
654 return true;
655 }
656
657 if (this->type->base_type == GLSL_TYPE_STRUCT) {
658 const exec_node *a_node = this->components.head;
659 const exec_node *b_node = c->components.head;
660
661 while (!a_node->is_tail_sentinel()) {
662 assert(!b_node->is_tail_sentinel());
663
664 const ir_constant *const a_field = (ir_constant *) a_node;
665 const ir_constant *const b_field = (ir_constant *) b_node;
666
667 if (!a_field->has_value(b_field))
668 return false;
669
670 a_node = a_node->next;
671 b_node = b_node->next;
672 }
673
674 return true;
675 }
676
677 for (unsigned i = 0; i < this->type->components(); i++) {
678 switch (this->type->base_type) {
679 case GLSL_TYPE_UINT:
680 if (this->value.u[i] != c->value.u[i])
681 return false;
682 break;
683 case GLSL_TYPE_INT:
684 if (this->value.i[i] != c->value.i[i])
685 return false;
686 break;
687 case GLSL_TYPE_FLOAT:
688 if (this->value.f[i] != c->value.f[i])
689 return false;
690 break;
691 case GLSL_TYPE_BOOL:
692 if (this->value.b[i] != c->value.b[i])
693 return false;
694 break;
695 default:
696 assert(!"Should not get here.");
697 return false;
698 }
699 }
700
701 return true;
702 }
703
704 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
705 {
706 this->ir_type = ir_type_dereference_variable;
707 this->var = var;
708 this->type = (var != NULL) ? var->type : glsl_type::error_type;
709 }
710
711
712 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
713 ir_rvalue *array_index)
714 {
715 this->ir_type = ir_type_dereference_array;
716 this->array_index = array_index;
717 this->set_array(value);
718 }
719
720
721 ir_dereference_array::ir_dereference_array(ir_variable *var,
722 ir_rvalue *array_index)
723 {
724 void *ctx = talloc_parent(var);
725
726 this->ir_type = ir_type_dereference_array;
727 this->array_index = array_index;
728 this->set_array(new(ctx) ir_dereference_variable(var));
729 }
730
731
732 void
733 ir_dereference_array::set_array(ir_rvalue *value)
734 {
735 this->array = value;
736 this->type = glsl_type::error_type;
737
738 if (this->array != NULL) {
739 const glsl_type *const vt = this->array->type;
740
741 if (vt->is_array()) {
742 type = vt->element_type();
743 } else if (vt->is_matrix()) {
744 type = vt->column_type();
745 } else if (vt->is_vector()) {
746 type = vt->get_base_type();
747 }
748 }
749 }
750
751
752 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
753 const char *field)
754 {
755 this->ir_type = ir_type_dereference_record;
756 this->record = value;
757 this->field = talloc_strdup(this, field);
758 this->type = (this->record != NULL)
759 ? this->record->type->field_type(field) : glsl_type::error_type;
760 }
761
762
763 ir_dereference_record::ir_dereference_record(ir_variable *var,
764 const char *field)
765 {
766 void *ctx = talloc_parent(var);
767
768 this->ir_type = ir_type_dereference_record;
769 this->record = new(ctx) ir_dereference_variable(var);
770 this->field = talloc_strdup(this, field);
771 this->type = (this->record != NULL)
772 ? this->record->type->field_type(field) : glsl_type::error_type;
773 }
774
775 bool type_contains_sampler(const glsl_type *type)
776 {
777 if (type->is_array()) {
778 return type_contains_sampler(type->fields.array);
779 } else if (type->is_record()) {
780 for (unsigned int i = 0; i < type->length; i++) {
781 if (type_contains_sampler(type->fields.structure[i].type))
782 return true;
783 }
784 return false;
785 } else {
786 return type->is_sampler();
787 }
788 }
789
790 bool
791 ir_dereference::is_lvalue()
792 {
793 ir_variable *var = this->variable_referenced();
794
795 /* Every l-value derference chain eventually ends in a variable.
796 */
797 if ((var == NULL) || var->read_only)
798 return false;
799
800 if (this->type->is_array() && !var->array_lvalue)
801 return false;
802
803 /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
804 *
805 * "Samplers cannot be treated as l-values; hence cannot be used
806 * as out or inout function parameters, nor can they be
807 * assigned into."
808 */
809 if (type_contains_sampler(this->type))
810 return false;
811
812 return true;
813 }
814
815
816 const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf" };
817
818 const char *ir_texture::opcode_string()
819 {
820 assert((unsigned int) op <=
821 sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
822 return tex_opcode_strs[op];
823 }
824
825 ir_texture_opcode
826 ir_texture::get_opcode(const char *str)
827 {
828 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
829 for (int op = 0; op < count; op++) {
830 if (strcmp(str, tex_opcode_strs[op]) == 0)
831 return (ir_texture_opcode) op;
832 }
833 return (ir_texture_opcode) -1;
834 }
835
836
837 void
838 ir_texture::set_sampler(ir_dereference *sampler)
839 {
840 assert(sampler != NULL);
841 this->sampler = sampler;
842
843 switch (sampler->type->sampler_type) {
844 case GLSL_TYPE_FLOAT:
845 this->type = glsl_type::vec4_type;
846 break;
847 case GLSL_TYPE_INT:
848 this->type = glsl_type::ivec4_type;
849 break;
850 case GLSL_TYPE_UINT:
851 this->type = glsl_type::uvec4_type;
852 break;
853 }
854 }
855
856
857 void
858 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
859 {
860 assert((count >= 1) && (count <= 4));
861
862 memset(&this->mask, 0, sizeof(this->mask));
863 this->mask.num_components = count;
864
865 unsigned dup_mask = 0;
866 switch (count) {
867 case 4:
868 assert(comp[3] <= 3);
869 dup_mask |= (1U << comp[3])
870 & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
871 this->mask.w = comp[3];
872
873 case 3:
874 assert(comp[2] <= 3);
875 dup_mask |= (1U << comp[2])
876 & ((1U << comp[0]) | (1U << comp[1]));
877 this->mask.z = comp[2];
878
879 case 2:
880 assert(comp[1] <= 3);
881 dup_mask |= (1U << comp[1])
882 & ((1U << comp[0]));
883 this->mask.y = comp[1];
884
885 case 1:
886 assert(comp[0] <= 3);
887 this->mask.x = comp[0];
888 }
889
890 this->mask.has_duplicates = dup_mask != 0;
891
892 /* Based on the number of elements in the swizzle and the base type
893 * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
894 * generate the type of the resulting value.
895 */
896 type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
897 }
898
899 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
900 unsigned w, unsigned count)
901 : val(val)
902 {
903 const unsigned components[4] = { x, y, z, w };
904 this->ir_type = ir_type_swizzle;
905 this->init_mask(components, count);
906 }
907
908 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
909 unsigned count)
910 : val(val)
911 {
912 this->ir_type = ir_type_swizzle;
913 this->init_mask(comp, count);
914 }
915
916 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
917 {
918 this->ir_type = ir_type_swizzle;
919 this->val = val;
920 this->mask = mask;
921 this->type = glsl_type::get_instance(val->type->base_type,
922 mask.num_components, 1);
923 }
924
925 #define X 1
926 #define R 5
927 #define S 9
928 #define I 13
929
930 ir_swizzle *
931 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
932 {
933 void *ctx = talloc_parent(val);
934
935 /* For each possible swizzle character, this table encodes the value in
936 * \c idx_map that represents the 0th element of the vector. For invalid
937 * swizzle characters (e.g., 'k'), a special value is used that will allow
938 * detection of errors.
939 */
940 static const unsigned char base_idx[26] = {
941 /* a b c d e f g h i j k l m */
942 R, R, I, I, I, I, R, I, I, I, I, I, I,
943 /* n o p q r s t u v w x y z */
944 I, I, S, S, R, S, S, I, I, X, X, X, X
945 };
946
947 /* Each valid swizzle character has an entry in the previous table. This
948 * table encodes the base index encoded in the previous table plus the actual
949 * index of the swizzle character. When processing swizzles, the first
950 * character in the string is indexed in the previous table. Each character
951 * in the string is indexed in this table, and the value found there has the
952 * value form the first table subtracted. The result must be on the range
953 * [0,3].
954 *
955 * For example, the string "wzyx" will get X from the first table. Each of
956 * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After
957 * subtraction, the swizzle values are { 3, 2, 1, 0 }.
958 *
959 * The string "wzrg" will get X from the first table. Each of the characters
960 * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the
961 * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range
962 * [0,3], the error is detected.
963 */
964 static const unsigned char idx_map[26] = {
965 /* a b c d e f g h i j k l m */
966 R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0,
967 /* n o p q r s t u v w x y z */
968 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2
969 };
970
971 int swiz_idx[4] = { 0, 0, 0, 0 };
972 unsigned i;
973
974
975 /* Validate the first character in the swizzle string and look up the base
976 * index value as described above.
977 */
978 if ((str[0] < 'a') || (str[0] > 'z'))
979 return NULL;
980
981 const unsigned base = base_idx[str[0] - 'a'];
982
983
984 for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
985 /* Validate the next character, and, as described above, convert it to a
986 * swizzle index.
987 */
988 if ((str[i] < 'a') || (str[i] > 'z'))
989 return NULL;
990
991 swiz_idx[i] = idx_map[str[i] - 'a'] - base;
992 if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
993 return NULL;
994 }
995
996 if (str[i] != '\0')
997 return NULL;
998
999 return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
1000 swiz_idx[3], i);
1001 }
1002
1003 #undef X
1004 #undef R
1005 #undef S
1006 #undef I
1007
1008 ir_variable *
1009 ir_swizzle::variable_referenced()
1010 {
1011 return this->val->variable_referenced();
1012 }
1013
1014
1015 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
1016 ir_variable_mode mode)
1017 : max_array_access(0), read_only(false), centroid(false), invariant(false),
1018 mode(mode), interpolation(ir_var_smooth), array_lvalue(false)
1019 {
1020 this->ir_type = ir_type_variable;
1021 this->type = type;
1022 this->name = talloc_strdup(this, name);
1023 this->location = -1;
1024 this->warn_extension = NULL;
1025 this->constant_value = NULL;
1026 this->origin_upper_left = false;
1027 this->pixel_center_integer = false;
1028
1029 if (type && type->base_type == GLSL_TYPE_SAMPLER)
1030 this->read_only = true;
1031 }
1032
1033
1034 const char *
1035 ir_variable::interpolation_string() const
1036 {
1037 switch (this->interpolation) {
1038 case ir_var_smooth: return "smooth";
1039 case ir_var_flat: return "flat";
1040 case ir_var_noperspective: return "noperspective";
1041 }
1042
1043 assert(!"Should not get here.");
1044 return "";
1045 }
1046
1047
1048 unsigned
1049 ir_variable::component_slots() const
1050 {
1051 /* FINISHME: Sparsely accessed arrays require fewer slots. */
1052 return this->type->component_slots();
1053 }
1054
1055
1056 ir_function_signature::ir_function_signature(const glsl_type *return_type)
1057 : return_type(return_type), is_defined(false), _function(NULL)
1058 {
1059 this->ir_type = ir_type_function_signature;
1060 }
1061
1062
1063 const char *
1064 ir_function_signature::qualifiers_match(exec_list *params)
1065 {
1066 exec_list_iterator iter_a = parameters.iterator();
1067 exec_list_iterator iter_b = params->iterator();
1068
1069 /* check that the qualifiers match. */
1070 while (iter_a.has_next()) {
1071 ir_variable *a = (ir_variable *)iter_a.get();
1072 ir_variable *b = (ir_variable *)iter_b.get();
1073
1074 if (a->read_only != b->read_only ||
1075 a->mode != b->mode ||
1076 a->interpolation != b->interpolation ||
1077 a->centroid != b->centroid) {
1078
1079 /* parameter a's qualifiers don't match */
1080 return a->name;
1081 }
1082
1083 iter_a.next();
1084 iter_b.next();
1085 }
1086 return NULL;
1087 }
1088
1089
1090 void
1091 ir_function_signature::replace_parameters(exec_list *new_params)
1092 {
1093 /* Destroy all of the previous parameter information. If the previous
1094 * parameter information comes from the function prototype, it may either
1095 * specify incorrect parameter names or not have names at all.
1096 */
1097 foreach_iter(exec_list_iterator, iter, parameters) {
1098 assert(((ir_instruction *) iter.get())->as_variable() != NULL);
1099
1100 iter.remove();
1101 }
1102
1103 new_params->move_nodes_to(&parameters);
1104 }
1105
1106
1107 ir_function::ir_function(const char *name)
1108 {
1109 this->ir_type = ir_type_function;
1110 this->name = talloc_strdup(this, name);
1111 this->is_builtin = false;
1112 }
1113
1114
1115 ir_call *
1116 ir_call::get_error_instruction(void *ctx)
1117 {
1118 ir_call *call = new(ctx) ir_call;
1119
1120 call->type = glsl_type::error_type;
1121 return call;
1122 }
1123
1124 void
1125 ir_call::set_callee(ir_function_signature *sig)
1126 {
1127 assert((this->type == NULL) || (this->type == sig->return_type));
1128
1129 this->callee = sig;
1130 }
1131
1132 void
1133 visit_exec_list(exec_list *list, ir_visitor *visitor)
1134 {
1135 foreach_iter(exec_list_iterator, iter, *list) {
1136 ((ir_instruction *)iter.get())->accept(visitor);
1137 }
1138 }
1139
1140
1141 static void
1142 steal_memory(ir_instruction *ir, void *new_ctx)
1143 {
1144 ir_variable *var = ir->as_variable();
1145 ir_constant *constant = ir->as_constant();
1146 if (var != NULL && var->constant_value != NULL)
1147 steal_memory(var->constant_value, ir);
1148
1149 /* The components of aggregate constants are not visited by the normal
1150 * visitor, so steal their values by hand.
1151 */
1152 if (constant != NULL) {
1153 if (constant->type->is_record()) {
1154 foreach_iter(exec_list_iterator, iter, constant->components) {
1155 ir_constant *field = (ir_constant *)iter.get();
1156 steal_memory(field, ir);
1157 }
1158 } else if (constant->type->is_array()) {
1159 for (unsigned int i = 0; i < constant->type->length; i++) {
1160 steal_memory(constant->array_elements[i], ir);
1161 }
1162 }
1163 }
1164
1165 talloc_steal(new_ctx, ir);
1166 }
1167
1168
1169 void
1170 reparent_ir(exec_list *list, void *mem_ctx)
1171 {
1172 foreach_list(node, list) {
1173 visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
1174 }
1175 }