From ddad83fc974cc0832878cde0456fc74ecbfe9039 Mon Sep 17 00:00:00 2001 From: Enrico Galli Date: Mon, 28 Jun 2021 15:00:39 -0700 Subject: [PATCH] microsoft/compiler: Add support for get_ssbo_size to translator Reviewed-by: Jesse Natalie Part-of: --- 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 20bf4e6..434046b 100644 --- a/src/microsoft/compiler/nir_to_dxil.c +++ b/src/microsoft/compiler/nir_to_dxil.c @@ -3148,6 +3148,36 @@ emit_image_size(struct ntd_context *ctx, nir_intrinsic_instr *intr) } 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 e1a5fd5..21eddda 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(); -- 2.7.4