[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