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