Skip to content

BRP Add schedule.graph endpoint#23452

Merged
alice-i-cecile merged 11 commits intobevyengine:mainfrom
Zeophlite:brp-systems2
Mar 26, 2026
Merged

BRP Add schedule.graph endpoint#23452
alice-i-cecile merged 11 commits intobevyengine:mainfrom
Zeophlite:brp-systems2

Conversation

@Zeophlite
Copy link
Copy Markdown
Contributor

@Zeophlite Zeophlite commented Mar 21, 2026

Objective

  • Describe the graph for a given schedule

Solution

  • Add endpoint schedule.graph

Related:

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
Response

{
    "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.

first
GraphViz Source

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]
}

@Zeophlite Zeophlite added A-Dev-Tools Tools used to debug Bevy applications. D-Modest A "normal" level of difficulty; suitable for simple features or challenging fixes S-Needs-Review Needs reviewer attention (from anyone!) to move forward labels Mar 21, 2026
@Zeophlite Zeophlite marked this pull request as ready for review March 21, 2026 16:35
@Zeophlite Zeophlite added this to the 0.19 milestone Mar 21, 2026
@Zeophlite Zeophlite added the S-Needs-Help The author needs help finishing this PR. label Mar 21, 2026
@ChristopherBiscardi
Copy link
Copy Markdown
Contributor

The output for systems and systemsets in a request for Update looks weird and potentially wrong. How did you validate the output for this PR?

    "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"
      },

Copy link
Copy Markdown
Member

@mockersf mockersf left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a test for the new endpoint

@alice-i-cecile alice-i-cecile added S-Waiting-on-Author The author needs to make changes or address concerns before this can be merged and removed S-Needs-Review Needs reviewer attention (from anyone!) to move forward labels Mar 22, 2026
@Zeophlite Zeophlite removed the S-Needs-Help The author needs help finishing this PR. label Mar 23, 2026
@Zeophlite Zeophlite added S-Needs-Review Needs reviewer attention (from anyone!) to move forward and removed S-Waiting-on-Author The author needs to make changes or address concerns before this can be merged labels Mar 24, 2026
Copy link
Copy Markdown
Contributor

@kfc35 kfc35 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just some documentation suggestions

Co-authored-by: Kevin Chen <chen.kevin.f@gmail.com>
@kfc35 kfc35 added S-Ready-For-Final-Review This PR has been approved by the community. It's ready for a maintainer to consider merging it and removed S-Needs-Review Needs reviewer attention (from anyone!) to move forward labels Mar 25, 2026
@kfc35
Copy link
Copy Markdown
Contributor

kfc35 commented Mar 25, 2026

just a note for maintainers that there is a light dependency on #23447 in documentation wrt merge order

@alice-i-cecile alice-i-cecile dismissed mockersf’s stale review March 25, 2026 16:58

Test has been added

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>
@alice-i-cecile alice-i-cecile added this pull request to the merge queue Mar 26, 2026
Merged via the queue into bevyengine:main with commit 56f3ef6 Mar 26, 2026
38 checks passed
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-Dev-Tools Tools used to debug Bevy applications. D-Modest A "normal" level of difficulty; suitable for simple features or challenging fixes S-Ready-For-Final-Review This PR has been approved by the community. It's ready for a maintainer to consider merging it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants