diff --git a/src/microsoft/compiler/dxil_module.h b/src/microsoft/compiler/dxil_module.h index e571c471fee..e6b88788ba7 100644 --- a/src/microsoft/compiler/dxil_module.h +++ b/src/microsoft/compiler/dxil_module.h @@ -197,6 +197,7 @@ struct dxil_module { struct dxil_signature_record inputs[DXIL_SHADER_MAX_IO_ROWS]; struct dxil_signature_record outputs[DXIL_SHADER_MAX_IO_ROWS]; struct dxil_signature_record patch_consts[DXIL_SHADER_MAX_IO_ROWS]; + unsigned input_mappings[DXIL_SHADER_MAX_IO_ROWS]; struct dxil_psv_signature_element psv_inputs[DXIL_SHADER_MAX_IO_ROWS]; struct dxil_psv_signature_element psv_outputs[DXIL_SHADER_MAX_IO_ROWS]; diff --git a/src/microsoft/compiler/dxil_signature.c b/src/microsoft/compiler/dxil_signature.c index a5e6f2400f5..b3ea0178abc 100644 --- a/src/microsoft/compiler/dxil_signature.c +++ b/src/microsoft/compiler/dxil_signature.c @@ -541,6 +541,11 @@ get_input_signature_group(struct dxil_module *mod, const struct dxil_mdnode **in mod->inputs[num_inputs].sysvalue = semantic.sysvalue_name; *row_iter = get_additional_semantic_info(s, var, &semantic, *row_iter, input_clip_size); + if (semantic.start_row >= 0) { + for (unsigned i = 0; i < semantic.rows; ++i) + mod->input_mappings[semantic.start_row + i] = num_inputs; + } + mod->inputs[num_inputs].name = ralloc_strdup(mod->ralloc_ctx, semantic.name); mod->inputs[num_inputs].num_elements = semantic.rows; diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c index 444fbeeaae8..7d288091eb2 100644 --- a/src/microsoft/compiler/nir_to_dxil.c +++ b/src/microsoft/compiler/nir_to_dxil.c @@ -3199,7 +3199,10 @@ emit_load_input_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr if (!opcode) return false; - const struct dxil_value *input_id = dxil_module_get_int32_const(&ctx->mod, nir_intrinsic_base(intr)); + const struct dxil_value *input_id = dxil_module_get_int32_const(&ctx->mod, + is_patch_constant || is_output_control_point ? + nir_intrinsic_base(intr) : + ctx->mod.input_mappings[nir_intrinsic_base(intr)]); if (!input_id) return false;