[Mesa-dev] [PATCH] main: fix GL_MAX_NUM_ACTIVE_VARIABLES value for shader storage blocks

Tapani Pälli tapani.palli at intel.com
Tue Oct 27 04:40:47 PDT 2015


Reviewed-by: Tapani Pälli <tapani.palli at intel.com>

On 10/27/2015 11:08 AM, Samuel Iglesias Gonsalvez wrote:
> The maximum number of active variables for shader storage blocks should
> take into account the specific rules for shader storage blocks, i.e. for
> an active shader storage block member declared as an array, an entry
> will be generated only for the first array element, regardless of its type.
>
> Fixes 3 dEQP-GLES31.functional.* tests:
>
> dEQP-GLES31.functional.program_interface_query.shader_storage_block.active_variables.named_block
> dEQP-GLES31.functional.program_interface_query.shader_storage_block.active_variables.unnamed_block
> dEQP-GLES31.functional.program_interface_query.shader_storage_block.active_variables.block_array
>
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> ---
>   src/mesa/main/program_resource.c | 21 ++++++++++++++++++++-
>   1 file changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/main/program_resource.c b/src/mesa/main/program_resource.c
> index eb71fdd..b7e25fe 100644
> --- a/src/mesa/main/program_resource.c
> +++ b/src/mesa/main/program_resource.c
> @@ -119,7 +119,6 @@ _mesa_GetProgramInterfaceiv(GLuint program, GLenum programInterface,
>      case GL_MAX_NUM_ACTIVE_VARIABLES:
>         switch (programInterface) {
>         case GL_UNIFORM_BLOCK:
> -      case GL_SHADER_STORAGE_BLOCK:
>            for (i = 0, *params = 0; i < shProg->NumProgramResourceList; i++) {
>               if (shProg->ProgramResourceList[i].Type == programInterface) {
>                  struct gl_uniform_block *block =
> @@ -129,6 +128,26 @@ _mesa_GetProgramInterfaceiv(GLuint program, GLenum programInterface,
>               }
>            }
>            break;
> +      case GL_SHADER_STORAGE_BLOCK:
> +         for (i = 0, *params = 0; i < shProg->NumProgramResourceList; i++) {
> +            if (shProg->ProgramResourceList[i].Type == programInterface) {
> +               struct gl_uniform_block *block =
> +                  (struct gl_uniform_block *)
> +                  shProg->ProgramResourceList[i].Data;
> +               GLint block_params = 0;
> +               for (unsigned j = 0; j < block->NumUniforms; j++) {
> +                  const char *iname = block->Uniforms[j].IndexName;
> +                  struct gl_program_resource *uni =
> +                     _mesa_program_resource_find_name(shProg, GL_BUFFER_VARIABLE,
> +                                                      iname, NULL);
> +                  if (!uni)
> +                     continue;
> +                  block_params++;
> +               }
> +               *params = MAX2(*params, block_params);
> +            }
> +         }
> +         break;
>         case GL_ATOMIC_COUNTER_BUFFER:
>            for (i = 0, *params = 0; i < shProg->NumProgramResourceList; i++) {
>               if (shProg->ProgramResourceList[i].Type == programInterface) {
>


More information about the mesa-dev mailing list