From c216805a8790b69235cb97808f43bd5bc101a77e Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 7 Jul 2025 12:04:48 +0900 Subject: [PATCH] engines: fine-tune scene effect performance Skip scene effects whenever possible, based on predefined conditions. --- src/renderer/gl_engine/tvgGlRenderer.cpp | 7 +++--- src/renderer/sw_engine/tvgSwPostEffect.cpp | 2 +- src/renderer/wg_engine/tvgWgRenderData.cpp | 22 +++++++++--------- src/renderer/wg_engine/tvgWgRenderData.h | 12 +++++----- src/renderer/wg_engine/tvgWgRenderer.cpp | 2 -- src/renderer/wg_engine/tvgWgShaderTypes.cpp | 25 ++++++++++++++++----- src/renderer/wg_engine/tvgWgShaderTypes.h | 10 ++++----- 7 files changed, 46 insertions(+), 34 deletions(-) diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index 302f9001..a821acdc 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -954,7 +954,7 @@ void GlRenderer::effectGaussianBlurUpdate(RenderEffectGaussianBlur* effect, cons blur->scale = std::sqrt(transform.e11 * transform.e11 + transform.e12 * transform.e12); blur->extend = 2 * blur->sigma * blur->scale; effect->rd = blur; - effect->valid = true; + effect->valid = (blur->extend > 0); } @@ -980,7 +980,7 @@ void GlRenderer::effectDropShadowUpdate(RenderEffectDropShadow* effect, const Ma dropShadow->offset[1] = offset.y; dropShadow->extend = 2 * std::max(sigma * scale + std::abs(offset.x), sigma * scale + std::abs(offset.y)); effect->rd = dropShadow; - effect->valid = true; + effect->valid = (dropShadow->extend > 0); } @@ -1011,7 +1011,7 @@ void GlRenderer::effectTintUpdate(RenderEffectTint* effect, const Matrix& transf params->params[7] = 0.0f; params->params[8] = effect->intensity / 255.0f; effect->rd = params; - effect->valid = true; + effect->valid = (effect->intensity > 0); } @@ -1076,7 +1076,6 @@ void GlRenderer::prepare(RenderEffect* effect, const Matrix& transform) case SceneEffect::Tritone: effectTritoneUpdate(static_cast(effect), transform); break; default: break; } - effect->valid = true; } diff --git a/src/renderer/sw_engine/tvgSwPostEffect.cpp b/src/renderer/sw_engine/tvgSwPostEffect.cpp index d2c92cbe..6373ec9e 100644 --- a/src/renderer/sw_engine/tvgSwPostEffect.cpp +++ b/src/renderer/sw_engine/tvgSwPostEffect.cpp @@ -469,7 +469,7 @@ bool effectFill(SwCompositor* cmp, const RenderEffectFill* params, bool direct) void effectTintUpdate(RenderEffectTint* params) { - params->valid = true; + params->valid = (params->intensity > 0); } diff --git a/src/renderer/wg_engine/tvgWgRenderData.cpp b/src/renderer/wg_engine/tvgWgRenderData.cpp index 9efd601c..6e646777 100644 --- a/src/renderer/wg_engine/tvgWgRenderData.cpp +++ b/src/renderer/wg_engine/tvgWgRenderData.cpp @@ -511,7 +511,7 @@ void WgRenderDataViewportPool::release(WgContext& context) // WgRenderDataEffectParams //*********************************************************************** -void WgRenderDataEffectParams::update(WgContext& context, const WgShaderTypeEffectParams& effectParams) +void WgRenderDataEffectParams::update(WgContext& context, WgShaderTypeEffectParams& effectParams) { if (context.allocateBufferUniform(bufferParams, &effectParams.params, sizeof(effectParams.params))) { context.layouts.releaseBindGroup(bindGroupParams); @@ -520,22 +520,22 @@ void WgRenderDataEffectParams::update(WgContext& context, const WgShaderTypeEffe } -void WgRenderDataEffectParams::update(WgContext& context, const RenderEffectGaussianBlur* gaussian, const Matrix& transform) +void WgRenderDataEffectParams::update(WgContext& context, RenderEffectGaussianBlur* gaussian, const Matrix& transform) { assert(gaussian); WgShaderTypeEffectParams effectParams; - effectParams.update(gaussian, transform); + if (!effectParams.update(gaussian, transform)) return; update(context, effectParams); level = int(WG_GAUSSIAN_MAX_LEVEL * ((gaussian->quality - 1) * 0.01f)) + 1; extend = effectParams.extend; } -void WgRenderDataEffectParams::update(WgContext& context, const RenderEffectDropShadow* dropShadow, const Matrix& transform) +void WgRenderDataEffectParams::update(WgContext& context, RenderEffectDropShadow* dropShadow, const Matrix& transform) { assert(dropShadow); WgShaderTypeEffectParams effectParams; - effectParams.update(dropShadow, transform); + if (!effectParams.update(dropShadow, transform)) return; update(context, effectParams); level = int(WG_GAUSSIAN_MAX_LEVEL * ((dropShadow->quality - 1) * 0.01f)) + 1; extend = effectParams.extend; @@ -543,29 +543,29 @@ void WgRenderDataEffectParams::update(WgContext& context, const RenderEffectDrop } -void WgRenderDataEffectParams::update(WgContext& context, const RenderEffectFill* fill) +void WgRenderDataEffectParams::update(WgContext& context, RenderEffectFill* fill) { assert(fill); WgShaderTypeEffectParams effectParams; - effectParams.update(fill); + if (!effectParams.update(fill)) return; update(context, effectParams); } -void WgRenderDataEffectParams::update(WgContext& context, const RenderEffectTint* tint) +void WgRenderDataEffectParams::update(WgContext& context, RenderEffectTint* tint) { assert(tint); WgShaderTypeEffectParams effectParams; - effectParams.update(tint); + if (!effectParams.update(tint)) return; update(context, effectParams); } -void WgRenderDataEffectParams::update(WgContext& context, const RenderEffectTritone* tritone) +void WgRenderDataEffectParams::update(WgContext& context, RenderEffectTritone* tritone) { assert(tritone); WgShaderTypeEffectParams effectParams; - effectParams.update(tritone); + if (!effectParams.update(tritone)) return; update(context, effectParams); } diff --git a/src/renderer/wg_engine/tvgWgRenderData.h b/src/renderer/wg_engine/tvgWgRenderData.h index 6d5f3201..59687de2 100644 --- a/src/renderer/wg_engine/tvgWgRenderData.h +++ b/src/renderer/wg_engine/tvgWgRenderData.h @@ -180,12 +180,12 @@ struct WgRenderDataEffectParams uint32_t level{}; Point offset{}; - void update(WgContext& context, const WgShaderTypeEffectParams& effectParams); - void update(WgContext& context, const RenderEffectGaussianBlur* gaussian, const Matrix& transform); - void update(WgContext& context, const RenderEffectDropShadow* dropShadow, const Matrix& transform); - void update(WgContext& context, const RenderEffectFill* fill); - void update(WgContext& context, const RenderEffectTint* tint); - void update(WgContext& context, const RenderEffectTritone* tritone); + void update(WgContext& context, WgShaderTypeEffectParams& effectParams); + void update(WgContext& context, RenderEffectGaussianBlur* gaussian, const Matrix& transform); + void update(WgContext& context, RenderEffectDropShadow* dropShadow, const Matrix& transform); + void update(WgContext& context, RenderEffectFill* fill); + void update(WgContext& context, RenderEffectTint* tint); + void update(WgContext& context, RenderEffectTritone* tritone); void release(WgContext& context); }; diff --git a/src/renderer/wg_engine/tvgWgRenderer.cpp b/src/renderer/wg_engine/tvgWgRenderer.cpp index fa78d43c..513a43d1 100644 --- a/src/renderer/wg_engine/tvgWgRenderer.cpp +++ b/src/renderer/wg_engine/tvgWgRenderer.cpp @@ -520,8 +520,6 @@ void WgRenderer::prepare(RenderEffect* effect, const Matrix& transform) TVGERR("WG_ENGINE", "Missing effect type? = %d", (int) effect->type); return; } - - effect->valid = true; } diff --git a/src/renderer/wg_engine/tvgWgShaderTypes.cpp b/src/renderer/wg_engine/tvgWgShaderTypes.cpp index 6616f8c9..a1a501e7 100644 --- a/src/renderer/wg_engine/tvgWgShaderTypes.cpp +++ b/src/renderer/wg_engine/tvgWgShaderTypes.cpp @@ -203,7 +203,7 @@ void WgShaderTypeGradientData::update(const Fill* fill) // WgShaderTypeEffectParams //************************************************************************ -void WgShaderTypeEffectParams::update(const RenderEffectGaussianBlur* gaussian, const Matrix& transform) +bool WgShaderTypeEffectParams::update(RenderEffectGaussianBlur* gaussian, const Matrix& transform) { assert(gaussian); const float sigma = gaussian->sigma; @@ -214,10 +214,13 @@ void WgShaderTypeEffectParams::update(const RenderEffectGaussianBlur* gaussian, params[2] = kernel; params[3] = 0.0f; extend = params[2] * 2; // kernel + + gaussian->valid = (extend > 0); + return gaussian->valid; } -void WgShaderTypeEffectParams::update(const RenderEffectDropShadow* dropShadow, const Matrix& transform) +bool WgShaderTypeEffectParams::update(RenderEffectDropShadow* dropShadow, const Matrix& transform) { assert(dropShadow); const float radian = tvg::deg2rad(90.0f - dropShadow->angle); @@ -243,19 +246,25 @@ void WgShaderTypeEffectParams::update(const RenderEffectDropShadow* dropShadow, params[8] = offset.x; params[9] = offset.y; extend = params[2] * 2; // kernel + + dropShadow->valid = (extend > 0); + return dropShadow->valid; } -void WgShaderTypeEffectParams::update(const RenderEffectFill* fill) +bool WgShaderTypeEffectParams::update(RenderEffectFill* fill) { params[0] = fill->color[0] / 255.0f; params[1] = fill->color[1] / 255.0f; params[2] = fill->color[2] / 255.0f; params[3] = fill->color[3] / 255.0f; + + fill->valid = true; + return true; } -void WgShaderTypeEffectParams::update(const RenderEffectTint* tint) +bool WgShaderTypeEffectParams::update(RenderEffectTint* tint) { params[0] = tint->black[0] / 255.0f; params[1] = tint->black[1] / 255.0f; @@ -266,10 +275,13 @@ void WgShaderTypeEffectParams::update(const RenderEffectTint* tint) params[6] = tint->white[2] / 255.0f; params[7] = 0.0f; params[8] = tint->intensity / 255.0f; + + tint->valid = (tint->intensity > 0); + return tint->valid; } -void WgShaderTypeEffectParams::update(const RenderEffectTritone* tritone) +bool WgShaderTypeEffectParams::update(RenderEffectTritone* tritone) { params[0] = tritone->shadow[0] / 255.0f; params[1] = tritone->shadow[1] / 255.0f; @@ -283,4 +295,7 @@ void WgShaderTypeEffectParams::update(const RenderEffectTritone* tritone) params[9] = tritone->highlight[1] / 255.0f; params[10] = tritone->highlight[2] / 255.0f; params[11] = 0.0f; + + tritone->valid = true; + return true; } diff --git a/src/renderer/wg_engine/tvgWgShaderTypes.h b/src/renderer/wg_engine/tvgWgShaderTypes.h index b4f5f901..ff034047 100644 --- a/src/renderer/wg_engine/tvgWgShaderTypes.h +++ b/src/renderer/wg_engine/tvgWgShaderTypes.h @@ -109,11 +109,11 @@ struct WgShaderTypeEffectParams uint32_t extend{}; // gaussian blur extend Point offset{}; // drop shadow offset - void update(const RenderEffectGaussianBlur* gaussian, const Matrix& transform); - void update(const RenderEffectDropShadow* dropShadow, const Matrix& transform); - void update(const RenderEffectFill* fill); - void update(const RenderEffectTint* tint); - void update(const RenderEffectTritone* tritone); + bool update(RenderEffectGaussianBlur* gaussian, const Matrix& transform); + bool update(RenderEffectDropShadow* dropShadow, const Matrix& transform); + bool update(RenderEffectFill* fill); + bool update(RenderEffectTint* tint); + bool update(RenderEffectTritone* tritone); }; #endif // _TVG_WG_SHADER_TYPES_H_