diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/nir/nir.h | 2 | ||||
-rw-r--r-- | src/compiler/nir/nir_lower_clamp_color_outputs.c | 30 |
2 files changed, 22 insertions, 10 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 8c74af0dff7..e03c0560c0e 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2503,7 +2503,7 @@ bool nir_lower_clip_cull_distance_arrays(nir_shader *nir); void nir_lower_two_sided_color(nir_shader *shader); -void nir_lower_clamp_color_outputs(nir_shader *shader); +bool nir_lower_clamp_color_outputs(nir_shader *shader); void nir_lower_passthrough_edgeflags(nir_shader *shader); void nir_lower_tes_patch_vertices(nir_shader *tes, unsigned patch_vertices); diff --git a/src/compiler/nir/nir_lower_clamp_color_outputs.c b/src/compiler/nir/nir_lower_clamp_color_outputs.c index ab211a4296c..cc497351eee 100644 --- a/src/compiler/nir/nir_lower_clamp_color_outputs.c +++ b/src/compiler/nir/nir_lower_clamp_color_outputs.c @@ -59,7 +59,7 @@ is_color_output(lower_state *state, nir_variable *out) } } -static void +static bool lower_intrinsic(lower_state *state, nir_intrinsic_instr *intr) { nir_variable *out = NULL; @@ -82,11 +82,11 @@ lower_intrinsic(lower_state *state, nir_intrinsic_instr *intr) assume(out); break; default: - return; + return false; } if (out->data.mode != nir_var_shader_out) - return; + return false; if (is_color_output(state, out)) { b->cursor = nir_before_instr(&intr->instr); @@ -94,38 +94,50 @@ lower_intrinsic(lower_state *state, nir_intrinsic_instr *intr) s = nir_fsat(b, s); nir_instr_rewrite_src(&intr->instr, &intr->src[0], nir_src_for_ssa(s)); } + + return true; } static bool lower_block(lower_state *state, nir_block *block) { + bool progress = false; + nir_foreach_instr_safe(instr, block) { if (instr->type == nir_instr_type_intrinsic) - lower_intrinsic(state, nir_instr_as_intrinsic(instr)); + progress |= lower_intrinsic(state, nir_instr_as_intrinsic(instr)); } - return true; + return progress; } -static void + +static bool lower_impl(lower_state *state, nir_function_impl *impl) { nir_builder_init(&state->b, impl); + bool progress = false; nir_foreach_block(block, impl) { - lower_block(state, block); + progress |= lower_block(state, block); } nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); + + return progress; } -void nir_lower_clamp_color_outputs(nir_shader *shader) +bool +nir_lower_clamp_color_outputs(nir_shader *shader) { + bool progress = false; lower_state state = { .shader = shader, }; nir_foreach_function(function, shader) { if (function->impl) - lower_impl(&state, function->impl); + progress |= lower_impl(&state, function->impl); } + + return progress; } |