Mesa (master): Revert "glsl: move uniform calculation to link_uniforms"

Tapani Pälli tpalli at kemper.freedesktop.org
Wed Jan 20 20:05:55 UTC 2016


Module: Mesa
Branch: master
Commit: f1152c3455d0fa1a8b3cafee2aaeffb31d5ba49b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f1152c3455d0fa1a8b3cafee2aaeffb31d5ba49b

Author: Tapani Pälli <tapani.palli at intel.com>
Date:   Wed Jan 20 22:02:22 2016 +0200

Revert "glsl: move uniform calculation to link_uniforms"

This reverts commit 4475d8f9169195baefa893b9b147fe20414cda7c.

---

 src/glsl/link_uniforms.cpp | 87 ++++++----------------------------------------
 src/glsl/linker.cpp        | 19 ++++++----
 src/glsl/linker.h          |  3 +-
 3 files changed, 24 insertions(+), 85 deletions(-)

diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp
index 76ee70d..33b2d4c 100644
--- a/src/glsl/link_uniforms.cpp
+++ b/src/glsl/link_uniforms.cpp
@@ -1057,40 +1057,9 @@ assign_hidden_uniform_slot_id(const char *name, unsigned hidden_id,
    uniform_size->map->put(hidden_uniform_start + hidden_id, name);
 }
 
