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