2 * Copyright (C) 2005-2007 Brian Paul All Rights Reserved.
3 * Copyright (C) 2008 VMware, Inc. All Rights Reserved.
4 * Copyright © 2010 Intel Corporation
5 * Copyright © 2011 Bryan Cain
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice (including the next
15 * paragraph) shall be included in all copies or substantial portions of the
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 * DEALINGS IN THE SOFTWARE.
27 #include "st_glsl_types.h"
30 * Returns type size in units of vec4 slots.
33 st_glsl_attrib_type_size(const struct glsl_type
*type
, bool is_vs_input
)
38 switch (type
->base_type
) {
43 if (type
->is_matrix()) {
44 return type
->matrix_columns
;
46 /* Regardless of size of vector, it gets a vec4. This is bad
47 * packing for things like floats, but otherwise arrays become a
48 * mess. Hopefully a later pass over the code can pack scalars
49 * down if appropriate.
54 case GLSL_TYPE_DOUBLE
:
55 if (type
->is_matrix()) {
56 if (type
->vector_elements
<= 2 || is_vs_input
)
57 return type
->matrix_columns
;
59 return type
->matrix_columns
* 2;
61 /* For doubles if we have a double or dvec2 they fit in one
62 * vec4, else they need 2 vec4s.
64 if (type
->vector_elements
<= 2 || is_vs_input
)
71 assert(type
->length
> 0);
72 return st_glsl_attrib_type_size(type
->fields
.array
, is_vs_input
) * type
->length
;
73 case GLSL_TYPE_STRUCT
:
75 for (i
= 0; i
< type
->length
; i
++) {
76 size
+= st_glsl_attrib_type_size(type
->fields
.structure
[i
].type
, is_vs_input
);
79 case GLSL_TYPE_SAMPLER
:
81 case GLSL_TYPE_SUBROUTINE
:
82 /* Samplers take up one slot in UNIFORMS[], but they're baked in
86 case GLSL_TYPE_ATOMIC_UINT
:
87 case GLSL_TYPE_INTERFACE
:
90 case GLSL_TYPE_FUNCTION
:
91 assert(!"Invalid type in type_size");
98 st_glsl_type_size(const struct glsl_type
*type
)
100 return st_glsl_attrib_type_size(type
, false);