nir: Allow internal changes to the instr in nir_shader_lower_instructions().
v3d's NIR txf_ms lowering wants to swizzle around the input coordinates in NIR, but doesn't generate a new txf_ms instructions as replacement. It's pretty easy to allow that in nir_shader_lower_instructions, and it may be common in lowering passes. Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
@@ -1876,7 +1876,7 @@ nir_function_impl_lower_instructions(nir_function_impl *impl,
|
||||
|
||||
b.cursor = nir_after_instr(instr);
|
||||
nir_ssa_def *new_def = lower(&b, instr, cb_data);
|
||||
if (new_def) {
|
||||
if (new_def && new_def != NIR_LOWER_INSTR_PROGRESS) {
|
||||
assert(old_def != NULL);
|
||||
if (new_def->parent_instr->block != instr->block)
|
||||
preserved = nir_metadata_none;
|
||||
@@ -1901,6 +1901,9 @@ nir_function_impl_lower_instructions(nir_function_impl *impl,
|
||||
list_replace(&old_if_uses, &old_def->if_uses);
|
||||
}
|
||||
iter = nir_after_instr(instr);
|
||||
|
||||
if (new_def == NIR_LOWER_INSTR_PROGRESS)
|
||||
progress = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -3299,6 +3299,13 @@ typedef bool (*nir_instr_filter_cb)(const nir_instr *, const void *);
|
||||
typedef nir_ssa_def *(*nir_lower_instr_cb)(struct nir_builder *,
|
||||
nir_instr *, void *);
|
||||
|
||||
/**
|
||||
* Special return value for nir_lower_instr_cb when some progress occurred
|
||||
* (like changing an input to the instr) that didn't result in a replacement
|
||||
* SSA def being generated.
|
||||
*/
|
||||
#define NIR_LOWER_INSTR_PROGRESS ((nir_ssa_def *)(uintptr_t)1)
|
||||
|
||||
/** Iterate over all the instructions in a nir_function_impl and lower them
|
||||
* using the provided callbacks
|
||||
*
|
||||
|
Reference in New Issue
Block a user