Mesa (master): glsl: Track the linearized array index for each UBO instance array element

Ian Romanick idr at kemper.freedesktop.org
Tue Dec 20 01:34:06 UTC 2016


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

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Mon Dec 12 12:24:18 2016 -0800

glsl: Track the linearized array index for each UBO instance array element

v2: Set linearizer_array_index in process_block_array_leaf.  Suggested
by Timothy.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Cc: mesa-stable at lists.freedesktop.org
Reviewed-by: Timothy Arceri <timothy.arceri at collabora.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/compiler/glsl/link_uniform_blocks.cpp | 19 +++++++++++++++----
 src/mesa/main/mtypes.h                    | 15 +++++++++++++++
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/src/compiler/glsl/link_uniform_blocks.cpp b/src/compiler/glsl/link_uniform_blocks.cpp
index 41b26e7..e952c7a 100644
--- a/src/compiler/glsl/link_uniform_blocks.cpp
+++ b/src/compiler/glsl/link_uniform_blocks.cpp
@@ -206,16 +206,23 @@ static void process_block_array_leaf(char **name, gl_uniform_block *blocks,
                                      const struct link_uniform_block_active *const b,
                                      unsigned *block_index,
                                      unsigned *binding_offset,
+                                     unsigned linearized_index,
                                      struct gl_context *ctx,
                                      struct gl_shader_program *prog);
 
+/**
+ *
+ * \param first_index Value of \c block_index for the first element of the
+ *                    array.
+ */
 static void
 process_block_array(struct uniform_block_array_elements *ub_array, char **name,
                     size_t name_length, gl_uniform_block *blocks,
                     ubo_visitor *parcel, gl_uniform_buffer_variable *variables,
                     const struct link_uniform_block_active *const b,
                     unsigned *block_index, unsigned *binding_offset,
-                    struct gl_context *ctx, struct gl_shader_program *prog)
+                    struct gl_context *ctx, struct gl_shader_program *prog,
+                    unsigned first_index)
 {
    for (unsigned j = 0; j < ub_array->num_array_elements; j++) {
       size_t new_length = name_length;
@@ -227,11 +234,12 @@ process_block_array(struct uniform_block_array_elements *ub_array, char **name,
       if (ub_array->array) {
          process_block_array(ub_array->array, name, new_length, blocks,
                              parcel, variables, b, block_index,
-                             binding_offset, ctx, prog);
+                             binding_offset, ctx, prog, first_index);
       } else {
          process_block_array_leaf(name, blocks,
                                   parcel, variables, b, block_index,
-                                  binding_offset, ctx, prog);
+                                  binding_offset, *block_index - first_index,
+                                  ctx, prog);
       }
    }
 }
@@ -242,6 +250,7 @@ process_block_array_leaf(char **name,
                          ubo_visitor *parcel, gl_uniform_buffer_variable *variables,
                          const struct link_uniform_block_active *const b,
                          unsigned *block_index, unsigned *binding_offset,
+                         unsigned linearized_index,
                          struct gl_context *ctx, struct gl_shader_program *prog)
 {
    unsigned i = *block_index;
@@ -262,6 +271,7 @@ process_block_array_leaf(char **name,
    blocks[i].UniformBufferSize = 0;
    blocks[i]._Packing = gl_uniform_block_packing(type->interface_packing);
    blocks[i]._RowMajor = type->get_interface_row_major();
+   blocks[i].linearized_array_index = linearized_index;
 
    parcel->process(type, blocks[i].Name);
 
@@ -359,7 +369,8 @@ create_buffer_blocks(void *mem_ctx, struct gl_context *ctx,
 
             assert(b->has_instance_name);
             process_block_array(b->array, &name, name_length, blocks, &parcel,
-                                variables, b, &i, &binding_offset, ctx, prog);
+                                variables, b, &i, &binding_offset, ctx, prog,
+                                i);
             ralloc_free(name);
          } else {
             blocks[i].Name = ralloc_strdup(blocks, block_type->name);
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 36d48e2..ac4cac0 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2493,6 +2493,21 @@ struct gl_uniform_block
    uint8_t stageref;
 
    /**
+    * Linearized array index for uniform block instance arrays
+    *
+    * Given a uniform block instance array declared with size
+    * blk[s_0][s_1]..[s_m], the block referenced by blk[i_0][i_1]..[i_m] will
+    * have the linearized array index
+    *
+    *           m-1       m
+    *     i_m + ∑   i_j * ∏     s_k
+    *           j=0       k=j+1
+    *
+    * For a uniform block instance that is not an array, this is always 0.
+    */
+   uint8_t linearized_array_index;
+
+   /**
     * Layout specified in the shader
     *
     * This isn't accessible through the API, but it is used while




More information about the mesa-commit mailing list