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