From e426ec09a1f5d02aa7b1589c40c083235df9df41 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 8 Jan 2023 00:51:13 +0100 Subject: [PATCH] [d3d11,dxbc] Add d3d11.forceSampleRateShading option --- dxvk.conf | 9 +++++++++ src/d3d11/d3d11_options.cpp | 1 + src/d3d11/d3d11_options.h | 5 +++++ src/dxbc/dxbc_compiler.cpp | 8 ++++++++ src/dxbc/dxbc_options.cpp | 1 + src/dxbc/dxbc_options.h | 4 ++++ 6 files changed, 28 insertions(+) diff --git a/dxvk.conf b/dxvk.conf index b5635a6e..473ca91b 100644 --- a/dxvk.conf +++ b/dxvk.conf @@ -201,6 +201,15 @@ # d3d9.invariantPosition = True +# Forces per-sample rate shading when MSAA is enabled, rather than per-pixel +# shading. May improve visual clarity at a significant performance cost, but +# may also introduce visual issues in some games. +# +# Supported values: True, False + +# d3d11.forceSampleRateShading = False + + # Forces the sample count of all textures to 1, and performs # the needed fixups in resolve operations and shaders. # diff --git a/src/d3d11/d3d11_options.cpp b/src/d3d11/d3d11_options.cpp index f4eee5b2..bcac396b 100644 --- a/src/d3d11/d3d11_options.cpp +++ b/src/d3d11/d3d11_options.cpp @@ -23,6 +23,7 @@ namespace dxvk { this->samplerLodBias = config.getOption("d3d11.samplerLodBias", 0.0f); this->invariantPosition = config.getOption("d3d11.invariantPosition", true); this->floatControls = config.getOption("d3d11.floatControls", true); + this->forceSampleRateShading = config.getOption("d3d11.forceSampleRateShading", false); this->disableMsaa = config.getOption("d3d11.disableMsaa", false); this->enableContextLock = config.getOption("d3d11.enableContextLock", false); this->deferSurfaceCreation = config.getOption("dxgi.deferSurfaceCreation", false); diff --git a/src/d3d11/d3d11_options.h b/src/d3d11/d3d11_options.h index 1b636db1..99bca076 100644 --- a/src/d3d11/d3d11_options.h +++ b/src/d3d11/d3d11_options.h @@ -99,6 +99,11 @@ namespace dxvk { /// for a single window that may interfere with each other. bool deferSurfaceCreation; + /// Enables sample rate shading by interpolating fragment shader + /// inputs at the sample location rather than pixel center, + /// unless otherwise specified by the application. + bool forceSampleRateShading; + /// Forces the sample count of all textures to be 1, and /// performs the required shader and resolve fixups. bool disableMsaa; diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index f5664f87..fb107da6 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -726,6 +726,14 @@ namespace dxvk { m_module.decorate(varId, spv::DecorationSample); } + if (m_moduleInfo.options.forceSampleRateShading) { + if (im == DxbcInterpolationMode::Linear + || im == DxbcInterpolationMode::LinearNoPerspective) { + m_module.enableCapability(spv::CapabilitySampleRateShading); + m_module.decorate(varId, spv::DecorationSample); + } + } + // Declare the input slot as defined m_inputMask |= 1u << regIdx; m_vArrayLength = std::max(m_vArrayLength, regIdx + 1); diff --git a/src/dxbc/dxbc_options.cpp b/src/dxbc/dxbc_options.cpp index 0d848679..e642a0df 100644 --- a/src/dxbc/dxbc_options.cpp +++ b/src/dxbc/dxbc_options.cpp @@ -38,6 +38,7 @@ namespace dxvk { zeroInitWorkgroupMemory = options.zeroInitWorkgroupMemory; forceVolatileTgsmAccess = options.forceVolatileTgsmAccess; disableMsaa = options.disableMsaa; + forceSampleRateShading = options.forceSampleRateShading; enableSampleShadingInterlock = device->features().extFragmentShaderInterlock.fragmentShaderSampleInterlock; // Figure out float control flags to match D3D11 rules diff --git a/src/dxbc/dxbc_options.h b/src/dxbc/dxbc_options.h index b29cf5d4..2612a024 100644 --- a/src/dxbc/dxbc_options.h +++ b/src/dxbc/dxbc_options.h @@ -43,6 +43,10 @@ namespace dxvk { /// Replace ld_ms with ld bool disableMsaa = false; + /// Force sample rate shading by using sample + /// interpolation for fragment shader inputs + bool forceSampleRateShading = false; + // Enable per-sample interlock if supported bool enableSampleShadingInterlock = false;