microsoft/compiler: Correctly compute dynamic indexing I/O masks

Reviewed-by: Enrico Galli <enrico.galli@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17603>
This commit is contained in:
Jesse Natalie 2022-07-17 05:30:37 -07:00 committed by Marge Bot
parent 31d09d2f77
commit 494af9db04
2 changed files with 27 additions and 1 deletions

View File

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

View File

@ -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) {