From 9721938e57a0a97f1983104e8abf9a0db15c6b1c Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 23 Jan 2020 01:28:19 +0100 Subject: [PATCH] [d3d11] Introduce d3d11.invariantPosition option Apparently it's better to make app profiles than risk tanking performance for all applications. Invariance rules in D3D11 are undocumented so it's not clear what the correct solution is. --- dxvk.conf | 9 +++++++++ src/d3d11/d3d11_options.cpp | 1 + src/d3d11/d3d11_options.h | 3 +++ src/dxbc/dxbc_options.cpp | 5 +---- 4 files changed, 14 insertions(+), 4 deletions(-) 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