[Mesa-dev] [PATCH] main: Fix block index when mixing UBO and SSBO blocks

Tapani Pälli tapani.palli at intel.com
Wed Sep 30 23:13:43 PDT 2015



On 09/29/2015 05:38 PM, Iago Toral Quiroga wrote:
> Since we store both in UniformBlocks, we can't just compute the index by
> subtracting the array address start, we need to count the number of
> buffers of the approriate type.
> ---
>
> Or we can just fall back to calc_resource_index... that would also work.
> This should be a bit faster though since it only traverses the list of
> uniform blocks and the code is simple enough, but it probably won't make
> a significant difference anyway.

This is correct but I'd vote for using calc_resource_index to reduce 
special cases. Ideally in some point gl_program_resource starts to be 
something more than pointer and then it helps to have generic code for 
these things.


>   src/mesa/main/shader_query.cpp | 18 +++++++++++++++++-
>   1 file changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
> index 0cada50..33c95b4 100644
> --- a/src/mesa/main/shader_query.cpp
> +++ b/src/mesa/main/shader_query.cpp
> @@ -602,6 +602,22 @@ calc_resource_index(struct gl_shader_program *shProg,
>      return GL_INVALID_INDEX;
>   }
>
> +static GLuint
> +calc_ubo_ssbo_index(struct gl_shader_program *shProg,
> +                    struct gl_program_resource *res)
> +{
> +   unsigned i;
> +   GLuint index = 0;
> +   bool is_shader_storage = res->Type == GL_SHADER_STORAGE_BLOCK;
> +   for (i = 0; i < shProg->NumBufferInterfaceBlocks; i++) {
> +      if (&shProg->UniformBlocks[i] == RESOURCE_UBO(res))
> +         return index;
> +      if (shProg->UniformBlocks[i].IsShaderStorage == is_shader_storage)
> +         index++;
> +   }
> +   return GL_INVALID_INDEX;
> +}
> +
>   /**
>    * Calculate index for the given resource.
>    */
> @@ -615,7 +631,7 @@ _mesa_program_resource_index(struct gl_shader_program *shProg,
>      switch (res->Type) {
>      case GL_UNIFORM_BLOCK:
>      case GL_SHADER_STORAGE_BLOCK:
> -      return RESOURCE_UBO(res)- shProg->UniformBlocks;
> +      return calc_ubo_ssbo_index(shProg, res);
>      case GL_ATOMIC_COUNTER_BUFFER:
>         return RESOURCE_ATC(res) - shProg->AtomicBuffers;
>      case GL_TRANSFORM_FEEDBACK_VARYING:
>


More information about the mesa-dev mailing list