On Thu, 2016-12-15 at 20:10 -0800, Ian Romanick wrote: > From: Ian Romanick <[email protected]> > > Signed-off-by: Ian Romanick <[email protected]> > Cc: [email protected] > --- > 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;
Shouldn't this go in the new process_block_array_leaf() too? Otherwise this patch is: Reviewed-by: Timothy Arceri <[email protected]> > } > } > } > @@ -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 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
