1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-20 19:54:19 +01:00

[dxbc] Use subgroup operations for early discard

Can improve performance in some complex fragment shaders.
This commit is contained in:
Philip Rebohle 2018-11-07 11:57:36 +01:00
parent a574829bb6
commit 4f76b89941
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 37 additions and 2 deletions

View File

@ -3892,6 +3892,26 @@ namespace dxvk {
uint32_t killState = m_module.opLoad (typeId, m_ps.killState);
killState = m_module.opLogicalOr(typeId, killState, zeroTest.id);
m_module.opStore(m_ps.killState, killState);
if (m_moduleInfo.options.useSubgroupOpsForEarlyDiscard) {
uint32_t killSubgroup = m_module.opGroupNonUniformLogicalAnd(
m_module.defBoolType(),
m_module.constu32(spv::ScopeSubgroup),
spv::GroupOperationReduce, killState, 0);
DxbcConditional cond;
cond.labelIf = m_module.allocateId();
cond.labelEnd = m_module.allocateId();
m_module.opSelectionMerge(cond.labelEnd, spv::SelectionControlMaskNone);
m_module.opBranchConditional(killSubgroup, cond.labelIf, cond.labelEnd);
// OpKill terminates the block
m_module.opLabel(cond.labelIf);
m_module.opKill();
m_module.opLabel(cond.labelEnd);
}
}
}
@ -6166,6 +6186,11 @@ namespace dxvk {
spv::StorageClassPrivate, m_module.constBool(false));
m_module.setDebugName(m_ps.killState, "ps_kill");
if (m_moduleInfo.options.useSubgroupOpsForEarlyDiscard) {
m_module.enableCapability(spv::CapabilityGroupNonUniform);
m_module.enableCapability(spv::CapabilityGroupNonUniformArithmetic);
}
}
// Main function of the pixel shader

View File

@ -11,8 +11,14 @@ namespace dxvk {
DxbcOptions::DxbcOptions(const Rc<DxvkDevice>& device) {
const DxvkDeviceFeatures& devFeatures = device->features();
useStorageImageReadWithoutFormat = devFeatures.core.features.shaderStorageImageReadWithoutFormat;
const DxvkDeviceInfo& devInfo = device->adapter()->devicePropertiesExt();
useStorageImageReadWithoutFormat
= devFeatures.core.features.shaderStorageImageReadWithoutFormat;
useSubgroupOpsForEarlyDiscard
= (devInfo.coreSubgroup.subgroupSize >= 4)
&& (devInfo.coreSubgroup.supportedStages & VK_SHADER_STAGE_FRAGMENT_BIT)
&& (devInfo.coreSubgroup.supportedOperations & VK_SUBGROUP_FEATURE_ARITHMETIC_BIT);
}
}

View File

@ -10,6 +10,10 @@ namespace dxvk {
/// Use the ShaderImageReadWithoutFormat capability.
bool useStorageImageReadWithoutFormat = false;
/// Use subgroup operations to discard fragment
/// shader invocations if derivatives remain valid.
bool useSubgroupOpsForEarlyDiscard = false;
};
}