glsl: Track explicit location in AST to IR translation
[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
220 1, /* ir_unop_sin */
221 1, /* ir_unop_cos */
222
223 1, /* ir_unop_dFdx */
224 1, /* ir_unop_dFdy */
225
226 1, /* ir_unop_noise */
227
228 2, /* ir_binop_add */
229 2, /* ir_binop_sub */
230 2, /* ir_binop_mul */
231 2, /* ir_binop_div */
232 2, /* ir_binop_mod */
233
234 2, /* ir_binop_less */
235 2, /* ir_binop_greater */
236 2, /* ir_binop_lequal */
237 2, /* ir_binop_gequal */
238 2, /* ir_binop_equal */
239 2, /* ir_binop_nequal */
240 2, /* ir_binop_all_equal */
241 2, /* ir_binop_any_nequal */
242
243 2, /* ir_binop_lshift */
244 2, /* ir_binop_rshift */
245 2, /* ir_binop_bit_and */
246 2, /* ir_binop_bit_xor */
247 2, /* ir_binop_bit_or */
248
249 2, /* ir_binop_logic_and */
250 2, /* ir_binop_logic_xor */
251 2, /* ir_binop_logic_or */
252
253 2, /* ir_binop_dot */
254 2, /* ir_binop_cross */
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 "sin",
292 "cos",
293 "dFdx",
294 "dFdy",
295 "noise",
296 "+",
297 "-",
298 "*",
299 "/",
300 "%",
301 "<",
302 ">",
303 "<=",
304 ">=",
305 "==",
306 "!=",
307 "all_equal",
308 "any_nequal",
309 "<<",
310 ">>",
311 "&",
312 "^",
313 "|",
314 "&&",
315 "^^",
316 "||",
317 "dot",
318 "cross",
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
744 ir_loop::ir_loop()
745 {
746 this->ir_type = ir_type_loop;
747 this->cmp = ir_unop_neg;
748 this->from = NULL;
749 this->to = NULL;
750 this->increment = NULL;
751 this->counter = NULL;
752 }
753
754
755 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
756 {
757 this->ir_type = ir_type_dereference_variable;
758 this->var = var;
759 this->type = (var != NULL) ? var->type : glsl_type::error_type;
760 }
761
762
763 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
764 ir_rvalue *array_index)
765 {
766 this->ir_type = ir_type_dereference_array;
767 this->array_index = array_index;
768 this->set_array(value);
769 }
770
771
772 ir_dereference_array::ir_dereference_array(ir_variable *var,
773 ir_rvalue *array_index)
774 {
775 void *ctx = talloc_parent(var);
776
777 this->ir_type = ir_type_dereference_array;
778 this->array_index = array_index;
779 this->set_array(new(ctx) ir_dereference_variable(var));
780 }
781
782
783 void
784 ir_dereference_array::set_array(ir_rvalue *value)
785 {
786 this->array = value;
787 this->type = glsl_type::error_type;
788
789 if (this->array != NULL) {
790 const glsl_type *const vt = this->array->type;
791
792 if (vt->is_array()) {
793 type = vt->element_type();
794 } else if (vt->is_matrix()) {
795 type = vt->column_type();
796 } else if (vt->is_vector()) {
797 type = vt->get_base_type();
798 }
799 }
800 }
801
802
803 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
804 const char *field)
805 {
806 this->ir_type = ir_type_dereference_record;
807 this->record = value;
808 this->field = talloc_strdup(this, field);
809 this->type = (this->record != NULL)
810 ? this->record->type->field_type(field) : glsl_type::error_type;
811 }
812
813
814 ir_dereference_record::ir_dereference_record(ir_variable *var,
815 const char *field)
816 {
817 void *ctx = talloc_parent(var);
818
819 this->ir_type = ir_type_dereference_record;
820 this->record = new(ctx) ir_dereference_variable(var);
821 this->field = talloc_strdup(this, field);
822 this->type = (this->record != NULL)
823 ? this->record->type->field_type(field) : glsl_type::error_type;
824 }
825
826 bool type_contains_sampler(const glsl_type *type)
827 {
828 if (type->is_array()) {
829 return type_contains_sampler(type->fields.array);
830 } else if (type->is_record()) {
831 for (unsigned int i = 0; i < type->length; i++) {
832 if (type_contains_sampler(type->fields.structure[i].type))
833 return true;
834 }
835 return false;
836 } else {
837 return type->is_sampler();
838 }
839 }
840
841 bool
842 ir_dereference::is_lvalue()
843 {
844 ir_variable *var = this->variable_referenced();
845
846 /* Every l-value derference chain eventually ends in a variable.
847 */
848 if ((var == NULL) || var->read_only)
849 return false;
850
851 if (this->type->is_array() && !var->array_lvalue)
852 return false;
853
854 /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
855 *
856 * "Samplers cannot be treated as l-values; hence cannot be used
857 * as out or inout function parameters, nor can they be
858 * assigned into."
859 */
860 if (type_contains_sampler(this->type))
861 return false;
862
863 return true;
864 }
865
866
867 const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf" };
868
869 const char *ir_texture::opcode_string()
870 {
871 assert((unsigned int) op <=
872 sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
873 return tex_opcode_strs[op];
874 }
875
876 ir_texture_opcode
877 ir_texture::get_opcode(const char *str)
878 {
879 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
880 for (int op = 0; op < count; op++) {
881 if (strcmp(str, tex_opcode_strs[op]) == 0)
882 return (ir_texture_opcode) op;
883 }
884 return (ir_texture_opcode) -1;
885 }
886
887
888 void
889 ir_texture::set_sampler(ir_dereference *sampler)
890 {
891 assert(sampler != NULL);
892 this->sampler = sampler;
893
894 switch (sampler->type->sampler_type) {
895 case GLSL_TYPE_FLOAT:
896 this->type = glsl_type::vec4_type;
897 break;
898 case GLSL_TYPE_INT:
899 this->type = glsl_type::ivec4_type;
900 break;
901 case GLSL_TYPE_UINT:
902 this->type = glsl_type::uvec4_type;
903 break;
904 }
905 }
906
907
908 void
909 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
910 {
911 assert((count >= 1) && (count <= 4));
912
913 memset(&this->mask, 0, sizeof(this->mask));
914 this->mask.num_components = count;
915
916 unsigned dup_mask = 0;
917 switch (count) {
918 case 4:
919 assert(comp[3] <= 3);
920 dup_mask |= (1U << comp[3])
921 & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
922 this->mask.w = comp[3];
923
924 case 3:
925 assert(comp[2] <= 3);
926 dup_mask |= (1U << comp[2])
927 & ((1U << comp[0]) | (1U << comp[1]));
928 this->mask.z = comp[2];
929
930 case 2:
931 assert(comp[1] <= 3);
932 dup_mask |= (1U << comp[1])
933 & ((1U << comp[0]));
934 this->mask.y = comp[1];
935
936 case 1:
937 assert(comp[0] <= 3);
938 this->mask.x = comp[0];
939 }
940
941 this->mask.has_duplicates = dup_mask != 0;
942
943 /* Based on the number of elements in the swizzle and the base type
944 * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
945 * generate the type of the resulting value.
946 */
947 type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
948 }
949
950 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
951 unsigned w, unsigned count)
952 : val(val)
953 {
954 const unsigned components[4] = { x, y, z, w };
955 this->ir_type = ir_type_swizzle;
956 this->init_mask(components, count);
957 }
958
959 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
960 unsigned count)
961 : val(val)
962 {
963 this->ir_type = ir_type_swizzle;
964 this->init_mask(comp, count);
965 }
966
967 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
968 {
969 this->ir_type = ir_type_swizzle;
970 this->val = val;
971 this->mask = mask;
972 this->type = glsl_type::get_instance(val->type->base_type,
973 mask.num_components, 1);
974 }
975
976 #define X 1
977 #define R 5
978 #define S 9
979 #define I 13
980
981 ir_swizzle *
982 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
983 {
984 void *ctx = talloc_parent(val);
985
986 /* For each possible swizzle character, this table encodes the value in
987 * \c idx_map that represents the 0th element of the vector. For invalid
988 * swizzle characters (e.g., 'k'), a special value is used that will allow
989 * detection of errors.
990 */
991 static const unsigned char base_idx[26] = {
992 /* a b c d e f g h i j k l m */
993 R, R, I, I, I, I, R, I, I, I, I, I, I,
994 /* n o p q r s t u v w x y z */
995 I, I, S, S, R, S, S, I, I, X, X, X, X
996 };
997
998 /* Each valid swizzle character has an entry in the previous table. This
999 * table encodes the base index encoded in the previous table plus the actual
1000 * index of the swizzle character. When processing swizzles, the first
1001 * character in the string is indexed in the previous table. Each character
1002 * in the string is indexed in this table, and the value found there has the
1003 * value form the first table subtracted. The result must be on the range
1004 * [0,3].
1005 *
1006 * For example, the string "wzyx" will get X from the first table. Each of
1007 * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After
1008 * subtraction, the swizzle values are { 3, 2, 1, 0 }.
1009 *
1010 * The string "wzrg" will get X from the first table. Each of the characters
1011 * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the
1012 * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range
1013 * [0,3], the error is detected.
1014 */
1015 static const unsigned char idx_map[26] = {
1016 /* a b c d e f g h i j k l m */
1017 R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0,
1018 /* n o p q r s t u v w x y z */
1019 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2
1020 };
1021
1022 int swiz_idx[4] = { 0, 0, 0, 0 };
1023 unsigned i;
1024
1025
1026 /* Validate the first character in the swizzle string and look up the base
1027 * index value as described above.
1028 */
1029 if ((str[0] < 'a') || (str[0] > 'z'))
1030 return NULL;
1031
1032 const unsigned base = base_idx[str[0] - 'a'];
1033
1034
1035 for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
1036 /* Validate the next character, and, as described above, convert it to a
1037 * swizzle index.
1038 */
1039 if ((str[i] < 'a') || (str[i] > 'z'))
1040 return NULL;
1041
1042 swiz_idx[i] = idx_map[str[i] - 'a'] - base;
1043 if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
1044 return NULL;
1045 }
1046
1047 if (str[i] != '\0')
1048 return NULL;
1049
1050 return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
1051 swiz_idx[3], i);
1052 }
1053
1054 #undef X
1055 #undef R
1056 #undef S
1057 #undef I
1058
1059 ir_variable *
1060 ir_swizzle::variable_referenced()
1061 {
1062 return this->val->variable_referenced();
1063 }
1064
1065
1066 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
1067 ir_variable_mode mode)
1068 : max_array_access(0), read_only(false), centroid(false), invariant(false),
1069 mode(mode), interpolation(ir_var_smooth), array_lvalue(false)
1070 {
1071 this->ir_type = ir_type_variable;
1072 this->type = type;
1073 this->name = talloc_strdup(this, name);
1074 this->explicit_location = false;
1075 this->location = -1;
1076 this->warn_extension = NULL;
1077 this->constant_value = NULL;
1078 this->origin_upper_left = false;
1079 this->pixel_center_integer = false;
1080
1081 if (type && type->base_type == GLSL_TYPE_SAMPLER)
1082 this->read_only = true;
1083 }
1084
1085
1086 const char *
1087 ir_variable::interpolation_string() const
1088 {
1089 switch (this->interpolation) {
1090 case ir_var_smooth: return "smooth";
1091 case ir_var_flat: return "flat";
1092 case ir_var_noperspective: return "noperspective";
1093 }
1094
1095 assert(!"Should not get here.");
1096 return "";
1097 }
1098
1099
1100 unsigned
1101 ir_variable::component_slots() const
1102 {
1103 /* FINISHME: Sparsely accessed arrays require fewer slots. */
1104 return this->type->component_slots();
1105 }
1106
1107
1108 ir_function_signature::ir_function_signature(const glsl_type *return_type)
1109 : return_type(return_type), is_defined(false), _function(NULL)
1110 {
1111 this->ir_type = ir_type_function_signature;
1112 this->is_builtin = false;
1113 }
1114
1115
1116 const char *
1117 ir_function_signature::qualifiers_match(exec_list *params)
1118 {
1119 exec_list_iterator iter_a = parameters.iterator();
1120 exec_list_iterator iter_b = params->iterator();
1121
1122 /* check that the qualifiers match. */
1123 while (iter_a.has_next()) {
1124 ir_variable *a = (ir_variable *)iter_a.get();
1125 ir_variable *b = (ir_variable *)iter_b.get();
1126
1127 if (a->read_only != b->read_only ||
1128 a->mode != b->mode ||
1129 a->interpolation != b->interpolation ||
1130 a->centroid != b->centroid) {
1131
1132 /* parameter a's qualifiers don't match */
1133 return a->name;
1134 }
1135
1136 iter_a.next();
1137 iter_b.next();
1138 }
1139 return NULL;
1140 }
1141
1142
1143 void
1144 ir_function_signature::replace_parameters(exec_list *new_params)
1145 {
1146 /* Destroy all of the previous parameter information. If the previous
1147 * parameter information comes from the function prototype, it may either
1148 * specify incorrect parameter names or not have names at all.
1149 */
1150 foreach_iter(exec_list_iterator, iter, parameters) {
1151 assert(((ir_instruction *) iter.get())->as_variable() != NULL);
1152
1153 iter.remove();
1154 }
1155
1156 new_params->move_nodes_to(&parameters);
1157 }
1158
1159
1160 ir_function::ir_function(const char *name)
1161 {
1162 this->ir_type = ir_type_function;
1163 this->name = talloc_strdup(this, name);
1164 }
1165
1166
1167 bool
1168 ir_function::has_user_signature()
1169 {
1170 foreach_list(n, &this->signatures) {
1171 ir_function_signature *const sig = (ir_function_signature *) n;
1172 if (!sig->is_builtin)
1173 return true;
1174 }
1175 return false;
1176 }
1177
1178
1179 ir_call *
1180 ir_call::get_error_instruction(void *ctx)
1181 {
1182 ir_call *call = new(ctx) ir_call;
1183
1184 call->type = glsl_type::error_type;
1185 return call;
1186 }
1187
1188 void
1189 ir_call::set_callee(ir_function_signature *sig)
1190 {
1191 assert((this->type == NULL) || (this->type == sig->return_type));
1192
1193 this->callee = sig;
1194 }
1195
1196 void
1197 visit_exec_list(exec_list *list, ir_visitor *visitor)
1198 {
1199 foreach_iter(exec_list_iterator, iter, *list) {
1200 ((ir_instruction *)iter.get())->accept(visitor);
1201 }
1202 }
1203
1204
1205 static void
1206 steal_memory(ir_instruction *ir, void *new_ctx)
1207 {
1208 ir_variable *var = ir->as_variable();
1209 ir_constant *constant = ir->as_constant();
1210 if (var != NULL && var->constant_value != NULL)
1211 steal_memory(var->constant_value, ir);
1212
1213 /* The components of aggregate constants are not visited by the normal
1214 * visitor, so steal their values by hand.
1215 */
1216 if (constant != NULL) {
1217 if (constant->type->is_record()) {
1218 foreach_iter(exec_list_iterator, iter, constant->components) {
1219 ir_constant *field = (ir_constant *)iter.get();
1220 steal_memory(field, ir);
1221 }
1222 } else if (constant->type->is_array()) {
1223 for (unsigned int i = 0; i < constant->type->length; i++) {
1224 steal_memory(constant->array_elements[i], ir);
1225 }
1226 }
1227 }
1228
1229 talloc_steal(new_ctx, ir);
1230 }
1231
1232
1233 void
1234 reparent_ir(exec_list *list, void *mem_ctx)
1235 {
1236 foreach_list(node, list) {
1237 visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
1238 }
1239 }