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