OSDN Git Service

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