protonscr

VK_ERROR_DEVICE_LOST (Xid 31 error) - Senua's saga: Hellblade 2 (UE 5) - descriptor-heap-rebase branch

vkd3dclosed
HansKristian-Work/vkd3d-proton#2981 · opened 2026-05-03 by veldenb · updated 2026-07-06 · 13 comments · github
Vveldenb 2026-05-03 github

Running Senua's saga: Hellblade 2 freezes after a while when using the descriptor-heap-rebase branch. Sound continues but the image is frozen. The issue can be triggered in a quicker way by starting the game, go to Settings -> Graphics and then ALT+TAB to another window and back. It triggers the error right away.

Dmesg shows a XID 31 error and VKD3D logs it has lost the device.
This issue seems similar to https://github.com/HansKristian-Work/vkd3d-proton/issues/2979 but the dmesg shows a different MMU Fault:
ENGINE GRAPHICS HUBCLIENT_FE faulted vs ENGINE GRAPHICS GPC2 GPCCLIENT_GCC faulted.

The interesting thing is that turning heaps off with VKD3D_CONFIG="" doesn't resolve the issue. I tried the following:

master:                                                 no issues
descriptor-heap-rebase VKD3D_CONFIG="" :                no issues
descriptor-heap-rebase VKD3D_CONFIG="descriptor_heap" : freezes
descriptor-heap-test:                                   no issues

Software information

Senua's saga: Hellblade 2 (Unreal Engine 5)

System information

  • GPU: RTX 3080
  • Driver: Nvidia Vulkan Beta 595.44.06
  • VKD3D-Proton version: proton-cachyos-11.0-20260428-slr-x86_64_v3
  • VKD3D version: latest descriptor-heap-rebase branch

Log files

proton log:

3200.695:0170:02b4:info:vkd3d-proton:vkd3d_pipeline_library_disk_thread_main: Pipeline cache marked dirty. Flush is scheduled.
3201.761:0170:02b4:info:vkd3d-proton:vkd3d_pipeline_library_disk_thread_main: Flushing disk cache (wakeup counter since last flush = 34). It seems like application has stopped creating new PSOs for the time being.
3210.994:0170:02c8:err:vkd3d-proton:vkd3d_wait_for_gpu_timeline_semaphore: Failed to wait for Vulkan timeline semaphore, vr -4.
3210.994:0170:0338:err:vkd3d-proton:dxgi_vk_swap_chain_wait_semaphore: Failed to wait for present semaphore, vr -4.
3210.994:0170:02c8:warn:vkd3d-proton:d3d12_device_mark_as_removed: Device 0000000045510080 is lost (reason 0x887a0005, "VK_ERROR_DEVICE_LOST").
3210.994:0170:0338:err:vkd3d-proton:dxgi_vk_swap_chain_wait_semaphore: Failed to wait for present semaphore, vr -4.
3210.994:0170:02c8:err:vkd3d-proton:vkd3d_wait_for_gpu_timeline_semaphore: Failed to wait for Vulkan timeline semaphore, vr -4.

More here: steam-2461850-xid-31-error.log

dmesg:

NVRM: Xid (PCI:0000:0b:00): 31, pid=123947, name=GameThread, channel 0x00000042, intr 00000000. MMU Fault: ENGINE GRAPHICS GPC2 GPCCLIENT_GCC faulted @ 0x0_00000000. Fault is of type FAULT_PDE ACCESS_TYPE_VIRT_READ
HHansKristian-Work maintainer 2026-05-04 github

You should be able to bisect down which commit causes the failure in this case.

Vveldenb 2026-05-04 github

There was an error in my test earlier, descriptor-heap-rebase VKD3D_CONFIG="" doesn't result in a freeze, I updated the OP.
I tried reverting commits on descriptor-heap-rebase but at some point the code becomes more unstable resulting in other errors.

Is there a way to get more debug info or get a stack trace or something? I'm a back-end web developer so this code is all a bit alien for me when I create a diff from different branches.

edit: I think I found out, here is a log from a debug build with breadcrumbs enabled: steam-2461850.log

HHansKristian-Work maintainer 2026-05-05 github

