microsoft/compiler: Treat read-only SSBOs as SRVs
Reviewed-by: Enrico Galli <enrico.galli@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10356>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user