From 494af9db04c31b853774da53e40dd997f70567fa Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Sun, 17 Jul 2022 05:30:37 -0700 Subject: [PATCH] microsoft/compiler: Correctly compute dynamic indexing I/O masks Reviewed-by: Enrico Galli Part-of: --- src/microsoft/compiler/dxil_signature.c | 8 +++++++- src/microsoft/compiler/nir_to_dxil.c | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/microsoft/compiler/dxil_signature.c b/src/microsoft/compiler/dxil_signature.c index 224d182bc1b..ac81659886f 100644 --- a/src/microsoft/compiler/dxil_signature.c +++ b/src/microsoft/compiler/dxil_signature.c @@ -461,7 +461,7 @@ fill_SV_param_nodes(struct dxil_module *mod, unsigned record_id, SV_params_nodes[8] = dxil_get_metadata_int32(mod, rec->elements[0].reg); // Element packing start row SV_params_nodes[9] = dxil_get_metadata_int8(mod, (psv->cols_and_start >> 4) & 0x3); // Element packing start column - const struct dxil_mdnode *SV_metadata[4]; + const struct dxil_mdnode *SV_metadata[6]; unsigned num_metadata_nodes = 0; if (rec->elements[0].stream != 0) { SV_metadata[num_metadata_nodes++] = dxil_get_metadata_int32(mod, DXIL_SIGNATURE_ELEMENT_OUTPUT_STREAM); @@ -476,6 +476,12 @@ fill_SV_param_nodes(struct dxil_module *mod, unsigned record_id, SV_metadata[num_metadata_nodes++] = dxil_get_metadata_int8(mod, usage_mask); } + uint8_t dynamic_index_mask = psv->dynamic_mask_and_stream & 0xf; + if (dynamic_index_mask) { + SV_metadata[num_metadata_nodes++] = dxil_get_metadata_int32(mod, DXIL_SIGNATURE_ELEMENT_DYNAMIC_INDEX_COMPONENT_MASK); + SV_metadata[num_metadata_nodes++] = dxil_get_metadata_int8(mod, dynamic_index_mask); + } + SV_params_nodes[10] = num_metadata_nodes ? dxil_get_metadata_node(mod, SV_metadata, num_metadata_nodes) : NULL; return dxil_get_metadata_node(mod, SV_params_nodes, ARRAY_SIZE(SV_params_nodes)); diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c index 29808fb803e..a7d3893845e 100644 --- a/src/microsoft/compiler/nir_to_dxil.c +++ b/src/microsoft/compiler/nir_to_dxil.c @@ -3176,6 +3176,13 @@ emit_store_output_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *in } for (unsigned r = 0; r < sig_rec->num_elements; ++r) sig_rec->elements[r].never_writes_mask &= ~comp_mask; + + if (!nir_src_is_const(intr->src[row_index])) { + struct dxil_psv_signature_element *psv_rec = is_patch_constant ? + &ctx->mod.psv_patch_consts[nir_intrinsic_base(intr)] : + &ctx->mod.psv_outputs[nir_intrinsic_base(intr)]; + psv_rec->dynamic_mask_and_stream |= comp_mask; + } } for (unsigned i = 0; i < intr->num_components && success; ++i) { @@ -3305,6 +3312,13 @@ emit_load_input_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr comp_mask = 1; for (unsigned r = 0; r < sig_rec->num_elements; ++r) sig_rec->elements[r].always_reads_mask |= (comp_mask & sig_rec->elements[r].mask); + + if (!nir_src_is_const(intr->src[row_index])) { + struct dxil_psv_signature_element *psv_rec = is_patch_constant ? + &ctx->mod.psv_patch_consts[nir_intrinsic_base(intr)] : + &ctx->mod.psv_inputs[ctx->mod.input_mappings[nir_intrinsic_base(intr)]]; + psv_rec->dynamic_mask_and_stream |= comp_mask; + } } for (unsigned i = 0; i < intr->num_components; ++i) { @@ -3394,6 +3408,12 @@ emit_load_interpolated_input(struct ntd_context *ctx, nir_intrinsic_instr *intr) comp_mask <<= (var_base_component * comp_size); for (unsigned r = 0; r < sig_rec->num_elements; ++r) sig_rec->elements[r].always_reads_mask |= (comp_mask & sig_rec->elements[r].mask); + + if (!nir_src_is_const(intr->src[1])) { + struct dxil_psv_signature_element *psv_rec = + &ctx->mod.psv_inputs[ctx->mod.input_mappings[nir_intrinsic_base(intr)]]; + psv_rec->dynamic_mask_and_stream |= comp_mask; + } } for (unsigned i = 0; i < intr->num_components; ++i) {