From 16426db244daab61f7487b1eea80b7ea5f242ad4 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sun, 1 Mar 2026 23:02:54 +0800 Subject: [PATCH] [Chore] (MG_Backend/DirectVulkan): manage active renderpass inside RenderPassManager static functions --- .../DirectVulkan/Renderer/VkRenderPassManager.cpp | 6 ++++++ .../DirectVulkan/Renderer/VkRenderPassManager.h | 2 ++ .../DirectVulkan/Renderer/VulkanRenderer.cpp | 14 ++++++++++---- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp index 08264fe6..a8865f60 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp @@ -254,12 +254,18 @@ namespace MobileGL::MG_Backend::DirectVulkan { renderPassBeginInfo.pClearValues = clearValue.data(); vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); + s_activeRenderPass = &renderPassEntry; return true; } Bool VkRenderPassManager::EndRenderPass(VkCommandBuffer commandBuffer) { vkCmdEndRenderPass(commandBuffer); + s_activeRenderPass = nullptr; return true; } + + RenderPassEntry* VkRenderPassManager::GetActiveRenderPass() { + return s_activeRenderPass; + } } // namespace MobileGL::MG_Backend::DirectVulkan diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.h index 9d73d129..0850da3c 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.h @@ -71,6 +71,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { RenderPassEntry& GetOrCreateRenderPass(const MG_State::GLState::FramebufferObject& fbo); static Bool BeginRenderPass(VkCommandBuffer commandBuffer, RenderPassEntry& renderPassEntry); static Bool EndRenderPass(VkCommandBuffer commandBuffer); + static RenderPassEntry* GetActiveRenderPass(); private: VkDevice m_device = VK_NULL_HANDLE; const VulkanRendererConfig& m_config; @@ -78,5 +79,6 @@ namespace MobileGL::MG_Backend::DirectVulkan { VkTextureManager& m_textureManager; UnorderedMap m_renderPasses; static inline XXH64_state_t* m_hashState = XXH64_createState(); + static inline RenderPassEntry* s_activeRenderPass = nullptr; }; } // namespace MobileGL::MG_Backend::DirectVulkan diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index 9a36fc60..afb68f40 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -510,11 +510,11 @@ namespace MobileGL::MG_Backend::DirectVulkan { // Begin render pass // TODO: properly deal with clear auto& renderPassEntry = m_renderPassManager->GetOrCreateRenderPass(*drawFbo); - if (m_activeRenderPass != &renderPassEntry) { - if (m_activeRenderPass) { + auto* activeRenderPass = VkRenderPassManager::GetActiveRenderPass(); + if (activeRenderPass != &renderPassEntry) { + if (activeRenderPass) { VkRenderPassManager::EndRenderPass(frame.commandBuffer); } - m_activeRenderPass = &renderPassEntry; Bool ok = VkRenderPassManager::BeginRenderPass(frame.commandBuffer, renderPassEntry); MOBILEGL_ASSERT(ok, "%s: BeginRenderPass failed", __func__); } else { @@ -637,7 +637,13 @@ namespace MobileGL::MG_Backend::DirectVulkan { MOBILEGL_ASSERT(m_imageIndexAcquired < m_swapchainObject.GetImageCount(), "Present, acquired image index out of range"); auto& frame = m_frameContext.GetCurrent(); - EndFrameRecordingIfNeeded(); + auto* activeRenderPass = VkRenderPassManager::GetActiveRenderPass(); + if (activeRenderPass) + VkRenderPassManager::EndRenderPass(frame.commandBuffer); + if (frame.isCommandRecording) { + m_frameContext.EndCommandRecording(); + frame.hasCommandBufferRecorded = true; + } const auto acquiredImageLayout = m_swapchainObject.GetImageLayout(m_imageIndexAcquired); const Bool needsLayoutTransitionForPresent =