protonscr

Horizon Zero Dawn Remastered performance regression on descriptor-heap-test branch

vkd3dclosed
HansKristian-Work/vkd3d-proton#2950 · opened 2026-04-19 by veldenb · updated 2026-05-08 · 16 comments · github
Vveldenb 2026-04-19 github

Software information

Horizon Zero Dawn Remastered

System information

  • GPU: RTX 3080
  • Driver: Nvida 595.58.03
  • VKD3D-Proton version: proton-cachyos-10.0-20260320-slr-x86_64_v3 and proton-cachyos-10.0-20260321-slr-x86_64_v3

The performance on the descriptor-heap-test was very good on my system, but after commit https://github.com/HansKristian-Work/vkd3d-proton/commit/97a0c5d0bfb47321f3a1fd52c1709e58feba7290 where code is merged from master the performance regressed pretty badly for some reason. I've swapped different versions of d3d12.dll and d3d12core.dll to find the commit, unfortunately it's a merge commit so it's hard to pinpoint the culprit.

I'm aware of the fact that descriptor-heap-rebase is the main branch now for descriptor-heap and that descriptor-heap-test is mainly a prototype. My main reason for reporting this is to bring attention to possibility that the code from the master branch may cause slow downs:

Image On commit 3864e83d7935a6016d92c025a30362a0992237c0 i get 79 fps Image On commit 97a0c5d0bfb47321f3a1fd52c1709e58feba7290 only 54 fps
Lluz-andre 2026-04-19 github

It's interesting to see that your GPU FPS actually increase (minimally) between those tests, but your CPU FPS decrease a lot, which pinpoints that the bottleneck is there in both cases, but in a more severe way on the second test.

I wonder if this could lift the veil on the other cases where the heaps are not bringing much benefit as expected

Vveldenb 2026-04-19 github

I tried to merge the commits from master manually to redo 97a0c5d step by step for testing, but I run into too much merge conflicts and compile error I'm unable to solve.

Vveldenb 2026-04-19 github

Ok, found it! I managed to compile and cherry-pick through a lot of commits and found the culprit: 357081fe25cfd4e6d9347390618020dc6613d978
When I revert that commit my fps for this benchmark go back up to 79 fps.

Using this patch also works:

Subject: [PATCH] Revert transfer queue
---
Index: libs/vkd3d/device.c
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
--- a/libs/vkd3d/device.c	(revision 97a0c5d0bfb47321f3a1fd52c1709e58feba7290)
+++ b/libs/vkd3d/device.c	(revision be0682e2097ffc366fc627c37888fba8dcd20277)
@@ -3634,8 +3634,9 @@
     if (info->family_index[VKD3D_QUEUE_FAMILY_COMPUTE] == VK_QUEUE_FAMILY_IGNORED)
         info->family_index[VKD3D_QUEUE_FAMILY_COMPUTE] = info->family_index[VKD3D_QUEUE_FAMILY_GRAPHICS];
 
-    info->family_index[VKD3D_QUEUE_FAMILY_TRANSFER] = vkd3d_find_queue(count, queue_properties,
-            VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, VK_QUEUE_TRANSFER_BIT);
+/*    info->family_index[VKD3D_QUEUE_FAMILY_TRANSFER] = vkd3d_find_queue(count, queue_properties,
+            VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, VK_QUEUE_TRANSFER_BIT); */
+    info->family_index[VKD3D_QUEUE_FAMILY_TRANSFER] = info->family_index[VKD3D_QUEUE_FAMILY_COMPUTE];
 
     if (info->family_index[VKD3D_QUEUE_FAMILY_TRANSFER] == VK_QUEUE_FAMILY_IGNORED)
         info->family_index[VKD3D_QUEUE_FAMILY_TRANSFER] = info->family_index[VKD3D_QUEUE_FAMILY_COMPUTE];

edit: Just tested, applying the patch to the descriptor-heap-rebase branch gives me the same performance boost.

HHansKristian-Work maintainer 2026-04-20 github

So using proper transfer queues makes things worse on NVIDIA? That makes literally no sense ...

HHansKristian-Work maintainer 2026-04-20 github

https://github.com/HansKristian-Work/vkd3d-proton/pull/2952 works around it for me.

57 fps without transfer queue on master, 45 fps with transfer queue on master, 59 fps with transfer queue on that PR.

