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