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