Mesa (master): nir/opt_access: rename can_reorder() and set ACCESS_NON_WRITEABLE in it
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Dec 9 14:58:43 UTC 2020
Module: Mesa
Branch: master
Commit: d587dc32f37f43aa277516a69ad673db8441ffb8
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d587dc32f37f43aa277516a69ad673db8441ffb8
Author: Rhys Perry <pendingchaos02 at gmail.com>
Date: Tue Aug 25 14:30:52 2020 +0100
nir/opt_access: rename can_reorder() and set ACCESS_NON_WRITEABLE in it
Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Connor Abbott <cwabbott0 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6483>
---
src/compiler/nir/nir_opt_access.c | 94 ++++++++++++---------------------------
1 file changed, 28 insertions(+), 66 deletions(-)
diff --git a/src/compiler/nir/nir_opt_access.c b/src/compiler/nir/nir_opt_access.c
index d1701686ddc..4588b4cec0f 100644
--- a/src/compiler/nir/nir_opt_access.c
+++ b/src/compiler/nir/nir_opt_access.c
@@ -152,17 +152,27 @@ process_variable(struct access_state *state, nir_variable *var)
}
static bool
-can_reorder(struct access_state *state, enum gl_access_qualifier access,
- bool is_buffer, bool is_ssbo)
+update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_image, bool is_buffer)
{
- bool is_any_written = is_buffer ? state->buffers_written :
- state->images_written;
+ enum gl_access_qualifier access = nir_intrinsic_access(instr);
- /* Can we guarantee that the underlying memory is never written? */
- if (!is_any_written || (access & ACCESS_NON_WRITEABLE))
- return !(access & ACCESS_VOLATILE);
+ bool is_memory_readonly = access & ACCESS_NON_WRITEABLE;
- return false;
+ if (instr->intrinsic != nir_intrinsic_bindless_image_load) {
+ const nir_variable *var = nir_intrinsic_get_var(instr, 0);
+ is_memory_readonly |= var->data.access & ACCESS_NON_WRITEABLE;
+ }
+
+ is_memory_readonly |= is_buffer ? !state->buffers_written : !state->images_written;
+
+ if (is_memory_readonly)
+ access |= ACCESS_NON_WRITEABLE;
+ if (!(access & ACCESS_VOLATILE) && is_memory_readonly)
+ access |= ACCESS_CAN_REORDER;
+
+ bool progress = nir_intrinsic_access(instr) != access;
+ nir_intrinsic_set_access(instr, access);
+ return progress;
}
static bool
@@ -170,72 +180,24 @@ process_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
{
switch (instr->intrinsic) {
case nir_intrinsic_bindless_image_load:
- if (nir_intrinsic_access(instr) & ACCESS_CAN_REORDER)
- return false;
-
- /* We have less information about bindless intrinsics, since we can't
- * always trace uses back to the variable. Don't try and infer if it's
- * read-only, unless there are no image writes at all.
- */
- bool progress = false;
- bool is_buffer =
- nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_BUF;
-
- bool is_any_written =
- is_buffer ? state->buffers_written : state->images_written;
-
- if (!(nir_intrinsic_access(instr) & ACCESS_NON_WRITEABLE) &&
- !is_any_written) {
- progress = true;
- nir_intrinsic_set_access(instr,
- nir_intrinsic_access(instr) |
- ACCESS_NON_WRITEABLE);
- }
-
- if (can_reorder(state, nir_intrinsic_access(instr), is_buffer, false)) {
- progress = true;
- nir_intrinsic_set_access(instr,
- nir_intrinsic_access(instr) |
- ACCESS_CAN_REORDER);
- }
+ return update_access(state, instr, true,
+ nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_BUF);
- return progress;
-
- case nir_intrinsic_load_deref:
- case nir_intrinsic_image_deref_load: {
+ case nir_intrinsic_load_deref: {
nir_variable *var = nir_intrinsic_get_var(instr, 0);
-
- if (instr->intrinsic == nir_intrinsic_load_deref &&
- var->data.mode != nir_var_mem_ssbo)
- return false;
-
- if (nir_intrinsic_access(instr) & ACCESS_CAN_REORDER)
+ if (var->data.mode != nir_var_mem_ssbo)
return false;
- bool progress = false;
-
- /* Check if we were able to mark the whole variable non-writeable */
- if (!(nir_intrinsic_access(instr) & ACCESS_NON_WRITEABLE) &&
- var->data.access & ACCESS_NON_WRITEABLE) {
- progress = true;
- nir_intrinsic_set_access(instr,
- nir_intrinsic_access(instr) |
- ACCESS_NON_WRITEABLE);
- }
+ return update_access(state, instr, false, true);
+ }
- bool is_ssbo = var->data.mode == nir_var_mem_ssbo;
+ case nir_intrinsic_image_deref_load: {
+ nir_variable *var = nir_intrinsic_get_var(instr, 0);
- bool is_buffer = is_ssbo ||
+ bool is_buffer =
glsl_get_sampler_dim(glsl_without_array(var->type)) == GLSL_SAMPLER_DIM_BUF;
- if (can_reorder(state, nir_intrinsic_access(instr), is_buffer, is_ssbo)) {
- progress = true;
- nir_intrinsic_set_access(instr,
- nir_intrinsic_access(instr) |
- ACCESS_CAN_REORDER);
- }
-
- return progress;
+ return update_access(state, instr, true, is_buffer);
}
default:
More information about the mesa-commit
mailing list