Vveldenb 2026-04-20 github

Hi,

tested your changes, looking good to me (see results below).
Thanks for all the work and the quick patch!

master (54 fps):
Image

master + nv-fence-hack (75 fps):
Image

descriptor-heap-rebase (55 fps):
Image

descriptor-heap-rebase + nv-fence-hack (79 fps):
Image

Vveldenb 2026-04-20 github

For reference, also a benchmark on Windows 11 (same system, dualboot):

Windows 11 (91 fps):
Image

edit: The screenshots show Upscale Quality Balanced/Quality but DLSS ("Upscale method") is off on all benchmarks. So benchmarks are comparable.

Lluz-andre 2026-04-20 github

That benchmark is interesting because we can see that the GPU FPS between heaps and Windows 11 is 1 FPS (or same, within margin of error).
What clearly is pushing the performance back now between Linux and Windows is a CPU bottleneck. 79 FPS vs 91 FPS. We have an improvement right now versus the past delta, but other bottlenecks must exist. (could be at the driver level)

TtinsukE 2026-04-20 github

I wonder if there is some inter-CCD usage impacting the CPU performance, since the 5950X is a dual-CCD CPU. Then OS-specific CPU scheduling could be causing the slower performance on Linux (or more likely: the lack of CPU usage optimization to stick to one CCD on Linux).

@veldenb would it be possible for you to disable one CCD on BIOS/UEFI and compare CPU perf?

Vveldenb 2026-04-20 github

Currently running kernel 7.0 which schedules quite well, no meaningful difference running on a single CCD.

1 CCD descriptor-heap-rebase (56 fps):
Image

1 CCD descriptor-heap-rebase + nv-fence-hack (80 fps):
Image

KKinubi 2026-04-21 github

So I've been following this issue and decided to test it myself, but on another game that gives us a detailed CPU/GPU breakdown, SOTTR.

Kernel: CachyOS 7.0.0
Driver: 595.58.03
Proton: proton-cachyos-10.0-20260409-slr (with it master, heaps-rebase, nv-fence-hack as the 3 vkd3d-proton branches)
GPU: Rtx 5080
CPU: Intel 285k

master
Image
heaps-rebase
Image
nv-fence-hack
Image
master with fsync
Image

So based on these results, there's no difference in CPU perf (or at least it's margin of error) in this game when using NTsync at least.
There's 3 things that could be contributing factors:

  • It's a HZD specific regression (Most likely)
  • AMD cpu's are more susceptible (not likely)
  • NTsync makes a difference (seemingly reduces render perf, but boosts games logic perf)

Sorry for adding noise to this thread, but hopefully extra context can guide some investigation

Vveldenb 2026-04-25 github

@HansKristian-Work after my last testing and before the PR was merged commit 540c3d93516439a8fcf8b0c53b40076d43adc614 was done, unfortunately that commit regressed my test results again. When I revert 540c3d93516439a8fcf8b0c53b40076d43adc614 the speed in my benchmark goes up again to the original (better) performance:

master (60 fps):
Image

master + revert 540c3d93516439a8fcf8b0c53b40076d43adc614 (76 fps):
Image

descriptor-heap-rebase (62 fps):
Image

descriptor-heap-rebase + revert 540c3d93516439a8fcf8b0c53b40076d43adc614 (79 fps):
Image

I don't have permission to re-open this issue. What's best, continuing in this issue or report this as a new issue?

Kkodatarule 2026-04-26 github

Unfortunately this hasn't been fixed by the commit that closed the issue as veldenb reported.

HHansKristian-Work maintainer 2026-04-27 github

Hilarious <_< Reverted that commit on master now.

Vveldenb 2026-04-27 github

Checked it on master, works now 👍

Vveldenb 2026-05-08 github

@HansKristian-Work it looks like nvidia fixed the issue in their latest vulkan beta 595.44.07 driver.
I used descriptor-heap-rebase and reverted 33808c06a74beda8e8149f1b6dd180cc272c1aae and 34cd3983667c1a60cfa1a931341889564b88b3e8. After that I tested 595.44.06 and 595.44.07 to check the fix:

Nvidia vulkan beta 595.44.06 (56 fps):
Image

Nvidia vulkan beta 595.44.07 (81 fps):
Image

So I guess the workaround in VKD3D is not necessary anymore and those commits can be reverted again.