From: Ian Romanick <ian.d.roman...@intel.com> Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> Cc: mesa-sta...@lists.freedesktop.org --- src/compiler/glsl/link_uniform_blocks.cpp | 17 ++++++++++++++--- src/mesa/main/mtypes.h | 15 +++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/src/compiler/glsl/link_uniform_blocks.cpp b/src/compiler/glsl/link_uniform_blocks.cpp index 41b26e7..9adfbd5 100644 --- a/src/compiler/glsl/link_uniform_blocks.cpp +++ b/src/compiler/glsl/link_uniform_blocks.cpp @@ -209,13 +209,19 @@ static void process_block_array_leaf(char **name, gl_uniform_block *blocks, 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 +233,15 @@ 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 { + const unsigned i = *block_index; + process_block_array_leaf(name, blocks, parcel, variables, b, block_index, binding_offset, ctx, prog); + + blocks[i].linearized_array_index = i - first_index; } } } @@ -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 -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev