diff --git a/src/d3d11/d3d11_options.cpp b/src/d3d11/d3d11_options.cpp index 0922b2db..b807a2d1 100644 --- a/src/d3d11/d3d11_options.cpp +++ b/src/d3d11/d3d11_options.cpp @@ -15,6 +15,7 @@ namespace dxvk { this->maxTessFactor = config.getOption("d3d11.maxTessFactor", 0); this->samplerAnisotropy = config.getOption("d3d11.samplerAnisotropy", -1); this->invariantPosition = config.getOption("d3d11.invariantPosition", true); + this->floatControls = config.getOption("d3d11.floatControls", true); 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 75ce54e4..2949ca3d 100644 --- a/src/d3d11/d3d11_options.h +++ b/src/d3d11/d3d11_options.h @@ -64,6 +64,9 @@ namespace dxvk { /// Declare vertex positions in shaders as invariant bool invariantPosition; + /// Enable float control bits + bool floatControls; + /// 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 b891d4b9..83d85f37 100644 --- a/src/dxbc/dxbc_options.cpp +++ b/src/dxbc/dxbc_options.cpp @@ -59,16 +59,18 @@ namespace dxvk { applyTristate(useSubgroupOpsForEarlyDiscard, device->config().useEarlyDiscard); // Figure out float control flags to match D3D11 rules - if (devInfo.khrShaderFloatControls.shaderSignedZeroInfNanPreserveFloat32) - floatControl.set(DxbcFloatControlFlag::PreserveNan32); - if (devInfo.khrShaderFloatControls.shaderSignedZeroInfNanPreserveFloat64) - floatControl.set(DxbcFloatControlFlag::PreserveNan64); + if (options.floatControls) { + if (devInfo.khrShaderFloatControls.shaderSignedZeroInfNanPreserveFloat32) + floatControl.set(DxbcFloatControlFlag::PreserveNan32); + if (devInfo.khrShaderFloatControls.shaderSignedZeroInfNanPreserveFloat64) + floatControl.set(DxbcFloatControlFlag::PreserveNan64); - if (devInfo.khrShaderFloatControls.denormBehaviorIndependence != VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE) { - if (devInfo.khrShaderFloatControls.shaderDenormFlushToZeroFloat32) - floatControl.set(DxbcFloatControlFlag::DenormFlushToZero32); - if (devInfo.khrShaderFloatControls.shaderDenormPreserveFloat64) - floatControl.set(DxbcFloatControlFlag::DenormPreserve64); + if (devInfo.khrShaderFloatControls.denormBehaviorIndependence != VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE) { + if (devInfo.khrShaderFloatControls.shaderDenormFlushToZeroFloat32) + floatControl.set(DxbcFloatControlFlag::DenormFlushToZero32); + if (devInfo.khrShaderFloatControls.shaderDenormPreserveFloat64) + floatControl.set(DxbcFloatControlFlag::DenormPreserve64); + } } if (!devInfo.khrShaderFloatControls.shaderSignedZeroInfNanPreserveFloat32 diff --git a/src/util/config/config.cpp b/src/util/config/config.cpp index bbf995d6..429bc296 100644 --- a/src/util/config/config.cpp +++ b/src/util/config/config.cpp @@ -200,6 +200,7 @@ namespace dxvk { * position breaks character rendering on NV */ { R"(\\SOTTR\.exe$)", {{ { "d3d11.invariantPosition", "False" }, + { "d3d11.floatControls", "False" }, }} }, /**********************************************/