wg_engine: fix dispose render data in MT environment

Store desposed object in MT-safe list and then despose objects in sync stage
This commit is contained in:
Sergii Liebodkin 2024-07-05 14:12:31 +00:00 committed by Hermet Park
parent 889d1d1fa2
commit 1932107097
2 changed files with 21 additions and 2 deletions

View file

@ -50,6 +50,7 @@ void WgRenderer::initialize()
void WgRenderer::release() void WgRenderer::release()
{ {
clearDisposes();
WgGeometryData::gMath->release(); WgGeometryData::gMath->release();
delete WgGeometryData::gMath; delete WgGeometryData::gMath;
mRenderDataShapePool.release(mContext); mRenderDataShapePool.release(mContext);
@ -221,15 +222,25 @@ bool WgRenderer::postRender()
} }
void WgRenderer::dispose(RenderData data) void WgRenderer::dispose(RenderData data) {
{
auto renderData = (WgRenderDataPaint*)data; auto renderData = (WgRenderDataPaint*)data;
if (renderData) { 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) if (renderData->type() == Type::Shape)
mRenderDataShapePool.free(mContext, (WgRenderDataShape*)renderData); mRenderDataShapePool.free(mContext, (WgRenderDataShape*)renderData);
else else
renderData->release(mContext); renderData->release(mContext);
} }
mDisposed.renderDatas.clear();
} }
@ -277,6 +288,7 @@ bool WgRenderer::clear()
bool WgRenderer::sync() bool WgRenderer::sync()
{ {
clearDisposes();
WGPUSurfaceTexture backBuffer{}; WGPUSurfaceTexture backBuffer{};
wgpuSurfaceGetCurrentTexture(mContext.surface, &backBuffer); wgpuSurfaceGetCurrentTexture(mContext.surface, &backBuffer);

View file

@ -88,6 +88,13 @@ private:
Surface mTargetSurface; Surface mTargetSurface;
// current blend method // current blend method
BlendMethod mBlendMethod{}; BlendMethod mBlendMethod{};
// disposed resources, they should be released on synced call.
struct {
Array<RenderData> renderDatas{};
Key key;
} mDisposed;
void clearDisposes();
}; };
#endif /* _TVG_WG_RENDERER_H_ */ #endif /* _TVG_WG_RENDERER_H_ */