[Mesa-dev] [PATCH 3/3] glsl: Generate smaller values for uniform locations

Brian Paul brianp at vmware.com
Mon Jun 10 11:21:43 PDT 2013


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

  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


> +   }
> +
> +   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