Mesa (master): spirv: Add support for SPV_EXT_shader_image_atomic_int64

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Nov 9 17:35:47 UTC 2020


Module: Mesa
Branch: master
Commit: 2bbe01b186b943d24e2cc74098959b322a77e9f8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2bbe01b186b943d24e2cc74098959b322a77e9f8

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Tue Mar 17 17:57:42 2020 -0500

spirv: Add support for SPV_EXT_shader_image_atomic_int64

Reviewed-by: Rhys Perry <pendingchaos02 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7509>

---

 src/compiler/shader_info.h        |  1 +
 src/compiler/spirv/spirv_to_nir.c | 23 +++++++++++++++++++----
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h
index 680fff6afaf..a992ad5f4f3 100644
--- a/src/compiler/shader_info.h
+++ b/src/compiler/shader_info.h
@@ -54,6 +54,7 @@ struct spirv_supported_capabilities {
    bool image_ms_array;
    bool image_read_without_format;
    bool image_write_without_format;
+   bool image_atomic_int64;
    bool int8;
    bool int16;
    bool int64;
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 732a9bf9f48..a5288a6032c 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -1333,6 +1333,8 @@ translate_image_format(struct vtn_builder *b, SpvImageFormat format)
    case SpvImageFormatRg8ui:        return PIPE_FORMAT_R8G8_UINT;
    case SpvImageFormatR16ui:        return PIPE_FORMAT_R16_UINT;
    case SpvImageFormatR8ui:         return PIPE_FORMAT_R8_UINT;
+   case SpvImageFormatR64ui:        return PIPE_FORMAT_R64_UINT;
+   case SpvImageFormatR64i:         return PIPE_FORMAT_R64_SINT;
    default:
       vtn_fail("Invalid image format: %s (%u)",
                spirv_imageformat_to_string(format), format);
@@ -1607,9 +1609,17 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
          vtn_fail_if(sampled_type->base_type != vtn_base_type_void,
                      "Sampled type of OpTypeImage must be void for kernels");
       } else {
-         vtn_fail_if(sampled_type->base_type != vtn_base_type_scalar ||
-                     glsl_get_bit_size(sampled_type->type) != 32,
-                     "Sampled type of OpTypeImage must be a 32-bit scalar");
+         vtn_fail_if(sampled_type->base_type != vtn_base_type_scalar,
+                     "Sampled type of OpTypeImage must be a scalar");
+         if (b->options->caps.image_atomic_int64) {
+            vtn_fail_if(glsl_get_bit_size(sampled_type->type) != 32 &&
+                        glsl_get_bit_size(sampled_type->type) != 64,
+                        "Sampled type of OpTypeImage must be a 32 or 64-bit "
+                        "scalar");
+         } else {
+            vtn_fail_if(glsl_get_bit_size(sampled_type->type) != 32,
+                        "Sampled type of OpTypeImage must be a 32-bit scalar");
+         }
       }
 
       enum glsl_sampler_dim dim;
@@ -3315,7 +3325,8 @@ vtn_handle_image(struct vtn_builder *b, SpvOp opcode,
          intrin->num_components = dest_components;
 
       nir_ssa_dest_init(&intrin->instr, &intrin->dest,
-                        nir_intrinsic_dest_components(intrin), 32, NULL);
+                        nir_intrinsic_dest_components(intrin),
+                        glsl_get_bit_size(type->type), NULL);
 
       nir_builder_instr_insert(&b->nb, &intrin->instr);
 
@@ -4460,6 +4471,10 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
          spv_check_supported(ray_traversal_primitive_culling, cap);
          break;
 
+      case SpvCapabilityInt64ImageEXT:
+         spv_check_supported(image_atomic_int64, cap);
+         break;
+
       default:
          vtn_fail("Unhandled capability: %s (%u)",
                   spirv_capability_to_string(cap), cap);



More information about the mesa-commit mailing list