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:
parent
c5e64c041f
commit
265dcb3836
|
@ -179,53 +179,55 @@ split_wrmask(nir_builder *b, nir_intrinsic_instr *intr)
|
||||||
nir_instr_remove(&intr->instr);
|
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
|
bool
|
||||||
nir_lower_wrmasks(nir_shader *shader, nir_instr_filter_cb cb, const void *data)
|
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) {
|
return nir_shader_instructions_pass(shader,
|
||||||
nir_function_impl *impl = function->impl;
|
nir_lower_wrmasks_instr,
|
||||||
|
nir_metadata_block_index |
|
||||||
if (!impl)
|
nir_metadata_dominance,
|
||||||
continue;
|
&state);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue