From 0418c02ac3874ec3ead40ade5f53eaa03263f8cc Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 11 Nov 2018 17:49:11 +0100 Subject: [PATCH] [dxbc] Use clustered subgroup operations on supported hardware --- src/dxbc/dxbc_compiler.cpp | 11 ++++++++++- src/dxbc/dxbc_options.cpp | 2 ++ src/dxbc/dxbc_options.h | 3 +++ tests/dxbc/test_dxbc_compiler.cpp | 1 + 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 7be91c9a6..c675f5267 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -3897,7 +3897,13 @@ namespace dxvk { uint32_t killSubgroup = m_module.opGroupNonUniformLogicalAnd( m_module.defBoolType(), m_module.constu32(spv::ScopeSubgroup), - spv::GroupOperationReduce, killState, 0); + m_moduleInfo.options.useSubgroupOpsClustered + ? spv::GroupOperationClusteredReduce + : spv::GroupOperationReduce, + killState, + m_moduleInfo.options.useSubgroupOpsClustered + ? m_module.constu32(4) + : 0); DxbcConditional cond; cond.labelIf = m_module.allocateId(); @@ -6190,6 +6196,9 @@ namespace dxvk { if (m_moduleInfo.options.useSubgroupOpsForEarlyDiscard) { m_module.enableCapability(spv::CapabilityGroupNonUniform); m_module.enableCapability(spv::CapabilityGroupNonUniformArithmetic); + + if (m_moduleInfo.options.useSubgroupOpsClustered) + m_module.enableCapability(spv::CapabilityGroupNonUniformClustered); } } diff --git a/src/dxbc/dxbc_options.cpp b/src/dxbc/dxbc_options.cpp index d016ae680..29360c9d7 100644 --- a/src/dxbc/dxbc_options.cpp +++ b/src/dxbc/dxbc_options.cpp @@ -19,6 +19,8 @@ namespace dxvk { = (devInfo.coreSubgroup.subgroupSize >= 4) && (devInfo.coreSubgroup.supportedStages & VK_SHADER_STAGE_FRAGMENT_BIT) && (devInfo.coreSubgroup.supportedOperations & VK_SUBGROUP_FEATURE_ARITHMETIC_BIT); + useSubgroupOpsClustered = useSubgroupOpsForEarlyDiscard + && (devInfo.coreSubgroup.supportedOperations & VK_SUBGROUP_FEATURE_CLUSTERED_BIT); } } \ No newline at end of file diff --git a/src/dxbc/dxbc_options.h b/src/dxbc/dxbc_options.h index 02ac012f9..d08428d15 100644 --- a/src/dxbc/dxbc_options.h +++ b/src/dxbc/dxbc_options.h @@ -14,6 +14,9 @@ namespace dxvk { /// Use subgroup operations to discard fragment /// shader invocations if derivatives remain valid. bool useSubgroupOpsForEarlyDiscard = false; + + /// Use clustered subgroup operations + bool useSubgroupOpsClustered = false; }; } \ No newline at end of file diff --git a/tests/dxbc/test_dxbc_compiler.cpp b/tests/dxbc/test_dxbc_compiler.cpp index 16ab707dc..b6f79b33d 100644 --- a/tests/dxbc/test_dxbc_compiler.cpp +++ b/tests/dxbc/test_dxbc_compiler.cpp @@ -43,6 +43,7 @@ int WINAPI WinMain(HINSTANCE hInstance, DxbcModuleInfo moduleInfo; moduleInfo.options.useSubgroupOpsForEarlyDiscard = true; + moduleInfo.options.useSubgroupOpsClustered = true; moduleInfo.xfb = nullptr; Rc shader = module.compile(moduleInfo, ifileName);