spirv: Add support for SpvCapabilityStorageImageWriteWithoutFormat
authorAlex Smith <asmith@feralinteractive.com>
Tue, 14 Feb 2017 10:34:48 +0000 (10:34 +0000)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 14 Feb 2017 16:16:52 +0000 (08:16 -0800)
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 <asmith@feralinteractive.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/compiler/spirv/nir_spirv.h
src/compiler/spirv/spirv_to_nir.c
src/compiler/spirv/vtn_variables.c

index e0ebc62..e43e9b5 100644 (file)
@@ -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,
index db3a19f..7e7874a 100644 (file)
@@ -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");
       }
index 098cfb5..d7d882e 100644 (file)
@@ -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: