From 5bcdc704b8bbf0e629ee7189ec9ff7187e74a3ed Mon Sep 17 00:00:00 2001 From: Sargun Vohra Date: Fri, 24 Jul 2026 01:11:26 -0700 Subject: [PATCH] core: Drain WebGPU render-thread cleanup jobs (#4367) --- .../src/cpp/android_webgpu_renderer_backend.cpp | 2 ++ platform/glfw/glfw_webgpu_backend_impl.ipp | 2 ++ platform/ios/src/MLNMapView+WebGPU.mm | 2 ++ src/mbgl/webgpu/context.cpp | 10 ++++++---- src/mbgl/webgpu/headless_backend.cpp | 1 + src/mbgl/webgpu/renderer_backend.cpp | 4 +++- 6 files changed, 16 insertions(+), 5 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/cpp/android_webgpu_renderer_backend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_webgpu_renderer_backend.cpp index 40fa22816..b3b1831be 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_webgpu_renderer_backend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_webgpu_renderer_backend.cpp @@ -310,6 +310,8 @@ AndroidWebGPURendererBackend::AndroidWebGPURendererBackend(ANativeWindow* window } AndroidWebGPURendererBackend::~AndroidWebGPURendererBackend() { + context.reset(); + if (impl) { if (impl->currentTextureView) { wgpuTextureViewRelease(impl->currentTextureView); diff --git a/platform/glfw/glfw_webgpu_backend_impl.ipp b/platform/glfw/glfw_webgpu_backend_impl.ipp index 36cc15961..9dafa0e05 100644 --- a/platform/glfw/glfw_webgpu_backend_impl.ipp +++ b/platform/glfw/glfw_webgpu_backend_impl.ipp @@ -751,6 +751,8 @@ GLFWWebGPUBackend::~GLFWWebGPUBackend() { // Mark any in-flight frame as completed so tear-down logic can continue. frameInProgress.store(false, std::memory_order_release); + context.reset(); + { std::lock_guard guard(textureStateLock); diff --git a/platform/ios/src/MLNMapView+WebGPU.mm b/platform/ios/src/MLNMapView+WebGPU.mm index 857728a0f..84eff2da1 100644 --- a/platform/ios/src/MLNMapView+WebGPU.mm +++ b/platform/ios/src/MLNMapView+WebGPU.mm @@ -231,6 +231,8 @@ MLNMapViewWebGPUImpl::MLNMapViewWebGPUImpl(MLNMapView* nativeView_) } MLNMapViewWebGPUImpl::~MLNMapViewWebGPUImpl() { + context.reset(); + if (!impl) return; if (impl->currentTextureView) { diff --git a/src/mbgl/webgpu/context.cpp b/src/mbgl/webgpu/context.cpp index 545789497..e2b41c263 100644 --- a/src/mbgl/webgpu/context.cpp +++ b/src/mbgl/webgpu/context.cpp @@ -53,10 +53,12 @@ Context::Context(RendererBackend& backend_) backend(backend_), globalUniformBuffers(std::make_unique()) {} -Context::~Context() = default; +Context::~Context() { + backend.getThreadPool().runRenderJobs(true /* closeQueue */); +} void Context::beginFrame() { - // Begin a new frame - WebGPU command recording starts here + backend.getThreadPool().runRenderJobs(); } void Context::endFrame() { @@ -64,11 +66,11 @@ void Context::endFrame() { } void Context::performCleanup() { - // Clean up unused resources + backend.getThreadPool().runRenderJobs(); } void Context::reduceMemoryUsage() { - // Free cached resources to reduce memory + backend.getThreadPool().runRenderJobs(); } std::unique_ptr Context::createOffscreenTexture(Size size, diff --git a/src/mbgl/webgpu/headless_backend.cpp b/src/mbgl/webgpu/headless_backend.cpp index 26ac0aef7..fb72f56bc 100644 --- a/src/mbgl/webgpu/headless_backend.cpp +++ b/src/mbgl/webgpu/headless_backend.cpp @@ -202,6 +202,7 @@ HeadlessBackend::HeadlessBackend(Size size_, SwapBehaviour swapBehaviour_, gfx:: HeadlessBackend::~HeadlessBackend() { // Explicitly reset the renderable resource setResource(nullptr); + context.reset(); if (impl) { // Clean up textures diff --git a/src/mbgl/webgpu/renderer_backend.cpp b/src/mbgl/webgpu/renderer_backend.cpp index 99e993a29..7f1bf11cb 100644 --- a/src/mbgl/webgpu/renderer_backend.cpp +++ b/src/mbgl/webgpu/renderer_backend.cpp @@ -46,7 +46,9 @@ RendererBackend::RendererBackend(const gfx::ContextMode contextMode_) : gfx::RendererBackend(contextMode_), impl(std::make_unique()) {} -RendererBackend::~RendererBackend() = default; +RendererBackend::~RendererBackend() { + context.reset(); +} void RendererBackend::activate() { // Activation logic if needed