Mesa (main): microsoft/compiler: Compute correct usage masks

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jul 23 15:39:14 UTC 2022


Module: Mesa
Branch: main
Commit: 31d09d2f77de1e424cffc868a39c9ab3a80702bd
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=31d09d2f77de1e424cffc868a39c9ab3a80702bd

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Sun Jul 17 05:15:11 2022 -0700

microsoft/compiler: Compute correct usage masks

This starts actually updating the always-read/never-written
masks while processing the shader. Note that we follow DXC's
lead here and treat "always read" as "sometimes read."

This isn't strictly required, but might help drivers out.

Reviewed-by: Enrico Galli <enrico.galli at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17603>

---

 src/microsoft/compiler/nir_to_dxil.c | 50 +++++++++++++++++++++++++++++++++++-
 1 file changed, 49 insertions(+), 1 deletion(-)

diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c
index 4ed53b3e04a..29808fb803e 100644
--- a/src/microsoft/compiler/nir_to_dxil.c
+++ b/src/microsoft/compiler/nir_to_dxil.c
@@ -3159,6 +3159,25 @@ emit_store_output_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *in
    unsigned var_base_component = var->data.location_frac;
    unsigned base_component = nir_intrinsic_component(intr) - var_base_component;
 
+   if (ctx->mod.minor_validator >= 5) {
+      struct dxil_signature_record *sig_rec = is_patch_constant ?
+         &ctx->mod.patch_consts[nir_intrinsic_base(intr)] :
+         &ctx->mod.outputs[nir_intrinsic_base(intr)];
+      unsigned comp_size = intr->src[0].ssa->bit_size == 64 ? 2 : 1;
+      unsigned comp_mask = 0;
+      if (is_tess_level)
+         comp_mask = 1;
+      else if (comp_size == 1)
+         comp_mask = writemask << var_base_component;
+      else {
+         for (unsigned i = 0; i < intr->num_components; ++i)
+            if ((writemask & (1 << i)))
+               comp_mask |= 3 << ((i + var_base_component) * comp_size);
+      }
+      for (unsigned r = 0; r < sig_rec->num_elements; ++r)
+         sig_rec->elements[r].never_writes_mask &= ~comp_mask;
+   }
+
    for (unsigned i = 0; i < intr->num_components && success; ++i) {
       if (writemask & (1 << i)) {
          if (is_tess_level)
@@ -3273,6 +3292,21 @@ emit_load_input_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr
    unsigned var_base_component = var ? var->data.location_frac : 0;
    unsigned base_component = nir_intrinsic_component(intr) - var_base_component;
 
+   if (ctx->mod.minor_validator >= 5 &&
+       !is_output_control_point &&
+       intr->intrinsic != nir_intrinsic_load_output) {
+      struct dxil_signature_record *sig_rec = is_patch_constant ?
+         &ctx->mod.patch_consts[nir_intrinsic_base(intr)] :
+         &ctx->mod.inputs[ctx->mod.input_mappings[nir_intrinsic_base(intr)]];
+      unsigned comp_size = intr->dest.ssa.bit_size == 64 ? 2 : 1;
+      unsigned comp_mask = (1 << (intr->num_components * comp_size)) - 1;
+      comp_mask <<= (var_base_component * comp_size);
+      if (is_tess_level)
+         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);
+   }
+
    for (unsigned i = 0; i < intr->num_components; ++i) {
       if (is_tess_level)
          row = dxil_module_get_int32_const(&ctx->mod, i + base_component);
@@ -3348,8 +3382,22 @@ emit_load_interpolated_input(struct ntd_context *ctx, nir_intrinsic_instr *intr)
    if (!func)
       return false;
 
+   nir_variable *var = find_patch_matching_variable_by_driver_location(ctx->shader, nir_var_shader_in, nir_intrinsic_base(intr), false);
+   unsigned var_base_component = var ? var->data.location_frac : 0;
+   unsigned base_component = nir_intrinsic_component(intr) - var_base_component;
+
+   if (ctx->mod.minor_validator >= 5) {
+      struct dxil_signature_record *sig_rec =
+         &ctx->mod.inputs[ctx->mod.input_mappings[nir_intrinsic_base(intr)]];
+      unsigned comp_size = intr->dest.ssa.bit_size == 64 ? 2 : 1;
+      unsigned comp_mask = (1 << (intr->num_components * comp_size)) - 1;
+      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);
+   }
+
    for (unsigned i = 0; i < intr->num_components; ++i) {
-      args[3] = dxil_module_get_int8_const(&ctx->mod, i + nir_intrinsic_component(intr));
+      args[3] = dxil_module_get_int8_const(&ctx->mod, i + base_component);
 
       const struct dxil_value *retval = dxil_emit_call(&ctx->mod, func, args, num_args);
       if (!retval)



More information about the mesa-commit mailing list