dxvk.conf Options Guide - Digger1955/dxvk-gplasync-lowlatency GitHub Wiki
dxvk.conf
Options Guide
This guide aims to highlight the most frequently needed and most useful options available for configuration in dxvk.conf
to customize DXVK for the needs of a specific end user and to provide the recommendations to achieve the best possible performance without significantly reducing image quality. Both upstream DXVK and DXVK-GPALL options are presented here. If the option is not mentioned in this guide, then usually there is no need to change it, but still all options and their respective descriptions are specified in dxvk.conf
. DXVK HUD options are specified in README.md.
DXVK-GPLALL Options
GPLAsync Options
dxvk.enableAsync
Originally started as hacky solution for shader compilation stutter in DXVK. Similar solution was later added to dxvk itself and promptly removed. This option allows to enable or disable that solution. Enabling this solution results in a lot less shader compilation stuttering by not blocking the main thread when compiling async pipelines and (not necessarily) miscellaneous graphical issues while shaders are compiling for the first time.
Default value: dxvk.enableAsync = True
Supported values: True
, False
Recommended value: dxvk.enableAsync = True
dxvk.gplAsyncCache
(DXVK 2.6.x only)
This option enables or disables fixes for DXVK state cache that allow to use both Async and GPL together or separately. It is always useful for Async and it can be useful for GPL depending on game.
Default value: dxvk.gplAsyncCache = True
Supported values: True
, False
Recommended value: dxvk.gplAsyncCache = True
Low Latency Frame Pacing Options
dxvk.framePace
Frame pacing mode managing CPU-GPU synchronization.
-
"max-frame-latency"
provides stable latency in the GPU-limit as long as GPU render times are stable. Latency generally is higher but offers great visual smoothness."max-frame-latency"
is the behaviour of upstream dxvk. Framei
won't start as long as frame(i-1)-x
isn't finished, wherex
is the value ofdxgi.maxFrameLatency
/d3d9.maxFrameLatency
. This pacing usually looks smooth, but has latency issues when GPU bound. Optimized for highest fps. -
"min-latency"
possibly provides the lowest latency (low-latency can be quicker in some situations), and offers less fps in the GPU-limit due to stalling the GPU between frames. Generally not recommended, but helpful to get insights to fine-tune the low-latency mode and possibly is useful for running games in the CPU-limit."min-latency"
is essential likemax-frame-latency-0
(not selectable for the mode above), which means the start of a frame will wait until the previous one is finished. CPU/GPU no longer overlap during the transition from one frame to another and thus a lot of fps are sacrificed for prioritizing low latency. This mode is generally not recommended, but might be useful to get insights. -
"low-latency"
provides lower latency in the GPU-limit and can be fine-tuned viadxvk.lowLatencyOffset
anddxvk.lowLatencyAllowCpuFramesOverlap
."low-latency"
is the default mode: It combines high fps throughput with excellent game responsiveness and low input lag. Looking at a scale of a few seconds, pacing is usually more accurate in time thanmax-frame-latency
since latency variations are minimized, especially when moving in and out of the GPU limit and when GPU frametimes vary a lot while being GPU bound. Looking at the pacing frame by frame, this mode relies on the game providing stable frame times for smoothness. When the game generates occasional stutters, these are filtered out nicely such that they don't interfere with the presentation of the other frames. -
"low-latency-vrr-x"
is a special option, which requires to specify display refresh rate, instead ofx
. For example, if user has 360 Hz VRR display, then option must be"low-latency-vrr-360"
. Important: Care has to be taken that the system is configured such that the display is indeed using a variable refresh rate, otherwise this mode won't work properly."low-latency-vrr-x"
enhances the"low-latency"
mode by taking v-blank information into account, which prevents additional v-sync buffering latency. This mode automatically enables v-sync to get informed when v-blanks are happening. It will make the pacer predict future v-blanks based on the given refresh rate ofx
Hz. Replacex
with the refresh rate of your monitor. This mode works with x11-flip and native Wayland (can be enabled in Wine viaDISPLAY=
), but cannot work on Xwayland because v-blank information is not available there (tested on Nvidia).
"low/min-latency"
also supports its own fps-limiting enabled via common variables.
Default value: dxvk.framePace = "low-latency"
Supported values: "max-frame-latency"
, "min-latency"
, "low-latency"
and "low-latency-vrr-x"
, where x
is VRR display refresh rate.
Recommended value: dxvk.framePace = "low-latency"
Observations from Digger1955's own testing:
-
Maximum performance difference between
"max-frame-latency"
and"low-latency"
modes is negligible (less than 1% of Max FPS and Avg FPS), but"low-latency"
mode GREATLY improves input delay. -
Confirmed "that not only the input lag was affected, but the video generated did progress more cleanly in time" - image smoothness (frame times, frame pacing) is more stable in
"low-latency"
mode. -
Confirmed that
"low-latency"
mode works even with FPS limiters (since DXVK Low Latency 2.5.3-v3).
dxvk.lowLatencyOffset
Allows fine-tuning the "low-latency"
frame pacing mode. Positive value will make frames start later by the given amount (in microseconds), which make it less likely to run into buffering and thus may improve latency. Positive value might improve responsiveness, although only very slightly, but may be relevant for edge cases. Negative values will make frames start earlier by the given amount (in microseconds), and thus those frames will more likely run into buffering, which in turns may increase fps.
In other words, this option has an effect on the percentage of frames which go into GPU buffering and/or v-sync buffering. A value of zero will make 50% of frames go (mostly slightly) into buffering, since for most games, the prediction is so accurate that it will average out to 0 microseconds.
For 360 fps gameplay, you may want to experiment with values in the range of -100 to 100. For less fps, you may want to use larger values respectively.
The offset is applied after predictions have been made to align the frame, but doesn't affect fps limiting.
Default value: dxvk.lowLatencyOffset = 0
Supported values: -10000 to 10000
Observations from Digger1955's own testing:
-
It is NOT RECOMMENDED to set positive values for
dxvk.lowLatencyOffset
option, because setting such values significantly degrades performance and image smoothness for small (if any) improvement to input delay. -
It is recommended to try negative values for
dxvk.lowLatencyOffset
option, because setting such values improves performance and image smoothness for small (if any) penalty to input delay. Usually for 60 Hz refresh rate display:
-
For best performance/delay ratio recommended value is
dxvk.lowLatencyOffset = 0
-
For best performance and visual smoothness recommended value is
dxvk.lowLatencyOffset = -10000
-
For GPU drivers that do not have
VK_KHR_present_id
andVK_KHR_present_wait
extensions recommended value isdxvk.lowLatencyOffset = -10000
. -
If you are using any kind of FPS Limiter recommended value is
dxvk.lowLatencyOffset = -10000
dxvk.lowLatencyAllowCpuFramesOverlap
Determines whether a frame is allowed to begin before finishing processing the cpu-part of the previous one, when low-latency frame pacing is used. Snappiness may be improved when disallowing overlap. On the other hand, this might also decrease fps in certain cases.
In case a game is generating a very high load (or specific load) on dxvk's CS thread (see DXVK_HUD=cs
), setting dxvk.lowLatencyAllowCpuFramesOverlap = False
will prevent the CS thread queue from creating additional latency.
By default, this option is set to True
, because setting it to False
can lead to certain type of stutters being magnified, for example from shader compiling, which can lead to strong fps loss in those cases.
Default value: dxvk.lowLatencyAllowCpuFramesOverlap = True
Supported values: True
, False
Note: Since DXVK-GPLALL has dxvk.enableAsync = True
by default, it is recommended to try dxvk.lowLatencyAllowCpuFramesOverlap = False
Observations from Digger1955's own testing:
-
If you have high-performance CPU or application is not CPU-bound - recommended value is
dxvk.lowLatencyAllowCpuFramesOverlap = False
. It leads to lower input delay with no decrease in performance. -
If you are using any kind of FPS Limiter - recommended value is
dxvk.lowLatencyAllowCpuFramesOverlap = False
. It leads to lower input delay with no decrease in performance.
Upstream DXVK Options
Frame Pacing Options
dxvk.latencySleep
Controls latency sleep and Nvidia Reflex support.
Default value: dxvk.latencySleep = False
This build defaults to False
to enable dxvk.framePace
modes.
Supported values:
-
Auto: By default, DXVK only supports latency sleep in D3D11 games that use Reflex if the graphics driver supports
VK_NV_low_latency2
, and ifdxvk-nvapi
is enabled in Proton. -
True: Enables built-in latency reduction based on internal timings. This assumes that input sampling for any given frame happens after the D3D9 or DXGI Present call returns; games that render and present asynchronously will not behave as intended. Similarly, this will not have any effect in games with built-in frame rate limiters, or if an external limiter (such as MangoHud) is used. In some games, enabling this may reduce performance or lead to less consistent frame pacing. The implementation will either use
VK_NV_low_latency2
if supported by the driver, or a custom algorithm. -
False: Disable Reflex support as well as built-in latency reduction. You need to enable Reflex manually (Auto) until we support switching back and forth between Reflex and the low-latency frame pacing - for example via the ingame options - and more critically we want to enable low-latency frame pacing if the game doesn't support Reflex.
Recommended value: dxvk.latencySleep = False
dxvk.latencyTolerance
Tolerance for the latency sleep heuristic, in microseconds. Higher values increase latency, but may lead to better frame pacing in some cases. Does not have any effect if NV_low_latency2 is used.
Default value: dxvk.latencyTolerance = 1000
Supported values: Any non-negative number
Observations from Digger1955's own testing:
For the best frame pacing, it is recommended to align values of dxvk.latencyTolerance
and dxvk.lowLatencyOffset
. Examples:
-
if
dxvk.lowLatencyOffset = -10000
, thendxvk.latencyTolerance = 10000
-
if
dxvk.lowLatencyOffset = -1000
, thendxvk.latencyTolerance = 1000
-
if
dxvk.lowLatencyOffset = 0
, thendxvk.latencyTolerance = 0
-
if
dxvk.lowLatencyOffset = 1000
, thendxvk.latencyTolerance = 0
-
if
dxvk.lowLatencyOffset = 10000
, thendxvk.latencyTolerance = 0
dxvk.disableNvLowLatency2
Disables the use of VK_NV_low_latency2
. This will make Reflex unavailable in games, and if dxvk.latencySleep
is set to True
, a custom algorithm will be used for latency control. By default, the extension will not be used in 32-bit applications due to driver issues.
Default value: dxvk.disableNvLowLatency2 = Auto
Supported values: Auto
, True
, False
Recommended value: dxvk.disableNvLowLatency2 = Auto
. VK_NV_low_latency2
extension only available on NVIDIA GPUs and is not used, if dxvk.latencySleep = False
, which is default for this build.
GPL and Pipeline Compilation Options
dxvk.enableGraphicsPipelineLibrary
Can be used to enable/disable VK_EXT_graphics_pipeline_library
extension to compile Vulkan shaders at the time the game loads its D3D shaders, rather than at draw time. This reduces or eliminates shader compile stutter in many games when compared to the state cache system, if Async is not used.
IMPORTANT: When enabled, in games that load their shaders during loading screens or in the menu, can lead to prolonged periods of very high CPU utilization, especially on weaker CPUs. For affected games it is recommended to wait for shader compilation to finish before starting the game to avoid stutter and low performance.
IMPORTANT: Usage of VK_EXT_graphics_pipeline_library
extension significantly increases VRAM usage, due to this if you are low on VRAM, it can be better to disable it.
Default value: dxvk.enableGraphicsPipelineLibrary = False
Supported values:
-
Auto: Enable if supported, and compile optimized pipelines in the background
-
True: Enable if supported, but do not compile optimized pipelines
-
False: Always disable the feature
STRONGLY RECOMMENDED value: dxvk.enableGraphicsPipelineLibrary = False
Reasons:
-
This feature is replaced by Async, which does not require any specific driver/extension support and provides better performance than using DXVK with GPL or using DXVK only with state cache.
-
Use of GPL leads to prolonged periods of very high CPU utilization and decreases GPU-bound performance in some cases.
-
Use of GPL significantly increases VRAM/RAM usage and since many Vulkan Drivers on Linux do not have effective memory management mechanisims and do not implement
VK_EXT_pageable_device_local_memory
, using GPL decreases GPU-bound performance in VRAM-limited and VRAM/PCIe bandwidth-limited situations. -
Use of GPL requires proper implementation of
VK_EXT_graphics_pipeline_library
extension which is not available on all devices/drivers.
dxvk.numCompilerThreads
Sets number of pipeline compiler threads that will be used for shader compilation. Some of these threads will be reserved for high-priority work, when GPL feature is enabled.
Default value: dxvk.numCompilerThreads = 0
Supported values:
-
0 to use
(CPULogicalThreads - 2)
compiler threads -
any positive number to enforce the thread count
Recommended value: dxvk.numCompilerThreads = 0
Default value provides the fastest shader compilation time and minimizes possible stutters. It already takes into account single, dual and triple core CPUs.
Screen Mode and FPS Limiter Options
dxvk.allowFse
Allows the Vulkan driver to opt-in to exclusive full-screen mode on Windows. Certain features, such as variable refresh rate or HDR, will not work without this setting, however enabling it will break certain games that use additional GDI windows, and it will also break Alt+Tab
. This setting has no effect on non-Windows platforms.
Default value: dxvk.allowFse = False
Supported values: True
, False
Recommended value: dxvk.allowFse = False
On Windows 10/11, if you are not using HDR or Variable Refresh Rate (VRR) or application specifically does not require Fullscreen mode - it is recommended to leave it at default value, because in new Windows versions WDDM and DWM are optimised for Fullscreen Borderless and Windowed modes, but not for Exclusive Fullscreen mode.
dxgi.maxFrameRate
/d3d9.maxFrameRate
Enables frame rate limiter. The main purpose of this is to work around bugs in games that have physics or other simulation tied to their frame rate, but do not provide their own limiter.
Fps limiting is very helpful when used together with VRR to give the pacing enough space to not hit the v-sync buffering. For 240 Hz VRR, a limit of about 225 fps is recommended, and similarly for other refresh rates. Finding the best fps-limit for VRR will require some testing and also depends on the game and how much frametime variation it generates on the user's system.
Fps limiting is also useful in other modes to improve consistency and/or to save power. Limiting in the low-latency modes is tightly integrated into the frame pacing and is strongly recommended to be used in place of most ingame limiters.
If setting an fps limit so low that it will bore your GPU, this may result in your driver's heuristic clocking down the GPU, which can cause the latency to quadruple if you are unlucky. So you may want to watch out for that and take appropriate measures if desired.
Default value: dxgi.maxFrameRate = 0
(for D3D11/D3D10 applications) and d3d9.maxFrameRate = 0
(for D3D9/D3D8 applications)
Supported values:
-
-1: Always disables the limiter.
-
0: Default behaviour. Limits the frame rate to the selected display refresh rate when vertical synchronization is enabled if the actual display mode does not match the game's one.
-
n: Limit to n frames per second.
IMPORTANT: Using DXVK frame rate limiter with GPU drivers that do not have VK_KHR_present_id
and VK_KHR_present_wait
extensions, and FPS limit lower than your display refresh rate, can lead to SEVERE frame pacing issues. You can try to resolve these issues, by setting dxgi.maxFrameRate = -1
and d3d9.maxFrameRate = -1
, and use another way to limit FPS, but in some applications (Unreal Engine 4 applications, for example), it affects other methods of FPS limiting too.
Performance Tweaks
d3d11.maxTessFactor
Overrides the maximum allowed tessellation factor. This can be used to improve performance in titles which overuse tessellation.
Default value: d3d11.maxTessFactor = 0
Supported values: Any number between 8 and 64
Recommended value: d3d11.maxTessFactor = 8
Observations from Digger1955's own testing:
It is recommended to set d3d11.maxTessFactor = 8
, to get the best performance/quality ratio, because there are many D3D11 applications that overuse tessellation. Most of them are NVIDIA-sponsored and using NVIDIA GameWorks. For example: Watch Dogs 2, Far Cry 4, Final Fantasy XV, etc.
d3d11.relaxedBarriers
Enables relaxed pipeline barriers around UAV writes.
Ignores write-after-write hazards in compute shaders, and all UAV hazards in graphics shaders. This may improve performance in some games, but may also introduce rendering issues. Please don't report bugs with the option enabled.
Default value: d3d11.relaxedBarriers = False
Supported values: True
, False
Recommended value: d3d11.relaxedBarriers = True
It is a per-game performance tweak, that is recommended to try. For applications that have been tested by Digger1955 setting option d3d11.relaxedBarriers = True
has improved GPU-bound performance without introducing any rendering issues. If this option is set for specific application in config.cpp, DO NOT change its value.
d3d11.relaxedGraphicsBarriers
Enables relaxed UAV pipeline barriers in graphics shaders only.
Similar to the relaxedBarriers option, except it does not apply to compute UAVs. This may improve performance in some games, but may also introduce rendering issues. Please don't report bugs with the option enabled.
Default value: d3d11.relaxedGraphicsBarriers = False
Supported values: True
, False
Recommended value: d3d11.relaxedGraphicsBarriers = True
It is a per-game performance tweak, that is recommended to try. For applications that have been tested by Digger1955 setting option d3d11.relaxedGraphicsBarriers = True
has improved GPU-bound performance without introducing any rendering issues. If this option is set for specific application in config.cpp, DO NOT change its value.
d3d11.invariantPosition
/d3d9.invariantPosition
Declares vertex positions as invariant in order to solve potential Z-fighting issues at a small performance cost.
Default values: d3d11.invariantPosition = True
/d3d9.invariantPosition = True
Supported values: True
, False
Recommended values: d3d11.invariantPosition = False
/d3d9.invariantPosition = False
It is a per-game performance tweak, that is recommended to try. For applications that have been tested by Digger1955 setting option d3d11.invariantPosition = False
(for D3D11/D3D10 applications) or d3d9.invariantPosition = False
(for D3D9/D3D8 applications) has improved GPU-bound performance without introducing any rendering issues. If this option is set for specific application in config.cpp, DO NOT change its value.
d3d9.lenientClear
Decides whether or not we fastpath clear anyway if we are close enough to clearing a full render target.
Default value: d3d9.lenientClear = False
Supported values: True
, False
Recommended value: d3d9.lenientClear = True
It is a per-game performance tweak, that is recommended to try. For applications that have been tested by Digger1955 setting option d3d9.lenientClear = True
(for D3D9/D3D8 applications) has improved GPU-bound performance without introducing any rendering issues. If this option is set for specific application in config.cpp, DO NOT change its value.
d3d9.floatEmulation
Force toggle anything * 0 emulation. Setting it to True
will use a faster but less accurate approach that works for most games.
Default value: d3d9.floatEmulation = Auto
Supported values:
-
True
: Use a faster but less accurate approach. Good enough for most games -
False
: Disable float emulation completely -
Strict
: Use a slower but more correct approach. Necessary for some games -
Auto
: DXVK will pick automatically
Recommended value: d3d9.floatEmulation = True
It is a per-game performance tweak, that is recommended to try. For applications that have been tested by Digger1955 setting option d3d9.floatEmulation = True
(for D3D9/D3D8 applications) has improved GPU-bound performance without introducing any rendering issues. If this option is set for specific application in config.cpp, DO NOT change its value.