Mesa (main): nir/opt_access: infer CAN_REORDER for global access

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Dec 17 19:40:57 UTC 2021


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

Author: Rhys Perry <pendingchaos02 at gmail.com>
Date:   Thu Dec  2 10:34:44 2021 +0000

nir/opt_access: infer CAN_REORDER for global access

fossil-db (Sienna Cichlid):
Totals from 352 (0.26% of 134621) affected shaders:
VGPRs: 17240 -> 17272 (+0.19%)
CodeSize: 1753640 -> 1755744 (+0.12%); split: -0.04%, +0.16%
Instrs: 323190 -> 323801 (+0.19%); split: -0.03%, +0.22%
Latency: 3241205 -> 3241293 (+0.00%); split: -0.10%, +0.10%
InvThroughput: 568927 -> 568067 (-0.15%); split: -0.16%, +0.00%
SClause: 12109 -> 10444 (-13.75%); split: -13.76%, +0.01%
Copies: 27802 -> 27717 (-0.31%); split: -0.56%, +0.26%
PreSGPRs: 14699 -> 14690 (-0.06%)
PreVGPRs: 15793 -> 15799 (+0.04%)

fossil-db (Polaris10):
Totals from 348 (0.26% of 135668) affected shaders:
SGPRs: 21446 -> 21574 (+0.60%); split: -0.15%, +0.75%
VGPRs: 17004 -> 16996 (-0.05%); split: -0.09%, +0.05%
CodeSize: 1782796 -> 1783060 (+0.01%); split: -0.03%, +0.05%
Instrs: 337828 -> 337921 (+0.03%); split: -0.03%, +0.06%
Latency: 3726328 -> 3726721 (+0.01%); split: -0.09%, +0.10%
InvThroughput: 1307917 -> 1299841 (-0.62%); split: -0.62%, +0.00%
VClause: 4327 -> 4337 (+0.23%); split: -0.09%, +0.32%
SClause: 12178 -> 10529 (-13.54%); split: -13.55%, +0.01%
Copies: 40227 -> 40244 (+0.04%); split: -0.19%, +0.24%
PreSGPRs: 14946 -> 14937 (-0.06%)
PreVGPRs: 15637 -> 15643 (+0.04%)

fossil-db (Pitcairn):
Totals from 351 (0.26% of 135668) affected shaders:
SGPRs: 20382 -> 20619 (+1.16%); split: -0.79%, +1.95%
CodeSize: 1789732 -> 1789836 (+0.01%); split: -0.04%, +0.04%
MaxWaves: 1947 -> 1949 (+0.10%)
Instrs: 352274 -> 352318 (+0.01%); split: -0.04%, +0.06%
Latency: 4057829 -> 4058226 (+0.01%); split: -0.08%, +0.09%
InvThroughput: 1332245 -> 1317578 (-1.10%); split: -1.11%, +0.01%
VClause: 8581 -> 8583 (+0.02%); split: -0.13%, +0.15%
SClause: 12187 -> 10552 (-13.42%); split: -13.43%, +0.02%
Copies: 44906 -> 44915 (+0.02%); split: -0.24%, +0.26%
PreSGPRs: 16571 -> 16562 (-0.05%)

Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14227>

---

 src/compiler/nir/nir_opt_access.c | 28 ++++++++++++++++++----------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/src/compiler/nir/nir_opt_access.c b/src/compiler/nir/nir_opt_access.c
index 4e5f0c41940..14e49eedfe9 100644
--- a/src/compiler/nir/nir_opt_access.c
+++ b/src/compiler/nir/nir_opt_access.c
@@ -221,7 +221,7 @@ process_variable(struct access_state *state, nir_variable *var)
 }
 
 static bool
-update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_image, bool is_buffer)
+update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_buffer, bool is_global)
 {
    enum gl_access_qualifier access = nir_intrinsic_access(instr);
 
@@ -230,15 +230,21 @@ update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_im
 
    if (instr->intrinsic != nir_intrinsic_bindless_image_load &&
        instr->intrinsic != nir_intrinsic_bindless_image_store &&
-       instr->intrinsic != nir_intrinsic_bindless_image_sparse_load) {
+       instr->intrinsic != nir_intrinsic_bindless_image_sparse_load &&
+       !is_global) {
       const nir_variable *var = nir_get_binding_variable(
          state->shader, nir_chase_binding(instr->src[0]));
       is_memory_readonly |= var && (var->data.access & ACCESS_NON_WRITEABLE);
       is_memory_writeonly |= var && (var->data.access & ACCESS_NON_READABLE);
    }
 
-   is_memory_readonly |= is_buffer ? !state->buffers_written : !state->images_written;
-   is_memory_writeonly |= is_buffer ? !state->buffers_read : !state->images_read;
+   if (is_global) {
+      is_memory_readonly |= !state->buffers_written && !state->images_written;
+      is_memory_writeonly |= !state->buffers_read && !state->images_read;
+   } else {
+      is_memory_readonly |= is_buffer ? !state->buffers_written : !state->images_written;
+      is_memory_writeonly |= is_buffer ? !state->buffers_read : !state->images_read;
+   }
 
    if (is_memory_readonly)
       access |= ACCESS_NON_WRITEABLE;
@@ -259,15 +265,17 @@ process_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
    case nir_intrinsic_bindless_image_load:
    case nir_intrinsic_bindless_image_store:
    case nir_intrinsic_bindless_image_sparse_load:
-      return update_access(state, instr, true,
-                           nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_BUF);
+      return update_access(state, instr, nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_BUF,
+                           false);
 
    case nir_intrinsic_load_deref:
    case nir_intrinsic_store_deref: {
-      if (!nir_deref_mode_is(nir_src_as_deref(instr->src[0]), nir_var_mem_ssbo))
+      if (nir_deref_mode_is(nir_src_as_deref(instr->src[0]), nir_var_mem_global))
+         return update_access(state, instr, false, true);
+      else if (nir_deref_mode_is(nir_src_as_deref(instr->src[0]), nir_var_mem_ssbo))
+         return update_access(state, instr, true, false);
+      else
          return false;
-
-      return update_access(state, instr, false, true);
    }
 
    case nir_intrinsic_image_deref_load:
@@ -278,7 +286,7 @@ process_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
       bool is_buffer =
          glsl_get_sampler_dim(glsl_without_array(var->type)) == GLSL_SAMPLER_DIM_BUF;
 
-      return update_access(state, instr, true, is_buffer);
+      return update_access(state, instr, is_buffer, false);
    }
 
    default:



More information about the mesa-commit mailing list