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):
DCompositionCreateDevice2() from dcomp.dll — create DirectComposition device
CreateTargetForHwnd(hwnd) — bind to window
CreateVisual() — create visual
SetRoot(visual) — set as root
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
feat: DX12 DirectComposition path for per-pixel alpha transparency
Problem
DX12 HAL uses
CreateSwapChainForHwnd(surface.go:85) which supports onlyCompositeAlphaModeOpaque. Per-pixel alpha transparency (rounded windows, tray popups, overlays) requiresCompositeAlphaModePremultiplied, which is only available viaCreateSwapChainForComposition(DirectComposition).Confirmed from Rust wgpu (
adapter.rs:1071):Rust wgpu Reference
Rust wgpu already implements DirectComposition in
dcomp.rs(~120 LOC):DCompositionCreateDevice2()fromdcomp.dll— create DirectComposition deviceCreateTargetForHwnd(hwnd)— bind to windowCreateVisual()— create visualSetRoot(visual)— set as rootCreateSwapChainForComposition(visual)instead ofCreateSwapChainForHwnd(hwnd)Proposed Implementation
Add alternative surface creation path in
hal/dx12/surface.go:SurfaceConfiguration.AlphaMode == Premultiplied→ use DirectComposition pathLoad
dcomp.dlllazily via goffi (same pattern as other Win32 DLLs). ~120-150 LOC.Impact