[dxbc] Use texel buffers for raw/structured buffers with sparse feedback

This commit is contained in:
Philip Rebohle 2022-08-22 05:11:59 +02:00
parent 336aafcdf7
commit eaa5d16616
3 changed files with 23 additions and 2 deletions

View File

@ -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;

View File

@ -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<DxbcUavInfo, 64> uavInfos;
std::array<DxbcUavInfo, 64> uavInfos;
std::array<DxbcSrvInfo, 128> srvInfos;
std::array<DxbcRegMask, 4096> xRegMasks;
DxbcClipCullInfo clipCullIn;

View File

@ -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);