From a72ed0ddfab7fdee612c1652d7568db133f1d0ec Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 3 Oct 2024 22:24:43 +0900 Subject: [PATCH] wg_engine: fixed resource leaks issue: https://github.com/thorvg/thorvg/issues/2808 --- examples/Example.h | 2 +- src/renderer/tvgWgCanvas.cpp | 2 +- src/renderer/wg_engine/tvgWgCommon.cpp | 9 +++++++++ src/renderer/wg_engine/tvgWgCommon.h | 1 + src/renderer/wg_engine/tvgWgRenderer.cpp | 16 ++++++++++++++-- src/renderer/wg_engine/tvgWgRenderer.h | 3 +++ 6 files changed, 29 insertions(+), 4 deletions(-) diff --git a/examples/Example.h b/examples/Example.h index 253368ba..1143fed1 100644 --- a/examples/Example.h +++ b/examples/Example.h @@ -435,7 +435,7 @@ struct WgWindow : Window virtual ~WgWindow() { - //wgpuSurfaceRelease(surface); + wgpuSurfaceRelease(surface); wgpuInstanceRelease(instance); } diff --git a/src/renderer/tvgWgCanvas.cpp b/src/renderer/tvgWgCanvas.cpp index 9b3394b0..991f73fc 100644 --- a/src/renderer/tvgWgCanvas.cpp +++ b/src/renderer/tvgWgCanvas.cpp @@ -40,7 +40,7 @@ struct WgCanvas::Impl /************************************************************************/ #ifdef THORVG_WG_RASTER_SUPPORT -WgCanvas::WgCanvas() : Canvas(WgRenderer::gen()), pImpl(new Impl) +WgCanvas::WgCanvas() : Canvas(WgRenderer::gen()), pImpl(nullptr) #else WgCanvas::WgCanvas() : Canvas(nullptr), pImpl(nullptr) #endif diff --git a/src/renderer/wg_engine/tvgWgCommon.cpp b/src/renderer/wg_engine/tvgWgCommon.cpp index e89c283f..616f09bf 100755 --- a/src/renderer/wg_engine/tvgWgCommon.cpp +++ b/src/renderer/wg_engine/tvgWgCommon.cpp @@ -60,6 +60,7 @@ void WgContext::release() releaseSampler(samplerLinearRepeat); releaseSampler(samplerNearestRepeat); releaseBuffer(bufferIndexFan); + releaseQueue(queue); } @@ -258,3 +259,11 @@ void WgContext::releaseBuffer(WGPUBuffer& buffer) buffer = nullptr; } } + +void WgContext::releaseQueue(WGPUQueue queue) +{ + if (queue) { + wgpuQueueRelease(queue); + queue = nullptr; + } +} \ No newline at end of file diff --git a/src/renderer/wg_engine/tvgWgCommon.h b/src/renderer/wg_engine/tvgWgCommon.h index 89632e47..eaf011f6 100755 --- a/src/renderer/wg_engine/tvgWgCommon.h +++ b/src/renderer/wg_engine/tvgWgCommon.h @@ -63,6 +63,7 @@ struct WgContext { void releaseTextureView(WGPUTextureView& textureView); void releaseTexture(WGPUTexture& texture); void releaseSampler(WGPUSampler& sampler); + void releaseQueue(WGPUQueue queue); // create buffer objects (return true, if buffer handle was changed) bool allocateBufferUniform(WGPUBuffer& buffer, const void* data, uint64_t size); diff --git a/src/renderer/wg_engine/tvgWgRenderer.cpp b/src/renderer/wg_engine/tvgWgRenderer.cpp index 0eb84fbc..a418b285 100755 --- a/src/renderer/wg_engine/tvgWgRenderer.cpp +++ b/src/renderer/wg_engine/tvgWgRenderer.cpp @@ -59,6 +59,7 @@ void WgRenderer::release() adapter = nullptr; gpuOwner = false; } + releaseSurfaceTexture(); } @@ -247,13 +248,24 @@ bool WgRenderer::clear() } +void WgRenderer::releaseSurfaceTexture() +{ + if (surfaceTexture.texture) { + wgpuTextureRelease(surfaceTexture.texture); + surfaceTexture.texture = nullptr; + } +} + + bool WgRenderer::sync() { disposeObjects(); if (!surface) return false; - // get current texture - WGPUSurfaceTexture surfaceTexture{}; + + releaseSurfaceTexture(); + wgpuSurfaceGetCurrentTexture(surface, &surfaceTexture); + WGPUTextureView dstView = mContext.createTextureView(surfaceTexture.texture); // create command encoder diff --git a/src/renderer/wg_engine/tvgWgRenderer.h b/src/renderer/wg_engine/tvgWgRenderer.h index 9f22e368..043f5df2 100755 --- a/src/renderer/wg_engine/tvgWgRenderer.h +++ b/src/renderer/wg_engine/tvgWgRenderer.h @@ -67,6 +67,9 @@ private: void initialize(); void release(); void disposeObjects(); + void releaseSurfaceTexture(); + + WGPUSurfaceTexture surfaceTexture{}; WGPUCommandEncoder mCommandEncoder{}; WgRenderDataShapePool mRenderDataShapePool;