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