protonscr

DX12 swapchain creation fails on multi-GPU NVIDIA systems (duplicate LUID)

vkd3dopen
HansKristian-Work/vkd3d-proton#2790 · opened 2026-01-10 by Gogonemnem · updated 2026-08-01 · 3 comments · github
GGogonemnem 2026-01-10 github

Describe the issue

DX12 games running via Proton / VKD3D-Proton fail to start on systems with two identical NVIDIA GPUs, crashing during swapchain creation with:

Surface is not supported for presentation
DXGI: CreateSwapChainForHwnd failed
E_INVALIDARG

The Proton log consistently shows:

warn:vkd3d-proton:d3d12_find_physical_device: Multiple adapters found with LUID <same value>

VKD3D-Proton cannot reliably resolve which Vulkan physical device corresponds to the requested D3D12 adapter when multiple identical GPUs share the same LUID. The game is bound to a headless GPUthat cannot present to the X11 surface.

Software information

  • Game: Clair Obscur: Expedition 33 (DX12, Unreal Engine)
  • Proton: Experimental
  • Renderer: DirectX 12 (VKD3D-Proton)
  • Session: X11 (Kubuntu)

System information

  • GPU: 2× NVIDIA GeForce RTX 4070

    • One display-attached
    • One headless
  • Driver: NVIDIA 580.95.5

  • VKD3D-Proton: bundled with Proton Experimental (applicationVersion 3.0.0)

Relevant log excerpt

warn:vkd3d-proton:d3d12_find_physical_device: Multiple adapters found with LUID 03f2
info:vkd3d-proton:dxgi_vk_swap_chain_init: Creating swapchain (2560 x 1440)
err:vkd3d-proton:dxgi_vk_swap_chain_create_surface: Surface is not supported for presentation
DXGI: CreateSwapChainForHwnd failed, hr -2147024809

Workaround

Forcing the Vulkan device and disabling VK_KHR_present_wait fixes the issue:

VKD3D_VULKAN_DEVICE=0 \
VKD3D_DISABLE_EXTENSIONS=VK_KHR_present_wait \
VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json \
%command%

Changing the device index reproduces the crash.

Expected behavior

VKD3D-Proton should select a Vulkan device that supports presentation to the target surface when multiple identical GPUs are present, or fail earlier with a clearer diagnostic.

HHansKristian-Work maintainer 2026-01-11 github

Aliased LUID seems like a bug elsewhere in the system though ...

VkBool32 vkGetPhysicalDeviceWin32PresentationSupportKHR(
    VkPhysicalDevice                            physicalDevice,
    uint32_t                                    queueFamilyIndex);

Only thing I can think of is to try calling this if there are duplicates and hope for the best.

Ddoitsujin maintainer 2026-01-11 github

The real question is why there are two GPUs using the same LUID, the entire point of LUIDs is to be unique so that we (and D3D12 apps, for that matter) can use them to correlate D3D12/Vulkan devices with DXGI adapters.

JJimJafar 2026-07-30 github

My system has:

1 x 5070 Ti (the one I want to use for Proton)
2 x 5060 Ti (these are triggerin this error)

I am unable to select the 5070 using DXVK_FILTER_DEVICE_NAME=5070 %command% because of this.

I found a workaround:

On multi-GPU Linux you can pick the render GPU (mesa device-select layer) but presenting is bound to the compositor's GPU — so you also need gamescope to own the the presentation.

Fix:

  1. sudo pacman -S vulkan-mesa-device-select lib32-vulkan-mesa-device-select
  2. Get your GPU's vendorID:deviceID: vulkaninfo --summary | grep -E 'deviceName|deviceID'
  3. Steam launch options (use your ID + desktop resolution):
    MESA_VK_DEVICE_SELECT=10de:XXXX gamescope -W 2560 -H 1440 -r 60 --prefer-vk-device 10de:XXXX -- %command%