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
37extern "C" {
38#endif
39
40enum 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
56struct 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
81struct 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