From 678e05cc345b714919959cb2c93fb9f052315355 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 25 May 2017 18:36:35 +0200 Subject: [PATCH] glsl: teach opt_structure_splitting about images in structures GL_ARB_bindless_texture allows images to be declared inside structures, but when memory/format qualifiers are used, they should be propagated when structures are splitted. Signed-off-by: Samuel Pitoiset Reviewed-by: Timothy Arceri --- src/compiler/glsl/opt_structure_splitting.cpp | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/compiler/glsl/opt_structure_splitting.cpp b/src/compiler/glsl/opt_structure_splitting.cpp index eac98b74cca..84394303874 100644 --- a/src/compiler/glsl/opt_structure_splitting.cpp +++ b/src/compiler/glsl/opt_structure_splitting.cpp @@ -344,11 +344,30 @@ do_structure_splitting(exec_list *instructions) for (unsigned int i = 0; i < entry->var->type->length; i++) { const char *name = ralloc_asprintf(mem_ctx, "%s_%s", entry->var->name, type->fields.structure[i].name); - - entry->components[i] = + ir_variable *new_var = new(entry->mem_ctx) ir_variable(type->fields.structure[i].type, name, (ir_variable_mode) entry->var->data.mode); + + if (type->fields.structure[i].type->without_array()->is_image()) { + /* Do not lose memory/format qualifiers for images declared inside + * structures as allowed by ARB_bindless_texture. + */ + new_var->data.memory_read_only = + type->fields.structure[i].memory_read_only; + new_var->data.memory_write_only = + type->fields.structure[i].memory_write_only; + new_var->data.memory_coherent = + type->fields.structure[i].memory_coherent; + new_var->data.memory_volatile = + type->fields.structure[i].memory_volatile; + new_var->data.memory_restrict = + type->fields.structure[i].memory_restrict; + new_var->data.image_format = + type->fields.structure[i].image_format; + } + + entry->components[i] = new_var; entry->var->insert_before(entry->components[i]); } -- 2.30.2