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