diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2013-06-10 10:35:05 -0700 |
---|---|---|
committer | Chad Versace <chad.versace@linux.intel.com> | 2013-06-13 08:18:04 -0700 |
commit | c8cc27c980acf031bb314eb85121983b7af5dc11 (patch) | |
tree | 6a6b01e6d01a3bb491c13a400cb9000ebad4e483 | |
parent | fb494ce30366ad6b63762cb7e17e80f69e543e31 (diff) |
glsl: Add gl_shader_program::UniformLocationBaseScale
This is used by _mesa_uniform_merge_location_offset and
_mesa_uniform_split_location_offset to determine how the base and offset
are packed. Previously, this value was hard coded as (1U<<16) in those
functions via the shift and mask contained therein. The value is still
(1U<<16), but it can be changed in the future.
The next patch dynamically generates this value.
NOTE: This is a candidate for stable release branches.
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-and-tested-by: Chad Versace <chad.versace@linux.intel.com>
(cherry picked from commit 26d86d26f9f972b19c7040bdb1b1daf48537ef3e)
-rw-r--r-- | src/glsl/link_uniforms.cpp | 2 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 15 | ||||
-rw-r--r-- | src/mesa/main/shaderobj.c | 1 | ||||
-rw-r--r-- | src/mesa/main/uniforms.h | 8 |
4 files changed, 23 insertions, 3 deletions
diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp index 010296b6b69..84680bebd9a 100644 --- a/src/glsl/link_uniforms.cpp +++ b/src/glsl/link_uniforms.cpp @@ -739,6 +739,8 @@ link_assign_uniform_locations(struct gl_shader_program *prog) sizeof(prog->_LinkedShaders[i]->SamplerTargets)); } + prog->UniformLocationBaseScale = (1U<<16); + #ifndef NDEBUG for (unsigned i = 0; i < num_user_uniforms; i++) { assert(uniforms[i].storage != NULL); diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 92a70f416d3..cd8650cbc2b 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2333,6 +2333,21 @@ struct gl_shader_program unsigned NumUniformBlocks; /** + * Scale factor for the uniform base location + * + * This is used to generate locations (returned by \c glGetUniformLocation) + * of uniforms. The base location of the uniform is multiplied by this + * value, and the array index is added. + * + * \note + * Must be >= 1. + * + * \sa + * _mesa_uniform_merge_location_offset, _mesa_uniform_split_location_offset + */ + unsigned UniformLocationBaseScale; + + /** * Indices into the _LinkedShaders's UniformBlocks[] array for each stage * they're used in, or -1. * diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c index a60d8f38a9a..a62ad0413cf 100644 --- a/src/mesa/main/shaderobj.c +++ b/src/mesa/main/shaderobj.c @@ -283,6 +283,7 @@ _mesa_clear_shader_program_data(struct gl_context *ctx, ralloc_free(shProg->UniformStorage); shProg->NumUserUniformStorage = 0; shProg->UniformStorage = NULL; + shProg->UniformLocationBaseScale = 0; } if (shProg->UniformHash) { diff --git a/src/mesa/main/uniforms.h b/src/mesa/main/uniforms.h index d718b0f12e3..14fe26d5fde 100644 --- a/src/mesa/main/uniforms.h +++ b/src/mesa/main/uniforms.h @@ -272,7 +272,9 @@ static inline GLint _mesa_uniform_merge_location_offset(const struct gl_shader_program *prog, unsigned base_location, unsigned offset) { - return (base_location << 16) | offset; + assert(prog->UniformLocationBaseScale >= 0); + assert(offset < prog->UniformLocationBaseScale); + return (base_location * prog->UniformLocationBaseScale) + offset; } /** @@ -283,8 +285,8 @@ _mesa_uniform_split_location_offset(const struct gl_shader_program *prog, GLint location, unsigned *base_location, unsigned *offset) { - *offset = location & 0xffff; - *base_location = location >> 16; + *offset = location % prog->UniformLocationBaseScale; + *base_location = location / prog->UniformLocationBaseScale; } /*@}*/ |