nir: rerun loop analysis if the parameters change
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32005>
This commit is contained in:
@@ -3423,6 +3423,8 @@ typedef struct {
|
||||
bool structured;
|
||||
|
||||
nir_metadata valid_metadata;
|
||||
nir_variable_mode loop_analysis_indirect_mask;
|
||||
bool loop_analysis_force_unroll_sampler_indirect;
|
||||
} nir_function_impl;
|
||||
|
||||
#define nir_foreach_function_temp_variable(var, impl) \
|
||||
|
||||
@@ -1620,4 +1620,7 @@ nir_loop_analyze_impl(nir_function_impl *impl,
|
||||
nir_index_ssa_defs(impl);
|
||||
foreach_list_typed(nir_cf_node, node, node, &impl->body)
|
||||
process_loops(node, indirect_mask, force_unroll_sampler_indirect);
|
||||
|
||||
impl->loop_analysis_indirect_mask = indirect_mask;
|
||||
impl->loop_analysis_force_unroll_sampler_indirect = force_unroll_sampler_indirect;
|
||||
}
|
||||
|
||||
@@ -40,17 +40,22 @@ nir_metadata_require(nir_function_impl *impl, nir_metadata required, ...)
|
||||
nir_calc_dominance_impl(impl);
|
||||
if (NEEDS_UPDATE(nir_metadata_live_defs))
|
||||
nir_live_defs_impl(impl);
|
||||
if (NEEDS_UPDATE(nir_metadata_loop_analysis)) {
|
||||
if (required & nir_metadata_loop_analysis) {
|
||||
va_list ap;
|
||||
va_start(ap, required);
|
||||
/* !! Warning !! Do not move these va_arg() call directly to
|
||||
* nir_loop_analyze_impl() as parameters because the execution order will
|
||||
* become undefined.
|
||||
*/
|
||||
nir_variable_mode mode = va_arg(ap, nir_variable_mode);
|
||||
nir_variable_mode indirect_mask = va_arg(ap, nir_variable_mode);
|
||||
int force_unroll_sampler_indirect = va_arg(ap, int);
|
||||
nir_loop_analyze_impl(impl, mode, force_unroll_sampler_indirect);
|
||||
va_end(ap);
|
||||
|
||||
if (NEEDS_UPDATE(nir_metadata_loop_analysis) ||
|
||||
indirect_mask != impl->loop_analysis_indirect_mask ||
|
||||
force_unroll_sampler_indirect != impl->loop_analysis_force_unroll_sampler_indirect) {
|
||||
nir_loop_analyze_impl(impl, indirect_mask, force_unroll_sampler_indirect);
|
||||
}
|
||||
}
|
||||
|
||||
#undef NEEDS_UPDATE
|
||||
|
||||
Reference in New Issue
Block a user