[Fix] (MG_Backend/DirectVulkan): separate EGL surface lifecycle

This commit is contained in:
2026-07-03 12:20:40 +08:00
parent afdbf0a194
commit 45f1a13cc3
4 changed files with 147 additions and 49 deletions
@@ -356,9 +356,16 @@ namespace MobileGL::MG_Backend::DirectVulkan {
auto nativeWindow = reinterpret_cast<NativeWindowType>(m_windowHandle.Handle);
pVulkanRenderer = MakeUnique<MG_Backend::DirectVulkan::VulkanRenderer>(nativeWindow);
MOBILEGL_ASSERT(pVulkanRenderer != nullptr, "InitWindowSurface: VulkanRenderer creation failed");
pVulkanRenderer->Initialize();
VulkanRendererConfig config;
config.SurfaceWidth = std::max<Uint32>(m_windowHandle.Width, 1);
config.SurfaceHeight = std::max<Uint32>(m_windowHandle.Height, 1);
if (pVulkanRenderer) {
pVulkanRenderer->BindSurface(nativeWindow, config);
} else {
pVulkanRenderer = MakeUnique<MG_Backend::DirectVulkan::VulkanRenderer>(nativeWindow, config);
MOBILEGL_ASSERT(pVulkanRenderer != nullptr, "InitWindowSurface: VulkanRenderer creation failed");
pVulkanRenderer->Initialize();
}
return true;
}
@@ -366,9 +373,13 @@ namespace MobileGL::MG_Backend::DirectVulkan {
VulkanRendererConfig config;
config.SurfaceWidth = static_cast<Uint32>(std::max<EGLint>(width, 1));
config.SurfaceHeight = static_cast<Uint32>(std::max<EGLint>(height, 1));
pVulkanRenderer = MakeUnique<MG_Backend::DirectVulkan::VulkanRenderer>(NativeWindowType{}, config);
MOBILEGL_ASSERT(pVulkanRenderer != nullptr, "InitPbufferSurface: VulkanRenderer creation failed");
pVulkanRenderer->Initialize();
if (pVulkanRenderer) {
pVulkanRenderer->BindSurface(NativeWindowType{}, config);
} else {
pVulkanRenderer = MakeUnique<MG_Backend::DirectVulkan::VulkanRenderer>(NativeWindowType{}, config);
MOBILEGL_ASSERT(pVulkanRenderer != nullptr, "InitPbufferSurface: VulkanRenderer creation failed");
pVulkanRenderer->Initialize();
}
return true;
}
@@ -474,7 +485,9 @@ namespace MobileGL::MG_Backend::DirectVulkan {
void BackendObject_DirectVulkan::OnEGLSurfaceReleased(EGLSurface surface) {
(void)surface;
pVulkanRenderer.reset();
if (pVulkanRenderer) {
pVulkanRenderer->ReleaseSurface();
}
}
const RendererInfo& BackendObject_DirectVulkan::GetRendererInfo() const {