engine: introduce scene effect dispose render method

to correctly remove RenderDate from effects it must be removed in the renderer
a new method has been added to the RenderMethod interface
This commit is contained in:
Sergii Liebodkin 2025-01-24 12:45:17 +00:00 committed by Hermet Park
parent ebe4935dd0
commit 0ecd2c0fd4
8 changed files with 29 additions and 6 deletions

View file

@ -968,6 +968,12 @@ bool GlRenderer::render(TVG_UNUSED RenderCompositor* cmp, TVG_UNUSED const Rende
} }
void GlRenderer::dispose(TVG_UNUSED RenderEffect* effect)
{
//TODO: dispose the effect
}
ColorSpace GlRenderer::colorSpace() ColorSpace GlRenderer::colorSpace()
{ {
return ColorSpace::Unknown; return ColorSpace::Unknown;

View file

@ -90,6 +90,7 @@ public:
void prepare(RenderEffect* effect, const Matrix& transform) override; void prepare(RenderEffect* effect, const Matrix& transform) override;
bool region(RenderEffect* effect) override; bool region(RenderEffect* effect) override;
bool render(RenderCompositor* cmp, const RenderEffect* effect, bool direct) override; bool render(RenderCompositor* cmp, const RenderEffect* effect, bool direct) override;
void dispose(TVG_UNUSED RenderEffect* effect) override;
static GlRenderer* gen(); static GlRenderer* gen();
static int init(TVG_UNUSED uint32_t threads); static int init(TVG_UNUSED uint32_t threads);

View file

@ -691,7 +691,7 @@ bool SwRenderer::render(RenderCompositor* cmp, const RenderEffect* effect, bool
TVGERR("SW_ENGINE", "Not supported grayscale Gaussian Blur!"); TVGERR("SW_ENGINE", "Not supported grayscale Gaussian Blur!");
return false; return false;
} }
switch (effect->type) { switch (effect->type) {
case SceneEffect::GaussianBlur: { case SceneEffect::GaussianBlur: {
return effectGaussianBlur(p, request(surface->channelSize, true), static_cast<const RenderEffectGaussianBlur*>(effect)); return effectGaussianBlur(p, request(surface->channelSize, true), static_cast<const RenderEffectGaussianBlur*>(effect));
@ -719,6 +719,13 @@ bool SwRenderer::render(RenderCompositor* cmp, const RenderEffect* effect, bool
} }
void SwRenderer::dispose(RenderEffect* effect)
{
free(effect->rd);
effect->rd = nullptr;
}
ColorSpace SwRenderer::colorSpace() ColorSpace SwRenderer::colorSpace()
{ {
if (surface) return surface->cs; if (surface) return surface->cs;

View file

@ -65,6 +65,7 @@ public:
void prepare(RenderEffect* effect, const Matrix& transform) override; void prepare(RenderEffect* effect, const Matrix& transform) override;
bool region(RenderEffect* effect) override; bool region(RenderEffect* effect) override;
bool render(RenderCompositor* cmp, const RenderEffect* effect, bool direct) override; bool render(RenderCompositor* cmp, const RenderEffect* effect, bool direct) override;
void dispose(RenderEffect* effect) override;
static SwRenderer* gen(); static SwRenderer* gen();
static bool init(uint32_t threads); static bool init(uint32_t threads);

View file

@ -263,10 +263,7 @@ struct RenderEffect
SceneEffect type; SceneEffect type;
bool valid = false; bool valid = false;
virtual ~RenderEffect() virtual ~RenderEffect() {}
{
free(rd);
}
}; };
struct RenderEffectGaussianBlur : RenderEffect struct RenderEffectGaussianBlur : RenderEffect
@ -409,6 +406,7 @@ public:
virtual void prepare(RenderEffect* effect, const Matrix& transform) = 0; virtual void prepare(RenderEffect* effect, const Matrix& transform) = 0;
virtual bool region(RenderEffect* effect) = 0; virtual bool region(RenderEffect* effect) = 0;
virtual bool render(RenderCompositor* cmp, const RenderEffect* effect, bool direct) = 0; virtual bool render(RenderCompositor* cmp, const RenderEffect* effect, bool direct) = 0;
virtual void dispose(RenderEffect* effect) = 0;
}; };
static inline bool MASK_REGION_MERGING(MaskMethod method) static inline bool MASK_REGION_MERGING(MaskMethod method)

View file

@ -299,7 +299,10 @@ struct Scene::Impl : Paint::Impl
Result resetEffects() Result resetEffects()
{ {
if (effects) { if (effects) {
ARRAY_FOREACH(p, *effects) delete(*p); ARRAY_FOREACH(p, *effects) {
renderer->dispose(*p);
delete(*p);
}
delete(effects); delete(effects);
effects = nullptr; effects = nullptr;
} }

View file

@ -483,6 +483,12 @@ bool WgRenderer::render(TVG_UNUSED RenderCompositor* cmp, TVG_UNUSED const Rende
} }
void WgRenderer::dispose(TVG_UNUSED RenderEffect* effect)
{
//TODO: dispose the effect
}
bool WgRenderer::preUpdate() bool WgRenderer::preUpdate()
{ {
return true; return true;

View file

@ -56,6 +56,7 @@ public:
void prepare(TVG_UNUSED RenderEffect* effect, TVG_UNUSED const Matrix& transform) override; void prepare(TVG_UNUSED RenderEffect* effect, TVG_UNUSED const Matrix& transform) override;
bool region(RenderEffect* effect) override; bool region(RenderEffect* effect) override;
bool render(RenderCompositor* cmp, const RenderEffect* effect, bool direct) override; bool render(RenderCompositor* cmp, const RenderEffect* effect, bool direct) override;
void dispose(TVG_UNUSED RenderEffect* effect) override;
static WgRenderer* gen(); static WgRenderer* gen();
static bool init(uint32_t threads); static bool init(uint32_t threads);