diff options
author | Timothy Arceri <[email protected]> | 2018-12-19 20:09:42 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2019-01-02 12:19:17 +1100 |
commit | d828694b804b3bd28e8ef41499dc56b259fc2da2 (patch) | |
tree | 855266e3cf5b20a4659aa11fcab1b89ff54bf3f8 /src/compiler | |
parent | c0aba8b0dc7b3e6cde019a0f2b30bb3a62d666ce (diff) |
nir: rework nir_link_opt_varyings()
This just cleans things up a little and make things more safe for
derefs.
Tested-by: Dieter Nützel <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/nir/nir_linking_helpers.c | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/src/compiler/nir/nir_linking_helpers.c b/src/compiler/nir/nir_linking_helpers.c index b6eaebcb6a4..c52e926ecbb 100644 --- a/src/compiler/nir/nir_linking_helpers.c +++ b/src/compiler/nir/nir_linking_helpers.c @@ -561,14 +561,8 @@ nir_link_xfb_varyings(nir_shader *producer, nir_shader *consumer) } static bool -can_replace_varying(nir_intrinsic_instr *store_intr) +can_replace_varying(nir_variable *out_var) { - nir_deref_instr *out_deref = nir_src_as_deref(store_intr->src[0]); - if (out_deref->mode != nir_var_shader_out) - return false; - - nir_variable *out_var = nir_deref_instr_get_variable(out_deref); - /* Skip types that require more complex handling. * TODO: add support for these types. */ @@ -581,7 +575,7 @@ can_replace_varying(nir_intrinsic_instr *store_intr) /* Limit this pass to scalars for now to keep things simple. Most varyings * should have been lowered to scalars at this point anyway. */ - if (store_intr->num_components != 1) + if (!glsl_type_is_scalar(out_var->type)) return false; if (out_var->data.location < VARYING_SLOT_VAR0 || @@ -592,12 +586,8 @@ can_replace_varying(nir_intrinsic_instr *store_intr) } static bool -try_replace_constant_input(nir_shader *shader, - nir_intrinsic_instr *store_intr) +replace_constant_input(nir_shader *shader, nir_intrinsic_instr *store_intr) { - if (!can_replace_varying(store_intr)) - return false; - nir_function_impl *impl = nir_shader_get_entrypoint(shader); nir_builder b; @@ -671,11 +661,17 @@ nir_link_opt_varyings(nir_shader *producer, nir_shader *consumer) if (intr->intrinsic != nir_intrinsic_store_deref) continue; - if (intr->src[1].ssa->parent_instr->type != nir_instr_type_load_const) { + nir_deref_instr *out_deref = nir_src_as_deref(intr->src[0]); + if (out_deref->mode != nir_var_shader_out) + continue; + + nir_variable *out_var = nir_deref_instr_get_variable(out_deref); + if (!can_replace_varying(out_var)) continue; - } - progress |= try_replace_constant_input(consumer, intr); + if (intr->src[1].ssa->parent_instr->type == nir_instr_type_load_const) { + progress |= replace_constant_input(consumer, intr); + } } return progress; |