diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index d4337d7ef..e1fa90a94 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -360,6 +360,9 @@ namespace dxvk { void DxbcCompiler::emitDclGlobalFlags(const DxbcShaderInstruction& ins) { const DxbcGlobalFlags flags = ins.controls.globalFlags(); + if (flags.test(DxbcGlobalFlag::RefactoringAllowed)) + m_precise = false; + if (flags.test(DxbcGlobalFlag::EarlyFragmentTests)) m_module.setExecutionMode(m_entryPointId, spv::ExecutionModeEarlyFragmentTests); } @@ -1768,7 +1771,7 @@ namespace dxvk { return; } - if (ins.controls.precise()) + if (ins.controls.precise() || m_precise) m_module.decorate(dst.id, spv::DecorationNoContraction); // Store computed value @@ -2020,7 +2023,7 @@ namespace dxvk { src.at(0).id, src.at(1).id); - if (ins.controls.precise()) + if (ins.controls.precise() || m_precise) m_module.decorate(dst.id, spv::DecorationNoContraction); dst = emitDstOperandModifiers(dst, ins.modifiers); diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index 48ff03c76..2404642e1 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -538,7 +538,11 @@ namespace dxvk { ///////////////////////////// // Enabled SPIR-V extensions DxbcSpirvExtensions m_extensions; - + + ////////////////////// + // Global state stuff + bool m_precise = true; + ///////////////////////////////////////////////////// // Shader interface and metadata declaration methods void emitDcl(