mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 21:50:12 +01:00
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:
parent
5097f35841
commit
26d86d26f9
4 changed files with 23 additions and 3 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
/*@}*/
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue