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