• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2011 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 #pragma once
25 #ifndef IR_UNIFORM_H
26 #define IR_UNIFORM_H
27 
28 
29 /* stdbool.h is necessary because this file is included in both C and C++ code.
30  */
31 #include <stdbool.h>
32 
33 #include "program/prog_parameter.h"  /* For union gl_constant_value. */
34 
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 enum gl_uniform_driver_format {
41    uniform_native = 0,          /**< Store data in the native format. */
42    uniform_int_float,           /**< Store integer data as floats. */
43    uniform_bool_float,          /**< Store boolean data as floats. */
44 
45    /**
46     * Store boolean data as integer using 1 for \c true.
47     */
48    uniform_bool_int_0_1,
49 
50    /**
51     * Store boolean data as integer using ~0 for \c true.
52     */
53    uniform_bool_int_0_not0
54 };
55 
56 struct gl_uniform_driver_storage {
57    /**
58     * Number of bytes from one array element to the next.
59     */
60    uint8_t element_stride;
61 
62    /**
63     * Number of bytes from one vector in a matrix to the next.
64     */
65    uint8_t vector_stride;
66 
67    /**
68     * Base format of the stored data.
69     *
70     * This field must have a value from \c GLSL_TYPE_UINT through \c
71     * GLSL_TYPE_SAMPLER.
72     */
73    uint8_t format;
74 
75    /**
76     * Pointer to the base of the data.
77     */
78    void *data;
79 };
80 
81 struct gl_uniform_storage {
82    char *name;
83    const struct glsl_type *type;
84 
85    /**
86     * The number of elements in this uniform.
87     *
88     * For non-arrays, this is always 0.  For arrays, the value is the size of
89     * the array.
90     */
91    unsigned array_elements;
92 
93    /**
94     * Has this uniform ever been set?
95     */
96    bool initialized;
97 
98    /**
99     * Base sampler index
100     *
101     * If \c ::base_type is \c GLSL_TYPE_SAMPLER, this represents the index of
102     * this sampler.  If \c ::array_elements is not zero, the array will use
103     * sampler indexes \c ::sampler through \c ::sampler + \c ::array_elements
104     * - 1, inclusive.
105     */
106    uint8_t sampler;
107 
108    /**
109     * Storage used by the driver for the uniform
110     */
111    unsigned num_driver_storage;
112    struct gl_uniform_driver_storage *driver_storage;
113 
114    /**
115     * Storage used by Mesa for the uniform
116     *
117     * This form of the uniform is used by Mesa's implementation of \c
118     * glGetUniform.  It can also be used by drivers to obtain the value of the
119     * uniform if the \c ::driver_storage interface is not used.
120     */
121    union gl_constant_value *storage;
122 
123    /** Fields for GL_ARB_uniform_buffer_object
124     * @{
125     */
126 
127    /**
128     * GL_UNIFORM_BLOCK_INDEX: index of the uniform block containing
129     * the uniform, or -1 for the default uniform block.  Note that the
130     * index is into the linked program's UniformBlocks[] array, not
131     * the linked shader's.
132     */
133    int block_index;
134 
135    /** GL_UNIFORM_OFFSET: byte offset within the uniform block, or -1. */
136    int offset;
137 
138    /**
139     * GL_UNIFORM_MATRIX_STRIDE: byte stride between columns or rows of
140     * a matrix.  Set to 0 for non-matrices in UBOs, or -1 for uniforms
141     * in the default uniform block.
142     */
143    int matrix_stride;
144 
145    /**
146     * GL_UNIFORM_ARRAY_STRIDE: byte stride between elements of the
147     * array.  Set to zero for non-arrays in UBOs, or -1 for uniforms
148     * in the default uniform block.
149     */
150    int array_stride;
151 
152    /** GL_UNIFORM_ROW_MAJOR: true iff it's a row-major matrix in a UBO */
153    bool row_major;
154 
155    /** @} */
156 };
157 
158 #ifdef __cplusplus
159 }
160 #endif
161 
162 #endif /* IR_UNIFORM_H */
163