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