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