nir/opt_access: ignore barriers and coherent qualifier

It shouldn't matter whether an access/variable is coherent or not, just
that it's not written. The coherent qualifier doesn't mean anything with
read-only memory.

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:
Rhys Perry
2020-12-01 14:30:22 +00:00
committed by Marge Bot
parent 7ddea94819
commit e646f6d30e

View File

@@ -30,9 +30,6 @@
* - Either there are no writes, or ACCESS_NON_WRITEABLE and ACCESS_RESTRICT
* are both set. In either case there are no writes to the underlying
* memory.
* - If ACCESS_COHERENT is set, then there must be no memory barriers
* involving the access. Coherent accesses may return different results
* before and after barriers.
* - ACCESS_VOLATILE is not set.
*
* If these conditions are true, then image and buffer reads may be treated as
@@ -44,8 +41,6 @@ struct access_state {
struct set *vars_written;
bool images_written;
bool buffers_written;
bool image_barriers;
bool buffer_barriers;
};
static void
@@ -122,30 +117,6 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
state->buffers_written = true;
break;
case nir_intrinsic_memory_barrier:
state->buffer_barriers = true;
state->image_barriers = true;
break;
case nir_intrinsic_memory_barrier_buffer:
state->buffer_barriers = true;
break;
case nir_intrinsic_memory_barrier_image:
state->image_barriers = true;
break;
case nir_intrinsic_scoped_barrier:
/* TODO: Could be more granular if we had nir_var_mem_image. */
if (nir_intrinsic_memory_modes(instr) & (nir_var_mem_ubo |
nir_var_mem_ssbo |
nir_var_uniform |
nir_var_mem_global)) {
state->buffer_barriers = true;
state->image_barriers = true;
}
break;
default:
break;
}
@@ -183,15 +154,7 @@ can_reorder(struct access_state *state, enum gl_access_qualifier access,
if (!is_any_written ||
((access & ACCESS_NON_WRITEABLE) &&
(access & ACCESS_RESTRICT))) {
/* Note: memoryBarrierBuffer() is only guaranteed to flush buffer
* variables and not imageBuffer's, so we only consider the GL-level
* type here.
*/
bool is_any_barrier = is_ssbo ?
state->buffer_barriers : state->image_barriers;
return (!is_any_barrier || !(access & ACCESS_COHERENT)) &&
!(access & ACCESS_VOLATILE);
return !(access & ACCESS_VOLATILE);
}
return false;