st/mesa: add support for advanced blend when fb can be fetched from
[mesa.git] / src / mesa / state_tracker / st_glsl_types.cpp
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 }