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