diff options
author | Samuel Pitoiset <[email protected]> | 2017-05-25 18:36:35 +0200 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2017-06-01 11:54:06 +0200 |
commit | 678e05cc345b714919959cb2c93fb9f052315355 (patch) | |
tree | 2ebc75dd51b5265ddcd9930415d652610a5b3365 | |
parent | 71efec290c8b28fa25c50a923b30a60cc38b934c (diff) |
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 <[email protected]>
Reviewed-by: Timothy Arceri <[email protected]>
-rw-r--r-- | src/compiler/glsl/opt_structure_splitting.cpp | 23 |
1 files 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]); } |