glsl: Add support for new fma built-in in ARB_gpu_shader5.
[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 case ir_binop_vector_extract:
403 this->type = op0->type->get_scalar_type();
404 break;
405
406 default:
407 assert(!"not reached: missing automatic type setup for ir_expression");
408 this->type = glsl_type::float_type;
409 }
410 }
411
412 unsigned int
413 ir_expression::get_num_operands(ir_expression_operation op)
414 {
415 assert(op <= ir_last_opcode);
416
417 if (op <= ir_last_unop)
418 return 1;
419
420 if (op <= ir_last_binop)
421 return 2;
422
423 if (op <= ir_last_triop)
424 return 3;
425
426 if (op <= ir_last_quadop)
427 return 4;
428
429 assert(false);
430 return 0;
431 }
432
433 static const char *const operator_strs[] = {
434 "~",
435 "!",
436 "neg",
437 "abs",
438 "sign",
439 "rcp",
440 "rsq",
441 "sqrt",
442 "exp",
443 "log",
444 "exp2",
445 "log2",
446 "f2i",
447 "f2u",
448 "i2f",
449 "f2b",
450 "b2f",
451 "i2b",
452 "b2i",
453 "u2f",
454 "i2u",
455 "u2i",
456 "bitcast_i2f",
457 "bitcast_f2i",
458 "bitcast_u2f",
459 "bitcast_f2u",
460 "any",
461 "trunc",
462 "ceil",
463 "floor",
464 "fract",
465 "round_even",
466 "sin",
467 "cos",
468 "sin_reduced",
469 "cos_reduced",
470 "dFdx",
471 "dFdy",
472 "packSnorm2x16",
473 "packSnorm4x8",
474 "packUnorm2x16",
475 "packUnorm4x8",
476 "packHalf2x16",
477 "unpackSnorm2x16",
478 "unpackSnorm4x8",
479 "unpackUnorm2x16",
480 "unpackUnorm4x8",
481 "unpackHalf2x16",
482 "unpackHalf2x16_split_x",
483 "unpackHalf2x16_split_y",
484 "bitfield_reverse",
485 "bit_count",
486 "find_msb",
487 "find_lsb",
488 "noise",
489 "+",
490 "-",
491 "*",
492 "/",
493 "%",
494 "<",
495 ">",
496 "<=",
497 ">=",
498 "==",
499 "!=",
500 "all_equal",
501 "any_nequal",
502 "<<",
503 ">>",
504 "&",
505 "^",
506 "|",
507 "&&",
508 "^^",
509 "||",
510 "dot",
511 "min",
512 "max",
513 "pow",
514 "packHalf2x16_split",
515 "bfm",
516 "ubo_load",
517 "vector_extract",
518 "fma",
519 "lrp",
520 "bfi",
521 "bitfield_extract",
522 "vector_insert",
523 "bitfield_insert",
524 "vector",
525 };
526
527 const char *ir_expression::operator_string(ir_expression_operation op)
528 {
529 assert((unsigned int) op < Elements(operator_strs));
530 assert(Elements(operator_strs) == (ir_quadop_vector + 1));
531 return operator_strs[op];
532 }
533
534 const char *ir_expression::operator_string()
535 {
536 return operator_string(this->operation);
537 }
538
539 const char*
540 depth_layout_string(ir_depth_layout layout)
541 {
542 switch(layout) {
543 case ir_depth_layout_none: return "";
544 case ir_depth_layout_any: return "depth_any";
545 case ir_depth_layout_greater: return "depth_greater";
546 case ir_depth_layout_less: return "depth_less";
547 case ir_depth_layout_unchanged: return "depth_unchanged";
548
549 default:
550 assert(0);
551 return "";
552 }
553 }
554
555 ir_expression_operation
556 ir_expression::get_operator(const char *str)
557 {
558 const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
559 for (int op = 0; op < operator_count; op++) {
560 if (strcmp(str, operator_strs[op]) == 0)
561 return (ir_expression_operation) op;
562 }
563 return (ir_expression_operation) -1;
564 }
565
566 ir_constant::ir_constant()
567 {
568 this->ir_type = ir_type_constant;
569 }
570
571 ir_constant::ir_constant(const struct glsl_type *type,
572 const ir_constant_data *data)
573 {
574 assert((type->base_type >= GLSL_TYPE_UINT)
575 && (type->base_type <= GLSL_TYPE_BOOL));
576
577 this->ir_type = ir_type_constant;
578 this->type = type;
579 memcpy(& this->value, data, sizeof(this->value));
580 }
581
582 ir_constant::ir_constant(float f)
583 {
584 this->ir_type = ir_type_constant;
585 this->type = glsl_type::float_type;
586 this->value.f[0] = f;
587 for (int i = 1; i < 16; i++) {
588 this->value.f[i] = 0;
589 }
590 }
591
592 ir_constant::ir_constant(unsigned int u)
593 {
594 this->ir_type = ir_type_constant;
595 this->type = glsl_type::uint_type;
596 this->value.u[0] = u;
597 for (int i = 1; i < 16; i++) {
598 this->value.u[i] = 0;
599 }
600 }
601
602 ir_constant::ir_constant(int i)
603 {
604 this->ir_type = ir_type_constant;
605 this->type = glsl_type::int_type;
606 this->value.i[0] = i;
607 for (int i = 1; i < 16; i++) {
608 this->value.i[i] = 0;
609 }
610 }
611
612 ir_constant::ir_constant(bool b)
613 {
614 this->ir_type = ir_type_constant;
615 this->type = glsl_type::bool_type;
616 this->value.b[0] = b;
617 for (int i = 1; i < 16; i++) {
618 this->value.b[i] = false;
619 }
620 }
621
622 ir_constant::ir_constant(const ir_constant *c, unsigned i)
623 {
624 this->ir_type = ir_type_constant;
625 this->type = c->type->get_base_type();
626
627 switch (this->type->base_type) {
628 case GLSL_TYPE_UINT: this->value.u[0] = c->value.u[i]; break;
629 case GLSL_TYPE_INT: this->value.i[0] = c->value.i[i]; break;
630 case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
631 case GLSL_TYPE_BOOL: this->value.b[0] = c->value.b[i]; break;
632 default: assert(!"Should not get here."); break;
633 }
634 }
635
636 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
637 {
638 this->ir_type = ir_type_constant;
639 this->type = type;
640
641 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
642 || type->is_record() || type->is_array());
643
644 if (type->is_array()) {
645 this->array_elements = ralloc_array(this, ir_constant *, type->length);
646 unsigned i = 0;
647 foreach_list(node, value_list) {
648 ir_constant *value = (ir_constant *) node;
649 assert(value->as_constant() != NULL);
650
651 this->array_elements[i++] = value;
652 }
653 return;
654 }
655
656 /* If the constant is a record, the types of each of the entries in
657 * value_list must be a 1-for-1 match with the structure components. Each
658 * entry must also be a constant. Just move the nodes from the value_list
659 * to the list in the ir_constant.
660 */
661 /* FINISHME: Should there be some type checking and / or assertions here? */
662 /* FINISHME: Should the new constant take ownership of the nodes from
663 * FINISHME: value_list, or should it make copies?
664 */
665 if (type->is_record()) {
666 value_list->move_nodes_to(& this->components);
667 return;
668 }
669
670 for (unsigned i = 0; i < 16; i++) {
671 this->value.u[i] = 0;
672 }
673
674 ir_constant *value = (ir_constant *) (value_list->head);
675
676 /* Constructors with exactly one scalar argument are special for vectors
677 * and matrices. For vectors, the scalar value is replicated to fill all
678 * the components. For matrices, the scalar fills the components of the
679 * diagonal while the rest is filled with 0.
680 */
681 if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
682 if (type->is_matrix()) {
683 /* Matrix - fill diagonal (rest is already set to 0) */
684 assert(type->base_type == GLSL_TYPE_FLOAT);
685 for (unsigned i = 0; i < type->matrix_columns; i++)
686 this->value.f[i * type->vector_elements + i] = value->value.f[0];
687 } else {
688 /* Vector or scalar - fill all components */
689 switch (type->base_type) {
690 case GLSL_TYPE_UINT:
691 case GLSL_TYPE_INT:
692 for (unsigned i = 0; i < type->components(); i++)
693 this->value.u[i] = value->value.u[0];
694 break;
695 case GLSL_TYPE_FLOAT:
696 for (unsigned i = 0; i < type->components(); i++)
697 this->value.f[i] = value->value.f[0];
698 break;
699 case GLSL_TYPE_BOOL:
700 for (unsigned i = 0; i < type->components(); i++)
701 this->value.b[i] = value->value.b[0];
702 break;
703 default:
704 assert(!"Should not get here.");
705 break;
706 }
707 }
708 return;
709 }
710
711 if (type->is_matrix() && value->type->is_matrix()) {
712 assert(value->next->is_tail_sentinel());
713
714 /* From section 5.4.2 of the GLSL 1.20 spec:
715 * "If a matrix is constructed from a matrix, then each component
716 * (column i, row j) in the result that has a corresponding component
717 * (column i, row j) in the argument will be initialized from there."
718 */
719 unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
720 unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
721 for (unsigned i = 0; i < cols; i++) {
722 for (unsigned j = 0; j < rows; j++) {
723 const unsigned src = i * value->type->vector_elements + j;
724 const unsigned dst = i * type->vector_elements + j;
725 this->value.f[dst] = value->value.f[src];
726 }
727 }
728
729 /* "All other components will be initialized to the identity matrix." */
730 for (unsigned i = cols; i < type->matrix_columns; i++)
731 this->value.f[i * type->vector_elements + i] = 1.0;
732
733 return;
734 }
735
736 /* Use each component from each entry in the value_list to initialize one
737 * component of the constant being constructed.
738 */
739 for (unsigned i = 0; i < type->components(); /* empty */) {
740 assert(value->as_constant() != NULL);
741 assert(!value->is_tail_sentinel());
742
743 for (unsigned j = 0; j < value->type->components(); j++) {
744 switch (type->base_type) {
745 case GLSL_TYPE_UINT:
746 this->value.u[i] = value->get_uint_component(j);
747 break;
748 case GLSL_TYPE_INT:
749 this->value.i[i] = value->get_int_component(j);
750 break;
751 case GLSL_TYPE_FLOAT:
752 this->value.f[i] = value->get_float_component(j);
753 break;
754 case GLSL_TYPE_BOOL:
755 this->value.b[i] = value->get_bool_component(j);
756 break;
757 default:
758 /* FINISHME: What to do? Exceptions are not the answer.
759 */
760 break;
761 }
762
763 i++;
764 if (i >= type->components())
765 break;
766 }
767
768 value = (ir_constant *) value->next;
769 }
770 }
771
772 ir_constant *
773 ir_constant::zero(void *mem_ctx, const glsl_type *type)
774 {
775 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
776 || type->is_record() || type->is_array());
777
778 ir_constant *c = new(mem_ctx) ir_constant;
779 c->type = type;
780 memset(&c->value, 0, sizeof(c->value));
781
782 if (type->is_array()) {
783 c->array_elements = ralloc_array(c, ir_constant *, type->length);
784
785 for (unsigned i = 0; i < type->length; i++)
786 c->array_elements[i] = ir_constant::zero(c, type->element_type());
787 }
788
789 if (type->is_record()) {
790 for (unsigned i = 0; i < type->length; i++) {
791 ir_constant *comp = ir_constant::zero(mem_ctx, type->fields.structure[i].type);
792 c->components.push_tail(comp);
793 }
794 }
795
796 return c;
797 }
798
799 bool
800 ir_constant::get_bool_component(unsigned i) const
801 {
802 switch (this->type->base_type) {
803 case GLSL_TYPE_UINT: return this->value.u[i] != 0;
804 case GLSL_TYPE_INT: return this->value.i[i] != 0;
805 case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
806 case GLSL_TYPE_BOOL: return this->value.b[i];
807 default: assert(!"Should not get here."); break;
808 }
809
810 /* Must return something to make the compiler happy. This is clearly an
811 * error case.
812 */
813 return false;
814 }
815
816 float
817 ir_constant::get_float_component(unsigned i) const
818 {
819 switch (this->type->base_type) {
820 case GLSL_TYPE_UINT: return (float) this->value.u[i];
821 case GLSL_TYPE_INT: return (float) this->value.i[i];
822 case GLSL_TYPE_FLOAT: return this->value.f[i];
823 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0f : 0.0f;
824 default: assert(!"Should not get here."); break;
825 }
826
827 /* Must return something to make the compiler happy. This is clearly an
828 * error case.
829 */
830 return 0.0;
831 }
832
833 int
834 ir_constant::get_int_component(unsigned i) const
835 {
836 switch (this->type->base_type) {
837 case GLSL_TYPE_UINT: return this->value.u[i];
838 case GLSL_TYPE_INT: return this->value.i[i];
839 case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
840 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
841 default: assert(!"Should not get here."); break;
842 }
843
844 /* Must return something to make the compiler happy. This is clearly an
845 * error case.
846 */
847 return 0;
848 }
849
850 unsigned
851 ir_constant::get_uint_component(unsigned i) const
852 {
853 switch (this->type->base_type) {
854 case GLSL_TYPE_UINT: return this->value.u[i];
855 case GLSL_TYPE_INT: return this->value.i[i];
856 case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
857 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
858 default: assert(!"Should not get here."); break;
859 }
860
861 /* Must return something to make the compiler happy. This is clearly an
862 * error case.
863 */
864 return 0;
865 }
866
867 ir_constant *
868 ir_constant::get_array_element(unsigned i) const
869 {
870 assert(this->type->is_array());
871
872 /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
873 *
874 * "Behavior is undefined if a shader subscripts an array with an index
875 * less than 0 or greater than or equal to the size the array was
876 * declared with."
877 *
878 * Most out-of-bounds accesses are removed before things could get this far.
879 * There are cases where non-constant array index values can get constant
880 * folded.
881 */
882 if (int(i) < 0)
883 i = 0;
884 else if (i >= this->type->length)
885 i = this->type->length - 1;
886
887 return array_elements[i];
888 }
889
890 ir_constant *
891 ir_constant::get_record_field(const char *name)
892 {
893 int idx = this->type->field_index(name);
894
895 if (idx < 0)
896 return NULL;
897
898 if (this->components.is_empty())
899 return NULL;
900
901 exec_node *node = this->components.head;
902 for (int i = 0; i < idx; i++) {
903 node = node->next;
904
905 /* If the end of the list is encountered before the element matching the
906 * requested field is found, return NULL.
907 */
908 if (node->is_tail_sentinel())
909 return NULL;
910 }
911
912 return (ir_constant *) node;
913 }
914
915 void
916 ir_constant::copy_offset(ir_constant *src, int offset)
917 {
918 switch (this->type->base_type) {
919 case GLSL_TYPE_UINT:
920 case GLSL_TYPE_INT:
921 case GLSL_TYPE_FLOAT:
922 case GLSL_TYPE_BOOL: {
923 unsigned int size = src->type->components();
924 assert (size <= this->type->components() - offset);
925 for (unsigned int i=0; i<size; i++) {
926 switch (this->type->base_type) {
927 case GLSL_TYPE_UINT:
928 value.u[i+offset] = src->get_uint_component(i);
929 break;
930 case GLSL_TYPE_INT:
931 value.i[i+offset] = src->get_int_component(i);
932 break;
933 case GLSL_TYPE_FLOAT:
934 value.f[i+offset] = src->get_float_component(i);
935 break;
936 case GLSL_TYPE_BOOL:
937 value.b[i+offset] = src->get_bool_component(i);
938 break;
939 default: // Shut up the compiler
940 break;
941 }
942 }
943 break;
944 }
945
946 case GLSL_TYPE_STRUCT: {
947 assert (src->type == this->type);
948 this->components.make_empty();
949 foreach_list(node, &src->components) {
950 ir_constant *const orig = (ir_constant *) node;
951
952 this->components.push_tail(orig->clone(this, NULL));
953 }
954 break;
955 }
956
957 case GLSL_TYPE_ARRAY: {
958 assert (src->type == this->type);
959 for (unsigned i = 0; i < this->type->length; i++) {
960 this->array_elements[i] = src->array_elements[i]->clone(this, NULL);
961 }
962 break;
963 }
964
965 default:
966 assert(!"Should not get here.");
967 break;
968 }
969 }
970
971 void
972 ir_constant::copy_masked_offset(ir_constant *src, int offset, unsigned int mask)
973 {
974 assert (!type->is_array() && !type->is_record());
975
976 if (!type->is_vector() && !type->is_matrix()) {
977 offset = 0;
978 mask = 1;
979 }
980
981 int id = 0;
982 for (int i=0; i<4; i++) {
983 if (mask & (1 << i)) {
984 switch (this->type->base_type) {
985 case GLSL_TYPE_UINT:
986 value.u[i+offset] = src->get_uint_component(id++);
987 break;
988 case GLSL_TYPE_INT:
989 value.i[i+offset] = src->get_int_component(id++);
990 break;
991 case GLSL_TYPE_FLOAT:
992 value.f[i+offset] = src->get_float_component(id++);
993 break;
994 case GLSL_TYPE_BOOL:
995 value.b[i+offset] = src->get_bool_component(id++);
996 break;
997 default:
998 assert(!"Should not get here.");
999 return;
1000 }
1001 }
1002 }
1003 }
1004
1005 bool
1006 ir_constant::has_value(const ir_constant *c) const
1007 {
1008 if (this->type != c->type)
1009 return false;
1010
1011 if (this->type->is_array()) {
1012 for (unsigned i = 0; i < this->type->length; i++) {
1013 if (!this->array_elements[i]->has_value(c->array_elements[i]))
1014 return false;
1015 }
1016 return true;
1017 }
1018
1019 if (this->type->base_type == GLSL_TYPE_STRUCT) {
1020 const exec_node *a_node = this->components.head;
1021 const exec_node *b_node = c->components.head;
1022
1023 while (!a_node->is_tail_sentinel()) {
1024 assert(!b_node->is_tail_sentinel());
1025
1026 const ir_constant *const a_field = (ir_constant *) a_node;
1027 const ir_constant *const b_field = (ir_constant *) b_node;
1028
1029 if (!a_field->has_value(b_field))
1030 return false;
1031
1032 a_node = a_node->next;
1033 b_node = b_node->next;
1034 }
1035
1036 return true;
1037 }
1038
1039 for (unsigned i = 0; i < this->type->components(); i++) {
1040 switch (this->type->base_type) {
1041 case GLSL_TYPE_UINT:
1042 if (this->value.u[i] != c->value.u[i])
1043 return false;
1044 break;
1045 case GLSL_TYPE_INT:
1046 if (this->value.i[i] != c->value.i[i])
1047 return false;
1048 break;
1049 case GLSL_TYPE_FLOAT:
1050 if (this->value.f[i] != c->value.f[i])
1051 return false;
1052 break;
1053 case GLSL_TYPE_BOOL:
1054 if (this->value.b[i] != c->value.b[i])
1055 return false;
1056 break;
1057 default:
1058 assert(!"Should not get here.");
1059 return false;
1060 }
1061 }
1062
1063 return true;
1064 }
1065
1066 bool
1067 ir_constant::is_zero() const
1068 {
1069 if (!this->type->is_scalar() && !this->type->is_vector())
1070 return false;
1071
1072 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1073 switch (this->type->base_type) {
1074 case GLSL_TYPE_FLOAT:
1075 if (this->value.f[c] != 0.0)
1076 return false;
1077 break;
1078 case GLSL_TYPE_INT:
1079 if (this->value.i[c] != 0)
1080 return false;
1081 break;
1082 case GLSL_TYPE_UINT:
1083 if (this->value.u[c] != 0)
1084 return false;
1085 break;
1086 case GLSL_TYPE_BOOL:
1087 if (this->value.b[c] != false)
1088 return false;
1089 break;
1090 default:
1091 /* The only other base types are structures, arrays, and samplers.
1092 * Samplers cannot be constants, and the others should have been
1093 * filtered out above.
1094 */
1095 assert(!"Should not get here.");
1096 return false;
1097 }
1098 }
1099
1100 return true;
1101 }
1102
1103 bool
1104 ir_constant::is_one() const
1105 {
1106 if (!this->type->is_scalar() && !this->type->is_vector())
1107 return false;
1108
1109 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1110 switch (this->type->base_type) {
1111 case GLSL_TYPE_FLOAT:
1112 if (this->value.f[c] != 1.0)
1113 return false;
1114 break;
1115 case GLSL_TYPE_INT:
1116 if (this->value.i[c] != 1)
1117 return false;
1118 break;
1119 case GLSL_TYPE_UINT:
1120 if (this->value.u[c] != 1)
1121 return false;
1122 break;
1123 case GLSL_TYPE_BOOL:
1124 if (this->value.b[c] != true)
1125 return false;
1126 break;
1127 default:
1128 /* The only other base types are structures, arrays, and samplers.
1129 * Samplers cannot be constants, and the others should have been
1130 * filtered out above.
1131 */
1132 assert(!"Should not get here.");
1133 return false;
1134 }
1135 }
1136
1137 return true;
1138 }
1139
1140 bool
1141 ir_constant::is_negative_one() const
1142 {
1143 if (!this->type->is_scalar() && !this->type->is_vector())
1144 return false;
1145
1146 if (this->type->is_boolean())
1147 return false;
1148
1149 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1150 switch (this->type->base_type) {
1151 case GLSL_TYPE_FLOAT:
1152 if (this->value.f[c] != -1.0)
1153 return false;
1154 break;
1155 case GLSL_TYPE_INT:
1156 if (this->value.i[c] != -1)
1157 return false;
1158 break;
1159 case GLSL_TYPE_UINT:
1160 if (int(this->value.u[c]) != -1)
1161 return false;
1162 break;
1163 default:
1164 /* The only other base types are structures, arrays, samplers, and
1165 * booleans. Samplers cannot be constants, and the others should
1166 * have been filtered out above.
1167 */
1168 assert(!"Should not get here.");
1169 return false;
1170 }
1171 }
1172
1173 return true;
1174 }
1175
1176 bool
1177 ir_constant::is_basis() const
1178 {
1179 if (!this->type->is_scalar() && !this->type->is_vector())
1180 return false;
1181
1182 if (this->type->is_boolean())
1183 return false;
1184
1185 unsigned ones = 0;
1186 for (unsigned c = 0; c < this->type->vector_elements; c++) {
1187 switch (this->type->base_type) {
1188 case GLSL_TYPE_FLOAT:
1189 if (this->value.f[c] == 1.0)
1190 ones++;
1191 else if (this->value.f[c] != 0.0)
1192 return false;
1193 break;
1194 case GLSL_TYPE_INT:
1195 if (this->value.i[c] == 1)
1196 ones++;
1197 else if (this->value.i[c] != 0)
1198 return false;
1199 break;
1200 case GLSL_TYPE_UINT:
1201 if (int(this->value.u[c]) == 1)
1202 ones++;
1203 else if (int(this->value.u[c]) != 0)
1204 return false;
1205 break;
1206 default:
1207 /* The only other base types are structures, arrays, samplers, and
1208 * booleans. Samplers cannot be constants, and the others should
1209 * have been filtered out above.
1210 */
1211 assert(!"Should not get here.");
1212 return false;
1213 }
1214 }
1215
1216 return ones == 1;
1217 }
1218
1219 ir_loop::ir_loop()
1220 {
1221 this->ir_type = ir_type_loop;
1222 this->cmp = ir_unop_neg;
1223 this->from = NULL;
1224 this->to = NULL;
1225 this->increment = NULL;
1226 this->counter = NULL;
1227 }
1228
1229
1230 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
1231 {
1232 assert(var != NULL);
1233
1234 this->ir_type = ir_type_dereference_variable;
1235 this->var = var;
1236 this->type = var->type;
1237 }
1238
1239
1240 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
1241 ir_rvalue *array_index)
1242 {
1243 this->ir_type = ir_type_dereference_array;
1244 this->array_index = array_index;
1245 this->set_array(value);
1246 }
1247
1248
1249 ir_dereference_array::ir_dereference_array(ir_variable *var,
1250 ir_rvalue *array_index)
1251 {
1252 void *ctx = ralloc_parent(var);
1253
1254 this->ir_type = ir_type_dereference_array;
1255 this->array_index = array_index;
1256 this->set_array(new(ctx) ir_dereference_variable(var));
1257 }
1258
1259
1260 void
1261 ir_dereference_array::set_array(ir_rvalue *value)
1262 {
1263 assert(value != NULL);
1264
1265 this->array = value;
1266
1267 const glsl_type *const vt = this->array->type;
1268
1269 if (vt->is_array()) {
1270 type = vt->element_type();
1271 } else if (vt->is_matrix()) {
1272 type = vt->column_type();
1273 } else if (vt->is_vector()) {
1274 type = vt->get_base_type();
1275 }
1276 }
1277
1278
1279 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
1280 const char *field)
1281 {
1282 assert(value != NULL);
1283
1284 this->ir_type = ir_type_dereference_record;
1285 this->record = value;
1286 this->field = ralloc_strdup(this, field);
1287 this->type = this->record->type->field_type(field);
1288 }
1289
1290
1291 ir_dereference_record::ir_dereference_record(ir_variable *var,
1292 const char *field)
1293 {
1294 void *ctx = ralloc_parent(var);
1295
1296 this->ir_type = ir_type_dereference_record;
1297 this->record = new(ctx) ir_dereference_variable(var);
1298 this->field = ralloc_strdup(this, field);
1299 this->type = this->record->type->field_type(field);
1300 }
1301
1302 bool
1303 ir_dereference::is_lvalue() const
1304 {
1305 ir_variable *var = this->variable_referenced();
1306
1307 /* Every l-value derference chain eventually ends in a variable.
1308 */
1309 if ((var == NULL) || var->read_only)
1310 return false;
1311
1312 /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
1313 *
1314 * "Samplers cannot be treated as l-values; hence cannot be used
1315 * as out or inout function parameters, nor can they be
1316 * assigned into."
1317 */
1318 if (this->type->contains_sampler())
1319 return false;
1320
1321 return true;
1322 }
1323
1324
1325 static const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf", "txf_ms", "txs", "lod" };
1326
1327 const char *ir_texture::opcode_string()
1328 {
1329 assert((unsigned int) op <=
1330 sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
1331 return tex_opcode_strs[op];
1332 }
1333
1334 ir_texture_opcode
1335 ir_texture::get_opcode(const char *str)
1336 {
1337 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
1338 for (int op = 0; op < count; op++) {
1339 if (strcmp(str, tex_opcode_strs[op]) == 0)
1340 return (ir_texture_opcode) op;
1341 }
1342 return (ir_texture_opcode) -1;
1343 }
1344
1345
1346 void
1347 ir_texture::set_sampler(ir_dereference *sampler, const glsl_type *type)
1348 {
1349 assert(sampler != NULL);
1350 assert(type != NULL);
1351 this->sampler = sampler;
1352 this->type = type;
1353
1354 if (this->op == ir_txs) {
1355 assert(type->base_type == GLSL_TYPE_INT);
1356 } else if (this->op == ir_lod) {
1357 assert(type->vector_elements == 2);
1358 assert(type->base_type == GLSL_TYPE_FLOAT);
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 == VARYING_SLOT_COL0 || location == VARYING_SLOT_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 }
1782
1783
1784 unsigned
1785 vertices_per_prim(GLenum prim)
1786 {
1787 switch (prim) {
1788 case GL_POINTS:
1789 return 1;
1790 case GL_LINES:
1791 return 2;
1792 case GL_TRIANGLES:
1793 return 3;
1794 case GL_LINES_ADJACENCY:
1795 return 4;
1796 case GL_TRIANGLES_ADJACENCY:
1797 return 6;
1798 default:
1799 assert(!"Bad primitive");
1800 return 3;
1801 }
1802 }