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 #ifndef IR_UNIFORM_H 25 #define IR_UNIFORM_H 26 27 28 /* stdbool.h is necessary because this file is included in both C and C++ code. 29 */ 30 #include <stdbool.h> 31 #include "util/macros.h" 32 #include "program/prog_parameter.h" /* For union gl_constant_value. */ 33 34 /** 35 * Used by GL_ARB_explicit_uniform_location extension code in the linker 36 * and glUniform* functions to identify inactive explicit uniform locations. 37 */ 38 #define INACTIVE_UNIFORM_EXPLICIT_LOCATION ((gl_uniform_storage *) -1) 39 40 #ifdef __cplusplus 41 extern "C" { 42 #endif 43 44 enum PACKED gl_uniform_driver_format { 45 uniform_native = 0, /**< Store data in the native format. */ 46 uniform_int_float, /**< Store integer data as floats. */ 47 }; 48 49 struct gl_uniform_driver_storage { 50 /** 51 * Number of bytes from one array element to the next. 52 */ 53 uint8_t element_stride; 54 55 /** 56 * Number of bytes from one vector in a matrix to the next. 57 */ 58 uint8_t vector_stride; 59 60 /** 61 * Base format of the stored data. 62 */ 63 enum gl_uniform_driver_format format; 64 65 /** 66 * Pointer to the base of the data. 67 */ 68 void *data; 69 }; 70 71 struct gl_opaque_uniform_index { 72 /** 73 * Base opaque uniform index 74 * 75 * If \c gl_uniform_storage::base_type is an opaque type, this 76 * represents its uniform index. If \c 77 * gl_uniform_storage::array_elements is not zero, the array will 78 * use opaque uniform indices \c index through \c index + \c 79 * gl_uniform_storage::array_elements - 1, inclusive. 80 * 81 * Note that the index may be different in each shader stage. 82 */ 83 uint8_t index; 84 85 /** 86 * Whether this opaque uniform is used in this shader stage. 87 */ 88 bool active; 89 }; 90 91 struct gl_uniform_storage { 92 char *name; 93 /** Type of this uniform data stored. 94 * 95 * In the case of an array, it's the type of a single array element. 96 */ 97 const struct glsl_type *type; 98 99 /** 100 * The number of elements in this uniform. 101 * 102 * For non-arrays, this is always 0. For arrays, the value is the size of 103 * the array. 104 */ 105 unsigned array_elements; 106 107 struct gl_opaque_uniform_index opaque[MESA_SHADER_STAGES]; 108 109 /** 110 * Mask of shader stages (1 << MESA_SHADER_xxx) where this uniform is used. 111 */ 112 unsigned active_shader_mask; 113 114 /** 115 * Storage used by the driver for the uniform 116 */ 117 unsigned num_driver_storage; 118 struct gl_uniform_driver_storage *driver_storage; 119 120 /** 121 * Storage used by Mesa for the uniform 122 * 123 * This form of the uniform is used by Mesa's implementation of \c 124 * glGetUniform. It can also be used by drivers to obtain the value of the 125 * uniform if the \c ::driver_storage interface is not used. 126 */ 127 union gl_constant_value *storage; 128 129 /** Fields for GL_ARB_uniform_buffer_object 130 * @{ 131 */ 132 133 /** 134 * GL_UNIFORM_BLOCK_INDEX: index of the uniform block containing 135 * the uniform, or -1 for the default uniform block. Note that the 136 * index is into the linked program's UniformBlocks[] array, not 137 * the linked shader's. 138 */ 139 int block_index; 140 141 /** GL_UNIFORM_OFFSET: byte offset within the uniform block, or -1. */ 142 int offset; 143 144 /** 145 * GL_UNIFORM_MATRIX_STRIDE: byte stride between columns or rows of 146 * a matrix. Set to 0 for non-matrices in UBOs, or -1 for uniforms 147 * in the default uniform block. 148 */ 149 int matrix_stride; 150 151 /** 152 * GL_UNIFORM_ARRAY_STRIDE: byte stride between elements of the 153 * array. Set to zero for non-arrays in UBOs, or -1 for uniforms 154 * in the default uniform block. 155 */ 156 int array_stride; 157 158 /** GL_UNIFORM_ROW_MAJOR: true iff it's a row-major matrix in a UBO */ 159 bool row_major; 160 161 /** @} */ 162 163 /** 164 * This is a compiler-generated uniform that should not be advertised 165 * via the API. 166 */ 167 bool hidden; 168 169 /** 170 * This is a built-in uniform that should not be modified through any gl API. 171 */ 172 bool builtin; 173 174 /** 175 * This is a shader storage buffer variable, not an uniform. 176 */ 177 bool is_shader_storage; 178 179 /** 180 * Index within gl_shader_program::AtomicBuffers[] of the atomic 181 * counter buffer this uniform is stored in, or -1 if this is not 182 * an atomic counter. 183 */ 184 int atomic_buffer_index; 185 186 /** 187 * The 'base location' for this uniform in the uniform remap table. For 188 * arrays this is the first element in the array. 189 * for subroutines this is in shader subroutine uniform remap table. 190 */ 191 unsigned remap_location; 192 193 /** 194 * The number of compatible subroutines with this subroutine uniform. 195 */ 196 unsigned num_compatible_subroutines; 197 198 /** 199 * A single integer identifying the number of active array elements of 200 * the top-level shader storage block member (GL_TOP_LEVEL_ARRAY_SIZE). 201 */ 202 unsigned top_level_array_size; 203 204 /** 205 * A single integer identifying the stride between array elements of the 206 * top-level shader storage block member. (GL_TOP_LEVEL_ARRAY_STRIDE). 207 */ 208 unsigned top_level_array_stride; 209 210 /** 211 * Whether this uniform variable has the bindless_sampler or bindless_image 212 * layout qualifier as specified by ARB_bindless_texture. 213 */ 214 bool is_bindless; 215 }; 216 217 #ifdef __cplusplus 218 } 219 #endif 220 221 #endif /* IR_UNIFORM_H */ 222