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