mirror of
https://github.com/cemu-project/Cemu.git
synced 2026-04-16 05:11:28 -06:00
Remove all except one global memory barrier
This commit is contained in:
parent
cc01133d06
commit
753a667cd0
@ -124,12 +124,8 @@ void LatteTextureReadbackInfoVk::StartTransfer()
|
||||
|
||||
renderer->barrier_image<VulkanRenderer::ANY_TRANSFER | VulkanRenderer::IMAGE_WRITE, VulkanRenderer::TRANSFER_READ>(baseTexture, region.imageSubresource, VK_IMAGE_LAYOUT_GENERAL);
|
||||
|
||||
renderer->barrier_sequentializeTransfer();
|
||||
|
||||
vkCmdCopyImageToBuffer(renderer->getCurrentCommandBuffer(), baseTexture->GetImageObj()->m_image, VK_IMAGE_LAYOUT_GENERAL, m_buffer, 1, ®ion);
|
||||
|
||||
renderer->barrier_sequentializeTransfer();
|
||||
|
||||
renderer->barrier_image<VulkanRenderer::TRANSFER_READ, VulkanRenderer::ANY_TRANSFER | VulkanRenderer::IMAGE_WRITE>(baseTexture, region.imageSubresource, VK_IMAGE_LAYOUT_GENERAL); // make sure transfer is finished before image is modified
|
||||
renderer->barrier_bufferRange<VulkanRenderer::TRANSFER_WRITE, VulkanRenderer::HOST_READ>(m_buffer, m_buffer_offset, m_image_size); // make sure transfer is finished before result is read
|
||||
|
||||
|
||||
@ -3709,9 +3709,9 @@ void VulkanRenderer::bufferCache_upload(uint8* buffer, sint32 size, uint32 buffe
|
||||
|
||||
vkMemAllocator.FlushReservation(uploadResv);
|
||||
|
||||
barrier_bufferRange<ANY_TRANSFER | HOST_WRITE, ANY_TRANSFER,
|
||||
BUFFER_SHADER_READ, TRANSFER_WRITE>(
|
||||
uploadResv.vkBuffer, uploadResv.bufferOffset, uploadResv.size, // make sure any in-flight transfers are completed
|
||||
barrier_bufferRange<TRANSFER_WRITE | HOST_WRITE, TRANSFER_READ,
|
||||
TRANSFER_READ | BUFFER_SHADER_READ, TRANSFER_WRITE>(
|
||||
uploadResv.vkBuffer, uploadResv.bufferOffset, uploadResv.size, // make sure source data is visible
|
||||
m_bufferCache, bufferOffset, size); // make sure all reads are completed before we overwrite the data
|
||||
|
||||
VkBufferCopy region;
|
||||
@ -3720,7 +3720,7 @@ void VulkanRenderer::bufferCache_upload(uint8* buffer, sint32 size, uint32 buffe
|
||||
region.size = size;
|
||||
vkCmdCopyBuffer(m_state.currentCommandBuffer, uploadResv.vkBuffer, m_bufferCache, 1, ®ion);
|
||||
|
||||
barrier_sequentializeTransfer();
|
||||
barrier_bufferRange<TRANSFER_WRITE, BUFFER_SHADER_READ>(m_bufferCache, bufferOffset, size);
|
||||
}
|
||||
|
||||
void VulkanRenderer::bufferCache_copy(uint32 srcOffset, uint32 dstOffset, uint32 size)
|
||||
@ -3728,7 +3728,10 @@ void VulkanRenderer::bufferCache_copy(uint32 srcOffset, uint32 dstOffset, uint32
|
||||
cemu_assert_debug(!m_useHostMemoryForCache);
|
||||
draw_endRenderPass();
|
||||
|
||||
barrier_sequentializeTransfer();
|
||||
barrier_bufferRange<BUFFER_SHADER_WRITE | TRANSFER_WRITE, TRANSFER_READ,
|
||||
TRANSFER_READ | BUFFER_SHADER_READ, TRANSFER_WRITE>(
|
||||
m_bufferCache, srcOffset, size, // make sure source data is visible
|
||||
m_bufferCache, dstOffset, size); // make sure all reads are completed before we overwrite the data
|
||||
|
||||
bool isOverlapping = (srcOffset + size) > dstOffset && (srcOffset) < (dstOffset + size);
|
||||
cemu_assert_debug(!isOverlapping);
|
||||
@ -3739,7 +3742,7 @@ void VulkanRenderer::bufferCache_copy(uint32 srcOffset, uint32 dstOffset, uint32
|
||||
bufferCopy.size = size;
|
||||
vkCmdCopyBuffer(m_state.currentCommandBuffer, m_bufferCache, m_bufferCache, 1, &bufferCopy);
|
||||
|
||||
barrier_sequentializeTransfer();
|
||||
barrier_bufferRange<TRANSFER_WRITE, BUFFER_SHADER_READ>(m_bufferCache, dstOffset, size);
|
||||
}
|
||||
|
||||
void VulkanRenderer::bufferCache_copyStreamoutToMainBuffer(uint32 srcOffset, uint32 dstOffset, uint32 size)
|
||||
@ -3756,12 +3759,10 @@ void VulkanRenderer::bufferCache_copyStreamoutToMainBuffer(uint32 srcOffset, uin
|
||||
else
|
||||
dstBuffer = m_bufferCache;
|
||||
|
||||
barrier_bufferRange<BUFFER_SHADER_WRITE, TRANSFER_READ,
|
||||
ANY_TRANSFER | BUFFER_SHADER_READ, TRANSFER_WRITE>(
|
||||
m_xfbRingBuffer, srcOffset, size, // wait for all writes to finish
|
||||
dstBuffer, dstOffset, size); // wait for all reads to finish
|
||||
|
||||
barrier_sequentializeTransfer();
|
||||
barrier_bufferRange<BUFFER_SHADER_WRITE | TRANSFER_WRITE, TRANSFER_READ,
|
||||
TRANSFER_READ | BUFFER_SHADER_READ, TRANSFER_WRITE>(
|
||||
m_xfbRingBuffer, srcOffset, size, // make sure source data is visible
|
||||
dstBuffer, dstOffset, size); // make sure all reads are completed before we overwrite the data
|
||||
|
||||
VkBufferCopy bufferCopy{};
|
||||
bufferCopy.srcOffset = srcOffset;
|
||||
@ -3769,7 +3770,7 @@ void VulkanRenderer::bufferCache_copyStreamoutToMainBuffer(uint32 srcOffset, uin
|
||||
bufferCopy.size = size;
|
||||
vkCmdCopyBuffer(m_state.currentCommandBuffer, m_xfbRingBuffer, dstBuffer, 1, &bufferCopy);
|
||||
|
||||
barrier_sequentializeTransfer();
|
||||
barrier_bufferRange<TRANSFER_WRITE, BUFFER_SHADER_READ>(dstBuffer, dstOffset, size); // make sure writes are visible to host
|
||||
}
|
||||
|
||||
void VulkanRenderer::AppendOverlayDebugInfo()
|
||||
|
||||
@ -871,34 +871,6 @@ private:
|
||||
performanceMonitor.vk.numDrawBarriersPerFrame.increment();
|
||||
}
|
||||
|
||||
void barrier_sequentializeTransfer()
|
||||
{
|
||||
VkMemoryBarrier memBarrier{};
|
||||
memBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
|
||||
memBarrier.pNext = nullptr;
|
||||
|
||||
VkPipelineStageFlags srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT;
|
||||
VkPipelineStageFlags dstStages = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
|
||||
|
||||
memBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||
memBarrier.dstAccessMask = 0;
|
||||
|
||||
memBarrier.srcAccessMask |= (VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT);
|
||||
memBarrier.dstAccessMask |= (VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT);
|
||||
|
||||
vkCmdPipelineBarrier(m_state.currentCommandBuffer, srcStages, dstStages, 0, 1, &memBarrier, 0, nullptr, 0, nullptr);
|
||||
performanceMonitor.vk.numDrawBarriersPerFrame.increment();
|
||||
}
|
||||
|
||||
void barrier_sequentializeCommand()
|
||||
{
|
||||
VkPipelineStageFlags srcStages = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
||||
VkPipelineStageFlags dstStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
|
||||
|
||||
vkCmdPipelineBarrier(m_state.currentCommandBuffer, srcStages, dstStages, 0, 0, nullptr, 0, nullptr, 0, nullptr);
|
||||
performanceMonitor.vk.numDrawBarriersPerFrame.increment();
|
||||
}
|
||||
|
||||
template<uint32 TSrcSyncOp, uint32 TDstSyncOp>
|
||||
void barrier_image(VkImage imageVk, VkImageSubresourceRange& subresourceRange, VkImageLayout oldLayout, VkImageLayout newLayout)
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user