Skip to content

Multi-overlay support for XR_EXT_spatial_workspace (overlay IDs) #366

@dfattal

Description

@dfattal

Problem

XrWorkspaceOverlayInfoEXT carries no overlay id, so the runtime keeps exactly one overlay state per session (comp_d3d11_service.cppoverlay_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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions