[Mesa-dev] [PATCH v2 13/15] glsl linker: support arrays of interface block instances
Pohjolainen, Topi
topi.pohjolainen at intel.com
Tue Mar 19 03:57:40 PDT 2013
On Mon, Mar 18, 2013 at 04:35:10PM -0700, Jordan Justen wrote:
> With this change we now support interface block arrays.
> For example, cases like this:
>
> out block_name {
> float f;
> } block_instance[2];
>
> This allows Mesa to pass the piglit glsl-1.50 test:
> * execution/interface-blocks-complex-vs-fs.shader_test
>
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> ---
> src/glsl/lower_named_interface_blocks.cpp | 53 ++++++++++++++++++++++++-----
> 1 file changed, 44 insertions(+), 9 deletions(-)
>
> diff --git a/src/glsl/lower_named_interface_blocks.cpp b/src/glsl/lower_named_interface_blocks.cpp
> index 2e0c322..405e7a9 100644
> --- a/src/glsl/lower_named_interface_blocks.cpp
> +++ b/src/glsl/lower_named_interface_blocks.cpp
> @@ -107,22 +107,47 @@ flatten_named_interface_blocks_declarations::run(exec_list *instructions)
> if (var->mode == ir_var_uniform)
> continue;
>
> - const glsl_type *const t = var->type;
> + const glsl_type * iface_t = var->type;
> + const glsl_type * array_t = NULL;
> exec_node *insert_pos = var;
> - char *iface_field_name;
> - for (unsigned i = 0; i < t->length; i++) {
> - iface_field_name = ralloc_asprintf(mem_ctx, "%s.%s", t->name,
> - t->fields.structure[i].name);
> +
> + if (iface_t->is_array()) {
> + array_t = iface_t;
> + iface_t = array_t->fields.array;
> + }
> +
> + assert (iface_t->is_interface());
> +
> + for (unsigned i = 0; i < iface_t->length; i++) {
> + const char * field_name = iface_t->fields.structure[i].name;
> + char *iface_field_name =
> + ralloc_asprintf(mem_ctx, "%s.%s",
> + iface_t->name, field_name);
>
> ir_variable *found_var =
> (ir_variable *) hash_table_find(interface_namespace,
> iface_field_name);
> if (!found_var) {
> ir_variable *new_var =
> - new(mem_ctx) ir_variable(t->fields.structure[i].type,
> - ralloc_strdup(mem_ctx, t->fields.structure[i].name),
> + new(mem_ctx) ir_variable(iface_t->fields.structure[i].type,
> + ralloc_strdup(mem_ctx, iface_t->fields.structure[i].name),
> (ir_variable_mode) var->mode);
> - new_var->interface_type = t;
> + if (array_t != NULL) {
> + const glsl_type *new_array_type =
> + glsl_type::get_array_instance(
> + iface_t->fields.structure[i].type,
> + array_t->length);
> + char *array_var_name =
> + ralloc_asprintf(mem_ctx, "%s[%d]",
> + new_var->name, array_t->length);
> + ir_variable *new_array_var =
> + new(mem_ctx) ir_variable(new_array_type,
> + array_var_name,
> + (ir_variable_mode) var->mode);
> + new_var = new_array_var;
Don't you leak the previously allocated instance of 'ir_variable' (assigned to
'new_var')? Or is it just left until 'mem_ctx' gets released?
I'm not that familiar with the glsl core that I may well be missing something.
> + }
> +
> + new_var->interface_type = iface_t;
> hash_table_insert(interface_namespace, new_var,
> iface_field_name);
> insert_pos->insert_after(new_var);
> @@ -187,9 +212,19 @@ flatten_named_interface_blocks_declarations::handle_rvalue(ir_rvalue **rvalue)
> (ir_variable *) hash_table_find(interface_namespace,
> iface_field_name);
> assert(found_var);
> +
> ir_dereference_variable *deref_var =
> new(mem_ctx) ir_dereference_variable(found_var);
> - *rvalue = deref_var;
> +
> + ir_dereference_array *deref_array =
> + ir->record->as_dereference_array();
> + if (deref_array != NULL) {
> + *rvalue =
> + new(mem_ctx) ir_dereference_array(deref_var,
> + deref_array->array_index);
> + } else {
> + *rvalue = deref_var;
> + }
> }
> }
>
> --
> 1.7.10.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list