[Chore] (MG_Backend/DirectVulkan): manage active renderpass inside RenderPassManager static functions

This commit is contained in:
2026-03-01 23:02:54 +08:00
parent 6f8c76f06c
commit 16426db244
3 changed files with 18 additions and 4 deletions
@@ -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
@@ -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<Uint64, RenderPassEntry> m_renderPasses;
static inline XXH64_state_t* m_hashState = XXH64_createState();
static inline RenderPassEntry* s_activeRenderPass = nullptr;
};
} // namespace MobileGL::MG_Backend::DirectVulkan
@@ -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 =