i965/gen6/blorp: Remove redundant HiZ workaround
[mesa.git] / src / mesa / main / uniforms.h
1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 2010 VMware, Inc. All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25
26 #ifndef UNIFORMS_H
27 #define UNIFORMS_H
28
29 #include "glheader.h"
30 #include "program/prog_parameter.h"
31 #include "../glsl/glsl_types.h"
32 #include "../glsl/ir_uniform.h"
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37
38
39 struct gl_program;
40 struct _glapi_table;
41
42 void GLAPIENTRY
43 _mesa_Uniform1f(GLint, GLfloat);
44 void GLAPIENTRY
45 _mesa_Uniform2f(GLint, GLfloat, GLfloat);
46 void GLAPIENTRY
47 _mesa_Uniform3f(GLint, GLfloat, GLfloat, GLfloat);
48 void GLAPIENTRY
49 _mesa_Uniform4f(GLint, GLfloat, GLfloat, GLfloat, GLfloat);
50 void GLAPIENTRY
51 _mesa_Uniform1i(GLint, GLint);
52 void GLAPIENTRY
53 _mesa_Uniform2i(GLint, GLint, GLint);
54 void GLAPIENTRY
55 _mesa_Uniform3i(GLint, GLint, GLint, GLint);
56 void GLAPIENTRY
57 _mesa_Uniform4i(GLint, GLint, GLint, GLint, GLint);
58 void GLAPIENTRY
59 _mesa_Uniform1fv(GLint, GLsizei, const GLfloat *);
60 void GLAPIENTRY
61 _mesa_Uniform2fv(GLint, GLsizei, const GLfloat *);
62 void GLAPIENTRY
63 _mesa_Uniform3fv(GLint, GLsizei, const GLfloat *);
64 void GLAPIENTRY
65 _mesa_Uniform4fv(GLint, GLsizei, const GLfloat *);
66 void GLAPIENTRY
67 _mesa_Uniform1iv(GLint, GLsizei, const GLint *);
68 void GLAPIENTRY
69 _mesa_Uniform2iv(GLint, GLsizei, const GLint *);
70 void GLAPIENTRY
71 _mesa_Uniform3iv(GLint, GLsizei, const GLint *);
72 void GLAPIENTRY
73 _mesa_Uniform4iv(GLint, GLsizei, const GLint *);
74 void GLAPIENTRY
75 _mesa_Uniform1ui(GLint location, GLuint v0);
76 void GLAPIENTRY
77 _mesa_Uniform2ui(GLint location, GLuint v0, GLuint v1);
78 void GLAPIENTRY
79 _mesa_Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
80 void GLAPIENTRY
81 _mesa_Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
82 void GLAPIENTRY
83 _mesa_Uniform1uiv(GLint location, GLsizei count, const GLuint *value);
84 void GLAPIENTRY
85 _mesa_Uniform2uiv(GLint location, GLsizei count, const GLuint *value);
86 void GLAPIENTRY
87 _mesa_Uniform3uiv(GLint location, GLsizei count, const GLuint *value);
88 void GLAPIENTRY
89 _mesa_Uniform4uiv(GLint location, GLsizei count, const GLuint *value);
90 void GLAPIENTRY
91 _mesa_UniformMatrix2fv(GLint, GLsizei, GLboolean, const GLfloat *);
92 void GLAPIENTRY
93 _mesa_UniformMatrix3fv(GLint, GLsizei, GLboolean, const GLfloat *);
94 void GLAPIENTRY
95 _mesa_UniformMatrix4fv(GLint, GLsizei, GLboolean, const GLfloat *);
96 void GLAPIENTRY
97 _mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
98 const GLfloat *value);
99 void GLAPIENTRY
100 _mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
101 const GLfloat *value);
102 void GLAPIENTRY
103 _mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
104 const GLfloat *value);
105 void GLAPIENTRY
106 _mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
107 const GLfloat *value);
108 void GLAPIENTRY
109 _mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
110 const GLfloat *value);
111 void GLAPIENTRY
112 _mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
113 const GLfloat *value);
114 void GLAPIENTRY
115 _mesa_GetnUniformfvARB(GLhandleARB, GLint, GLsizei, GLfloat *);
116 void GLAPIENTRY
117 _mesa_GetUniformfv(GLhandleARB, GLint, GLfloat *);
118 void GLAPIENTRY
119 _mesa_GetnUniformivARB(GLhandleARB, GLint, GLsizei, GLint *);
120 void GLAPIENTRY
121 _mesa_GetUniformuiv(GLhandleARB, GLint, GLuint *);
122 void GLAPIENTRY
123 _mesa_GetnUniformuivARB(GLhandleARB, GLint, GLsizei, GLuint *);
124 void GLAPIENTRY
125 _mesa_GetUniformuiv(GLhandleARB program, GLint location, GLuint *params);
126 void GLAPIENTRY
127 _mesa_GetnUniformdvARB(GLhandleARB, GLint, GLsizei, GLdouble *);
128 void GLAPIENTRY
129 _mesa_GetUniformdv(GLhandleARB, GLint, GLdouble *);
130 GLint GLAPIENTRY
131 _mesa_GetUniformLocation(GLhandleARB, const GLcharARB *);
132 GLuint GLAPIENTRY
133 _mesa_GetUniformBlockIndex(GLuint program,
134 const GLchar *uniformBlockName);
135 void GLAPIENTRY
136 _mesa_GetUniformIndices(GLuint program,
137 GLsizei uniformCount,
138 const GLchar * const *uniformNames,
139 GLuint *uniformIndices);
140 void GLAPIENTRY
141 _mesa_UniformBlockBinding(GLuint program,
142 GLuint uniformBlockIndex,
143 GLuint uniformBlockBinding);
144 void GLAPIENTRY
145 _mesa_GetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex,
146 GLenum pname, GLint *params);
147 void GLAPIENTRY
148 _mesa_GetActiveUniformBlockiv(GLuint program,
149 GLuint uniformBlockIndex,
150 GLenum pname,
151 GLint *params);
152 void GLAPIENTRY
153 _mesa_GetActiveUniformBlockName(GLuint program,
154 GLuint uniformBlockIndex,
155 GLsizei bufSize,
156 GLsizei *length,
157 GLchar *uniformBlockName);
158 void GLAPIENTRY
159 _mesa_GetActiveUniformName(GLuint program, GLuint uniformIndex,
160 GLsizei bufSize, GLsizei *length,
161 GLchar *uniformName);
162 void GLAPIENTRY
163 _mesa_GetActiveUniform(GLhandleARB, GLuint, GLsizei, GLsizei *,
164 GLint *, GLenum *, GLcharARB *);
165 void GLAPIENTRY
166 _mesa_GetActiveUniformsiv(GLuint program,
167 GLsizei uniformCount,
168 const GLuint *uniformIndices,
169 GLenum pname,
170 GLint *params);
171 void GLAPIENTRY
172 _mesa_GetUniformiv(GLhandleARB, GLint, GLint *);
173
174 long
175 _mesa_parse_program_resource_name(const GLchar *name,
176 const GLchar **out_base_name_end);
177
178 unsigned
179 _mesa_get_uniform_location(struct gl_context *ctx, struct gl_shader_program *shProg,
180 const GLchar *name, unsigned *offset);
181
182 void
183 _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shader_program,
184 GLint location, GLsizei count,
185 const GLvoid *values, GLenum type);
186
187 void
188 _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
189 GLuint cols, GLuint rows,
190 GLint location, GLsizei count,
191 GLboolean transpose, const GLfloat *values);
192
193 void
194 _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
195 GLsizei bufSize, enum glsl_base_type returnType,
196 GLvoid *paramsOut);
197
198 extern void
199 _mesa_uniform_attach_driver_storage(struct gl_uniform_storage *,
200 unsigned element_stride,
201 unsigned vector_stride,
202 enum gl_uniform_driver_format format,
203 void *data);
204
205 extern void
206 _mesa_uniform_detach_all_driver_storage(struct gl_uniform_storage *uni);
207
208 extern void
209 _mesa_propagate_uniforms_to_driver_storage(struct gl_uniform_storage *uni,
210 unsigned array_index,
211 unsigned count);
212
213 extern void
214 _mesa_update_shader_textures_used(struct gl_shader_program *shProg,
215 struct gl_program *prog);
216
217 extern bool
218 _mesa_sampler_uniforms_are_valid(const struct gl_shader_program *shProg,
219 char *errMsg, size_t errMsgLength);
220
221 extern const struct gl_program_parameter *
222 get_uniform_parameter(struct gl_shader_program *shProg, GLint index);
223
224 extern void
225 _mesa_get_uniform_name(const struct gl_uniform_storage *uni,
226 GLsizei maxLength, GLsizei *length,
227 GLchar *nameOut);
228
229 struct gl_builtin_uniform_element {
230 const char *field;
231 int tokens[STATE_LENGTH];
232 int swizzle;
233 };
234
235 struct gl_builtin_uniform_desc {
236 const char *name;
237 struct gl_builtin_uniform_element *elements;
238 unsigned int num_elements;
239 };
240
241 /**
242 * \name GLSL uniform arrays and structs require special handling.
243 *
244 * The GL_ARB_shader_objects spec says that if you use
245 * glGetUniformLocation to get the location of an array, you CANNOT
246 * access other elements of the array by adding an offset to the
247 * returned location. For example, you must call
248 * glGetUniformLocation("foo[16]") if you want to set the 16th element
249 * of the array with glUniform().
250 *
251 * HOWEVER, some other OpenGL drivers allow accessing array elements
252 * by adding an offset to the returned array location. And some apps
253 * seem to depend on that behaviour.
254 *
255 * Mesa's gl_uniform_list doesn't directly support this since each
256 * entry in the list describes one uniform variable, not one uniform
257 * element. We could insert dummy entries in the list for each array
258 * element after [0] but that causes complications elsewhere.
259 *
260 * We solve this problem by encoding two values in the location that's
261 * returned by glGetUniformLocation():
262 * a) index into gl_uniform_list::Uniforms[] for the uniform
263 * b) an array/field offset (0 for simple types)
264 *
265 * These two values are encoded in the high and low halves of a GLint.
266 * By putting the uniform number in the high part and the offset in the
267 * low part, we can support the unofficial ability to index into arrays
268 * by adding offsets to the location value.
269 */
270 /*@{*/
271 /**
272 * Combine the uniform's base location and the offset
273 */
274 static inline GLint
275 _mesa_uniform_merge_location_offset(const struct gl_shader_program *prog,
276 unsigned base_location, unsigned offset)
277 {
278 assert(prog->UniformLocationBaseScale >= 1);
279 assert(offset < prog->UniformLocationBaseScale);
280 return (base_location * prog->UniformLocationBaseScale) + offset;
281 }
282
283 /**
284 * Separate the uniform base location and parameter offset
285 */
286 static inline void
287 _mesa_uniform_split_location_offset(const struct gl_shader_program *prog,
288 GLint location, unsigned *base_location,
289 unsigned *offset)
290 {
291 *offset = location % prog->UniformLocationBaseScale;
292 *base_location = location / prog->UniformLocationBaseScale;
293 }
294 /*@}*/
295
296
297 #ifdef __cplusplus
298 }
299 #endif
300
301
302 #endif /* UNIFORMS_H */