From d56bd07bb3b6821eca961dde15c40f179be99e2d Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Mon, 12 Dec 2016 12:24:18 -0800 Subject: 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 Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Timothy Arceri Reviewed-by: Kenneth Graunke --- src/compiler/glsl/link_uniform_blocks.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'src/compiler') diff --git a/src/compiler/glsl/link_uniform_blocks.cpp b/src/compiler/glsl/link_uniform_blocks.cpp index 41b26e72d2d..e952c7a1bff 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); -- cgit v1.2.3