I cannot reproduce this on same driver with RTX 4070 using descriptor heap. Tried using normal Proton Experimental with descriptor heap vkd3d-proton replaced?

Vveldenb 2026-05-05 github

A run with Proton Experimental, same error: steam-2461850.log
You may have to ALT+TAB a few times on the graphics settings screen, on mine it usually freezes on the first one.

nvidia-smi:

+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 595.44.06              Driver Version: 595.44.06      CUDA Version: 13.2     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 3080        Off |   00000000:0B:00.0  On |                  N/A |
|  0%   41C    P8             21W /  320W |    1878MiB /  10240MiB |     23%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
Vveldenb 2026-05-05 github

The previous one was on Gnome, same issue on KDE. On KDE I don't even have to ALT+TAB, it just freezes there after being in the Graphics screen for a few seconds: steam-2461850-kde.log
UE5 gives a prompt after 2 minutes of being frozen that it has lost it's render thread and will close the application.

If you need more info I can add patches to the build or compile it with different flags.

Vveldenb 2026-05-08 github

I tried the new nvidia vulkan beta 595.44.07 driver today, same issue. I discovered that the Black Myth: Wukong Benchmark Tool gives me exactly the same error when starting the benchmark. It freezes without using ALT+TAB and sound continues in the background.

edit: proton log with debug and breadcrumbs for Black Myth Wukong: steam-3132990.zip

edit 2: Black Myth Wukong only freezes when one of these settings are enabled (the rest can be set to very high):

  • DLSS on: freeze
  • anti-aliasing quality "very high": freeze ("high" works without freeze)
Vveldenb 2026-05-16 github

Issue persists on nvidia vulkan beta 595.44.08

Vveldenb 2026-05-17 github

@HansKristian-Work I think I found out why the issue is not reproducible on your side. I've been trying to debug the issue with claude code, and it helped me debugging and creating a patch for checking the amount of embedded samplers created.

From what I understand embedded samplers have a limit and on Ampere (my card is a RTX 3080) this limit is 2032, but on other cards like a RTX 4070 (Ada Lovelace) this limit seems to be higher, so on those cards the issue is not reproducible.
Not all games use a large amounts of these samplers, but I found a few that that do:

  • Senua's saga: Hellblade 2 (ALT+TAB on settings screen triggers freeze faster)
  • Black Myth Wukong: Benchmark tool (always freezes on benchmark start with all settings on Very High)
  • Hogwarts legacy (freezes in shader building screen on start)

They all exhibit the following behavior when I build with the descriptor-heap-rebase branch with the attached patch.
A lot of embedded samplers:

$ grep account_embedded_samplers steam-*.log 
12037.878:0164:047c:warn:vkd3d-proton:d3d12_device_account_embedded_samplers: VK_EXT_descriptor_heap embedded-sampler usage at 50% of budget (1016 of 2032; +1 this pipeline) [compute pipeline].
12038.167:0164:01c4:warn:vkd3d-proton:d3d12_device_account_embedded_samplers: VK_EXT_descriptor_heap embedded-sampler usage at 75% of budget (1528 of 2032; +6 this pipeline) [compute pipeline].
12038.289:0164:01e4:warn:vkd3d-proton:d3d12_device_account_embedded_samplers: VK_EXT_descriptor_heap embedded-sampler usage at 90% of budget (1834 of 2032; +6 this pipeline) [graphics pipeline].
12038.349:0164:0188:err:vkd3d-proton:d3d12_device_account_embedded_samplers: VK_EXT_descriptor_heap embedded-sampler usage at 100% of budget (2032 of 2032; +6 this pipeline) [graphics pipeline].  Past 100% NVIDIA drivers are known to silently produce malformed pipelines that fault on first draw (XID 31, MMU FAULT_PDE @ VA 0).
12038.404:0164:01c0:err:vkd3d-proton:d3d12_device_account_embedded_samplers: VK_EXT_descriptor_heap embedded-sampler usage at 110% of budget (2236 of 2032; +6 this pipeline) [graphics pipeline].  Past 100% NVIDIA drivers are known to silently produce malformed pipelines that fault on first draw (XID 31, MMU FAULT_PDE @ VA 0).
12066.836:0164:0190:err:vkd3d-proton:d3d12_device_account_embedded_samplers: VK_EXT_descriptor_heap embedded-sampler usage at 125% of budget (2542 of 2032; +6 this pipeline) [compute pipeline].  Past 100% NVIDIA drivers are known to silently produce malformed pipelines that fault on first draw (XID 31, MMU FAULT_PDE @ VA 0).

