1/*
2 * Copyright © 2009 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#include <stdio.h>
25#include <stdlib.h>
26#include "main/core.h" /* for Elements */
27#include "glsl_symbol_table.h"
28#include "glsl_parser_extras.h"
29#include "glsl_types.h"
30#include "builtin_types.h"
31extern "C" {
32#include "program/hash_table.h"
33}
34
35hash_table *glsl_type::array_types = NULL;
36hash_table *glsl_type::record_types = NULL;
37void *glsl_type::mem_ctx = NULL;
38
39void
40glsl_type::init_ralloc_type_ctx(void)
41{
42   if (glsl_type::mem_ctx == NULL) {
43      glsl_type::mem_ctx = ralloc_autofree_context();
44      assert(glsl_type::mem_ctx != NULL);
45   }
46}
47
48glsl_type::glsl_type(GLenum gl_type,
49		     glsl_base_type base_type, unsigned vector_elements,
50		     unsigned matrix_columns, const char *name) :
51   gl_type(gl_type),
52   base_type(base_type),
53   sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
54   sampler_type(0),
55   vector_elements(vector_elements), matrix_columns(matrix_columns),
56   length(0)
57{
58   init_ralloc_type_ctx();
59   this->name = ralloc_strdup(this->mem_ctx, name);
60   /* Neither dimension is zero or both dimensions are zero.
61    */
62   assert((vector_elements == 0) == (matrix_columns == 0));
63   memset(& fields, 0, sizeof(fields));
64}
65
66glsl_type::glsl_type(GLenum gl_type,
67		     enum glsl_sampler_dim dim, bool shadow, bool array,
68		     unsigned type, const char *name) :
69   gl_type(gl_type),
70   base_type(GLSL_TYPE_SAMPLER),
71   sampler_dimensionality(dim), sampler_shadow(shadow),
72   sampler_array(array), sampler_type(type),
73   vector_elements(0), matrix_columns(0),
74   length(0)
75{
76   init_ralloc_type_ctx();
77   this->name = ralloc_strdup(this->mem_ctx, name);
78   memset(& fields, 0, sizeof(fields));
79}
80
81glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
82		     const char *name) :
83   base_type(GLSL_TYPE_STRUCT),
84   sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
85   sampler_type(0),
86   vector_elements(0), matrix_columns(0),
87   length(num_fields)
88{
89   unsigned int i;
90
91   init_ralloc_type_ctx();
92   this->name = ralloc_strdup(this->mem_ctx, name);
93   this->fields.structure = ralloc_array(this->mem_ctx,
94					 glsl_struct_field, length);
95   for (i = 0; i < length; i++) {
96      this->fields.structure[i].type = fields[i].type;
97      this->fields.structure[i].name = ralloc_strdup(this->fields.structure,
98						     fields[i].name);
99   }
100}
101
102static void
103add_types_to_symbol_table(glsl_symbol_table *symtab,
104			  const struct glsl_type *types,
105			  unsigned num_types, bool warn)
106{
107   (void) warn;
108
109   for (unsigned i = 0; i < num_types; i++) {
110      symtab->add_type(types[i].name, & types[i]);
111   }
112}
113
114bool
115glsl_type::contains_sampler() const
116{
117   if (this->is_array()) {
118      return this->fields.array->contains_sampler();
119   } else if (this->is_record()) {
120      for (unsigned int i = 0; i < this->length; i++) {
121	 if (this->fields.structure[i].type->contains_sampler())
122	    return true;
123      }
124      return false;
125   } else {
126      return this->is_sampler();
127   }
128}
129
130gl_texture_index
131glsl_type::sampler_index() const
132{
133   const glsl_type *const t = (this->is_array()) ? this->fields.array : this;
134
135   assert(t->is_sampler());
136
137   switch (t->sampler_dimensionality) {
138   case GLSL_SAMPLER_DIM_1D:
139      return (t->sampler_array) ? TEXTURE_1D_ARRAY_INDEX : TEXTURE_1D_INDEX;
140   case GLSL_SAMPLER_DIM_2D:
141      return (t->sampler_array) ? TEXTURE_2D_ARRAY_INDEX : TEXTURE_2D_INDEX;
142   case GLSL_SAMPLER_DIM_3D:
143      return TEXTURE_3D_INDEX;
144   case GLSL_SAMPLER_DIM_CUBE:
145      return TEXTURE_CUBE_INDEX;
146   case GLSL_SAMPLER_DIM_RECT:
147      return TEXTURE_RECT_INDEX;
148   case GLSL_SAMPLER_DIM_BUF:
149      return TEXTURE_BUFFER_INDEX;
150   case GLSL_SAMPLER_DIM_EXTERNAL:
151      return TEXTURE_EXTERNAL_INDEX;
152   default:
153      assert(!"Should not get here.");
154      return TEXTURE_BUFFER_INDEX;
155   }
156}
157
158void
159glsl_type::generate_100ES_types(glsl_symbol_table *symtab)
160{
161   add_types_to_symbol_table(symtab, builtin_core_types,
162			     Elements(builtin_core_types),
163			     false);
164   add_types_to_symbol_table(symtab, builtin_structure_types,
165			     Elements(builtin_structure_types),
166			     false);
167   add_types_to_symbol_table(symtab, void_type, 1, false);
168}
169
170void
171glsl_type::generate_110_types(glsl_symbol_table *symtab, bool add_deprecated)
172{
173   generate_100ES_types(symtab);
174
175   add_types_to_symbol_table(symtab, builtin_110_types,
176			     Elements(builtin_110_types),
177			     false);
178   add_types_to_symbol_table(symtab, &_sampler3D_type, 1, false);
179   if (add_deprecated) {
180      add_types_to_symbol_table(symtab, builtin_110_deprecated_structure_types,
181				Elements(builtin_110_deprecated_structure_types),
182				false);
183   }
184}
185
186
187void
188glsl_type::generate_120_types(glsl_symbol_table *symtab, bool add_deprecated)
189{
190   generate_110_types(symtab, add_deprecated);
191
192   add_types_to_symbol_table(symtab, builtin_120_types,
193			     Elements(builtin_120_types), false);
194}
195
196
197void
198glsl_type::generate_130_types(glsl_symbol_table *symtab, bool add_deprecated)
199{
200   generate_120_types(symtab, add_deprecated);
201
202   add_types_to_symbol_table(symtab, builtin_130_types,
203			     Elements(builtin_130_types), false);
204   generate_EXT_texture_array_types(symtab, false);
205}
206
207
208void
209glsl_type::generate_140_types(glsl_symbol_table *symtab)
210{
211   generate_130_types(symtab, false);
212
213   add_types_to_symbol_table(symtab, builtin_140_types,
214			     Elements(builtin_140_types), false);
215
216   add_types_to_symbol_table(symtab, builtin_EXT_texture_buffer_object_types,
217			     Elements(builtin_EXT_texture_buffer_object_types),
218			     false);
219}
220
221
222void
223glsl_type::generate_ARB_texture_rectangle_types(glsl_symbol_table *symtab,
224						bool warn)
225{
226   add_types_to_symbol_table(symtab, builtin_ARB_texture_rectangle_types,
227			     Elements(builtin_ARB_texture_rectangle_types),
228			     warn);
229}
230
231
232void
233glsl_type::generate_EXT_texture_array_types(glsl_symbol_table *symtab,
234					    bool warn)
235{
236   add_types_to_symbol_table(symtab, builtin_EXT_texture_array_types,
237			     Elements(builtin_EXT_texture_array_types),
238			     warn);
239}
240
241
242void
243glsl_type::generate_OES_texture_3D_types(glsl_symbol_table *symtab, bool warn)
244{
245   add_types_to_symbol_table(symtab, &_sampler3D_type, 1, warn);
246}
247
248
249void
250glsl_type::generate_OES_EGL_image_external_types(glsl_symbol_table *symtab,
251						 bool warn)
252{
253   add_types_to_symbol_table(symtab, builtin_OES_EGL_image_external_types,
254			     Elements(builtin_OES_EGL_image_external_types),
255			     warn);
256}
257
258void
259_mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
260{
261   switch (state->language_version) {
262   case 100:
263      assert(state->es_shader);
264      glsl_type::generate_100ES_types(state->symbols);
265      break;
266   case 110:
267      glsl_type::generate_110_types(state->symbols, true);
268      break;
269   case 120:
270      glsl_type::generate_120_types(state->symbols, true);
271      break;
272   case 130:
273      glsl_type::generate_130_types(state->symbols, true);
274      break;
275   case 140:
276      glsl_type::generate_140_types(state->symbols);
277      break;
278   default:
279      /* error */
280      break;
281   }
282
283   if (state->ARB_texture_rectangle_enable ||
284       state->language_version >= 140) {
285      glsl_type::generate_ARB_texture_rectangle_types(state->symbols,
286					   state->ARB_texture_rectangle_warn);
287   }
288   if (state->OES_texture_3D_enable && state->language_version == 100) {
289      glsl_type::generate_OES_texture_3D_types(state->symbols,
290					       state->OES_texture_3D_warn);
291   }
292
293   if (state->EXT_texture_array_enable && state->language_version < 130) {
294      // These are already included in 130; don't create twice.
295      glsl_type::generate_EXT_texture_array_types(state->symbols,
296				       state->EXT_texture_array_warn);
297   }
298
299   /* We cannot check for language_version == 100 here because we need the
300    * types to support fixed-function program generation.  But this is fine
301    * since the extension is never enabled for OpenGL contexts.
302    */
303   if (state->OES_EGL_image_external_enable) {
304      glsl_type::generate_OES_EGL_image_external_types(state->symbols,
305					       state->OES_EGL_image_external_warn);
306   }
307}
308
309
310const glsl_type *glsl_type::get_base_type() const
311{
312   switch (base_type) {
313   case GLSL_TYPE_UINT:
314      return uint_type;
315   case GLSL_TYPE_INT:
316      return int_type;
317   case GLSL_TYPE_FLOAT:
318      return float_type;
319   case GLSL_TYPE_BOOL:
320      return bool_type;
321   default:
322      return error_type;
323   }
324}
325
326
327const glsl_type *glsl_type::get_scalar_type() const
328{
329   const glsl_type *type = this;
330
331   /* Handle arrays */
332   while (type->base_type == GLSL_TYPE_ARRAY)
333      type = type->fields.array;
334
335   /* Handle vectors and matrices */
336   switch (type->base_type) {
337   case GLSL_TYPE_UINT:
338      return uint_type;
339   case GLSL_TYPE_INT:
340      return int_type;
341   case GLSL_TYPE_FLOAT:
342      return float_type;
343   default:
344      /* Handle everything else */
345      return type;
346   }
347}
348
349
350void
351_mesa_glsl_release_types(void)
352{
353   if (glsl_type::array_types != NULL) {
354      hash_table_dtor(glsl_type::array_types);
355      glsl_type::array_types = NULL;
356   }
357
358   if (glsl_type::record_types != NULL) {
359      hash_table_dtor(glsl_type::record_types);
360      glsl_type::record_types = NULL;
361   }
362}
363
364
365glsl_type::glsl_type(const glsl_type *array, unsigned length) :
366   base_type(GLSL_TYPE_ARRAY),
367   sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
368   sampler_type(0),
369   vector_elements(0), matrix_columns(0),
370   name(NULL), length(length)
371{
372   this->fields.array = array;
373   /* Inherit the gl type of the base. The GL type is used for
374    * uniform/statevar handling in Mesa and the arrayness of the type
375    * is represented by the size rather than the type.
376    */
377   this->gl_type = array->gl_type;
378
379   /* Allow a maximum of 10 characters for the array size.  This is enough
380    * for 32-bits of ~0.  The extra 3 are for the '[', ']', and terminating
381    * NUL.
382    */
383   const unsigned name_length = strlen(array->name) + 10 + 3;
384   char *const n = (char *) ralloc_size(this->mem_ctx, name_length);
385
386   if (length == 0)
387      snprintf(n, name_length, "%s[]", array->name);
388   else
389      snprintf(n, name_length, "%s[%u]", array->name, length);
390
391   this->name = n;
392}
393
394
395const glsl_type *
396glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns)
397{
398   if (base_type == GLSL_TYPE_VOID)
399      return void_type;
400
401   if ((rows < 1) || (rows > 4) || (columns < 1) || (columns > 4))
402      return error_type;
403
404   /* Treat GLSL vectors as Nx1 matrices.
405    */
406   if (columns == 1) {
407      switch (base_type) {
408      case GLSL_TYPE_UINT:
409	 return uint_type + (rows - 1);
410      case GLSL_TYPE_INT:
411	 return int_type + (rows - 1);
412      case GLSL_TYPE_FLOAT:
413	 return float_type + (rows - 1);
414      case GLSL_TYPE_BOOL:
415	 return bool_type + (rows - 1);
416      default:
417	 return error_type;
418      }
419   } else {
420      if ((base_type != GLSL_TYPE_FLOAT) || (rows == 1))
421	 return error_type;
422
423      /* GLSL matrix types are named mat{COLUMNS}x{ROWS}.  Only the following
424       * combinations are valid:
425       *
426       *   1 2 3 4
427       * 1
428       * 2   x x x
429       * 3   x x x
430       * 4   x x x
431       */
432#define IDX(c,r) (((c-1)*3) + (r-1))
433
434      switch (IDX(columns, rows)) {
435      case IDX(2,2): return mat2_type;
436      case IDX(2,3): return mat2x3_type;
437      case IDX(2,4): return mat2x4_type;
438      case IDX(3,2): return mat3x2_type;
439      case IDX(3,3): return mat3_type;
440      case IDX(3,4): return mat3x4_type;
441      case IDX(4,2): return mat4x2_type;
442      case IDX(4,3): return mat4x3_type;
443      case IDX(4,4): return mat4_type;
444      default: return error_type;
445      }
446   }
447
448   assert(!"Should not get here.");
449   return error_type;
450}
451
452
453const glsl_type *
454glsl_type::get_array_instance(const glsl_type *base, unsigned array_size)
455{
456
457   if (array_types == NULL) {
458      array_types = hash_table_ctor(64, hash_table_string_hash,
459				    hash_table_string_compare);
460   }
461
462   /* Generate a name using the base type pointer in the key.  This is
463    * done because the name of the base type may not be unique across
464    * shaders.  For example, two shaders may have different record types
465    * named 'foo'.
466    */
467   char key[128];
468   snprintf(key, sizeof(key), "%p[%u]", (void *) base, array_size);
469
470   const glsl_type *t = (glsl_type *) hash_table_find(array_types, key);
471   if (t == NULL) {
472      t = new glsl_type(base, array_size);
473
474      hash_table_insert(array_types, (void *) t, ralloc_strdup(mem_ctx, key));
475   }
476
477   assert(t->base_type == GLSL_TYPE_ARRAY);
478   assert(t->length == array_size);
479   assert(t->fields.array == base);
480
481   return t;
482}
483
484
485int
486glsl_type::record_key_compare(const void *a, const void *b)
487{
488   const glsl_type *const key1 = (glsl_type *) a;
489   const glsl_type *const key2 = (glsl_type *) b;
490
491   /* Return zero is the types match (there is zero difference) or non-zero
492    * otherwise.
493    */
494   if (strcmp(key1->name, key2->name) != 0)
495      return 1;
496
497   if (key1->length != key2->length)
498      return 1;
499
500   for (unsigned i = 0; i < key1->length; i++) {
501      if (key1->fields.structure[i].type != key2->fields.structure[i].type)
502	 return 1;
503      if (strcmp(key1->fields.structure[i].name,
504		 key2->fields.structure[i].name) != 0)
505	 return 1;
506   }
507
508   return 0;
509}
510
511
512unsigned
513glsl_type::record_key_hash(const void *a)
514{
515   const glsl_type *const key = (glsl_type *) a;
516   char hash_key[128];
517   unsigned size = 0;
518
519   size = snprintf(hash_key, sizeof(hash_key), "%08x", key->length);
520
521   for (unsigned i = 0; i < key->length; i++) {
522      if (size >= sizeof(hash_key))
523	 break;
524
525      size += snprintf(& hash_key[size], sizeof(hash_key) - size,
526		       "%p", (void *) key->fields.structure[i].type);
527   }
528
529   return hash_table_string_hash(& hash_key);
530}
531
532
533const glsl_type *
534glsl_type::get_record_instance(const glsl_struct_field *fields,
535			       unsigned num_fields,
536			       const char *name)
537{
538   const glsl_type key(fields, num_fields, name);
539
540   if (record_types == NULL) {
541      record_types = hash_table_ctor(64, record_key_hash, record_key_compare);
542   }
543
544   const glsl_type *t = (glsl_type *) hash_table_find(record_types, & key);
545   if (t == NULL) {
546      t = new glsl_type(fields, num_fields, name);
547
548      hash_table_insert(record_types, (void *) t, t);
549   }
550
551   assert(t->base_type == GLSL_TYPE_STRUCT);
552   assert(t->length == num_fields);
553   assert(strcmp(t->name, name) == 0);
554
555   return t;
556}
557
558
559const glsl_type *
560glsl_type::field_type(const char *name) const
561{
562   if (this->base_type != GLSL_TYPE_STRUCT)
563      return error_type;
564
565   for (unsigned i = 0; i < this->length; i++) {
566      if (strcmp(name, this->fields.structure[i].name) == 0)
567	 return this->fields.structure[i].type;
568   }
569
570   return error_type;
571}
572
573
574int
575glsl_type::field_index(const char *name) const
576{
577   if (this->base_type != GLSL_TYPE_STRUCT)
578      return -1;
579
580   for (unsigned i = 0; i < this->length; i++) {
581      if (strcmp(name, this->fields.structure[i].name) == 0)
582	 return i;
583   }
584
585   return -1;
586}
587
588
589unsigned
590glsl_type::component_slots() const
591{
592   switch (this->base_type) {
593   case GLSL_TYPE_UINT:
594   case GLSL_TYPE_INT:
595   case GLSL_TYPE_FLOAT:
596   case GLSL_TYPE_BOOL:
597      return this->components();
598
599   case GLSL_TYPE_STRUCT: {
600      unsigned size = 0;
601
602      for (unsigned i = 0; i < this->length; i++)
603	 size += this->fields.structure[i].type->component_slots();
604
605      return size;
606   }
607
608   case GLSL_TYPE_ARRAY:
609      return this->length * this->fields.array->component_slots();
610
611   default:
612      return 0;
613   }
614}
615
616bool
617glsl_type::can_implicitly_convert_to(const glsl_type *desired) const
618{
619   if (this == desired)
620      return true;
621
622   /* There is no conversion among matrix types. */
623   if (this->matrix_columns > 1 || desired->matrix_columns > 1)
624      return false;
625
626   /* int and uint can be converted to float. */
627   return desired->is_float()
628          && this->is_integer()
629          && this->vector_elements == desired->vector_elements;
630}
631
632unsigned
633glsl_type::std140_base_alignment(bool row_major) const
634{
635   /* (1) If the member is a scalar consuming <N> basic machine units, the
636    *     base alignment is <N>.
637    *
638    * (2) If the member is a two- or four-component vector with components
639    *     consuming <N> basic machine units, the base alignment is 2<N> or
640    *     4<N>, respectively.
641    *
642    * (3) If the member is a three-component vector with components consuming
643    *     <N> basic machine units, the base alignment is 4<N>.
644    */
645   if (this->is_scalar() || this->is_vector()) {
646      switch (this->vector_elements) {
647      case 1:
648	 return 4;
649      case 2:
650	 return 8;
651      case 3:
652      case 4:
653	 return 16;
654      }
655   }
656
657   /* (4) If the member is an array of scalars or vectors, the base alignment
658    *     and array stride are set to match the base alignment of a single
659    *     array element, according to rules (1), (2), and (3), and rounded up
660    *     to the base alignment of a vec4. The array may have padding at the
661    *     end; the base offset of the member following the array is rounded up
662    *     to the next multiple of the base alignment.
663    *
664    * (6) If the member is an array of <S> column-major matrices with <C>
665    *     columns and <R> rows, the matrix is stored identically to a row of
666    *     <S>*<C> column vectors with <R> components each, according to rule
667    *     (4).
668    *
669    * (8) If the member is an array of <S> row-major matrices with <C> columns
670    *     and <R> rows, the matrix is stored identically to a row of <S>*<R>
671    *     row vectors with <C> components each, according to rule (4).
672    *
673    * (10) If the member is an array of <S> structures, the <S> elements of
674    *      the array are laid out in order, according to rule (9).
675    */
676   if (this->is_array()) {
677      if (this->fields.array->is_scalar() ||
678	  this->fields.array->is_vector() ||
679	  this->fields.array->is_matrix()) {
680	 return MAX2(this->fields.array->std140_base_alignment(row_major), 16);
681      } else {
682	 assert(this->fields.array->is_record());
683	 return this->fields.array->std140_base_alignment(row_major);
684      }
685   }
686
687   /* (5) If the member is a column-major matrix with <C> columns and
688    *     <R> rows, the matrix is stored identically to an array of
689    *     <C> column vectors with <R> components each, according to
690    *     rule (4).
691    *
692    * (7) If the member is a row-major matrix with <C> columns and <R>
693    *     rows, the matrix is stored identically to an array of <R>
694    *     row vectors with <C> components each, according to rule (4).
695    */
696   if (this->is_matrix()) {
697      const struct glsl_type *vec_type, *array_type;
698      int c = this->matrix_columns;
699      int r = this->vector_elements;
700
701      if (row_major) {
702	 vec_type = get_instance(GLSL_TYPE_FLOAT, c, 1);
703	 array_type = glsl_type::get_array_instance(vec_type, r);
704      } else {
705	 vec_type = get_instance(GLSL_TYPE_FLOAT, r, 1);
706	 array_type = glsl_type::get_array_instance(vec_type, c);
707      }
708
709      return array_type->std140_base_alignment(false);
710   }
711
712   /* (9) If the member is a structure, the base alignment of the
713    *     structure is <N>, where <N> is the largest base alignment
714    *     value of any of its members, and rounded up to the base
715    *     alignment of a vec4. The individual members of this
716    *     sub-structure are then assigned offsets by applying this set
717    *     of rules recursively, where the base offset of the first
718    *     member of the sub-structure is equal to the aligned offset
719    *     of the structure. The structure may have padding at the end;
720    *     the base offset of the member following the sub-structure is
721    *     rounded up to the next multiple of the base alignment of the
722    *     structure.
723    */
724   if (this->is_record()) {
725      unsigned base_alignment = 16;
726      for (unsigned i = 0; i < this->length; i++) {
727	 const struct glsl_type *field_type = this->fields.structure[i].type;
728	 base_alignment = MAX2(base_alignment,
729			       field_type->std140_base_alignment(row_major));
730      }
731      return base_alignment;
732   }
733
734   assert(!"not reached");
735   return -1;
736}
737
738static unsigned
739align(unsigned val, unsigned align)
740{
741   return (val + align - 1) / align * align;
742}
743
744unsigned
745glsl_type::std140_size(bool row_major) const
746{
747   /* (1) If the member is a scalar consuming <N> basic machine units, the
748    *     base alignment is <N>.
749    *
750    * (2) If the member is a two- or four-component vector with components
751    *     consuming <N> basic machine units, the base alignment is 2<N> or
752    *     4<N>, respectively.
753    *
754    * (3) If the member is a three-component vector with components consuming
755    *     <N> basic machine units, the base alignment is 4<N>.
756    */
757   if (this->is_scalar() || this->is_vector()) {
758      return this->vector_elements * 4;
759   }
760
761   /* (5) If the member is a column-major matrix with <C> columns and
762    *     <R> rows, the matrix is stored identically to an array of
763    *     <C> column vectors with <R> components each, according to
764    *     rule (4).
765    *
766    * (6) If the member is an array of <S> column-major matrices with <C>
767    *     columns and <R> rows, the matrix is stored identically to a row of
768    *     <S>*<C> column vectors with <R> components each, according to rule
769    *     (4).
770    *
771    * (7) If the member is a row-major matrix with <C> columns and <R>
772    *     rows, the matrix is stored identically to an array of <R>
773    *     row vectors with <C> components each, according to rule (4).
774    *
775    * (8) If the member is an array of <S> row-major matrices with <C> columns
776    *     and <R> rows, the matrix is stored identically to a row of <S>*<R>
777    *     row vectors with <C> components each, according to rule (4).
778    */
779   if (this->is_matrix() || (this->is_array() &&
780			     this->fields.array->is_matrix())) {
781      const struct glsl_type *element_type;
782      const struct glsl_type *vec_type;
783      unsigned int array_len;
784
785      if (this->is_array()) {
786	 element_type = this->fields.array;
787	 array_len = this->length;
788      } else {
789	 element_type = this;
790	 array_len = 1;
791      }
792
793      if (row_major) {
794	 vec_type = get_instance(GLSL_TYPE_FLOAT,
795				 element_type->matrix_columns, 1);
796	 array_len *= element_type->vector_elements;
797      } else {
798	 vec_type = get_instance(GLSL_TYPE_FLOAT,
799				 element_type->vector_elements, 1);
800	 array_len *= element_type->matrix_columns;
801      }
802      const glsl_type *array_type = glsl_type::get_array_instance(vec_type,
803								  array_len);
804
805      return array_type->std140_size(false);
806   }
807
808   /* (4) If the member is an array of scalars or vectors, the base alignment
809    *     and array stride are set to match the base alignment of a single
810    *     array element, according to rules (1), (2), and (3), and rounded up
811    *     to the base alignment of a vec4. The array may have padding at the
812    *     end; the base offset of the member following the array is rounded up
813    *     to the next multiple of the base alignment.
814    *
815    * (10) If the member is an array of <S> structures, the <S> elements of
816    *      the array are laid out in order, according to rule (9).
817    */
818   if (this->is_array()) {
819      if (this->fields.array->is_record()) {
820	 return this->length * this->fields.array->std140_size(row_major);
821      } else {
822	 unsigned element_base_align =
823	    this->fields.array->std140_base_alignment(row_major);
824	 return this->length * MAX2(element_base_align, 16);
825      }
826   }
827
828   /* (9) If the member is a structure, the base alignment of the
829    *     structure is <N>, where <N> is the largest base alignment
830    *     value of any of its members, and rounded up to the base
831    *     alignment of a vec4. The individual members of this
832    *     sub-structure are then assigned offsets by applying this set
833    *     of rules recursively, where the base offset of the first
834    *     member of the sub-structure is equal to the aligned offset
835    *     of the structure. The structure may have padding at the end;
836    *     the base offset of the member following the sub-structure is
837    *     rounded up to the next multiple of the base alignment of the
838    *     structure.
839    */
840   if (this->is_record()) {
841      unsigned size = 0;
842      for (unsigned i = 0; i < this->length; i++) {
843	 const struct glsl_type *field_type = this->fields.structure[i].type;
844	 unsigned align = field_type->std140_base_alignment(row_major);
845	 size = (size + align - 1) / align * align;
846	 size += field_type->std140_size(row_major);
847      }
848      size = align(size,
849		   this->fields.structure[0].type->std140_base_alignment(row_major));
850      return size;
851   }
852
853   assert(!"not reached");
854   return -1;
855}
856