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