[Mesa-dev] [PATCH 3/6] glsl: use UniformHash to find storage location

Timothy Arceri timothy.arceri at collabora.com
Sun Jul 24 23:36:20 UTC 2016


There is no need to be looping over all the uniforms.
---
 src/compiler/glsl/link_uniform_initializers.cpp | 29 ++++++++++---------------
 1 file changed, 11 insertions(+), 18 deletions(-)

diff --git a/src/compiler/glsl/link_uniform_initializers.cpp b/src/compiler/glsl/link_uniform_initializers.cpp
index effbb6a..1d7c207 100644
--- a/src/compiler/glsl/link_uniform_initializers.cpp
+++ b/src/compiler/glsl/link_uniform_initializers.cpp
@@ -22,6 +22,7 @@
  */
 
 #include "main/core.h"
+#include "program/hash_table.h"
 #include "ir.h"
 #include "linker.h"
 #include "ir_uniform.h"
@@ -33,14 +34,13 @@
 namespace linker {
 
 gl_uniform_storage *
-get_storage(gl_uniform_storage *storage, unsigned num_storage,
-	    const char *name)
+get_storage(struct gl_shader_program *prog, const char *name)
 {
-   for (unsigned int i = 0; i < num_storage; i++) {
-      if (strcmp(name, storage[i].name) == 0)
-	 return &storage[i];
-   }
+   unsigned id;
+   if (prog->UniformHash->get(id, name))
+      return &prog->UniformStorage[id];
 
+   assert(!"No uniform storage found!");
    return NULL;
 }
 
@@ -109,13 +109,10 @@ set_opaque_binding(void *mem_ctx, gl_shader_program *prog,
                             element_name, binding);
       }
    } else {
-      struct gl_uniform_storage *const storage =
-         get_storage(prog->UniformStorage, prog->NumUniformStorage, name);
+      struct gl_uniform_storage *const storage = get_storage(prog, name);
 
-      if (storage == NULL) {
-         assert(storage != NULL);
+      if (!storage)
          return;
-      }
 
       const unsigned elements = MAX2(storage->array_elements, 1);
 
@@ -208,14 +205,10 @@ set_uniform_initializer(void *mem_ctx, gl_shader_program *prog,
       return;
    }
 
-   struct gl_uniform_storage *const storage =
-      get_storage(prog->UniformStorage,
-                  prog->NumUniformStorage,
-		  name);
-   if (storage == NULL) {
-      assert(storage != NULL);
+   struct gl_uniform_storage *const storage = get_storage(prog, name);
+
+   if (!storage)
       return;
-   }
 
    if (val->type->is_array()) {
       const enum glsl_base_type base_type =
-- 
2.7.4



More information about the mesa-dev mailing list