diff --git a/dxvk.conf b/dxvk.conf index 4f1a443a..3e739704 100644 --- a/dxvk.conf +++ b/dxvk.conf @@ -499,6 +499,7 @@ # Supported values: # - True/False +# d3d11.longMad = False # d3d9.longMad = False # Device Local Constant Buffers diff --git a/src/d3d11/d3d11_options.cpp b/src/d3d11/d3d11_options.cpp index bce1a713..ddbfe0a9 100644 --- a/src/d3d11/d3d11_options.cpp +++ b/src/d3d11/d3d11_options.cpp @@ -32,6 +32,7 @@ namespace dxvk { this->maxFrameLatency = config.getOption("dxgi.maxFrameLatency", 0); this->maxFrameRate = config.getOption("dxgi.maxFrameRate", 0); this->exposeDriverCommandLists = config.getOption("d3d11.exposeDriverCommandLists", true); + this->longMad = config.getOption("d3d11.longMad", false); // Clamp LOD bias so that people don't abuse this in unintended ways this->samplerLodBias = dxvk::fclamp(this->samplerLodBias, -2.0f, 1.0f); diff --git a/src/d3d11/d3d11_options.h b/src/d3d11/d3d11_options.h index fe9a2ab6..5cd548cd 100644 --- a/src/d3d11/d3d11_options.h +++ b/src/d3d11/d3d11_options.h @@ -120,6 +120,9 @@ namespace dxvk { /// Shader dump path std::string shaderDumpPath; + + /// Should we make our Mads a FFma or do it the long way with an FMul and an FAdd? + bool longMad; }; } \ No newline at end of file diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 5b65c8a7..f98974c6 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -1624,8 +1624,13 @@ namespace dxvk { case DxbcOpcode::Mad: case DxbcOpcode::DFma: - dst.id = m_module.opFFma(typeId, - src.at(0).id, src.at(1).id, src.at(2).id); + if (likely(!m_moduleInfo.options.longMad)) { + dst.id = m_module.opFFma(typeId, + src.at(0).id, src.at(1).id, src.at(2).id); + } else { + dst.id = m_module.opFMul(typeId, src.at(0).id, src.at(1).id); + dst.id = m_module.opFAdd(typeId, dst.id, src.at(2).id); + } break; case DxbcOpcode::Max: diff --git a/src/dxbc/dxbc_options.cpp b/src/dxbc/dxbc_options.cpp index e55a0f94..3d8d86c2 100644 --- a/src/dxbc/dxbc_options.cpp +++ b/src/dxbc/dxbc_options.cpp @@ -38,6 +38,7 @@ namespace dxvk { disableMsaa = options.disableMsaa; forceSampleRateShading = options.forceSampleRateShading; enableSampleShadingInterlock = device->features().extFragmentShaderInterlock.fragmentShaderSampleInterlock; + longMad = options.longMad; // Figure out float control flags to match D3D11 rules if (options.floatControls) { diff --git a/src/dxbc/dxbc_options.h b/src/dxbc/dxbc_options.h index 27ecca1f..4b21f2f8 100644 --- a/src/dxbc/dxbc_options.h +++ b/src/dxbc/dxbc_options.h @@ -54,6 +54,9 @@ namespace dxvk { /// Minimum storage buffer alignment VkDeviceSize minSsboAlignment = 0; + + /// Should we make our Mads a FFma or do it the long way with an FMul and an FAdd? + bool longMad; }; } \ No newline at end of file