diff options
Diffstat (limited to 'mesalib/src/mesa/main/uniforms.h')
-rw-r--r-- | mesalib/src/mesa/main/uniforms.h | 86 |
1 files changed, 85 insertions, 1 deletions
diff --git a/mesalib/src/mesa/main/uniforms.h b/mesalib/src/mesa/main/uniforms.h index 77f55d47d..123d7b954 100644 --- a/mesalib/src/mesa/main/uniforms.h +++ b/mesalib/src/mesa/main/uniforms.h @@ -27,6 +27,13 @@ #include "glheader.h" #include "program/prog_parameter.h" +#include "../glsl/glsl_types.h" +#include "../glsl/ir_uniform.h" + +#ifdef __cplusplus +extern "C" { +#endif + struct gl_program; struct _glapi_table; @@ -180,10 +187,30 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shader_program, void _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg, - GLint cols, GLint rows, + GLuint cols, GLuint rows, GLint location, GLsizei count, GLboolean transpose, const GLfloat *values); +void +_mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location, + GLsizei bufSize, enum glsl_base_type returnType, + GLvoid *paramsOut); + +extern void +_mesa_uniform_attach_driver_storage(struct gl_uniform_storage *, + unsigned element_stride, + unsigned vector_stride, + enum gl_uniform_driver_format format, + void *data); + +extern void +_mesa_uniform_detach_all_driver_storage(struct gl_uniform_storage *uni); + +extern void +_mesa_propagate_uniforms_to_driver_storage(struct gl_uniform_storage *uni, + unsigned array_index, + unsigned count); + extern void _mesa_update_shader_textures_used(struct gl_program *prog); @@ -208,4 +235,61 @@ struct gl_builtin_uniform_desc { extern const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[]; +/** + * \name GLSL uniform arrays and structs require special handling. + * + * The GL_ARB_shader_objects spec says that if you use + * glGetUniformLocation to get the location of an array, you CANNOT + * access other elements of the array by adding an offset to the + * returned location. For example, you must call + * glGetUniformLocation("foo[16]") if you want to set the 16th element + * of the array with glUniform(). + * + * HOWEVER, some other OpenGL drivers allow accessing array elements + * by adding an offset to the returned array location. And some apps + * seem to depend on that behaviour. + * + * Mesa's gl_uniform_list doesn't directly support this since each + * entry in the list describes one uniform variable, not one uniform + * element. We could insert dummy entries in the list for each array + * element after [0] but that causes complications elsewhere. + * + * We solve this problem by encoding two values in the location that's + * returned by glGetUniformLocation(): + * a) index into gl_uniform_list::Uniforms[] for the uniform + * b) an array/field offset (0 for simple types) + * + * These two values are encoded in the high and low halves of a GLint. + * By putting the uniform number in the high part and the offset in the + * low part, we can support the unofficial ability to index into arrays + * by adding offsets to the location value. + */ +/*@{*/ +/** + * Combine the uniform's base location and the offset + */ +static inline GLint +_mesa_uniform_merge_location_offset(unsigned base_location, unsigned offset) +{ + return (base_location << 16) | offset; +} + +/** + * Separate the uniform base location and parameter offset + */ +static inline void +_mesa_uniform_split_location_offset(GLint location, unsigned *base_location, + unsigned *offset) +{ + *offset = location & 0xffff; + *base_location = location >> 16; +} +/*@}*/ + + +#ifdef __cplusplus +} +#endif + + #endif /* UNIFORMS_H */ |