[Mesa-dev] [PATCH 3/3] glsl: Generate smaller values for uniform locations
Ian Romanick
idr at freedesktop.org
Mon Jun 10 11:28:59 PDT 2013
On 06/10/2013 11:21 AM, Brian Paul wrote:
> On 06/10/2013 11:52 AM, Ian Romanick wrote:
>> From: Ian Romanick <ian.d.romanick at intel.com>
>>
>> Previously we would generate uniform locations as (slot << 16) +
>> array_index. We do this two handle applications that assume the
>> location of a[2] will be +1 from the location of a[1]. This resulted in
>> every uniform location being at least 0x10000. We've now encountered
>> two applications that assume uniform values will be smaller.
>>
>> NEITHER BEHAVIOR IS GUARNATEED
>
> GUARANTEED
Oops.
> OR IMPLIED BY ANY VERSION OF OpenGL.
>>
>> Our workaround for one sort of buggy application breaks a different sort
>> of buggy application. Irony anyone?
>>
>> Other implementations happen to have both these behaviors (sequential
>> array elements and small values), so let's just match their behavior and
>> let buggy apps break on other implementations. /Sigh/
>>
>> NOTE: This is a candidate for stable release branches.
>>
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>> Cc: Chad Versace <chad.versace at linux.intel.com>
>> ---
>> src/glsl/link_uniforms.cpp | 14 +++++++++++++-
>> 1 file changed, 13 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp
>> index 84680be..6f67c70 100644
>> --- a/src/glsl/link_uniforms.cpp
>> +++ b/src/glsl/link_uniforms.cpp
>> @@ -739,7 +739,19 @@ link_assign_uniform_locations(struct
>> gl_shader_program *prog)
>> sizeof(prog->_LinkedShaders[i]->SamplerTargets));
>> }
>>
>> - prog->UniformLocationBaseScale = (1U<<16);
>> + /* Determine the size of the largest uniform array queryable via
>> + * glGetUniformLocation. Using this as the location scale
>> guarantees that
>> + * there is enough "room" for the array index to be stored in the
>> low order
>> + * part of the uniform location. It also makes the locations be more
>> + * tightly packed.
>> + */
>> + unsigned max_array_size = 1;
>> + for (unsigned i = 0; i < num_user_uniforms; i++) {
>> + if (uniforms[i].array_elements > max_array_size)
>> + max_array_size = uniforms[i].array_elements;
>
> Tab indent
Dang it! I thought I caught all of those. I'll double check the whole
series before I push.
>> + }
>> +
>> + prog->UniformLocationBaseScale = max_array_size;
>>
>> #ifndef NDEBUG
>> for (unsigned i = 0; i < num_user_uniforms; i++) {
>>
>
> Series looks good to me.
>
> Reviewed-by: Brian Paul <brianp at vmware.com>
>
More information about the mesa-dev
mailing list