glsl: Assign locations for uniforms in UBOs using the std140 rules.
[profile/ivi/mesa.git] / src / glsl / ir_constant_expression.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
24 /**
25  * \file ir_constant_expression.cpp
26  * Evaluate and process constant valued expressions
27  *
28  * In GLSL, constant valued expressions are used in several places.  These
29  * must be processed and evaluated very early in the compilation process.
30  *
31  *    * Sizes of arrays
32  *    * Initializers for uniforms
33  *    * Initializers for \c const variables
34  */
35
36 #include <math.h>
37 #include "main/core.h" /* for MAX2, MIN2, CLAMP */
38 #include "ir.h"
39 #include "ir_visitor.h"
40 #include "glsl_types.h"
41 #include "program/hash_table.h"
42
43 /* Using C99 rounding functions for roundToEven() implementation is
44  * difficult, because round(), rint, and nearbyint() are affected by
45  * fesetenv(), which the application may have done for its own
46  * purposes.  Mesa's IROUND macro is close to what we want, but it
47  * rounds away from 0 on n + 0.5.
48  */
49 static int
50 round_to_even(float val)
51 {
52    int rounded = IROUND(val);
53
54    if (val - floor(val) == 0.5) {
55       if (rounded % 2 != 0)
56          rounded += val > 0 ? -1 : 1;
57    }
58
59    return rounded;
60 }
61
62 static float
63 dot(ir_constant *op0, ir_constant *op1)
64 {
65    assert(op0->type->is_float() && op1->type->is_float());
66
67    float result = 0;
68    for (unsigned c = 0; c < op0->type->components(); c++)
69       result += op0->value.f[c] * op1->value.f[c];
70
71    return result;
72 }
73
74 /* This method is the only one supported by gcc.  Unions in particular
75  * are iffy, and read-through-converted-pointer is killed by strict
76  * aliasing.  OTOH, the compiler sees through the memcpy, so the
77  * resulting asm is reasonable.
78  */
79 static float
80 bitcast_u2f(unsigned int u)
81 {
82    assert(sizeof(float) == sizeof(unsigned int));
83    float f;
84    memcpy(&f, &u, sizeof(f));
85    return f;
86 }
87
88 static unsigned int
89 bitcast_f2u(float f)
90 {
91    assert(sizeof(float) == sizeof(unsigned int));
92    unsigned int u;
93    memcpy(&u, &f, sizeof(f));
94    return u;
95 }
96
97 ir_constant *
98 ir_rvalue::constant_expression_value(struct hash_table *variable_context)
99 {
100    assert(this->type->is_error());
101    return NULL;
102 }
103
104 ir_constant *
105 ir_expression::constant_expression_value(struct hash_table *variable_context)
106 {
107    if (this->type->is_error())
108       return NULL;
109
110    ir_constant *op[Elements(this->operands)] = { NULL, };
111    ir_constant_data data;
112
113    memset(&data, 0, sizeof(data));
114
115    for (unsigned operand = 0; operand < this->get_num_operands(); operand++) {
116       op[operand] = this->operands[operand]->constant_expression_value(variable_context);
117       if (!op[operand])
118          return NULL;
119    }
120
121    if (op[1] != NULL)
122       assert(op[0]->type->base_type == op[1]->type->base_type ||
123              this->operation == ir_binop_lshift ||
124              this->operation == ir_binop_rshift);
125
126    bool op0_scalar = op[0]->type->is_scalar();
127    bool op1_scalar = op[1] != NULL && op[1]->type->is_scalar();
128
129    /* When iterating over a vector or matrix's components, we want to increase
130     * the loop counter.  However, for scalars, we want to stay at 0.
131     */
132    unsigned c0_inc = op0_scalar ? 0 : 1;
133    unsigned c1_inc = op1_scalar ? 0 : 1;
134    unsigned components;
135    if (op1_scalar || !op[1]) {
136       components = op[0]->type->components();
137    } else {
138       components = op[1]->type->components();
139    }
140
141    void *ctx = ralloc_parent(this);
142
143    /* Handle array operations here, rather than below. */
144    if (op[0]->type->is_array()) {
145       assert(op[1] != NULL && op[1]->type->is_array());
146       switch (this->operation) {
147       case ir_binop_all_equal:
148          return new(ctx) ir_constant(op[0]->has_value(op[1]));
149       case ir_binop_any_nequal:
150          return new(ctx) ir_constant(!op[0]->has_value(op[1]));
151       default:
152          break;
153       }
154       return NULL;
155    }
156
157    switch (this->operation) {
158    case ir_unop_bit_not:
159        switch (op[0]->type->base_type) {
160        case GLSL_TYPE_INT:
161            for (unsigned c = 0; c < components; c++)
162                data.i[c] = ~ op[0]->value.i[c];
163            break;
164        case GLSL_TYPE_UINT:
165            for (unsigned c = 0; c < components; c++)
166                data.u[c] = ~ op[0]->value.u[c];
167            break;
168        default:
169            assert(0);
170        }
171        break;
172
173    case ir_unop_logic_not:
174       assert(op[0]->type->base_type == GLSL_TYPE_BOOL);
175       for (unsigned c = 0; c < op[0]->type->components(); c++)
176          data.b[c] = !op[0]->value.b[c];
177       break;
178
179    case ir_unop_f2i:
180       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
181       for (unsigned c = 0; c < op[0]->type->components(); c++) {
182          data.i[c] = (int) op[0]->value.f[c];
183       }
184       break;
185    case ir_unop_f2u:
186       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
187       for (unsigned c = 0; c < op[0]->type->components(); c++) {
188          data.i[c] = (unsigned) op[0]->value.f[c];
189       }
190       break;
191    case ir_unop_i2f:
192       assert(op[0]->type->base_type == GLSL_TYPE_INT);
193       for (unsigned c = 0; c < op[0]->type->components(); c++) {
194          data.f[c] = (float) op[0]->value.i[c];
195       }
196       break;
197    case ir_unop_u2f:
198       assert(op[0]->type->base_type == GLSL_TYPE_UINT);
199       for (unsigned c = 0; c < op[0]->type->components(); c++) {
200          data.f[c] = (float) op[0]->value.u[c];
201       }
202       break;
203    case ir_unop_b2f:
204       assert(op[0]->type->base_type == GLSL_TYPE_BOOL);
205       for (unsigned c = 0; c < op[0]->type->components(); c++) {
206          data.f[c] = op[0]->value.b[c] ? 1.0F : 0.0F;
207       }
208       break;
209    case ir_unop_f2b:
210       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
211       for (unsigned c = 0; c < op[0]->type->components(); c++) {
212          data.b[c] = op[0]->value.f[c] != 0.0F ? true : false;
213       }
214       break;
215    case ir_unop_b2i:
216       assert(op[0]->type->base_type == GLSL_TYPE_BOOL);
217       for (unsigned c = 0; c < op[0]->type->components(); c++) {
218          data.u[c] = op[0]->value.b[c] ? 1 : 0;
219       }
220       break;
221    case ir_unop_i2b:
222       assert(op[0]->type->is_integer());
223       for (unsigned c = 0; c < op[0]->type->components(); c++) {
224          data.b[c] = op[0]->value.u[c] ? true : false;
225       }
226       break;
227    case ir_unop_u2i:
228       assert(op[0]->type->base_type == GLSL_TYPE_UINT);
229       for (unsigned c = 0; c < op[0]->type->components(); c++) {
230          data.i[c] = op[0]->value.u[c];
231       }
232       break;
233    case ir_unop_i2u:
234       assert(op[0]->type->base_type == GLSL_TYPE_INT);
235       for (unsigned c = 0; c < op[0]->type->components(); c++) {
236          data.u[c] = op[0]->value.i[c];
237       }
238       break;
239    case ir_unop_bitcast_i2f:
240       assert(op[0]->type->base_type == GLSL_TYPE_INT);
241       for (unsigned c = 0; c < op[0]->type->components(); c++) {
242          data.f[c] = bitcast_u2f(op[0]->value.i[c]);
243       }
244       break;
245    case ir_unop_bitcast_f2i:
246       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
247       for (unsigned c = 0; c < op[0]->type->components(); c++) {
248          data.i[c] = bitcast_f2u(op[0]->value.f[c]);
249       }
250       break;
251    case ir_unop_bitcast_u2f:
252       assert(op[0]->type->base_type == GLSL_TYPE_UINT);
253       for (unsigned c = 0; c < op[0]->type->components(); c++) {
254          data.f[c] = bitcast_u2f(op[0]->value.u[c]);
255       }
256       break;
257    case ir_unop_bitcast_f2u:
258       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
259       for (unsigned c = 0; c < op[0]->type->components(); c++) {
260          data.u[c] = bitcast_f2u(op[0]->value.f[c]);
261       }
262       break;
263    case ir_unop_any:
264       assert(op[0]->type->is_boolean());
265       data.b[0] = false;
266       for (unsigned c = 0; c < op[0]->type->components(); c++) {
267          if (op[0]->value.b[c])
268             data.b[0] = true;
269       }
270       break;
271
272    case ir_unop_trunc:
273       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
274       for (unsigned c = 0; c < op[0]->type->components(); c++) {
275          data.f[c] = truncf(op[0]->value.f[c]);
276       }
277       break;
278
279    case ir_unop_round_even:
280       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
281       for (unsigned c = 0; c < op[0]->type->components(); c++) {
282          data.f[c] = round_to_even(op[0]->value.f[c]);
283       }
284       break;
285
286    case ir_unop_ceil:
287       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
288       for (unsigned c = 0; c < op[0]->type->components(); c++) {
289          data.f[c] = ceilf(op[0]->value.f[c]);
290       }
291       break;
292
293    case ir_unop_floor:
294       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
295       for (unsigned c = 0; c < op[0]->type->components(); c++) {
296          data.f[c] = floorf(op[0]->value.f[c]);
297       }
298       break;
299
300    case ir_unop_fract:
301       for (unsigned c = 0; c < op[0]->type->components(); c++) {
302          switch (this->type->base_type) {
303          case GLSL_TYPE_UINT:
304             data.u[c] = 0;
305             break;
306          case GLSL_TYPE_INT:
307             data.i[c] = 0;
308             break;
309          case GLSL_TYPE_FLOAT:
310             data.f[c] = op[0]->value.f[c] - floor(op[0]->value.f[c]);
311             break;
312          default:
313             assert(0);
314          }
315       }
316       break;
317
318    case ir_unop_sin:
319    case ir_unop_sin_reduced:
320       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
321       for (unsigned c = 0; c < op[0]->type->components(); c++) {
322          data.f[c] = sinf(op[0]->value.f[c]);
323       }
324       break;
325
326    case ir_unop_cos:
327    case ir_unop_cos_reduced:
328       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
329       for (unsigned c = 0; c < op[0]->type->components(); c++) {
330          data.f[c] = cosf(op[0]->value.f[c]);
331       }
332       break;
333
334    case ir_unop_neg:
335       for (unsigned c = 0; c < op[0]->type->components(); c++) {
336          switch (this->type->base_type) {
337          case GLSL_TYPE_UINT:
338             data.u[c] = -((int) op[0]->value.u[c]);
339             break;
340          case GLSL_TYPE_INT:
341             data.i[c] = -op[0]->value.i[c];
342             break;
343          case GLSL_TYPE_FLOAT:
344             data.f[c] = -op[0]->value.f[c];
345             break;
346          default:
347             assert(0);
348          }
349       }
350       break;
351
352    case ir_unop_abs:
353       for (unsigned c = 0; c < op[0]->type->components(); c++) {
354          switch (this->type->base_type) {
355          case GLSL_TYPE_UINT:
356             data.u[c] = op[0]->value.u[c];
357             break;
358          case GLSL_TYPE_INT:
359             data.i[c] = op[0]->value.i[c];
360             if (data.i[c] < 0)
361                data.i[c] = -data.i[c];
362             break;
363          case GLSL_TYPE_FLOAT:
364             data.f[c] = fabs(op[0]->value.f[c]);
365             break;
366          default:
367             assert(0);
368          }
369       }
370       break;
371
372    case ir_unop_sign:
373       for (unsigned c = 0; c < op[0]->type->components(); c++) {
374          switch (this->type->base_type) {
375          case GLSL_TYPE_UINT:
376             data.u[c] = op[0]->value.i[c] > 0;
377             break;
378          case GLSL_TYPE_INT:
379             data.i[c] = (op[0]->value.i[c] > 0) - (op[0]->value.i[c] < 0);
380             break;
381          case GLSL_TYPE_FLOAT:
382             data.f[c] = float((op[0]->value.f[c] > 0)-(op[0]->value.f[c] < 0));
383             break;
384          default:
385             assert(0);
386          }
387       }
388       break;
389
390    case ir_unop_rcp:
391       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
392       for (unsigned c = 0; c < op[0]->type->components(); c++) {
393          switch (this->type->base_type) {
394          case GLSL_TYPE_UINT:
395             if (op[0]->value.u[c] != 0.0)
396                data.u[c] = 1 / op[0]->value.u[c];
397             break;
398          case GLSL_TYPE_INT:
399             if (op[0]->value.i[c] != 0.0)
400                data.i[c] = 1 / op[0]->value.i[c];
401             break;
402          case GLSL_TYPE_FLOAT:
403             if (op[0]->value.f[c] != 0.0)
404                data.f[c] = 1.0F / op[0]->value.f[c];
405             break;
406          default:
407             assert(0);
408          }
409       }
410       break;
411
412    case ir_unop_rsq:
413       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
414       for (unsigned c = 0; c < op[0]->type->components(); c++) {
415          data.f[c] = 1.0F / sqrtf(op[0]->value.f[c]);
416       }
417       break;
418
419    case ir_unop_sqrt:
420       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
421       for (unsigned c = 0; c < op[0]->type->components(); c++) {
422          data.f[c] = sqrtf(op[0]->value.f[c]);
423       }
424       break;
425
426    case ir_unop_exp:
427       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
428       for (unsigned c = 0; c < op[0]->type->components(); c++) {
429          data.f[c] = expf(op[0]->value.f[c]);
430       }
431       break;
432
433    case ir_unop_exp2:
434       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
435       for (unsigned c = 0; c < op[0]->type->components(); c++) {
436          data.f[c] = exp2f(op[0]->value.f[c]);
437       }
438       break;
439
440    case ir_unop_log:
441       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
442       for (unsigned c = 0; c < op[0]->type->components(); c++) {
443          data.f[c] = logf(op[0]->value.f[c]);
444       }
445       break;
446
447    case ir_unop_log2:
448       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
449       for (unsigned c = 0; c < op[0]->type->components(); c++) {
450          data.f[c] = log2f(op[0]->value.f[c]);
451       }
452       break;
453
454    case ir_unop_dFdx:
455    case ir_unop_dFdy:
456       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
457       for (unsigned c = 0; c < op[0]->type->components(); c++) {
458          data.f[c] = 0.0;
459       }
460       break;
461
462    case ir_binop_pow:
463       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
464       for (unsigned c = 0; c < op[0]->type->components(); c++) {
465          data.f[c] = powf(op[0]->value.f[c], op[1]->value.f[c]);
466       }
467       break;
468
469    case ir_binop_dot:
470       data.f[0] = dot(op[0], op[1]);
471       break;
472
473    case ir_binop_min:
474       assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
475       for (unsigned c = 0, c0 = 0, c1 = 0;
476            c < components;
477            c0 += c0_inc, c1 += c1_inc, c++) {
478
479          switch (op[0]->type->base_type) {
480          case GLSL_TYPE_UINT:
481             data.u[c] = MIN2(op[0]->value.u[c0], op[1]->value.u[c1]);
482             break;
483          case GLSL_TYPE_INT:
484             data.i[c] = MIN2(op[0]->value.i[c0], op[1]->value.i[c1]);
485             break;
486          case GLSL_TYPE_FLOAT:
487             data.f[c] = MIN2(op[0]->value.f[c0], op[1]->value.f[c1]);
488             break;
489          default:
490             assert(0);
491          }
492       }
493
494       break;
495    case ir_binop_max:
496       assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
497       for (unsigned c = 0, c0 = 0, c1 = 0;
498            c < components;
499            c0 += c0_inc, c1 += c1_inc, c++) {
500
501          switch (op[0]->type->base_type) {
502          case GLSL_TYPE_UINT:
503             data.u[c] = MAX2(op[0]->value.u[c0], op[1]->value.u[c1]);
504             break;
505          case GLSL_TYPE_INT:
506             data.i[c] = MAX2(op[0]->value.i[c0], op[1]->value.i[c1]);
507             break;
508          case GLSL_TYPE_FLOAT:
509             data.f[c] = MAX2(op[0]->value.f[c0], op[1]->value.f[c1]);
510             break;
511          default:
512             assert(0);
513          }
514       }
515       break;
516
517    case ir_binop_add:
518       assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
519       for (unsigned c = 0, c0 = 0, c1 = 0;
520            c < components;
521            c0 += c0_inc, c1 += c1_inc, c++) {
522
523          switch (op[0]->type->base_type) {
524          case GLSL_TYPE_UINT:
525             data.u[c] = op[0]->value.u[c0] + op[1]->value.u[c1];
526             break;
527          case GLSL_TYPE_INT:
528             data.i[c] = op[0]->value.i[c0] + op[1]->value.i[c1];
529             break;
530          case GLSL_TYPE_FLOAT:
531             data.f[c] = op[0]->value.f[c0] + op[1]->value.f[c1];
532             break;
533          default:
534             assert(0);
535          }
536       }
537
538       break;
539    case ir_binop_sub:
540       assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
541       for (unsigned c = 0, c0 = 0, c1 = 0;
542            c < components;
543            c0 += c0_inc, c1 += c1_inc, c++) {
544
545          switch (op[0]->type->base_type) {
546          case GLSL_TYPE_UINT:
547             data.u[c] = op[0]->value.u[c0] - op[1]->value.u[c1];
548             break;
549          case GLSL_TYPE_INT:
550             data.i[c] = op[0]->value.i[c0] - op[1]->value.i[c1];
551             break;
552          case GLSL_TYPE_FLOAT:
553             data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1];
554             break;
555          default:
556             assert(0);
557          }
558       }
559
560       break;
561    case ir_binop_mul:
562       /* Check for equal types, or unequal types involving scalars */
563       if ((op[0]->type == op[1]->type && !op[0]->type->is_matrix())
564           || op0_scalar || op1_scalar) {
565          for (unsigned c = 0, c0 = 0, c1 = 0;
566               c < components;
567               c0 += c0_inc, c1 += c1_inc, c++) {
568
569             switch (op[0]->type->base_type) {
570             case GLSL_TYPE_UINT:
571                data.u[c] = op[0]->value.u[c0] * op[1]->value.u[c1];
572                break;
573             case GLSL_TYPE_INT:
574                data.i[c] = op[0]->value.i[c0] * op[1]->value.i[c1];
575                break;
576             case GLSL_TYPE_FLOAT:
577                data.f[c] = op[0]->value.f[c0] * op[1]->value.f[c1];
578                break;
579             default:
580                assert(0);
581             }
582          }
583       } else {
584          assert(op[0]->type->is_matrix() || op[1]->type->is_matrix());
585
586          /* Multiply an N-by-M matrix with an M-by-P matrix.  Since either
587           * matrix can be a GLSL vector, either N or P can be 1.
588           *
589           * For vec*mat, the vector is treated as a row vector.  This
590           * means the vector is a 1-row x M-column matrix.
591           *
592           * For mat*vec, the vector is treated as a column vector.  Since
593           * matrix_columns is 1 for vectors, this just works.
594           */
595          const unsigned n = op[0]->type->is_vector()
596             ? 1 : op[0]->type->vector_elements;
597          const unsigned m = op[1]->type->vector_elements;
598          const unsigned p = op[1]->type->matrix_columns;
599          for (unsigned j = 0; j < p; j++) {
600             for (unsigned i = 0; i < n; i++) {
601                for (unsigned k = 0; k < m; k++) {
602                   data.f[i+n*j] += op[0]->value.f[i+n*k]*op[1]->value.f[k+m*j];
603                }
604             }
605          }
606       }
607
608       break;
609    case ir_binop_div:
610       /* FINISHME: Emit warning when division-by-zero is detected. */
611       assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
612       for (unsigned c = 0, c0 = 0, c1 = 0;
613            c < components;
614            c0 += c0_inc, c1 += c1_inc, c++) {
615
616          switch (op[0]->type->base_type) {
617          case GLSL_TYPE_UINT:
618             if (op[1]->value.u[c1] == 0) {
619                data.u[c] = 0;
620             } else {
621                data.u[c] = op[0]->value.u[c0] / op[1]->value.u[c1];
622             }
623             break;
624          case GLSL_TYPE_INT:
625             if (op[1]->value.i[c1] == 0) {
626                data.i[c] = 0;
627             } else {
628                data.i[c] = op[0]->value.i[c0] / op[1]->value.i[c1];
629             }
630             break;
631          case GLSL_TYPE_FLOAT:
632             data.f[c] = op[0]->value.f[c0] / op[1]->value.f[c1];
633             break;
634          default:
635             assert(0);
636          }
637       }
638
639       break;
640    case ir_binop_mod:
641       /* FINISHME: Emit warning when division-by-zero is detected. */
642       assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
643       for (unsigned c = 0, c0 = 0, c1 = 0;
644            c < components;
645            c0 += c0_inc, c1 += c1_inc, c++) {
646
647          switch (op[0]->type->base_type) {
648          case GLSL_TYPE_UINT:
649             if (op[1]->value.u[c1] == 0) {
650                data.u[c] = 0;
651             } else {
652                data.u[c] = op[0]->value.u[c0] % op[1]->value.u[c1];
653             }
654             break;
655          case GLSL_TYPE_INT:
656             if (op[1]->value.i[c1] == 0) {
657                data.i[c] = 0;
658             } else {
659                data.i[c] = op[0]->value.i[c0] % op[1]->value.i[c1];
660             }
661             break;
662          case GLSL_TYPE_FLOAT:
663             /* We don't use fmod because it rounds toward zero; GLSL specifies
664              * the use of floor.
665              */
666             data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1]
667                * floorf(op[0]->value.f[c0] / op[1]->value.f[c1]);
668             break;
669          default:
670             assert(0);
671          }
672       }
673
674       break;
675
676    case ir_binop_logic_and:
677       assert(op[0]->type->base_type == GLSL_TYPE_BOOL);
678       for (unsigned c = 0; c < op[0]->type->components(); c++)
679          data.b[c] = op[0]->value.b[c] && op[1]->value.b[c];
680       break;
681    case ir_binop_logic_xor:
682       assert(op[0]->type->base_type == GLSL_TYPE_BOOL);
683       for (unsigned c = 0; c < op[0]->type->components(); c++)
684          data.b[c] = op[0]->value.b[c] ^ op[1]->value.b[c];
685       break;
686    case ir_binop_logic_or:
687       assert(op[0]->type->base_type == GLSL_TYPE_BOOL);
688       for (unsigned c = 0; c < op[0]->type->components(); c++)
689          data.b[c] = op[0]->value.b[c] || op[1]->value.b[c];
690       break;
691
692    case ir_binop_less:
693       assert(op[0]->type == op[1]->type);
694       for (unsigned c = 0; c < op[0]->type->components(); c++) {
695          switch (op[0]->type->base_type) {
696          case GLSL_TYPE_UINT:
697             data.b[c] = op[0]->value.u[c] < op[1]->value.u[c];
698             break;
699          case GLSL_TYPE_INT:
700             data.b[c] = op[0]->value.i[c] < op[1]->value.i[c];
701             break;
702          case GLSL_TYPE_FLOAT:
703             data.b[c] = op[0]->value.f[c] < op[1]->value.f[c];
704             break;
705          default:
706             assert(0);
707          }
708       }
709       break;
710    case ir_binop_greater:
711       assert(op[0]->type == op[1]->type);
712       for (unsigned c = 0; c < op[0]->type->components(); c++) {
713          switch (op[0]->type->base_type) {
714          case GLSL_TYPE_UINT:
715             data.b[c] = op[0]->value.u[c] > op[1]->value.u[c];
716             break;
717          case GLSL_TYPE_INT:
718             data.b[c] = op[0]->value.i[c] > op[1]->value.i[c];
719             break;
720          case GLSL_TYPE_FLOAT:
721             data.b[c] = op[0]->value.f[c] > op[1]->value.f[c];
722             break;
723          default:
724             assert(0);
725          }
726       }
727       break;
728    case ir_binop_lequal:
729       assert(op[0]->type == op[1]->type);
730       for (unsigned c = 0; c < op[0]->type->components(); c++) {
731          switch (op[0]->type->base_type) {
732          case GLSL_TYPE_UINT:
733             data.b[c] = op[0]->value.u[c] <= op[1]->value.u[c];
734             break;
735          case GLSL_TYPE_INT:
736             data.b[c] = op[0]->value.i[c] <= op[1]->value.i[c];
737             break;
738          case GLSL_TYPE_FLOAT:
739             data.b[c] = op[0]->value.f[c] <= op[1]->value.f[c];
740             break;
741          default:
742             assert(0);
743          }
744       }
745       break;
746    case ir_binop_gequal:
747       assert(op[0]->type == op[1]->type);
748       for (unsigned c = 0; c < op[0]->type->components(); c++) {
749          switch (op[0]->type->base_type) {
750          case GLSL_TYPE_UINT:
751             data.b[c] = op[0]->value.u[c] >= op[1]->value.u[c];
752             break;
753          case GLSL_TYPE_INT:
754             data.b[c] = op[0]->value.i[c] >= op[1]->value.i[c];
755             break;
756          case GLSL_TYPE_FLOAT:
757             data.b[c] = op[0]->value.f[c] >= op[1]->value.f[c];
758             break;
759          default:
760             assert(0);
761          }
762       }
763       break;
764    case ir_binop_equal:
765       assert(op[0]->type == op[1]->type);
766       for (unsigned c = 0; c < components; c++) {
767          switch (op[0]->type->base_type) {
768          case GLSL_TYPE_UINT:
769             data.b[c] = op[0]->value.u[c] == op[1]->value.u[c];
770             break;
771          case GLSL_TYPE_INT:
772             data.b[c] = op[0]->value.i[c] == op[1]->value.i[c];
773             break;
774          case GLSL_TYPE_FLOAT:
775             data.b[c] = op[0]->value.f[c] == op[1]->value.f[c];
776             break;
777          case GLSL_TYPE_BOOL:
778             data.b[c] = op[0]->value.b[c] == op[1]->value.b[c];
779             break;
780          default:
781             assert(0);
782          }
783       }
784       break;
785    case ir_binop_nequal:
786       assert(op[0]->type == op[1]->type);
787       for (unsigned c = 0; c < components; c++) {
788          switch (op[0]->type->base_type) {
789          case GLSL_TYPE_UINT:
790             data.b[c] = op[0]->value.u[c] != op[1]->value.u[c];
791             break;
792          case GLSL_TYPE_INT:
793             data.b[c] = op[0]->value.i[c] != op[1]->value.i[c];
794             break;
795          case GLSL_TYPE_FLOAT:
796             data.b[c] = op[0]->value.f[c] != op[1]->value.f[c];
797             break;
798          case GLSL_TYPE_BOOL:
799             data.b[c] = op[0]->value.b[c] != op[1]->value.b[c];
800             break;
801          default:
802             assert(0);
803          }
804       }
805       break;
806    case ir_binop_all_equal:
807       data.b[0] = op[0]->has_value(op[1]);
808       break;
809    case ir_binop_any_nequal:
810       data.b[0] = !op[0]->has_value(op[1]);
811       break;
812
813    case ir_binop_lshift:
814       for (unsigned c = 0, c0 = 0, c1 = 0;
815            c < components;
816            c0 += c0_inc, c1 += c1_inc, c++) {
817
818           if (op[0]->type->base_type == GLSL_TYPE_INT &&
819               op[1]->type->base_type == GLSL_TYPE_INT) {
820               data.i[c] = op[0]->value.i[c0] << op[1]->value.i[c1];
821
822           } else if (op[0]->type->base_type == GLSL_TYPE_INT &&
823                      op[1]->type->base_type == GLSL_TYPE_UINT) {
824               data.i[c] = op[0]->value.i[c0] << op[1]->value.u[c1];
825
826           } else if (op[0]->type->base_type == GLSL_TYPE_UINT &&
827                      op[1]->type->base_type == GLSL_TYPE_INT) {
828               data.u[c] = op[0]->value.u[c0] << op[1]->value.i[c1];
829
830           } else if (op[0]->type->base_type == GLSL_TYPE_UINT &&
831                      op[1]->type->base_type == GLSL_TYPE_UINT) {
832               data.u[c] = op[0]->value.u[c0] << op[1]->value.u[c1];
833           }
834       }
835       break;
836
837    case ir_binop_rshift:
838        for (unsigned c = 0, c0 = 0, c1 = 0;
839             c < components;
840             c0 += c0_inc, c1 += c1_inc, c++) {
841
842            if (op[0]->type->base_type == GLSL_TYPE_INT &&
843                op[1]->type->base_type == GLSL_TYPE_INT) {
844                data.i[c] = op[0]->value.i[c0] >> op[1]->value.i[c1];
845
846            } else if (op[0]->type->base_type == GLSL_TYPE_INT &&
847                       op[1]->type->base_type == GLSL_TYPE_UINT) {
848                data.i[c] = op[0]->value.i[c0] >> op[1]->value.u[c1];
849
850            } else if (op[0]->type->base_type == GLSL_TYPE_UINT &&
851                       op[1]->type->base_type == GLSL_TYPE_INT) {
852                data.u[c] = op[0]->value.u[c0] >> op[1]->value.i[c1];
853
854            } else if (op[0]->type->base_type == GLSL_TYPE_UINT &&
855                       op[1]->type->base_type == GLSL_TYPE_UINT) {
856                data.u[c] = op[0]->value.u[c0] >> op[1]->value.u[c1];
857            }
858        }
859        break;
860
861    case ir_binop_bit_and:
862       for (unsigned c = 0, c0 = 0, c1 = 0;
863            c < components;
864            c0 += c0_inc, c1 += c1_inc, c++) {
865
866           switch (op[0]->type->base_type) {
867           case GLSL_TYPE_INT:
868               data.i[c] = op[0]->value.i[c0] & op[1]->value.i[c1];
869               break;
870           case GLSL_TYPE_UINT:
871               data.u[c] = op[0]->value.u[c0] & op[1]->value.u[c1];
872               break;
873           default:
874               assert(0);
875           }
876       }
877       break;
878
879    case ir_binop_bit_or:
880       for (unsigned c = 0, c0 = 0, c1 = 0;
881            c < components;
882            c0 += c0_inc, c1 += c1_inc, c++) {
883
884           switch (op[0]->type->base_type) {
885           case GLSL_TYPE_INT:
886               data.i[c] = op[0]->value.i[c0] | op[1]->value.i[c1];
887               break;
888           case GLSL_TYPE_UINT:
889               data.u[c] = op[0]->value.u[c0] | op[1]->value.u[c1];
890               break;
891           default:
892               assert(0);
893           }
894       }
895       break;
896
897    case ir_binop_bit_xor:
898       for (unsigned c = 0, c0 = 0, c1 = 0;
899            c < components;
900            c0 += c0_inc, c1 += c1_inc, c++) {
901
902           switch (op[0]->type->base_type) {
903           case GLSL_TYPE_INT:
904               data.i[c] = op[0]->value.i[c0] ^ op[1]->value.i[c1];
905               break;
906           case GLSL_TYPE_UINT:
907               data.u[c] = op[0]->value.u[c0] ^ op[1]->value.u[c1];
908               break;
909           default:
910               assert(0);
911           }
912       }
913       break;
914
915    case ir_quadop_vector:
916       for (unsigned c = 0; c < this->type->vector_elements; c++) {
917          switch (this->type->base_type) {
918          case GLSL_TYPE_INT:
919             data.i[c] = op[c]->value.i[0];
920             break;
921          case GLSL_TYPE_UINT:
922             data.u[c] = op[c]->value.u[0];
923             break;
924          case GLSL_TYPE_FLOAT:
925             data.f[c] = op[c]->value.f[0];
926             break;
927          default:
928             assert(0);
929          }
930       }
931       break;
932
933    default:
934       /* FINISHME: Should handle all expression types. */
935       return NULL;
936    }
937
938    return new(ctx) ir_constant(this->type, &data);
939 }
940
941
942 ir_constant *
943 ir_texture::constant_expression_value(struct hash_table *variable_context)
944 {
945    /* texture lookups aren't constant expressions */
946    return NULL;
947 }
948
949
950 ir_constant *
951 ir_swizzle::constant_expression_value(struct hash_table *variable_context)
952 {
953    ir_constant *v = this->val->constant_expression_value(variable_context);
954
955    if (v != NULL) {
956       ir_constant_data data = { { 0 } };
957
958       const unsigned swiz_idx[4] = {
959          this->mask.x, this->mask.y, this->mask.z, this->mask.w
960       };
961
962       for (unsigned i = 0; i < this->mask.num_components; i++) {
963          switch (v->type->base_type) {
964          case GLSL_TYPE_UINT:
965          case GLSL_TYPE_INT:   data.u[i] = v->value.u[swiz_idx[i]]; break;
966          case GLSL_TYPE_FLOAT: data.f[i] = v->value.f[swiz_idx[i]]; break;
967          case GLSL_TYPE_BOOL:  data.b[i] = v->value.b[swiz_idx[i]]; break;
968          default:              assert(!"Should not get here."); break;
969          }
970       }
971
972       void *ctx = ralloc_parent(this);
973       return new(ctx) ir_constant(this->type, &data);
974    }
975    return NULL;
976 }
977
978
979 void
980 ir_dereference_variable::constant_referenced(struct hash_table *variable_context,
981                                              ir_constant *&store, int &offset) const
982 {
983    if (variable_context) {
984       store = (ir_constant *)hash_table_find(variable_context, var);
985       offset = 0;
986    } else {
987       store = NULL;
988       offset = 0;
989    }
990 }
991
992 ir_constant *
993 ir_dereference_variable::constant_expression_value(struct hash_table *variable_context)
994 {
995    /* This may occur during compile and var->type is glsl_type::error_type */
996    if (!var)
997       return NULL;
998
999    /* Give priority to the context hashtable, if it exists */
1000    if (variable_context) {
1001       ir_constant *value = (ir_constant *)hash_table_find(variable_context, var);
1002       if(value)
1003          return value;
1004    }
1005
1006    /* The constant_value of a uniform variable is its initializer,
1007     * not the lifetime constant value of the uniform.
1008     */
1009    if (var->mode == ir_var_uniform)
1010       return NULL;
1011
1012    if (!var->constant_value)
1013       return NULL;
1014
1015    return var->constant_value->clone(ralloc_parent(var), NULL);
1016 }
1017
1018
1019 void
1020 ir_dereference_array::constant_referenced(struct hash_table *variable_context,
1021                                           ir_constant *&store, int &offset) const
1022 {
1023    ir_constant *index_c = array_index->constant_expression_value(variable_context);
1024
1025    if (!index_c || !index_c->type->is_scalar() || !index_c->type->is_integer()) {
1026       store = 0;
1027       offset = 0;
1028       return;
1029    }
1030
1031    int index = index_c->type->base_type == GLSL_TYPE_INT ?
1032       index_c->get_int_component(0) :
1033       index_c->get_uint_component(0);
1034
1035    ir_constant *substore;
1036    int suboffset;
1037    const ir_dereference *deref = array->as_dereference();
1038    if (!deref) {
1039       store = 0;
1040       offset = 0;
1041       return;
1042    }
1043
1044    deref->constant_referenced(variable_context, substore, suboffset);
1045
1046    if (!substore) {
1047       store = 0;
1048       offset = 0;
1049       return;
1050    }
1051
1052    const glsl_type *vt = substore->type;
1053    if (vt->is_array()) {
1054       store = substore->get_array_element(index);
1055       offset = 0;
1056       return;
1057    }
1058    if (vt->is_matrix()) {
1059       store = substore;
1060       offset = index * vt->vector_elements;
1061       return;
1062    }
1063    if (vt->is_vector()) {
1064       store = substore;
1065       offset = suboffset + index;
1066       return;
1067    }
1068
1069    store = 0;
1070    offset = 0;
1071 }
1072
1073 ir_constant *
1074 ir_dereference_array::constant_expression_value(struct hash_table *variable_context)
1075 {
1076    ir_constant *array = this->array->constant_expression_value(variable_context);
1077    ir_constant *idx = this->array_index->constant_expression_value(variable_context);
1078
1079    if ((array != NULL) && (idx != NULL)) {
1080       void *ctx = ralloc_parent(this);
1081       if (array->type->is_matrix()) {
1082          /* Array access of a matrix results in a vector.
1083           */
1084          const unsigned column = idx->value.u[0];
1085
1086          const glsl_type *const column_type = array->type->column_type();
1087
1088          /* Offset in the constant matrix to the first element of the column
1089           * to be extracted.
1090           */
1091          const unsigned mat_idx = column * column_type->vector_elements;
1092
1093          ir_constant_data data = { { 0 } };
1094
1095          switch (column_type->base_type) {
1096          case GLSL_TYPE_UINT:
1097          case GLSL_TYPE_INT:
1098             for (unsigned i = 0; i < column_type->vector_elements; i++)
1099                data.u[i] = array->value.u[mat_idx + i];
1100
1101             break;
1102
1103          case GLSL_TYPE_FLOAT:
1104             for (unsigned i = 0; i < column_type->vector_elements; i++)
1105                data.f[i] = array->value.f[mat_idx + i];
1106
1107             break;
1108
1109          default:
1110             assert(!"Should not get here.");
1111             break;
1112          }
1113
1114          return new(ctx) ir_constant(column_type, &data);
1115       } else if (array->type->is_vector()) {
1116          const unsigned component = idx->value.u[0];
1117
1118          return new(ctx) ir_constant(array, component);
1119       } else {
1120          const unsigned index = idx->value.u[0];
1121          return array->get_array_element(index)->clone(ctx, NULL);
1122       }
1123    }
1124    return NULL;
1125 }
1126
1127
1128 void
1129 ir_dereference_record::constant_referenced(struct hash_table *variable_context,
1130                                            ir_constant *&store, int &offset) const
1131 {
1132    ir_constant *substore;
1133    int suboffset;
1134    const ir_dereference *deref = record->as_dereference();
1135    if (!deref) {
1136       store = 0;
1137       offset = 0;
1138       return;
1139    }
1140
1141    deref->constant_referenced(variable_context, substore, suboffset);
1142
1143    if (!substore) {
1144       store = 0;
1145       offset = 0;
1146       return;
1147    }
1148
1149    store = substore->get_record_field(field);
1150    offset = 0;
1151 }
1152
1153 ir_constant *
1154 ir_dereference_record::constant_expression_value(struct hash_table *variable_context)
1155 {
1156    ir_constant *v = this->record->constant_expression_value();
1157
1158    return (v != NULL) ? v->get_record_field(this->field) : NULL;
1159 }
1160
1161
1162 ir_constant *
1163 ir_assignment::constant_expression_value(struct hash_table *variable_context)
1164 {
1165    /* FINISHME: Handle CEs involving assignment (return RHS) */
1166    return NULL;
1167 }
1168
1169
1170 ir_constant *
1171 ir_constant::constant_expression_value(struct hash_table *variable_context)
1172 {
1173    return this;
1174 }
1175
1176
1177 ir_constant *
1178 ir_call::constant_expression_value(struct hash_table *variable_context)
1179 {
1180    return this->callee->constant_expression_value(&this->actual_parameters, variable_context);
1181 }
1182
1183
1184 bool ir_function_signature::constant_expression_evaluate_expression_list(const struct exec_list &body,
1185                                                                          struct hash_table *variable_context,
1186                                                                          ir_constant **result)
1187 {
1188    foreach_list(n, &body) {
1189       ir_instruction *inst = (ir_instruction *)n;
1190       switch(inst->ir_type) {
1191
1192          /* (declare () type symbol) */
1193       case ir_type_variable: {
1194          ir_variable *var = inst->as_variable();
1195          hash_table_insert(variable_context, ir_constant::zero(this, var->type), var);
1196          break;
1197       }
1198
1199          /* (assign [condition] (write-mask) (ref) (value)) */
1200       case ir_type_assignment: {
1201          ir_assignment *asg = inst->as_assignment();
1202          if (asg->condition) {
1203             ir_constant *cond = asg->condition->constant_expression_value(variable_context);
1204             if (!cond)
1205                return false;
1206             if (!cond->get_bool_component(0))
1207                break;
1208          }
1209
1210          ir_constant *store = NULL;
1211          int offset = 0;
1212          asg->lhs->constant_referenced(variable_context, store, offset);
1213
1214          if (!store)
1215             return false;
1216
1217          ir_constant *value = asg->rhs->constant_expression_value(variable_context);
1218
1219          if (!value)
1220             return false;
1221
1222          store->copy_masked_offset(value, offset, asg->write_mask);
1223          break;
1224       }
1225
1226          /* (return (expression)) */
1227       case ir_type_return:
1228          assert (result);
1229          *result = inst->as_return()->value->constant_expression_value(variable_context);
1230          return *result != NULL;
1231
1232          /* (call name (ref) (params))*/
1233       case ir_type_call: {
1234          ir_call *call = inst->as_call();
1235
1236          /* Just say no to void functions in constant expressions.  We
1237           * don't need them at that point.
1238           */
1239
1240          if (!call->return_deref)
1241             return false;
1242
1243          ir_constant *store = NULL;
1244          int offset = 0;
1245          call->return_deref->constant_referenced(variable_context, store, offset);
1246
1247          if (!store)
1248             return false;
1249
1250          ir_constant *value = call->constant_expression_value(variable_context);
1251
1252          if(!value)
1253             return false;
1254
1255          store->copy_offset(value, offset);
1256          break;
1257       }
1258
1259          /* (if condition (then-instructions) (else-instructions)) */
1260       case ir_type_if: {
1261          ir_if *iif = inst->as_if();
1262
1263          ir_constant *cond = iif->condition->constant_expression_value(variable_context);
1264          if (!cond || !cond->type->is_boolean())
1265             return false;
1266
1267          exec_list &branch = cond->get_bool_component(0) ? iif->then_instructions : iif->else_instructions;
1268
1269          *result = NULL;
1270          if (!constant_expression_evaluate_expression_list(branch, variable_context, result))
1271             return false;
1272
1273          /* If there was a return in the branch chosen, drop out now. */
1274          if (*result)
1275             return true;
1276
1277          break;
1278       }
1279
1280          /* Every other expression type, we drop out. */
1281       default:
1282          return false;
1283       }
1284    }
1285
1286    /* Reaching the end of the block is not an error condition */
1287    if (result)
1288       *result = NULL;
1289
1290    return true;
1291 }
1292
1293 ir_constant *
1294 ir_function_signature::constant_expression_value(exec_list *actual_parameters, struct hash_table *variable_context)
1295 {
1296    const glsl_type *type = this->return_type;
1297    if (type == glsl_type::void_type)
1298       return NULL;
1299
1300    /* From the GLSL 1.20 spec, page 23:
1301     * "Function calls to user-defined functions (non-built-in functions)
1302     *  cannot be used to form constant expressions."
1303     */
1304    if (!this->is_builtin)
1305       return NULL;
1306
1307    /*
1308     * Of the builtin functions, only the texture lookups and the noise
1309     * ones must not be used in constant expressions.  They all include
1310     * specific opcodes so they don't need to be special-cased at this
1311     * point.
1312     */
1313
1314    /* Initialize the table of dereferencable names with the function
1315     * parameters.  Verify their const-ness on the way.
1316     *
1317     * We expect the correctness of the number of parameters to have
1318     * been checked earlier.
1319     */
1320    hash_table *deref_hash = hash_table_ctor(8, hash_table_pointer_hash,
1321                                             hash_table_pointer_compare);
1322
1323    /* If "origin" is non-NULL, then the function body is there.  So we
1324     * have to use the variable objects from the object with the body,
1325     * but the parameter instanciation on the current object.
1326     */
1327    const exec_node *parameter_info = origin ? origin->parameters.head : parameters.head;
1328
1329    foreach_list(n, actual_parameters) {
1330       ir_constant *constant = ((ir_rvalue *) n)->constant_expression_value(variable_context);
1331       if (constant == NULL) {
1332          hash_table_dtor(deref_hash);
1333          return NULL;
1334       }
1335
1336
1337       ir_variable *var = (ir_variable *)parameter_info;
1338       hash_table_insert(deref_hash, constant, var);
1339
1340       parameter_info = parameter_info->next;
1341    }
1342
1343    ir_constant *result = NULL;
1344
1345    /* Now run the builtin function until something non-constant
1346     * happens or we get the result.
1347     */
1348    if (constant_expression_evaluate_expression_list(origin ? origin->body : body, deref_hash, &result) && result)
1349       result = result->clone(ralloc_parent(this), NULL);
1350
1351    hash_table_dtor(deref_hash);
1352
1353    return result;
1354 }