Use line number information from entire function expression
[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 }
1281
1282
1283 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
1284 {
1285 assert(var != NULL);
1286
1287 this->ir_type = ir_type_dereference_variable;
1288 this->var = var;
1289 this->type = var->type;
1290 }
1291
1292
1293 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
1294 ir_rvalue *array_index)
1295 {
1296 this->ir_type = ir_type_dereference_array;
1297 this->array_index = array_index;
1298 this->set_array(value);
1299 }
1300
1301
1302 ir_dereference_array::ir_dereference_array(ir_variable *var,
1303 ir_rvalue *array_index)
1304 {
1305 void *ctx = ralloc_parent(var);
1306
1307 this->ir_type = ir_type_dereference_array;
1308 this->array_index = array_index;
1309 this->set_array(new(ctx) ir_dereference_variable(var));
1310 }
1311
1312
1313 void
1314 ir_dereference_array::set_array(ir_rvalue *value)
1315 {
1316 assert(value != NULL);
1317
1318 this->array = value;
1319
1320 const glsl_type *const vt = this->array->type;
1321
1322 if (vt->is_array()) {
1323 type = vt->element_type();
1324 } else if (vt->is_matrix()) {
1325 type = vt->column_type();
1326 } else if (vt->is_vector()) {
1327 type = vt->get_base_type();
1328 }
1329 }
1330
1331
1332 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
1333 const char *field)
1334 {
1335 assert(value != NULL);
1336
1337 this->ir_type = ir_type_dereference_record;
1338 this->record = value;
1339 this->field = ralloc_strdup(this, field);
1340 this->type = this->record->type->field_type(field);
1341 }
1342
1343
1344 ir_dereference_record::ir_dereference_record(ir_variable *var,
1345 const char *field)
1346 {
1347 void *ctx = ralloc_parent(var);
1348
1349 this->ir_type = ir_type_dereference_record;
1350 this->record = new(ctx) ir_dereference_variable(var);
1351 this->field = ralloc_strdup(this, field);
1352 this->type = this->record->type->field_type(field);
1353 }
1354
1355 bool
1356 ir_dereference::is_lvalue() const
1357 {
1358 ir_variable *var = this->variable_referenced();
1359
1360 /* Every l-value derference chain eventually ends in a variable.
1361 */
1362 if ((var == NULL) || var->data.read_only)
1363 return false;
1364
1365 /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
1366 *
1367 * "Samplers cannot be treated as l-values; hence cannot be used
1368 * as out or inout function parameters, nor can they be
1369 * assigned into."
1370 */
1371 if (this->type->contains_sampler())
1372 return false;
1373
1374 return true;
1375 }
1376
1377
1378 static const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf", "txf_ms", "txs", "lod", "tg4", "query_levels" };
1379
1380 const char *ir_texture::opcode_string()
1381 {
1382 assert((unsigned int) op <=
1383 sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
1384 return tex_opcode_strs[op];
1385 }
1386
1387 ir_texture_opcode
1388 ir_texture::get_opcode(const char *str)
1389 {
1390 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
1391 for (int op = 0; op < count; op++) {
1392 if (strcmp(str, tex_opcode_strs[op]) == 0)
1393 return (ir_texture_opcode) op;
1394 }
1395 return (ir_texture_opcode) -1;
1396 }
1397
1398
1399 void
1400 ir_texture::set_sampler(ir_dereference *sampler, const glsl_type *type)
1401 {
1402 assert(sampler != NULL);
1403 assert(type != NULL);
1404 this->sampler = sampler;
1405 this->type = type;
1406
1407 if (this->op == ir_txs || this->op == ir_query_levels) {
1408 assert(type->base_type == GLSL_TYPE_INT);
1409 } else if (this->op == ir_lod) {
1410 assert(type->vector_elements == 2);
1411 assert(type->base_type == GLSL_TYPE_FLOAT);
1412 } else {
1413 assert(sampler->type->sampler_type == (int) type->base_type);
1414 if (sampler->type->sampler_shadow)
1415 assert(type->vector_elements == 4 || type->vector_elements == 1);
1416 else
1417 assert(type->vector_elements == 4);
1418 }
1419 }
1420
1421
1422 void
1423 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
1424 {
1425 assert((count >= 1) && (count <= 4));
1426
1427 memset(&this->mask, 0, sizeof(this->mask));
1428 this->mask.num_components = count;
1429
1430 unsigned dup_mask = 0;
1431 switch (count) {
1432 case 4:
1433 assert(comp[3] <= 3);
1434 dup_mask |= (1U << comp[3])
1435 & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
1436 this->mask.w = comp[3];
1437
1438 case 3:
1439 assert(comp[2] <= 3);
1440 dup_mask |= (1U << comp[2])
1441 & ((1U << comp[0]) | (1U << comp[1]));
1442 this->mask.z = comp[2];
1443
1444 case 2:
1445 assert(comp[1] <= 3);
1446 dup_mask |= (1U << comp[1])
1447 & ((1U << comp[0]));
1448 this->mask.y = comp[1];
1449
1450 case 1:
1451 assert(comp[0] <= 3);
1452 this->mask.x = comp[0];
1453 }
1454
1455 this->mask.has_duplicates = dup_mask != 0;
1456
1457 /* Based on the number of elements in the swizzle and the base type
1458 * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
1459 * generate the type of the resulting value.
1460 */
1461 type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
1462 }
1463
1464 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
1465 unsigned w, unsigned count)
1466 : val(val)
1467 {
1468 const unsigned components[4] = { x, y, z, w };
1469 this->ir_type = ir_type_swizzle;
1470 this->init_mask(components, count);
1471 }
1472
1473 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
1474 unsigned count)
1475 : val(val)
1476 {
1477 this->ir_type = ir_type_swizzle;
1478 this->init_mask(comp, count);
1479 }
1480
1481 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
1482 {
1483 this->ir_type = ir_type_swizzle;
1484 this->val = val;
1485 this->mask = mask;
1486 this->type = glsl_type::get_instance(val->type->base_type,
1487 mask.num_components, 1);
1488 }
1489
1490 #define X 1
1491 #define R 5
1492 #define S 9
1493 #define I 13
1494
1495 ir_swizzle *
1496 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
1497 {
1498 void *ctx = ralloc_parent(val);
1499
1500 /* For each possible swizzle character, this table encodes the value in
1501 * \c idx_map that represents the 0th element of the vector. For invalid
1502 * swizzle characters (e.g., 'k'), a special value is used that will allow
1503 * detection of errors.
1504 */
1505 static const unsigned char base_idx[26] = {
1506 /* a b c d e f g h i j k l m */
1507 R, R, I, I, I, I, R, I, I, I, I, I, I,
1508 /* n o p q r s t u v w x y z */
1509 I, I, S, S, R, S, S, I, I, X, X, X, X
1510 };
1511
1512 /* Each valid swizzle character has an entry in the previous table. This
1513 * table encodes the base index encoded in the previous table plus the actual
1514 * index of the swizzle character. When processing swizzles, the first
1515 * character in the string is indexed in the previous table. Each character
1516 * in the string is indexed in this table, and the value found there has the
1517 * value form the first table subtracted. The result must be on the range
1518 * [0,3].
1519 *
1520 * For example, the string "wzyx" will get X from the first table. Each of
1521 * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After
1522 * subtraction, the swizzle values are { 3, 2, 1, 0 }.
1523 *
1524 * The string "wzrg" will get X from the first table. Each of the characters
1525 * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the
1526 * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range
1527 * [0,3], the error is detected.
1528 */
1529 static const unsigned char idx_map[26] = {
1530 /* a b c d e f g h i j k l m */
1531 R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0,
1532 /* n o p q r s t u v w x y z */
1533 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2
1534 };
1535
1536 int swiz_idx[4] = { 0, 0, 0, 0 };
1537 unsigned i;
1538
1539
1540 /* Validate the first character in the swizzle string and look up the base
1541 * index value as described above.
1542 */
1543 if ((str[0] < 'a') || (str[0] > 'z'))
1544 return NULL;
1545
1546 const unsigned base = base_idx[str[0] - 'a'];
1547
1548
1549 for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
1550 /* Validate the next character, and, as described above, convert it to a
1551 * swizzle index.
1552 */
1553 if ((str[i] < 'a') || (str[i] > 'z'))
1554 return NULL;
1555
1556 swiz_idx[i] = idx_map[str[i] - 'a'] - base;
1557 if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
1558 return NULL;
1559 }
1560
1561 if (str[i] != '\0')
1562 return NULL;
1563
1564 return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
1565 swiz_idx[3], i);
1566 }
1567
1568 #undef X
1569 #undef R
1570 #undef S
1571 #undef I
1572
1573 ir_variable *
1574 ir_swizzle::variable_referenced() const
1575 {
1576 return this->val->variable_referenced();
1577 }
1578
1579
1580 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
1581 ir_variable_mode mode)
1582 : max_ifc_array_access(NULL)
1583 {
1584 this->ir_type = ir_type_variable;
1585 this->type = type;
1586 this->name = ralloc_strdup(this, name);
1587 this->data.explicit_location = false;
1588 this->data.has_initializer = false;
1589 this->data.location = -1;
1590 this->data.location_frac = 0;
1591 this->warn_extension = NULL;
1592 this->constant_value = NULL;
1593 this->constant_initializer = NULL;
1594 this->data.origin_upper_left = false;
1595 this->data.pixel_center_integer = false;
1596 this->data.depth_layout = ir_depth_layout_none;
1597 this->data.used = false;
1598 this->data.read_only = false;
1599 this->data.centroid = false;
1600 this->data.sample = false;
1601 this->data.invariant = false;
1602 this->data.how_declared = ir_var_declared_normally;
1603 this->data.mode = mode;
1604 this->data.interpolation = INTERP_QUALIFIER_NONE;
1605 this->data.max_array_access = 0;
1606 this->data.atomic.buffer_index = 0;
1607 this->data.atomic.offset = 0;
1608
1609 if (type != NULL) {
1610 if (type->base_type == GLSL_TYPE_SAMPLER)
1611 this->data.read_only = true;
1612
1613 if (type->is_interface())
1614 this->init_interface_type(type);
1615 else if (type->is_array() && type->fields.array->is_interface())
1616 this->init_interface_type(type->fields.array);
1617 }
1618 }
1619
1620
1621 const char *
1622 interpolation_string(unsigned interpolation)
1623 {
1624 switch (interpolation) {
1625 case INTERP_QUALIFIER_NONE: return "no";
1626 case INTERP_QUALIFIER_SMOOTH: return "smooth";
1627 case INTERP_QUALIFIER_FLAT: return "flat";
1628 case INTERP_QUALIFIER_NOPERSPECTIVE: return "noperspective";
1629 }
1630
1631 assert(!"Should not get here.");
1632 return "";
1633 }
1634
1635
1636 glsl_interp_qualifier
1637 ir_variable::determine_interpolation_mode(bool flat_shade)
1638 {
1639 if (this->data.interpolation != INTERP_QUALIFIER_NONE)
1640 return (glsl_interp_qualifier) this->data.interpolation;
1641 int location = this->data.location;
1642 bool is_gl_Color =
1643 location == VARYING_SLOT_COL0 || location == VARYING_SLOT_COL1;
1644 if (flat_shade && is_gl_Color)
1645 return INTERP_QUALIFIER_FLAT;
1646 else
1647 return INTERP_QUALIFIER_SMOOTH;
1648 }
1649
1650
1651 ir_function_signature::ir_function_signature(const glsl_type *return_type,
1652 builtin_available_predicate b)
1653 : return_type(return_type), is_defined(false), is_intrinsic(false),
1654 builtin_avail(b), _function(NULL)
1655 {
1656 this->ir_type = ir_type_function_signature;
1657 this->origin = NULL;
1658 }
1659
1660
1661 bool
1662 ir_function_signature::is_builtin() const
1663 {
1664 return builtin_avail != NULL;
1665 }
1666
1667
1668 bool
1669 ir_function_signature::is_builtin_available(const _mesa_glsl_parse_state *state) const
1670 {
1671 /* We can't call the predicate without a state pointer, so just say that
1672 * the signature is available. At compile time, we need the filtering,
1673 * but also receive a valid state pointer. At link time, we're resolving
1674 * imported built-in prototypes to their definitions, which will always
1675 * be an exact match. So we can skip the filtering.
1676 */
1677 if (state == NULL)
1678 return true;
1679
1680 assert(builtin_avail != NULL);
1681 return builtin_avail(state);
1682 }
1683
1684
1685 static bool
1686 modes_match(unsigned a, unsigned b)
1687 {
1688 if (a == b)
1689 return true;
1690
1691 /* Accept "in" vs. "const in" */
1692 if ((a == ir_var_const_in && b == ir_var_function_in) ||
1693 (b == ir_var_const_in && a == ir_var_function_in))
1694 return true;
1695
1696 return false;
1697 }
1698
1699
1700 const char *
1701 ir_function_signature::qualifiers_match(exec_list *params)
1702 {
1703 exec_list_iterator iter_a = parameters.iterator();
1704 exec_list_iterator iter_b = params->iterator();
1705
1706 /* check that the qualifiers match. */
1707 while (iter_a.has_next()) {
1708 ir_variable *a = (ir_variable *)iter_a.get();
1709 ir_variable *b = (ir_variable *)iter_b.get();
1710
1711 if (a->data.read_only != b->data.read_only ||
1712 !modes_match(a->data.mode, b->data.mode) ||
1713 a->data.interpolation != b->data.interpolation ||
1714 a->data.centroid != b->data.centroid ||
1715 a->data.sample != b->data.sample) {
1716
1717 /* parameter a's qualifiers don't match */
1718 return a->name;
1719 }
1720
1721 iter_a.next();
1722 iter_b.next();
1723 }
1724 return NULL;
1725 }
1726
1727
1728 void
1729 ir_function_signature::replace_parameters(exec_list *new_params)
1730 {
1731 /* Destroy all of the previous parameter information. If the previous
1732 * parameter information comes from the function prototype, it may either
1733 * specify incorrect parameter names or not have names at all.
1734 */
1735 new_params->move_nodes_to(&parameters);
1736 }
1737
1738
1739 ir_function::ir_function(const char *name)
1740 {
1741 this->ir_type = ir_type_function;
1742 this->name = ralloc_strdup(this, name);
1743 }
1744
1745
1746 bool
1747 ir_function::has_user_signature()
1748 {
1749 foreach_list(n, &this->signatures) {
1750 ir_function_signature *const sig = (ir_function_signature *) n;
1751 if (!sig->is_builtin())
1752 return true;
1753 }
1754 return false;
1755 }
1756
1757
1758 ir_rvalue *
1759 ir_rvalue::error_value(void *mem_ctx)
1760 {
1761 ir_rvalue *v = new(mem_ctx) ir_rvalue;
1762
1763 v->type = glsl_type::error_type;
1764 return v;
1765 }
1766
1767
1768 void
1769 visit_exec_list(exec_list *list, ir_visitor *visitor)
1770 {
1771 foreach_iter(exec_list_iterator, iter, *list) {
1772 ((ir_instruction *)iter.get())->accept(visitor);
1773 }
1774 }
1775
1776
1777 static void
1778 steal_memory(ir_instruction *ir, void *new_ctx)
1779 {
1780 ir_variable *var = ir->as_variable();
1781 ir_constant *constant = ir->as_constant();
1782 if (var != NULL && var->constant_value != NULL)
1783 steal_memory(var->constant_value, ir);
1784
1785 if (var != NULL && var->constant_initializer != NULL)
1786 steal_memory(var->constant_initializer, ir);
1787
1788 /* The components of aggregate constants are not visited by the normal
1789 * visitor, so steal their values by hand.
1790 */
1791 if (constant != NULL) {
1792 if (constant->type->is_record()) {
1793 foreach_iter(exec_list_iterator, iter, constant->components) {
1794 ir_constant *field = (ir_constant *)iter.get();
1795 steal_memory(field, ir);
1796 }
1797 } else if (constant->type->is_array()) {
1798 for (unsigned int i = 0; i < constant->type->length; i++) {
1799 steal_memory(constant->array_elements[i], ir);
1800 }
1801 }
1802 }
1803
1804 ralloc_steal(new_ctx, ir);
1805 }
1806
1807
1808 void
1809 reparent_ir(exec_list *list, void *mem_ctx)
1810 {
1811 foreach_list(node, list) {
1812 visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
1813 }
1814 }
1815
1816
1817 static ir_rvalue *
1818 try_min_one(ir_rvalue *ir)
1819 {
1820 ir_expression *expr = ir->as_expression();
1821
1822 if (!expr || expr->operation != ir_binop_min)
1823 return NULL;
1824
1825 if (expr->operands[0]->is_one())
1826 return expr->operands[1];
1827
1828 if (expr->operands[1]->is_one())
1829 return expr->operands[0];
1830
1831 return NULL;
1832 }
1833
1834 static ir_rvalue *
1835 try_max_zero(ir_rvalue *ir)
1836 {
1837 ir_expression *expr = ir->as_expression();
1838
1839 if (!expr || expr->operation != ir_binop_max)
1840 return NULL;
1841
1842 if (expr->operands[0]->is_zero())
1843 return expr->operands[1];
1844
1845 if (expr->operands[1]->is_zero())
1846 return expr->operands[0];
1847
1848 return NULL;
1849 }
1850
1851 ir_rvalue *
1852 ir_rvalue::as_rvalue_to_saturate()
1853 {
1854 ir_expression *expr = this->as_expression();
1855
1856 if (!expr)
1857 return NULL;
1858
1859 ir_rvalue *max_zero = try_max_zero(expr);
1860 if (max_zero) {
1861 return try_min_one(max_zero);
1862 } else {
1863 ir_rvalue *min_one = try_min_one(expr);
1864 if (min_one) {
1865 return try_max_zero(min_one);
1866 }
1867 }
1868
1869 return NULL;
1870 }
1871
1872
1873 unsigned
1874 vertices_per_prim(GLenum prim)
1875 {
1876 switch (prim) {
1877 case GL_POINTS:
1878 return 1;
1879 case GL_LINES:
1880 return 2;
1881 case GL_TRIANGLES:
1882 return 3;
1883 case GL_LINES_ADJACENCY:
1884 return 4;
1885 case GL_TRIANGLES_ADJACENCY:
1886 return 6;
1887 default:
1888 assert(!"Bad primitive");
1889 return 3;
1890 }
1891 }
1892
1893 /**
1894 * Generate a string describing the mode of a variable
1895 */
1896 const char *
1897 mode_string(const ir_variable *var)
1898 {
1899 switch (var->data.mode) {
1900 case ir_var_auto:
1901 return (var->data.read_only) ? "global constant" : "global variable";
1902
1903 case ir_var_uniform:
1904 return "uniform";
1905
1906 case ir_var_shader_in:
1907 return "shader input";
1908
1909 case ir_var_shader_out:
1910 return "shader output";
1911
1912 case ir_var_function_in:
1913 case ir_var_const_in:
1914 return "function input";
1915
1916 case ir_var_function_out:
1917 return "function output";
1918
1919 case ir_var_function_inout:
1920 return "function inout";
1921
1922 case ir_var_system_value:
1923 return "shader input";
1924
1925 case ir_var_temporary:
1926 return "compiler temporary";
1927
1928 case ir_var_mode_count:
1929 break;
1930 }
1931
1932 assert(!"Should not get here.");
1933 return "invalid variable";
1934 }