mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 14:18:31 +09:00
[Chore] (MG_Backend/DirectVulkan): manage active renderpass inside RenderPassManager static functions
This commit is contained in:
@@ -254,12 +254,18 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
renderPassBeginInfo.pClearValues = clearValue.data();
|
renderPassBeginInfo.pClearValues = clearValue.data();
|
||||||
|
|
||||||
vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
|
vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
|
||||||
|
s_activeRenderPass = &renderPassEntry;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool VkRenderPassManager::EndRenderPass(VkCommandBuffer commandBuffer) {
|
Bool VkRenderPassManager::EndRenderPass(VkCommandBuffer commandBuffer) {
|
||||||
vkCmdEndRenderPass(commandBuffer);
|
vkCmdEndRenderPass(commandBuffer);
|
||||||
|
s_activeRenderPass = nullptr;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RenderPassEntry* VkRenderPassManager::GetActiveRenderPass() {
|
||||||
|
return s_activeRenderPass;
|
||||||
|
}
|
||||||
} // namespace MobileGL::MG_Backend::DirectVulkan
|
} // namespace MobileGL::MG_Backend::DirectVulkan
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
RenderPassEntry& GetOrCreateRenderPass(const MG_State::GLState::FramebufferObject& fbo);
|
RenderPassEntry& GetOrCreateRenderPass(const MG_State::GLState::FramebufferObject& fbo);
|
||||||
static Bool BeginRenderPass(VkCommandBuffer commandBuffer, RenderPassEntry& renderPassEntry);
|
static Bool BeginRenderPass(VkCommandBuffer commandBuffer, RenderPassEntry& renderPassEntry);
|
||||||
static Bool EndRenderPass(VkCommandBuffer commandBuffer);
|
static Bool EndRenderPass(VkCommandBuffer commandBuffer);
|
||||||
|
static RenderPassEntry* GetActiveRenderPass();
|
||||||
private:
|
private:
|
||||||
VkDevice m_device = VK_NULL_HANDLE;
|
VkDevice m_device = VK_NULL_HANDLE;
|
||||||
const VulkanRendererConfig& m_config;
|
const VulkanRendererConfig& m_config;
|
||||||
@@ -78,5 +79,6 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
VkTextureManager& m_textureManager;
|
VkTextureManager& m_textureManager;
|
||||||
UnorderedMap<Uint64, RenderPassEntry> m_renderPasses;
|
UnorderedMap<Uint64, RenderPassEntry> m_renderPasses;
|
||||||
static inline XXH64_state_t* m_hashState = XXH64_createState();
|
static inline XXH64_state_t* m_hashState = XXH64_createState();
|
||||||
|
static inline RenderPassEntry* s_activeRenderPass = nullptr;
|
||||||
};
|
};
|
||||||
} // namespace MobileGL::MG_Backend::DirectVulkan
|
} // namespace MobileGL::MG_Backend::DirectVulkan
|
||||||
|
|||||||
@@ -510,11 +510,11 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
// Begin render pass
|
// Begin render pass
|
||||||
// TODO: properly deal with clear
|
// TODO: properly deal with clear
|
||||||
auto& renderPassEntry = m_renderPassManager->GetOrCreateRenderPass(*drawFbo);
|
auto& renderPassEntry = m_renderPassManager->GetOrCreateRenderPass(*drawFbo);
|
||||||
if (m_activeRenderPass != &renderPassEntry) {
|
auto* activeRenderPass = VkRenderPassManager::GetActiveRenderPass();
|
||||||
if (m_activeRenderPass) {
|
if (activeRenderPass != &renderPassEntry) {
|
||||||
|
if (activeRenderPass) {
|
||||||
VkRenderPassManager::EndRenderPass(frame.commandBuffer);
|
VkRenderPassManager::EndRenderPass(frame.commandBuffer);
|
||||||
}
|
}
|
||||||
m_activeRenderPass = &renderPassEntry;
|
|
||||||
Bool ok = VkRenderPassManager::BeginRenderPass(frame.commandBuffer, renderPassEntry);
|
Bool ok = VkRenderPassManager::BeginRenderPass(frame.commandBuffer, renderPassEntry);
|
||||||
MOBILEGL_ASSERT(ok, "%s: BeginRenderPass failed", __func__);
|
MOBILEGL_ASSERT(ok, "%s: BeginRenderPass failed", __func__);
|
||||||
} else {
|
} else {
|
||||||
@@ -637,7 +637,13 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
|||||||
MOBILEGL_ASSERT(m_imageIndexAcquired < m_swapchainObject.GetImageCount(),
|
MOBILEGL_ASSERT(m_imageIndexAcquired < m_swapchainObject.GetImageCount(),
|
||||||
"Present, acquired image index out of range");
|
"Present, acquired image index out of range");
|
||||||
auto& frame = m_frameContext.GetCurrent();
|
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 auto acquiredImageLayout = m_swapchainObject.GetImageLayout(m_imageIndexAcquired);
|
||||||
const Bool needsLayoutTransitionForPresent =
|
const Bool needsLayoutTransitionForPresent =
|
||||||
|
|||||||
Reference in New Issue
Block a user