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>
This commit is contained in:
Ian Romanick 2013-06-10 10:35:05 -07:00
parent 5097f35841
commit 26d86d26f9
4 changed files with 23 additions and 3 deletions

View file

@ -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);

View file

@ -2332,6 +2332,21 @@ struct gl_shader_program
struct gl_uniform_block *UniformBlocks;
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.

View file

@ -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) {

View file

@ -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;
}
/*@}*/