[d3d11] Introduce option to disable float controls

And disable for SotTR since it introduces rendering issues.
This commit is contained in:
Philip Rebohle 2021-01-28 20:32:38 +01:00
parent 8de9dc9378
commit 307f43ff1e
4 changed files with 16 additions and 9 deletions

View File

@ -15,6 +15,7 @@ namespace dxvk {
this->maxTessFactor = config.getOption<int32_t>("d3d11.maxTessFactor", 0);
this->samplerAnisotropy = config.getOption<int32_t>("d3d11.samplerAnisotropy", -1);
this->invariantPosition = config.getOption<bool>("d3d11.invariantPosition", true);
this->floatControls = config.getOption<bool>("d3d11.floatControls", true);
this->deferSurfaceCreation = config.getOption<bool>("dxgi.deferSurfaceCreation", false);
this->numBackBuffers = config.getOption<int32_t>("dxgi.numBackBuffers", 0);
this->maxFrameLatency = config.getOption<int32_t>("dxgi.maxFrameLatency", 0);

View File

@ -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;

View File

@ -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

View File

@ -200,6 +200,7 @@ namespace dxvk {
* position breaks character rendering on NV */
{ R"(\\SOTTR\.exe$)", {{
{ "d3d11.invariantPosition", "False" },
{ "d3d11.floatControls", "False" },
}} },
/**********************************************/