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