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