glsl: Add conditional-select IR.
[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_lshift:
402 case ir_binop_rshift:
403 case ir_binop_bfm:
404 this->type = op0->type;
405 break;
406
407 case ir_binop_vector_extract:
408 this->type = op0->type->get_scalar_type();
409 break;
410
411 default:
412 assert(!"not reached: missing automatic type setup for ir_expression");
413 this->type = glsl_type::float_type;
414 }
415 }
416
417 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1,
418 ir_rvalue *op2)
419 {
420 this->ir_type = ir_type_expression;
421
422 this->operation = ir_expression_operation(op);
423 this->operands[0] = op0;
424 this->operands[1] = op1;
425 this->operands[2] = op2;
426 this->operands[3] = NULL;
427
428 assert(op > ir_last_binop && op <= ir_last_triop);
429
430 switch (this->operation) {
431 case ir_triop_fma:
432 case ir_triop_lrp:
433 case ir_triop_bitfield_extract:
434 case ir_triop_vector_insert:
435 this->type = op0->type;
436 break;
437
438 case ir_triop_bfi:
439 case ir_triop_csel:
440 this->type = op1->type;
441 break;
442
443 default:
444 assert(!"not reached: missing automatic type setup for ir_expression");
445 this->type = glsl_type::float_type;
446 }
447 }
448
449 unsigned int
450 ir_expression::get_num_operands(ir_expression_operation op)
451 {
452 assert(op <= ir_last_opcode);
453
454 if (op <= ir_last_unop)
455 return 1;
456
457 if (op <= ir_last_binop)
458 return 2;
459
460 if (op <= ir_last_triop)
461 return 3;
462
463 if (op <= ir_last_quadop)
464 return 4;
465
466 assert(false);
467 return 0;
468 }
469
470 static const char *const operator_strs[] = {
471 "~",
472 "!",
473 "neg",
474 "abs",
475 "sign",
476 "rcp",
477 "rsq",
478 "sqrt",
479 "exp",
480 "log",
481 "exp2",
482 "log2",
483 "f2i",
484 "f2u",
485 "i2f",
486 "f2b",
487 "b2f",
488 "i2b",
489 "b2i",
490 "u2f",
491 "i2u",
492 "u2i",
493 "bitcast_i2f",
494 "bitcast_f2i",
495 "bitcast_u2f",
496 "bitcast_f2u",
497 "any",
498 "trunc",
499 "ceil",
500 "floor",
501 "fract",
502 "round_even",
503 "sin",
504 "cos",
505 "sin_reduced",
506 "cos_reduced",
507 "dFdx",
508 "dFdy",
509 "packSnorm2x16",
510 "packSnorm4x8",
511 "packUnorm2x16",
512 "packUnorm4x8",
513 "packHalf2x16",
514 "unpackSnorm2x16",
515 "unpackSnorm4x8",
516 "unpackUnorm2x16",
517 "unpackUnorm4x8",
518 "unpackHalf2x16",
519 "unpackHalf2x16_split_x",
520 "unpackHalf2x16_split_y",
521 "bitfield_reverse",
522 "bit_count",
523 "find_msb",
524 "find_lsb",
525 "noise",
526 "+",
527 "-",
528 "*",
529 "/",
530 "%",
531 "<",
532 ">",
533 "<=",
534 ">=",
535 "==",
536 "!=",
537 "all_equal",
538 "any_nequal",
539 "<<",
540 ">>",
541 "&",
542 "^",
543 "|",
544 "&&",
545 "^^",
546 "||",
547 "dot",
548 "min",
549 "max",
550 "pow",
551 "packHalf2x16_split",
552 "bfm",
553 "ubo_load",
554 "vector_extract",
555 "fma",
556 "lrp",
557 "csel",
558 "bfi",
559 "bitfield_extract",
560 "vector_insert",
561 "bitfield_insert",
562 "vector",
563 };
564
565 const char *ir_expression::operator_string(ir_expression_operation op)
566 {
567 assert((unsigned int) op < Elements(operator_strs));
568 assert(Elements(operator_strs) == (ir_quadop_vector + 1));
569 return operator_strs[op];
570 }
571
572 const char *ir_expression::operator_string()
573 {
574 return operator_string(this->operation);
575 }
576
577 const char*
578 depth_layout_string(ir_depth_layout layout)
579 {
580 switch(layout) {
581 case ir_depth_layout_none: return "";
582 case ir_depth_layout_any: return "depth_any";
583 case ir_depth_layout_greater: return "depth_greater";
584 case ir_depth_layout_less: return "depth_less";
585 case ir_depth_layout_unchanged: return "depth_unchanged";
586
587 default:
588 assert(0);
589 return "";
590 }
591 }
592
593 ir_expression_operation
594 ir_expression::get_operator(const char *str)
595 {
596 const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
597 for (int op = 0; op < operator_count; op++) {
598 if (strcmp(str, operator_strs[op]) == 0)
599 return (ir_expression_operation) op;
600 }
601 return (ir_expression_operation) -1;
602 }
603
604 ir_constant::ir_constant()
605 {
606 this->ir_type = ir_type_constant;
607 }
608
609 ir_constant::ir_constant(const struct glsl_type *type,
610 const ir_constant_data *data)
611 {
612 assert((type->base_type >= GLSL_TYPE_UINT)
613 && (type->base_type <= GLSL_TYPE_BOOL));
614
615 this->ir_type = ir_type_constant;
616 this->type = type;
617 memcpy(& this->value, data, sizeof(this->value));
618 }
619
620 ir_constant::ir_constant(float f)
621 {
622 this->ir_type = ir_type_constant;
623 this->type = glsl_type::float_type;
624 this->value.f[0] = f;
625 for (int i = 1; i < 16; i++) {
626 this->value.f[i] = 0;
627 }
628 }
629
630 ir_constant::ir_constant(unsigned int u)
631 {
632 this->ir_type = ir_type_constant;
633 this->type = glsl_type::uint_type;
634 this->value.u[0] = u;
635 for (int i = 1; i < 16; i++) {
636 this->value.u[i] = 0;
637 }
638 }
639
640 ir_constant::ir_constant(int i)
641 {
642 this->ir_type = ir_type_constant;
643 this->type = glsl_type::int_type;
644 this->value.i[0] = i;
645 for (int i = 1; i < 16; i++) {
646 this->value.i[i] = 0;
647 }
648 }
649
650 ir_constant::ir_constant(bool b)
651 {
652 this->ir_type = ir_type_constant;
653 this->type = glsl_type::bool_type;
654 this->value.b[0] = b;
655 for (int i = 1; i < 16; i++) {
656 this->value.b[i] = false;
657 }
658 }
659
660 ir_constant::ir_constant(const ir_constant *c, unsigned i)
661 {
662 this->ir_type = ir_type_constant;
663 this->type = c->type->get_base_type();
664
665 switch (this->type->base_type) {
666 case GLSL_TYPE_UINT: this->value.u[0] = c->value.u[i]; break;
667 case GLSL_TYPE_INT: this->value.i[0] = c->value.i[i]; break;
668 case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
669 case GLSL_TYPE_BOOL: this->value.b[0] = c->value.b[i]; break;
670 default: assert(!"Should not get here."); break;
671 }
672 }
673
674 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
675 {
676 this->ir_type = ir_type_constant;
677 this->type = type;
678
679 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
680 || type->is_record() || type->is_array());
681
682 if (type->is_array()) {
683 this->array_elements = ralloc_array(this, ir_constant *, type->length);
684 unsigned i = 0;
685 foreach_list(node, value_list) {
686 ir_constant *value = (ir_constant *) node;
687 assert(value->as_constant() != NULL);
688
689 this->array_elements[i++] = value;
690 }
691 return;
692 }
693
694 /* If the constant is a record, the types of each of the entries in
695 * value_list must be a 1-for-1 match with the structure components. Each
696 * entry must also be a constant. Just move the nodes from the value_list
697 * to the list in the ir_constant.
698 */
699 /* FINISHME: Should there be some type checking and / or assertions here? */
700 /* FINISHME: Should the new constant take ownership of the nodes from
701 * FINISHME: value_list, or should it make copies?
702 */
703 if (type->is_record()) {
704 value_list->move_nodes_to(& this->components);
705 return;
706 }
707
708 for (unsigned i = 0; i < 16; i++) {
709 this->value.u[i] = 0;
710 }
711
712 ir_constant *value = (ir_constant *) (value_list->head);
713
714 /* Constructors with exactly one scalar argument are special for vectors
715 * and matrices. For vectors, the scalar value is replicated to fill all
716 * the components. For matrices, the scalar fills the components of the
717 * diagonal while the rest is filled with 0.
718 */
719 if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
720 if (type->is_matrix()) {
721 /* Matrix - fill diagonal (rest is already set to 0) */
722 assert(type->base_type == GLSL_TYPE_FLOAT);
723 for (unsigned i = 0; i < type->matrix_columns; i++)
724 this->value.f[i * type->vector_elements + i] = value->value.f[0];
725 } else {
726 /* Vector or scalar - fill all components */
727 switch (type->base_type) {
728 case GLSL_TYPE_UINT:
729 case GLSL_TYPE_INT:
730 for (unsigned i = 0; i < type->components(); i++)
731 this->value.u[i] = value->value.u[0];
732 break;
733 case GLSL_TYPE_FLOAT:
734 for (unsigned i = 0; i < type->components(); i++)
735 this->value.f[i] = value->value.f[0];
736 break;
737 case GLSL_TYPE_BOOL:
738 for (unsigned i = 0; i < type->components(); i++)
739 this->value.b[i] = value->value.b[0];
740 break;
741 default:
742 assert(!"Should not get here.");
743 break;
744 }
745 }
746 return;
747 }
748
749 if (type->is_matrix() && value->type->is_matrix()) {
750 assert(value->next->is_tail_sentinel());
751
752 /* From section 5.4.2 of the GLSL 1.20 spec:
753 * "If a matrix is constructed from a matrix, then each component
754 * (column i, row j) in the result that has a corresponding component
755 * (column i, row j) in the argument will be initialized from there."
756 */
757 unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
758 unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
759 for (unsigned i = 0; i < cols; i++) {
760 for (unsigned j = 0; j < rows; j++) {
761 const unsigned src = i * value->type->vector_elements + j;
762 const unsigned dst = i * type->vector_elements + j;
763 this->value.f[dst] = value->value.f[src];
764 }
765 }
766
767 /* "All other components will be initialized to the identity matrix." */
768 for (unsigned i = cols; i < type->matrix_columns; i++)
769 this->value.f[i * type->vector_elements + i] = 1.0;
770
771 return;
772 }
773
774 /* Use each component from each entry in the value_list to initialize one
775 * component of the constant being constructed.
776 */
777 for (unsigned i = 0; i < type->components(); /* empty */) {
778 assert(value->as_constant() != NULL);
779 assert(!value->is_tail_sentinel());
780
781 for (unsigned j = 0; j < value->type->components(); j++) {
782 switch (type->base_type) {
783 case GLSL_TYPE_UINT:
784 this->value.u[i] = value->get_uint_component(j);
785 break;
786 case GLSL_TYPE_INT:
787 this->value.i[i] = value->get_int_component(j);
788 break;
789 case GLSL_TYPE_FLOAT:
790 this->value.f[i] = value->get_float_component(j);
791 break;
792 case GLSL_TYPE_BOOL:
793 this->value.b[i] = value->get_bool_component(j);
794 break;
795 default:
796 /* FINISHME: What to do? Exceptions are not the answer.
797 */
798 break;
799 }
800
801 i++;
802 if (i >= type->components())
803 break;
804 }
805
806 value = (ir_constant *) value->next;
807 }
808 }
809
810 ir_constant *
811 ir_constant::zero(void *mem_ctx, const glsl_type *type)
812 {
813 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
814 || type->is_record() || type->is_array());
815
816 ir_constant *c = new(mem_ctx) ir_constant;
817 c->type = type;
818 memset(&c->value, 0, sizeof(c->value));
819
820 if (type->is_array()) {
821 c->array_elements = ralloc_array(c, ir_constant *, type->length);
822
823 for (unsigned i = 0; i < type->length; i++)
824 c->array_elements[i] = ir_constant::zero(c, type->element_type());
825 }
826
827 if (type->is_record()) {
828 for (unsigned i = 0; i < type->length; i++) {
829 ir_constant *comp = ir_constant::zero(mem_ctx, type->fields.structure[i].type);
830 c->components.push_tail(comp);
831 }
832 }
833
834 return c;
835 }
836
837 bool
838 ir_constant::get_bool_component(unsigned i) const
839 {
840 switch (this->type->base_type) {
841 case GLSL_TYPE_UINT: return this->value.u[i] != 0;
842 case GLSL_TYPE_INT: return this->value.i[i] != 0;
843 case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
844 case GLSL_TYPE_BOOL: return this->value.b[i];
845 default: assert(!"Should not get here."); break;
846 }
847
848 /* Must return something to make the compiler happy. This is clearly an
849 * error case.
850 */
851 return false;
852 }
853
854 float
855 ir_constant::get_float_component(unsigned i) const
856 {
857 switch (this->type->base_type) {
858 case GLSL_TYPE_UINT: return (float) this->value.u[i];
859 case GLSL_TYPE_INT: return (float) this->value.i[i];
860 case GLSL_TYPE_FLOAT: return this->value.f[i];
861 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0f : 0.0f;
862 default: assert(!"Should not get here."); break;
863 }
864
865 /* Must return something to make the compiler happy. This is clearly an
866 * error case.
867 */
868 return 0.0;
869 }
870
871 int
872 ir_constant::get_int_component(unsigned i) const
873 {
874 switch (this->type->base_type) {
875 case GLSL_TYPE_UINT: return this->value.u[i];
876 case GLSL_TYPE_INT: return this->value.i[i];
877 case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
878 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
879 default: assert(!"Should not get here."); break;
880 }
881
882 /* Must return something to make the compiler happy. This is clearly an
883 * error case.
884 */
885 return 0;
886 }
887
888 unsigned
889 ir_constant::get_uint_component(unsigned i) const
890 {
891 switch (this->type->base_type) {
892 case GLSL_TYPE_UINT: return this->value.u[i];
893 case GLSL_TYPE_INT: return this->value.i[i];
894 case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
895 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
896 default: assert(!"Should not get here."); break;
897 }
898
899 /* Must return something to make the compiler happy. This is clearly an
900 * error case.
901 */
902 return 0;
903 }
904
905 ir_constant *
906 ir_constant::get_array_element(unsigned i) const
907 {
908 assert(this->type->is_array());
909
910 /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
911 *
912 * "Behavior is undefined if a shader subscripts an array with an index
913 * less than 0 or greater than or equal to the size the array was
914 * declared with."
915 *
916 * Most out-of-bounds accesses are removed before things could get this far.
917 * There are cases where non-constant array index values can get constant
918 * folded.
919 */
920 if (int(i) < 0)
921 i = 0;
922 else if (i >= this->type->length)
923 i = this->type->length - 1;
924
925 return array_elements[i];
926 }
927
928 ir_constant *
929 ir_constant::get_record_field(const char *name)
930 {
931 int idx = this->type->field_index(name);
932
933 if (idx < 0)
934 return NULL;
935
936 if (this->components.is_empty())
937 return NULL;
938
939 exec_node *node = this->components.head;
940 for (int i = 0; i < idx; i++) {
941 node = node->next;
942
943 /* If the end of the list is encountered before the element matching the
944 * requested field is found, return NULL.
945 */
946 if (node->is_tail_sentinel())
947 return NULL;
948 }
949
950 return (ir_constant *) node;
951 }
952
953 void
954 ir_constant::copy_offset(ir_constant *src, int offset)
955 {
956 switch (this->type->base_type) {
957 case GLSL_TYPE_UINT:
958 case GLSL_TYPE_INT:
959 case GLSL_TYPE_FLOAT:
960 case GLSL_TYPE_BOOL: {
961 unsigned int size = src->type->components();
962 assert (size <= this->type->components() - offset);
963 for (unsigned int i=0; i<size; i++) {
964 switch (this->type->base_type) {
965 case GLSL_TYPE_UINT:
966 value.u[i+offset] = src->get_uint_component(i);
967 break;
968 case GLSL_TYPE_INT:
969 value.i[i+offset] = src->get_int_component(i);
970 break;
971 case GLSL_TYPE_FLOAT:
972 value.f[i+offset] = src->get_float_component(i);
973 break;
974 case GLSL_TYPE_BOOL:
975 value.b[i+offset] = src->get_bool_component(i);
976 break;
977 default: // Shut up the compiler
978 break;
979 }
980 }
981 break;
982 }
983
984 case GLSL_TYPE_STRUCT: {
985 assert (src->type == this->type);
986 this->components.make_empty();
987 foreach_list(node, &src->components) {
988 ir_constant *const orig = (ir_constant *) node;
989
990 this->components.push_tail(orig->clone(this, NULL));
991 }
992 break;
993 }
994
995 case GLSL_TYPE_ARRAY: {
996 assert (src->type == this->type);
997 for (unsigned i = 0; i < this->type->length; i++) {
998 this->array_elements[i] = src->array_elements[i]->clone(this, NULL);
999 }
1000 break;
1001 }
1002
1003 default:
1004 assert(!"Should not get here.");
1005 break;
1006 }
1007 }
1008
1009 void
1010 ir_constant::copy_masked_offset(ir_constant *src, int offset, unsigned int mask)
1011 {
1012 assert (!type->is_array() && !type->is_record());
1013
1014 if (!type->is_vector() && !type->is_matrix()) {
1015 offset = 0;
1016 mask = 1;
1017 }
1018
1019 int id = 0;
1020 for (int i=0; i<4; i++) {
1021 if (mask & (1 << i)) {
1022 switch (this->type->base_type) {
1023 case GLSL_TYPE_UINT:
1024 value.u[i+offset] = src->get_uint_component(id++);
1025 break;
1026 case GLSL_TYPE_INT:
1027 value.i[i+offset] = src->get_int_component(id++);
1028 break;
1029 case GLSL_TYPE_FLOAT:
1030 value.f[i+offset] = src->get_float_component(id++);
1031 break;
1032 case GLSL_TYPE_BOOL:
1033 value.b[i+offset] = src->get_bool_component(id++);
1034 break;
1035 default:
1036 assert(!"Should not get here.");
1037 return;
1038 }
1039 }
1040 }
1041 }
1042
1043 bool
1044 ir_constant::has_value(const ir_constant *c) const
1045 {
1046 if (this->type != c->type)
1047 return false;
1048
1049 if (this->type->is_array()) {
1050 for (unsigned i = 0; i < this->type->length; i++) {
1051 if (!this->array_elements[i]->has_value(c->array_elements[i]))
1052 return false;
1053 }
1054 return true;
1055 }
1056
1057 if (this->type->base_type == GLSL_TYPE_STRUCT) {
1058 const exec_node *a_node = this->components.head;
1059 const exec_node *b_node = c->components.head;
1060
1061 while (!a_node->is_tail_sentinel()) {
1062 assert(!b_node->is_tail_sentinel());
1063
1064 const ir_constant *const a_field = (ir_constant *) a_node;
1065 const ir_constant *const b_field = (ir_constant *) b_node;
1066
1067 if (!a_field->has_value(b_field))
1068 return false;
1069
1070 a_node = a_node->next;
1071 b_node = b_node->next;
1072 }
1073
1074 return true;
1075 }
1076
1077 for (unsigned i = 0; i < this->type->components(); i++) {
1078 switch (this->type->base_type) {
1079 case GLSL_TYPE_UINT:
1080 if (this->value.u[i] != c->value.u[i])
1081 return false;
1082 break;
1083 case GLSL_TYPE_INT:
1084 if (this->value.i[i] != c->value.i[i])
1085 return false;
1086 break;
1087 case GLSL_TYPE_FLOAT:
1088 if (this->value.f[i] != c->value.f[i])
1089 return false;
1090 break;
1091 case GLSL_TYPE_BOOL:
1092 if (this->value.b[i] != c->value.b[i])
1093 return false;
1094 break;
1095 default:
1096 assert(!"Should not get here.");
1097 return false;
1098 }
1099 }
1100
1101 return true;
1102 }
1103
1104 bool
1105 ir_constant::is_zero() const
1106 {
1107 if (!this->type->is_scalar() && !this->type->is_vector())
1108 return false;
1109
1110 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1111 switch (this->type->base_type) {
1112 case GLSL_TYPE_FLOAT:
1113 if (this->value.f[c] != 0.0)
1114 return false;
1115 break;
1116 case GLSL_TYPE_INT:
1117 if (this->value.i[c] != 0)
1118 return false;
1119 break;
1120 case GLSL_TYPE_UINT:
1121 if (this->value.u[c] != 0)
1122 return false;
1123 break;
1124 case GLSL_TYPE_BOOL:
1125 if (this->value.b[c] != false)
1126 return false;
1127 break;
1128 default:
1129 /* The only other base types are structures, arrays, and samplers.
1130 * Samplers cannot be constants, and the others should have been
1131 * filtered out above.
1132 */
1133 assert(!"Should not get here.");
1134 return false;
1135 }
1136 }
1137
1138 return true;
1139 }
1140
1141 bool
1142 ir_constant::is_one() const
1143 {
1144 if (!this->type->is_scalar() && !this->type->is_vector())
1145 return false;
1146
1147 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1148 switch (this->type->base_type) {
1149 case GLSL_TYPE_FLOAT:
1150 if (this->value.f[c] != 1.0)
1151 return false;
1152 break;
1153 case GLSL_TYPE_INT:
1154 if (this->value.i[c] != 1)
1155 return false;
1156 break;
1157 case GLSL_TYPE_UINT:
1158 if (this->value.u[c] != 1)
1159 return false;
1160 break;
1161 case GLSL_TYPE_BOOL:
1162 if (this->value.b[c] != true)
1163 return false;
1164 break;
1165 default:
1166 /* The only other base types are structures, arrays, and samplers.
1167 * Samplers cannot be constants, and the others should have been
1168 * filtered out above.
1169 */
1170 assert(!"Should not get here.");
1171 return false;
1172 }
1173 }
1174
1175 return true;
1176 }
1177
1178 bool
1179 ir_constant::is_negative_one() const
1180 {
1181 if (!this->type->is_scalar() && !this->type->is_vector())
1182 return false;
1183
1184 if (this->type->is_boolean())
1185 return false;
1186
1187 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1188 switch (this->type->base_type) {
1189 case GLSL_TYPE_FLOAT:
1190 if (this->value.f[c] != -1.0)
1191 return false;
1192 break;
1193 case GLSL_TYPE_INT:
1194 if (this->value.i[c] != -1)
1195 return false;
1196 break;
1197 case GLSL_TYPE_UINT:
1198 if (int(this->value.u[c]) != -1)
1199 return false;
1200 break;
1201 default:
1202 /* The only other base types are structures, arrays, samplers, and
1203 * booleans. Samplers cannot be constants, and the others should
1204 * have been filtered out above.
1205 */
1206 assert(!"Should not get here.");
1207 return false;
1208 }
1209 }
1210
1211 return true;
1212 }
1213
1214 bool
1215 ir_constant::is_basis() const
1216 {
1217 if (!this->type->is_scalar() && !this->type->is_vector())
1218 return false;
1219
1220 if (this->type->is_boolean())
1221 return false;
1222
1223 unsigned ones = 0;
1224 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1225 switch (this->type->base_type) {
1226 case GLSL_TYPE_FLOAT:
1227 if (this->value.f[c] == 1.0)
1228 ones++;
1229 else if (this->value.f[c] != 0.0)
1230 return false;
1231 break;
1232 case GLSL_TYPE_INT:
1233 if (this->value.i[c] == 1)
1234 ones++;
1235 else if (this->value.i[c] != 0)
1236 return false;
1237 break;
1238 case GLSL_TYPE_UINT:
1239 if (int(this->value.u[c]) == 1)
1240 ones++;
1241 else if (int(this->value.u[c]) != 0)
1242 return false;
1243 break;
1244 default:
1245 /* The only other base types are structures, arrays, samplers, and
1246 * booleans. Samplers cannot be constants, and the others should
1247 * have been filtered out above.
1248 */
1249 assert(!"Should not get here.");
1250 return false;
1251 }
1252 }
1253
1254 return ones == 1;
1255 }
1256
1257 ir_loop::ir_loop()
1258 {
1259 this->ir_type = ir_type_loop;
1260 this->cmp = ir_unop_neg;
1261 this->from = NULL;
1262 this->to = NULL;
1263 this->increment = NULL;
1264 this->counter = NULL;
1265 }
1266
1267
1268 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
1269 {
1270 assert(var != NULL);
1271
1272 this->ir_type = ir_type_dereference_variable;
1273 this->var = var;
1274 this->type = var->type;
1275 }
1276
1277
1278 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
1279 ir_rvalue *array_index)
1280 {
1281 this->ir_type = ir_type_dereference_array;
1282 this->array_index = array_index;
1283 this->set_array(value);
1284 }
1285
1286
1287 ir_dereference_array::ir_dereference_array(ir_variable *var,
1288 ir_rvalue *array_index)
1289 {
1290 void *ctx = ralloc_parent(var);
1291
1292 this->ir_type = ir_type_dereference_array;
1293 this->array_index = array_index;
1294 this->set_array(new(ctx) ir_dereference_variable(var));
1295 }
1296
1297
1298 void
1299 ir_dereference_array::set_array(ir_rvalue *value)
1300 {
1301 assert(value != NULL);
1302
1303 this->array = value;
1304
1305 const glsl_type *const vt = this->array->type;
1306
1307 if (vt->is_array()) {
1308 type = vt->element_type();
1309 } else if (vt->is_matrix()) {
1310 type = vt->column_type();
1311 } else if (vt->is_vector()) {
1312 type = vt->get_base_type();
1313 }
1314 }
1315
1316
1317 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
1318 const char *field)
1319 {
1320 assert(value != NULL);
1321
1322 this->ir_type = ir_type_dereference_record;
1323 this->record = value;
1324 this->field = ralloc_strdup(this, field);
1325 this->type = this->record->type->field_type(field);
1326 }
1327
1328
1329 ir_dereference_record::ir_dereference_record(ir_variable *var,
1330 const char *field)
1331 {
1332 void *ctx = ralloc_parent(var);
1333
1334 this->ir_type = ir_type_dereference_record;
1335 this->record = new(ctx) ir_dereference_variable(var);
1336 this->field = ralloc_strdup(this, field);
1337 this->type = this->record->type->field_type(field);
1338 }
1339
1340 bool
1341 ir_dereference::is_lvalue() const
1342 {
1343 ir_variable *var = this->variable_referenced();
1344
1345 /* Every l-value derference chain eventually ends in a variable.
1346 */
1347 if ((var == NULL) || var->read_only)
1348 return false;
1349
1350 /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
1351 *
1352 * "Samplers cannot be treated as l-values; hence cannot be used
1353 * as out or inout function parameters, nor can they be
1354 * assigned into."
1355 */
1356 if (this->type->contains_sampler())
1357 return false;
1358
1359 return true;
1360 }
1361
1362
1363 static const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf", "txf_ms", "txs", "lod" };
1364
1365 const char *ir_texture::opcode_string()
1366 {
1367 assert((unsigned int) op <=
1368 sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
1369 return tex_opcode_strs[op];
1370 }
1371
1372 ir_texture_opcode
1373 ir_texture::get_opcode(const char *str)
1374 {
1375 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
1376 for (int op = 0; op < count; op++) {
1377 if (strcmp(str, tex_opcode_strs[op]) == 0)
1378 return (ir_texture_opcode) op;
1379 }
1380 return (ir_texture_opcode) -1;
1381 }
1382
1383
1384 void
1385 ir_texture::set_sampler(ir_dereference *sampler, const glsl_type *type)
1386 {
1387 assert(sampler != NULL);
1388 assert(type != NULL);
1389 this->sampler = sampler;
1390 this->type = type;
1391
1392 if (this->op == ir_txs) {
1393 assert(type->base_type == GLSL_TYPE_INT);
1394 } else if (this->op == ir_lod) {
1395 assert(type->vector_elements == 2);
1396 assert(type->base_type == GLSL_TYPE_FLOAT);
1397 } else {
1398 assert(sampler->type->sampler_type == (int) type->base_type);
1399 if (sampler->type->sampler_shadow)
1400 assert(type->vector_elements == 4 || type->vector_elements == 1);
1401 else
1402 assert(type->vector_elements == 4);
1403 }
1404 }
1405
1406
1407 void
1408 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
1409 {
1410 assert((count >= 1) && (count <= 4));
1411
1412 memset(&this->mask, 0, sizeof(this->mask));
1413 this->mask.num_components = count;
1414
1415 unsigned dup_mask = 0;
1416 switch (count) {
1417 case 4:
1418 assert(comp[3] <= 3);
1419 dup_mask |= (1U << comp[3])
1420 & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
1421 this->mask.w = comp[3];
1422
1423 case 3:
1424 assert(comp[2] <= 3);
1425 dup_mask |= (1U << comp[2])
1426 & ((1U << comp[0]) | (1U << comp[1]));
1427 this->mask.z = comp[2];
1428
1429 case 2:
1430 assert(comp[1] <= 3);
1431 dup_mask |= (1U << comp[1])
1432 & ((1U << comp[0]));
1433 this->mask.y = comp[1];
1434
1435 case 1:
1436 assert(comp[0] <= 3);
1437 this->mask.x = comp[0];
1438 }
1439
1440 this->mask.has_duplicates = dup_mask != 0;
1441
1442 /* Based on the number of elements in the swizzle and the base type
1443 * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
1444 * generate the type of the resulting value.
1445 */
1446 type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
1447 }
1448
1449 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
1450 unsigned w, unsigned count)
1451 : val(val)
1452 {
1453 const unsigned components[4] = { x, y, z, w };
1454 this->ir_type = ir_type_swizzle;
1455 this->init_mask(components, count);
1456 }
1457
1458 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
1459 unsigned count)
1460 : val(val)
1461 {
1462 this->ir_type = ir_type_swizzle;
1463 this->init_mask(comp, count);
1464 }
1465
1466 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
1467 {
1468 this->ir_type = ir_type_swizzle;
1469 this->val = val;
1470 this->mask = mask;
1471 this->type = glsl_type::get_instance(val->type->base_type,
1472 mask.num_components, 1);
1473 }
1474
1475 #define X 1
1476 #define R 5
1477 #define S 9
1478 #define I 13
1479
1480 ir_swizzle *
1481 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
1482 {
1483 void *ctx = ralloc_parent(val);
1484
1485 /* For each possible swizzle character, this table encodes the value in
1486 * \c idx_map that represents the 0th element of the vector. For invalid
1487 * swizzle characters (e.g., 'k'), a special value is used that will allow
1488 * detection of errors.
1489 */
1490 static const unsigned char base_idx[26] = {
1491 /* a b c d e f g h i j k l m */
1492 R, R, I, I, I, I, R, I, I, I, I, I, I,
1493 /* n o p q r s t u v w x y z */
1494 I, I, S, S, R, S, S, I, I, X, X, X, X
1495 };
1496
1497 /* Each valid swizzle character has an entry in the previous table. This
1498 * table encodes the base index encoded in the previous table plus the actual
1499 * index of the swizzle character. When processing swizzles, the first
1500 * character in the string is indexed in the previous table. Each character
1501 * in the string is indexed in this table, and the value found there has the
1502 * value form the first table subtracted. The result must be on the range
1503 * [0,3].
1504 *
1505 * For example, the string "wzyx" will get X from the first table. Each of
1506 * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After
1507 * subtraction, the swizzle values are { 3, 2, 1, 0 }.
1508 *
1509 * The string "wzrg" will get X from the first table. Each of the characters
1510 * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the
1511 * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range
1512 * [0,3], the error is detected.
1513 */
1514 static const unsigned char idx_map[26] = {
1515 /* a b c d e f g h i j k l m */
1516 R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0,
1517 /* n o p q r s t u v w x y z */
1518 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2
1519 };
1520
1521 int swiz_idx[4] = { 0, 0, 0, 0 };
1522 unsigned i;
1523
1524
1525 /* Validate the first character in the swizzle string and look up the base
1526 * index value as described above.
1527 */
1528 if ((str[0] < 'a') || (str[0] > 'z'))
1529 return NULL;
1530
1531 const unsigned base = base_idx[str[0] - 'a'];
1532
1533
1534 for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
1535 /* Validate the next character, and, as described above, convert it to a
1536 * swizzle index.
1537 */
1538 if ((str[i] < 'a') || (str[i] > 'z'))
1539 return NULL;
1540
1541 swiz_idx[i] = idx_map[str[i] - 'a'] - base;
1542 if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
1543 return NULL;
1544 }
1545
1546 if (str[i] != '\0')
1547 return NULL;
1548
1549 return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
1550 swiz_idx[3], i);
1551 }
1552
1553 #undef X
1554 #undef R
1555 #undef S
1556 #undef I
1557
1558 ir_variable *
1559 ir_swizzle::variable_referenced() const
1560 {
1561 return this->val->variable_referenced();
1562 }
1563
1564
1565 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
1566 ir_variable_mode mode)
1567 : max_array_access(0), read_only(false), centroid(false), invariant(false),
1568 mode(mode), interpolation(INTERP_QUALIFIER_NONE)
1569 {
1570 this->ir_type = ir_type_variable;
1571 this->type = type;
1572 this->name = ralloc_strdup(this, name);
1573 this->explicit_location = false;
1574 this->has_initializer = false;
1575 this->location = -1;
1576 this->location_frac = 0;
1577 this->warn_extension = NULL;
1578 this->constant_value = NULL;
1579 this->constant_initializer = NULL;
1580 this->origin_upper_left = false;
1581 this->pixel_center_integer = false;
1582 this->depth_layout = ir_depth_layout_none;
1583 this->used = false;
1584
1585 if (type && type->base_type == GLSL_TYPE_SAMPLER)
1586 this->read_only = true;
1587 }
1588
1589
1590 const char *
1591 ir_variable::interpolation_string() const
1592 {
1593 switch (this->interpolation) {
1594 case INTERP_QUALIFIER_NONE: return "no";
1595 case INTERP_QUALIFIER_SMOOTH: return "smooth";
1596 case INTERP_QUALIFIER_FLAT: return "flat";
1597 case INTERP_QUALIFIER_NOPERSPECTIVE: return "noperspective";
1598 }
1599
1600 assert(!"Should not get here.");
1601 return "";
1602 }
1603
1604
1605 glsl_interp_qualifier
1606 ir_variable::determine_interpolation_mode(bool flat_shade)
1607 {
1608 if (this->interpolation != INTERP_QUALIFIER_NONE)
1609 return (glsl_interp_qualifier) this->interpolation;
1610 int location = this->location;
1611 bool is_gl_Color =
1612 location == VARYING_SLOT_COL0 || location == VARYING_SLOT_COL1;
1613 if (flat_shade && is_gl_Color)
1614 return INTERP_QUALIFIER_FLAT;
1615 else
1616 return INTERP_QUALIFIER_SMOOTH;
1617 }
1618
1619
1620 ir_function_signature::ir_function_signature(const glsl_type *return_type,
1621 builtin_available_predicate b)
1622 : return_type(return_type), is_defined(false), builtin_avail(b),
1623 _function(NULL)
1624 {
1625 this->ir_type = ir_type_function_signature;
1626 this->origin = NULL;
1627 }
1628
1629
1630 bool
1631 ir_function_signature::is_builtin() const
1632 {
1633 return builtin_avail != NULL;
1634 }
1635
1636
1637 bool
1638 ir_function_signature::is_builtin_available(const _mesa_glsl_parse_state *state) const
1639 {
1640 /* We can't call the predicate without a state pointer, so just say that
1641 * the signature is available. At compile time, we need the filtering,
1642 * but also receive a valid state pointer. At link time, we're resolving
1643 * imported built-in prototypes to their definitions, which will always
1644 * be an exact match. So we can skip the filtering.
1645 */
1646 if (state == NULL)
1647 return true;
1648
1649 assert(builtin_avail != NULL);
1650 return builtin_avail(state);
1651 }
1652
1653
1654 static bool
1655 modes_match(unsigned a, unsigned b)
1656 {
1657 if (a == b)
1658 return true;
1659
1660 /* Accept "in" vs. "const in" */
1661 if ((a == ir_var_const_in && b == ir_var_function_in) ||
1662 (b == ir_var_const_in && a == ir_var_function_in))
1663 return true;
1664
1665 return false;
1666 }
1667
1668
1669 const char *
1670 ir_function_signature::qualifiers_match(exec_list *params)
1671 {
1672 exec_list_iterator iter_a = parameters.iterator();
1673 exec_list_iterator iter_b = params->iterator();
1674
1675 /* check that the qualifiers match. */
1676 while (iter_a.has_next()) {
1677 ir_variable *a = (ir_variable *)iter_a.get();
1678 ir_variable *b = (ir_variable *)iter_b.get();
1679
1680 if (a->read_only != b->read_only ||
1681 !modes_match(a->mode, b->mode) ||
1682 a->interpolation != b->interpolation ||
1683 a->centroid != b->centroid) {
1684
1685 /* parameter a's qualifiers don't match */
1686 return a->name;
1687 }
1688
1689 iter_a.next();
1690 iter_b.next();
1691 }
1692 return NULL;
1693 }
1694
1695
1696 void
1697 ir_function_signature::replace_parameters(exec_list *new_params)
1698 {
1699 /* Destroy all of the previous parameter information. If the previous
1700 * parameter information comes from the function prototype, it may either
1701 * specify incorrect parameter names or not have names at all.
1702 */
1703 foreach_iter(exec_list_iterator, iter, parameters) {
1704 assert(((ir_instruction *) iter.get())->as_variable() != NULL);
1705
1706 iter.remove();
1707 }
1708
1709 new_params->move_nodes_to(&parameters);
1710 }
1711
1712
1713 ir_function::ir_function(const char *name)
1714 {
1715 this->ir_type = ir_type_function;
1716 this->name = ralloc_strdup(this, name);
1717 }
1718
1719
1720 bool
1721 ir_function::has_user_signature()
1722 {
1723 foreach_list(n, &this->signatures) {
1724 ir_function_signature *const sig = (ir_function_signature *) n;
1725 if (!sig->is_builtin())
1726 return true;
1727 }
1728 return false;
1729 }
1730
1731
1732 ir_rvalue *
1733 ir_rvalue::error_value(void *mem_ctx)
1734 {
1735 ir_rvalue *v = new(mem_ctx) ir_rvalue;
1736
1737 v->type = glsl_type::error_type;
1738 return v;
1739 }
1740
1741
1742 void
1743 visit_exec_list(exec_list *list, ir_visitor *visitor)
1744 {
1745 foreach_iter(exec_list_iterator, iter, *list) {
1746 ((ir_instruction *)iter.get())->accept(visitor);
1747 }
1748 }
1749
1750
1751 static void
1752 steal_memory(ir_instruction *ir, void *new_ctx)
1753 {
1754 ir_variable *var = ir->as_variable();
1755 ir_constant *constant = ir->as_constant();
1756 if (var != NULL && var->constant_value != NULL)
1757 steal_memory(var->constant_value, ir);
1758
1759 if (var != NULL && var->constant_initializer != NULL)
1760 steal_memory(var->constant_initializer, ir);
1761
1762 /* The components of aggregate constants are not visited by the normal
1763 * visitor, so steal their values by hand.
1764 */
1765 if (constant != NULL) {
1766 if (constant->type->is_record()) {
1767 foreach_iter(exec_list_iterator, iter, constant->components) {
1768 ir_constant *field = (ir_constant *)iter.get();
1769 steal_memory(field, ir);
1770 }
1771 } else if (constant->type->is_array()) {
1772 for (unsigned int i = 0; i < constant->type->length; i++) {
1773 steal_memory(constant->array_elements[i], ir);
1774 }
1775 }
1776 }
1777
1778 ralloc_steal(new_ctx, ir);
1779 }
1780
1781
1782 void
1783 reparent_ir(exec_list *list, void *mem_ctx)
1784 {
1785 foreach_list(node, list) {
1786 visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
1787 }
1788 }
1789
1790
1791 static ir_rvalue *
1792 try_min_one(ir_rvalue *ir)
1793 {
1794 ir_expression *expr = ir->as_expression();
1795
1796 if (!expr || expr->operation != ir_binop_min)
1797 return NULL;
1798
1799 if (expr->operands[0]->is_one())
1800 return expr->operands[1];
1801
1802 if (expr->operands[1]->is_one())
1803 return expr->operands[0];
1804
1805 return NULL;
1806 }
1807
1808 static ir_rvalue *
1809 try_max_zero(ir_rvalue *ir)
1810 {
1811 ir_expression *expr = ir->as_expression();
1812
1813 if (!expr || expr->operation != ir_binop_max)
1814 return NULL;
1815
1816 if (expr->operands[0]->is_zero())
1817 return expr->operands[1];
1818
1819 if (expr->operands[1]->is_zero())
1820 return expr->operands[0];
1821
1822 return NULL;
1823 }
1824
1825 ir_rvalue *
1826 ir_rvalue::as_rvalue_to_saturate()
1827 {
1828 ir_expression *expr = this->as_expression();
1829
1830 if (!expr)
1831 return NULL;
1832
1833 ir_rvalue *max_zero = try_max_zero(expr);
1834 if (max_zero) {
1835 return try_min_one(max_zero);
1836 } else {
1837 ir_rvalue *min_one = try_min_one(expr);
1838 if (min_one) {
1839 return try_max_zero(min_one);
1840 }
1841 }
1842
1843 return NULL;
1844 }
1845
1846
1847 unsigned
1848 vertices_per_prim(GLenum prim)
1849 {
1850 switch (prim) {
1851 case GL_POINTS:
1852 return 1;
1853 case GL_LINES:
1854 return 2;
1855 case GL_TRIANGLES:
1856 return 3;
1857 case GL_LINES_ADJACENCY:
1858 return 4;
1859 case GL_TRIANGLES_ADJACENCY:
1860 return 6;
1861 default:
1862 assert(!"Bad primitive");
1863 return 3;
1864 }
1865 }