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:
parent
4b94b8989d
commit
56a58095fe
@ -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) {
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user