bevy icon indicating copy to clipboard operation
bevy copied to clipboard

Schedule build pass

Open Neo-Zhixing opened this issue 6 months ago • 3 comments

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, ())
);

Neo-Zhixing avatar Dec 26 '23 15:12 Neo-Zhixing