[Mesa-dev] [PATCH v2 13/15] glsl linker: support arrays of interface block instances
Jordan Justen
jljusten at gmail.com
Tue Mar 19 12:13:01 PDT 2013
On Tue, Mar 19, 2013 at 3:57 AM, Pohjolainen, Topi
<topi.pohjolainen at intel.com> wrote:
> 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.
I think ralloc would have mostly saved me on that. :)
But you are right. I don't need to create the ir_variable in the array
case. I'll fix it.
Thanks,
-Jordan
More information about the mesa-dev
mailing list