[Mesa-dev] [PATCH 03/19] glsl: Track the linearized array index for each UBO instance array element
Ian Romanick
idr at freedesktop.org
Mon Dec 19 22:32:15 UTC 2016
On 12/18/2016 09:54 PM, Timothy Arceri wrote:
> On Thu, 2016-12-15 at 20:10 -0800, Ian Romanick wrote:
>> From: Ian Romanick <ian.d.romanick at intel.com>
>>
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>> Cc: mesa-stable at 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;
>
> Shouldn't this go in the new process_block_array_leaf() too?
It only needs to be one place. *block_index is modified by
process_block_array_leaf, but the linearized index is the pre-modified
(that's a word... I'm sure of it!) value. It could go in
process_block_array_leaf instead, but then I'd also need to pass either
first_index or (i - first_index).
I originally had a patch that removed the open-coded copy of
process_block_array_leaf which does not need to set
linearized_array_index. I dropped that patch because there was a subtle
difference between the two implementations. I will probably revisit the
idea, however.
> Otherwise this patch is:
>
> Reviewed-by: Timothy Arceri <timothy.arceri at collabora.com>
>
>
>> }
>> }
>> }
>> @@ -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-dev
mailing list