BRP Add schedule.graph endpoint#23452
Merged
alice-i-cecile merged 11 commits intobevyengine:mainfrom Mar 26, 2026
Merged
Conversation
Contributor
|
The output for "systems": [],
"systemsets": [
{
"key": "SystemSetKey(1v1)",
"method": "SystemTypeSet:bevy_window::system::close_when_requested"
},
{
"key": "SystemSetKey(2v1)",
"method": "SystemTypeSet:bevy_app::terminal_ctrl_c_handler::TerminalCtrlCHandlerPlugin::exit_on_flag"
},
{
"key": "SystemSetKey(3v1)",
"method": "SystemTypeSet:bevy_render::view::window::screenshot::trigger_screenshots"
},
{
"key": "SystemSetKey(4v1)",
"method": "SystemTypeSet:bevy_light::probe::automatically_add_parallax_correction_components"
}, |
mockersf
previously requested changes
Mar 21, 2026
Member
mockersf
left a comment
There was a problem hiding this comment.
Please add a test for the new endpoint
Merged
alice-i-cecile
approved these changes
Mar 24, 2026
kfc35
approved these changes
Mar 25, 2026
Contributor
kfc35
left a comment
There was a problem hiding this comment.
Just some documentation suggestions
Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
Contributor
|
just a note for maintainers that there is a light dependency on #23447 in documentation wrt merge order |
github-merge-queue bot
pushed a commit
that referenced
this pull request
Mar 25, 2026
# Objective - List schedules in BRP ## Solution - Add the endpoint - Add to `Schedules` some tracking of `temporarily_removed` (schedule removed to execute) and `empty_labels` (no `Schedule` for that label) ## Related: - #23452 - #23446 ## Testing - in terminal 1 run `cargo run --example server --features="bevy_remote"` - in terminal 2 run `curl -d'{"jsonrpc":"2.0","method":"schedule.list","id":1,"params":{}}' -X POST -H "Accept: applcation/json" -H "Content-Type: application/json" http://127.0.0.1:15702` <details><summary>Response</summary> <p> ```json { "jsonrpc": "2.0", "id": 1, "result": { "empty_schedule_labels": [ "FixedPreUpdate", "FixedUpdate" ], "schedule_labels": [ "Startup", "First", "RunFixedMainLoop", "PostStartup", "FixedFirst", "StateTransition", "PreUpdate", "PostUpdate", "Update", "PreStartup", "SpawnScene", "Last", "FixedLast", "FixedPostUpdate", "FixedMain" ], "unavailable_schedule_labels": [ "Main", "RemoteLast" ] } } ``` </p> </details> --------- Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
github-merge-queue bot
pushed a commit
that referenced
this pull request
Mar 28, 2026
…` changes (#23513) # Objective - Render schedules are static, compared to the main schedules in the main world that can be dynamically added with the `MainScheduleOrder` resource - This is necessary to allow BRP introspection of schedules in the Render world (see #23452 ) ## Solution - Add `RenderScheduleOrder` resource that allows for ordering of `Render` schedules ## Testing - CI - #23446
github-merge-queue bot
pushed a commit
that referenced
this pull request
Mar 30, 2026
# Objective - BRP on the `RenderApp` ## Solution - Add type registry to `RenderApp` - Add BRP systems to render app - Add HTTP listener to extra port I suggest hiding whitespace for reviewing: <img width="422" height="360" alt="image" src="https://github.com/user-attachments/assets/3d76eafb-40f5-42f6-8752-c9d94f81d378" /> ## Related: - #23513 - #23447 - #23452 ## Testing - CI - in terminal 1 run `cargo run --example client --features="bevy_remote"` - in terminal 2 run `curl -d'{"jsonrpc":"2.0","method":"world.list_resources","id":1,"params":{}}' -X POST -H "Accept: applcation/json" -H "Content-Type: application/json" http://127.0.0.1:15702` - in terminal 2 run `curl -d'{"jsonrpc":"2.0","method":"world.list_resources","id":1,"params":{}}' -X POST -H "Accept: applcation/json" -H "Content-Type: application/json" http://127.0.0.1:15703` --------- Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
splo
pushed a commit
to splo/bevy
that referenced
this pull request
Mar 31, 2026
# Objective - List schedules in BRP ## Solution - Add the endpoint - Add to `Schedules` some tracking of `temporarily_removed` (schedule removed to execute) and `empty_labels` (no `Schedule` for that label) ## Related: - bevyengine#23452 - bevyengine#23446 ## Testing - in terminal 1 run `cargo run --example server --features="bevy_remote"` - in terminal 2 run `curl -d'{"jsonrpc":"2.0","method":"schedule.list","id":1,"params":{}}' -X POST -H "Accept: applcation/json" -H "Content-Type: application/json" http://127.0.0.1:15702` <details><summary>Response</summary> <p> ```json { "jsonrpc": "2.0", "id": 1, "result": { "empty_schedule_labels": [ "FixedPreUpdate", "FixedUpdate" ], "schedule_labels": [ "Startup", "First", "RunFixedMainLoop", "PostStartup", "FixedFirst", "StateTransition", "PreUpdate", "PostUpdate", "Update", "PreStartup", "SpawnScene", "Last", "FixedLast", "FixedPostUpdate", "FixedMain" ], "unavailable_schedule_labels": [ "Main", "RemoteLast" ] } } ``` </p> </details> --------- Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
splo
pushed a commit
to splo/bevy
that referenced
this pull request
Mar 31, 2026
# Objective - Describe the graph for a given schedule ## Solution - Add endpoint `schedule.graph` ## Related: - bevyengine#23447 - bevyengine#23446 ## Testing - in terminal 1 run `cargo run --example server --features="bevy_remote"` - in terminal 2 run `curl -d'{"jsonrpc":"2.0","method":"schedule.graph","id":1,"params":{"schedule_name":"First"}}' -X POST -H "Accept: applcation/json" -H "Content-Type: application/json" http://127.0.0.1:15702 ` <details><summary>Response</summary> <p> ```json { "jsonrpc": "2.0", "id": 1, "result": { "systemsets": [ { "key": "SystemSetKey(1v1)", "method": "SystemTypeSet:bevy_ecs::message::update::message_update_system" }, { "key": "SystemSetKey(2v1)", "method": "MessageUpdateSystems" }, { "key": "SystemSetKey(3v1)", "method": "SystemTypeSet:bevy_time::time_system" }, { "key": "SystemSetKey(4v1)", "method": "TimeSystems" }, { "key": "SystemSetKey(5v1)", "method": "SystemTypeSet:bevy_render::view::window::screenshot::clear_screenshots" }, { "key": "SystemSetKey(6v1)", "method": "SystemTypeSet:bevy_ecs::schedule::executor::ApplyDeferred" }, { "key": "SystemSetKey(7v1)", "method": "SystemTypeSet:bevy_ui::widget::viewport::viewport_picking" }, { "key": "SystemSetKey(8v1)", "method": "PostInput" }, { "key": "SystemSetKey(9v1)", "method": "SystemTypeSet:bevy_picking::input::mouse_pick_events" }, { "key": "SystemSetKey(10v1)", "method": "Input" }, { "key": "SystemSetKey(11v1)", "method": "SystemTypeSet:bevy_picking::input::touch_pick_events" } ], "hierarchy_nodes": [ "Set(SystemSetKey(11v1))", "Set(SystemSetKey(10v1))", "System(SystemKey(6v1))", "Set(SystemSetKey(9v1))", "System(SystemKey(5v1))", "Set(SystemSetKey(8v1))", "Set(SystemSetKey(7v1))", "System(SystemKey(4v1))", "Set(SystemSetKey(6v1))", "Set(SystemSetKey(5v1))", "System(SystemKey(3v1))", "Set(SystemSetKey(4v1))", "Set(SystemSetKey(3v1))", "System(SystemKey(2v1))", "Set(SystemSetKey(2v1))", "Set(SystemSetKey(1v1))", "System(SystemKey(1v1))" ], "hierarchy_edges": [ [ "Set(SystemSetKey(1v1))", "System(SystemKey(1v1))" ], [ "Set(SystemSetKey(3v1))", "System(SystemKey(2v1))" ], [ "Set(SystemSetKey(8v1))", "System(SystemKey(4v1))" ], [ "Set(SystemSetKey(2v1))", "System(SystemKey(1v1))" ], [ "Set(SystemSetKey(7v1))", "System(SystemKey(4v1))" ], [ "Set(SystemSetKey(4v1))", "System(SystemKey(2v1))" ], [ "Set(SystemSetKey(9v1))", "System(SystemKey(5v1))" ], [ "Set(SystemSetKey(10v1))", "System(SystemKey(6v1))" ], [ "Set(SystemSetKey(5v1))", "System(SystemKey(3v1))" ], [ "Set(SystemSetKey(10v1))", "System(SystemKey(5v1))" ], [ "Set(SystemSetKey(11v1))", "System(SystemKey(6v1))" ] ], "dependency_nodes": [ "System(SystemKey(1v1))", "Set(SystemSetKey(1v1))", "Set(SystemSetKey(2v1))", "System(SystemKey(2v1))", "Set(SystemSetKey(3v1))", "Set(SystemSetKey(4v1))", "System(SystemKey(3v1))", "Set(SystemSetKey(5v1))", "Set(SystemSetKey(6v1))", "System(SystemKey(4v1))", "Set(SystemSetKey(7v1))", "Set(SystemSetKey(8v1))", "System(SystemKey(5v1))", "Set(SystemSetKey(9v1))", "Set(SystemSetKey(10v1))", "System(SystemKey(6v1))", "Set(SystemSetKey(11v1))" ], "dependency_edges": [ [ "Set(SystemSetKey(2v1))", "Set(SystemSetKey(10v1))" ], [ "Set(SystemSetKey(10v1))", "Set(SystemSetKey(8v1))" ], [ "System(SystemKey(3v1))", "Set(SystemSetKey(6v1))" ], [ "System(SystemKey(5v1))", "System(SystemKey(6v1))" ], [ "Set(SystemSetKey(4v1))", "Set(SystemSetKey(8v1))" ], [ "Set(SystemSetKey(4v1))", "Set(SystemSetKey(10v1))" ], [ "Set(SystemSetKey(2v1))", "Set(SystemSetKey(8v1))" ], [ "Set(SystemSetKey(1v1))", "System(SystemKey(3v1))" ] ] } } ``` </p> </details> From the above response, the below graph can be generated. Hierarchy edges are blue, dependency edges are red. System nodes are implied by hierarchy from Set to System. <img width="1543" height="347" alt="first" src="https://github.com/user-attachments/assets/80ac7e80-2a28-4246-80cc-29337bad4383" /> <details><summary>GraphViz Source</summary> <p> ``` digraph { "Set(SystemSetKey(1v1))" [label="message_update_system"] "Set(SystemSetKey(2v1))" [label="MessageUpdateSystems"] "Set(SystemSetKey(3v1))" [label="time_system"] "Set(SystemSetKey(4v1))" [label="TimeSystems"] "Set(SystemSetKey(5v1))" [label="clear_screenshots"] "Set(SystemSetKey(6v1))" [label="ApplyDeferred"] "Set(SystemSetKey(7v1))" [label="viewport_picking"] "Set(SystemSetKey(8v1))" [label="PostInput"] "Set(SystemSetKey(9v1))" [label="mouse_pick_events"] "Set(SystemSetKey(10v1))" [label="Input"] "Set(SystemSetKey(11v1))" [label="touch_pick_events"] // implied nodes "System(SystemKey(1v1))" [label="implied message_update_system", shape=rectangle] "System(SystemKey(2v1))" [label="implied time_system", shape=rectangle] "System(SystemKey(3v1))" [label="implied clear_screenshots", shape=rectangle] "System(SystemKey(4v1))" [label="implied viewport_picking", shape=rectangle] "System(SystemKey(5v1))" [label="implied mouse_pick_events", shape=rectangle] "System(SystemKey(6v1))" [label="implied touch_pick_events", shape=rectangle] // hierarchy "Set(SystemSetKey(1v1))" -> "System(SystemKey(1v1))" [color=blue] "Set(SystemSetKey(3v1))" -> "System(SystemKey(2v1))" [color=blue] "Set(SystemSetKey(8v1))" -> "System(SystemKey(4v1))" [color=blue] "Set(SystemSetKey(2v1))" -> "System(SystemKey(1v1))" [color=blue] "Set(SystemSetKey(7v1))" -> "System(SystemKey(4v1))" [color=blue] "Set(SystemSetKey(4v1))" -> "System(SystemKey(2v1))" [color=blue] "Set(SystemSetKey(9v1))" -> "System(SystemKey(5v1))" [color=blue] "Set(SystemSetKey(10v1))" -> "System(SystemKey(6v1))" [color=blue] "Set(SystemSetKey(5v1))" -> "System(SystemKey(3v1))" [color=blue] "Set(SystemSetKey(10v1))" -> "System(SystemKey(5v1))" [color=blue] "Set(SystemSetKey(11v1))" -> "System(SystemKey(6v1))" [color=blue] // dependencies "Set(SystemSetKey(2v1))" -> "Set(SystemSetKey(10v1))" [color=red] "Set(SystemSetKey(10v1))" -> "Set(SystemSetKey(8v1))" [color=red] "System(SystemKey(3v1))" -> "Set(SystemSetKey(6v1))" [color=red] "System(SystemKey(5v1))" -> "System(SystemKey(6v1))" [color=red] "Set(SystemSetKey(4v1))" -> "Set(SystemSetKey(8v1))" [color=red] "Set(SystemSetKey(4v1))" -> "Set(SystemSetKey(10v1))" [color=red] "Set(SystemSetKey(2v1))" -> "Set(SystemSetKey(8v1))" [color=red] "Set(SystemSetKey(1v1))" -> "System(SystemKey(3v1))" [color=red] } ``` </p> </details> --------- Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com> Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
splo
pushed a commit
to splo/bevy
that referenced
this pull request
Mar 31, 2026
…` changes (bevyengine#23513) # Objective - Render schedules are static, compared to the main schedules in the main world that can be dynamically added with the `MainScheduleOrder` resource - This is necessary to allow BRP introspection of schedules in the Render world (see bevyengine#23452 ) ## Solution - Add `RenderScheduleOrder` resource that allows for ordering of `Render` schedules ## Testing - CI - bevyengine#23446
splo
pushed a commit
to splo/bevy
that referenced
this pull request
Mar 31, 2026
- BRP on the `RenderApp` - Add type registry to `RenderApp` - Add BRP systems to render app - Add HTTP listener to extra port I suggest hiding whitespace for reviewing: <img width="422" height="360" alt="image" src="https://github.com/user-attachments/assets/3d76eafb-40f5-42f6-8752-c9d94f81d378" /> - bevyengine#23513 - bevyengine#23447 - bevyengine#23452 - CI - in terminal 1 run `cargo run --example client --features="bevy_remote"` - in terminal 2 run `curl -d'{"jsonrpc":"2.0","method":"world.list_resources","id":1,"params":{}}' -X POST -H "Accept: applcation/json" -H "Content-Type: application/json" http://127.0.0.1:15702` - in terminal 2 run `curl -d'{"jsonrpc":"2.0","method":"world.list_resources","id":1,"params":{}}' -X POST -H "Accept: applcation/json" -H "Content-Type: application/json" http://127.0.0.1:15703` --------- Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
github-merge-queue bot
pushed a commit
that referenced
this pull request
Apr 9, 2026
…ta. (#23733) # Objective - A possible step towards #10981. - Followup to #22520. - We accidentally have two implementations of the same thing! We created a way to collect schedule data in `bevy_dev_tools` and in `bevy_remote`. `ScheduleData` is a more complete implementation of collecting schedule data, and is less tied to the internals of BRP (e.g., it supports serializing to disk instead of only through the BRP API), so we switch to that. ## Solution - Replace the implementation of `schedule.graph` with the `ScheduleData` API. A disadvantage is that we now need to wait for the schedules to be initialized before we can read them. Since users have to connect with BRP though, it is almost certain that the schedules will be initialized by the time they request the schedules. This may not be true of schedules like state transitions though - since these only run rarely. In a future PR, we can build the schedules on-demand instead. ## Testing - Updated the test for this. - Ran the same test as #23452 - Terminal 1: `cargo r --example server --features=bevy_remote` - Terminal 2: `curl -d'{"jsonrpc":"2.0","method":"schedule.graph","id":1,"params":{"schedule_label":"First"}}' -X POST -H "Accept: applcation/json" -H "Content-Type: application/json" http://127.0.0.1:15702` - It dumped out a whole load of JSON that looked expected! - I don't have a visualization of the schedule data yet, so I can't validate that it's correct, but there's no reason to believe its wrong given the existing `ScheduleData` tests.
viridia
pushed a commit
to viridia/bevy
that referenced
this pull request
Apr 10, 2026
…ta. (bevyengine#23733) # Objective - A possible step towards bevyengine#10981. - Followup to bevyengine#22520. - We accidentally have two implementations of the same thing! We created a way to collect schedule data in `bevy_dev_tools` and in `bevy_remote`. `ScheduleData` is a more complete implementation of collecting schedule data, and is less tied to the internals of BRP (e.g., it supports serializing to disk instead of only through the BRP API), so we switch to that. ## Solution - Replace the implementation of `schedule.graph` with the `ScheduleData` API. A disadvantage is that we now need to wait for the schedules to be initialized before we can read them. Since users have to connect with BRP though, it is almost certain that the schedules will be initialized by the time they request the schedules. This may not be true of schedules like state transitions though - since these only run rarely. In a future PR, we can build the schedules on-demand instead. ## Testing - Updated the test for this. - Ran the same test as bevyengine#23452 - Terminal 1: `cargo r --example server --features=bevy_remote` - Terminal 2: `curl -d'{"jsonrpc":"2.0","method":"schedule.graph","id":1,"params":{"schedule_label":"First"}}' -X POST -H "Accept: applcation/json" -H "Content-Type: application/json" http://127.0.0.1:15702` - It dumped out a whole load of JSON that looked expected! - I don't have a visualization of the schedule data yet, so I can't validate that it's correct, but there's no reason to believe its wrong given the existing `ScheduleData` tests.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Objective
Solution
schedule.graphRelated:
schedule.listendpoint #23447Testing
cargo run --example server --features="bevy_remote"curl -d'{"jsonrpc":"2.0","method":"schedule.graph","id":1,"params":{"schedule_name":"First"}}' -X POST -H "Accept: applcation/json" -H "Content-Type: application/json" http://127.0.0.1:15702Response
{ "jsonrpc": "2.0", "id": 1, "result": { "systemsets": [ { "key": "SystemSetKey(1v1)", "method": "SystemTypeSet:bevy_ecs::message::update::message_update_system" }, { "key": "SystemSetKey(2v1)", "method": "MessageUpdateSystems" }, { "key": "SystemSetKey(3v1)", "method": "SystemTypeSet:bevy_time::time_system" }, { "key": "SystemSetKey(4v1)", "method": "TimeSystems" }, { "key": "SystemSetKey(5v1)", "method": "SystemTypeSet:bevy_render::view::window::screenshot::clear_screenshots" }, { "key": "SystemSetKey(6v1)", "method": "SystemTypeSet:bevy_ecs::schedule::executor::ApplyDeferred" }, { "key": "SystemSetKey(7v1)", "method": "SystemTypeSet:bevy_ui::widget::viewport::viewport_picking" }, { "key": "SystemSetKey(8v1)", "method": "PostInput" }, { "key": "SystemSetKey(9v1)", "method": "SystemTypeSet:bevy_picking::input::mouse_pick_events" }, { "key": "SystemSetKey(10v1)", "method": "Input" }, { "key": "SystemSetKey(11v1)", "method": "SystemTypeSet:bevy_picking::input::touch_pick_events" } ], "hierarchy_nodes": [ "Set(SystemSetKey(11v1))", "Set(SystemSetKey(10v1))", "System(SystemKey(6v1))", "Set(SystemSetKey(9v1))", "System(SystemKey(5v1))", "Set(SystemSetKey(8v1))", "Set(SystemSetKey(7v1))", "System(SystemKey(4v1))", "Set(SystemSetKey(6v1))", "Set(SystemSetKey(5v1))", "System(SystemKey(3v1))", "Set(SystemSetKey(4v1))", "Set(SystemSetKey(3v1))", "System(SystemKey(2v1))", "Set(SystemSetKey(2v1))", "Set(SystemSetKey(1v1))", "System(SystemKey(1v1))" ], "hierarchy_edges": [ [ "Set(SystemSetKey(1v1))", "System(SystemKey(1v1))" ], [ "Set(SystemSetKey(3v1))", "System(SystemKey(2v1))" ], [ "Set(SystemSetKey(8v1))", "System(SystemKey(4v1))" ], [ "Set(SystemSetKey(2v1))", "System(SystemKey(1v1))" ], [ "Set(SystemSetKey(7v1))", "System(SystemKey(4v1))" ], [ "Set(SystemSetKey(4v1))", "System(SystemKey(2v1))" ], [ "Set(SystemSetKey(9v1))", "System(SystemKey(5v1))" ], [ "Set(SystemSetKey(10v1))", "System(SystemKey(6v1))" ], [ "Set(SystemSetKey(5v1))", "System(SystemKey(3v1))" ], [ "Set(SystemSetKey(10v1))", "System(SystemKey(5v1))" ], [ "Set(SystemSetKey(11v1))", "System(SystemKey(6v1))" ] ], "dependency_nodes": [ "System(SystemKey(1v1))", "Set(SystemSetKey(1v1))", "Set(SystemSetKey(2v1))", "System(SystemKey(2v1))", "Set(SystemSetKey(3v1))", "Set(SystemSetKey(4v1))", "System(SystemKey(3v1))", "Set(SystemSetKey(5v1))", "Set(SystemSetKey(6v1))", "System(SystemKey(4v1))", "Set(SystemSetKey(7v1))", "Set(SystemSetKey(8v1))", "System(SystemKey(5v1))", "Set(SystemSetKey(9v1))", "Set(SystemSetKey(10v1))", "System(SystemKey(6v1))", "Set(SystemSetKey(11v1))" ], "dependency_edges": [ [ "Set(SystemSetKey(2v1))", "Set(SystemSetKey(10v1))" ], [ "Set(SystemSetKey(10v1))", "Set(SystemSetKey(8v1))" ], [ "System(SystemKey(3v1))", "Set(SystemSetKey(6v1))" ], [ "System(SystemKey(5v1))", "System(SystemKey(6v1))" ], [ "Set(SystemSetKey(4v1))", "Set(SystemSetKey(8v1))" ], [ "Set(SystemSetKey(4v1))", "Set(SystemSetKey(10v1))" ], [ "Set(SystemSetKey(2v1))", "Set(SystemSetKey(8v1))" ], [ "Set(SystemSetKey(1v1))", "System(SystemKey(3v1))" ] ] } }From the above response, the below graph can be generated. Hierarchy edges are blue, dependency edges are red. System nodes are implied by hierarchy from Set to System.
GraphViz Source