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