Mesa (master): nir/sink,nir/move: sink/move reorderable load_ssbo
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jan 21 18:51:23 UTC 2021
Module: Mesa
Branch: master
Commit: a6d92eaf4f3b29e43792c25f45a0288ea8a24d15
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a6d92eaf4f3b29e43792c25f45a0288ea8a24d15
Author: Rhys Perry <pendingchaos02 at gmail.com>
Date: Thu Jan 21 17:01:07 2021 +0000
nir/sink,nir/move: sink/move reorderable load_ssbo
Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Daniel Schürmann <daniel at schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6490>
---
src/compiler/nir/nir.h | 1 +
src/compiler/nir/nir_opt_sink.c | 19 ++++++++++++++-----
2 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index a60b1c8928b..97813ec8159 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -4992,6 +4992,7 @@ typedef enum {
nir_move_load_input = (1 << 2),
nir_move_comparisons = (1 << 3),
nir_move_copies = (1 << 4),
+ nir_move_load_ssbo = (1 << 5),
} nir_move_options;
bool nir_can_move_instr(nir_instr *instr, nir_move_options options);
diff --git a/src/compiler/nir/nir_opt_sink.c b/src/compiler/nir/nir_opt_sink.c
index ff78fd8b2b7..279ecfdaca5 100644
--- a/src/compiler/nir/nir_opt_sink.c
+++ b/src/compiler/nir/nir_opt_sink.c
@@ -57,6 +57,8 @@ nir_can_move_instr(nir_instr *instr, nir_move_options options)
switch (intrin->intrinsic) {
case nir_intrinsic_load_ubo:
return options & nir_move_load_ubo;
+ case nir_intrinsic_load_ssbo:
+ return (options & nir_move_load_ssbo) && nir_intrinsic_can_reorder(intrin);
case nir_intrinsic_load_input:
case nir_intrinsic_load_interpolated_input:
case nir_intrinsic_load_per_vertex_input:
@@ -181,6 +183,17 @@ get_preferred_block(nir_ssa_def *def, bool sink_out_of_loops)
return lca;
}
+static bool
+can_sink_out_of_loop(nir_intrinsic_instr *intrin)
+{
+ /* Don't sink buffer loads out of loops because that can make its
+ * resource divergent and break code like that which is generated
+ * by nir_lower_non_uniform_access.
+ */
+ return intrin->intrinsic != nir_intrinsic_load_ubo &&
+ intrin->intrinsic != nir_intrinsic_load_ssbo;
+}
+
bool
nir_opt_sink(nir_shader *shader, nir_move_options options)
{
@@ -200,13 +213,9 @@ nir_opt_sink(nir_shader *shader, nir_move_options options)
nir_ssa_def *def = nir_instr_ssa_def(instr);
- /* Don't sink load_ubo out of loops because that can make its
- * resource divergent and break code like that which is generated
- * by nir_lower_non_uniform_access.
- */
bool sink_out_of_loops =
instr->type != nir_instr_type_intrinsic ||
- nir_instr_as_intrinsic(instr)->intrinsic != nir_intrinsic_load_ubo;
+ can_sink_out_of_loop(nir_instr_as_intrinsic(instr));
nir_block *use_block =
get_preferred_block(def, sink_out_of_loops);
More information about the mesa-commit
mailing list