diff --git a/src/dxbc/dxbc_analysis.cpp b/src/dxbc/dxbc_analysis.cpp index 69922211..8a8f44b5 100644 --- a/src/dxbc/dxbc_analysis.cpp +++ b/src/dxbc/dxbc_analysis.cpp @@ -52,10 +52,15 @@ namespace dxvk { case DxbcInstClass::BufferLoad: { uint32_t operandId = ins.op == DxbcOpcode::LdStructured ? 2 : 1; + bool sparseFeedback = ins.dstCount == 2; if (ins.src[operandId].type == DxbcOperandType::UnorderedAccessView) { const uint32_t registerId = ins.src[operandId].idx[0].offset; m_analysis->uavInfos[registerId].accessFlags |= VK_ACCESS_SHADER_READ_BIT; + m_analysis->uavInfos[registerId].sparseFeedback |= sparseFeedback; + } else if (ins.src[operandId].type == DxbcOperandType::Resource) { + const uint32_t registerId = ins.src[operandId].idx[0].offset; + m_analysis->srvInfos[registerId].sparseFeedback |= sparseFeedback; } } break; diff --git a/src/dxbc/dxbc_analysis.h b/src/dxbc/dxbc_analysis.h index b40cc94d..fcbc1dda 100644 --- a/src/dxbc/dxbc_analysis.h +++ b/src/dxbc/dxbc_analysis.h @@ -19,9 +19,20 @@ namespace dxvk { struct DxbcUavInfo { bool accessTypedLoad = false; bool accessAtomicOp = false; + bool sparseFeedback = false; VkAccessFlags accessFlags = 0; }; + /** + * \brief Info about shader resource views + * + * Stores whether an SRV is accessed with + * sparse feedback. Useful for buffers. + */ + struct DxbcSrvInfo { + bool sparseFeedback = false; + }; + /** * \brief Counts cull and clip distances */ @@ -34,7 +45,8 @@ namespace dxvk { * \brief Shader analysis info */ struct DxbcAnalysisInfo { - std::array uavInfos; + std::array uavInfos; + std::array srvInfos; std::array xRegMasks; DxbcClipCullInfo clipCullIn; diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index b5357390..5fafe767 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -1096,7 +1096,11 @@ namespace dxvk { : computeSrvBinding(m_programInfo.type(), registerId); // Test whether we should use a raw SSBO for this resource - bool useRawSsbo = m_moduleInfo.options.minSsboAlignment <= resAlign; + bool hasSparseFeedback = isUav + ? m_analysis->uavInfos[registerId].sparseFeedback + : m_analysis->srvInfos[registerId].sparseFeedback; + + bool useRawSsbo = m_moduleInfo.options.minSsboAlignment <= resAlign && !hasSparseFeedback; if (useRawSsbo) { uint32_t elemType = getScalarTypeId(DxbcScalarType::Uint32);