diff options
author | Connor Abbott <[email protected]> | 2019-07-10 11:55:24 +0200 |
---|---|---|
committer | Connor Abbott <[email protected]> | 2019-07-10 12:31:41 +0200 |
commit | 133273aa22d09cbb2d53b7bf6a8e1da6302c4f15 (patch) | |
tree | 963acceb4a1c61bdb031ca9e4dacf76ea040ff8a /src/compiler/nir/nir_lower_io.c | |
parent | f18b8a1174a3ac7ca1c75bfe8ac0a5e595d094f6 (diff) |
nir/lower_io: Don't use variable to get deref mode
Drivers only use lower_io for modes where pointers don't have a
meaningful value, and dereferences can always be traced back to a
variable. But there can be other modes, like global mode with
VK_EXT_buffer_device_address, where pointers cannot be traced back to a
variable, and lower_io would segfault on loads/stores of these since
nir_deref_instr_get_variable() would return NULL.
Just use the mode on the deref itself to filter out these modes before
we try to get the variable.
Fixes: 118a66df990 ("radv: Use NIR barycentric coordinates")
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Diffstat (limited to 'src/compiler/nir/nir_lower_io.c')
-rw-r--r-- | src/compiler/nir/nir_lower_io.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index 9275803d6f5..279e6e77b6a 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -461,8 +461,7 @@ nir_lower_io_block(nir_block *block, nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]); - nir_variable *var = nir_deref_instr_get_variable(deref); - nir_variable_mode mode = var->data.mode; + nir_variable_mode mode = deref->mode; if ((state->modes & mode) == 0) continue; @@ -473,6 +472,8 @@ nir_lower_io_block(nir_block *block, mode != nir_var_uniform) continue; + nir_variable *var = nir_deref_instr_get_variable(deref); + b->cursor = nir_before_instr(instr); const bool per_vertex = nir_is_per_vertex_io(var, b->shader->info.stage); |