diff options
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/VKTexture.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Vulkan/VKTexture.cpp | 59 |
1 files changed, 10 insertions, 49 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/VKTexture.cpp b/Source/Core/VideoBackends/Vulkan/VKTexture.cpp index 202bbaad0f..27b079a779 100644 --- a/Source/Core/VideoBackends/Vulkan/VKTexture.cpp +++ b/Source/Core/VideoBackends/Vulkan/VKTexture.cpp @@ -674,11 +674,7 @@ VKStagingTexture::VKStagingTexture(StagingTextureType type, const TextureConfig& { } -VKStagingTexture::~VKStagingTexture() -{ - if (m_needs_flush) - VKStagingTexture::Flush(); -} +VKStagingTexture::~VKStagingTexture() = default; std::unique_ptr<VKStagingTexture> VKStagingTexture::Create(StagingTextureType type, const TextureConfig& config) @@ -739,14 +735,6 @@ void VKStagingTexture::CopyFromTexture(const AbstractTexture* src, ASSERT(dst_rect.left >= 0 && static_cast<u32>(dst_rect.right) <= m_config.width && dst_rect.top >= 0 && static_cast<u32>(dst_rect.bottom) <= m_config.height); - if (m_needs_flush) - { - // Drop copy before reusing it. - g_command_buffer_mgr->RemoveFenceSignaledCallback(this); - m_flush_fence = VK_NULL_HANDLE; - m_needs_flush = false; - } - StateTracker::GetInstance()->EndRenderPass(); VkImageLayout old_layout = src_tex->GetLayout(); @@ -773,16 +761,7 @@ void VKStagingTexture::CopyFromTexture(const AbstractTexture* src, src_tex->TransitionToLayout(g_command_buffer_mgr->GetCurrentCommandBuffer(), old_layout); m_needs_flush = true; - m_flush_fence = g_command_buffer_mgr->GetCurrentCommandBufferFence(); - g_command_buffer_mgr->AddFenceSignaledCallback(this, [this](VkFence fence) { - if (m_flush_fence != fence) - return; - - m_flush_fence = VK_NULL_HANDLE; - m_needs_flush = false; - g_command_buffer_mgr->RemoveFenceSignaledCallback(this); - m_staging_buffer->InvalidateCPUCache(); - }); + m_flush_fence_counter = g_command_buffer_mgr->GetCurrentFenceCounter(); } void VKStagingTexture::CopyToTexture(const MathUtil::Rectangle<int>& src_rect, AbstractTexture* dst, @@ -798,14 +777,6 @@ void VKStagingTexture::CopyToTexture(const MathUtil::Rectangle<int>& src_rect, A ASSERT(dst_rect.left >= 0 && static_cast<u32>(dst_rect.right) <= dst_tex->GetWidth() && dst_rect.top >= 0 && static_cast<u32>(dst_rect.bottom) <= dst_tex->GetHeight()); - if (m_needs_flush) - { - // Drop copy before reusing it. - g_command_buffer_mgr->RemoveFenceSignaledCallback(this); - m_flush_fence = VK_NULL_HANDLE; - m_needs_flush = false; - } - // Flush caches before copying. m_staging_buffer->FlushCPUCache(); StateTracker::GetInstance()->EndRenderPass(); @@ -833,15 +804,7 @@ void VKStagingTexture::CopyToTexture(const MathUtil::Rectangle<int>& src_rect, A dst_tex->TransitionToLayout(g_command_buffer_mgr->GetCurrentCommandBuffer(), old_layout); m_needs_flush = true; - m_flush_fence = g_command_buffer_mgr->GetCurrentCommandBufferFence(); - g_command_buffer_mgr->AddFenceSignaledCallback(this, [this](VkFence fence) { - if (m_flush_fence != fence) - return; - - m_flush_fence = VK_NULL_HANDLE; - m_needs_flush = false; - g_command_buffer_mgr->RemoveFenceSignaledCallback(this); - }); + m_flush_fence_counter = g_command_buffer_mgr->GetCurrentFenceCounter(); } bool VKStagingTexture::Map() @@ -860,25 +823,23 @@ void VKStagingTexture::Flush() if (!m_needs_flush) return; - // Either of the below two calls will cause the callback to fire. - g_command_buffer_mgr->RemoveFenceSignaledCallback(this); - if (m_flush_fence == g_command_buffer_mgr->GetCurrentCommandBufferFence()) + // Is this copy in the current command buffer? + if (g_command_buffer_mgr->GetCurrentFenceCounter() == m_flush_fence_counter) { - // The readback is in the current command buffer, and we must execute it. + // Execute the command buffer and wait for it to finish. Renderer::GetInstance()->ExecuteCommandBuffer(false, true); } else { - // WaitForFence should fire the callback. - g_command_buffer_mgr->WaitForFence(m_flush_fence); + // Wait for the GPU to finish with it. + g_command_buffer_mgr->WaitForFenceCounter(m_flush_fence_counter); } - DEBUG_ASSERT(m_flush_fence == VK_NULL_HANDLE); - m_needs_flush = false; - // For readback textures, invalidate the CPU cache as there is new data there. if (m_type == StagingTextureType::Readback || m_type == StagingTextureType::Mutable) m_staging_buffer->InvalidateCPUCache(); + + m_needs_flush = false; } VKFramebuffer::VKFramebuffer(VKTexture* color_attachment, VKTexture* depth_attachment, u32 width, |
