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