Mesa (master): glsl/linker: remove ubo explicit binding handling

Alejandro Pinheiro apinheiro at kemper.freedesktop.org
Fri Feb 9 07:52:25 UTC 2018


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

Author: Alejandro Piñeiro <apinheiro at igalia.com>
Date:   Wed Jan 24 11:03:00 2018 +0100

glsl/linker: remove ubo explicit binding handling

This is already handled at link_uniform_blocks, specifically at
process_block_array_leaf.

Additionally, this code was not handling correctly arrays of
arrays. When creating the name of the block to set the binding, it
only took into account the first level, so any attempt to set a
explicit binding on a array of array ubo would trigger an assertion.

Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>

---

 src/compiler/glsl/link_uniform_initializers.cpp | 58 +------------------------
 1 file changed, 2 insertions(+), 56 deletions(-)

diff --git a/src/compiler/glsl/link_uniform_initializers.cpp b/src/compiler/glsl/link_uniform_initializers.cpp
index 97796e721b..35522f7646 100644
--- a/src/compiler/glsl/link_uniform_initializers.cpp
+++ b/src/compiler/glsl/link_uniform_initializers.cpp
@@ -182,26 +182,6 @@ set_opaque_binding(void *mem_ctx, gl_shader_program *prog,
    }
 }
 
-static void
-set_block_binding(gl_shader_program *prog, const char *block_name,
-                  unsigned mode, int binding)
-{
-   unsigned num_blocks = mode == ir_var_uniform ?
-      prog->data->NumUniformBlocks :
-      prog->data->NumShaderStorageBlocks;
-   struct gl_uniform_block *blks = mode == ir_var_uniform ?
-      prog->data->UniformBlocks : prog->data->ShaderStorageBlocks;
-
-   for (unsigned i = 0; i < num_blocks; i++) {
-      if (!strcmp(blks[i].Name, block_name)) {
-         blks[i].Binding = binding;
-         return;
-      }
-   }
-
-   unreachable("Failed to initialize block binding");
-}
-
 void
 set_uniform_initializer(void *mem_ctx, gl_shader_program *prog,
                         const char *name, const glsl_type *type,
@@ -307,43 +287,9 @@ link_set_uniform_initializers(struct gl_shader_program *prog,
                linker::set_opaque_binding(mem_ctx, prog, var, var->type,
                                           var->name, &binding);
             } else if (var->is_in_buffer_block()) {
-               const glsl_type *const iface_type = var->get_interface_type();
-
-               /* If the variable is an array and it is an interface instance,
-                * we need to set the binding for each array element.  Just
-                * checking that the variable is an array is not sufficient.
-                * The variable could be an array element of a uniform block
-                * that lacks an instance name.  For example:
-                *
-                *     uniform U {
-                *         float f[4];
-                *     };
-                *
-                * In this case "f" would pass is_in_buffer_block (above) and
-                * type->is_array(), but it will fail is_interface_instance().
+               /* This case is handled by link_uniform_blocks (at
+                * process_block_array_leaf)
                 */
-               if (var->is_interface_instance() && var->type->is_array()) {
-                  for (unsigned i = 0; i < var->type->length; i++) {
-                     const char *name =
-                        ralloc_asprintf(mem_ctx, "%s[%u]", iface_type->name, i);
-
-                     /* Section 4.4.3 (Uniform Block Layout Qualifiers) of the
-                      * GLSL 4.20 spec says:
-                      *
-                      *     "If the binding identifier is used with a uniform
-                      *     block instanced as an array then the first element
-                      *     of the array takes the specified block binding and
-                      *     each subsequent element takes the next consecutive
-                      *     uniform block binding point."
-                      */
-                     linker::set_block_binding(prog, name, var->data.mode,
-                                               var->data.binding + i);
-                  }
-               } else {
-                  linker::set_block_binding(prog, iface_type->name,
-                                            var->data.mode,
-                                            var->data.binding);
-               }
             } else if (type->contains_atomic()) {
                /* we don't actually need to do anything. */
             } else {




More information about the mesa-commit mailing list