mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-21 22:54:16 +01:00
[dxvk] Use new barrier batch for init and sdma barriers
No tracking needed here.
This commit is contained in:
parent
50b1932aea
commit
318e79c2ad
@ -4541,16 +4541,30 @@ namespace dxvk {
|
|||||||
dataOffset += mipSize;
|
dataOffset += mipSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_sdmaBarriers.releaseImage(m_initBarriers,
|
if (m_device->hasDedicatedTransferQueue()) {
|
||||||
image, image->getAvailableSubresources(),
|
VkImageMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 };
|
||||||
m_device->queues().transfer.queueFamily,
|
barrier.srcStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT;
|
||||||
transferLayout,
|
barrier.srcAccessMask = VK_ACCESS_2_TRANSFER_WRITE_BIT;
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
barrier.oldLayout = transferLayout;
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
barrier.newLayout = image->info().layout;
|
||||||
m_device->queues().graphics.queueFamily,
|
barrier.srcQueueFamilyIndex = m_device->queues().transfer.queueFamily;
|
||||||
image->info().layout,
|
barrier.dstQueueFamilyIndex = m_device->queues().graphics.queueFamily;
|
||||||
image->info().stages,
|
barrier.image = image->handle();
|
||||||
image->info().access);
|
barrier.subresourceRange = image->getAvailableSubresources();
|
||||||
|
|
||||||
|
m_sdmaBarriers.addImageBarrier(barrier);
|
||||||
|
|
||||||
|
barrier.srcStageMask = VK_PIPELINE_STAGE_2_NONE;
|
||||||
|
barrier.srcAccessMask = VK_ACCESS_2_NONE;
|
||||||
|
barrier.dstStageMask = image->info().stages;
|
||||||
|
barrier.dstAccessMask = image->info().access;
|
||||||
|
|
||||||
|
m_initBarriers.addImageBarrier(barrier);
|
||||||
|
} else {
|
||||||
|
accessImage(DxvkCmdBuffer::SdmaBuffer,
|
||||||
|
*image, image->getAvailableSubresources(), transferLayout,
|
||||||
|
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT);
|
||||||
|
}
|
||||||
|
|
||||||
m_cmd->trackResource<DxvkAccess::Read>(source);
|
m_cmd->trackResource<DxvkAccess::Read>(source);
|
||||||
m_cmd->trackResource<DxvkAccess::Write>(image);
|
m_cmd->trackResource<DxvkAccess::Write>(image);
|
||||||
@ -6861,15 +6875,21 @@ namespace dxvk {
|
|||||||
VkAccessFlags2 srcAccess,
|
VkAccessFlags2 srcAccess,
|
||||||
VkPipelineStageFlags2 dstStages,
|
VkPipelineStageFlags2 dstStages,
|
||||||
VkAccessFlags2 dstAccess) {
|
VkAccessFlags2 dstAccess) {
|
||||||
auto* batch = &m_execBarriers;
|
if (likely(cmdBuffer == DxvkCmdBuffer::ExecBuffer)) {
|
||||||
|
m_execBarriers.accessMemory(srcStages, srcAccess, dstStages, dstAccess);
|
||||||
|
} else {
|
||||||
|
auto& batch = cmdBuffer == DxvkCmdBuffer::InitBuffer
|
||||||
|
? m_initBarriers
|
||||||
|
: m_sdmaBarriers;
|
||||||
|
|
||||||
if (cmdBuffer != DxvkCmdBuffer::ExecBuffer) {
|
VkMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER_2 };
|
||||||
batch = cmdBuffer == DxvkCmdBuffer::InitBuffer
|
barrier.srcStageMask = srcStages;
|
||||||
? &m_initBarriers
|
barrier.srcAccessMask = srcAccess;
|
||||||
: &m_sdmaBarriers;
|
barrier.dstStageMask = dstStages;
|
||||||
|
barrier.dstAccessMask = dstAccess;
|
||||||
|
|
||||||
|
batch.addMemoryBarrier(barrier);
|
||||||
}
|
}
|
||||||
|
|
||||||
batch->accessMemory(srcStages, srcAccess, dstStages, dstAccess);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -6898,17 +6918,29 @@ namespace dxvk {
|
|||||||
VkImageLayout dstLayout,
|
VkImageLayout dstLayout,
|
||||||
VkPipelineStageFlags2 dstStages,
|
VkPipelineStageFlags2 dstStages,
|
||||||
VkAccessFlags2 dstAccess) {
|
VkAccessFlags2 dstAccess) {
|
||||||
auto* batch = &m_execBarriers;
|
if (likely(cmdBuffer == DxvkCmdBuffer::ExecBuffer)) {
|
||||||
|
m_execBarriers.accessImage(&image, subresources,
|
||||||
|
srcLayout, srcStages, srcAccess,
|
||||||
|
dstLayout, dstStages, dstAccess);
|
||||||
|
} else {
|
||||||
|
auto& batch = cmdBuffer == DxvkCmdBuffer::InitBuffer
|
||||||
|
? m_initBarriers
|
||||||
|
: m_sdmaBarriers;
|
||||||
|
|
||||||
if (cmdBuffer != DxvkCmdBuffer::ExecBuffer) {
|
VkImageMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 };
|
||||||
batch = cmdBuffer == DxvkCmdBuffer::InitBuffer
|
barrier.srcStageMask = srcStages;
|
||||||
? &m_initBarriers
|
barrier.srcAccessMask = srcAccess;
|
||||||
: &m_sdmaBarriers;
|
barrier.dstStageMask = dstStages;
|
||||||
|
barrier.dstAccessMask = dstAccess;
|
||||||
|
barrier.oldLayout = srcLayout;
|
||||||
|
barrier.newLayout = dstLayout;
|
||||||
|
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
barrier.image = image.handle();
|
||||||
|
barrier.subresourceRange = subresources;
|
||||||
|
|
||||||
|
batch.addImageBarrier(barrier);
|
||||||
}
|
}
|
||||||
|
|
||||||
batch->accessImage(&image, subresources,
|
|
||||||
srcLayout, srcStages, srcAccess,
|
|
||||||
dstLayout, dstStages, dstAccess);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -6935,19 +6967,22 @@ namespace dxvk {
|
|||||||
VkAccessFlags2 srcAccess,
|
VkAccessFlags2 srcAccess,
|
||||||
VkPipelineStageFlags2 dstStages,
|
VkPipelineStageFlags2 dstStages,
|
||||||
VkAccessFlags2 dstAccess) {
|
VkAccessFlags2 dstAccess) {
|
||||||
auto* batch = &m_execBarriers;
|
if (likely(cmdBuffer == DxvkCmdBuffer::ExecBuffer)) {
|
||||||
|
DxvkBufferSliceHandle slice = buffer.getSliceHandle(offset, size);
|
||||||
|
m_execBarriers.accessBuffer(slice, srcStages, srcAccess, dstStages, dstAccess);
|
||||||
|
} else {
|
||||||
|
auto& batch = cmdBuffer == DxvkCmdBuffer::InitBuffer
|
||||||
|
? m_initBarriers
|
||||||
|
: m_sdmaBarriers;
|
||||||
|
|
||||||
if (cmdBuffer != DxvkCmdBuffer::ExecBuffer) {
|
VkMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER_2 };
|
||||||
batch = cmdBuffer == DxvkCmdBuffer::InitBuffer
|
barrier.srcStageMask = srcStages;
|
||||||
? &m_initBarriers
|
barrier.srcAccessMask = srcAccess;
|
||||||
: &m_sdmaBarriers;
|
barrier.dstStageMask = dstStages;
|
||||||
|
barrier.dstAccessMask = dstAccess;
|
||||||
|
|
||||||
|
batch.addMemoryBarrier(barrier);
|
||||||
}
|
}
|
||||||
|
|
||||||
DxvkBufferSliceHandle slice = buffer.getSliceHandle(offset, size);
|
|
||||||
|
|
||||||
batch->accessBuffer(slice,
|
|
||||||
srcStages, srcAccess,
|
|
||||||
dstStages, dstAccess);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1406,8 +1406,8 @@ namespace dxvk {
|
|||||||
Rc<DxvkDescriptorPool> m_descriptorPool;
|
Rc<DxvkDescriptorPool> m_descriptorPool;
|
||||||
Rc<DxvkDescriptorManager> m_descriptorManager;
|
Rc<DxvkDescriptorManager> m_descriptorManager;
|
||||||
|
|
||||||
DxvkBarrierSet m_sdmaBarriers;
|
DxvkBarrierBatch m_sdmaBarriers;
|
||||||
DxvkBarrierSet m_initBarriers;
|
DxvkBarrierBatch m_initBarriers;
|
||||||
DxvkBarrierSet m_execBarriers;
|
DxvkBarrierSet m_execBarriers;
|
||||||
DxvkBarrierControlFlags m_barrierControl;
|
DxvkBarrierControlFlags m_barrierControl;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user