1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-01 08:52:11 +01:00

[dxvk] Use new barrier helpers for shader execution barriers

This commit is contained in:
Philip Rebohle 2024-10-12 10:34:54 +02:00 committed by Philip Rebohle
parent 4b94b8989d
commit 56a58095fe
2 changed files with 51 additions and 51 deletions

View File

@ -5904,7 +5904,7 @@ namespace dxvk {
}
if (requiresBarrier) {
m_execBarriers.recordCommands(m_cmd);
flushBarriers();
return;
}
}
@ -6052,23 +6052,15 @@ namespace dxvk {
VkPipelineStageFlags stages,
VkAccessFlags access) {
if constexpr (DoEmit) {
m_execBarriers.accessBuffer(
bufferSlice.getSliceHandle(),
stages, access,
bufferSlice.bufferInfo().stages,
bufferSlice.bufferInfo().access);
accessBuffer(DxvkCmdBuffer::ExecBuffer,
*bufferSlice.buffer(), bufferSlice.offset(),
bufferSlice.length(), stages, access);
return false;
} else {
DxvkAccessFlags dstAccess = DxvkBarrierSet::getAccessTypes(access);
bool dirty = m_execBarriers.isBufferDirty(
bufferSlice.getSliceHandle(), dstAccess);
if (!dirty || dstAccess.test(DxvkAccess::Read) || !this->canIgnoreWawHazards(stages))
return dirty;
DxvkAccessFlags srcAccess = m_execBarriers.getBufferAccess(bufferSlice.getSliceHandle());
return srcAccess.test(DxvkAccess::Read);
return checkResourceBarrier([this, &bufferSlice] (DxvkAccess access) {
return resourceHasAccess(*bufferSlice.buffer(),
bufferSlice.offset(), bufferSlice.length(), access);
}, stages, access);
}
}
@ -6079,23 +6071,13 @@ namespace dxvk {
VkPipelineStageFlags stages,
VkAccessFlags access) {
if constexpr (DoEmit) {
m_execBarriers.accessBuffer(
bufferView->getSliceHandle(),
stages, access,
bufferView->buffer()->info().stages,
bufferView->buffer()->info().access);
accessBuffer(DxvkCmdBuffer::ExecBuffer,
*bufferView, stages, access);
return false;
} else {
DxvkAccessFlags dstAccess = DxvkBarrierSet::getAccessTypes(access);
bool dirty = m_execBarriers.isBufferDirty(
bufferView->getSliceHandle(), dstAccess);
if (!dirty || dstAccess.test(DxvkAccess::Read) || !this->canIgnoreWawHazards(stages))
return dirty;
DxvkAccessFlags srcAccess = m_execBarriers.getBufferAccess(bufferView->getSliceHandle());
return srcAccess.test(DxvkAccess::Read);
return checkResourceBarrier([this, &bufferView] (DxvkAccess access) {
return resourceHasAccess(*bufferView, access);
}, stages, access);
}
}
@ -6106,29 +6088,16 @@ namespace dxvk {
VkPipelineStageFlags stages,
VkAccessFlags access) {
if constexpr (DoEmit) {
m_execBarriers.accessImage(
imageView->image(),
accessImage(DxvkCmdBuffer::ExecBuffer,
*imageView->image(),
imageView->imageSubresources(),
imageView->image()->info().layout,
stages, access,
imageView->image()->info().layout,
imageView->image()->info().stages,
imageView->image()->info().access);
stages, access);
return false;
} else {
DxvkAccessFlags dstAccess = DxvkBarrierSet::getAccessTypes(access);
bool dirty = m_execBarriers.isImageDirty(
imageView->image(),
imageView->imageSubresources(),
dstAccess);
if (!dirty || dstAccess.test(DxvkAccess::Read) || !this->canIgnoreWawHazards(stages))
return dirty;
DxvkAccessFlags srcAccess = m_execBarriers.getImageAccess(
imageView->image(), imageView->imageSubresources());
return srcAccess.test(DxvkAccess::Read);
return checkResourceBarrier([this, &imageView] (DxvkAccess access) {
return resourceHasAccess(*imageView, access);
}, stages, access);
}
}
@ -6857,6 +6826,15 @@ namespace dxvk {
}
bool DxvkContext::resourceHasAccess(
DxvkBufferView& bufferView,
DxvkAccess access) {
return resourceHasAccess(*bufferView.buffer(),
bufferView.info().offset,
bufferView.info().size, access);
}
bool DxvkContext::resourceHasAccess(
DxvkImageView& imageView,
DxvkAccess access) {

View File

@ -1892,13 +1892,35 @@ namespace dxvk {
DxvkAccess access);
bool resourceHasAccess(
DxvkBufferView& buffer,
DxvkBufferView& bufferView,
DxvkAccess access);
bool resourceHasAccess(
DxvkImageView& imageView,
DxvkAccess access);
template<typename Pred>
bool checkResourceBarrier(
const Pred& pred,
VkPipelineStageFlags stages,
VkAccessFlags access) {
// Check for read-after-write first, this is common
bool hasPendingWrite = pred(DxvkAccess::Write);
if (access & vk::AccessReadMask)
return hasPendingWrite;
// Check for a write-after-write hazard, but
// ignore it if there are no reads involved.
bool ignoreWaW = canIgnoreWawHazards(stages);
if (hasPendingWrite && !ignoreWaW)
return true;
// Check whether there are any pending reads.
return pred(DxvkAccess::Read);
}
static bool formatsAreCopyCompatible(
VkFormat imageFormat,
VkFormat bufferFormat);