Skip to content

Commit 1126949

Browse files
urben1680Vrixyz
authored andcommitted
No schedule build pass overwrite if build settings do not change auto_insert_apply_deferred from true (#19217)
# Objective Fixes #18790. Simpler alternative to #19195. ## Solution As suggested by @PixelDust22, simply avoid overwriting the pass if the schedule already has auto sync points enabled. Leave pass logic untouched. It still is probably a bad idea to add systems/set configs before changing the build settings, but that is not important as long there are no more complex build passes. ## Testing Added a test. --------- Co-authored-by: Thierry Berger <contact@thierryberger.com>
1 parent 4117834 commit 1126949

File tree

1 file changed

+53
-1
lines changed

1 file changed

+53
-1
lines changed

crates/bevy_ecs/src/schedule/schedule.rs

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,9 +394,21 @@ impl Schedule {
394394
}
395395

396396
/// Changes miscellaneous build settings.
397+
///
398+
/// If [`settings.auto_insert_apply_deferred`][ScheduleBuildSettings::auto_insert_apply_deferred]
399+
/// is `false`, this clears `*_ignore_deferred` edge settings configured so far.
400+
///
401+
/// Generally this method should be used before adding systems or set configurations to the schedule,
402+
/// not after.
397403
pub fn set_build_settings(&mut self, settings: ScheduleBuildSettings) -> &mut Self {
398404
if settings.auto_insert_apply_deferred {
399-
self.add_build_pass(passes::AutoInsertApplyDeferredPass::default());
405+
if !self
406+
.graph
407+
.passes
408+
.contains_key(&TypeId::of::<passes::AutoInsertApplyDeferredPass>())
409+
{
410+
self.add_build_pass(passes::AutoInsertApplyDeferredPass::default());
411+
}
400412
} else {
401413
self.remove_build_pass::<passes::AutoInsertApplyDeferredPass>();
402414
}
@@ -2076,6 +2088,46 @@ mod tests {
20762088
#[derive(Resource)]
20772089
struct Resource2;
20782090

2091+
#[test]
2092+
fn unchanged_auto_insert_apply_deferred_has_no_effect() {
2093+
use alloc::{vec, vec::Vec};
2094+
2095+
#[derive(PartialEq, Debug)]
2096+
enum Entry {
2097+
System(usize),
2098+
SyncPoint(usize),
2099+
}
2100+
2101+
#[derive(Resource, Default)]
2102+
struct Log(Vec<Entry>);
2103+
2104+
fn system<const N: usize>(mut res: ResMut<Log>, mut commands: Commands) {
2105+
res.0.push(Entry::System(N));
2106+
commands
2107+
.queue(|world: &mut World| world.resource_mut::<Log>().0.push(Entry::SyncPoint(N)));
2108+
}
2109+
2110+
let mut world = World::default();
2111+
world.init_resource::<Log>();
2112+
let mut schedule = Schedule::default();
2113+
schedule.add_systems((system::<1>, system::<2>).chain_ignore_deferred());
2114+
schedule.set_build_settings(ScheduleBuildSettings {
2115+
auto_insert_apply_deferred: true,
2116+
..Default::default()
2117+
});
2118+
schedule.run(&mut world);
2119+
let actual = world.remove_resource::<Log>().unwrap().0;
2120+
2121+
let expected = vec![
2122+
Entry::System(1),
2123+
Entry::System(2),
2124+
Entry::SyncPoint(1),
2125+
Entry::SyncPoint(2),
2126+
];
2127+
2128+
assert_eq!(actual, expected);
2129+
}
2130+
20792131
// regression test for https://github.com/bevyengine/bevy/issues/9114
20802132
#[test]
20812133
fn ambiguous_with_not_breaking_run_conditions() {

0 commit comments

Comments
 (0)