Usually quite soon after that the Xid 31 error appears in dmesg:

[zo 17 mei 21:33:35 2026] NVRM: Xid (PCI:0000:0b:00): 31, pid=88975, name=GameThread, channel 0x00000034, intr 00000000. MMU Fault: ENGINE GRAPHICS GPC2 GPCCLIENT_GCC faulted @ 0x8_00002000. Fault is of type FAULT_PDE ACCESS_TYPE_VIRT_READ

And the image of the game freezes and sound continues for a while. UE5 displays a popup after a while that the render thread is frozen.

Other games that do not freeze with XID 31 also don't display the embedded sampler warning.

My knowledge of this only goes so far, but because I only get the messages in games that actually crash I think there is indeed an issue there.
Below I attached the patch and some extra logs.

Diagnostic patch
From: vkd3d-proton contributor <[email protected]>
Date: Sun, 17 May 2026 19:10:00 +0200
Subject: [PATCH] vkd3d: Track and report VK_EXT_descriptor_heap embedded
 sampler budget usage.

The Vulkan VK_EXT_descriptor_heap extension imposes a per-device cap on
the total number of pEmbeddedSampler references that may be attached to
pipelines created via VK_PIPELINE_CREATE_2_DESCRIPTOR_HEAP_BIT_EXT, via
VkPhysicalDeviceDescriptorHeapPropertiesEXT::maxDescriptorHeapEmbeddedSamplers.

In practice this budget is small on some hardware (NVIDIA Ampere = 2032)
and very large on others.  UE5 + Streamline titles (Hellblade 2 confirmed,
appid 2461850) compile enough pipeline permutations during Settings ->
Graphics to push the cumulative count past the budget on Ampere.  Past
that point, the NVIDIA proprietary driver returns VK_SUCCESS from
vkCreate{Graphics,Compute}Pipelines but produces malformed pipelines whose
first draw faults at VA 0 (XID 31, FAULT_PDE ACCESS_TYPE_VIRT_READ on
GPC1/GPCCLIENT_GCC), losing the device.  The same workload runs cleanly on
Ada (RTX 40-series) which advertises a much larger budget.

This change is diagnostics-only: add a per-device cumulative counter of
pEmbeddedSampler references seen at every VK_PIPELINE_CREATE_2_
DESCRIPTOR_HEAP_BIT_EXT pipeline creation, and emit one log line per
threshold crossing (50% / 75% / 90% / 100% / 110% / 125% of the budget).
That makes it possible to confirm from a single PROTON_LOG whether a
crash was preceded by exhaustion of this budget, without imposing any
runtime behaviour change for unaffected workloads.

Hooked at: compute / graphics / linked graphics pipeline creates
(state.c), ray-tracing pipeline creates (raytracing_pipeline.c) and
work-graph pipeline creates (workgraphs.c).  The accounting helper walks
the mapping pNext chain itself, so call sites pass either the mapping
struct directly or a stage's pNext chain.
---
 libs/vkd3d/device.c              | 94 ++++++++++++++++++++++++++++++++
 libs/vkd3d/raytracing_pipeline.c |  7 +++
 libs/vkd3d/state.c               |  9 +++
 libs/vkd3d/vkd3d_private.h       | 13 +++++
 libs/vkd3d/workgraphs.c          |  4 ++
 5 files changed, 127 insertions(+)

diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index d514f6d0..5829229e 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -9547,6 +9547,100 @@ uint32_t d3d12_device_get_max_descriptor_heap_size(struct d3d12_device *device,
     }
 }

