glsl: Fix handling of function calls inside nested loops.
[mesa.git] / src / glsl / ir.cpp
1 /*
2 * Copyright © 2010 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 */
23 #include <string.h>
24 #include "main/core.h" /* for MAX2 */
25 #include "ir.h"
26 #include "ir_visitor.h"
27 #include "glsl_types.h"
28
29 ir_rvalue::ir_rvalue()
30 {
31 this->type = glsl_type::error_type;
32 }
33
34 bool ir_rvalue::is_zero() const
35 {
36 return false;
37 }
38
39 bool ir_rvalue::is_one() const
40 {
41 return false;
42 }
43
44 bool ir_rvalue::is_negative_one() const
45 {
46 return false;
47 }
48
49 bool ir_rvalue::is_basis() const
50 {
51 return false;
52 }
53
54 /**
55 * Modify the swizzle make to move one component to another
56 *
57 * \param m IR swizzle to be modified
58 * \param from Component in the RHS that is to be swizzled
59 * \param to Desired swizzle location of \c from
60 */
61 static void
62 update_rhs_swizzle(ir_swizzle_mask &m, unsigned from, unsigned to)
63 {
64 switch (to) {
65 case 0: m.x = from; break;
66 case 1: m.y = from; break;
67 case 2: m.z = from; break;
68 case 3: m.w = from; break;
69 default: assert(!"Should not get here.");
70 }
71
72 m.num_components = MAX2(m.num_components, (to + 1));
73 }
74
75 void
76 ir_assignment::set_lhs(ir_rvalue *lhs)
77 {
78 void *mem_ctx = this;
79 bool swizzled = false;
80
81 while (lhs != NULL) {
82 ir_swizzle *swiz = lhs->as_swizzle();
83
84 if (swiz == NULL)
85 break;
86
87 unsigned write_mask = 0;
88 ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
89
90 for (unsigned i = 0; i < swiz->mask.num_components; i++) {
91 unsigned c = 0;
92
93 switch (i) {
94 case 0: c = swiz->mask.x; break;
95 case 1: c = swiz->mask.y; break;
96 case 2: c = swiz->mask.z; break;
97 case 3: c = swiz->mask.w; break;
98 default: assert(!"Should not get here.");
99 }
100
101 write_mask |= (((this->write_mask >> i) & 1) << c);
102 update_rhs_swizzle(rhs_swiz, i, c);
103 }
104
105 this->write_mask = write_mask;
106 lhs = swiz->val;
107
108 this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
109 swizzled = true;
110 }
111
112 if (swizzled) {
113 /* Now, RHS channels line up with the LHS writemask. Collapse it
114 * to just the channels that will be written.
115 */
116 ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
117 int rhs_chan = 0;
118 for (int i = 0; i < 4; i++) {
119 if (write_mask & (1 << i))
120 update_rhs_swizzle(rhs_swiz, i, rhs_chan++);
121 }
122 this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
123 }
124
125 assert((lhs == NULL) || lhs->as_dereference());
126
127 this->lhs = (ir_dereference *) lhs;
128 }
129
130 ir_variable *
131 ir_assignment::whole_variable_written()
132 {
133 ir_variable *v = this->lhs->whole_variable_referenced();
134
135 if (v == NULL)
136 return NULL;
137
138 if (v->type->is_scalar())
139 return v;
140
141 if (v->type->is_vector()) {
142 const unsigned mask = (1U << v->type->vector_elements) - 1;
143
144 if (mask != this->write_mask)
145 return NULL;
146 }
147
148 /* Either all the vector components are assigned or the variable is some
149 * composite type (and the whole thing is assigned.
150 */
151 return v;
152 }
153
154 ir_assignment::ir_assignment(ir_dereference *lhs, ir_rvalue *rhs,
155 ir_rvalue *condition, unsigned write_mask)
156 {
157 this->ir_type = ir_type_assignment;
158 this->condition = condition;
159 this->rhs = rhs;
160 this->lhs = lhs;
161 this->write_mask = write_mask;
162
163 if (lhs->type->is_scalar() || lhs->type->is_vector()) {
164 int lhs_components = 0;
165 for (int i = 0; i < 4; i++) {
166 if (write_mask & (1 << i))
167 lhs_components++;
168 }
169
170 assert(lhs_components == this->rhs->type->vector_elements);
171 }
172 }
173
174 ir_assignment::ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs,
175 ir_rvalue *condition)
176 {
177 this->ir_type = ir_type_assignment;
178 this->condition = condition;
179 this->rhs = rhs;
180
181 /* If the RHS is a vector type, assume that all components of the vector
182 * type are being written to the LHS. The write mask comes from the RHS
183 * because we can have a case where the LHS is a vec4 and the RHS is a
184 * vec3. In that case, the assignment is:
185 *
186 * (assign (...) (xyz) (var_ref lhs) (var_ref rhs))
187 */
188 if (rhs->type->is_vector())
189 this->write_mask = (1U << rhs->type->vector_elements) - 1;
190 else if (rhs->type->is_scalar())
191 this->write_mask = 1;
192 else
193 this->write_mask = 0;
194
195 this->set_lhs(lhs);
196 }
197
198 ir_expression::ir_expression(int op, const struct glsl_type *type,
199 ir_rvalue *op0, ir_rvalue *op1,
200 ir_rvalue *op2, ir_rvalue *op3)
201 {
202 this->ir_type = ir_type_expression;
203 this->type = type;
204 this->operation = ir_expression_operation(op);
205 this->operands[0] = op0;
206 this->operands[1] = op1;
207 this->operands[2] = op2;
208 this->operands[3] = op3;
209 #ifndef NDEBUG
210 int num_operands = get_num_operands(this->operation);
211 for (int i = num_operands; i < 4; i++) {
212 assert(this->operands[i] == NULL);
213 }
214 #endif
215 }
216
217 ir_expression::ir_expression(int op, ir_rvalue *op0)
218 {
219 this->ir_type = ir_type_expression;
220
221 this->operation = ir_expression_operation(op);
222 this->operands[0] = op0;
223 this->operands[1] = NULL;
224 this->operands[2] = NULL;
225 this->operands[3] = NULL;
226
227 assert(op <= ir_last_unop);
228
229 switch (this->operation) {
230 case ir_unop_bit_not:
231 case ir_unop_logic_not:
232 case ir_unop_neg:
233 case ir_unop_abs:
234 case ir_unop_sign:
235 case ir_unop_rcp:
236 case ir_unop_rsq:
237 case ir_unop_sqrt:
238 case ir_unop_exp:
239 case ir_unop_log:
240 case ir_unop_exp2:
241 case ir_unop_log2:
242 case ir_unop_trunc:
243 case ir_unop_ceil:
244 case ir_unop_floor:
245 case ir_unop_fract:
246 case ir_unop_round_even:
247 case ir_unop_sin:
248 case ir_unop_cos:
249 case ir_unop_sin_reduced:
250 case ir_unop_cos_reduced:
251 case ir_unop_dFdx:
252 case ir_unop_dFdy:
253 case ir_unop_bitfield_reverse:
254 this->type = op0->type;
255 break;
256
257 case ir_unop_f2i:
258 case ir_unop_b2i:
259 case ir_unop_u2i:
260 case ir_unop_bitcast_f2i:
261 case ir_unop_bit_count:
262 case ir_unop_find_msb:
263 case ir_unop_find_lsb:
264 this->type = glsl_type::get_instance(GLSL_TYPE_INT,
265 op0->type->vector_elements, 1);
266 break;
267
268 case ir_unop_b2f:
269 case ir_unop_i2f:
270 case ir_unop_u2f:
271 case ir_unop_bitcast_i2f:
272 case ir_unop_bitcast_u2f:
273 this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT,
274 op0->type->vector_elements, 1);
275 break;
276
277 case ir_unop_f2b:
278 case ir_unop_i2b:
279 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
280 op0->type->vector_elements, 1);
281 break;
282
283 case ir_unop_i2u:
284 case ir_unop_f2u:
285 case ir_unop_bitcast_f2u:
286 this->type = glsl_type::get_instance(GLSL_TYPE_UINT,
287 op0->type->vector_elements, 1);
288 break;
289
290 case ir_unop_noise:
291 case ir_unop_unpack_half_2x16_split_x:
292 case ir_unop_unpack_half_2x16_split_y:
293 this->type = glsl_type::float_type;
294 break;
295
296 case ir_unop_any:
297 this->type = glsl_type::bool_type;
298 break;
299
300 case ir_unop_pack_snorm_2x16:
301 case ir_unop_pack_snorm_4x8:
302 case ir_unop_pack_unorm_2x16:
303 case ir_unop_pack_unorm_4x8:
304 case ir_unop_pack_half_2x16:
305 this->type = glsl_type::uint_type;
306 break;
307
308 case ir_unop_unpack_snorm_2x16:
309 case ir_unop_unpack_unorm_2x16:
310 case ir_unop_unpack_half_2x16:
311 this->type = glsl_type::vec2_type;
312 break;
313
314 case ir_unop_unpack_snorm_4x8:
315 case ir_unop_unpack_unorm_4x8:
316 this->type = glsl_type::vec4_type;
317 break;
318
319 default:
320 assert(!"not reached: missing automatic type setup for ir_expression");
321 this->type = op0->type;
322 break;
323 }
324 }
325
326 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1)
327 {
328 this->ir_type = ir_type_expression;
329
330 this->operation = ir_expression_operation(op);
331 this->operands[0] = op0;
332 this->operands[1] = op1;
333 this->operands[2] = NULL;
334 this->operands[3] = NULL;
335
336 assert(op > ir_last_unop);
337
338 switch (this->operation) {
339 case ir_binop_all_equal:
340 case ir_binop_any_nequal:
341 this->type = glsl_type::bool_type;
342 break;
343
344 case ir_binop_add:
345 case ir_binop_sub:
346 case ir_binop_min:
347 case ir_binop_max:
348 case ir_binop_pow:
349 case ir_binop_mul:
350 case ir_binop_div:
351 case ir_binop_mod:
352 if (op0->type->is_scalar()) {
353 this->type = op1->type;
354 } else if (op1->type->is_scalar()) {
355 this->type = op0->type;
356 } else {
357 /* FINISHME: matrix types */
358 assert(!op0->type->is_matrix() && !op1->type->is_matrix());
359 assert(op0->type == op1->type);
360 this->type = op0->type;
361 }
362 break;
363
364 case ir_binop_logic_and:
365 case ir_binop_logic_xor:
366 case ir_binop_logic_or:
367 case ir_binop_bit_and:
368 case ir_binop_bit_xor:
369 case ir_binop_bit_or:
370 assert(!op0->type->is_matrix());
371 assert(!op1->type->is_matrix());
372 if (op0->type->is_scalar()) {
373 this->type = op1->type;
374 } else if (op1->type->is_scalar()) {
375 this->type = op0->type;
376 } else {
377 assert(op0->type->vector_elements == op1->type->vector_elements);
378 this->type = op0->type;
379 }
380 break;
381
382 case ir_binop_equal:
383 case ir_binop_nequal:
384 case ir_binop_lequal:
385 case ir_binop_gequal:
386 case ir_binop_less:
387 case ir_binop_greater:
388 assert(op0->type == op1->type);
389 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
390 op0->type->vector_elements, 1);
391 break;
392
393 case ir_binop_dot:
394 this->type = glsl_type::float_type;
395 break;
396
397 case ir_binop_pack_half_2x16_split:
398 this->type = glsl_type::uint_type;
399 break;
400
401 case ir_binop_imul_high:
402 case ir_binop_carry:
403 case ir_binop_borrow:
404 case ir_binop_lshift:
405 case ir_binop_rshift:
406 case ir_binop_bfm:
407 case ir_binop_ldexp:
408 this->type = op0->type;
409 break;
410
411 case ir_binop_vector_extract:
412 this->type = op0->type->get_scalar_type();
413 break;
414
415 default:
416 assert(!"not reached: missing automatic type setup for ir_expression");
417 this->type = glsl_type::float_type;
418 }
419 }
420
421 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1,
422 ir_rvalue *op2)
423 {
424 this->ir_type = ir_type_expression;
425
426 this->operation = ir_expression_operation(op);
427 this->operands[0] = op0;
428 this->operands[1] = op1;
429 this->operands[2] = op2;
430 this->operands[3] = NULL;
431
432 assert(op > ir_last_binop && op <= ir_last_triop);
433
434 switch (this->operation) {
435 case ir_triop_fma:
436 case ir_triop_lrp:
437 case ir_triop_bitfield_extract:
438 case ir_triop_vector_insert:
439 this->type = op0->type;
440 break;
441
442 case ir_triop_bfi:
443 case ir_triop_csel:
444 this->type = op1->type;
445 break;
446
447 default:
448 assert(!"not reached: missing automatic type setup for ir_expression");
449 this->type = glsl_type::float_type;
450 }
451 }
452
453 unsigned int
454 ir_expression::get_num_operands(ir_expression_operation op)
455 {
456 assert(op <= ir_last_opcode);
457
458 if (op <= ir_last_unop)
459 return 1;
460
461 if (op <= ir_last_binop)
462 return 2;
463
464 if (op <= ir_last_triop)
465 return 3;
466
467 if (op <= ir_last_quadop)
468 return 4;
469
470 assert(false);
471 return 0;
472 }
473
474 static const char *const operator_strs[] = {
475 "~",
476 "!",
477 "neg",
478 "abs",
479 "sign",
480 "rcp",
481 "rsq",
482 "sqrt",
483 "exp",
484 "log",
485 "exp2",
486 "log2",
487 "f2i",
488 "f2u",
489 "i2f",
490 "f2b",
491 "b2f",
492 "i2b",
493 "b2i",
494 "u2f",
495 "i2u",
496 "u2i",
497 "bitcast_i2f",
498 "bitcast_f2i",
499 "bitcast_u2f",
500 "bitcast_f2u",
501 "any",
502 "trunc",
503 "ceil",
504 "floor",
505 "fract",
506 "round_even",
507 "sin",
508 "cos",
509 "sin_reduced",
510 "cos_reduced",
511 "dFdx",
512 "dFdy",
513 "packSnorm2x16",
514 "packSnorm4x8",
515 "packUnorm2x16",
516 "packUnorm4x8",
517 "packHalf2x16",
518 "unpackSnorm2x16",
519 "unpackSnorm4x8",
520 "unpackUnorm2x16",
521 "unpackUnorm4x8",
522 "unpackHalf2x16",
523 "unpackHalf2x16_split_x",
524 "unpackHalf2x16_split_y",
525 "bitfield_reverse",
526 "bit_count",
527 "find_msb",
528 "find_lsb",
529 "noise",
530 "+",
531 "-",
532 "*",
533 "imul_high",
534 "/",
535 "carry",
536 "borrow",
537 "%",
538 "<",
539 ">",
540 "<=",
541 ">=",
542 "==",
543 "!=",
544 "all_equal",
545 "any_nequal",
546 "<<",
547 ">>",
548 "&",
549 "^",
550 "|",
551 "&&",
552 "^^",
553 "||",
554 "dot",
555 "min",
556 "max",
557 "pow",
558 "packHalf2x16_split",
559 "bfm",
560 "ubo_load",
561 "ldexp",
562 "vector_extract",
563 "fma",
564 "lrp",
565 "csel",
566 "bfi",
567 "bitfield_extract",
568 "vector_insert",
569 "bitfield_insert",
570 "vector",
571 };
572
573 const char *ir_expression::operator_string(ir_expression_operation op)
574 {
575 assert((unsigned int) op < Elements(operator_strs));
576 assert(Elements(operator_strs) == (ir_quadop_vector + 1));
577 return operator_strs[op];
578 }
579
580 const char *ir_expression::operator_string()
581 {
582 return operator_string(this->operation);
583 }
584
585 const char*
586 depth_layout_string(ir_depth_layout layout)
587 {
588 switch(layout) {
589 case ir_depth_layout_none: return "";
590 case ir_depth_layout_any: return "depth_any";
591 case ir_depth_layout_greater: return "depth_greater";
592 case ir_depth_layout_less: return "depth_less";
593 case ir_depth_layout_unchanged: return "depth_unchanged";
594
595 default:
596 assert(0);
597 return "";
598 }
599 }
600
601 ir_expression_operation
602 ir_expression::get_operator(const char *str)
603 {
604 const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
605 for (int op = 0; op < operator_count; op++) {
606 if (strcmp(str, operator_strs[op]) == 0)
607 return (ir_expression_operation) op;
608 }
609 return (ir_expression_operation) -1;
610 }
611
612 ir_constant::ir_constant()
613 {
614 this->ir_type = ir_type_constant;
615 }
616
617 ir_constant::ir_constant(const struct glsl_type *type,
618 const ir_constant_data *data)
619 {
620 assert((type->base_type >= GLSL_TYPE_UINT)
621 && (type->base_type <= GLSL_TYPE_BOOL));
622
623 this->ir_type = ir_type_constant;
624 this->type = type;
625 memcpy(& this->value, data, sizeof(this->value));
626 }
627
628 ir_constant::ir_constant(float f, unsigned vector_elements)
629 {
630 assert(vector_elements <= 4);
631 this->ir_type = ir_type_constant;
632 this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT, vector_elements, 1);
633 for (unsigned i = 0; i < vector_elements; i++) {
634 this->value.f[i] = f;
635 }
636 for (unsigned i = vector_elements; i < 16; i++) {
637 this->value.f[i] = 0;
638 }
639 }
640
641 ir_constant::ir_constant(unsigned int u, unsigned vector_elements)
642 {
643 assert(vector_elements <= 4);
644 this->ir_type = ir_type_constant;
645 this->type = glsl_type::get_instance(GLSL_TYPE_UINT, vector_elements, 1);
646 for (unsigned i = 0; i < vector_elements; i++) {
647 this->value.u[i] = u;
648 }
649 for (unsigned i = vector_elements; i < 16; i++) {
650 this->value.u[i] = 0;
651 }
652 }
653
654 ir_constant::ir_constant(int integer, unsigned vector_elements)
655 {
656 assert(vector_elements <= 4);
657 this->ir_type = ir_type_constant;
658 this->type = glsl_type::get_instance(GLSL_TYPE_INT, vector_elements, 1);
659 for (unsigned i = 0; i < vector_elements; i++) {
660 this->value.i[i] = integer;
661 }
662 for (unsigned i = vector_elements; i < 16; i++) {
663 this->value.i[i] = 0;
664 }
665 }
666
667 ir_constant::ir_constant(bool b, unsigned vector_elements)
668 {
669 assert(vector_elements <= 4);
670 this->ir_type = ir_type_constant;
671 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL, vector_elements, 1);
672 for (unsigned i = 0; i < vector_elements; i++) {
673 this->value.b[i] = b;
674 }
675 for (unsigned i = vector_elements; i < 16; i++) {
676 this->value.b[i] = false;
677 }
678 }
679
680 ir_constant::ir_constant(const ir_constant *c, unsigned i)
681 {
682 this->ir_type = ir_type_constant;
683 this->type = c->type->get_base_type();
684
685 switch (this->type->base_type) {
686 case GLSL_TYPE_UINT: this->value.u[0] = c->value.u[i]; break;
687 case GLSL_TYPE_INT: this->value.i[0] = c->value.i[i]; break;
688 case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
689 case GLSL_TYPE_BOOL: this->value.b[0] = c->value.b[i]; break;
690 default: assert(!"Should not get here."); break;
691 }
692 }
693
694 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
695 {
696 this->ir_type = ir_type_constant;
697 this->type = type;
698
699 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
700 || type->is_record() || type->is_array());
701
702 if (type->is_array()) {
703 this->array_elements = ralloc_array(this, ir_constant *, type->length);
704 unsigned i = 0;
705 foreach_list(node, value_list) {
706 ir_constant *value = (ir_constant *) node;
707 assert(value->as_constant() != NULL);
708
709 this->array_elements[i++] = value;
710 }
711 return;
712 }
713
714 /* If the constant is a record, the types of each of the entries in
715 * value_list must be a 1-for-1 match with the structure components. Each
716 * entry must also be a constant. Just move the nodes from the value_list
717 * to the list in the ir_constant.
718 */
719 /* FINISHME: Should there be some type checking and / or assertions here? */
720 /* FINISHME: Should the new constant take ownership of the nodes from
721 * FINISHME: value_list, or should it make copies?
722 */
723 if (type->is_record()) {
724 value_list->move_nodes_to(& this->components);
725 return;
726 }
727
728 for (unsigned i = 0; i < 16; i++) {
729 this->value.u[i] = 0;
730 }
731
732 ir_constant *value = (ir_constant *) (value_list->head);
733
734 /* Constructors with exactly one scalar argument are special for vectors
735 * and matrices. For vectors, the scalar value is replicated to fill all
736 * the components. For matrices, the scalar fills the components of the
737 * diagonal while the rest is filled with 0.
738 */
739 if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
740 if (type->is_matrix()) {
741 /* Matrix - fill diagonal (rest is already set to 0) */
742 assert(type->base_type == GLSL_TYPE_FLOAT);
743 for (unsigned i = 0; i < type->matrix_columns; i++)
744 this->value.f[i * type->vector_elements + i] = value->value.f[0];
745 } else {
746 /* Vector or scalar - fill all components */
747 switch (type->base_type) {
748 case GLSL_TYPE_UINT:
749 case GLSL_TYPE_INT:
750 for (unsigned i = 0; i < type->components(); i++)
751 this->value.u[i] = value->value.u[0];
752 break;
753 case GLSL_TYPE_FLOAT:
754 for (unsigned i = 0; i < type->components(); i++)
755 this->value.f[i] = value->value.f[0];
756 break;
757 case GLSL_TYPE_BOOL:
758 for (unsigned i = 0; i < type->components(); i++)
759 this->value.b[i] = value->value.b[0];
760 break;
761 default:
762 assert(!"Should not get here.");
763 break;
764 }
765 }
766 return;
767 }
768
769 if (type->is_matrix() && value->type->is_matrix()) {
770 assert(value->next->is_tail_sentinel());
771
772 /* From section 5.4.2 of the GLSL 1.20 spec:
773 * "If a matrix is constructed from a matrix, then each component
774 * (column i, row j) in the result that has a corresponding component
775 * (column i, row j) in the argument will be initialized from there."
776 */
777 unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
778 unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
779 for (unsigned i = 0; i < cols; i++) {
780 for (unsigned j = 0; j < rows; j++) {
781 const unsigned src = i * value->type->vector_elements + j;
782 const unsigned dst = i * type->vector_elements + j;
783 this->value.f[dst] = value->value.f[src];
784 }
785 }
786
787 /* "All other components will be initialized to the identity matrix." */
788 for (unsigned i = cols; i < type->matrix_columns; i++)
789 this->value.f[i * type->vector_elements + i] = 1.0;
790
791 return;
792 }
793
794 /* Use each component from each entry in the value_list to initialize one
795 * component of the constant being constructed.
796 */
797 for (unsigned i = 0; i < type->components(); /* empty */) {
798 assert(value->as_constant() != NULL);
799 assert(!value->is_tail_sentinel());
800
801 for (unsigned j = 0; j < value->type->components(); j++) {
802 switch (type->base_type) {
803 case GLSL_TYPE_UINT:
804 this->value.u[i] = value->get_uint_component(j);
805 break;
806 case GLSL_TYPE_INT:
807 this->value.i[i] = value->get_int_component(j);
808 break;
809 case GLSL_TYPE_FLOAT:
810 this->value.f[i] = value->get_float_component(j);
811 break;
812 case GLSL_TYPE_BOOL:
813 this->value.b[i] = value->get_bool_component(j);
814 break;
815 default:
816 /* FINISHME: What to do? Exceptions are not the answer.
817 */
818 break;
819 }
820
821 i++;
822 if (i >= type->components())
823 break;
824 }
825
826 value = (ir_constant *) value->next;
827 }
828 }
829
830 ir_constant *
831 ir_constant::zero(void *mem_ctx, const glsl_type *type)
832 {
833 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
834 || type->is_record() || type->is_array());
835
836 ir_constant *c = new(mem_ctx) ir_constant;
837 c->type = type;
838 memset(&c->value, 0, sizeof(c->value));
839
840 if (type->is_array()) {
841 c->array_elements = ralloc_array(c, ir_constant *, type->length);
842
843 for (unsigned i = 0; i < type->length; i++)
844 c->array_elements[i] = ir_constant::zero(c, type->element_type());
845 }
846
847 if (type->is_record()) {
848 for (unsigned i = 0; i < type->length; i++) {
849 ir_constant *comp = ir_constant::zero(mem_ctx, type->fields.structure[i].type);
850 c->components.push_tail(comp);
851 }
852 }
853
854 return c;
855 }
856
857 bool
858 ir_constant::get_bool_component(unsigned i) const
859 {
860 switch (this->type->base_type) {
861 case GLSL_TYPE_UINT: return this->value.u[i] != 0;
862 case GLSL_TYPE_INT: return this->value.i[i] != 0;
863 case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
864 case GLSL_TYPE_BOOL: return this->value.b[i];
865 default: assert(!"Should not get here."); break;
866 }
867
868 /* Must return something to make the compiler happy. This is clearly an
869 * error case.
870 */
871 return false;
872 }
873
874 float
875 ir_constant::get_float_component(unsigned i) const
876 {
877 switch (this->type->base_type) {
878 case GLSL_TYPE_UINT: return (float) this->value.u[i];
879 case GLSL_TYPE_INT: return (float) this->value.i[i];
880 case GLSL_TYPE_FLOAT: return this->value.f[i];
881 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0f : 0.0f;
882 default: assert(!"Should not get here."); break;
883 }
884
885 /* Must return something to make the compiler happy. This is clearly an
886 * error case.
887 */
888 return 0.0;
889 }
890
891 int
892 ir_constant::get_int_component(unsigned i) const
893 {
894 switch (this->type->base_type) {
895 case GLSL_TYPE_UINT: return this->value.u[i];
896 case GLSL_TYPE_INT: return this->value.i[i];
897 case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
898 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
899 default: assert(!"Should not get here."); break;
900 }
901
902 /* Must return something to make the compiler happy. This is clearly an
903 * error case.
904 */
905 return 0;
906 }
907
908 unsigned
909 ir_constant::get_uint_component(unsigned i) const
910 {
911 switch (this->type->base_type) {
912 case GLSL_TYPE_UINT: return this->value.u[i];
913 case GLSL_TYPE_INT: return this->value.i[i];
914 case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
915 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
916 default: assert(!"Should not get here."); break;
917 }
918
919 /* Must return something to make the compiler happy. This is clearly an
920 * error case.
921 */
922 return 0;
923 }
924
925 ir_constant *
926 ir_constant::get_array_element(unsigned i) const
927 {
928 assert(this->type->is_array());
929
930 /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
931 *
932 * "Behavior is undefined if a shader subscripts an array with an index
933 * less than 0 or greater than or equal to the size the array was
934 * declared with."
935 *
936 * Most out-of-bounds accesses are removed before things could get this far.
937 * There are cases where non-constant array index values can get constant
938 * folded.
939 */
940 if (int(i) < 0)
941 i = 0;
942 else if (i >= this->type->length)
943 i = this->type->length - 1;
944
945 return array_elements[i];
946 }
947
948 ir_constant *
949 ir_constant::get_record_field(const char *name)
950 {
951 int idx = this->type->field_index(name);
952
953 if (idx < 0)
954 return NULL;
955
956 if (this->components.is_empty())
957 return NULL;
958
959 exec_node *node = this->components.head;
960 for (int i = 0; i < idx; i++) {
961 node = node->next;
962
963 /* If the end of the list is encountered before the element matching the
964 * requested field is found, return NULL.
965 */
966 if (node->is_tail_sentinel())
967 return NULL;
968 }
969
970 return (ir_constant *) node;
971 }
972
973 void
974 ir_constant::copy_offset(ir_constant *src, int offset)
975 {
976 switch (this->type->base_type) {
977 case GLSL_TYPE_UINT:
978 case GLSL_TYPE_INT:
979 case GLSL_TYPE_FLOAT:
980 case GLSL_TYPE_BOOL: {
981 unsigned int size = src->type->components();
982 assert (size <= this->type->components() - offset);
983 for (unsigned int i=0; i<size; i++) {
984 switch (this->type->base_type) {
985 case GLSL_TYPE_UINT:
986 value.u[i+offset] = src->get_uint_component(i);
987 break;
988 case GLSL_TYPE_INT:
989 value.i[i+offset] = src->get_int_component(i);
990 break;
991 case GLSL_TYPE_FLOAT:
992 value.f[i+offset] = src->get_float_component(i);
993 break;
994 case GLSL_TYPE_BOOL:
995 value.b[i+offset] = src->get_bool_component(i);
996 break;
997 default: // Shut up the compiler
998 break;
999 }
1000 }
1001 break;
1002 }
1003
1004 case GLSL_TYPE_STRUCT: {
1005 assert (src->type == this->type);
1006 this->components.make_empty();
1007 foreach_list(node, &src->components) {
1008 ir_constant *const orig = (ir_constant *) node;
1009
1010 this->components.push_tail(orig->clone(this, NULL));
1011 }
1012 break;
1013 }
1014
1015 case GLSL_TYPE_ARRAY: {
1016 assert (src->type == this->type);
1017 for (unsigned i = 0; i < this->type->length; i++) {
1018 this->array_elements[i] = src->array_elements[i]->clone(this, NULL);
1019 }
1020 break;
1021 }
1022
1023 default:
1024 assert(!"Should not get here.");
1025 break;
1026 }
1027 }
1028
1029 void
1030 ir_constant::copy_masked_offset(ir_constant *src, int offset, unsigned int mask)
1031 {
1032 assert (!type->is_array() && !type->is_record());
1033
1034 if (!type->is_vector() && !type->is_matrix()) {
1035 offset = 0;
1036 mask = 1;
1037 }
1038
1039 int id = 0;
1040 for (int i=0; i<4; i++) {
1041 if (mask & (1 << i)) {
1042 switch (this->type->base_type) {
1043 case GLSL_TYPE_UINT:
1044 value.u[i+offset] = src->get_uint_component(id++);
1045 break;
1046 case GLSL_TYPE_INT:
1047 value.i[i+offset] = src->get_int_component(id++);
1048 break;
1049 case GLSL_TYPE_FLOAT:
1050 value.f[i+offset] = src->get_float_component(id++);
1051 break;
1052 case GLSL_TYPE_BOOL:
1053 value.b[i+offset] = src->get_bool_component(id++);
1054 break;
1055 default:
1056 assert(!"Should not get here.");
1057 return;
1058 }
1059 }
1060 }
1061 }
1062
1063 bool
1064 ir_constant::has_value(const ir_constant *c) const
1065 {
1066 if (this->type != c->type)
1067 return false;
1068
1069 if (this->type->is_array()) {
1070 for (unsigned i = 0; i < this->type->length; i++) {
1071 if (!this->array_elements[i]->has_value(c->array_elements[i]))
1072 return false;
1073 }
1074 return true;
1075 }
1076
1077 if (this->type->base_type == GLSL_TYPE_STRUCT) {
1078 const exec_node *a_node = this->components.head;
1079 const exec_node *b_node = c->components.head;
1080
1081 while (!a_node->is_tail_sentinel()) {
1082 assert(!b_node->is_tail_sentinel());
1083
1084 const ir_constant *const a_field = (ir_constant *) a_node;
1085 const ir_constant *const b_field = (ir_constant *) b_node;
1086
1087 if (!a_field->has_value(b_field))
1088 return false;
1089
1090 a_node = a_node->next;
1091 b_node = b_node->next;
1092 }
1093
1094 return true;
1095 }
1096
1097 for (unsigned i = 0; i < this->type->components(); i++) {
1098 switch (this->type->base_type) {
1099 case GLSL_TYPE_UINT:
1100 if (this->value.u[i] != c->value.u[i])
1101 return false;
1102 break;
1103 case GLSL_TYPE_INT:
1104 if (this->value.i[i] != c->value.i[i])
1105 return false;
1106 break;
1107 case GLSL_TYPE_FLOAT:
1108 if (this->value.f[i] != c->value.f[i])
1109 return false;
1110 break;
1111 case GLSL_TYPE_BOOL:
1112 if (this->value.b[i] != c->value.b[i])
1113 return false;
1114 break;
1115 default:
1116 assert(!"Should not get here.");
1117 return false;
1118 }
1119 }
1120
1121 return true;
1122 }
1123
1124 bool
1125 ir_constant::is_zero() const
1126 {
1127 if (!this->type->is_scalar() && !this->type->is_vector())
1128 return false;
1129
1130 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1131 switch (this->type->base_type) {
1132 case GLSL_TYPE_FLOAT:
1133 if (this->value.f[c] != 0.0)
1134 return false;
1135 break;
1136 case GLSL_TYPE_INT:
1137 if (this->value.i[c] != 0)
1138 return false;
1139 break;
1140 case GLSL_TYPE_UINT:
1141 if (this->value.u[c] != 0)
1142 return false;
1143 break;
1144 case GLSL_TYPE_BOOL:
1145 if (this->value.b[c] != false)
1146 return false;
1147 break;
1148 default:
1149 /* The only other base types are structures, arrays, and samplers.
1150 * Samplers cannot be constants, and the others should have been
1151 * filtered out above.
1152 */
1153 assert(!"Should not get here.");
1154 return false;
1155 }
1156 }
1157
1158 return true;
1159 }
1160
1161 bool
1162 ir_constant::is_one() const
1163 {
1164 if (!this->type->is_scalar() && !this->type->is_vector())
1165 return false;
1166
1167 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1168 switch (this->type->base_type) {
1169 case GLSL_TYPE_FLOAT:
1170 if (this->value.f[c] != 1.0)
1171 return false;
1172 break;
1173 case GLSL_TYPE_INT:
1174 if (this->value.i[c] != 1)
1175 return false;
1176 break;
1177 case GLSL_TYPE_UINT:
1178 if (this->value.u[c] != 1)
1179 return false;
1180 break;
1181 case GLSL_TYPE_BOOL:
1182 if (this->value.b[c] != true)
1183 return false;
1184 break;
1185 default:
1186 /* The only other base types are structures, arrays, and samplers.
1187 * Samplers cannot be constants, and the others should have been
1188 * filtered out above.
1189 */
1190 assert(!"Should not get here.");
1191 return false;
1192 }
1193 }
1194
1195 return true;
1196 }
1197
1198 bool
1199 ir_constant::is_negative_one() const
1200 {
1201 if (!this->type->is_scalar() && !this->type->is_vector())
1202 return false;
1203
1204 if (this->type->is_boolean())
1205 return false;
1206
1207 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1208 switch (this->type->base_type) {
1209 case GLSL_TYPE_FLOAT:
1210 if (this->value.f[c] != -1.0)
1211 return false;
1212 break;
1213 case GLSL_TYPE_INT:
1214 if (this->value.i[c] != -1)
1215 return false;
1216 break;
1217 case GLSL_TYPE_UINT:
1218 if (int(this->value.u[c]) != -1)
1219 return false;
1220 break;
1221 default:
1222 /* The only other base types are structures, arrays, samplers, and
1223 * booleans. Samplers cannot be constants, and the others should
1224 * have been filtered out above.
1225 */
1226 assert(!"Should not get here.");
1227 return false;
1228 }
1229 }
1230
1231 return true;
1232 }
1233
1234 bool
1235 ir_constant::is_basis() const
1236 {
1237 if (!this->type->is_scalar() && !this->type->is_vector())
1238 return false;
1239
1240 if (this->type->is_boolean())
1241 return false;
1242
1243 unsigned ones = 0;
1244 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1245 switch (this->type->base_type) {
1246 case GLSL_TYPE_FLOAT:
1247 if (this->value.f[c] == 1.0)
1248 ones++;
1249 else if (this->value.f[c] != 0.0)
1250 return false;
1251 break;
1252 case GLSL_TYPE_INT:
1253 if (this->value.i[c] == 1)
1254 ones++;
1255 else if (this->value.i[c] != 0)
1256 return false;
1257 break;
1258 case GLSL_TYPE_UINT:
1259 if (int(this->value.u[c]) == 1)
1260 ones++;
1261 else if (int(this->value.u[c]) != 0)
1262 return false;
1263 break;
1264 default:
1265 /* The only other base types are structures, arrays, samplers, and
1266 * booleans. Samplers cannot be constants, and the others should
1267 * have been filtered out above.
1268 */
1269 assert(!"Should not get here.");
1270 return false;
1271 }
1272 }
1273
1274 return ones == 1;
1275 }
1276
1277 ir_loop::ir_loop()
1278 {
1279 this->ir_type = ir_type_loop;
1280 this->cmp = ir_unop_neg;
1281 this->from = NULL;
1282 this->to = NULL;
1283 this->increment = NULL;
1284 this->counter = NULL;
1285 }
1286
1287
1288 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
1289 {
1290 assert(var != NULL);
1291
1292 this->ir_type = ir_type_dereference_variable;
1293 this->var = var;
1294 this->type = var->type;
1295 }
1296
1297
1298 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
1299 ir_rvalue *array_index)
1300 {
1301 this->ir_type = ir_type_dereference_array;
1302 this->array_index = array_index;
1303 this->set_array(value);
1304 }
1305
1306
1307 ir_dereference_array::ir_dereference_array(ir_variable *var,
1308 ir_rvalue *array_index)
1309 {
1310 void *ctx = ralloc_parent(var);
1311
1312 this->ir_type = ir_type_dereference_array;
1313 this->array_index = array_index;
1314 this->set_array(new(ctx) ir_dereference_variable(var));
1315 }
1316
1317
1318 void
1319 ir_dereference_array::set_array(ir_rvalue *value)
1320 {
1321 assert(value != NULL);
1322
1323 this->array = value;
1324
1325 const glsl_type *const vt = this->array->type;
1326
1327 if (vt->is_array()) {
1328 type = vt->element_type();
1329 } else if (vt->is_matrix()) {
1330 type = vt->column_type();
1331 } else if (vt->is_vector()) {
1332 type = vt->get_base_type();
1333 }
1334 }
1335
1336
1337 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
1338 const char *field)
1339 {
1340 assert(value != NULL);
1341
1342 this->ir_type = ir_type_dereference_record;
1343 this->record = value;
1344 this->field = ralloc_strdup(this, field);
1345 this->type = this->record->type->field_type(field);
1346 }
1347
1348
1349 ir_dereference_record::ir_dereference_record(ir_variable *var,
1350 const char *field)
1351 {
1352 void *ctx = ralloc_parent(var);
1353
1354 this->ir_type = ir_type_dereference_record;
1355 this->record = new(ctx) ir_dereference_variable(var);
1356 this->field = ralloc_strdup(this, field);
1357 this->type = this->record->type->field_type(field);
1358 }
1359
1360 bool
1361 ir_dereference::is_lvalue() const
1362 {
1363 ir_variable *var = this->variable_referenced();
1364
1365 /* Every l-value derference chain eventually ends in a variable.
1366 */
1367 if ((var == NULL) || var->read_only)
1368 return false;
1369
1370 /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
1371 *
1372 * "Samplers cannot be treated as l-values; hence cannot be used
1373 * as out or inout function parameters, nor can they be
1374 * assigned into."
1375 */
1376 if (this->type->contains_sampler())
1377 return false;
1378
1379 return true;
1380 }
1381
1382
1383 static const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf", "txf_ms", "txs", "lod", "tg4", "query_levels" };
1384
1385 const char *ir_texture::opcode_string()
1386 {
1387 assert((unsigned int) op <=
1388 sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
1389 return tex_opcode_strs[op];
1390 }
1391
1392 ir_texture_opcode
1393 ir_texture::get_opcode(const char *str)
1394 {
1395 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
1396 for (int op = 0; op < count; op++) {
1397 if (strcmp(str, tex_opcode_strs[op]) == 0)
1398 return (ir_texture_opcode) op;
1399 }
1400 return (ir_texture_opcode) -1;
1401 }
1402
1403
1404 void
1405 ir_texture::set_sampler(ir_dereference *sampler, const glsl_type *type)
1406 {
1407 assert(sampler != NULL);
1408 assert(type != NULL);
1409 this->sampler = sampler;
1410 this->type = type;
1411
1412 if (this->op == ir_txs || this->op == ir_query_levels) {
1413 assert(type->base_type == GLSL_TYPE_INT);
1414 } else if (this->op == ir_lod) {
1415 assert(type->vector_elements == 2);
1416 assert(type->base_type == GLSL_TYPE_FLOAT);
1417 } else {
1418 assert(sampler->type->sampler_type == (int) type->base_type);
1419 if (sampler->type->sampler_shadow)
1420 assert(type->vector_elements == 4 || type->vector_elements == 1);
1421 else
1422 assert(type->vector_elements == 4);
1423 }
1424 }
1425
1426
1427 void
1428 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
1429 {
1430 assert((count >= 1) && (count <= 4));
1431
1432 memset(&this->mask, 0, sizeof(this->mask));
1433 this->mask.num_components = count;
1434
1435 unsigned dup_mask = 0;
1436 switch (count) {
1437 case 4:
1438 assert(comp[3] <= 3);
1439 dup_mask |= (1U << comp[3])
1440 & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
1441 this->mask.w = comp[3];
1442
1443 case 3:
1444 assert(comp[2] <= 3);
1445 dup_mask |= (1U << comp[2])
1446 & ((1U << comp[0]) | (1U << comp[1]));
1447 this->mask.z = comp[2];
1448
1449 case 2:
1450 assert(comp[1] <= 3);
1451 dup_mask |= (1U << comp[1])
1452 & ((1U << comp[0]));
1453 this->mask.y = comp[1];
1454
1455 case 1:
1456 assert(comp[0] <= 3);
1457 this->mask.x = comp[0];
1458 }
1459
1460 this->mask.has_duplicates = dup_mask != 0;
1461
1462 /* Based on the number of elements in the swizzle and the base type
1463 * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
1464 * generate the type of the resulting value.
1465 */
1466 type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
1467 }
1468
1469 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
1470 unsigned w, unsigned count)
1471 : val(val)
1472 {
1473 const unsigned components[4] = { x, y, z, w };
1474 this->ir_type = ir_type_swizzle;
1475 this->init_mask(components, count);
1476 }
1477
1478 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
1479 unsigned count)
1480 : val(val)
1481 {
1482 this->ir_type = ir_type_swizzle;
1483 this->init_mask(comp, count);
1484 }
1485
1486 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
1487 {
1488 this->ir_type = ir_type_swizzle;
1489 this->val = val;
1490 this->mask = mask;
1491 this->type = glsl_type::get_instance(val->type->base_type,
1492 mask.num_components, 1);
1493 }
1494
1495 #define X 1
1496 #define R 5
1497 #define S 9
1498 #define I 13
1499
1500 ir_swizzle *
1501 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
1502 {
1503 void *ctx = ralloc_parent(val);
1504
1505 /* For each possible swizzle character, this table encodes the value in
1506 * \c idx_map that represents the 0th element of the vector. For invalid
1507 * swizzle characters (e.g., 'k'), a special value is used that will allow
1508 * detection of errors.
1509 */
1510 static const unsigned char base_idx[26] = {
1511 /* a b c d e f g h i j k l m */
1512 R, R, I, I, I, I, R, I, I, I, I, I, I,
1513 /* n o p q r s t u v w x y z */
1514 I, I, S, S, R, S, S, I, I, X, X, X, X
1515 };
1516
1517 /* Each valid swizzle character has an entry in the previous table. This
1518 * table encodes the base index encoded in the previous table plus the actual
1519 * index of the swizzle character. When processing swizzles, the first
1520 * character in the string is indexed in the previous table. Each character
1521 * in the string is indexed in this table, and the value found there has the
1522 * value form the first table subtracted. The result must be on the range
1523 * [0,3].
1524 *
1525 * For example, the string "wzyx" will get X from the first table. Each of
1526 * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After
1527 * subtraction, the swizzle values are { 3, 2, 1, 0 }.
1528 *
1529 * The string "wzrg" will get X from the first table. Each of the characters
1530 * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the
1531 * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range
1532 * [0,3], the error is detected.
1533 */
1534 static const unsigned char idx_map[26] = {
1535 /* a b c d e f g h i j k l m */
1536 R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0,
1537 /* n o p q r s t u v w x y z */
1538 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2
1539 };
1540
1541 int swiz_idx[4] = { 0, 0, 0, 0 };
1542 unsigned i;
1543
1544
1545 /* Validate the first character in the swizzle string and look up the base
1546 * index value as described above.
1547 */
1548 if ((str[0] < 'a') || (str[0] > 'z'))
1549 return NULL;
1550
1551 const unsigned base = base_idx[str[0] - 'a'];
1552
1553
1554 for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
1555 /* Validate the next character, and, as described above, convert it to a
1556 * swizzle index.
1557 */
1558 if ((str[i] < 'a') || (str[i] > 'z'))
1559 return NULL;
1560
1561 swiz_idx[i] = idx_map[str[i] - 'a'] - base;
1562 if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
1563 return NULL;
1564 }
1565
1566 if (str[i] != '\0')
1567 return NULL;
1568
1569 return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
1570 swiz_idx[3], i);
1571 }
1572
1573 #undef X
1574 #undef R
1575 #undef S
1576 #undef I
1577
1578 ir_variable *
1579 ir_swizzle::variable_referenced() const
1580 {
1581 return this->val->variable_referenced();
1582 }
1583
1584
1585 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
1586 ir_variable_mode mode)
1587 : max_array_access(0), max_ifc_array_access(NULL),
1588 read_only(false), centroid(false), sample(false), invariant(false),
1589 how_declared(ir_var_declared_normally), mode(mode),
1590 interpolation(INTERP_QUALIFIER_NONE), atomic()
1591 {
1592 this->ir_type = ir_type_variable;
1593 this->type = type;
1594 this->name = ralloc_strdup(this, name);
1595 this->explicit_location = false;
1596 this->has_initializer = false;
1597 this->location = -1;
1598 this->location_frac = 0;
1599 this->warn_extension = NULL;
1600 this->constant_value = NULL;
1601 this->constant_initializer = NULL;
1602 this->origin_upper_left = false;
1603 this->pixel_center_integer = false;
1604 this->depth_layout = ir_depth_layout_none;
1605 this->used = false;
1606
1607 if (type != NULL) {
1608 if (type->base_type == GLSL_TYPE_SAMPLER)
1609 this->read_only = true;
1610
1611 if (type->is_interface())
1612 this->init_interface_type(type);
1613 else if (type->is_array() && type->fields.array->is_interface())
1614 this->init_interface_type(type->fields.array);
1615 }
1616 }
1617
1618
1619 const char *
1620 interpolation_string(unsigned interpolation)
1621 {
1622 switch (interpolation) {
1623 case INTERP_QUALIFIER_NONE: return "no";
1624 case INTERP_QUALIFIER_SMOOTH: return "smooth";
1625 case INTERP_QUALIFIER_FLAT: return "flat";
1626 case INTERP_QUALIFIER_NOPERSPECTIVE: return "noperspective";
1627 }
1628
1629 assert(!"Should not get here.");
1630 return "";
1631 }
1632
1633
1634 glsl_interp_qualifier
1635 ir_variable::determine_interpolation_mode(bool flat_shade)
1636 {
1637 if (this->interpolation != INTERP_QUALIFIER_NONE)
1638 return (glsl_interp_qualifier) this->interpolation;
1639 int location = this->location;
1640 bool is_gl_Color =
1641 location == VARYING_SLOT_COL0 || location == VARYING_SLOT_COL1;
1642 if (flat_shade && is_gl_Color)
1643 return INTERP_QUALIFIER_FLAT;
1644 else
1645 return INTERP_QUALIFIER_SMOOTH;
1646 }
1647
1648
1649 ir_function_signature::ir_function_signature(const glsl_type *return_type,
1650 builtin_available_predicate b)
1651 : return_type(return_type), is_defined(false), is_intrinsic(false),
1652 builtin_avail(b), _function(NULL)
1653 {
1654 this->ir_type = ir_type_function_signature;
1655 this->origin = NULL;
1656 }
1657
1658
1659 bool
1660 ir_function_signature::is_builtin() const
1661 {
1662 return builtin_avail != NULL;
1663 }
1664
1665
1666 bool
1667 ir_function_signature::is_builtin_available(const _mesa_glsl_parse_state *state) const
1668 {
1669 /* We can't call the predicate without a state pointer, so just say that
1670 * the signature is available. At compile time, we need the filtering,
1671 * but also receive a valid state pointer. At link time, we're resolving
1672 * imported built-in prototypes to their definitions, which will always
1673 * be an exact match. So we can skip the filtering.
1674 */
1675 if (state == NULL)
1676 return true;
1677
1678 assert(builtin_avail != NULL);
1679 return builtin_avail(state);
1680 }
1681
1682
1683 static bool
1684 modes_match(unsigned a, unsigned b)
1685 {
1686 if (a == b)
1687 return true;
1688
1689 /* Accept "in" vs. "const in" */
1690 if ((a == ir_var_const_in && b == ir_var_function_in) ||
1691 (b == ir_var_const_in && a == ir_var_function_in))
1692 return true;
1693
1694 return false;
1695 }
1696
1697
1698 const char *
1699 ir_function_signature::qualifiers_match(exec_list *params)
1700 {
1701 exec_list_iterator iter_a = parameters.iterator();
1702 exec_list_iterator iter_b = params->iterator();
1703
1704 /* check that the qualifiers match. */
1705 while (iter_a.has_next()) {
1706 ir_variable *a = (ir_variable *)iter_a.get();
1707 ir_variable *b = (ir_variable *)iter_b.get();
1708
1709 if (a->read_only != b->read_only ||
1710 !modes_match(a->mode, b->mode) ||
1711 a->interpolation != b->interpolation ||
1712 a->centroid != b->centroid ||
1713 a->sample != b->sample) {
1714
1715 /* parameter a's qualifiers don't match */
1716 return a->name;
1717 }
1718
1719 iter_a.next();
1720 iter_b.next();
1721 }
1722 return NULL;
1723 }
1724
1725
1726 void
1727 ir_function_signature::replace_parameters(exec_list *new_params)
1728 {
1729 /* Destroy all of the previous parameter information. If the previous
1730 * parameter information comes from the function prototype, it may either
1731 * specify incorrect parameter names or not have names at all.
1732 */
1733 new_params->move_nodes_to(&parameters);
1734 }
1735
1736
1737 ir_function::ir_function(const char *name)
1738 {
1739 this->ir_type = ir_type_function;
1740 this->name = ralloc_strdup(this, name);
1741 }
1742
1743
1744 bool
1745 ir_function::has_user_signature()
1746 {
1747 foreach_list(n, &this->signatures) {
1748 ir_function_signature *const sig = (ir_function_signature *) n;
1749 if (!sig->is_builtin())
1750 return true;
1751 }
1752 return false;
1753 }
1754
1755
1756 ir_rvalue *
1757 ir_rvalue::error_value(void *mem_ctx)
1758 {
1759 ir_rvalue *v = new(mem_ctx) ir_rvalue;
1760
1761 v->type = glsl_type::error_type;
1762 return v;
1763 }
1764
1765
1766 void
1767 visit_exec_list(exec_list *list, ir_visitor *visitor)
1768 {
1769 foreach_iter(exec_list_iterator, iter, *list) {
1770 ((ir_instruction *)iter.get())->accept(visitor);
1771 }
1772 }
1773
1774
1775 static void
1776 steal_memory(ir_instruction *ir, void *new_ctx)
1777 {
1778 ir_variable *var = ir->as_variable();
1779 ir_constant *constant = ir->as_constant();
1780 if (var != NULL && var->constant_value != NULL)
1781 steal_memory(var->constant_value, ir);
1782
1783 if (var != NULL && var->constant_initializer != NULL)
1784 steal_memory(var->constant_initializer, ir);
1785
1786 /* The components of aggregate constants are not visited by the normal
1787 * visitor, so steal their values by hand.
1788 */
1789 if (constant != NULL) {
1790 if (constant->type->is_record()) {
1791 foreach_iter(exec_list_iterator, iter, constant->components) {
1792 ir_constant *field = (ir_constant *)iter.get();
1793 steal_memory(field, ir);
1794 }
1795 } else if (constant->type->is_array()) {
1796 for (unsigned int i = 0; i < constant->type->length; i++) {
1797 steal_memory(constant->array_elements[i], ir);
1798 }
1799 }
1800 }
1801
1802 ralloc_steal(new_ctx, ir);
1803 }
1804
1805
1806 void
1807 reparent_ir(exec_list *list, void *mem_ctx)
1808 {
1809 foreach_list(node, list) {
1810 visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
1811 }
1812 }
1813
1814
1815 static ir_rvalue *
1816 try_min_one(ir_rvalue *ir)
1817 {
1818 ir_expression *expr = ir->as_expression();
1819
1820 if (!expr || expr->operation != ir_binop_min)
1821 return NULL;
1822
1823 if (expr->operands[0]->is_one())
1824 return expr->operands[1];
1825
1826 if (expr->operands[1]->is_one())
1827 return expr->operands[0];
1828
1829 return NULL;
1830 }
1831
1832 static ir_rvalue *
1833 try_max_zero(ir_rvalue *ir)
1834 {
1835 ir_expression *expr = ir->as_expression();
1836
1837 if (!expr || expr->operation != ir_binop_max)
1838 return NULL;
1839
1840 if (expr->operands[0]->is_zero())
1841 return expr->operands[1];
1842
1843 if (expr->operands[1]->is_zero())
1844 return expr->operands[0];
1845
1846 return NULL;
1847 }
1848
1849 ir_rvalue *
1850 ir_rvalue::as_rvalue_to_saturate()
1851 {
1852 ir_expression *expr = this->as_expression();
1853
1854 if (!expr)
1855 return NULL;
1856
1857 ir_rvalue *max_zero = try_max_zero(expr);
1858 if (max_zero) {
1859 return try_min_one(max_zero);
1860 } else {
1861 ir_rvalue *min_one = try_min_one(expr);
1862 if (min_one) {
1863 return try_max_zero(min_one);
1864 }
1865 }
1866
1867 return NULL;
1868 }
1869
1870
1871 unsigned
1872 vertices_per_prim(GLenum prim)
1873 {
1874 switch (prim) {
1875 case GL_POINTS:
1876 return 1;
1877 case GL_LINES:
1878 return 2;
1879 case GL_TRIANGLES:
1880 return 3;
1881 case GL_LINES_ADJACENCY:
1882 return 4;
1883 case GL_TRIANGLES_ADJACENCY:
1884 return 6;
1885 default:
1886 assert(!"Bad primitive");
1887 return 3;
1888 }
1889 }
1890
1891 /**
1892 * Generate a string describing the mode of a variable
1893 */
1894 const char *
1895 mode_string(const ir_variable *var)
1896 {
1897 switch (var->mode) {
1898 case ir_var_auto:
1899 return (var->read_only) ? "global constant" : "global variable";
1900
1901 case ir_var_uniform:
1902 return "uniform";
1903
1904 case ir_var_shader_in:
1905 return "shader input";
1906
1907 case ir_var_shader_out:
1908 return "shader output";
1909
1910 case ir_var_function_in:
1911 case ir_var_const_in:
1912 return "function input";
1913
1914 case ir_var_function_out:
1915 return "function output";
1916
1917 case ir_var_function_inout:
1918 return "function inout";
1919
1920 case ir_var_system_value:
1921 return "shader input";
1922
1923 case ir_var_temporary:
1924 return "compiler temporary";
1925
1926 case ir_var_mode_count:
1927 break;
1928 }
1929
1930 assert(!"Should not get here.");
1931 return "invalid variable";
1932 }