wg_engine: fixed resource leaks

issue: https://github.com/thorvg/thorvg/issues/2808
This commit is contained in:
Hermet Park 2024-10-03 22:24:43 +09:00 committed by Jinny You
parent 1b599d82c4
commit a72ed0ddfa
6 changed files with 29 additions and 4 deletions

View file

@ -435,7 +435,7 @@ struct WgWindow : Window
virtual ~WgWindow() virtual ~WgWindow()
{ {
//wgpuSurfaceRelease(surface); wgpuSurfaceRelease(surface);
wgpuInstanceRelease(instance); wgpuInstanceRelease(instance);
} }

View file

@ -40,7 +40,7 @@ struct WgCanvas::Impl
/************************************************************************/ /************************************************************************/
#ifdef THORVG_WG_RASTER_SUPPORT #ifdef THORVG_WG_RASTER_SUPPORT
WgCanvas::WgCanvas() : Canvas(WgRenderer::gen()), pImpl(new Impl) WgCanvas::WgCanvas() : Canvas(WgRenderer::gen()), pImpl(nullptr)
#else #else
WgCanvas::WgCanvas() : Canvas(nullptr), pImpl(nullptr) WgCanvas::WgCanvas() : Canvas(nullptr), pImpl(nullptr)
#endif #endif

View file

@ -60,6 +60,7 @@ void WgContext::release()
releaseSampler(samplerLinearRepeat); releaseSampler(samplerLinearRepeat);
releaseSampler(samplerNearestRepeat); releaseSampler(samplerNearestRepeat);
releaseBuffer(bufferIndexFan); releaseBuffer(bufferIndexFan);
releaseQueue(queue);
} }
@ -258,3 +259,11 @@ void WgContext::releaseBuffer(WGPUBuffer& buffer)
buffer = nullptr; buffer = nullptr;
} }
} }
void WgContext::releaseQueue(WGPUQueue queue)
{
if (queue) {
wgpuQueueRelease(queue);
queue = nullptr;
}
}

View file

@ -63,6 +63,7 @@ struct WgContext {
void releaseTextureView(WGPUTextureView& textureView); void releaseTextureView(WGPUTextureView& textureView);
void releaseTexture(WGPUTexture& texture); void releaseTexture(WGPUTexture& texture);
void releaseSampler(WGPUSampler& sampler); void releaseSampler(WGPUSampler& sampler);
void releaseQueue(WGPUQueue queue);
// create buffer objects (return true, if buffer handle was changed) // create buffer objects (return true, if buffer handle was changed)
bool allocateBufferUniform(WGPUBuffer& buffer, const void* data, uint64_t size); bool allocateBufferUniform(WGPUBuffer& buffer, const void* data, uint64_t size);

View file

@ -59,6 +59,7 @@ void WgRenderer::release()
adapter = nullptr; adapter = nullptr;
gpuOwner = false; 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() bool WgRenderer::sync()
{ {
disposeObjects(); disposeObjects();
if (!surface) return false; if (!surface) return false;
// get current texture
WGPUSurfaceTexture surfaceTexture{}; releaseSurfaceTexture();
wgpuSurfaceGetCurrentTexture(surface, &surfaceTexture); wgpuSurfaceGetCurrentTexture(surface, &surfaceTexture);
WGPUTextureView dstView = mContext.createTextureView(surfaceTexture.texture); WGPUTextureView dstView = mContext.createTextureView(surfaceTexture.texture);
// create command encoder // create command encoder

View file

@ -67,6 +67,9 @@ private:
void initialize(); void initialize();
void release(); void release();
void disposeObjects(); void disposeObjects();
void releaseSurfaceTexture();
WGPUSurfaceTexture surfaceTexture{};
WGPUCommandEncoder mCommandEncoder{}; WGPUCommandEncoder mCommandEncoder{};
WgRenderDataShapePool mRenderDataShapePool; WgRenderDataShapePool mRenderDataShapePool;