glsl: Make is_16bit_constant from i965 an ir_constant method.
[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 "ir_visitor.h"
27 #include "glsl_types.h"
28
29 ir_rvalue::ir_rvalue()
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 {
157 this->ir_type = ir_type_assignment;
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 {
177 this->ir_type = ir_type_assignment;
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 {
202 this->ir_type = ir_type_expression;
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 {
219 this->ir_type = ir_type_expression;
220
221 this->operation = ir_expression_operation(op);
222 this->operands[0] = op0;
223 this->operands[1] = NULL;
224 this->operands[2] = NULL;
225 this->operands[3] = NULL;
226
227 assert(op <= ir_last_unop);
228
229 switch (this->operation) {
230 case ir_unop_bit_not:
231 case ir_unop_logic_not:
232 case ir_unop_neg:
233 case ir_unop_abs:
234 case ir_unop_sign:
235 case ir_unop_rcp:
236 case ir_unop_rsq:
237 case ir_unop_sqrt:
238 case ir_unop_exp:
239 case ir_unop_log:
240 case ir_unop_exp2:
241 case ir_unop_log2:
242 case ir_unop_trunc:
243 case ir_unop_ceil:
244 case ir_unop_floor:
245 case ir_unop_fract:
246 case ir_unop_round_even:
247 case ir_unop_sin:
248 case ir_unop_cos:
249 case ir_unop_sin_reduced:
250 case ir_unop_cos_reduced:
251 case ir_unop_dFdx:
252 case ir_unop_dFdy:
253 case ir_unop_bitfield_reverse:
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 {
328 this->ir_type = ir_type_expression;
329
330 this->operation = ir_expression_operation(op);
331 this->operands[0] = op0;
332 this->operands[1] = op1;
333 this->operands[2] = NULL;
334 this->operands[3] = NULL;
335
336 assert(op > ir_last_unop);
337
338 switch (this->operation) {
339 case ir_binop_all_equal:
340 case ir_binop_any_nequal:
341 this->type = glsl_type::bool_type;
342 break;
343
344 case ir_binop_add:
345 case ir_binop_sub:
346 case ir_binop_min:
347 case ir_binop_max:
348 case ir_binop_pow:
349 case ir_binop_mul:
350 case ir_binop_div:
351 case ir_binop_mod:
352 if (op0->type->is_scalar()) {
353 this->type = op1->type;
354 } else if (op1->type->is_scalar()) {
355 this->type = op0->type;
356 } else {
357 /* FINISHME: matrix types */
358 assert(!op0->type->is_matrix() && !op1->type->is_matrix());
359 assert(op0->type == op1->type);
360 this->type = op0->type;
361 }
362 break;
363
364 case ir_binop_logic_and:
365 case ir_binop_logic_xor:
366 case ir_binop_logic_or:
367 case ir_binop_bit_and:
368 case ir_binop_bit_xor:
369 case ir_binop_bit_or:
370 assert(!op0->type->is_matrix());
371 assert(!op1->type->is_matrix());
372 if (op0->type->is_scalar()) {
373 this->type = op1->type;
374 } else if (op1->type->is_scalar()) {
375 this->type = op0->type;
376 } else {
377 assert(op0->type->vector_elements == op1->type->vector_elements);
378 this->type = op0->type;
379 }
380 break;
381
382 case ir_binop_equal:
383 case ir_binop_nequal:
384 case ir_binop_lequal:
385 case ir_binop_gequal:
386 case ir_binop_less:
387 case ir_binop_greater:
388 assert(op0->type == op1->type);
389 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
390 op0->type->vector_elements, 1);
391 break;
392
393 case ir_binop_dot:
394 this->type = glsl_type::float_type;
395 break;
396
397 case ir_binop_pack_half_2x16_split:
398 this->type = glsl_type::uint_type;
399 break;
400
401 case ir_binop_imul_high:
402 case ir_binop_carry:
403 case ir_binop_borrow:
404 case ir_binop_lshift:
405 case ir_binop_rshift:
406 case ir_binop_bfm:
407 case ir_binop_ldexp:
408 this->type = op0->type;
409 break;
410
411 case ir_binop_vector_extract:
412 this->type = op0->type->get_scalar_type();
413 break;
414
415 default:
416 assert(!"not reached: missing automatic type setup for ir_expression");
417 this->type = glsl_type::float_type;
418 }
419 }
420
421 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1,
422 ir_rvalue *op2)
423 {
424 this->ir_type = 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 "+",
531 "-",
532 "*",
533 "imul_high",
534 "/",
535 "carry",
536 "borrow",
537 "%",
538 "<",
539 ">",
540 "<=",
541 ">=",
542 "==",
543 "!=",
544 "all_equal",
545 "any_nequal",
546 "<<",
547 ">>",
548 "&",
549 "^",
550 "|",
551 "&&",
552 "^^",
553 "||",
554 "dot",
555 "min",
556 "max",
557 "pow",
558 "packHalf2x16_split",
559 "bfm",
560 "ubo_load",
561 "ldexp",
562 "vector_extract",
563 "fma",
564 "lrp",
565 "csel",
566 "bfi",
567 "bitfield_extract",
568 "vector_insert",
569 "bitfield_insert",
570 "vector",
571 };
572
573 const char *ir_expression::operator_string(ir_expression_operation op)
574 {
575 assert((unsigned int) op < Elements(operator_strs));
576 assert(Elements(operator_strs) == (ir_quadop_vector + 1));
577 return operator_strs[op];
578 }
579
580 const char *ir_expression::operator_string()
581 {
582 return operator_string(this->operation);
583 }
584
585 const char*
586 depth_layout_string(ir_depth_layout layout)
587 {
588 switch(layout) {
589 case ir_depth_layout_none: return "";
590 case ir_depth_layout_any: return "depth_any";
591 case ir_depth_layout_greater: return "depth_greater";
592 case ir_depth_layout_less: return "depth_less";
593 case ir_depth_layout_unchanged: return "depth_unchanged";
594
595 default:
596 assert(0);
597 return "";
598 }
599 }
600
601 ir_expression_operation
602 ir_expression::get_operator(const char *str)
603 {
604 const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
605 for (int op = 0; op < operator_count; op++) {
606 if (strcmp(str, operator_strs[op]) == 0)
607 return (ir_expression_operation) op;
608 }
609 return (ir_expression_operation) -1;
610 }
611
612 ir_constant::ir_constant()
613 {
614 this->ir_type = ir_type_constant;
615 }
616
617 ir_constant::ir_constant(const struct glsl_type *type,
618 const ir_constant_data *data)
619 {
620 assert((type->base_type >= GLSL_TYPE_UINT)
621 && (type->base_type <= GLSL_TYPE_BOOL));
622
623 this->ir_type = ir_type_constant;
624 this->type = type;
625 memcpy(& this->value, data, sizeof(this->value));
626 }
627
628 ir_constant::ir_constant(float f, unsigned vector_elements)
629 {
630 assert(vector_elements <= 4);
631 this->ir_type = ir_type_constant;
632 this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT, vector_elements, 1);
633 for (unsigned i = 0; i < vector_elements; i++) {
634 this->value.f[i] = f;
635 }
636 for (unsigned i = vector_elements; i < 16; i++) {
637 this->value.f[i] = 0;
638 }
639 }
640
641 ir_constant::ir_constant(unsigned int u, unsigned vector_elements)
642 {
643 assert(vector_elements <= 4);
644 this->ir_type = ir_type_constant;
645 this->type = glsl_type::get_instance(GLSL_TYPE_UINT, vector_elements, 1);
646 for (unsigned i = 0; i < vector_elements; i++) {
647 this->value.u[i] = u;
648 }
649 for (unsigned i = vector_elements; i < 16; i++) {
650 this->value.u[i] = 0;
651 }
652 }
653
654 ir_constant::ir_constant(int integer, unsigned vector_elements)
655 {
656 assert(vector_elements <= 4);
657 this->ir_type = ir_type_constant;
658 this->type = glsl_type::get_instance(GLSL_TYPE_INT, vector_elements, 1);
659 for (unsigned i = 0; i < vector_elements; i++) {
660 this->value.i[i] = integer;
661 }
662 for (unsigned i = vector_elements; i < 16; i++) {
663 this->value.i[i] = 0;
664 }
665 }
666
667 ir_constant::ir_constant(bool b, unsigned vector_elements)
668 {
669 assert(vector_elements <= 4);
670 this->ir_type = ir_type_constant;
671 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL, vector_elements, 1);
672 for (unsigned i = 0; i < vector_elements; i++) {
673 this->value.b[i] = b;
674 }
675 for (unsigned i = vector_elements; i < 16; i++) {
676 this->value.b[i] = false;
677 }
678 }
679
680 ir_constant::ir_constant(const ir_constant *c, unsigned i)
681 {
682 this->ir_type = ir_type_constant;
683 this->type = c->type->get_base_type();
684
685 switch (this->type->base_type) {
686 case GLSL_TYPE_UINT: this->value.u[0] = c->value.u[i]; break;
687 case GLSL_TYPE_INT: this->value.i[0] = c->value.i[i]; break;
688 case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
689 case GLSL_TYPE_BOOL: this->value.b[0] = c->value.b[i]; break;
690 default: assert(!"Should not get here."); break;
691 }
692 }
693
694 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
695 {
696 this->ir_type = ir_type_constant;
697 this->type = type;
698
699 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
700 || type->is_record() || type->is_array());
701
702 if (type->is_array()) {
703 this->array_elements = ralloc_array(this, ir_constant *, type->length);
704 unsigned i = 0;
705 foreach_list(node, value_list) {
706 ir_constant *value = (ir_constant *) node;
707 assert(value->as_constant() != NULL);
708
709 this->array_elements[i++] = value;
710 }
711 return;
712 }
713
714 /* If the constant is a record, the types of each of the entries in
715 * value_list must be a 1-for-1 match with the structure components. Each
716 * entry must also be a constant. Just move the nodes from the value_list
717 * to the list in the ir_constant.
718 */
719 /* FINISHME: Should there be some type checking and / or assertions here? */
720 /* FINISHME: Should the new constant take ownership of the nodes from
721 * FINISHME: value_list, or should it make copies?
722 */
723 if (type->is_record()) {
724 value_list->move_nodes_to(& this->components);
725 return;
726 }
727
728 for (unsigned i = 0; i < 16; i++) {
729 this->value.u[i] = 0;
730 }
731
732 ir_constant *value = (ir_constant *) (value_list->head);
733
734 /* Constructors with exactly one scalar argument are special for vectors
735 * and matrices. For vectors, the scalar value is replicated to fill all
736 * the components. For matrices, the scalar fills the components of the
737 * diagonal while the rest is filled with 0.
738 */
739 if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
740 if (type->is_matrix()) {
741 /* Matrix - fill diagonal (rest is already set to 0) */
742 assert(type->base_type == GLSL_TYPE_FLOAT);
743 for (unsigned i = 0; i < type->matrix_columns; i++)
744 this->value.f[i * type->vector_elements + i] = value->value.f[0];
745 } else {
746 /* Vector or scalar - fill all components */
747 switch (type->base_type) {
748 case GLSL_TYPE_UINT:
749 case GLSL_TYPE_INT:
750 for (unsigned i = 0; i < type->components(); i++)
751 this->value.u[i] = value->value.u[0];
752 break;
753 case GLSL_TYPE_FLOAT:
754 for (unsigned i = 0; i < type->components(); i++)
755 this->value.f[i] = value->value.f[0];
756 break;
757 case GLSL_TYPE_BOOL:
758 for (unsigned i = 0; i < type->components(); i++)
759 this->value.b[i] = value->value.b[0];
760 break;
761 default:
762 assert(!"Should not get here.");
763 break;
764 }
765 }
766 return;
767 }
768
769 if (type->is_matrix() && value->type->is_matrix()) {
770 assert(value->next->is_tail_sentinel());
771
772 /* From section 5.4.2 of the GLSL 1.20 spec:
773 * "If a matrix is constructed from a matrix, then each component
774 * (column i, row j) in the result that has a corresponding component
775 * (column i, row j) in the argument will be initialized from there."
776 */
777 unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
778 unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
779 for (unsigned i = 0; i < cols; i++) {
780 for (unsigned j = 0; j < rows; j++) {
781 const unsigned src = i * value->type->vector_elements + j;
782 const unsigned dst = i * type->vector_elements + j;
783 this->value.f[dst] = value->value.f[src];
784 }
785 }
786
787 /* "All other components will be initialized to the identity matrix." */
788 for (unsigned i = cols; i < type->matrix_columns; i++)
789 this->value.f[i * type->vector_elements + i] = 1.0;
790
791 return;
792 }
793
794 /* Use each component from each entry in the value_list to initialize one
795 * component of the constant being constructed.
796 */
797 for (unsigned i = 0; i < type->components(); /* empty */) {
798 assert(value->as_constant() != NULL);
799 assert(!value->is_tail_sentinel());
800
801 for (unsigned j = 0; j < value->type->components(); j++) {
802 switch (type->base_type) {
803 case GLSL_TYPE_UINT:
804 this->value.u[i] = value->get_uint_component(j);
805 break;
806 case GLSL_TYPE_INT:
807 this->value.i[i] = value->get_int_component(j);
808 break;
809 case GLSL_TYPE_FLOAT:
810 this->value.f[i] = value->get_float_component(j);
811 break;
812 case GLSL_TYPE_BOOL:
813 this->value.b[i] = value->get_bool_component(j);
814 break;
815 default:
816 /* FINISHME: What to do? Exceptions are not the answer.
817 */
818 break;
819 }
820
821 i++;
822 if (i >= type->components())
823 break;
824 }
825
826 value = (ir_constant *) value->next;
827 }
828 }
829
830 ir_constant *
831 ir_constant::zero(void *mem_ctx, const glsl_type *type)
832 {
833 assert(type->is_scalar() || type->is_vector() || type->is_matrix()
834 || type->is_record() || type->is_array());
835
836 ir_constant *c = new(mem_ctx) ir_constant;
837 c->type = type;
838 memset(&c->value, 0, sizeof(c->value));
839
840 if (type->is_array()) {
841 c->array_elements = ralloc_array(c, ir_constant *, type->length);
842
843 for (unsigned i = 0; i < type->length; i++)
844 c->array_elements[i] = ir_constant::zero(c, type->element_type());
845 }
846
847 if (type->is_record()) {
848 for (unsigned i = 0; i < type->length; i++) {
849 ir_constant *comp = ir_constant::zero(mem_ctx, type->fields.structure[i].type);
850 c->components.push_tail(comp);
851 }
852 }
853
854 return c;
855 }
856
857 bool
858 ir_constant::get_bool_component(unsigned i) const
859 {
860 switch (this->type->base_type) {
861 case GLSL_TYPE_UINT: return this->value.u[i] != 0;
862 case GLSL_TYPE_INT: return this->value.i[i] != 0;
863 case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
864 case GLSL_TYPE_BOOL: return this->value.b[i];
865 default: assert(!"Should not get here."); break;
866 }
867
868 /* Must return something to make the compiler happy. This is clearly an
869 * error case.
870 */
871 return false;
872 }
873
874 float
875 ir_constant::get_float_component(unsigned i) const
876 {
877 switch (this->type->base_type) {
878 case GLSL_TYPE_UINT: return (float) this->value.u[i];
879 case GLSL_TYPE_INT: return (float) this->value.i[i];
880 case GLSL_TYPE_FLOAT: return this->value.f[i];
881 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0f : 0.0f;
882 default: assert(!"Should not get here."); break;
883 }
884
885 /* Must return something to make the compiler happy. This is clearly an
886 * error case.
887 */
888 return 0.0;
889 }
890
891 int
892 ir_constant::get_int_component(unsigned i) const
893 {
894 switch (this->type->base_type) {
895 case GLSL_TYPE_UINT: return this->value.u[i];
896 case GLSL_TYPE_INT: return this->value.i[i];
897 case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
898 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
899 default: assert(!"Should not get here."); break;
900 }
901
902 /* Must return something to make the compiler happy. This is clearly an
903 * error case.
904 */
905 return 0;
906 }
907
908 unsigned
909 ir_constant::get_uint_component(unsigned i) const
910 {
911 switch (this->type->base_type) {
912 case GLSL_TYPE_UINT: return this->value.u[i];
913 case GLSL_TYPE_INT: return this->value.i[i];
914 case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
915 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0;
916 default: assert(!"Should not get here."); break;
917 }
918
919 /* Must return something to make the compiler happy. This is clearly an
920 * error case.
921 */
922 return 0;
923 }
924
925 ir_constant *
926 ir_constant::get_array_element(unsigned i) const
927 {
928 assert(this->type->is_array());
929
930 /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
931 *
932 * "Behavior is undefined if a shader subscripts an array with an index
933 * less than 0 or greater than or equal to the size the array was
934 * declared with."
935 *
936 * Most out-of-bounds accesses are removed before things could get this far.
937 * There are cases where non-constant array index values can get constant
938 * folded.
939 */
940 if (int(i) < 0)
941 i = 0;
942 else if (i >= this->type->length)
943 i = this->type->length - 1;
944
945 return array_elements[i];
946 }
947
948 ir_constant *
949 ir_constant::get_record_field(const char *name)
950 {
951 int idx = this->type->field_index(name);
952
953 if (idx < 0)
954 return NULL;
955
956 if (this->components.is_empty())
957 return NULL;
958
959 exec_node *node = this->components.head;
960 for (int i = 0; i < idx; i++) {
961 node = node->next;
962
963 /* If the end of the list is encountered before the element matching the
964 * requested field is found, return NULL.
965 */
966 if (node->is_tail_sentinel())
967 return NULL;
968 }
969
970 return (ir_constant *) node;
971 }
972
973 void
974 ir_constant::copy_offset(ir_constant *src, int offset)
975 {
976 switch (this->type->base_type) {
977 case GLSL_TYPE_UINT:
978 case GLSL_TYPE_INT:
979 case GLSL_TYPE_FLOAT:
980 case GLSL_TYPE_BOOL: {
981 unsigned int size = src->type->components();
982 assert (size <= this->type->components() - offset);
983 for (unsigned int i=0; i<size; i++) {
984 switch (this->type->base_type) {
985 case GLSL_TYPE_UINT:
986 value.u[i+offset] = src->get_uint_component(i);
987 break;
988 case GLSL_TYPE_INT:
989 value.i[i+offset] = src->get_int_component(i);
990 break;
991 case GLSL_TYPE_FLOAT:
992 value.f[i+offset] = src->get_float_component(i);
993 break;
994 case GLSL_TYPE_BOOL:
995 value.b[i+offset] = src->get_bool_component(i);
996 break;
997 default: // Shut up the compiler
998 break;
999 }
1000 }
1001 break;
1002 }
1003
1004 case GLSL_TYPE_STRUCT: {
1005 assert (src->type == this->type);
1006 this->components.make_empty();
1007 foreach_list(node, &src->components) {
1008 ir_constant *const orig = (ir_constant *) node;
1009
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 {
1237 this->ir_type = ir_type_loop;
1238 }
1239
1240
1241 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
1242 {
1243 assert(var != NULL);
1244
1245 this->ir_type = ir_type_dereference_variable;
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 {
1254 this->ir_type = ir_type_dereference_array;
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 {
1263 void *ctx = ralloc_parent(var);
1264
1265 this->ir_type = ir_type_dereference_array;
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 {
1293 assert(value != NULL);
1294
1295 this->ir_type = ir_type_dereference_record;
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 {
1305 void *ctx = ralloc_parent(var);
1306
1307 this->ir_type = ir_type_dereference_record;
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 *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 : val(val)
1425 {
1426 const unsigned components[4] = { x, y, z, w };
1427 this->ir_type = ir_type_swizzle;
1428 this->init_mask(components, count);
1429 }
1430
1431 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
1432 unsigned count)
1433 : val(val)
1434 {
1435 this->ir_type = ir_type_swizzle;
1436 this->init_mask(comp, count);
1437 }
1438
1439 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
1440 {
1441 this->ir_type = ir_type_swizzle;
1442 this->val = val;
1443 this->mask = mask;
1444 this->type = glsl_type::get_instance(val->type->base_type,
1445 mask.num_components, 1);
1446 }
1447
1448 #define X 1
1449 #define R 5
1450 #define S 9
1451 #define I 13
1452
1453 ir_swizzle *
1454 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
1455 {
1456 void *ctx = ralloc_parent(val);
1457
1458 /* For each possible swizzle character, this table encodes the value in
1459 * \c idx_map that represents the 0th element of the vector. For invalid
1460 * swizzle characters (e.g., 'k'), a special value is used that will allow
1461 * detection of errors.
1462 */
1463 static const unsigned char base_idx[26] = {
1464 /* a b c d e f g h i j k l m */
1465 R, R, I, I, I, I, R, I, I, I, I, I, I,
1466 /* n o p q r s t u v w x y z */
1467 I, I, S, S, R, S, S, I, I, X, X, X, X
1468 };
1469
1470 /* Each valid swizzle character has an entry in the previous table. This
1471 * table encodes the base index encoded in the previous table plus the actual
1472 * index of the swizzle character. When processing swizzles, the first
1473 * character in the string is indexed in the previous table. Each character
1474 * in the string is indexed in this table, and the value found there has the
1475 * value form the first table subtracted. The result must be on the range
1476 * [0,3].
1477 *
1478 * For example, the string "wzyx" will get X from the first table. Each of
1479 * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After
1480 * subtraction, the swizzle values are { 3, 2, 1, 0 }.
1481 *
1482 * The string "wzrg" will get X from the first table. Each of the characters
1483 * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the
1484 * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range
1485 * [0,3], the error is detected.
1486 */
1487 static const unsigned char idx_map[26] = {
1488 /* a b c d e f g h i j k l m */
1489 R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0,
1490 /* n o p q r s t u v w x y z */
1491 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2
1492 };
1493
1494 int swiz_idx[4] = { 0, 0, 0, 0 };
1495 unsigned i;
1496
1497
1498 /* Validate the first character in the swizzle string and look up the base
1499 * index value as described above.
1500 */
1501 if ((str[0] < 'a') || (str[0] > 'z'))
1502 return NULL;
1503
1504 const unsigned base = base_idx[str[0] - 'a'];
1505
1506
1507 for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
1508 /* Validate the next character, and, as described above, convert it to a
1509 * swizzle index.
1510 */
1511 if ((str[i] < 'a') || (str[i] > 'z'))
1512 return NULL;
1513
1514 swiz_idx[i] = idx_map[str[i] - 'a'] - base;
1515 if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
1516 return NULL;
1517 }
1518
1519 if (str[i] != '\0')
1520 return NULL;
1521
1522 return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
1523 swiz_idx[3], i);
1524 }
1525
1526 #undef X
1527 #undef R
1528 #undef S
1529 #undef I
1530
1531 ir_variable *
1532 ir_swizzle::variable_referenced() const
1533 {
1534 return this->val->variable_referenced();
1535 }
1536
1537
1538 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
1539 ir_variable_mode mode)
1540 : max_ifc_array_access(NULL)
1541 {
1542 this->ir_type = ir_type_variable;
1543 this->type = type;
1544 this->name = ralloc_strdup(this, name);
1545 this->data.explicit_location = false;
1546 this->data.has_initializer = false;
1547 this->data.location = -1;
1548 this->data.location_frac = 0;
1549 this->warn_extension = NULL;
1550 this->constant_value = NULL;
1551 this->constant_initializer = NULL;
1552 this->data.origin_upper_left = false;
1553 this->data.pixel_center_integer = false;
1554 this->data.depth_layout = ir_depth_layout_none;
1555 this->data.used = false;
1556 this->data.read_only = false;
1557 this->data.centroid = false;
1558 this->data.sample = false;
1559 this->data.invariant = false;
1560 this->data.how_declared = ir_var_declared_normally;
1561 this->data.mode = mode;
1562 this->data.interpolation = INTERP_QUALIFIER_NONE;
1563 this->data.max_array_access = 0;
1564 this->data.atomic.buffer_index = 0;
1565 this->data.atomic.offset = 0;
1566 this->data.image.read_only = false;
1567 this->data.image.write_only = false;
1568 this->data.image.coherent = false;
1569 this->data.image._volatile = false;
1570 this->data.image.restrict_flag = false;
1571
1572 if (type != NULL) {
1573 if (type->base_type == GLSL_TYPE_SAMPLER)
1574 this->data.read_only = true;
1575
1576 if (type->is_interface())
1577 this->init_interface_type(type);
1578 else if (type->is_array() && type->fields.array->is_interface())
1579 this->init_interface_type(type->fields.array);
1580 }
1581 }
1582
1583
1584 const char *
1585 interpolation_string(unsigned interpolation)
1586 {
1587 switch (interpolation) {
1588 case INTERP_QUALIFIER_NONE: return "no";
1589 case INTERP_QUALIFIER_SMOOTH: return "smooth";
1590 case INTERP_QUALIFIER_FLAT: return "flat";
1591 case INTERP_QUALIFIER_NOPERSPECTIVE: return "noperspective";
1592 }
1593
1594 assert(!"Should not get here.");
1595 return "";
1596 }
1597
1598
1599 glsl_interp_qualifier
1600 ir_variable::determine_interpolation_mode(bool flat_shade)
1601 {
1602 if (this->data.interpolation != INTERP_QUALIFIER_NONE)
1603 return (glsl_interp_qualifier) this->data.interpolation;
1604 int location = this->data.location;
1605 bool is_gl_Color =
1606 location == VARYING_SLOT_COL0 || location == VARYING_SLOT_COL1;
1607 if (flat_shade && is_gl_Color)
1608 return INTERP_QUALIFIER_FLAT;
1609 else
1610 return INTERP_QUALIFIER_SMOOTH;
1611 }
1612
1613
1614 ir_function_signature::ir_function_signature(const glsl_type *return_type,
1615 builtin_available_predicate b)
1616 : return_type(return_type), is_defined(false), is_intrinsic(false),
1617 builtin_avail(b), _function(NULL)
1618 {
1619 this->ir_type = ir_type_function_signature;
1620 this->origin = NULL;
1621 }
1622
1623
1624 bool
1625 ir_function_signature::is_builtin() const
1626 {
1627 return builtin_avail != NULL;
1628 }
1629
1630
1631 bool
1632 ir_function_signature::is_builtin_available(const _mesa_glsl_parse_state *state) const
1633 {
1634 /* We can't call the predicate without a state pointer, so just say that
1635 * the signature is available. At compile time, we need the filtering,
1636 * but also receive a valid state pointer. At link time, we're resolving
1637 * imported built-in prototypes to their definitions, which will always
1638 * be an exact match. So we can skip the filtering.
1639 */
1640 if (state == NULL)
1641 return true;
1642
1643 assert(builtin_avail != NULL);
1644 return builtin_avail(state);
1645 }
1646
1647
1648 static bool
1649 modes_match(unsigned a, unsigned b)
1650 {
1651 if (a == b)
1652 return true;
1653
1654 /* Accept "in" vs. "const in" */
1655 if ((a == ir_var_const_in && b == ir_var_function_in) ||
1656 (b == ir_var_const_in && a == ir_var_function_in))
1657 return true;
1658
1659 return false;
1660 }
1661
1662
1663 const char *
1664 ir_function_signature::qualifiers_match(exec_list *params)
1665 {
1666 /* check that the qualifiers match. */
1667 foreach_two_lists(a_node, &this->parameters, b_node, params) {
1668 ir_variable *a = (ir_variable *) a_node;
1669 ir_variable *b = (ir_variable *) b_node;
1670
1671 if (a->data.read_only != b->data.read_only ||
1672 !modes_match(a->data.mode, b->data.mode) ||
1673 a->data.interpolation != b->data.interpolation ||
1674 a->data.centroid != b->data.centroid ||
1675 a->data.sample != b->data.sample ||
1676 a->data.image.read_only != b->data.image.read_only ||
1677 a->data.image.write_only != b->data.image.write_only ||
1678 a->data.image.coherent != b->data.image.coherent ||
1679 a->data.image._volatile != b->data.image._volatile ||
1680 a->data.image.restrict_flag != b->data.image.restrict_flag) {
1681
1682 /* parameter a's qualifiers don't match */
1683 return a->name;
1684 }
1685 }
1686 return NULL;
1687 }
1688
1689
1690 void
1691 ir_function_signature::replace_parameters(exec_list *new_params)
1692 {
1693 /* Destroy all of the previous parameter information. If the previous
1694 * parameter information comes from the function prototype, it may either
1695 * specify incorrect parameter names or not have names at all.
1696 */
1697 new_params->move_nodes_to(&parameters);
1698 }
1699
1700
1701 ir_function::ir_function(const char *name)
1702 {
1703 this->ir_type = ir_type_function;
1704 this->name = ralloc_strdup(this, name);
1705 }
1706
1707
1708 bool
1709 ir_function::has_user_signature()
1710 {
1711 foreach_list(n, &this->signatures) {
1712 ir_function_signature *const sig = (ir_function_signature *) n;
1713 if (!sig->is_builtin())
1714 return true;
1715 }
1716 return false;
1717 }
1718
1719
1720 ir_rvalue *
1721 ir_rvalue::error_value(void *mem_ctx)
1722 {
1723 ir_rvalue *v = new(mem_ctx) ir_rvalue;
1724
1725 v->type = glsl_type::error_type;
1726 return v;
1727 }
1728
1729
1730 void
1731 visit_exec_list(exec_list *list, ir_visitor *visitor)
1732 {
1733 foreach_list_safe(n, list) {
1734 ((ir_instruction *) n)->accept(visitor);
1735 }
1736 }
1737
1738
1739 static void
1740 steal_memory(ir_instruction *ir, void *new_ctx)
1741 {
1742 ir_variable *var = ir->as_variable();
1743 ir_constant *constant = ir->as_constant();
1744 if (var != NULL && var->constant_value != NULL)
1745 steal_memory(var->constant_value, ir);
1746
1747 if (var != NULL && var->constant_initializer != NULL)
1748 steal_memory(var->constant_initializer, ir);
1749
1750 /* The components of aggregate constants are not visited by the normal
1751 * visitor, so steal their values by hand.
1752 */
1753 if (constant != NULL) {
1754 if (constant->type->is_record()) {
1755 foreach_list(n, &constant->components) {
1756 ir_constant *field = (ir_constant *) n;
1757 steal_memory(field, ir);
1758 }
1759 } else if (constant->type->is_array()) {
1760 for (unsigned int i = 0; i < constant->type->length; i++) {
1761 steal_memory(constant->array_elements[i], ir);
1762 }
1763 }
1764 }
1765
1766 ralloc_steal(new_ctx, ir);
1767 }
1768
1769
1770 void
1771 reparent_ir(exec_list *list, void *mem_ctx)
1772 {
1773 foreach_list(node, list) {
1774 visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
1775 }
1776 }
1777
1778
1779 static ir_rvalue *
1780 try_min_one(ir_rvalue *ir)
1781 {
1782 ir_expression *expr = ir->as_expression();
1783
1784 if (!expr || expr->operation != ir_binop_min)
1785 return NULL;
1786
1787 if (expr->operands[0]->is_one())
1788 return expr->operands[1];
1789
1790 if (expr->operands[1]->is_one())
1791 return expr->operands[0];
1792
1793 return NULL;
1794 }
1795
1796 static ir_rvalue *
1797 try_max_zero(ir_rvalue *ir)
1798 {
1799 ir_expression *expr = ir->as_expression();
1800
1801 if (!expr || expr->operation != ir_binop_max)
1802 return NULL;
1803
1804 if (expr->operands[0]->is_zero())
1805 return expr->operands[1];
1806
1807 if (expr->operands[1]->is_zero())
1808 return expr->operands[0];
1809
1810 return NULL;
1811 }
1812
1813 ir_rvalue *
1814 ir_rvalue::as_rvalue_to_saturate()
1815 {
1816 ir_expression *expr = this->as_expression();
1817
1818 if (!expr)
1819 return NULL;
1820
1821 ir_rvalue *max_zero = try_max_zero(expr);
1822 if (max_zero) {
1823 return try_min_one(max_zero);
1824 } else {
1825 ir_rvalue *min_one = try_min_one(expr);
1826 if (min_one) {
1827 return try_max_zero(min_one);
1828 }
1829 }
1830
1831 return NULL;
1832 }
1833
1834
1835 unsigned
1836 vertices_per_prim(GLenum prim)
1837 {
1838 switch (prim) {
1839 case GL_POINTS:
1840 return 1;
1841 case GL_LINES:
1842 return 2;
1843 case GL_TRIANGLES:
1844 return 3;
1845 case GL_LINES_ADJACENCY:
1846 return 4;
1847 case GL_TRIANGLES_ADJACENCY:
1848 return 6;
1849 default:
1850 assert(!"Bad primitive");
1851 return 3;
1852 }
1853 }
1854
1855 /**
1856 * Generate a string describing the mode of a variable
1857 */
1858 const char *
1859 mode_string(const ir_variable *var)
1860 {
1861 switch (var->data.mode) {
1862 case ir_var_auto:
1863 return (var->data.read_only) ? "global constant" : "global variable";
1864
1865 case ir_var_uniform:
1866 return "uniform";
1867
1868 case ir_var_shader_in:
1869 return "shader input";
1870
1871 case ir_var_shader_out:
1872 return "shader output";
1873
1874 case ir_var_function_in:
1875 case ir_var_const_in:
1876 return "function input";
1877
1878 case ir_var_function_out:
1879 return "function output";
1880
1881 case ir_var_function_inout:
1882 return "function inout";
1883
1884 case ir_var_system_value:
1885 return "shader input";
1886
1887 case ir_var_temporary:
1888 return "compiler temporary";
1889
1890 case ir_var_mode_count:
1891 break;
1892 }
1893
1894 assert(!"Should not get here.");
1895 return "invalid variable";
1896 }