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