From 265dcb383673822686a3855225b49f376e51ebeb Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 20 Aug 2020 12:25:52 -0700 Subject: [PATCH] nir/nir_lower_wrmasks: Use the nir_lower_instructions_pass() helper. This fixes the invalidation of metadata when we didn't modify the shader and unindents a bunch of code. Reviewed-By: Mike Blumenkrantz Part-of: --- src/compiler/nir/nir_lower_wrmasks.c | 92 ++++++++++++++-------------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/src/compiler/nir/nir_lower_wrmasks.c b/src/compiler/nir/nir_lower_wrmasks.c index b3941ec84af..ea2d4f330f7 100644 --- a/src/compiler/nir/nir_lower_wrmasks.c +++ b/src/compiler/nir/nir_lower_wrmasks.c @@ -179,53 +179,55 @@ split_wrmask(nir_builder *b, nir_intrinsic_instr *intr) nir_instr_remove(&intr->instr); } +struct nir_lower_wrmasks_state { + nir_instr_filter_cb cb; + const void *data; +}; + +static bool +nir_lower_wrmasks_instr(nir_builder *b, nir_instr *instr, void *data) +{ + struct nir_lower_wrmasks_state *state = data; + + if (instr->type != nir_instr_type_intrinsic) + return false; + + nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); + + /* if no wrmask, then skip it: */ + if (!nir_intrinsic_has_write_mask(intr)) + return false; + + /* if wrmask is already contiguous, then nothing to do: */ + if (nir_intrinsic_write_mask(intr) == BITFIELD_MASK(intr->num_components)) + return false; + + /* do we know how to lower this instruction? */ + if (value_src(intr->intrinsic) < 0) + return false; + + assert(offset_src(intr->intrinsic) >= 0); + + /* does backend need us to lower this intrinsic? */ + if (state->cb && !state->cb(instr, state->data)) + return false; + + split_wrmask(b, intr); + + return true; +} + bool nir_lower_wrmasks(nir_shader *shader, nir_instr_filter_cb cb, const void *data) { - bool progress = false; + struct nir_lower_wrmasks_state state = { + .cb = cb, + .data = data, + }; - nir_foreach_function(function, shader) { - nir_function_impl *impl = function->impl; - - if (!impl) - continue; - - nir_foreach_block(block, impl) { - nir_foreach_instr_safe(instr, block) { - if (instr->type != nir_instr_type_intrinsic) - continue; - - nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); - - /* if no wrmask, then skip it: */ - if (!nir_intrinsic_has_write_mask(intr)) - continue; - - /* if wrmask is already contiguous, then nothing to do: */ - if (nir_intrinsic_write_mask(intr) == BITFIELD_MASK(intr->num_components)) - continue; - - /* do we know how to lower this instruction? */ - if (value_src(intr->intrinsic) < 0) - continue; - - assert(offset_src(intr->intrinsic) >= 0); - - /* does backend need us to lower this intrinsic? */ - if (cb && !cb(instr, data)) - continue; - - nir_builder b; - nir_builder_init(&b, impl); - split_wrmask(&b, intr); - progress = true; - } - } - - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - - } - - return progress; + return nir_shader_instructions_pass(shader, + nir_lower_wrmasks_instr, + nir_metadata_block_index | + nir_metadata_dominance, + &state); }