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