From 379d5354804e6cd443b821bd339260a2394dd536 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Sun, 1 Nov 2020 17:45:26 -0600 Subject: [PATCH] nir/vec3_to_vec4: Use nir_deref_must_be We use the same nir_deref_mode_is_in_set helper that we use in nir_lower_vars_to_explicit_types for the same reason. If there are any generic pointers in play, we have to lower all generic pointer modes at the same time or else we risk types getting out-of-sync. Reviewed-by: Jesse Natalie Reviewed-by: Caio Marcelo de Oliveira Filho Part-of: --- src/compiler/nir/nir_lower_vec3_to_vec4.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/compiler/nir/nir_lower_vec3_to_vec4.c b/src/compiler/nir/nir_lower_vec3_to_vec4.c index 705140e4bc1..86a1e24f9d5 100644 --- a/src/compiler/nir/nir_lower_vec3_to_vec4.c +++ b/src/compiler/nir/nir_lower_vec3_to_vec4.c @@ -47,10 +47,9 @@ lower_vec3_to_vec4_impl(nir_function_impl *impl, nir_variable_mode modes) switch (instr->type) { case nir_instr_type_deref: { nir_deref_instr *deref = nir_instr_as_deref(instr); - if (!(deref->mode & modes)) + if (!nir_deref_mode_is_in_set(deref, modes)) continue; - assert(!(deref->mode & ~modes)); const struct glsl_type *vec4_type = glsl_type_replace_vec3_with_vec4(deref->type); if (deref->type != vec4_type) { @@ -68,7 +67,7 @@ lower_vec3_to_vec4_impl(nir_function_impl *impl, nir_variable_mode modes) break; nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]); - if (!(deref->mode & modes)) + if (!nir_deref_mode_is_in_set(deref, modes)) break; assert(intrin->dest.is_ssa); @@ -89,7 +88,7 @@ lower_vec3_to_vec4_impl(nir_function_impl *impl, nir_variable_mode modes) break; nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]); - if (!(deref->mode & modes)) + if (!nir_deref_mode_is_in_set(deref, modes)) break; assert(intrin->src[1].is_ssa); @@ -107,12 +106,16 @@ lower_vec3_to_vec4_impl(nir_function_impl *impl, nir_variable_mode modes) } case nir_intrinsic_copy_deref: { - ASSERTED nir_deref_instr *dst = nir_src_as_deref(intrin->src[0]); - ASSERTED nir_deref_instr *src = nir_src_as_deref(intrin->src[0]); + nir_deref_instr *dst = nir_src_as_deref(intrin->src[0]); + nir_deref_instr *src = nir_src_as_deref(intrin->src[0]); /* If we convert once side of a copy and not the other, that * would be very bad. */ - assert(!(src->mode & modes) == !(dst->mode & modes)); + if (nir_deref_mode_may_be(dst, modes) || + nir_deref_mode_may_be(src, modes)) { + assert(nir_deref_mode_must_be(dst, modes)); + assert(nir_deref_mode_must_be(src, modes)); + } break; }