+static uint32_t d3d12_device_count_embedded_samplers(
+        const VkShaderDescriptorSetAndBindingMappingInfoEXT *info)
+{
+    uint32_t i, count = 0;
+
+    if (!info)
+        return 0;
+
+    for (i = 0; i < info->mappingCount; ++i)
+    {
+        const VkDescriptorSetAndBindingMappingEXT *mapping = &info->pMappings[i];
+
+        switch (mapping->source)
+        {
+            case VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_CONSTANT_OFFSET_EXT:
+                if (mapping->sourceData.constantOffset.pEmbeddedSampler)
+                    ++count;
+                break;
+            case VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_PUSH_INDEX_EXT:
+                if (mapping->sourceData.pushIndex.pEmbeddedSampler)
+                    ++count;
+                break;
+            default:
+                break;
+        }
+    }
+
+    return count;
+}
+
+void d3d12_device_account_embedded_samplers(struct d3d12_device *device,
+        const void *mapping_info_pnext_chain,
+        const char *kind)
+{
+    /* Thresholds (percent of budget) at which we emit a one-shot log message. */
+    static const uint32_t thresholds_percent[] = { 50, 75, 90, 100, 110, 125 };
+    const VkShaderDescriptorSetAndBindingMappingInfoEXT *mapping_info = NULL;
+    const VkBaseInStructure *pnext;
+    uint32_t budget, added, total, idx, observed;
+
+    if (!device->vk_info.EXT_descriptor_heap)
+        return;
+
+    budget = device->device_info.descriptor_heap_properties.maxDescriptorHeapEmbeddedSamplers;
+    if (!budget)
+        return;
+
+    for (pnext = mapping_info_pnext_chain; pnext; pnext = pnext->pNext)
+    {
+        if (pnext->sType == VK_STRUCTURE_TYPE_SHADER_DESCRIPTOR_SET_AND_BINDING_MAPPING_INFO_EXT)
+        {
+            mapping_info = (const VkShaderDescriptorSetAndBindingMappingInfoEXT *)pnext;
+            break;
+        }
+    }
+
+    added = d3d12_device_count_embedded_samplers(mapping_info);
+    if (!added)
+        return;
+
+    total = vkd3d_atomic_uint32_add(&device->embedded_sampler_total, added,
+            vkd3d_memory_order_acq_rel);
+
+    for (;;)
+    {
+        idx = vkd3d_atomic_uint32_load_explicit(&device->embedded_sampler_threshold_idx,
+                vkd3d_memory_order_acquire);
+        if (idx >= ARRAY_SIZE(thresholds_percent))
+            return;
+        if ((uint64_t)total * 100u < (uint64_t)budget * thresholds_percent[idx])
+            return;
+
+        observed = vkd3d_atomic_uint32_compare_exchange(&device->embedded_sampler_threshold_idx,
+                idx, idx + 1u, vkd3d_memory_order_acq_rel, vkd3d_memory_order_acquire);
+        if (observed != idx)
+            continue;
+
+        if (thresholds_percent[idx] < 100u)
+        {
+            WARN("VK_EXT_descriptor_heap embedded-sampler usage at %u%% of budget "
+                    "(%u of %u; +%u this pipeline) [%s].\n",
+                    thresholds_percent[idx], total, budget, added, kind ? kind : "?");
+        }
+        else
+        {
+            ERR("VK_EXT_descriptor_heap embedded-sampler usage at %u%% of budget "
+                    "(%u of %u; +%u this pipeline) [%s].  Past 100%% NVIDIA drivers are "
+                    "known to silently produce malformed pipelines that fault on first "
+                    "draw (XID 31, MMU FAULT_PDE @ VA 0).\n",
+                    thresholds_percent[idx], total, budget, added, kind ? kind : "?");
+        }
+    }
+}
+
 static bool d3d12_device_supports_16bit_shader_ops(struct d3d12_device *device)
 {
     return device->device_info.vulkan_1_2_features.shaderFloat16 &&
diff --git a/libs/vkd3d/raytracing_pipeline.c b/libs/vkd3d/raytracing_pipeline.c
index 2559d356..f93721ba 100644
--- a/libs/vkd3d/raytracing_pipeline.c
+++ b/libs/vkd3d/raytracing_pipeline.c
@@ -2591,6 +2591,13 @@ static HRESULT d3d12_state_object_compile_pipeline_variant(struct d3d12_rt_state
             VK_NULL_HANDLE, 1, &pipeline_create_info, NULL,
             creating_library ? &variant->pipeline_library : &variant->pipeline));

