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