-/**
- * Search UniformRemapTable for empty block big enough to hold given uniform.
- * TODO Optimize this algorithm later if it turns out to be a major bottleneck.
- */
-static int
-find_empty_block(struct gl_shader_program *prog,
-                 struct gl_uniform_storage *uniform)
-{
-   const unsigned entries = MAX2(1, uniform->array_elements);
-   for (unsigned i = 0, j; i < prog->NumUniformRemapTable; i++) {
-      /* We found empty space in UniformRemapTable. */
-      if (prog->UniformRemapTable[i] == NULL) {
-         for (j = i; j < entries && j < prog->NumUniformRemapTable; j++) {
-            if (prog->UniformRemapTable[j] != NULL) {
-               /* Entries do not fit in this space, continue searching
-                * after this location.
-                */
-               i = j + 1;
-               break;
-            }
-         }
-         /* Entries fit, we can return this location. */
-         if (i != j + 1) {
-            return i;
-         }
-      }
-   }
-   return -1;
-}
-
 void
 link_assign_uniform_locations(struct gl_shader_program *prog,
-                              unsigned int boolean_true,
-                              unsigned int max_locations)
+                              unsigned int boolean_true)
 {
    ralloc_free(prog->UniformStorage);
    prog->UniformStorage = NULL;
@@ -1181,20 +1150,6 @@ link_assign_uniform_locations(struct gl_shader_program *prog,
 
    parcel_out_uniform_storage parcel(prog->UniformHash, uniforms, data);
 
-   unsigned total_entries = 0;
-
-   /* Calculate amount of 'holes' left after explicit locations were
-    * reserved from UniformRemapTable.
-    */
-   unsigned empty_locs = 0;
-   for (unsigned i = 0; i < prog->NumUniformRemapTable; i++)
-      if (prog->UniformRemapTable[i] == NULL)
-         empty_locs++;
-
-   /* Add all the reserved explicit locations - empty locations in remap table. */
-   if (prog->NumUniformRemapTable)
-      total_entries = (prog->NumUniformRemapTable - 1) - empty_locs;
-
    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
       if (prog->_LinkedShaders[i] == NULL)
 	 continue;
@@ -1258,43 +1213,21 @@ link_assign_uniform_locations(struct gl_shader_program *prog,
       /* how many new entries for this uniform? */
       const unsigned entries = MAX2(1, uniforms[i].array_elements);
 
-      /* Find UniformRemapTable for empty blocks where we can fit this uniform. */
-      int chosen_location = -1;
-
-      if (empty_locs)
-         chosen_location = find_empty_block(prog, &uniforms[i]);
-
-      if (chosen_location != -1) {
-         empty_locs -= entries;
-      } else {
-         chosen_location = prog->NumUniformRemapTable;
-
-         /* Add new entries to the total amount of entries. */
-         total_entries += entries;
-
-         /* resize remap table to fit new entries */
-         prog->UniformRemapTable =
-            reralloc(prog,
-                     prog->UniformRemapTable,
-                     gl_uniform_storage *,
-                     prog->NumUniformRemapTable + entries);
-         prog->NumUniformRemapTable += entries;
-      }
+      /* resize remap table to fit new entries */
+      prog->UniformRemapTable =
+         reralloc(prog,
+                  prog->UniformRemapTable,
+                  gl_uniform_storage *,
+                  prog->NumUniformRemapTable + entries);
 
       /* set pointers for this uniform */
       for (unsigned j = 0; j < entries; j++)
-         prog->UniformRemapTable[chosen_location + j] = &uniforms[i];
+         prog->UniformRemapTable[prog->NumUniformRemapTable+j] = &uniforms[i];
 
       /* set the base location in remap table for the uniform */
-      uniforms[i].remap_location = chosen_location;
-   }
+      uniforms[i].remap_location = prog->NumUniformRemapTable;
 
-    /* Verify that total amount of entries for explicit and implicit locations
-     * is less than MAX_UNIFORM_LOCATIONS.
-     */
-   if (total_entries >= max_locations) {
-      linker_error(prog, "count of uniform locations >= MAX_UNIFORM_LOCATIONS"
-                   "(%u >= %u)", total_entries, max_locations);
+      prog->NumUniformRemapTable += entries;
    }
 
    /* Reserve all the explicit locations of the active subroutine uniforms. */
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 5be8d9f..6657777 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -3146,6 +3146,7 @@ check_explicit_uniform_locations(struct gl_context *ctx,
       return;
    }
 
+   unsigned entries_total = 0;
    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
       struct gl_shader *sh = prog->_LinkedShaders[i];
 
@@ -3157,6 +3158,8 @@ check_explicit_uniform_locations(struct gl_context *ctx,
          if (!var || var->data.mode != ir_var_uniform)
             continue;
 
+         entries_total += var->type->uniform_locations();
+
          if (var->data.explicit_location) {
             bool ret;
             if (var->type->without_array()->is_subroutine())
@@ -3170,6 +3173,15 @@ check_explicit_uniform_locations(struct gl_context *ctx,
          }
       }
    }
+
+   /* Verify that total amount of entries for explicit and implicit locations
+    * is less than MAX_UNIFORM_LOCATIONS.
+    */
+   if (entries_total >= ctx->Const.MaxUserAssignableUniformLocations) {
+      linker_error(prog, "count of uniform locations >= MAX_UNIFORM_LOCATIONS"
+                   "(%u >= %u)", entries_total,
+                   ctx->Const.MaxUserAssignableUniformLocations);
+   }
    delete uniform_map;
 }
 
@@ -4544,12 +4556,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
       goto done;
 
    update_array_sizes(prog);
-   link_assign_uniform_locations(prog, ctx->Const.UniformBooleanTrue,
-                                 ctx->Const.MaxUserAssignableUniformLocations);
-
-   if (!prog->LinkStatus)
-      goto done;
-
+   link_assign_uniform_locations(prog, ctx->Const.UniformBooleanTrue);
    link_assign_atomic_counter_resources(ctx, prog);
    store_fragdepth_layout(prog);
 
diff --git a/src/glsl/linker.h b/src/glsl/linker.h
index 76f95c0..c80be1c 100644
--- a/src/glsl/linker.h
+++ b/src/glsl/linker.h
@@ -35,8 +35,7 @@ link_invalidate_variable_locations(exec_list *ir);
 
 extern void
 link_assign_uniform_locations(struct gl_shader_program *prog,
-                              unsigned int boolean_true,
-                              unsigned int max_locations);
+                              unsigned int boolean_true);
 
 extern void
 link_set_uniform_initializers(struct gl_shader_program *prog,




More information about the mesa-commit mailing list