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.jus...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev