diff --git a/dxvk.conf b/dxvk.conf index b07b62b3..626b50e3 100644 --- a/dxvk.conf +++ b/dxvk.conf @@ -124,6 +124,15 @@ # d3d9.samplerAnisotropy = -1 +# Declares vertex positions as invariant in order to solve +# potential Z-fighting issues at a small performance cost. +# +# Supported values: True, False + +# d3d11.invariantPosition = False +# d3d9.invariantPosition = False + + # Replaces NaN outputs from fragment shaders with zeroes for floating # point render target. Used in some games to prevent artifacting. # diff --git a/src/d3d11/d3d11_options.cpp b/src/d3d11/d3d11_options.cpp index a8f881e6..d759cbe0 100644 --- a/src/d3d11/d3d11_options.cpp +++ b/src/d3d11/d3d11_options.cpp @@ -13,6 +13,7 @@ namespace dxvk { this->relaxedBarriers = config.getOption("d3d11.relaxedBarriers", false); this->maxTessFactor = config.getOption("d3d11.maxTessFactor", 0); this->samplerAnisotropy = config.getOption("d3d11.samplerAnisotropy", -1); + this->invariantPosition = config.getOption("d3d11.invariantPosition", false); this->deferSurfaceCreation = config.getOption("dxgi.deferSurfaceCreation", false); this->numBackBuffers = config.getOption("dxgi.numBackBuffers", 0); this->maxFrameLatency = config.getOption("dxgi.maxFrameLatency", 0); diff --git a/src/d3d11/d3d11_options.h b/src/d3d11/d3d11_options.h index d5758d29..bc40c855 100644 --- a/src/d3d11/d3d11_options.h +++ b/src/d3d11/d3d11_options.h @@ -54,6 +54,9 @@ namespace dxvk { /// given anisotropy value for all samplers. int32_t samplerAnisotropy; + /// Declare vertex positions in shaders as invariant + bool invariantPosition; + /// Back buffer count for the Vulkan swap chain. /// Overrides DXGI_SWAP_CHAIN_DESC::BufferCount. int32_t numBackBuffers; diff --git a/src/dxbc/dxbc_options.cpp b/src/dxbc/dxbc_options.cpp index fdcb7a37..883fcef8 100644 --- a/src/dxbc/dxbc_options.cpp +++ b/src/dxbc/dxbc_options.cpp @@ -37,13 +37,10 @@ namespace dxvk { case Tristate::False: minSsboAlignment = ~0u; break; } + invariantPosition = options.invariantPosition; enableRtOutputNanFixup = options.enableRtOutputNanFixup; zeroInitWorkgroupMemory = options.zeroInitWorkgroupMemory; dynamicIndexedConstantBufferAsSsbo = options.constantBufferRangeCheck; - - // Don't declare vertex positions as invariant on Nvidia since it - // may break certain games, such as Shadow of the Tomb Raider. - invariantPosition = !adapter->matchesDriver(DxvkGpuVendor::Nvidia, VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR, 0, 0); // Disable early discard on RADV (with LLVM) due to GPU hangs // Disable early discard on Nvidia because it may hurt performance