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