nir/opt_access: handle variable pointers

We might not be able to determine what variable a instruction accesses.

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-08-25 16:50:24 +01:00
committed by Marge Bot
parent 4dc5659463
commit c9ec7d3f90

View File

@@ -114,7 +114,13 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
break;
var = nir_get_binding_variable(state->shader, nir_chase_binding(instr->src[0]));
_mesa_set_add(state->vars_written, var);
if (var) {
_mesa_set_add(state->vars_written, var);
} else {
nir_foreach_variable_with_modes(possible_var, state->shader, nir_var_mem_ssbo)
_mesa_set_add(state->vars_written, possible_var);
}
state->buffers_written = true;
break;
@@ -163,7 +169,7 @@ update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_im
if (instr->intrinsic != nir_intrinsic_bindless_image_load) {
const nir_variable *var = nir_get_binding_variable(
state->shader, nir_chase_binding(instr->src[0]));
is_memory_readonly |= var->data.access & ACCESS_NON_WRITEABLE;
is_memory_readonly |= var && (var->data.access & ACCESS_NON_WRITEABLE);
}
is_memory_readonly |= is_buffer ? !state->buffers_written : !state->images_written;