Mesa (master): microsoft/compiler: Treat read-only SSBOs as SRVs
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sat Apr 24 01:11:09 UTC 2021
Module: Mesa
Branch: master
Commit: 05d90ed9daf4d6b90d8b07579ed2eeea08abb8bb
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=05d90ed9daf4d6b90d8b07579ed2eeea08abb8bb
Author: Jesse Natalie <jenatali at microsoft.com>
Date: Tue Apr 20 08:23:20 2021 -0700
microsoft/compiler: Treat read-only SSBOs as SRVs
Reviewed-by: Enrico Galli <enrico.galli at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10356>
---
src/microsoft/compiler/nir_to_dxil.c | 36 +++++++++++++++++++++++++++++-------
1 file changed, 29 insertions(+), 7 deletions(-)
diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c
index 5141eddecbe..206c84d407f 100644
--- a/src/microsoft/compiler/nir_to_dxil.c
+++ b/src/microsoft/compiler/nir_to_dxil.c
@@ -2332,8 +2332,6 @@ emit_gep_for_index(struct ntd_context *ctx, const nir_variable *var,
static const struct dxil_value *
get_ubo_ssbo_handle(struct ntd_context *ctx, nir_src *src, enum dxil_resource_class class, unsigned base_binding)
{
- assume(class == DXIL_RESOURCE_CLASS_CBV || class == DXIL_RESOURCE_CLASS_UAV);
-
/* This source might be one of:
* 1. Constant resource index - just look it up in precomputed handle arrays
* If it's null in that array, create a handle, and store the result
@@ -2345,10 +2343,19 @@ get_ubo_ssbo_handle(struct ntd_context *ctx, nir_src *src, enum dxil_resource_cl
const struct dxil_value **handle_entry = NULL;
if (const_block_index) {
assert(!ctx->opts->vulkan_environment);
- if (class == DXIL_RESOURCE_CLASS_CBV)
+ switch (class) {
+ case DXIL_RESOURCE_CLASS_CBV:
handle_entry = &ctx->cbv_handles[const_block_index->u32];
- else
+ break;
+ case DXIL_RESOURCE_CLASS_UAV:
handle_entry = &ctx->uav_handles[const_block_index->u32];
+ break;
+ case DXIL_RESOURCE_CLASS_SRV:
+ handle_entry = &ctx->srv_handles[const_block_index->u32];
+ break;
+ default:
+ unreachable("Unexpected resource class");
+ }
}
if (handle_entry && *handle_entry)
@@ -2372,7 +2379,12 @@ emit_load_ssbo(struct ntd_context *ctx, nir_intrinsic_instr *intr)
{
const struct dxil_value *int32_undef = get_int32_undef(&ctx->mod);
- const struct dxil_value *handle = get_ubo_ssbo_handle(ctx, &intr->src[0], DXIL_RESOURCE_CLASS_UAV, 0);
+ nir_variable *var = nir_get_binding_variable(ctx->shader, nir_chase_binding(intr->src[0]));
+ enum dxil_resource_class class = DXIL_RESOURCE_CLASS_UAV;
+ if (var && var->data.access & ACCESS_NON_WRITEABLE)
+ class = DXIL_RESOURCE_CLASS_SRV;
+
+ const struct dxil_value *handle = get_ubo_ssbo_handle(ctx, &intr->src[0], class, 0);
const struct dxil_value *offset =
get_src(ctx, &intr->src[1], 0, nir_type_uint);
if (!int32_undef || !handle || !offset)
@@ -3294,6 +3306,8 @@ emit_load_vulkan_descriptor(struct ntd_context *ctx, nir_intrinsic_instr *intr)
unsigned binding = nir_intrinsic_binding(index);
+ nir_variable *var = nir_get_binding_variable(ctx->shader, nir_chase_binding(intr->src[0]));
+
const struct dxil_value *handle = NULL;
enum dxil_resource_class resource_class;
@@ -3302,7 +3316,10 @@ emit_load_vulkan_descriptor(struct ntd_context *ctx, nir_intrinsic_instr *intr)
resource_class = DXIL_RESOURCE_CLASS_CBV;
break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
- resource_class = DXIL_RESOURCE_CLASS_UAV;
+ if (var->data.access & ACCESS_NON_WRITEABLE)
+ resource_class = DXIL_RESOURCE_CLASS_SRV;
+ else
+ resource_class = DXIL_RESOURCE_CLASS_UAV;
break;
default:
unreachable("unknown descriptor type");
@@ -4221,7 +4238,12 @@ emit_ssbos(struct ntd_context *ctx)
unsigned count = 1;
if (glsl_type_is_array(var->type))
count = glsl_get_length(var->type);
- if (!emit_uav(ctx, var->data.binding, count, DXIL_COMP_TYPE_INVALID, DXIL_RESOURCE_KIND_RAW_BUFFER, var->name))
+
+ bool success = (var->data.access & ACCESS_NON_WRITEABLE) ?
+ emit_srv(ctx, var, var->data.binding, count) :
+ emit_uav(ctx, var->data.binding, count, DXIL_COMP_TYPE_INVALID, DXIL_RESOURCE_KIND_RAW_BUFFER, var->name);
+
+ if (!success)
return false;
}
More information about the mesa-commit
mailing list