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()
{
return ColorSpace::Unknown;

View file

@ -90,6 +90,7 @@ public:
void prepare(RenderEffect* effect, const Matrix& transform) override;
bool region(RenderEffect* effect) override;
bool render(RenderCompositor* cmp, const RenderEffect* effect, bool direct) override;
void dispose(TVG_UNUSED RenderEffect* effect) override;
static GlRenderer* gen();
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!");
return false;
}
switch (effect->type) {
case SceneEffect::GaussianBlur: {
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()
{
if (surface) return surface->cs;

View file

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

View file

@ -263,10 +263,7 @@ struct RenderEffect
SceneEffect type;
bool valid = false;
virtual ~RenderEffect()
{
free(rd);
}
virtual ~RenderEffect() {}
};
struct RenderEffectGaussianBlur : RenderEffect
@ -409,6 +406,7 @@ public:
virtual void prepare(RenderEffect* effect, const Matrix& transform) = 0;
virtual bool region(RenderEffect* effect) = 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)

View file

@ -299,7 +299,10 @@ struct Scene::Impl : Paint::Impl
Result resetEffects()
{
if (effects) {
ARRAY_FOREACH(p, *effects) delete(*p);
ARRAY_FOREACH(p, *effects) {
renderer->dispose(*p);
delete(*p);
}
delete(effects);
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()
{
return true;

View file

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