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
parent 52def8dc27
commit 0df35447b3
6 changed files with 29 additions and 4 deletions

View file

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

View file

@ -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

View file

@ -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;
}
}

View file

@ -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);

View file

@ -59,6 +59,7 @@ void WgRenderer::release()
adapter = nullptr;
gpuOwner = false;
}
releaseSurfaceTexture();
}
@ -246,13 +247,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

View file

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