diff options
author | Alex Smith <[email protected]> | 2017-02-14 10:34:48 +0000 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2017-02-14 08:16:52 -0800 |
commit | 94d48b7f9f143ff333dff4eba8069ee26acbf4e0 (patch) | |
tree | 65b1a0191382abab7deb752c6d9a0ef75be9733f | |
parent | 5c6eaa1421bd6f95437f00629c09b8ddf7c39ed8 (diff) |
spirv: Add support for SpvCapabilityStorageImageWriteWithoutFormat
Allow that capability if the driver indicates that it is supported, and
flag whether images are read-only/write-only in the nir_variable (based
on the NonReadable and NonWritable decorations), which drivers may need
to implement this.
Signed-off-by: Alex Smith <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
-rw-r--r-- | src/compiler/spirv/nir_spirv.h | 1 | ||||
-rw-r--r-- | src/compiler/spirv/spirv_to_nir.c | 5 | ||||
-rw-r--r-- | src/compiler/spirv/vtn_variables.c | 5 |
3 files changed, 9 insertions, 2 deletions
diff --git a/src/compiler/spirv/nir_spirv.h b/src/compiler/spirv/nir_spirv.h index e0ebc625844..e43e9b53825 100644 --- a/src/compiler/spirv/nir_spirv.h +++ b/src/compiler/spirv/nir_spirv.h @@ -49,6 +49,7 @@ struct nir_spirv_supported_extensions { bool image_ms_array; bool tessellation; bool draw_parameters; + bool image_write_without_format; }; nir_function *spirv_to_nir(const uint32_t *words, size_t word_count, diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index db3a19fb49e..7e7874a5e49 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -2664,7 +2664,6 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode, case SpvCapabilityMinLod: case SpvCapabilityTransformFeedback: case SpvCapabilityStorageImageReadWithoutFormat: - case SpvCapabilityStorageImageWriteWithoutFormat: vtn_warn("Unsupported SPIR-V capability: %s", spirv_capability_to_string(cap)); break; @@ -2700,6 +2699,10 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode, spv_check_supported(draw_parameters, cap); break; + case SpvCapabilityStorageImageWriteWithoutFormat: + spv_check_supported(image_write_without_format, cap); + break; + default: unreachable("Unhandled capability"); } diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 098cfb5de7a..d7d882e0184 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -1054,8 +1054,12 @@ apply_var_decoration(struct vtn_builder *b, nir_variable *nir_var, assert(nir_var->constant_initializer != NULL); nir_var->data.read_only = true; break; + case SpvDecorationNonReadable: + nir_var->data.image.write_only = true; + break; case SpvDecorationNonWritable: nir_var->data.read_only = true; + nir_var->data.image.read_only = true; break; case SpvDecorationComponent: nir_var->data.location_frac = dec->literals[0]; @@ -1107,7 +1111,6 @@ apply_var_decoration(struct vtn_builder *b, nir_variable *nir_var, case SpvDecorationAliased: case SpvDecorationVolatile: case SpvDecorationCoherent: - case SpvDecorationNonReadable: case SpvDecorationUniform: case SpvDecorationStream: case SpvDecorationOffset: |