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 <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6412>
This commit is contained in:
Eric Anholt 2020-08-20 12:25:52 -07:00 committed by Marge Bot
parent c5e64c041f
commit 265dcb3836
1 changed files with 47 additions and 45 deletions

View File

@ -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);
}