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