nir/opt_access: rename can_reorder() and set ACCESS_NON_WRITEABLE in it
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Connor Abbott <cwabbott0@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6483>
This commit is contained in:
@@ -152,17 +152,27 @@ process_variable(struct access_state *state, nir_variable *var)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
can_reorder(struct access_state *state, enum gl_access_qualifier access,
|
update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_image, bool is_buffer)
|
||||||
bool is_buffer, bool is_ssbo)
|
|
||||||
{
|
{
|
||||||
bool is_any_written = is_buffer ? state->buffers_written :
|
enum gl_access_qualifier access = nir_intrinsic_access(instr);
|
||||||
state->images_written;
|
|
||||||
|
|
||||||
/* Can we guarantee that the underlying memory is never written? */
|
bool is_memory_readonly = access & ACCESS_NON_WRITEABLE;
|
||||||
if (!is_any_written || (access & ACCESS_NON_WRITEABLE))
|
|
||||||
return !(access & ACCESS_VOLATILE);
|
|
||||||
|
|
||||||
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
|
static bool
|
||||||
@@ -170,72 +180,24 @@ process_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
|
|||||||
{
|
{
|
||||||
switch (instr->intrinsic) {
|
switch (instr->intrinsic) {
|
||||||
case nir_intrinsic_bindless_image_load:
|
case nir_intrinsic_bindless_image_load:
|
||||||
if (nir_intrinsic_access(instr) & ACCESS_CAN_REORDER)
|
return update_access(state, instr, true,
|
||||||
|
nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_BUF);
|
||||||
|
|
||||||
|
case nir_intrinsic_load_deref: {
|
||||||
|
nir_variable *var = nir_intrinsic_get_var(instr, 0);
|
||||||
|
if (var->data.mode != nir_var_mem_ssbo)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* We have less information about bindless intrinsics, since we can't
|
return update_access(state, instr, false, true);
|
||||||
* 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 progress;
|
|
||||||
|
|
||||||
case nir_intrinsic_load_deref:
|
|
||||||
case nir_intrinsic_image_deref_load: {
|
case nir_intrinsic_image_deref_load: {
|
||||||
nir_variable *var = nir_intrinsic_get_var(instr, 0);
|
nir_variable *var = nir_intrinsic_get_var(instr, 0);
|
||||||
|
|
||||||
if (instr->intrinsic == nir_intrinsic_load_deref &&
|
bool is_buffer =
|
||||||
var->data.mode != nir_var_mem_ssbo)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (nir_intrinsic_access(instr) & ACCESS_CAN_REORDER)
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_ssbo = var->data.mode == nir_var_mem_ssbo;
|
|
||||||
|
|
||||||
bool is_buffer = is_ssbo ||
|
|
||||||
glsl_get_sampler_dim(glsl_without_array(var->type)) == GLSL_SAMPLER_DIM_BUF;
|
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)) {
|
return update_access(state, instr, true, is_buffer);
|
||||||
progress = true;
|
|
||||||
nir_intrinsic_set_access(instr,
|
|
||||||
nir_intrinsic_access(instr) |
|
|
||||||
ACCESS_CAN_REORDER);
|
|
||||||
}
|
|
||||||
|
|
||||||
return progress;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user