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