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