1 /* 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 6 * 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: 13 * 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 16 * Software. 17 * 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. 25 */ 26 27 #include "st_glsl_types.h" 28 29 /** 30 * Returns type size in units of vec4 slots. 31 */ 32 int 33 st_glsl_attrib_type_size(const struct glsl_type *type, bool is_vs_input) 34 { 35 unsigned int i; 36 int size; 37 38 switch (type->base_type) { 39 case GLSL_TYPE_UINT: 40 case GLSL_TYPE_INT: 41 case GLSL_TYPE_FLOAT: 42 case GLSL_TYPE_BOOL: 43 if (type->is_matrix()) { 44 return type->matrix_columns; 45 } else { 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. 50 */ 51 return 1; 52 } 53 break; 54 case GLSL_TYPE_DOUBLE: 55 if (type->is_matrix()) { 56 if (type->vector_elements <= 2 || is_vs_input) 57 return type->matrix_columns; 58 else 59 return type->matrix_columns * 2; 60 } else { 61 /* For doubles if we have a double or dvec2 they fit in one 62 * vec4, else they need 2 vec4s. 63 */ 64 if (type->vector_elements <= 2 || is_vs_input) 65 return 1; 66 else 67 return 2; 68 } 69 break; 70 case GLSL_TYPE_ARRAY: 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: 74 size = 0; 75 for (i = 0; i < type->length; i++) { 76 size += st_glsl_attrib_type_size(type->fields.structure[i].type, is_vs_input); 77 } 78 return size; 79 case GLSL_TYPE_SAMPLER: 80 case GLSL_TYPE_IMAGE: 81 case GLSL_TYPE_SUBROUTINE: 82 /* Samplers take up one slot in UNIFORMS[], but they're baked in 83 * at link time. 84 */ 85 return 1; 86 case GLSL_TYPE_ATOMIC_UINT: 87 case GLSL_TYPE_INTERFACE: 88 case GLSL_TYPE_VOID: 89 case GLSL_TYPE_ERROR: 90 case GLSL_TYPE_FUNCTION: 91 assert(!"Invalid type in type_size"); 92 break; 93 } 94 return 0; 95 } 96 97 int 98 st_glsl_type_size(const struct glsl_type *type) 99 { 100 return st_glsl_attrib_type_size(type, false); 101 } 102