Skip to content

feat: DX12 DirectComposition path for per-pixel alpha transparency #298

Description

@kolkov

feat: DX12 DirectComposition path for per-pixel alpha transparency

Problem

DX12 HAL uses CreateSwapChainForHwnd (surface.go:85) which supports only CompositeAlphaModeOpaque. Per-pixel alpha transparency (rounded windows, tray popups, overlays) requires CompositeAlphaModePremultiplied, which is only available via CreateSwapChainForComposition (DirectComposition).

Confirmed from Rust wgpu (adapter.rs:1071):

SurfaceTarget::WndHandle(_) => vec![wgt::CompositeAlphaMode::Opaque],

Rust wgpu Reference

Rust wgpu already implements DirectComposition in dcomp.rs (~120 LOC):

  1. DCompositionCreateDevice2() from dcomp.dll — create DirectComposition device
  2. CreateTargetForHwnd(hwnd) — bind to window
  3. CreateVisual() — create visual
  4. SetRoot(visual) — set as root
  5. CreateSwapChainForComposition(visual) instead of CreateSwapChainForHwnd(hwnd)

Proposed Implementation

Add alternative surface creation path in hal/dx12/surface.go:

  • If SurfaceConfiguration.AlphaMode == Premultiplied → use DirectComposition path
  • Otherwise → use current HWND path (no change for existing users)

Load dcomp.dll lazily via goffi (same pattern as other Win32 DLLs). ~120-150 LOC.

Impact

  • Enables per-pixel alpha on DX12 (rounded tray popups, overlays, HUDs)
  • No breaking changes — HWND path remains default
  • Triggered by gogpu#361 (@shaolei — DeskCalendar), ADR-060

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions