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