Problem
XrWorkspaceOverlayInfoEXT carries no overlay id, so the runtime keeps exactly one overlay state per session (comp_d3d11_service.cpp — overlay_visible / overlay_xsc / overlay_anchor / pivot / size), overwritten on every xrSetWorkspaceOverlayEXT. The shell's taskbar and launcher each submit an overlay and only coexist because they're never visible at the same time. The new shell toast subsystem (DisplayXR/displayxr-shell-pvt#42) makes this a hard limit — it currently needs a shell-side priority arbiter that hides the taskbar while a toast is shown.
Proposal
Add an overlayId (uint32) to XrWorkspaceOverlayInfoEXT and to the overlay swapchain create info; the runtime keeps a small keyed map of overlays and composites all visible ones (z by id or submission order); bump spec_version. visible=false for an id removes it. The header auto-syncs to displayxr-extensions via CI; the shell bumps its runtime pin.
Benefit
Taskbar + toast + launcher composite simultaneously; retires the implicit mutual-exclusion contract; lets the shell drop the arbiter.
Affected
- Extension header (
XR_EXT_spatial_workspace), spec_version bump.
comp_d3d11_service.cpp — overlay state (single fields → keyed map) + render path (composite all visible overlays).
- Shell
shell_taskbar.cpp / shell_launcher.cpp / shell_toast.cpp — one overlay id per overlay.
- Coordinated service+client redeploy required (git-tag match).
Refs DisplayXR/displayxr-shell-pvt#42.
Problem
XrWorkspaceOverlayInfoEXTcarries no overlay id, so the runtime keeps exactly one overlay state per session (comp_d3d11_service.cpp—overlay_visible/overlay_xsc/overlay_anchor/pivot/size), overwritten on everyxrSetWorkspaceOverlayEXT. The shell's taskbar and launcher each submit an overlay and only coexist because they're never visible at the same time. The new shell toast subsystem (DisplayXR/displayxr-shell-pvt#42) makes this a hard limit — it currently needs a shell-side priority arbiter that hides the taskbar while a toast is shown.Proposal
Add an
overlayId(uint32) toXrWorkspaceOverlayInfoEXTand to the overlay swapchain create info; the runtime keeps a small keyed map of overlays and composites all visible ones (z by id or submission order); bumpspec_version.visible=falsefor an id removes it. The header auto-syncs todisplayxr-extensionsvia CI; the shell bumps its runtime pin.Benefit
Taskbar + toast + launcher composite simultaneously; retires the implicit mutual-exclusion contract; lets the shell drop the arbiter.
Affected
XR_EXT_spatial_workspace),spec_versionbump.comp_d3d11_service.cpp— overlay state (single fields → keyed map) + render path (composite all visible overlays).shell_taskbar.cpp/shell_launcher.cpp/shell_toast.cpp— one overlay id per overlay.Refs DisplayXR/displayxr-shell-pvt#42.