[Mesa-dev] [PATCH 03/19] glsl: Track the linearized array index for each UBO instance array element
Ian Romanick
idr at freedesktop.org
Fri Dec 16 04:10:15 UTC 2016
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;
}
}
}
@@ -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
More information about the mesa-dev
mailing list