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