Skip to content

Dark halo around a transparent app's silhouette while a window-space layer is up — atlas is clean, artefact is post-compose #1791

Closed as not planned

Description

@dfattal

Symptom

On the Windows Leia panel, a transparent-overlay Unity app (lenovo-avatar, D3D12, plugin main + displayxr-unity#348) shows a dark halo around the avatar's silhouette whenever a window-space HUD layer (XrCompositionLayerWindowSpaceDXR) is up. David sees it by eye. With the HUD off there's no halo. The same happens with the plugin build before #348, so it isn't caused by the ADR-044 colour change.

Evidence: the atlas is clean in both cases

Runtime atlas captures (%TEMP%\displayxr_atlas_trigger, DXR_ATLAS_CAPTURE_RAW_ALPHA=1), same build, runtime v2.22.0, 808x640 atlas (2 views of 404x640):

layers per frame alpha = 255 0 < alpha < 255 alpha = 0 with rgb ≠ 0
HUD off 2 (zone projection + Local2D) 79,536 3,097 (avatar AA edges) 0
HUD on (2 wsui layers) 4 87,898 51,940 (the semi-transparent HUD panel) 0

Outside the HUD panel's rect, the area around the silhouette is alpha 0, rgb 0 in both captures, with no fringe. So the layers the app submits, and the runtime's layer composition into the atlas, are correct. The halo is introduced after the atlas, in the DP/weave compose-under-desktop or the present path. That stage can't be captured today (#492).

Context

Ask

Whoever owns the DP compose-under-desktop / weave present path: can you check whether the alpha-0 region gets different treatment when the frame carries a window-space layer, e.g. the multi-layer compose path vs the fast path feeding the DP? A post-weave capture (#492) would make this directly measurable.

Reported from the displayxr-unity side; atlas PNGs are available on request.

Activity

  1. dfattal commented on Oct 2, 2026

    @dfattal
    CollaboratorAuthor

    Not a runtime bug, closing. My diagnosis was wrong. The "halo" was the HUD's semi-transparent backdrop clipped by the app's own window region. On Windows the transparent overlay's SetWindowRgn region was the avatar's (dilated) silhouette, and a window region is a visual clip, so the HUD layer was only visible inside that silhouette-shaped area. It read as a dark band around the avatar. That's also why the atlas was clean: the clip happens at the window, after composition. It's fixed plugin-side by DisplayXR/displayxr-unity#351, which adds live window-space layer rects to the region, the same trick the model viewer uses for its toasts. Confirmed on the panel: no clip, no halo. Sorry for the noise.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions