glsl: Initialize the rest of values of ir_constant::value.
[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
413 ir_constant *value = (ir_constant *) (value_list->head);
414
415 /* Use each component from each entry in the value_list to initialize one
416 * component of the constant being constructed.
417 */
418 for (unsigned i = 0; i < type->components(); /* empty */) {
419 assert(value->as_constant() != NULL);
420 assert(!value->is_tail_sentinel());
421
422 for (unsigned j = 0; j < value->type->components(); j++) {
423 switch (type->base_type) {
424 case GLSL_TYPE_UINT:
425 this->value.u[i] = value->get_uint_component(j);
426 break;
427 case GLSL_TYPE_INT:
428 this->value.i[i] = value->get_int_component(j);
429 break;
430 case GLSL_TYPE_FLOAT:
431 this->value.f[i] = value->get_float_component(j);
432 break;
433 case GLSL_TYPE_BOOL:
434 this->value.b[i] = value->get_bool_component(j);
435 break;
436 default:
437 /* FINISHME: What to do? Exceptions are not the answer.
438 */
439 break;
440 }
441
442 i++;
443 if (i >= type->components())
444 break;
445 }
446
447 value = (ir_constant *) value->next;
448 }
449 }
450
451 ir_constant *
452 ir_constant::zero(void *mem_ctx, const glsl_type *type)
453 {
454 assert(type->is_numeric());
455
456 ir_constant *c = new(mem_ctx) ir_constant;
457 c->type = type;
458 memset(&c->value, 0, sizeof(c->value));
459
460 return c;
461 }
462
463 bool
464 ir_constant::get_bool_component(unsigned i) const
465 {
466 switch (this->type->base_type) {
467 case GLSL_TYPE_UINT: return this->value.u[i] != 0;
468 case GLSL_TYPE_INT: return this->value.i[i] != 0;
469 case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
470 case GLSL_TYPE_BOOL: return this->value.b[i];
471 default: assert(!"Should not get here."); break;
472 }
473
474 /* Must return something to make the compiler happy. This is clearly an
475 * error case.
476 */
477 return false;
478 }
479
480 float
481 ir_constant::get_float_component(unsigned i) const
482 {
483 switch (this->type->base_type) {
484 case GLSL_TYPE_UINT: return (float) this->value.u[i];
485 case GLSL_TYPE_INT: return (float) this->value.i[i];
486 case GLSL_TYPE_FLOAT: return this->value.f[i];
487 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0 : 0.0;
488 default: assert(!"Should not get here."); break;
489 }
490
491 /* Must return something to make the compiler happy. This is clearly an
492 * error case.
493 */
494 return 0.0;
495 }
496
497 int
498 ir_constant::get_int_component(unsigned i) const
499 {
500 switch (this->type->base_type) {
501 case GLSL_TYPE_UINT: return this->value.u[i];
502 case GLSL_TYPE_INT: return this->value.i[i];
503 case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
504 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
505 default: assert(!"Should not get here."); break;
506 }
507
508 /* Must return something to make the compiler happy. This is clearly an
509 * error case.
510 */
511 return 0;
512 }
513
514 unsigned
515 ir_constant::get_uint_component(unsigned i) const
516 {
517 switch (this->type->base_type) {
518 case GLSL_TYPE_UINT: return this->value.u[i];
519 case GLSL_TYPE_INT: return this->value.i[i];
520 case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
521 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
522 default: assert(!"Should not get here."); break;
523 }
524
525 /* Must return something to make the compiler happy. This is clearly an
526 * error case.
527 */
528 return 0;
529 }
530
531 ir_constant *
532 ir_constant::get_array_element(unsigned i) const
533 {
534 assert(this->type->is_array());
535
536 /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
537 *
538 * "Behavior is undefined if a shader subscripts an array with an index
539 * less than 0 or greater than or equal to the size the array was
540 * declared with."
541 *
542 * Most out-of-bounds accesses are removed before things could get this far.
543 * There are cases where non-constant array index values can get constant
544 * folded.
545 */
546 if (int(i) < 0)
547 i = 0;
548 else if (i >= this->type->length)
549 i = this->type->length - 1;
550
551 return array_elements[i];
552 }
553
554 ir_constant *
555 ir_constant::get_record_field(const char *name)
556 {
557 int idx = this->type->field_index(name);
558
559 if (idx < 0)
560 return NULL;
561
562 if (this->components.is_empty())
563 return NULL;
564
565 exec_node *node = this->components.head;
566 for (int i = 0; i < idx; i++) {
567 node = node->next;
568
569 /* If the end of the list is encountered before the element matching the
570 * requested field is found, return NULL.
571 */
572 if (node->is_tail_sentinel())
573 return NULL;
574 }
575
576 return (ir_constant *) node;
577 }
578
579
580 bool
581 ir_constant::has_value(const ir_constant *c) const
582 {
583 if (this->type != c->type)
584 return false;
585
586 if (this->type->is_array()) {
587 for (unsigned i = 0; i < this->type->length; i++) {
588 if (this->array_elements[i]->has_value(c->array_elements[i]))
589 return false;
590 }
591 return true;
592 }
593
594 if (this->type->base_type == GLSL_TYPE_STRUCT) {
595 const exec_node *a_node = this->components.head;
596 const exec_node *b_node = c->components.head;
597
598 while (!a_node->is_tail_sentinel()) {
599 assert(!b_node->is_tail_sentinel());
600
601 const ir_constant *const a_field = (ir_constant *) a_node;
602 const ir_constant *const b_field = (ir_constant *) b_node;
603
604 if (!a_field->has_value(b_field))
605 return false;
606
607 a_node = a_node->next;
608 b_node = b_node->next;
609 }
610
611 return true;
612 }
613
614 for (unsigned i = 0; i < this->type->components(); i++) {
615 switch (this->type->base_type) {
616 case GLSL_TYPE_UINT:
617 if (this->value.u[i] != c->value.u[i])
618 return false;
619 break;
620 case GLSL_TYPE_INT:
621 if (this->value.i[i] != c->value.i[i])
622 return false;
623 break;
624 case GLSL_TYPE_FLOAT:
625 if (this->value.f[i] != c->value.f[i])
626 return false;
627 break;
628 case GLSL_TYPE_BOOL:
629 if (this->value.b[i] != c->value.b[i])
630 return false;
631 break;
632 default:
633 assert(!"Should not get here.");
634 return false;
635 }
636 }
637
638 return true;
639 }
640
641 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
642 {
643 this->ir_type = ir_type_dereference_variable;
644 this->var = var;
645 this->type = (var != NULL) ? var->type : glsl_type::error_type;
646 }
647
648
649 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
650 ir_rvalue *array_index)
651 {
652 this->ir_type = ir_type_dereference_array;
653 this->array_index = array_index;
654 this->set_array(value);
655 }
656
657
658 ir_dereference_array::ir_dereference_array(ir_variable *var,
659 ir_rvalue *array_index)
660 {
661 void *ctx = talloc_parent(var);
662
663 this->ir_type = ir_type_dereference_array;
664 this->array_index = array_index;
665 this->set_array(new(ctx) ir_dereference_variable(var));
666 }
667
668
669 void
670 ir_dereference_array::set_array(ir_rvalue *value)
671 {
672 this->array = value;
673 this->type = glsl_type::error_type;
674
675 if (this->array != NULL) {
676 const glsl_type *const vt = this->array->type;
677
678 if (vt->is_array()) {
679 type = vt->element_type();
680 } else if (vt->is_matrix()) {
681 type = vt->column_type();
682 } else if (vt->is_vector()) {
683 type = vt->get_base_type();
684 }
685 }
686 }
687
688
689 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
690 const char *field)
691 {
692 this->ir_type = ir_type_dereference_record;
693 this->record = value;
694 this->field = talloc_strdup(this, field);
695 this->type = (this->record != NULL)
696 ? this->record->type->field_type(field) : glsl_type::error_type;
697 }
698
699
700 ir_dereference_record::ir_dereference_record(ir_variable *var,
701 const char *field)
702 {
703 void *ctx = talloc_parent(var);
704
705 this->ir_type = ir_type_dereference_record;
706 this->record = new(ctx) ir_dereference_variable(var);
707 this->field = talloc_strdup(this, field);
708 this->type = (this->record != NULL)
709 ? this->record->type->field_type(field) : glsl_type::error_type;
710 }
711
712 bool type_contains_sampler(const glsl_type *type)
713 {
714 if (type->is_array()) {
715 return type_contains_sampler(type->fields.array);
716 } else if (type->is_record()) {
717 for (unsigned int i = 0; i < type->length; i++) {
718 if (type_contains_sampler(type->fields.structure[i].type))
719 return true;
720 }
721 return false;
722 } else {
723 return type->is_sampler();
724 }
725 }
726
727 bool
728 ir_dereference::is_lvalue()
729 {
730 ir_variable *var = this->variable_referenced();
731
732 /* Every l-value derference chain eventually ends in a variable.
733 */
734 if ((var == NULL) || var->read_only)
735 return false;
736
737 if (this->type->is_array() && !var->array_lvalue)
738 return false;
739
740 /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
741 *
742 * "Samplers cannot be treated as l-values; hence cannot be used
743 * as out or inout function parameters, nor can they be
744 * assigned into."
745 */
746 if (type_contains_sampler(this->type))
747 return false;
748
749 return true;
750 }
751
752
753 const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf" };
754
755 const char *ir_texture::opcode_string()
756 {
757 assert((unsigned int) op <=
758 sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
759 return tex_opcode_strs[op];
760 }
761
762 ir_texture_opcode
763 ir_texture::get_opcode(const char *str)
764 {
765 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
766 for (int op = 0; op < count; op++) {
767 if (strcmp(str, tex_opcode_strs[op]) == 0)
768 return (ir_texture_opcode) op;
769 }
770 return (ir_texture_opcode) -1;
771 }
772
773
774 void
775 ir_texture::set_sampler(ir_dereference *sampler)
776 {
777 assert(sampler != NULL);
778 this->sampler = sampler;
779
780 switch (sampler->type->sampler_type) {
781 case GLSL_TYPE_FLOAT:
782 this->type = glsl_type::vec4_type;
783 break;
784 case GLSL_TYPE_INT:
785 this->type = glsl_type::ivec4_type;
786 break;
787 case GLSL_TYPE_UINT:
788 this->type = glsl_type::uvec4_type;
789 break;
790 }
791 }
792
793
794 void
795 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
796 {
797 assert((count >= 1) && (count <= 4));
798
799 memset(&this->mask, 0, sizeof(this->mask));
800 this->mask.num_components = count;
801
802 unsigned dup_mask = 0;
803 switch (count) {
804 case 4:
805 assert(comp[3] <= 3);
806 dup_mask |= (1U << comp[3])
807 & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
808 this->mask.w = comp[3];
809
810 case 3:
811 assert(comp[2] <= 3);
812 dup_mask |= (1U << comp[2])
813 & ((1U << comp[0]) | (1U << comp[1]));
814 this->mask.z = comp[2];
815
816 case 2:
817 assert(comp[1] <= 3);
818 dup_mask |= (1U << comp[1])
819 & ((1U << comp[0]));
820 this->mask.y = comp[1];
821
822 case 1:
823 assert(comp[0] <= 3);
824 this->mask.x = comp[0];
825 }
826
827 this->mask.has_duplicates = dup_mask != 0;
828
829 /* Based on the number of elements in the swizzle and the base type
830 * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
831 * generate the type of the resulting value.
832 */
833 type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
834 }
835
836 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
837 unsigned w, unsigned count)
838 : val(val)
839 {
840 const unsigned components[4] = { x, y, z, w };
841 this->ir_type = ir_type_swizzle;
842 this->init_mask(components, count);
843 }
844
845 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
846 unsigned count)
847 : val(val)
848 {
849 this->ir_type = ir_type_swizzle;
850 this->init_mask(comp, count);
851 }
852
853 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
854 {
855 this->ir_type = ir_type_swizzle;
856 this->val = val;
857 this->mask = mask;
858 this->type = glsl_type::get_instance(val->type->base_type,
859 mask.num_components, 1);
860 }
861
862 #define X 1
863 #define R 5
864 #define S 9
865 #define I 13
866
867 ir_swizzle *
868 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
869 {
870 void *ctx = talloc_parent(val);
871
872 /* For each possible swizzle character, this table encodes the value in
873 * \c idx_map that represents the 0th element of the vector. For invalid
874 * swizzle characters (e.g., 'k'), a special value is used that will allow
875 * detection of errors.
876 */
877 static const unsigned char base_idx[26] = {
878 /* a b c d e f g h i j k l m */
879 R, R, I, I, I, I, R, I, I, I, I, I, I,
880 /* n o p q r s t u v w x y z */
881 I, I, S, S, R, S, S, I, I, X, X, X, X
882 };
883
884 /* Each valid swizzle character has an entry in the previous table. This
885 * table encodes the base index encoded in the previous table plus the actual
886 * index of the swizzle character. When processing swizzles, the first
887 * character in the string is indexed in the previous table. Each character
888 * in the string is indexed in this table, and the value found there has the
889 * value form the first table subtracted. The result must be on the range
890 * [0,3].
891 *
892 * For example, the string "wzyx" will get X from the first table. Each of
893 * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After
894 * subtraction, the swizzle values are { 3, 2, 1, 0 }.
895 *
896 * The string "wzrg" will get X from the first table. Each of the characters
897 * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the
898 * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range
899 * [0,3], the error is detected.
900 */
901 static const unsigned char idx_map[26] = {
902 /* a b c d e f g h i j k l m */
903 R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0,
904 /* n o p q r s t u v w x y z */
905 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2
906 };
907
908 int swiz_idx[4] = { 0, 0, 0, 0 };
909 unsigned i;
910
911
912 /* Validate the first character in the swizzle string and look up the base
913 * index value as described above.
914 */
915 if ((str[0] < 'a') || (str[0] > 'z'))
916 return NULL;
917
918 const unsigned base = base_idx[str[0] - 'a'];
919
920
921 for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
922 /* Validate the next character, and, as described above, convert it to a
923 * swizzle index.
924 */
925 if ((str[i] < 'a') || (str[i] > 'z'))
926 return NULL;
927
928 swiz_idx[i] = idx_map[str[i] - 'a'] - base;
929 if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
930 return NULL;
931 }
932
933 if (str[i] != '\0')
934 return NULL;
935
936 return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
937 swiz_idx[3], i);
938 }
939
940 #undef X
941 #undef R
942 #undef S
943 #undef I
944
945 ir_variable *
946 ir_swizzle::variable_referenced()
947 {
948 return this->val->variable_referenced();
949 }
950
951
952 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
953 ir_variable_mode mode)
954 : max_array_access(0), read_only(false), centroid(false), invariant(false),
955 mode(mode), interpolation(ir_var_smooth), array_lvalue(false)
956 {
957 this->ir_type = ir_type_variable;
958 this->type = type;
959 this->name = talloc_strdup(this, name);
960 this->location = -1;
961 this->warn_extension = NULL;
962 this->constant_value = NULL;
963 this->origin_upper_left = false;
964 this->pixel_center_integer = false;
965
966 if (type && type->base_type == GLSL_TYPE_SAMPLER)
967 this->read_only = true;
968 }
969
970
971 const char *
972 ir_variable::interpolation_string() const
973 {
974 switch (this->interpolation) {
975 case ir_var_smooth: return "smooth";
976 case ir_var_flat: return "flat";
977 case ir_var_noperspective: return "noperspective";
978 }
979
980 assert(!"Should not get here.");
981 return "";
982 }
983
984
985 unsigned
986 ir_variable::component_slots() const
987 {
988 /* FINISHME: Sparsely accessed arrays require fewer slots. */
989 return this->type->component_slots();
990 }
991
992
993 ir_function_signature::ir_function_signature(const glsl_type *return_type)
994 : return_type(return_type), is_defined(false), _function(NULL)
995 {
996 this->ir_type = ir_type_function_signature;
997 }
998
999
1000 const char *
1001 ir_function_signature::qualifiers_match(exec_list *params)
1002 {
1003 exec_list_iterator iter_a = parameters.iterator();
1004 exec_list_iterator iter_b = params->iterator();
1005
1006 /* check that the qualifiers match. */
1007 while (iter_a.has_next()) {
1008 ir_variable *a = (ir_variable *)iter_a.get();
1009 ir_variable *b = (ir_variable *)iter_b.get();
1010
1011 if (a->read_only != b->read_only ||
1012 a->mode != b->mode ||
1013 a->interpolation != b->interpolation ||
1014 a->centroid != b->centroid) {
1015
1016 /* parameter a's qualifiers don't match */
1017 return a->name;
1018 }
1019
1020 iter_a.next();
1021 iter_b.next();
1022 }
1023 return NULL;
1024 }
1025
1026
1027 void
1028 ir_function_signature::replace_parameters(exec_list *new_params)
1029 {
1030 /* Destroy all of the previous parameter information. If the previous
1031 * parameter information comes from the function prototype, it may either
1032 * specify incorrect parameter names or not have names at all.
1033 */
1034 foreach_iter(exec_list_iterator, iter, parameters) {
1035 assert(((ir_instruction *) iter.get())->as_variable() != NULL);
1036
1037 iter.remove();
1038 }
1039
1040 new_params->move_nodes_to(&parameters);
1041 }
1042
1043
1044 ir_function::ir_function(const char *name)
1045 {
1046 this->ir_type = ir_type_function;
1047 this->name = talloc_strdup(this, name);
1048 this->is_builtin = false;
1049 }
1050
1051
1052 ir_call *
1053 ir_call::get_error_instruction(void *ctx)
1054 {
1055 ir_call *call = new(ctx) ir_call;
1056
1057 call->type = glsl_type::error_type;
1058 return call;
1059 }
1060
1061 void
1062 ir_call::set_callee(ir_function_signature *sig)
1063 {
1064 assert((this->type == NULL) || (this->type == sig->return_type));
1065
1066 this->callee = sig;
1067 }
1068
1069 void
1070 visit_exec_list(exec_list *list, ir_visitor *visitor)
1071 {
1072 foreach_iter(exec_list_iterator, iter, *list) {
1073 ((ir_instruction *)iter.get())->accept(visitor);
1074 }
1075 }
1076
1077
1078 static void
1079 steal_memory(ir_instruction *ir, void *new_ctx)
1080 {
1081 ir_variable *var = ir->as_variable();
1082 ir_constant *constant = ir->as_constant();
1083 if (var != NULL && var->constant_value != NULL)
1084 steal_memory(var->constant_value, ir);
1085
1086 /* The components of aggregate constants are not visited by the normal
1087 * visitor, so steal their values by hand.
1088 */
1089 if (constant != NULL) {
1090 if (constant->type->is_record()) {
1091 foreach_iter(exec_list_iterator, iter, constant->components) {
1092 ir_constant *field = (ir_constant *)iter.get();
1093 steal_memory(field, ir);
1094 }
1095 } else if (constant->type->is_array()) {
1096 for (unsigned int i = 0; i < constant->type->length; i++) {
1097 steal_memory(constant->array_elements[i], ir);
1098 }
1099 }
1100 }
1101
1102 talloc_steal(new_ctx, ir);
1103 }
1104
1105
1106 void
1107 reparent_ir(exec_list *list, void *mem_ctx)
1108 {
1109 foreach_list(node, list) {
1110 visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
1111 }
1112 }