From 47621345339eefc57dd3b2f98e8c07d33b4759c1 Mon Sep 17 00:00:00 2001 From: Andrii Simiklit Date: Thu, 21 Feb 2019 17:10:49 +0200 Subject: [PATCH] glsl: disallow to eliminate first elements of the ub/ssbo array This is a draft. Signed-off-by: Andrii Simiklit --- .../link_uniform_block_active_visitor.cpp | 47 +++---------------- .../glsl/link_uniform_block_active_visitor.h | 3 +- src/compiler/glsl/link_uniform_blocks.cpp | 7 ++- 3 files changed, 11 insertions(+), 46 deletions(-) diff --git a/src/compiler/glsl/link_uniform_block_active_visitor.cpp b/src/compiler/glsl/link_uniform_block_active_visitor.cpp index 368981852c0..c8bcc148185 100644 --- a/src/compiler/glsl/link_uniform_block_active_visitor.cpp +++ b/src/compiler/glsl/link_uniform_block_active_visitor.cpp @@ -111,40 +111,15 @@ process_arrays(void *mem_ctx, ir_dereference_array *ir, /* Index is a constant, so mark just that element used, if not * already. */ - const unsigned idx = c->get_uint_component(0); - - unsigned i; - for (i = 0; i < ub_array->num_array_elements; i++) { - if (ub_array->array_elements[i] == idx) - break; - } - - assert(i <= ub_array->num_array_elements); - - if (i == ub_array->num_array_elements) { - ub_array->array_elements = reralloc(mem_ctx, - ub_array->array_elements, - unsigned, - ub_array->num_array_elements + 1); - - ub_array->array_elements[ub_array->num_array_elements] = idx; - - ub_array->num_array_elements++; - } + ub_array->first_unused_array_element = + MAX2(c->get_uint_component(0) + 1, + ub_array->first_unused_array_element); } else { /* The array index is not a constant, so mark the entire array used. */ assert(ir->array->type->is_array()); - if (ub_array->num_array_elements < ir->array->type->length) { - ub_array->num_array_elements = ir->array->type->length; - ub_array->array_elements = reralloc(mem_ctx, - ub_array->array_elements, - unsigned, - ub_array->num_array_elements); - - for (unsigned i = 0; i < ub_array->num_array_elements; i++) { - ub_array->array_elements[i] = i; - } - } + ub_array->first_unused_array_element = + MAX2(ir->array->type->length, + ub_array->first_unused_array_element); } return &ub_array->array; @@ -194,15 +169,7 @@ link_uniform_block_active_visitor::visit(ir_variable *var) assert(b->type->length > 0); *ub_array = rzalloc(this->mem_ctx, struct uniform_block_array_elements); - (*ub_array)->num_array_elements = type->length; - (*ub_array)->array_elements = reralloc(this->mem_ctx, - (*ub_array)->array_elements, - unsigned, - (*ub_array)->num_array_elements); - - for (unsigned i = 0; i < (*ub_array)->num_array_elements; i++) { - (*ub_array)->array_elements[i] = i; - } + (*ub_array)->first_unused_array_element = type->length; ub_array = &(*ub_array)->array; type = type->fields.array; } diff --git a/src/compiler/glsl/link_uniform_block_active_visitor.h b/src/compiler/glsl/link_uniform_block_active_visitor.h index fbac65d5b67..577ad44e8ea 100644 --- a/src/compiler/glsl/link_uniform_block_active_visitor.h +++ b/src/compiler/glsl/link_uniform_block_active_visitor.h @@ -28,8 +28,7 @@ #include "util/hash_table.h" struct uniform_block_array_elements { - unsigned *array_elements; - unsigned num_array_elements; + unsigned first_unused_array_element; ir_dereference_array *ir; diff --git a/src/compiler/glsl/link_uniform_blocks.cpp b/src/compiler/glsl/link_uniform_blocks.cpp index 0b890586298..78e10102e70 100644 --- a/src/compiler/glsl/link_uniform_blocks.cpp +++ b/src/compiler/glsl/link_uniform_blocks.cpp @@ -241,12 +241,11 @@ process_block_array(struct uniform_block_array_elements *ub_array, char **name, struct gl_context *ctx, struct gl_shader_program *prog, unsigned first_index) { - for (unsigned j = 0; j < ub_array->num_array_elements; j++) { + for (unsigned j = 0; j < ub_array->first_unused_array_element; j++) { size_t new_length = name_length; /* Append the subscript to the current variable name */ - ralloc_asprintf_rewrite_tail(name, &new_length, "[%u]", - ub_array->array_elements[j]); + ralloc_asprintf_rewrite_tail(name, &new_length, "[%u]", j); if (ub_array->array) { process_block_array(ub_array->array, name, new_length, blocks, @@ -325,7 +324,7 @@ resize_block_array(const glsl_type *type, const glsl_type *new_type = glsl_type::get_array_instance(new_child_type, - ub_array->num_array_elements); + ub_array->first_unused_array_element); ub_array->ir->array->type = new_type; return new_type; } else { -- 2.17.1