mesa: fix UBO queries for active uniforms
authorTapani Pälli <tapani.palli@intel.com>
Mon, 20 Apr 2015 12:41:06 +0000 (15:41 +0300)
committerTapani Pälli <tapani.palli@intel.com>
Tue, 21 Apr 2015 11:37:09 +0000 (14:37 +0300)
Commit 34df5eb introduced regression to GetActiveUniformBlockiv
when querying one of the following properties:

   GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS
   GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES

Implementation counted all uniforms in ubo directly while query should
check first if the uniform in question is _active_.

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90109
Reviewed-By: Martin Peres <martin.peres@linux.intel.com>
src/mesa/main/shader_query.cpp

index b5f1d082c3e8b9c39eff248e3b248cb494ee09c4..14280582c78745a15230318a97822682385e644e 100644 (file)
@@ -860,13 +860,23 @@ get_buffer_property(struct gl_shader_program *shProg,
          *val = RESOURCE_UBO(res)->UniformBufferSize;
          return 1;
       case GL_NUM_ACTIVE_VARIABLES:
-         *val = RESOURCE_UBO(res)->NumUniforms;
+         *val = 0;
+         for (unsigned i = 0; i < RESOURCE_UBO(res)->NumUniforms; i++) {
+            const char *iname = RESOURCE_UBO(res)->Uniforms[i].IndexName;
+            struct gl_program_resource *uni =
+               _mesa_program_resource_find_name(shProg, GL_UNIFORM, iname);
+            if (!uni)
+               continue;
+            (*val)++;
+         }
          return 1;
       case GL_ACTIVE_VARIABLES:
          for (unsigned i = 0; i < RESOURCE_UBO(res)->NumUniforms; i++) {
             const char *iname = RESOURCE_UBO(res)->Uniforms[i].IndexName;
             struct gl_program_resource *uni =
                _mesa_program_resource_find_name(shProg, GL_UNIFORM, iname);
+            if (!uni)
+               continue;
             *val++ =
                _mesa_program_resource_index(shProg, uni);
          }