~ubuntu-branches/ubuntu/natty/mesa/natty-proposed

« back to all changes in this revision

Viewing changes to src/glsl/ir.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Robert Hooker, Robert Hooker, Christopher James Halse Rogers
  • Date: 2010-09-14 08:55:40 UTC
  • mfrom: (1.2.28 upstream)
  • Revision ID: james.westby@ubuntu.com-20100914085540-m4fpl0hdjlfd4jgz
Tags: 7.9~git20100909-0ubuntu1
[ Robert Hooker ]
* New upstream git snapshot up to commit 94118fe2d4b1e5 (LP: #631413)
* New features include ATI HD5xxx series support in r600, and a vastly
  improved glsl compiler.
* Remove pre-generated .pc's, use the ones generated at build time
  instead.
* Remove all references to mesa-utils now that its no longer shipped
  with the mesa source.
* Disable the experimental ARB_fragment_shader option by default on
  i915, it exposes incomplete functionality that breaks KDE compositing
  among other things. It can be enabled via driconf still. (LP: #628930).

[ Christopher James Halse Rogers ]
* debian/patches/04_osmesa_version.diff:
  - Refresh for new upstream
* Bugs fixed in this release:
  - Fixes severe rendering corruption in Unity on radeon (LP: #628727,
    LP: #596292, LP: #599741, LP: #630315, LP: #613694, LP: #599741).
  - Also fixes rendering in gnome-shell (LP: #578619).
  - Flickering in OpenGL apps on radeon (LP: #626943, LP: #610541).
  - Provides preliminary support for new intel chips (LP: #601052).
* debian/rules:
  - Update configure flags to match upstream reshuffling.
  - Explicitly remove gallium DRI drivers that we don't want to ship.
* Update debian/gbp.conf for this Maverick-specific packaging
* libegl1-mesa-dri-x11,kms: There are no longer separate kms or x11 drivers
  for EGL, libegl1-mesa-drivers now contains a single driver that provides
  both backends.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright © 2010 Intel Corporation
 
3
 *
 
4
 * Permission is hereby granted, free of charge, to any person obtaining a
 
5
 * copy of this software and associated documentation files (the "Software"),
 
6
 * to deal in the Software without restriction, including without limitation
 
7
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 
8
 * and/or sell copies of the Software, and to permit persons to whom the
 
9
 * Software is furnished to do so, subject to the following conditions:
 
10
 *
 
11
 * The above copyright notice and this permission notice (including the next
 
12
 * paragraph) shall be included in all copies or substantial portions of the
 
13
 * Software.
 
14
 *
 
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 
21
 * DEALINGS IN THE SOFTWARE.
 
22
 */
 
23
#include <string.h>
 
24
#include "main/core.h" /* for MAX2 */
 
25
#include "ir.h"
 
26
#include "ir_visitor.h"
 
27
#include "glsl_types.h"
 
28
 
 
29
ir_rvalue::ir_rvalue()
 
30
{
 
31
   this->type = glsl_type::error_type;
 
32
}
 
33
 
 
34
/**
 
35
 * Modify the swizzle make to move one component to another
 
36
 *
 
37
 * \param m    IR swizzle to be modified
 
38
 * \param from Component in the RHS that is to be swizzled
 
39
 * \param to   Desired swizzle location of \c from
 
40
 */
 
41
static void
 
42
update_rhs_swizzle(ir_swizzle_mask &m, unsigned from, unsigned to)
 
43
{
 
44
   switch (to) {
 
45
   case 0: m.x = from; break;
 
46
   case 1: m.y = from; break;
 
47
   case 2: m.z = from; break;
 
48
   case 3: m.w = from; break;
 
49
   default: assert(!"Should not get here.");
 
50
   }
 
51
 
 
52
   m.num_components = MAX2(m.num_components, (to + 1));
 
53
}
 
54
 
 
55
void
 
56
ir_assignment::set_lhs(ir_rvalue *lhs)
 
57
{
 
58
   while (lhs != NULL) {
 
59
      ir_swizzle *swiz = lhs->as_swizzle();
 
60
 
 
61
      if (swiz == NULL)
 
62
         break;
 
63
 
 
64
      unsigned write_mask = 0;
 
65
      ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
 
66
 
 
67
      for (unsigned i = 0; i < swiz->mask.num_components; i++) {
 
68
         unsigned c = 0;
 
69
 
 
70
         switch (i) {
 
71
         case 0: c = swiz->mask.x; break;
 
72
         case 1: c = swiz->mask.y; break;
 
73
         case 2: c = swiz->mask.z; break;
 
74
         case 3: c = swiz->mask.w; break;
 
75
         default: assert(!"Should not get here.");
 
76
         }
 
77
 
 
78
         write_mask |= (((this->write_mask >> i) & 1) << c);
 
79
         update_rhs_swizzle(rhs_swiz, i, c);
 
80
      }
 
81
 
 
82
      this->write_mask = write_mask;
 
83
      lhs = swiz->val;
 
84
 
 
85
      this->rhs = new(this) ir_swizzle(this->rhs, rhs_swiz);
 
86
   }
 
87
 
 
88
   assert((lhs == NULL) || lhs->as_dereference());
 
89
 
 
90
   this->lhs = (ir_dereference *) lhs;
 
91
}
 
92
 
 
93
ir_variable *
 
94
ir_assignment::whole_variable_written()
 
95
{
 
96
   ir_variable *v = this->lhs->whole_variable_referenced();
 
97
 
 
98
   if (v == NULL)
 
99
      return NULL;
 
100
 
 
101
   if (v->type->is_scalar())
 
102
      return v;
 
103
 
 
104
   if (v->type->is_vector()) {
 
105
      const unsigned mask = (1U << v->type->vector_elements) - 1;
 
106
 
 
107
      if (mask != this->write_mask)
 
108
         return NULL;
 
109
   }
 
110
 
 
111
   /* Either all the vector components are assigned or the variable is some
 
112
    * composite type (and the whole thing is assigned.
 
113
    */
 
114
   return v;
 
115
}
 
116
 
 
117
ir_assignment::ir_assignment(ir_dereference *lhs, ir_rvalue *rhs,
 
118
                             ir_rvalue *condition, unsigned write_mask)
 
119
{
 
120
   this->ir_type = ir_type_assignment;
 
121
   this->condition = condition;
 
122
   this->rhs = rhs;
 
123
   this->lhs = lhs;
 
124
   this->write_mask = write_mask;
 
125
}
 
126
 
 
127
ir_assignment::ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs,
 
128
                             ir_rvalue *condition)
 
129
{
 
130
   this->ir_type = ir_type_assignment;
 
131
   this->condition = condition;
 
132
   this->rhs = rhs;
 
133
 
 
134
   /* If the RHS is a vector type, assume that all components of the vector
 
135
    * type are being written to the LHS.  The write mask comes from the RHS
 
136
    * because we can have a case where the LHS is a vec4 and the RHS is a
 
137
    * vec3.  In that case, the assignment is:
 
138
    *
 
139
    *     (assign (...) (xyz) (var_ref lhs) (var_ref rhs))
 
140
    */
 
141
   if (rhs->type->is_vector())
 
142
      this->write_mask = (1U << rhs->type->vector_elements) - 1;
 
143
   else if (rhs->type->is_scalar())
 
144
      this->write_mask = 1;
 
145
   else
 
146
      this->write_mask = 0;
 
147
 
 
148
   this->set_lhs(lhs);
 
149
}
 
150
 
 
151
 
 
152
ir_expression::ir_expression(int op, const struct glsl_type *type,
 
153
                             ir_rvalue *op0, ir_rvalue *op1)
 
154
{
 
155
   this->ir_type = ir_type_expression;
 
156
   this->type = type;
 
157
   this->operation = ir_expression_operation(op);
 
158
   this->operands[0] = op0;
 
159
   this->operands[1] = op1;
 
160
}
 
161
 
 
162
unsigned int
 
163
ir_expression::get_num_operands(ir_expression_operation op)
 
164
{
 
165
/* Update ir_print_visitor.cpp when updating this list. */
 
166
   const int num_operands[] = {
 
167
      1, /* ir_unop_bit_not */
 
168
      1, /* ir_unop_logic_not */
 
169
      1, /* ir_unop_neg */
 
170
      1, /* ir_unop_abs */
 
171
      1, /* ir_unop_sign */
 
172
      1, /* ir_unop_rcp */
 
173
      1, /* ir_unop_rsq */
 
174
      1, /* ir_unop_sqrt */
 
175
      1, /* ir_unop_exp */
 
176
      1, /* ir_unop_log */
 
177
      1, /* ir_unop_exp2 */
 
178
      1, /* ir_unop_log2 */
 
179
      1, /* ir_unop_f2i */
 
180
      1, /* ir_unop_i2f */
 
181
      1, /* ir_unop_f2b */
 
182
      1, /* ir_unop_b2f */
 
183
      1, /* ir_unop_i2b */
 
184
      1, /* ir_unop_b2i */
 
185
      1, /* ir_unop_u2f */
 
186
      1, /* ir_unop_any */
 
187
 
 
188
      1, /* ir_unop_trunc */
 
189
      1, /* ir_unop_ceil */
 
190
      1, /* ir_unop_floor */
 
191
      1, /* ir_unop_fract */
 
192
 
 
193
      1, /* ir_unop_sin */
 
194
      1, /* ir_unop_cos */
 
195
 
 
196
      1, /* ir_unop_dFdx */
 
197
      1, /* ir_unop_dFdy */
 
198
 
 
199
      2, /* ir_binop_add */
 
200
      2, /* ir_binop_sub */
 
201
      2, /* ir_binop_mul */
 
202
      2, /* ir_binop_div */
 
203
      2, /* ir_binop_mod */
 
204
 
 
205
      2, /* ir_binop_less */
 
206
      2, /* ir_binop_greater */
 
207
      2, /* ir_binop_lequal */
 
208
      2, /* ir_binop_gequal */
 
209
      2, /* ir_binop_equal */
 
210
      2, /* ir_binop_nequal */
 
211
 
 
212
      2, /* ir_binop_lshift */
 
213
      2, /* ir_binop_rshift */
 
214
      2, /* ir_binop_bit_and */
 
215
      2, /* ir_binop_bit_xor */
 
216
      2, /* ir_binop_bit_or */
 
217
 
 
218
      2, /* ir_binop_logic_and */
 
219
      2, /* ir_binop_logic_xor */
 
220
      2, /* ir_binop_logic_or */
 
221
 
 
222
      2, /* ir_binop_dot */
 
223
      2, /* ir_binop_cross */
 
224
      2, /* ir_binop_min */
 
225
      2, /* ir_binop_max */
 
226
 
 
227
      2, /* ir_binop_pow */
 
228
   };
 
229
 
 
230
   assert(sizeof(num_operands) / sizeof(num_operands[0]) == ir_binop_pow + 1);
 
231
 
 
232
   return num_operands[op];
 
233
}
 
234
 
 
235
static const char *const operator_strs[] = {
 
236
   "~",
 
237
   "!",
 
238
   "neg",
 
239
   "abs",
 
240
   "sign",
 
241
   "rcp",
 
242
   "rsq",
 
243
   "sqrt",
 
244
   "exp",
 
245
   "log",
 
246
   "exp2",
 
247
   "log2",
 
248
   "f2i",
 
249
   "i2f",
 
250
   "f2b",
 
251
   "b2f",
 
252
   "i2b",
 
253
   "b2i",
 
254
   "u2f",
 
255
   "any",
 
256
   "trunc",
 
257
   "ceil",
 
258
   "floor",
 
259
   "fract",
 
260
   "sin",
 
261
   "cos",
 
262
   "dFdx",
 
263
   "dFdy",
 
264
   "+",
 
265
   "-",
 
266
   "*",
 
267
   "/",
 
268
   "%",
 
269
   "<",
 
270
   ">",
 
271
   "<=",
 
272
   ">=",
 
273
   "==",
 
274
   "!=",
 
275
   "<<",
 
276
   ">>",
 
277
   "&",
 
278
   "^",
 
279
   "|",
 
280
   "&&",
 
281
   "^^",
 
282
   "||",
 
283
   "dot",
 
284
   "cross",
 
285
   "min",
 
286
   "max",
 
287
   "pow",
 
288
};
 
289
 
 
290
const char *ir_expression::operator_string(ir_expression_operation op)
 
291
{
 
292
   assert((unsigned int) op < Elements(operator_strs));
 
293
   return operator_strs[op];
 
294
}
 
295
 
 
296
const char *ir_expression::operator_string()
 
297
{
 
298
   return operator_string(this->operation);
 
299
}
 
300
 
 
301
ir_expression_operation
 
302
ir_expression::get_operator(const char *str)
 
303
{
 
304
   const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
 
305
   for (int op = 0; op < operator_count; op++) {
 
306
      if (strcmp(str, operator_strs[op]) == 0)
 
307
         return (ir_expression_operation) op;
 
308
   }
 
309
   return (ir_expression_operation) -1;
 
310
}
 
311
 
 
312
ir_constant::ir_constant()
 
313
{
 
314
   this->ir_type = ir_type_constant;
 
315
}
 
316
 
 
317
ir_constant::ir_constant(const struct glsl_type *type,
 
318
                         const ir_constant_data *data)
 
319
{
 
320
   assert((type->base_type >= GLSL_TYPE_UINT)
 
321
          && (type->base_type <= GLSL_TYPE_BOOL));
 
322
 
 
323
   this->ir_type = ir_type_constant;
 
324
   this->type = type;
 
325
   memcpy(& this->value, data, sizeof(this->value));
 
326
}
 
327
 
 
328
ir_constant::ir_constant(float f)
 
329
{
 
330
   this->ir_type = ir_type_constant;
 
331
   this->type = glsl_type::float_type;
 
332
   this->value.f[0] = f;
 
333
   for (int i = 1; i < 16; i++)  {
 
334
      this->value.f[i] = 0;
 
335
   }
 
336
}
 
337
 
 
338
ir_constant::ir_constant(unsigned int u)
 
339
{
 
340
   this->ir_type = ir_type_constant;
 
341
   this->type = glsl_type::uint_type;
 
342
   this->value.u[0] = u;
 
343
   for (int i = 1; i < 16; i++) {
 
344
      this->value.u[i] = 0;
 
345
   }
 
346
}
 
347
 
 
348
ir_constant::ir_constant(int i)
 
349
{
 
350
   this->ir_type = ir_type_constant;
 
351
   this->type = glsl_type::int_type;
 
352
   this->value.i[0] = i;
 
353
   for (int i = 1; i < 16; i++) {
 
354
      this->value.i[i] = 0;
 
355
   }
 
356
}
 
357
 
 
358
ir_constant::ir_constant(bool b)
 
359
{
 
360
   this->ir_type = ir_type_constant;
 
361
   this->type = glsl_type::bool_type;
 
362
   this->value.b[0] = b;
 
363
   for (int i = 1; i < 16; i++) {
 
364
      this->value.b[i] = false;
 
365
   }
 
366
}
 
367
 
 
368
ir_constant::ir_constant(const ir_constant *c, unsigned i)
 
369
{
 
370
   this->ir_type = ir_type_constant;
 
371
   this->type = c->type->get_base_type();
 
372
 
 
373
   switch (this->type->base_type) {
 
374
   case GLSL_TYPE_UINT:  this->value.u[0] = c->value.u[i]; break;
 
375
   case GLSL_TYPE_INT:   this->value.i[0] = c->value.i[i]; break;
 
376
   case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
 
377
   case GLSL_TYPE_BOOL:  this->value.b[0] = c->value.b[i]; break;
 
378
   default:              assert(!"Should not get here."); break;
 
379
   }
 
380
}
 
381
 
 
382
ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
 
383
{
 
384
   this->ir_type = ir_type_constant;
 
385
   this->type = type;
 
386
 
 
387
   assert(type->is_scalar() || type->is_vector() || type->is_matrix()
 
388
          || type->is_record() || type->is_array());
 
389
 
 
390
   if (type->is_array()) {
 
391
      this->array_elements = talloc_array(this, ir_constant *, type->length);
 
392
      unsigned i = 0;
 
393
      foreach_list(node, value_list) {
 
394
         ir_constant *value = (ir_constant *) node;
 
395
         assert(value->as_constant() != NULL);
 
396
 
 
397
         this->array_elements[i++] = value;
 
398
      }
 
399
      return;
 
400
   }
 
401
 
 
402
   /* If the constant is a record, the types of each of the entries in
 
403
    * value_list must be a 1-for-1 match with the structure components.  Each
 
404
    * entry must also be a constant.  Just move the nodes from the value_list
 
405
    * to the list in the ir_constant.
 
406
    */
 
407
   /* FINISHME: Should there be some type checking and / or assertions here? */
 
408
   /* FINISHME: Should the new constant take ownership of the nodes from
 
409
    * FINISHME: value_list, or should it make copies?
 
410
    */
 
411
   if (type->is_record()) {
 
412
      value_list->move_nodes_to(& this->components);
 
413
      return;
 
414
   }
 
415
 
 
416
   for (unsigned i = 0; i < 16; i++) {
 
417
      this->value.u[i] = 0;
 
418
   }
 
419
 
 
420
   ir_constant *value = (ir_constant *) (value_list->head);
 
421
 
 
422
   /* Constructors with exactly one scalar argument are special for vectors
 
423
    * and matrices.  For vectors, the scalar value is replicated to fill all
 
424
    * the components.  For matrices, the scalar fills the components of the
 
425
    * diagonal while the rest is filled with 0.
 
426
    */
 
427
   if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
 
428
      if (type->is_matrix()) {
 
429
         /* Matrix - fill diagonal (rest is already set to 0) */
 
430
         assert(type->base_type == GLSL_TYPE_FLOAT);
 
431
         for (unsigned i = 0; i < type->matrix_columns; i++)
 
432
            this->value.f[i * type->vector_elements + i] = value->value.f[0];
 
433
      } else {
 
434
         /* Vector or scalar - fill all components */
 
435
         switch (type->base_type) {
 
436
         case GLSL_TYPE_UINT:
 
437
         case GLSL_TYPE_INT:
 
438
            for (unsigned i = 0; i < type->components(); i++)
 
439
               this->value.u[i] = value->value.u[0];
 
440
            break;
 
441
         case GLSL_TYPE_FLOAT:
 
442
            for (unsigned i = 0; i < type->components(); i++)
 
443
               this->value.f[i] = value->value.f[0];
 
444
            break;
 
445
         case GLSL_TYPE_BOOL:
 
446
            for (unsigned i = 0; i < type->components(); i++)
 
447
               this->value.b[i] = value->value.b[0];
 
448
            break;
 
449
         default:
 
450
            assert(!"Should not get here.");
 
451
            break;
 
452
         }
 
453
      }
 
454
      return;
 
455
   }
 
456
 
 
457
   if (type->is_matrix() && value->type->is_matrix()) {
 
458
      assert(value->next->is_tail_sentinel());
 
459
 
 
460
      /* From section 5.4.2 of the GLSL 1.20 spec:
 
461
       * "If a matrix is constructed from a matrix, then each component
 
462
       *  (column i, row j) in the result that has a corresponding component
 
463
       *  (column i, row j) in the argument will be initialized from there."
 
464
       */
 
465
      unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
 
466
      unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
 
467
      for (unsigned i = 0; i < cols; i++) {
 
468
         for (unsigned j = 0; j < rows; j++) {
 
469
            const unsigned src = i * value->type->vector_elements + j;
 
470
            const unsigned dst = i * type->vector_elements + j;
 
471
            this->value.f[dst] = value->value.f[src];
 
472
         }
 
473
      }
 
474
 
 
475
      /* "All other components will be initialized to the identity matrix." */
 
476
      for (unsigned i = cols; i < type->matrix_columns; i++)
 
477
         this->value.f[i * type->vector_elements + i] = 1.0;
 
478
 
 
479
      return;
 
480
   }
 
481
 
 
482
   /* Use each component from each entry in the value_list to initialize one
 
483
    * component of the constant being constructed.
 
484
    */
 
485
   for (unsigned i = 0; i < type->components(); /* empty */) {
 
486
      assert(value->as_constant() != NULL);
 
487
      assert(!value->is_tail_sentinel());
 
488
 
 
489
      for (unsigned j = 0; j < value->type->components(); j++) {
 
490
         switch (type->base_type) {
 
491
         case GLSL_TYPE_UINT:
 
492
            this->value.u[i] = value->get_uint_component(j);
 
493
            break;
 
494
         case GLSL_TYPE_INT:
 
495
            this->value.i[i] = value->get_int_component(j);
 
496
            break;
 
497
         case GLSL_TYPE_FLOAT:
 
498
            this->value.f[i] = value->get_float_component(j);
 
499
            break;
 
500
         case GLSL_TYPE_BOOL:
 
501
            this->value.b[i] = value->get_bool_component(j);
 
502
            break;
 
503
         default:
 
504
            /* FINISHME: What to do?  Exceptions are not the answer.
 
505
             */
 
506
            break;
 
507
         }
 
508
 
 
509
         i++;
 
510
         if (i >= type->components())
 
511
            break;
 
512
      }
 
513
 
 
514
      value = (ir_constant *) value->next;
 
515
   }
 
516
}
 
517
 
 
518
ir_constant *
 
519
ir_constant::zero(void *mem_ctx, const glsl_type *type)
 
520
{
 
521
   assert(type->is_numeric() || type->is_boolean());
 
522
 
 
523
   ir_constant *c = new(mem_ctx) ir_constant;
 
524
   c->type = type;
 
525
   memset(&c->value, 0, sizeof(c->value));
 
526
 
 
527
   return c;
 
528
}
 
529
 
 
530
bool
 
531
ir_constant::get_bool_component(unsigned i) const
 
532
{
 
533
   switch (this->type->base_type) {
 
534
   case GLSL_TYPE_UINT:  return this->value.u[i] != 0;
 
535
   case GLSL_TYPE_INT:   return this->value.i[i] != 0;
 
536
   case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
 
537
   case GLSL_TYPE_BOOL:  return this->value.b[i];
 
538
   default:              assert(!"Should not get here."); break;
 
539
   }
 
540
 
 
541
   /* Must return something to make the compiler happy.  This is clearly an
 
542
    * error case.
 
543
    */
 
544
   return false;
 
545
}
 
546
 
 
547
float
 
548
ir_constant::get_float_component(unsigned i) const
 
549
{
 
550
   switch (this->type->base_type) {
 
551
   case GLSL_TYPE_UINT:  return (float) this->value.u[i];
 
552
   case GLSL_TYPE_INT:   return (float) this->value.i[i];
 
553
   case GLSL_TYPE_FLOAT: return this->value.f[i];
 
554
   case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1.0 : 0.0;
 
555
   default:              assert(!"Should not get here."); break;
 
556
   }
 
557
 
 
558
   /* Must return something to make the compiler happy.  This is clearly an
 
559
    * error case.
 
560
    */
 
561
   return 0.0;
 
562
}
 
563
 
 
564
int
 
565
ir_constant::get_int_component(unsigned i) const
 
566
{
 
567
   switch (this->type->base_type) {
 
568
   case GLSL_TYPE_UINT:  return this->value.u[i];
 
569
   case GLSL_TYPE_INT:   return this->value.i[i];
 
570
   case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
 
571
   case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1 : 0;
 
572
   default:              assert(!"Should not get here."); break;
 
573
   }
 
574
 
 
575
   /* Must return something to make the compiler happy.  This is clearly an
 
576
    * error case.
 
577
    */
 
578
   return 0;
 
579
}
 
580
 
 
581
unsigned
 
582
ir_constant::get_uint_component(unsigned i) const
 
583
{
 
584
   switch (this->type->base_type) {
 
585
   case GLSL_TYPE_UINT:  return this->value.u[i];
 
586
   case GLSL_TYPE_INT:   return this->value.i[i];
 
587
   case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
 
588
   case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1 : 0;
 
589
   default:              assert(!"Should not get here."); break;
 
590
   }
 
591
 
 
592
   /* Must return something to make the compiler happy.  This is clearly an
 
593
    * error case.
 
594
    */
 
595
   return 0;
 
596
}
 
597
 
 
598
ir_constant *
 
599
ir_constant::get_array_element(unsigned i) const
 
600
{
 
601
   assert(this->type->is_array());
 
602
 
 
603
   /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
 
604
    *
 
605
    *     "Behavior is undefined if a shader subscripts an array with an index
 
606
    *     less than 0 or greater than or equal to the size the array was
 
607
    *     declared with."
 
608
    *
 
609
    * Most out-of-bounds accesses are removed before things could get this far.
 
610
    * There are cases where non-constant array index values can get constant
 
611
    * folded.
 
612
    */
 
613
   if (int(i) < 0)
 
614
      i = 0;
 
615
   else if (i >= this->type->length)
 
616
      i = this->type->length - 1;
 
617
 
 
618
   return array_elements[i];
 
619
}
 
620
 
 
621
ir_constant *
 
622
ir_constant::get_record_field(const char *name)
 
623
{
 
624
   int idx = this->type->field_index(name);
 
625
 
 
626
   if (idx < 0)
 
627
      return NULL;
 
628
 
 
629
   if (this->components.is_empty())
 
630
      return NULL;
 
631
 
 
632
   exec_node *node = this->components.head;
 
633
   for (int i = 0; i < idx; i++) {
 
634
      node = node->next;
 
635
 
 
636
      /* If the end of the list is encountered before the element matching the
 
637
       * requested field is found, return NULL.
 
638
       */
 
639
      if (node->is_tail_sentinel())
 
640
         return NULL;
 
641
   }
 
642
 
 
643
   return (ir_constant *) node;
 
644
}
 
645
 
 
646
 
 
647
bool
 
648
ir_constant::has_value(const ir_constant *c) const
 
649
{
 
650
   if (this->type != c->type)
 
651
      return false;
 
652
 
 
653
   if (this->type->is_array()) {
 
654
      for (unsigned i = 0; i < this->type->length; i++) {
 
655
         if (this->array_elements[i]->has_value(c->array_elements[i]))
 
656
            return false;
 
657
      }
 
658
      return true;
 
659
   }
 
660
 
 
661
   if (this->type->base_type == GLSL_TYPE_STRUCT) {
 
662
      const exec_node *a_node = this->components.head;
 
663
      const exec_node *b_node = c->components.head;
 
664
 
 
665
      while (!a_node->is_tail_sentinel()) {
 
666
         assert(!b_node->is_tail_sentinel());
 
667
 
 
668
         const ir_constant *const a_field = (ir_constant *) a_node;
 
669
         const ir_constant *const b_field = (ir_constant *) b_node;
 
670
 
 
671
         if (!a_field->has_value(b_field))
 
672
            return false;
 
673
 
 
674
         a_node = a_node->next;
 
675
         b_node = b_node->next;
 
676
      }
 
677
 
 
678
      return true;
 
679
   }
 
680
 
 
681
   for (unsigned i = 0; i < this->type->components(); i++) {
 
682
      switch (this->type->base_type) {
 
683
      case GLSL_TYPE_UINT:
 
684
         if (this->value.u[i] != c->value.u[i])
 
685
            return false;
 
686
         break;
 
687
      case GLSL_TYPE_INT:
 
688
         if (this->value.i[i] != c->value.i[i])
 
689
            return false;
 
690
         break;
 
691
      case GLSL_TYPE_FLOAT:
 
692
         if (this->value.f[i] != c->value.f[i])
 
693
            return false;
 
694
         break;
 
695
      case GLSL_TYPE_BOOL:
 
696
         if (this->value.b[i] != c->value.b[i])
 
697
            return false;
 
698
         break;
 
699
      default:
 
700
         assert(!"Should not get here.");
 
701
         return false;
 
702
      }
 
703
   }
 
704
 
 
705
   return true;
 
706
}
 
707
 
 
708
 
 
709
ir_loop::ir_loop()
 
710
{
 
711
   this->ir_type = ir_type_loop;
 
712
   this->cmp = ir_unop_neg;
 
713
   this->from = NULL;
 
714
   this->to = NULL;
 
715
   this->increment = NULL;
 
716
   this->counter = NULL;
 
717
}
 
718
 
 
719
 
 
720
ir_dereference_variable::ir_dereference_variable(ir_variable *var)
 
721
{
 
722
   this->ir_type = ir_type_dereference_variable;
 
723
   this->var = var;
 
724
   this->type = (var != NULL) ? var->type : glsl_type::error_type;
 
725
}
 
726
 
 
727
 
 
728
ir_dereference_array::ir_dereference_array(ir_rvalue *value,
 
729
                                           ir_rvalue *array_index)
 
730
{
 
731
   this->ir_type = ir_type_dereference_array;
 
732
   this->array_index = array_index;
 
733
   this->set_array(value);
 
734
}
 
735
 
 
736
 
 
737
ir_dereference_array::ir_dereference_array(ir_variable *var,
 
738
                                           ir_rvalue *array_index)
 
739
{
 
740
   void *ctx = talloc_parent(var);
 
741
 
 
742
   this->ir_type = ir_type_dereference_array;
 
743
   this->array_index = array_index;
 
744
   this->set_array(new(ctx) ir_dereference_variable(var));
 
745
}
 
746
 
 
747
 
 
748
void
 
749
ir_dereference_array::set_array(ir_rvalue *value)
 
750
{
 
751
   this->array = value;
 
752
   this->type = glsl_type::error_type;
 
753
 
 
754
   if (this->array != NULL) {
 
755
      const glsl_type *const vt = this->array->type;
 
756
 
 
757
      if (vt->is_array()) {
 
758
         type = vt->element_type();
 
759
      } else if (vt->is_matrix()) {
 
760
         type = vt->column_type();
 
761
      } else if (vt->is_vector()) {
 
762
         type = vt->get_base_type();
 
763
      }
 
764
   }
 
765
}
 
766
 
 
767
 
 
768
ir_dereference_record::ir_dereference_record(ir_rvalue *value,
 
769
                                             const char *field)
 
770
{
 
771
   this->ir_type = ir_type_dereference_record;
 
772
   this->record = value;
 
773
   this->field = talloc_strdup(this, field);
 
774
   this->type = (this->record != NULL)
 
775
      ? this->record->type->field_type(field) : glsl_type::error_type;
 
776
}
 
777
 
 
778
 
 
779
ir_dereference_record::ir_dereference_record(ir_variable *var,
 
780
                                             const char *field)
 
781
{
 
782
   void *ctx = talloc_parent(var);
 
783
 
 
784
   this->ir_type = ir_type_dereference_record;
 
785
   this->record = new(ctx) ir_dereference_variable(var);
 
786
   this->field = talloc_strdup(this, field);
 
787
   this->type = (this->record != NULL)
 
788
      ? this->record->type->field_type(field) : glsl_type::error_type;
 
789
}
 
790
 
 
791
bool type_contains_sampler(const glsl_type *type)
 
792
{
 
793
   if (type->is_array()) {
 
794
      return type_contains_sampler(type->fields.array);
 
795
   } else if (type->is_record()) {
 
796
      for (unsigned int i = 0; i < type->length; i++) {
 
797
         if (type_contains_sampler(type->fields.structure[i].type))
 
798
            return true;
 
799
      }
 
800
      return false;
 
801
   } else {
 
802
      return type->is_sampler();
 
803
   }
 
804
}
 
805
 
 
806
bool
 
807
ir_dereference::is_lvalue()
 
808
{
 
809
   ir_variable *var = this->variable_referenced();
 
810
 
 
811
   /* Every l-value derference chain eventually ends in a variable.
 
812
    */
 
813
   if ((var == NULL) || var->read_only)
 
814
      return false;
 
815
 
 
816
   if (this->type->is_array() && !var->array_lvalue)
 
817
      return false;
 
818
 
 
819
   /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
 
820
    *
 
821
    *    "Samplers cannot be treated as l-values; hence cannot be used
 
822
    *     as out or inout function parameters, nor can they be
 
823
    *     assigned into."
 
824
    */
 
825
   if (type_contains_sampler(this->type))
 
826
      return false;
 
827
 
 
828
   return true;
 
829
}
 
830
 
 
831
 
 
832
const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf" };
 
833
 
 
834
const char *ir_texture::opcode_string()
 
835
{
 
836
   assert((unsigned int) op <=
 
837
          sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
 
838
   return tex_opcode_strs[op];
 
839
}
 
840
 
 
841
ir_texture_opcode
 
842
ir_texture::get_opcode(const char *str)
 
843
{
 
844
   const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
 
845
   for (int op = 0; op < count; op++) {
 
846
      if (strcmp(str, tex_opcode_strs[op]) == 0)
 
847
         return (ir_texture_opcode) op;
 
848
   }
 
849
   return (ir_texture_opcode) -1;
 
850
}
 
851
 
 
852
 
 
853
void
 
854
ir_texture::set_sampler(ir_dereference *sampler)
 
855
{
 
856
   assert(sampler != NULL);
 
857
   this->sampler = sampler;
 
858
 
 
859
   switch (sampler->type->sampler_type) {
 
860
   case GLSL_TYPE_FLOAT:
 
861
      this->type = glsl_type::vec4_type;
 
862
      break;
 
863
   case GLSL_TYPE_INT:
 
864
      this->type = glsl_type::ivec4_type;
 
865
      break;
 
866
   case GLSL_TYPE_UINT:
 
867
      this->type = glsl_type::uvec4_type;
 
868
      break;
 
869
   }
 
870
}
 
871
 
 
872
 
 
873
void
 
874
ir_swizzle::init_mask(const unsigned *comp, unsigned count)
 
875
{
 
876
   assert((count >= 1) && (count <= 4));
 
877
 
 
878
   memset(&this->mask, 0, sizeof(this->mask));
 
879
   this->mask.num_components = count;
 
880
 
 
881
   unsigned dup_mask = 0;
 
882
   switch (count) {
 
883
   case 4:
 
884
      assert(comp[3] <= 3);
 
885
      dup_mask |= (1U << comp[3])
 
886
         & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
 
887
      this->mask.w = comp[3];
 
888
 
 
889
   case 3:
 
890
      assert(comp[2] <= 3);
 
891
      dup_mask |= (1U << comp[2])
 
892
         & ((1U << comp[0]) | (1U << comp[1]));
 
893
      this->mask.z = comp[2];
 
894
 
 
895
   case 2:
 
896
      assert(comp[1] <= 3);
 
897
      dup_mask |= (1U << comp[1])
 
898
         & ((1U << comp[0]));
 
899
      this->mask.y = comp[1];
 
900
 
 
901
   case 1:
 
902
      assert(comp[0] <= 3);
 
903
      this->mask.x = comp[0];
 
904
   }
 
905
 
 
906
   this->mask.has_duplicates = dup_mask != 0;
 
907
 
 
908
   /* Based on the number of elements in the swizzle and the base type
 
909
    * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
 
910
    * generate the type of the resulting value.
 
911
    */
 
912
   type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
 
913
}
 
914
 
 
915
ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
 
916
                       unsigned w, unsigned count)
 
917
   : val(val)
 
918
{
 
919
   const unsigned components[4] = { x, y, z, w };
 
920
   this->ir_type = ir_type_swizzle;
 
921
   this->init_mask(components, count);
 
922
}
 
923
 
 
924
ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
 
925
                       unsigned count)
 
926
   : val(val)
 
927
{
 
928
   this->ir_type = ir_type_swizzle;
 
929
   this->init_mask(comp, count);
 
930
}
 
931
 
 
932
ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
 
933
{
 
934
   this->ir_type = ir_type_swizzle;
 
935
   this->val = val;
 
936
   this->mask = mask;
 
937
   this->type = glsl_type::get_instance(val->type->base_type,
 
938
                                        mask.num_components, 1);
 
939
}
 
940
 
 
941
#define X 1
 
942
#define R 5
 
943
#define S 9
 
944
#define I 13
 
945
 
 
946
ir_swizzle *
 
947
ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
 
948
{
 
949
   void *ctx = talloc_parent(val);
 
950
 
 
951
   /* For each possible swizzle character, this table encodes the value in
 
952
    * \c idx_map that represents the 0th element of the vector.  For invalid
 
953
    * swizzle characters (e.g., 'k'), a special value is used that will allow
 
954
    * detection of errors.
 
955
    */
 
956
   static const unsigned char base_idx[26] = {
 
957
   /* a  b  c  d  e  f  g  h  i  j  k  l  m */
 
958
      R, R, I, I, I, I, R, I, I, I, I, I, I,
 
959
   /* n  o  p  q  r  s  t  u  v  w  x  y  z */
 
960
      I, I, S, S, R, S, S, I, I, X, X, X, X
 
961
   };
 
962
 
 
963
   /* Each valid swizzle character has an entry in the previous table.  This
 
964
    * table encodes the base index encoded in the previous table plus the actual
 
965
    * index of the swizzle character.  When processing swizzles, the first
 
966
    * character in the string is indexed in the previous table.  Each character
 
967
    * in the string is indexed in this table, and the value found there has the
 
968
    * value form the first table subtracted.  The result must be on the range
 
969
    * [0,3].
 
970
    *
 
971
    * For example, the string "wzyx" will get X from the first table.  Each of
 
972
    * the charcaters will get X+3, X+2, X+1, and X+0 from this table.  After
 
973
    * subtraction, the swizzle values are { 3, 2, 1, 0 }.
 
974
    *
 
975
    * The string "wzrg" will get X from the first table.  Each of the characters
 
976
    * will get X+3, X+2, R+0, and R+1 from this table.  After subtraction, the
 
977
    * swizzle values are { 3, 2, 4, 5 }.  Since 4 and 5 are outside the range
 
978
    * [0,3], the error is detected.
 
979
    */
 
980
   static const unsigned char idx_map[26] = {
 
981
   /* a    b    c    d    e    f    g    h    i    j    k    l    m */
 
982
      R+3, R+2, 0,   0,   0,   0,   R+1, 0,   0,   0,   0,   0,   0,
 
983
   /* n    o    p    q    r    s    t    u    v    w    x    y    z */
 
984
      0,   0,   S+2, S+3, R+0, S+0, S+1, 0,   0,   X+3, X+0, X+1, X+2
 
985
   };
 
986
 
 
987
   int swiz_idx[4] = { 0, 0, 0, 0 };
 
988
   unsigned i;
 
989
 
 
990
 
 
991
   /* Validate the first character in the swizzle string and look up the base
 
992
    * index value as described above.
 
993
    */
 
994
   if ((str[0] < 'a') || (str[0] > 'z'))
 
995
      return NULL;
 
996
 
 
997
   const unsigned base = base_idx[str[0] - 'a'];
 
998
 
 
999
 
 
1000
   for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
 
1001
      /* Validate the next character, and, as described above, convert it to a
 
1002
       * swizzle index.
 
1003
       */
 
1004
      if ((str[i] < 'a') || (str[i] > 'z'))
 
1005
         return NULL;
 
1006
 
 
1007
      swiz_idx[i] = idx_map[str[i] - 'a'] - base;
 
1008
      if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
 
1009
         return NULL;
 
1010
   }
 
1011
 
 
1012
   if (str[i] != '\0')
 
1013
         return NULL;
 
1014
 
 
1015
   return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
 
1016
                              swiz_idx[3], i);
 
1017
}
 
1018
 
 
1019
#undef X
 
1020
#undef R
 
1021
#undef S
 
1022
#undef I
 
1023
 
 
1024
ir_variable *
 
1025
ir_swizzle::variable_referenced()
 
1026
{
 
1027
   return this->val->variable_referenced();
 
1028
}
 
1029
 
 
1030
 
 
1031
ir_variable::ir_variable(const struct glsl_type *type, const char *name,
 
1032
                         ir_variable_mode mode)
 
1033
   : max_array_access(0), read_only(false), centroid(false), invariant(false),
 
1034
     mode(mode), interpolation(ir_var_smooth), array_lvalue(false)
 
1035
{
 
1036
   this->ir_type = ir_type_variable;
 
1037
   this->type = type;
 
1038
   this->name = talloc_strdup(this, name);
 
1039
   this->location = -1;
 
1040
   this->warn_extension = NULL;
 
1041
   this->constant_value = NULL;
 
1042
   this->origin_upper_left = false;
 
1043
   this->pixel_center_integer = false;
 
1044
 
 
1045
   if (type && type->base_type == GLSL_TYPE_SAMPLER)
 
1046
      this->read_only = true;
 
1047
}
 
1048
 
 
1049
 
 
1050
const char *
 
1051
ir_variable::interpolation_string() const
 
1052
{
 
1053
   switch (this->interpolation) {
 
1054
   case ir_var_smooth:        return "smooth";
 
1055
   case ir_var_flat:          return "flat";
 
1056
   case ir_var_noperspective: return "noperspective";
 
1057
   }
 
1058
 
 
1059
   assert(!"Should not get here.");
 
1060
   return "";
 
1061
}
 
1062
 
 
1063
 
 
1064
unsigned
 
1065
ir_variable::component_slots() const
 
1066
{
 
1067
   /* FINISHME: Sparsely accessed arrays require fewer slots. */
 
1068
   return this->type->component_slots();
 
1069
}
 
1070
 
 
1071
 
 
1072
ir_function_signature::ir_function_signature(const glsl_type *return_type)
 
1073
   : return_type(return_type), is_defined(false), _function(NULL)
 
1074
{
 
1075
   this->ir_type = ir_type_function_signature;
 
1076
   this->is_builtin = false;
 
1077
}
 
1078
 
 
1079
 
 
1080
const char *
 
1081
ir_function_signature::qualifiers_match(exec_list *params)
 
1082
{
 
1083
   exec_list_iterator iter_a = parameters.iterator();
 
1084
   exec_list_iterator iter_b = params->iterator();
 
1085
 
 
1086
   /* check that the qualifiers match. */
 
1087
   while (iter_a.has_next()) {
 
1088
      ir_variable *a = (ir_variable *)iter_a.get();
 
1089
      ir_variable *b = (ir_variable *)iter_b.get();
 
1090
 
 
1091
      if (a->read_only != b->read_only ||
 
1092
          a->mode != b->mode ||
 
1093
          a->interpolation != b->interpolation ||
 
1094
          a->centroid != b->centroid) {
 
1095
 
 
1096
         /* parameter a's qualifiers don't match */
 
1097
         return a->name;
 
1098
      }
 
1099
 
 
1100
      iter_a.next();
 
1101
      iter_b.next();
 
1102
   }
 
1103
   return NULL;
 
1104
}
 
1105
 
 
1106
 
 
1107
void
 
1108
ir_function_signature::replace_parameters(exec_list *new_params)
 
1109
{
 
1110
   /* Destroy all of the previous parameter information.  If the previous
 
1111
    * parameter information comes from the function prototype, it may either
 
1112
    * specify incorrect parameter names or not have names at all.
 
1113
    */
 
1114
   foreach_iter(exec_list_iterator, iter, parameters) {
 
1115
      assert(((ir_instruction *) iter.get())->as_variable() != NULL);
 
1116
 
 
1117
      iter.remove();
 
1118
   }
 
1119
 
 
1120
   new_params->move_nodes_to(&parameters);
 
1121
}
 
1122
 
 
1123
 
 
1124
ir_function::ir_function(const char *name)
 
1125
{
 
1126
   this->ir_type = ir_type_function;
 
1127
   this->name = talloc_strdup(this, name);
 
1128
}
 
1129
 
 
1130
 
 
1131
bool
 
1132
ir_function::has_builtin_signature()
 
1133
{
 
1134
   foreach_list(n, &this->signatures) {
 
1135
      ir_function_signature *const sig = (ir_function_signature *) n;
 
1136
      if (sig->is_builtin)
 
1137
         return true;
 
1138
   }
 
1139
   return false;
 
1140
}
 
1141
 
 
1142
 
 
1143
ir_call *
 
1144
ir_call::get_error_instruction(void *ctx)
 
1145
{
 
1146
   ir_call *call = new(ctx) ir_call;
 
1147
 
 
1148
   call->type = glsl_type::error_type;
 
1149
   return call;
 
1150
}
 
1151
 
 
1152
void
 
1153
ir_call::set_callee(ir_function_signature *sig)
 
1154
{
 
1155
   assert((this->type == NULL) || (this->type == sig->return_type));
 
1156
 
 
1157
   this->callee = sig;
 
1158
}
 
1159
 
 
1160
void
 
1161
visit_exec_list(exec_list *list, ir_visitor *visitor)
 
1162
{
 
1163
   foreach_iter(exec_list_iterator, iter, *list) {
 
1164
      ((ir_instruction *)iter.get())->accept(visitor);
 
1165
   }
 
1166
}
 
1167
 
 
1168
 
 
1169
static void
 
1170
steal_memory(ir_instruction *ir, void *new_ctx)
 
1171
{
 
1172
   ir_variable *var = ir->as_variable();
 
1173
   ir_constant *constant = ir->as_constant();
 
1174
   if (var != NULL && var->constant_value != NULL)
 
1175
      steal_memory(var->constant_value, ir);
 
1176
 
 
1177
   /* The components of aggregate constants are not visited by the normal
 
1178
    * visitor, so steal their values by hand.
 
1179
    */
 
1180
   if (constant != NULL) {
 
1181
      if (constant->type->is_record()) {
 
1182
         foreach_iter(exec_list_iterator, iter, constant->components) {
 
1183
            ir_constant *field = (ir_constant *)iter.get();
 
1184
            steal_memory(field, ir);
 
1185
         }
 
1186
      } else if (constant->type->is_array()) {
 
1187
         for (unsigned int i = 0; i < constant->type->length; i++) {
 
1188
            steal_memory(constant->array_elements[i], ir);
 
1189
         }
 
1190
      }
 
1191
   }
 
1192
 
 
1193
   talloc_steal(new_ctx, ir);
 
1194
}
 
1195
 
 
1196
 
 
1197
void
 
1198
reparent_ir(exec_list *list, void *mem_ctx)
 
1199
{
 
1200
   foreach_list(node, list) {
 
1201
      visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
 
1202
   }
 
1203
}