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

2015-10-27 Thread Tapani Pälli

Reviewed-by: Tapani Pälli 

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 
---
  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) {


___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


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

2015-10-27 Thread Samuel Iglesias Gonsalvez
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 
---
 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) {
-- 
2.1.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev