From 6e4d311ffc5a61c00df8e78a8faf1b55567852ab Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Mon, 5 Jan 2026 22:34:25 +0100 Subject: [PATCH] Also check RAW hazards on descriptor images and mark them as read at the start of render pass --- .../Latte/Renderer/Vulkan/VulkanRenderer.cpp | 8 +++++ .../HW/Latte/Renderer/Vulkan/VulkanRenderer.h | 2 ++ .../Renderer/Vulkan/VulkanRendererCore.cpp | 36 +++++++++++++++---- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp index 18fd1000..4dfc763f 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp @@ -3222,6 +3222,14 @@ void VulkanRenderer::ProcessDestructionQueue() m_spinlockDestructionQueue.unlock(); } +void VkDescriptorSetInfo::ForEachView(const std::function& fun) +{ + for (auto& view : list_referencedViews) + { + fun(view); + } +} + VkDescriptorSetInfo::~VkDescriptorSetInfo() { for (auto& it : list_referencedViews) diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h index 0995c5af..351d89c6 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h @@ -27,6 +27,8 @@ struct VkDescriptorSetInfo { VKRObjectDescriptorSet* m_vkObjDescriptorSet{}; + void ForEachView(const std::function& fun); + ~VkDescriptorSetInfo(); std::vector list_referencedViews; diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp index 706ee259..df235d66 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp @@ -1034,18 +1034,29 @@ void VulkanRenderer::sync_RenderPassLoadTextures(CachedFBOVk* fboVk) { bool flushRequired = false; - for (auto& tex : fboVk->GetTextures()) - { - LatteTextureVk* texVk = (LatteTextureVk*)tex; - + auto checkImageSyncHazard = [&](LatteTextureVk* texVk, bool isWrite = false) { //RAW / WAW if (texVk->m_vkFlushIndex_write == m_state.currentFlushIndex) flushRequired = true; //WAR - if (texVk->m_vkFlushIndex_read == m_state.currentFlushIndex) + if (isWrite && texVk->m_vkFlushIndex_read == m_state.currentFlushIndex) flushRequired = true; + }; + + for (auto& tex : fboVk->GetTextures()) + checkImageSyncHazard((LatteTextureVk*)tex, true); + + auto checkViewSync = [&](LatteTextureViewVk* view) { + checkImageSyncHazard(view->GetBaseImage()); + }; + + if (m_state.activeVertexDS) + m_state.activeVertexDS->ForEachView(checkViewSync); + if (m_state.activeGeometryDS) + m_state.activeGeometryDS->ForEachView(checkViewSync); + if (m_state.activePixelDS) + m_state.activePixelDS->ForEachView(checkViewSync); - } if (flushRequired) sync_performFlushBarrier(); @@ -1054,6 +1065,19 @@ void VulkanRenderer::sync_RenderPassLoadTextures(CachedFBOVk* fboVk) LatteTextureVk* texVk = (LatteTextureVk*)tex; texVk->m_vkFlushIndex_read = m_state.currentFlushIndex; } + + auto updateViewSync = [&](LatteTextureViewVk* view) { + view->GetBaseImage()->m_vkFlushIndex_read = m_state.currentFlushIndex; + }; + + if (m_state.activeVertexDS) + m_state.activeVertexDS->ForEachView(updateViewSync); + if (m_state.activeGeometryDS) + m_state.activeGeometryDS->ForEachView(updateViewSync); + if (m_state.activePixelDS) + m_state.activePixelDS->ForEachView(updateViewSync); + + } void VulkanRenderer::sync_RenderPassStoreTextures(CachedFBOVk* fboVk)