Merge remote-tracking branch 'mesa-public/master' into vulkan
[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.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->name = ralloc_strdup(this, name);
1846 }
1847
1848
1849 bool
1850 ir_function::has_user_signature()
1851 {
1852 foreach_in_list(ir_function_signature, sig, &this->signatures) {
1853 if (!sig->is_builtin())
1854 return true;
1855 }
1856 return false;
1857 }
1858
1859
1860 ir_rvalue *
1861 ir_rvalue::error_value(void *mem_ctx)
1862 {
1863 ir_rvalue *v = new(mem_ctx) ir_rvalue(ir_type_unset);
1864
1865 v->type = glsl_type::error_type;
1866 return v;
1867 }
1868
1869
1870 void
1871 visit_exec_list(exec_list *list, ir_visitor *visitor)
1872 {
1873 foreach_in_list_safe(ir_instruction, node, list) {
1874 node->accept(visitor);
1875 }
1876 }
1877
1878
1879 static void
1880 steal_memory(ir_instruction *ir, void *new_ctx)
1881 {
1882 ir_variable *var = ir->as_variable();
1883 ir_function *fn = ir->as_function();
1884 ir_constant *constant = ir->as_constant();
1885 if (var != NULL && var->constant_value != NULL)
1886 steal_memory(var->constant_value, ir);
1887
1888 if (var != NULL && var->constant_initializer != NULL)
1889 steal_memory(var->constant_initializer, ir);
1890
1891 if (fn != NULL && fn->subroutine_types)
1892 ralloc_steal(new_ctx, fn->subroutine_types);
1893
1894 /* The components of aggregate constants are not visited by the normal
1895 * visitor, so steal their values by hand.
1896 */
1897 if (constant != NULL) {
1898 if (constant->type->is_record()) {
1899 foreach_in_list(ir_constant, field, &constant->components) {
1900 steal_memory(field, ir);
1901 }
1902 } else if (constant->type->is_array()) {
1903 for (unsigned int i = 0; i < constant->type->length; i++) {
1904 steal_memory(constant->array_elements[i], ir);
1905 }
1906 }
1907 }
1908
1909 ralloc_steal(new_ctx, ir);
1910 }
1911
1912
1913 void
1914 reparent_ir(exec_list *list, void *mem_ctx)
1915 {
1916 foreach_in_list(ir_instruction, node, list) {
1917 visit_tree(node, steal_memory, mem_ctx);
1918 }
1919 }
1920
1921
1922 static ir_rvalue *
1923 try_min_one(ir_rvalue *ir)
1924 {
1925 ir_expression *expr = ir->as_expression();
1926
1927 if (!expr || expr->operation != ir_binop_min)
1928 return NULL;
1929
1930 if (expr->operands[0]->is_one())
1931 return expr->operands[1];
1932
1933 if (expr->operands[1]->is_one())
1934 return expr->operands[0];
1935
1936 return NULL;
1937 }
1938
1939 static ir_rvalue *
1940 try_max_zero(ir_rvalue *ir)
1941 {
1942 ir_expression *expr = ir->as_expression();
1943
1944 if (!expr || expr->operation != ir_binop_max)
1945 return NULL;
1946
1947 if (expr->operands[0]->is_zero())
1948 return expr->operands[1];
1949
1950 if (expr->operands[1]->is_zero())
1951 return expr->operands[0];
1952
1953 return NULL;
1954 }
1955
1956 ir_rvalue *
1957 ir_rvalue::as_rvalue_to_saturate()
1958 {
1959 ir_expression *expr = this->as_expression();
1960
1961 if (!expr)
1962 return NULL;
1963
1964 ir_rvalue *max_zero = try_max_zero(expr);
1965 if (max_zero) {
1966 return try_min_one(max_zero);
1967 } else {
1968 ir_rvalue *min_one = try_min_one(expr);
1969 if (min_one) {
1970 return try_max_zero(min_one);
1971 }
1972 }
1973
1974 return NULL;
1975 }
1976
1977
1978 unsigned
1979 vertices_per_prim(GLenum prim)
1980 {
1981 switch (prim) {
1982 case GL_POINTS:
1983 return 1;
1984 case GL_LINES:
1985 return 2;
1986 case GL_TRIANGLES:
1987 return 3;
1988 case GL_LINES_ADJACENCY:
1989 return 4;
1990 case GL_TRIANGLES_ADJACENCY:
1991 return 6;
1992 default:
1993 assert(!"Bad primitive");
1994 return 3;
1995 }
1996 }
1997
1998 /**
1999 * Generate a string describing the mode of a variable
2000 */
2001 const char *
2002 mode_string(const ir_variable *var)
2003 {
2004 switch (var->data.mode) {
2005 case ir_var_auto:
2006 return (var->data.read_only) ? "global constant" : "global variable";
2007
2008 case ir_var_uniform:
2009 return "uniform";
2010
2011 case ir_var_shader_storage:
2012 return "buffer";
2013
2014 case ir_var_shader_in:
2015 return "shader input";
2016
2017 case ir_var_shader_out:
2018 return "shader output";
2019
2020 case ir_var_function_in:
2021 case ir_var_const_in:
2022 return "function input";
2023
2024 case ir_var_function_out:
2025 return "function output";
2026
2027 case ir_var_function_inout:
2028 return "function inout";
2029
2030 case ir_var_system_value:
2031 return "shader input";
2032
2033 case ir_var_temporary:
2034 return "compiler temporary";
2035
2036 case ir_var_mode_count:
2037 break;
2038 }
2039
2040 assert(!"Should not get here.");
2041 return "invalid variable";
2042 }