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