expose stages and system containers (#1647)

This allows third-party plugins to analyze the schedule, e.g. `bevy_mod_picking` can [display a schedule graph](https://github.com/jakobhellermann/bevy_mod_debugdump/tree/schedule-graph#schedule-graph):

![schedule graph](https://raw.githubusercontent.com/jakobhellermann/bevy_mod_debugdump/schedule-graph/docs/schedule_graph.svg)
This commit is contained in:
Jakob Hellermann 2021-03-14 20:44:51 +00:00
parent de55e05669
commit 48ee167531
3 changed files with 40 additions and 4 deletions

View file

@ -201,6 +201,13 @@ impl Schedule {
stage.run(world);
}
}
/// Iterates over all of schedule's stages and their labels, in execution order.
pub fn iter_stages(&self) -> impl Iterator<Item = (&dyn StageLabel, &dyn Stage)> {
self.stage_order
.iter()
.map(move |label| (&**label, &*self.stages[label]))
}
}
impl Stage for Schedule {

View file

@ -59,12 +59,12 @@ pub struct SystemStage {
executor: Box<dyn ParallelSystemExecutor>,
/// Groups of systems; each set has its own run criterion.
system_sets: Vec<VirtualSystemSet>,
/// Topologically sorted exclusive systems that want to be ran at the start of the stage.
/// Topologically sorted exclusive systems that want to be run at the start of the stage.
exclusive_at_start: Vec<ExclusiveSystemContainer>,
/// Topologically sorted exclusive systems that want to be ran after parallel systems but
/// Topologically sorted exclusive systems that want to be run after parallel systems but
/// before the application of their command buffers.
exclusive_before_commands: Vec<ExclusiveSystemContainer>,
/// Topologically sorted exclusive systems that want to be ran at the end of the stage.
/// Topologically sorted exclusive systems that want to be run at the end of the stage.
exclusive_at_end: Vec<ExclusiveSystemContainer>,
/// Topologically sorted parallel systems.
parallel: Vec<ParallelSystemContainer>,
@ -167,6 +167,32 @@ impl SystemStage {
self.add_system_to_set(system, 0)
}
/// Topologically sorted parallel systems.
///
/// Note that systems won't be fully-formed until the stage has been run at least once.
pub fn parallel_systems(&self) -> &[impl SystemContainer] {
&self.parallel
}
/// Topologically sorted exclusive systems that want to be run at the start of the stage.
///
/// Note that systems won't be fully-formed until the stage has been run at least once.
pub fn exclusive_at_start_systems(&self) -> &[impl SystemContainer] {
&self.exclusive_at_start
}
/// Topologically sorted exclusive systems that want to be run at the end of the stage.
///
/// Note that systems won't be fully-formed until the stage has been run at least once.
pub fn exclusive_at_end_systems(&self) -> &[impl SystemContainer] {
&self.exclusive_at_end
}
/// Topologically sorted exclusive systems that want to be run after parallel systems but
/// before the application of their command buffers.
///
/// Note that systems won't be fully-formed until the stage has been run at least once.
pub fn exclusive_before_commands_systems(&self) -> &[impl SystemContainer] {
&self.exclusive_before_commands
}
// TODO: consider exposing
fn add_system_to_set(&mut self, system: impl Into<SystemDescriptor>, set: usize) -> &mut Self {
self.systems_modified = true;

View file

@ -9,9 +9,12 @@ use crate::{
};
use std::{borrow::Cow, ptr::NonNull};
pub(super) trait SystemContainer {
/// System metadata like its name, labels, order requirements and component access.
pub trait SystemContainer {
fn name(&self) -> Cow<'static, str>;
#[doc(hidden)]
fn dependencies(&self) -> &[usize];
#[doc(hidden)]
fn set_dependencies(&mut self, dependencies: impl IntoIterator<Item = usize>);
fn system_set(&self) -> usize;
fn labels(&self) -> &[BoxedSystemLabel];