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