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

View File

@@ -179,53 +179,55 @@ split_wrmask(nir_builder *b, nir_intrinsic_instr *intr)
nir_instr_remove(&intr->instr); nir_instr_remove(&intr->instr);
} }
bool struct nir_lower_wrmasks_state {
nir_lower_wrmasks(nir_shader *shader, nir_instr_filter_cb cb, const void *data) nir_instr_filter_cb cb;
const void *data;
};
static bool
nir_lower_wrmasks_instr(nir_builder *b, nir_instr *instr, void *data)
{ {
bool progress = false; struct nir_lower_wrmasks_state *state = 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) if (instr->type != nir_instr_type_intrinsic)
continue; return false;
nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
/* if no wrmask, then skip it: */ /* if no wrmask, then skip it: */
if (!nir_intrinsic_has_write_mask(intr)) if (!nir_intrinsic_has_write_mask(intr))
continue; return false;
/* if wrmask is already contiguous, then nothing to do: */ /* if wrmask is already contiguous, then nothing to do: */
if (nir_intrinsic_write_mask(intr) == BITFIELD_MASK(intr->num_components)) if (nir_intrinsic_write_mask(intr) == BITFIELD_MASK(intr->num_components))
continue; return false;
/* do we know how to lower this instruction? */ /* do we know how to lower this instruction? */
if (value_src(intr->intrinsic) < 0) if (value_src(intr->intrinsic) < 0)
continue; return false;
assert(offset_src(intr->intrinsic) >= 0); assert(offset_src(intr->intrinsic) >= 0);
/* does backend need us to lower this intrinsic? */ /* does backend need us to lower this intrinsic? */
if (cb && !cb(instr, data)) if (state->cb && !state->cb(instr, state->data))
continue; return false;
nir_builder b; split_wrmask(b, intr);
nir_builder_init(&b, impl);
split_wrmask(&b, intr);
progress = true;
}
}
nir_metadata_preserve(impl, nir_metadata_block_index | return true;
nir_metadata_dominance); }
} bool
nir_lower_wrmasks(nir_shader *shader, nir_instr_filter_cb cb, const void *data)
return progress; {
struct nir_lower_wrmasks_state state = {
.cb = cb,
.data = data,
};
return nir_shader_instructions_pass(shader,
nir_lower_wrmasks_instr,
nir_metadata_block_index |
nir_metadata_dominance,
&state);
} }