microsoft/compiler: Use image formats to determine texture types

Fixes some tests when bindless is disabled, where the image format is
R32, we do atomics on it, but we didn't set the "typed UAV load with
additional formats" feature bit because when we loaded from it, we
only loaded one component. Since the image format on the DXIL side
was declared as U32x4, the DXIL validator said that we should have.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23266>
This commit is contained in:
Jesse Natalie 2023-05-26 10:41:27 -07:00 committed by Marge Bot
parent 431557e38e
commit 84691dfc46
2 changed files with 13 additions and 4 deletions

View file

@ -2122,9 +2122,14 @@ dxil_module_get_uav_res_props_const(struct dxil_module *m,
dwords[0] = get_basic_srv_uav_res_props_dword(true, false, false /*TODO*/, false,
dxil_sampler_dim_to_resource_kind(nir_intrinsic_image_dim(intr),
nir_intrinsic_image_array(intr)));
unsigned num_comps = intr->num_components ? intr->num_components : 1;
if (nir_intrinsic_has_format(intr)) {
enum pipe_format format = nir_intrinsic_format(intr);
if (format != PIPE_FORMAT_NONE)
num_comps = util_format_get_nr_components(format);
}
dwords[1] = get_typed_srv_uav_res_props_dword(comp_type_from_alu_type(alu_type_from_image_intr(intr)),
intr->num_components ? intr->num_components : 1,
0);
num_comps, 0);
const struct dxil_value *values[2] = {
dxil_module_get_int32_const(m, dwords[0]),

View file

@ -1400,7 +1400,9 @@ emit_uav_var(struct ntd_context *ctx, nir_variable *var, unsigned count)
enum dxil_resource_kind res_kind = dxil_get_resource_kind(var->type);
const char *name = var->name;
return emit_uav(ctx, binding, space, count, comp_type, 4, res_kind, name);
return emit_uav(ctx, binding, space, count, comp_type,
util_format_get_nr_components(var->data.image.format),
res_kind, name);
}
static void
@ -4268,7 +4270,7 @@ emit_image_load(struct ntd_context *ctx, nir_intrinsic_instr *intr)
store_dest(ctx, &intr->dest, i, component);
}
if (num_components > 1)
if (util_format_get_nr_components(nir_intrinsic_format(intr)) > 1)
ctx->mod.feats.typed_uav_load_additional_formats = true;
return true;
@ -6727,6 +6729,8 @@ nir_to_dxil(struct nir_shader *s, const struct nir_to_dxil_options *opts,
NIR_PASS_V(s, dxil_nir_move_consts);
NIR_PASS_V(s, nir_opt_dce);
NIR_PASS_V(s, dxil_nir_guess_image_formats);
if (debug_dxil & DXIL_DEBUG_VERBOSE)
nir_print_shader(s, stderr);