Mesa (main): microsoft/compiler: Add support for get_ssbo_size to translator

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 29 23:26:25 UTC 2021


Module: Mesa
Branch: main
Commit: ddad83fc974cc0832878cde0456fc74ecbfe9039
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ddad83fc974cc0832878cde0456fc74ecbfe9039

Author: Enrico Galli <enrico.galli at intel.com>
Date:   Mon Jun 28 15:00:39 2021 -0700

microsoft/compiler: Add support for get_ssbo_size to translator

Reviewed-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11629>

---

 src/microsoft/compiler/nir_to_dxil.c        | 32 +++++++++++++++++++++++++++++
 src/microsoft/spirv_to_dxil/spirv_to_dxil.c | 12 ++++++++---
 2 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c
index 20bf4e6cabc..434046bc86c 100644
--- a/src/microsoft/compiler/nir_to_dxil.c
+++ b/src/microsoft/compiler/nir_to_dxil.c
@@ -3147,6 +3147,36 @@ emit_image_size(struct ntd_context *ctx, nir_intrinsic_instr *intr)
    return true;
 }
 
+static bool
+emit_get_ssbo_size(struct ntd_context *ctx, nir_intrinsic_instr *intr)
+{
+   const struct dxil_value* handle = NULL;
+   if (ctx->opts->vulkan_environment) {
+      handle = get_src_ssa(ctx, intr->src[0].ssa, 0);
+   } else {
+      int binding = nir_src_as_int(intr->src[0]);
+      handle = ctx->uav_handles[binding];
+   }
+   
+   if (!handle)
+     return false;
+
+   struct texop_parameters params = {
+      .tex = handle,
+      .lod_or_sample = dxil_module_get_undef(
+                        &ctx->mod, dxil_module_get_int_type(&ctx->mod, 32))
+   };
+
+   const struct dxil_value *dimensions = emit_texture_size(ctx, &params);
+   if (!dimensions)
+      return false;
+
+   const struct dxil_value *retval = dxil_emit_extractval(&ctx->mod, dimensions, 0);
+   store_dest(ctx, &intr->dest, 0, retval, nir_type_uint);
+
+   return true;
+}
+
 static bool
 emit_ssbo_atomic(struct ntd_context *ctx, nir_intrinsic_instr *intr,
                    enum dxil_atomic_op op, nir_alu_type type)
@@ -3452,6 +3482,8 @@ emit_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr)
    case nir_intrinsic_image_deref_size:
    case nir_intrinsic_image_size:
       return emit_image_size(ctx, intr);
+   case nir_intrinsic_get_ssbo_size:
+      return emit_get_ssbo_size(ctx, intr);
 
    case nir_intrinsic_vulkan_resource_index:
       return emit_vulkan_resource_index(ctx, intr);
diff --git a/src/microsoft/spirv_to_dxil/spirv_to_dxil.c b/src/microsoft/spirv_to_dxil/spirv_to_dxil.c
index e1a5fd5642c..21edddae2af 100644
--- a/src/microsoft/spirv_to_dxil/spirv_to_dxil.c
+++ b/src/microsoft/spirv_to_dxil/spirv_to_dxil.c
@@ -37,9 +37,15 @@ spirv_to_dxil(const uint32_t *words, size_t word_count,
    if (stage == MESA_SHADER_NONE || stage == MESA_SHADER_KERNEL)
       return false;
 
-   struct spirv_to_nir_options spirv_opts = {0};
-   spirv_opts.ubo_addr_format = nir_address_format_32bit_index_offset;
-   spirv_opts.ssbo_addr_format = nir_address_format_32bit_index_offset;
+   struct spirv_to_nir_options spirv_opts = {
+      .ubo_addr_format = nir_address_format_32bit_index_offset,
+      .ssbo_addr_format = nir_address_format_32bit_index_offset,
+      // use_deref_buffer_array_length + nir_lower_explicit_io force
+      //  get_ssbo_size to take in the return from load_vulkan_descriptor
+      //  instead of vulkan_resource_index. This makes it much easier to
+      //  get the DXIL handle for the SSBO.
+      .use_deref_buffer_array_length = true
+   };
 
    glsl_type_singleton_init_or_ref();
 



More information about the mesa-commit mailing list