VKD3D-Proton v2.14 is now available bringing various improvements to the Direct3D 12 to Vulkan layer that's used by Valve's Proton for running Windows games on Linux.
This is used directly by Proton so you don't need to do anything yourself for it on Steam Deck / Desktop Linux. Proton Experimental usually pulls in changes from it quite regularly, as does GE-Proton.
For new features there's a DXGI frame statistics implementation, a new global frame rate limiter, support for planar video formats like NV12, improved support for DLSS3 frame generation via dxvk-nvapi and a number of performance improvements included.
A bunch of game-specific improvements too for the likes of World of Warcraft, Final Fantasy XVI, Dragon Age: Veilguard, Helldivers 2, Star Wars: Outlaws, The First Descendant, Skull & Bones, Hunt: Showdown, Red Dead Redemption and others.
Pictured - The First Descendant
Full changelog, click me
Features
- Implement DXGI frame statistics (exposed by DXVK DXGI).
- Implement a global frame rate limiter (see
VKD3D_FRAME_RATE
orDXVK_FRAME_RATE
).
Also improves behavior of presentation with swap interval > 1 since we use frame limiter instead
of duplicated presents now. Also allows support for full-screen frame rate targets in DXGI which normally would imply a mode change. - Implement support for planar video formats such as NV12.
- Implement D24 depth bias correctly now on AMD when
VK_EXT_depth_bias_control
is supported. - Expose a new command interop interface that allows e.g. dxvk-nvapi to implement DLSS3 frame generation.
- Use VK_KHR_compute_shader_derivatives when available.
- Use VK_EXT_device_generated_commands when available. Expose execute indirect tier 1.1.
- Implement GPU upload heap from latest AgilitySDKs. Allows explicit control over ReBAR instead of heuristic based hacks in games that use the new API.
- Implement ID3DDestructionNotifier. Fixes some particular games that expect this to be supported.
Performance
- Reduce some VRAM bloat on RDNA2 and 3 GPUs when
VK_MESA_image_alignment_control
is exposed. - Improve CPU overhead for games that query swapchain format support over and over.
- Remove old heuristic that preferred 2 frames of latency depending on BufferCount used.
The default on DXGI is 3, and using 2 caused some performance issues in various games with GPU starvation,
especially on Deck.VKD3D_SWAPCHAIN_LATENCY_FRAMES
is still available as an override to force a tighter default. - Rewrite queue submission logic to deal better with difficult submission patterns such as FSR3 3.1 Frame Generation.
On implementations with only one graphics queue, vkd3d-proton will now attempt to do basic software scheduling of GPU work.
This may regress GPU performance in some other cases andVKD3D_CONFIG=no_staggered_submit
is a way to disable this code path.
One particularly big improvement is FF XVI on RADV with FSR 3 frame-gen, with almost doubled performance in some cases.
We are still awaiting a proper kernel-level fix for this problem to be fully resolved. - Rewrite queue submission logic to use fewer "dummy" wait/signal submissions.
Works around pathological CPU overhead in amdgpu taking 20ms+ to submit work in some cases. - Rewrite queue submission logic for sparse updates to be more efficient.
Fixes and workarounds
- Rework various multi-sampling queries to be more spec correct.
- Workaround bugged MSAA behavior in World of Warcraft.
- Workaround buggy/questionable use of ID3D12PipelineLibrary in FF XVI.
- Always use native 16-bit integers for min16int. Fixes some real-world bugs where shaders expect min16int is always implemented as 16-bit.
- Workaround game bug leading to GPU hang in Dragon Age: Veilguard on RADV.
- Always emit proper floating-point environment modes in DXBC shaders. Fixes glitched eyes in Dragon Age: Veilguard on NV.
- Fix potential use-after-free bug for some sparse resource update cases.
- Correctly validate when application attempts to allocate a too large descriptor heap.
Fixes Stalker 2 entering into undefined behavior. - A lot of misc fixes in dxil-spirv as usual.
- Workaround broken amdgpu zerovram behavior on 6.10+ kernels. Fixes random extreme glitchiness in Helldivers 2 on AMD.
- Workaround NV issue which lead to GPU hang when loading a save file in Star Wars: Outlaws.
- Fix copying between BC <-> RGBA images in some cases.
- Add workaround for a game bug in The First Descendant which lead to broken cubemap reflections in some cases.
- Workaround Skull & Bones crashing on startup on NV GPUs by disabling Reflex support.
- Workaround Hunt: Showdown missing precise qualifiers on vertex shaders, leading to glitched rendering.
- Workaround poor CPU performance in Red Dead Redemption.
Misc / Debug
- Add support for instruction_qa_checks. For deep debug, allows us to be notified when NaNs and Infs are generated in shaders.
For internal QA use. - Add fine-grained control of QA behavior on a per-shader basis. For narrowing down issues.
- Remove a bunch of old and obsolete workarounds for NV drivers. New cutoff is 535 series.
- Bump exposed SDKVersion to 614 to match latest stable AgilitySDK.
- Add an optional code path to support DXBC via the official dxilconv library.
This code is not enabled in release builds,
and is currently only intended as a path to take advantage of QA instrumentation for DXBC shaders.
See all the improvements in the changelog.
Is there a way to set
DXVK_FRAME_RATE
for everything everywhere all at once or have do I have to set the argument for every single game?
Quoting: TevurGreat!
Is there a way to setDXVK_FRAME_RATE
for everything everywhere all at once or have do I have to set the argument for every single game?
Assuming that's just your standard environment variable. Yeah, just set it in your shell's init config files.
For bash, personally, I would put it in: ~/.bash_aliases:
#DXVK FRAME RATE
export DXVK_FRAME_RATE='WHATEVERITSUPPOSEDTOBE'
You will need to log out and log back in for your whole environment to inherit that.
Last edited by rhavenn on 13 December 2024 at 4:33 pm UTC
Quoting: rhavennQuoting: TevurGreat!
Is there a way to setDXVK_FRAME_RATE
for everything everywhere all at once or have do I have to set the argument for every single game?
Assuming that's just your standard environment variable. Yeah, just set it in your shell's init config files.
For bash, personally, I would put it in: ~/.bash_aliases:
#DXVK FRAME RATE
export DXVK_FRAME_RATE='WHATEVERITSUPPOSEDTOBE'
You will need to log out and log back in for your whole environment to inherit that.
This won't work if running apps from a GUI, as they don't try to initialize your shell. You need to modify `/etc/environment` instead (which must be done as root/sudo).
Last edited by Calinou on 13 December 2024 at 6:58 pm UTC
Quoting: CalinouQuoting: rhavennQuoting: TevurGreat!
Is there a way to setDXVK_FRAME_RATE
for everything everywhere all at once or have do I have to set the argument for every single game?
Assuming that's just your standard environment variable. Yeah, just set it in your shell's init config files.
For bash, personally, I would put it in: ~/.bash_aliases:
#DXVK FRAME RATE
export DXVK_FRAME_RATE='WHATEVERITSUPPOSEDTOBE'
You will need to log out and log back in for your whole environment to inherit that.
This won't work if running apps from a GUI, as they don't try to initialize your shell. You need to modify `/etc/environment` instead (which must be done as root/sudo).
That is not totally accurate. Really, it depends on your system I guess and what you're running and how it's configured. However, in general, you should never "have" to edit a file as root for a user level environment var.
/etc/environment is the systemd environment config and it seems Wayland and GDM / KDE PLasma source it as well. So, you should be able to source that in: ~/.config/environment.d/envvars.conf for the user level version.
SDDM and some other greeters also might source your shell vars. I set "export SDL_VIDEODRIVER=wayland" in my bash and it's picked up by Steam and Steam apps. So, your mileage may vary I guess.
see: https://wiki.archlinux.org/title/Environment_variables This should be more or less applicable to any distro.
Quoting: rhavennFor bash, personally, I would put it in: ~/.bash_aliases:Sure you got that right? At least on my system, .bash_aliases is just sourced by .bashrc and is only meant as a convenience to separate out aliases. Seems like a roundabout way for setting environment variables.
Last edited by whizse on 13 December 2024 at 10:06 pm UTC
See more from me