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()
{
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);

View file

@ -88,6 +88,13 @@ private:
Surface mTargetSurface;
// current blend method
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_ */