summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2013-06-10 10:35:05 -0700
committerChad Versace <chad.versace@linux.intel.com>2013-06-13 08:18:04 -0700
commitc8cc27c980acf031bb314eb85121983b7af5dc11 (patch)
tree6a6b01e6d01a3bb491c13a400cb9000ebad4e483
parentfb494ce30366ad6b63762cb7e17e80f69e543e31 (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.cpp2
-rw-r--r--src/mesa/main/mtypes.h15
-rw-r--r--src/mesa/main/shaderobj.c1
-rw-r--r--src/mesa/main/uniforms.h8
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;
}
/*@}*/