Home | History | Annotate | Download | only in glsl
      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"
     31 extern "C" {
     32 #include "program/hash_table.h"
     33 }
     34 
     35 hash_table *glsl_type::array_types = NULL;
     36 hash_table *glsl_type::record_types = NULL;
     37 void *glsl_type::mem_ctx = NULL;
     38 
     39 void
     40 glsl_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 
     48 glsl_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 
     66 glsl_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 
     81 glsl_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 
    102 static void
    103 add_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 
    114 bool
    115 glsl_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 
    130 gl_texture_index
    131 glsl_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 
    158 void
    159 glsl_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 
    170 void
    171 glsl_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 
    187 void
    188 glsl_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 
    197 void
    198 glsl_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 
    208 void
    209 glsl_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 
    222 void
    223 glsl_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 
    232 void
    233 glsl_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 
    242 void
    243 glsl_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 
    249 void
    250 glsl_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 
    258 void
    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 
    310 const 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 
    327 const 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 
    350 void
    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 
    365 glsl_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 
    395 const glsl_type *
    396 glsl_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 
    453 const glsl_type *
    454 glsl_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 
    485 int
    486 glsl_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 
    512 unsigned
    513 glsl_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 
    533 const glsl_type *
    534 glsl_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 
    559 const glsl_type *
    560 glsl_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 
    574 int
    575 glsl_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 
    589 unsigned
    590 glsl_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 
    616 bool
    617 glsl_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 
    632 unsigned
    633 glsl_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 
    738 static unsigned
    739 align(unsigned val, unsigned align)
    740 {
    741    return (val + align - 1) / align * align;
    742 }
    743 
    744 unsigned
    745 glsl_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