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