microsoft/compiler: Map I/O base locations to input IDs

When dealing with a vertex input that takes multiple rows, the value of
nir_intrinsic_base points to a driver-location-based index, but we need
to emit a location-based index (or more specifically, an index that
increments once per input, not once per register). Add a mapping to
the module of base -> ID.

Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Reviewed-By: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14837>
This commit is contained in:
Jesse Natalie 2022-02-01 14:37:29 -08:00 committed by Marge Bot
parent efe5c2d6f3
commit eb0cefae6d
3 changed files with 10 additions and 1 deletions

View file

@ -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];

View file

@ -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;

View file

@ -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;