bevy
bevy copied to clipboard
Schedule build pass
Objective
This is a follow up to #9822, which automatically adds sync points during the Schedule build process.
However, the implementation in #9822 feels very "special case" to me. As the number of things we want to do with the Schedule
grows, we need a modularized way to manage those behaviors. For example, in one of my current experiments I want to automatically add systems to apply GPU pipeline barriers between systems accessing GPU resources.
For dynamic modifications of the schedule, we mostly need these capabilities:
- Storing custom data on schedule edges
- Storing custom data on schedule nodes
- Modify the schedule graph whenever it builds
These should be enough to allows us to add "hooks" to the schedule build process for various reasons.
cc @hymm
Solution
This PR abstracts the process of schedule modification and created a new trait, ScheduleBuildPass
. Most of the logics in #9822 were moved to an implementation of ScheduleBuildPass
, AutoInsertApplyDeferredPass
.
Whether a dependency edge should "ignore deferred" is now indicated by the presence of a marker struct, IgnoreDeferred
.
This PR has no externally visible effects. However, in a future PR I propose to change the before_ignore_deferred
and after_ignore_deferred
API into a more general form, before_with_options
and after_with_options
.
schedule.add_systems(
system.before_with_options(another_system, IgnoreDeferred)
);
schedule.add_systems(
system.before_with_options(another_system, (
IgnoreDeferred,
AnyOtherOption {
key: value
}
))
);
schedule.add_systems(
system.before_with_options(another_system, ())
);