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);
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.
ralloc_free(shProg->UniformStorage);
shProg->NumUserUniformStorage = 0;
shProg->UniformStorage = NULL;
+ shProg->UniformLocationBaseScale = 0;
}
if (shProg->UniformHash) {
_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;
}
/**
GLint location, unsigned *base_location,
unsigned *offset)
{
- *offset = location & 0xffff;
- *base_location = location >> 16;
+ *offset = location % prog->UniformLocationBaseScale;
+ *base_location = location / prog->UniformLocationBaseScale;
}
/*@}*/