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