mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 21:53:41 +00:00
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:
parent
889d1d1fa2
commit
1932107097
2 changed files with 21 additions and 2 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
Loading…
Add table
Reference in a new issue