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