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, ¶ms);
+ 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