microsoft/compiler: Correctly compute dynamic indexing I/O masks
authorJesse Natalie <jenatali@microsoft.com>
Sun, 17 Jul 2022 12:30:37 +0000 (05:30 -0700)
committerMarge Bot <emma+marge@anholt.net>
Sat, 23 Jul 2022 14:48:17 +0000 (14:48 +0000)
Reviewed-by: Enrico Galli <enrico.galli@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17603>

src/microsoft/compiler/dxil_signature.c
src/microsoft/compiler/nir_to_dxil.c

index 224d182..ac81659 100644 (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));
index 29808fb..a7d3893 100644 (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) {