Home | History | Annotate | Download | only in state_tracker
      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