diff --git a/src/renderer/wg_engine/tvgWgRenderer.cpp b/src/renderer/wg_engine/tvgWgRenderer.cpp index a9614381..7effac65 100644 --- a/src/renderer/wg_engine/tvgWgRenderer.cpp +++ b/src/renderer/wg_engine/tvgWgRenderer.cpp @@ -50,6 +50,7 @@ void WgRenderer::initialize() void WgRenderer::release() { + clearDisposes(); WgGeometryData::gMath->release(); delete WgGeometryData::gMath; mRenderDataShapePool.release(mContext); @@ -221,15 +222,25 @@ bool WgRenderer::postRender() } -void WgRenderer::dispose(RenderData data) -{ +void WgRenderer::dispose(RenderData data) { auto renderData = (WgRenderDataPaint*)data; if (renderData) { + ScopedLock lock(mDisposed.key); + mDisposed.renderDatas.push(data); + } +} + + +void WgRenderer::clearDisposes() +{ + for (uint32_t i = 0; i < mDisposed.renderDatas.count; i++) { + auto renderData = (WgRenderDataPaint*)mDisposed.renderDatas[i]; if (renderData->type() == Type::Shape) mRenderDataShapePool.free(mContext, (WgRenderDataShape*)renderData); else renderData->release(mContext); } + mDisposed.renderDatas.clear(); } @@ -277,6 +288,7 @@ bool WgRenderer::clear() bool WgRenderer::sync() { + clearDisposes(); WGPUSurfaceTexture backBuffer{}; wgpuSurfaceGetCurrentTexture(mContext.surface, &backBuffer); diff --git a/src/renderer/wg_engine/tvgWgRenderer.h b/src/renderer/wg_engine/tvgWgRenderer.h index e13fcdef..708d5263 100644 --- a/src/renderer/wg_engine/tvgWgRenderer.h +++ b/src/renderer/wg_engine/tvgWgRenderer.h @@ -88,6 +88,13 @@ private: Surface mTargetSurface; // current blend method BlendMethod mBlendMethod{}; + + // disposed resources, they should be released on synced call. + struct { + Array renderDatas{}; + Key key; + } mDisposed; + void clearDisposes(); }; #endif /* _TVG_WG_RENDERER_H_ */