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.

 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:
-- 
1.9.1

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

Reply via email to