+    if (vr == VK_SUCCESS && d3d12_device_use_descriptor_heap(object->device))
+    {
+        for (i = 0; i < pipeline_create_info.stageCount; ++i)
+            d3d12_device_account_embedded_samplers(object->device,
+                    pipeline_create_info.pStages[i].pNext, "ray-tracing pipeline");
+    }
+
     if (vr == VK_SUCCESS && (object->flags & D3D12_STATE_OBJECT_FLAG_ALLOW_STATE_OBJECT_ADDITIONS) &&
             object->type == D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE)
     {
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index 13dd23b7..31bbc2e6 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -3536,6 +3536,9 @@ static HRESULT vkd3d_create_compute_pipeline(struct d3d12_pipeline_state *state,
     vr = VK_CALL(vkCreateComputePipelines(device->vk_device,
             vk_cache, 1, &pipeline_info, NULL, &state->compute.vk_pipeline));

+    if (vr == VK_SUCCESS && d3d12_device_use_descriptor_heap(device))
+        d3d12_device_account_embedded_samplers(device, &state->root_signature->heap.mapping_info, "compute pipeline");
+
     if (vkd3d_queue_timeline_trace_cookie_is_valid(cookie))
     {
         const char *kind;
@@ -6746,6 +6749,9 @@ static VkResult d3d12_pipeline_state_link_pipeline_variant(struct d3d12_pipeline
     vr = VK_CALL(vkCreateGraphicsPipelines(state->device->vk_device,
             vk_cache, 1, &create_info, NULL, vk_pipeline));

+    if (vr == VK_SUCCESS && d3d12_device_use_descriptor_heap(state->device))
+        d3d12_device_account_embedded_samplers(state->device, &state->root_signature->heap.mapping_info, "graphics pipeline (linked)");
+
     if (vkd3d_queue_timeline_trace_cookie_is_valid(cookie))
     {
         const char *kind = vr == VK_SUCCESS ? "LINK OK" : "LINK ERR";
@@ -6963,6 +6969,9 @@ VkPipeline d3d12_pipeline_state_create_pipeline_variant(struct d3d12_pipeline_st

     vr = VK_CALL(vkCreateGraphicsPipelines(device->vk_device, vk_cache, 1, &pipeline_desc, NULL, &vk_pipeline));

+    if (vr == VK_SUCCESS && d3d12_device_use_descriptor_heap(device))
+        d3d12_device_account_embedded_samplers(device, &state->root_signature->heap.mapping_info, "graphics pipeline");
+
     if (vkd3d_queue_timeline_trace_cookie_is_valid(cookie))
     {
         const char *kind;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index bd9be513..4f1647a4 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -5811,6 +5811,15 @@ struct d3d12_device
     struct vkd3d_device_swapchain_info swapchain_info;
     struct vkd3d_device_frame_markers frame_markers;

+    /* Cumulative count of pEmbeddedSampler references attached to
+     * VK_PIPELINE_CREATE_2_DESCRIPTOR_HEAP_BIT_EXT pipelines created on this
+     * device, used to detect when we approach
+     * descriptor_heap_properties.maxDescriptorHeapEmbeddedSamplers (the budget
+     * past which NV drivers are known to produce malformed pipelines that
+     * fault at VA 0 on first draw). Diagnostics only. */
+    uint32_t embedded_sampler_total;
+    uint32_t embedded_sampler_threshold_idx;
+
     struct
     {
         struct vkd3d_shader_quirk_info quirks;
@@ -5855,6 +5864,10 @@ VkPipeline d3d12_device_get_or_create_fragment_output_pipeline(struct d3d12_devi

 uint32_t d3d12_device_get_max_descriptor_heap_size(struct d3d12_device *device, D3D12_DESCRIPTOR_HEAP_TYPE heap_type);

+void d3d12_device_account_embedded_samplers(struct d3d12_device *device,
+        const void *mapping_info_pnext_chain,
+        const char *kind);
+
 static inline struct d3d12_device *unsafe_impl_from_ID3D12Device(d3d12_device_iface *iface)
 {
     return CONTAINING_RECORD(iface, struct d3d12_device, ID3D12Device_iface);
diff --git a/libs/vkd3d/workgraphs.c b/libs/vkd3d/workgraphs.c
index ae23737b..de927015 100644
--- a/libs/vkd3d/workgraphs.c
+++ b/libs/vkd3d/workgraphs.c
@@ -1918,6 +1918,7 @@ static HRESULT d3d12_wg_state_object_compile_pipeline(
             ERR("Failed to create pipeline, vr %d\n", vr);
             return hresult_from_vk_result(vr);
         }
+        d3d12_device_account_embedded_samplers(object->device, pipeline_info.stage.pNext, "work-graph pipeline");
     }

     /* CPU node entry, multiple payloads. */
@@ -1939,6 +1940,7 @@ static HRESULT d3d12_wg_state_object_compile_pipeline(
         ERR("Failed to create pipeline, vr %d\n", vr);
         return hresult_from_vk_result(vr);
     }
+    d3d12_device_account_embedded_samplers(object->device, pipeline_info.stage.pNext, "work-graph pipeline");

     /* GPU entry */
     tmp->spec_data[spec_constant_index + SPEC_IS_INDIRECT_BDA_STRIDE] = 1;
@@ -1959,6 +1961,7 @@ static HRESULT d3d12_wg_state_object_compile_pipeline(
         ERR("Failed to create pipeline, vr %d\n", vr);
         return hresult_from_vk_result(vr);
     }
+    d3d12_device_account_embedded_samplers(object->device, pipeline_info.stage.pNext, "work-graph pipeline");

     /* Non-entry node */
     tmp->spec_data[spec_constant_index + SPEC_IS_ENTRY_POINT] = 0;
@@ -1979,6 +1982,7 @@ static HRESULT d3d12_wg_state_object_compile_pipeline(
         ERR("Failed to create pipeline, vr %d\n", vr);
         return hresult_from_vk_result(vr);
     }
+    d3d12_device_account_embedded_samplers(object->device, pipeline_info.stage.pNext, "work-graph pipeline");

     assert(spec_constant_index + (is_broadcast ? SPEC_COUNT_BROADCAST : SPEC_COUNT_NON_BROADCAST) == tmp->spec_data_count);


--
2.46.0

Black Myth Wukong log: BMWK-steam-3132990.zip
Hellblade 2 log: HB2-steam-2461850.zip
Hogwarts legacy log: HWL-steam-990080.zip
Diagnostic patch (as file): 0001-vkd3d-instrument-embedded-sampler-budget.patch

Vveldenb 2026-06-02 github

I've managed to build proton-cachyos with debug symbols and created a gdb trace when Hellblade2 freezes with the Xid 31:

Hellblade2 Xid 31 gdb trace.txt

Rrlocatti-nv 2026-06-13 github

Hello. As mentioned in https://github.com/HansKristian-Work/vkd3d-proton/issues/3077#issuecomment-4697395553, this bug has been root-caused and a fix will be included in a future driver release.

I tested S.T.A.L.K.E.R. 2, Black Myth Wukong, and Arc Raiders (Unreal Engine games) that fail in a similar way, but I didn't test Hellblade 2 in particular. Still, I believe this should work with the same fix.

Thanks for reporting and debugging this bug!

Vveldenb 2026-06-20 github

I can confirm the issues are resolved on the nvidia 595.84 driver

Vveldenb 2026-06-21 github

I mixed up the 595 production and vulkan beta branch, reopening for now until there is a new vulkan beta or 610 branch driver.

Vveldenb 2026-07-06 github

Issue is fixed for me on the Nvidia Vulkan Beta 595.44.11. I'll follow https://github.com/HansKristian-Work/vkd3d-proton/issues/3077 for the 610 driver, hopefully it'll land there soon.

Proton versions

Launch options

Upstream links

Error codes