From 4e98f1274368655b1a3a90e7ca494b98ca01093e Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Mon, 17 Feb 2025 15:12:53 +0100 Subject: [PATCH] wg_engine: fix stroke update The stroke was not updated because the update function handled flags related to the color/gradient only. --- src/renderer/wg_engine/tvgWgRenderData.cpp | 91 +++++++++++----------- src/renderer/wg_engine/tvgWgRenderData.h | 3 +- src/renderer/wg_engine/tvgWgRenderer.cpp | 9 ++- 3 files changed, 54 insertions(+), 49 deletions(-) diff --git a/src/renderer/wg_engine/tvgWgRenderData.cpp b/src/renderer/wg_engine/tvgWgRenderData.cpp index 169eaf8e..7fbb054a 100755 --- a/src/renderer/wg_engine/tvgWgRenderData.cpp +++ b/src/renderer/wg_engine/tvgWgRenderData.cpp @@ -223,53 +223,54 @@ void WgImageData::release(WgContext& context) // WgRenderSettings //*********************************************************************** -void WgRenderSettings::update(WgContext& context, const Fill* fill, const RenderColor& c, const RenderUpdateFlag flags) +void WgRenderSettings::updateFill(WgContext& context, const Fill* fill) { - // setup fill properties - if ((flags & (RenderUpdateFlag::Gradient)) && fill) { - rasterType = WgRenderRasterType::Gradient; - // get gradient transfrom matrix - Matrix invFillTransform; - WgShaderTypeMat4x4f gradientTrans; // identity by default - if (inverse(&fill->transform(), &invFillTransform)) - gradientTrans.update(invFillTransform); - // get gradient rasterisation settings - WgShaderTypeGradient gradient; - if (fill->type() == Type::LinearGradient) { - gradient.update((LinearGradient*)fill); - fillType = WgRenderSettingsType::Linear; - } else if (fill->type() == Type::RadialGradient) { - gradient.update((RadialGradient*)fill); - fillType = WgRenderSettingsType::Radial; - } - // update gpu assets - bool bufferGradientSettingsChanged = context.allocateBufferUniform(bufferGroupGradient, &gradient.settings, sizeof(gradient.settings)); - bool bufferGradientTransformChanged = context.allocateBufferUniform(bufferGroupTransfromGrad, &gradientTrans.mat, sizeof(gradientTrans.mat)); - bool textureGradientChanged = context.allocateTexture(texGradient, WG_TEXTURE_GRADIENT_SIZE, 1, WGPUTextureFormat_RGBA8Unorm, gradient.texData); - if (bufferGradientSettingsChanged || textureGradientChanged || bufferGradientTransformChanged) { - // update texture view - context.releaseTextureView(texViewGradient); - texViewGradient = context.createTextureView(texGradient); - // get sampler by spread type - WGPUSampler sampler = context.samplerLinearClamp; - if (fill->spread() == FillSpread::Reflect) sampler = context.samplerLinearMirror; - if (fill->spread() == FillSpread::Repeat) sampler = context.samplerLinearRepeat; - // update bind group - context.layouts.releaseBindGroup(bindGroupGradient); - bindGroupGradient = context.layouts.createBindGroupTexSampledBuff2Un( - sampler, texViewGradient, bufferGroupGradient, bufferGroupTransfromGrad); - } - skip = false; - } else if ((flags & RenderUpdateFlag::Color) && !fill) { - rasterType = WgRenderRasterType::Solid; - WgShaderTypeVec4f solidColor(c); - if (context.allocateBufferUniform(bufferGroupSolid, &solidColor, sizeof(solidColor))) { - context.layouts.releaseBindGroup(bindGroupSolid); - bindGroupSolid = context.layouts.createBindGroupBuffer1Un(bufferGroupSolid); - } - fillType = WgRenderSettingsType::Solid; - skip = (c.a == 0); + rasterType = WgRenderRasterType::Gradient; + // get gradient transfrom matrix + Matrix invFillTransform; + WgShaderTypeMat4x4f gradientTrans; // identity by default + if (inverse(&fill->transform(), &invFillTransform)) + gradientTrans.update(invFillTransform); + // get gradient rasterisation settings + WgShaderTypeGradient gradient; + if (fill->type() == Type::LinearGradient) { + gradient.update((LinearGradient*)fill); + fillType = WgRenderSettingsType::Linear; + } else if (fill->type() == Type::RadialGradient) { + gradient.update((RadialGradient*)fill); + fillType = WgRenderSettingsType::Radial; } + // update gpu assets + bool bufferGradientSettingsChanged = context.allocateBufferUniform(bufferGroupGradient, &gradient.settings, sizeof(gradient.settings)); + bool bufferGradientTransformChanged = context.allocateBufferUniform(bufferGroupTransfromGrad, &gradientTrans.mat, sizeof(gradientTrans.mat)); + bool textureGradientChanged = context.allocateTexture(texGradient, WG_TEXTURE_GRADIENT_SIZE, 1, WGPUTextureFormat_RGBA8Unorm, gradient.texData); + if (bufferGradientSettingsChanged || textureGradientChanged || bufferGradientTransformChanged) { + // update texture view + context.releaseTextureView(texViewGradient); + texViewGradient = context.createTextureView(texGradient); + // get sampler by spread type + WGPUSampler sampler = context.samplerLinearClamp; + if (fill->spread() == FillSpread::Reflect) sampler = context.samplerLinearMirror; + if (fill->spread() == FillSpread::Repeat) sampler = context.samplerLinearRepeat; + // update bind group + context.layouts.releaseBindGroup(bindGroupGradient); + bindGroupGradient = context.layouts.createBindGroupTexSampledBuff2Un( + sampler, texViewGradient, bufferGroupGradient, bufferGroupTransfromGrad); + } + skip = false; +}; + + +void WgRenderSettings::updateColor(WgContext& context, const RenderColor& c) +{ + rasterType = WgRenderRasterType::Solid; + WgShaderTypeVec4f solidColor(c); + if (context.allocateBufferUniform(bufferGroupSolid, &solidColor, sizeof(solidColor))) { + context.layouts.releaseBindGroup(bindGroupSolid); + bindGroupSolid = context.layouts.createBindGroupBuffer1Un(bufferGroupSolid); + } + fillType = WgRenderSettingsType::Solid; + skip = (c.a == 0); }; diff --git a/src/renderer/wg_engine/tvgWgRenderData.h b/src/renderer/wg_engine/tvgWgRenderData.h index a1bdeffb..2d857b06 100755 --- a/src/renderer/wg_engine/tvgWgRenderData.h +++ b/src/renderer/wg_engine/tvgWgRenderData.h @@ -89,7 +89,8 @@ struct WgRenderSettings WgRenderRasterType rasterType{}; bool skip{}; - void update(WgContext& context, const Fill* fill, const RenderColor& c, const RenderUpdateFlag flags); + void updateFill(WgContext& context, const Fill* fill); + void updateColor(WgContext& context, const RenderColor& c); void release(WgContext& context); }; diff --git a/src/renderer/wg_engine/tvgWgRenderer.cpp b/src/renderer/wg_engine/tvgWgRenderer.cpp index 6ca9ceeb..bb93e970 100755 --- a/src/renderer/wg_engine/tvgWgRenderer.cpp +++ b/src/renderer/wg_engine/tvgWgRenderer.cpp @@ -160,9 +160,12 @@ RenderData WgRenderer::prepare(const RenderShape& rshape, RenderData data, const // setup fill settings renderDataShape->viewport = mViewport; renderDataShape->opacity = opacity; - renderDataShape->renderSettingsShape.update(mContext, rshape.fill, rshape.color, flags); - if (rshape.stroke) - renderDataShape->renderSettingsStroke.update(mContext, rshape.stroke->fill, rshape.stroke->color, flags); + if (flags & RenderUpdateFlag::Gradient && rshape.fill) renderDataShape->renderSettingsShape.updateFill(mContext, rshape.fill); + else if (flags & RenderUpdateFlag::Color) renderDataShape->renderSettingsShape.updateColor(mContext, rshape.color); + if (rshape.stroke) { + if (flags & RenderUpdateFlag::GradientStroke && rshape.stroke->fill) renderDataShape->renderSettingsStroke.updateFill(mContext, rshape.stroke->fill); + else if (flags & RenderUpdateFlag::Stroke) renderDataShape->renderSettingsStroke.updateColor(mContext, rshape.stroke->color); + } // store clips data renderDataShape->updateClips(clips);