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