Message ID | 20220908214554.1117287-1-raj.khem@gmail.com |
---|---|
State | Accepted, archived |
Commit | 9294ccb9530ce70b2513b2e112644ec5e9f8e701 |
Headers | show |
Series | [v3] webkitgtk: Fix build on 32bit arm | expand |
Still failed on beaglebone-yocto: /build/tmp-glibc/work/cortexa8hf-neon-wrs-linux-gnueabi/webkitgtk/2.36.7-r0/webkitgtk-2.36.7/Source/W ebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp:38:8: error: standard attributes in middle of decl-specifiers 38 | static alignas(16) short s_FELightingConstantsForNeon[] = { | ^~~~~~~ Thanks, On 9/9/22 05:45, Khem Raj wrote: > [Please note: This e-mail is from an EXTERNAL e-mail address] > > Signed-off-by: Khem Raj <raj.khem@gmail.com> > Cc: Mingli Yu <mingli.yu@windriver.com> > --- > v2: Fix commit msg format > v3: Apply suggestion from https://github.com/WebKit/WebKit/pull/1233#discussion_r915217428 > > ...44e17d258106617b0e6d783d073b188a2548.patch | 296 ++++++++++++++++++ > meta/recipes-sato/webkit/webkitgtk_2.36.7.bb | 1 + > 2 files changed, 297 insertions(+) > create mode 100644 meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch > > diff --git a/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch b/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch > new file mode 100644 > index 0000000000..32f92f7ff5 > --- /dev/null > +++ b/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch > @@ -0,0 +1,296 @@ > +From 0d3344e17d258106617b0e6d783d073b188a2548 Mon Sep 17 00:00:00 2001 > +From: Adrian Perez de Castro <aperez@igalia.com> > +Date: Thu, 2 Jun 2022 11:19:06 +0300 > +Subject: [PATCH] [ARM][NEON] FELightningNEON.cpp fails to build, NEON fast > + path seems unused https://bugs.webkit.org/show_bug.cgi?id=241182 > + > +Reviewed by NOBODY (OOPS!). > + > +Move the NEON fast path for the SVG lighting filter effects into > +FELightingSoftwareApplier, and arrange to actually use them by > +forwarding calls to applyPlatformGeneric() into applyPlatformNeon(). > + > +Some changes were needed to adapt platformApplyNeon() to the current > +state of filters after r286140. This was not detected because the code > +bitrotted due to it being guarded with CPU(ARM_TRADITIONAL), which does > +not get used much these days: CPU(ARM_THUMB2) is more common. It should > +be possible to use the NEON fast paths also in Thumb mode, but that is > +left for a follow-up fix. > + > +* Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp: > +(WebCore::FELightingSoftwareApplier::platformApplyNeonWorker): > +(WebCore::FELightingSoftwareApplier::getPowerCoefficients): > +(WebCore::FELighting::platformApplyNeonWorker): Deleted. > +(WebCore::FELighting::getPowerCoefficients): Deleted. > +* Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h: > +(WebCore::FELightingSoftwareApplier::applyPlatformNeon): > +(WebCore::FELighting::platformApplyNeon): Deleted. > +* Source/WebCore/platform/graphics/filters/DistantLightSource.h: > +* Source/WebCore/platform/graphics/filters/FELighting.h: > +* Source/WebCore/platform/graphics/filters/PointLightSource.h: > +* Source/WebCore/platform/graphics/filters/SpotLightSource.h: > +* Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h: > +--- > +Upstream-Status: Submitted [https://github.com/WebKit/WebKit/pull/1233] > +Signed-off-by: Khem Raj <raj.khem@gmail.com> > + > + .../cpu/arm/filters/FELightingNEON.cpp | 4 +- > + .../graphics/cpu/arm/filters/FELightingNEON.h | 54 +++++++++---------- > + .../graphics/filters/DistantLightSource.h | 4 ++ > + .../platform/graphics/filters/FELighting.h | 7 --- > + .../graphics/filters/PointLightSource.h | 4 ++ > + .../graphics/filters/SpotLightSource.h | 4 ++ > + .../software/FELightingSoftwareApplier.h | 16 ++++++ > + 7 files changed, 57 insertions(+), 36 deletions(-) > + > +--- a/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp > ++++ b/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp > +@@ -49,7 +49,7 @@ short* feLightingConstantsForNeon() > + return s_FELightingConstantsForNeon; > + } > + > +-void FELighting::platformApplyNeonWorker(FELightingPaintingDataForNeon* parameters) > ++void FELightingSoftwareApplier::platformApplyNeonWorker(FELightingPaintingDataForNeon* parameters) > + { > + neonDrawLighting(parameters); > + } > +@@ -464,7 +464,7 @@ TOSTRING(neonDrawLighting) ":" NL > + "b .lightStrengthCalculated" NL > + ); // NOLINT > + > +-int FELighting::getPowerCoefficients(float exponent) > ++int FELightingSoftwareApplier::getPowerCoefficients(float exponent) > + { > + // Calling a powf function from the assembly code would require to save > + // and reload a lot of NEON registers. Since the base is in range [0..1] > +--- a/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h > ++++ b/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h > +@@ -24,14 +24,15 @@ > + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +-#ifndef FELightingNEON_h > +-#define FELightingNEON_h > ++#pragma once > + > + #if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) > + > +-#include "FELighting.h" > ++#include "FELightingSoftwareApplier.h" > ++#include "ImageBuffer.h" > + #include "PointLightSource.h" > + #include "SpotLightSource.h" > ++#include <wtf/ObjectIdentifier.h> > + #include <wtf/ParallelJobs.h> > + > + namespace WebCore { > +@@ -93,14 +94,14 @@ extern "C" { > + void neonDrawLighting(FELightingPaintingDataForNeon*); > + } > + > +-inline void FELighting::platformApplyNeon(const LightingData& data, const LightSource::PaintingData& paintingData) > ++inline void FELightingSoftwareApplier::applyPlatformNeon(const FELightingSoftwareApplier::LightingData& data, const LightSource::PaintingData& paintingData) > + { > +- alignas(16) FELightingFloatArgumentsForNeon floatArguments; > +- FELightingPaintingDataForNeon neonData = { > ++ WebCore::FELightingFloatArgumentsForNeon alignas(16) floatArguments; > ++ WebCore::FELightingPaintingDataForNeon neonData = { > + data.pixels->data(), > + 1, > +- data.widthDecreasedByOne - 1, > +- data.heightDecreasedByOne - 1, > ++ data.width - 2, > ++ data.height - 2, > + 0, > + 0, > + 0, > +@@ -111,23 +112,23 @@ inline void FELighting::platformApplyNeo > + // Set light source arguments. > + floatArguments.constOne = 1; > + > +- auto color = m_lightingColor.toColorTypeLossy<SRGBA<uint8_t>>().resolved(); > ++ auto color = data.lightingColor.toColorTypeLossy<SRGBA<uint8_t>>().resolved(); > + > + floatArguments.colorRed = color.red; > + floatArguments.colorGreen = color.green; > + floatArguments.colorBlue = color.blue; > + floatArguments.padding4 = 0; > + > +- if (m_lightSource->type() == LS_POINT) { > ++ if (data.lightSource->type() == LS_POINT) { > + neonData.flags |= FLAG_POINT_LIGHT; > +- PointLightSource& pointLightSource = static_cast<PointLightSource&>(m_lightSource.get()); > ++ const auto& pointLightSource = *static_cast<const PointLightSource*>(data.lightSource); > + floatArguments.lightX = pointLightSource.position().x(); > + floatArguments.lightY = pointLightSource.position().y(); > + floatArguments.lightZ = pointLightSource.position().z(); > + floatArguments.padding2 = 0; > +- } else if (m_lightSource->type() == LS_SPOT) { > ++ } else if (data.lightSource->type() == LS_SPOT) { > + neonData.flags |= FLAG_SPOT_LIGHT; > +- SpotLightSource& spotLightSource = static_cast<SpotLightSource&>(m_lightSource.get()); > ++ const auto& spotLightSource = *static_cast<const SpotLightSource*>(data.lightSource); > + floatArguments.lightX = spotLightSource.position().x(); > + floatArguments.lightY = spotLightSource.position().y(); > + floatArguments.lightZ = spotLightSource.position().z(); > +@@ -145,7 +146,7 @@ inline void FELighting::platformApplyNeo > + if (spotLightSource.specularExponent() == 1) > + neonData.flags |= FLAG_CONE_EXPONENT_IS_1; > + } else { > +- ASSERT(m_lightSource->type() == LS_DISTANT); > ++ ASSERT(data.lightSource->type() == LS_DISTANT); > + floatArguments.lightX = paintingData.initialLightingData.lightVector.x(); > + floatArguments.lightY = paintingData.initialLightingData.lightVector.y(); > + floatArguments.lightZ = paintingData.initialLightingData.lightVector.z(); > +@@ -155,38 +156,39 @@ inline void FELighting::platformApplyNeo > + // Set lighting arguments. > + floatArguments.surfaceScale = data.surfaceScale; > + floatArguments.minusSurfaceScaleDividedByFour = -data.surfaceScale / 4; > +- if (m_lightingType == FELighting::DiffuseLighting) > +- floatArguments.diffuseConstant = m_diffuseConstant; > ++ if (data.filterType == FilterEffect::Type::FEDiffuseLighting) > ++ floatArguments.diffuseConstant = data.diffuseConstant; > + else { > + neonData.flags |= FLAG_SPECULAR_LIGHT; > +- floatArguments.diffuseConstant = m_specularConstant; > +- neonData.specularExponent = getPowerCoefficients(m_specularExponent); > +- if (m_specularExponent == 1) > ++ floatArguments.diffuseConstant = data.specularConstant; > ++ neonData.specularExponent = getPowerCoefficients(data.specularExponent); > ++ if (data.specularExponent == 1) > + neonData.flags |= FLAG_SPECULAR_EXPONENT_IS_1; > + } > + if (floatArguments.diffuseConstant == 1) > + neonData.flags |= FLAG_DIFFUSE_CONST_IS_1; > + > +- int optimalThreadNumber = ((data.widthDecreasedByOne - 1) * (data.heightDecreasedByOne - 1)) / s_minimalRectDimension; > ++ static constexpr int minimalRectDimension = 100 * 100; // Empirical data limit for parallel jobs > ++ int optimalThreadNumber = ((data.width - 2) * (data.height - 2)) / minimalRectDimension; > + if (optimalThreadNumber > 1) { > + // Initialize parallel jobs > +- ParallelJobs<FELightingPaintingDataForNeon> parallelJobs(&WebCore::FELighting::platformApplyNeonWorker, optimalThreadNumber); > ++ ParallelJobs<FELightingPaintingDataForNeon> parallelJobs(&FELightingSoftwareApplier::platformApplyNeonWorker, optimalThreadNumber); > + > + // Fill the parameter array > + int job = parallelJobs.numberOfJobs(); > + if (job > 1) { > + int yStart = 1; > +- int yStep = (data.heightDecreasedByOne - 1) / job; > ++ int yStep = (data.height - 2) / job; > + for (--job; job >= 0; --job) { > + FELightingPaintingDataForNeon& params = parallelJobs.parameter(job); > + params = neonData; > + params.yStart = yStart; > +- params.pixels += (yStart - 1) * (data.widthDecreasedByOne + 1) * 4; > ++ params.pixels += (yStart - 1) * data.width * 4; > + if (job > 0) { > + params.absoluteHeight = yStep; > + yStart += yStep; > + } else > +- params.absoluteHeight = data.heightDecreasedByOne - yStart; > ++ params.absoluteHeight = (data.height - 1) - yStart; > + } > + parallelJobs.execute(); > + return; > +@@ -199,5 +201,3 @@ inline void FELighting::platformApplyNeo > + } // namespace WebCore > + > + #endif // CPU(ARM_NEON) && COMPILER(GCC_COMPATIBLE) > +- > +-#endif // FELightingNEON_h > +--- a/Source/WebCore/platform/graphics/filters/DistantLightSource.h > ++++ b/Source/WebCore/platform/graphics/filters/DistantLightSource.h > +@@ -25,6 +25,10 @@ > + #include "LightSource.h" > + #include <wtf/Ref.h> > + > ++namespace WTF { > ++class TextStream; > ++} // namespace WTF > ++ > + namespace WebCore { > + > + class DistantLightSource : public LightSource { > +--- a/Source/WebCore/platform/graphics/filters/FELighting.h > ++++ b/Source/WebCore/platform/graphics/filters/FELighting.h > +@@ -35,8 +35,6 @@ > + > + namespace WebCore { > + > +-struct FELightingPaintingDataForNeon; > +- > + class FELighting : public FilterEffect { > + public: > + const Color& lightingColor() const { return m_lightingColor; } > +@@ -67,11 +65,6 @@ protected: > + > + std::unique_ptr<FilterEffectApplier> createSoftwareApplier() const override; > + > +-#if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) > +- static int getPowerCoefficients(float exponent); > +- inline void platformApplyNeon(const LightingData&, const LightSource::PaintingData&); > +-#endif > +- > + Color m_lightingColor; > + float m_surfaceScale; > + float m_diffuseConstant; > +--- a/Source/WebCore/platform/graphics/filters/PointLightSource.h > ++++ b/Source/WebCore/platform/graphics/filters/PointLightSource.h > +@@ -26,6 +26,10 @@ > + #include "LightSource.h" > + #include <wtf/Ref.h> > + > ++namespace WTF { > ++class TextStream; > ++} // namespace WTF > ++ > + namespace WebCore { > + > + class PointLightSource : public LightSource { > +--- a/Source/WebCore/platform/graphics/filters/SpotLightSource.h > ++++ b/Source/WebCore/platform/graphics/filters/SpotLightSource.h > +@@ -26,6 +26,10 @@ > + #include "LightSource.h" > + #include <wtf/Ref.h> > + > ++namespace WTF { > ++class TextStream; > ++} // namespace WTF > ++ > + namespace WebCore { > + > + class SpotLightSource : public LightSource { > +--- a/Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h > ++++ b/Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h > +@@ -36,6 +36,7 @@ > + namespace WebCore { > + > + class FELighting; > ++struct FELightingPaintingDataForNeon; > + > + class FELightingSoftwareApplier final : public FilterEffectConcreteApplier<FELighting> { > + WTF_MAKE_FAST_ALLOCATED; > +@@ -132,8 +133,23 @@ private: > + > + static void applyPlatformGenericPaint(const LightingData&, const LightSource::PaintingData&, int startY, int endY); > + static void applyPlatformGenericWorker(ApplyParameters*); > ++ > ++#if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) > ++ static int getPowerCoefficients(float exponent); > ++ static void platformApplyNeonWorker(FELightingPaintingDataForNeon*); > ++ inline static void applyPlatformNeon(const LightingData&, const LightSource::PaintingData&); > ++ > ++ inline static void applyPlatformGeneric(const LightingData& data, const LightSource::PaintingData& paintingData) > ++ { > ++ applyPlatformNeon(data, paintingData); > ++ } > ++#else > + static void applyPlatformGeneric(const LightingData&, const LightSource::PaintingData&); > ++#endif > ++ > + static void applyPlatform(const LightingData&); > + }; > + > + } // namespace WebCore > ++ > ++#include "FELightingNEON.h" > diff --git a/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb b/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb > index 47e52e25da..76b119c9c7 100644 > --- a/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb > +++ b/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb > @@ -16,6 +16,7 @@ SRC_URI = "https://www.webkitgtk.org/releases/${BPN}-${PV}.tar.xz \ > file://reproducibility.patch \ > file://0001-When-building-introspection-files-do-not-quote-CFLAG.patch \ > file://fix-gstreamer-include-paths.patch \ > + file://0d3344e17d258106617b0e6d783d073b188a2548.patch \ > " > SRC_URI[sha256sum] = "0c260cf2b32f0481d017670dfed1b61e554967cd067195606c9f9eb5fe731743" > > -- > 2.37.3 >
On Tue, Sep 13, 2022 at 7:25 PM Yu, Mingli <mingli.yu@windriver.com> wrote: > > Still failed on beaglebone-yocto: > > /build/tmp-glibc/work/cortexa8hf-neon-wrs-linux-gnueabi/webkitgtk/2.36.7-r0/webkitgtk-2.36.7/Source/W > ebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp:38:8: error: > standard attributes in middle of decl-specifiers > 38 | static alignas(16) short s_FELightingConstantsForNeon[] = { > | ^~~~~~~ > What is your -j value ? please give 4GB per core of memory for webkitgtk to build. > Thanks, > > On 9/9/22 05:45, Khem Raj wrote: > > [Please note: This e-mail is from an EXTERNAL e-mail address] > > > > Signed-off-by: Khem Raj <raj.khem@gmail.com> > > Cc: Mingli Yu <mingli.yu@windriver.com> > > --- > > v2: Fix commit msg format > > v3: Apply suggestion from https://github.com/WebKit/WebKit/pull/1233#discussion_r915217428 > > > > ...44e17d258106617b0e6d783d073b188a2548.patch | 296 ++++++++++++++++++ > > meta/recipes-sato/webkit/webkitgtk_2.36.7.bb | 1 + > > 2 files changed, 297 insertions(+) > > create mode 100644 meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch > > > > diff --git a/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch b/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch > > new file mode 100644 > > index 0000000000..32f92f7ff5 > > --- /dev/null > > +++ b/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch > > @@ -0,0 +1,296 @@ > > +From 0d3344e17d258106617b0e6d783d073b188a2548 Mon Sep 17 00:00:00 2001 > > +From: Adrian Perez de Castro <aperez@igalia.com> > > +Date: Thu, 2 Jun 2022 11:19:06 +0300 > > +Subject: [PATCH] [ARM][NEON] FELightningNEON.cpp fails to build, NEON fast > > + path seems unused https://bugs.webkit.org/show_bug.cgi?id=241182 > > + > > +Reviewed by NOBODY (OOPS!). > > + > > +Move the NEON fast path for the SVG lighting filter effects into > > +FELightingSoftwareApplier, and arrange to actually use them by > > +forwarding calls to applyPlatformGeneric() into applyPlatformNeon(). > > + > > +Some changes were needed to adapt platformApplyNeon() to the current > > +state of filters after r286140. This was not detected because the code > > +bitrotted due to it being guarded with CPU(ARM_TRADITIONAL), which does > > +not get used much these days: CPU(ARM_THUMB2) is more common. It should > > +be possible to use the NEON fast paths also in Thumb mode, but that is > > +left for a follow-up fix. > > + > > +* Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp: > > +(WebCore::FELightingSoftwareApplier::platformApplyNeonWorker): > > +(WebCore::FELightingSoftwareApplier::getPowerCoefficients): > > +(WebCore::FELighting::platformApplyNeonWorker): Deleted. > > +(WebCore::FELighting::getPowerCoefficients): Deleted. > > +* Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h: > > +(WebCore::FELightingSoftwareApplier::applyPlatformNeon): > > +(WebCore::FELighting::platformApplyNeon): Deleted. > > +* Source/WebCore/platform/graphics/filters/DistantLightSource.h: > > +* Source/WebCore/platform/graphics/filters/FELighting.h: > > +* Source/WebCore/platform/graphics/filters/PointLightSource.h: > > +* Source/WebCore/platform/graphics/filters/SpotLightSource.h: > > +* Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h: > > +--- > > +Upstream-Status: Submitted [https://github.com/WebKit/WebKit/pull/1233] > > +Signed-off-by: Khem Raj <raj.khem@gmail.com> > > + > > + .../cpu/arm/filters/FELightingNEON.cpp | 4 +- > > + .../graphics/cpu/arm/filters/FELightingNEON.h | 54 +++++++++---------- > > + .../graphics/filters/DistantLightSource.h | 4 ++ > > + .../platform/graphics/filters/FELighting.h | 7 --- > > + .../graphics/filters/PointLightSource.h | 4 ++ > > + .../graphics/filters/SpotLightSource.h | 4 ++ > > + .../software/FELightingSoftwareApplier.h | 16 ++++++ > > + 7 files changed, 57 insertions(+), 36 deletions(-) > > + > > +--- a/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp > > ++++ b/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp > > +@@ -49,7 +49,7 @@ short* feLightingConstantsForNeon() > > + return s_FELightingConstantsForNeon; > > + } > > + > > +-void FELighting::platformApplyNeonWorker(FELightingPaintingDataForNeon* parameters) > > ++void FELightingSoftwareApplier::platformApplyNeonWorker(FELightingPaintingDataForNeon* parameters) > > + { > > + neonDrawLighting(parameters); > > + } > > +@@ -464,7 +464,7 @@ TOSTRING(neonDrawLighting) ":" NL > > + "b .lightStrengthCalculated" NL > > + ); // NOLINT > > + > > +-int FELighting::getPowerCoefficients(float exponent) > > ++int FELightingSoftwareApplier::getPowerCoefficients(float exponent) > > + { > > + // Calling a powf function from the assembly code would require to save > > + // and reload a lot of NEON registers. Since the base is in range [0..1] > > +--- a/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h > > ++++ b/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h > > +@@ -24,14 +24,15 @@ > > + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > + */ > > + > > +-#ifndef FELightingNEON_h > > +-#define FELightingNEON_h > > ++#pragma once > > + > > + #if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) > > + > > +-#include "FELighting.h" > > ++#include "FELightingSoftwareApplier.h" > > ++#include "ImageBuffer.h" > > + #include "PointLightSource.h" > > + #include "SpotLightSource.h" > > ++#include <wtf/ObjectIdentifier.h> > > + #include <wtf/ParallelJobs.h> > > + > > + namespace WebCore { > > +@@ -93,14 +94,14 @@ extern "C" { > > + void neonDrawLighting(FELightingPaintingDataForNeon*); > > + } > > + > > +-inline void FELighting::platformApplyNeon(const LightingData& data, const LightSource::PaintingData& paintingData) > > ++inline void FELightingSoftwareApplier::applyPlatformNeon(const FELightingSoftwareApplier::LightingData& data, const LightSource::PaintingData& paintingData) > > + { > > +- alignas(16) FELightingFloatArgumentsForNeon floatArguments; > > +- FELightingPaintingDataForNeon neonData = { > > ++ WebCore::FELightingFloatArgumentsForNeon alignas(16) floatArguments; > > ++ WebCore::FELightingPaintingDataForNeon neonData = { > > + data.pixels->data(), > > + 1, > > +- data.widthDecreasedByOne - 1, > > +- data.heightDecreasedByOne - 1, > > ++ data.width - 2, > > ++ data.height - 2, > > + 0, > > + 0, > > + 0, > > +@@ -111,23 +112,23 @@ inline void FELighting::platformApplyNeo > > + // Set light source arguments. > > + floatArguments.constOne = 1; > > + > > +- auto color = m_lightingColor.toColorTypeLossy<SRGBA<uint8_t>>().resolved(); > > ++ auto color = data.lightingColor.toColorTypeLossy<SRGBA<uint8_t>>().resolved(); > > + > > + floatArguments.colorRed = color.red; > > + floatArguments.colorGreen = color.green; > > + floatArguments.colorBlue = color.blue; > > + floatArguments.padding4 = 0; > > + > > +- if (m_lightSource->type() == LS_POINT) { > > ++ if (data.lightSource->type() == LS_POINT) { > > + neonData.flags |= FLAG_POINT_LIGHT; > > +- PointLightSource& pointLightSource = static_cast<PointLightSource&>(m_lightSource.get()); > > ++ const auto& pointLightSource = *static_cast<const PointLightSource*>(data.lightSource); > > + floatArguments.lightX = pointLightSource.position().x(); > > + floatArguments.lightY = pointLightSource.position().y(); > > + floatArguments.lightZ = pointLightSource.position().z(); > > + floatArguments.padding2 = 0; > > +- } else if (m_lightSource->type() == LS_SPOT) { > > ++ } else if (data.lightSource->type() == LS_SPOT) { > > + neonData.flags |= FLAG_SPOT_LIGHT; > > +- SpotLightSource& spotLightSource = static_cast<SpotLightSource&>(m_lightSource.get()); > > ++ const auto& spotLightSource = *static_cast<const SpotLightSource*>(data.lightSource); > > + floatArguments.lightX = spotLightSource.position().x(); > > + floatArguments.lightY = spotLightSource.position().y(); > > + floatArguments.lightZ = spotLightSource.position().z(); > > +@@ -145,7 +146,7 @@ inline void FELighting::platformApplyNeo > > + if (spotLightSource.specularExponent() == 1) > > + neonData.flags |= FLAG_CONE_EXPONENT_IS_1; > > + } else { > > +- ASSERT(m_lightSource->type() == LS_DISTANT); > > ++ ASSERT(data.lightSource->type() == LS_DISTANT); > > + floatArguments.lightX = paintingData.initialLightingData.lightVector.x(); > > + floatArguments.lightY = paintingData.initialLightingData.lightVector.y(); > > + floatArguments.lightZ = paintingData.initialLightingData.lightVector.z(); > > +@@ -155,38 +156,39 @@ inline void FELighting::platformApplyNeo > > + // Set lighting arguments. > > + floatArguments.surfaceScale = data.surfaceScale; > > + floatArguments.minusSurfaceScaleDividedByFour = -data.surfaceScale / 4; > > +- if (m_lightingType == FELighting::DiffuseLighting) > > +- floatArguments.diffuseConstant = m_diffuseConstant; > > ++ if (data.filterType == FilterEffect::Type::FEDiffuseLighting) > > ++ floatArguments.diffuseConstant = data.diffuseConstant; > > + else { > > + neonData.flags |= FLAG_SPECULAR_LIGHT; > > +- floatArguments.diffuseConstant = m_specularConstant; > > +- neonData.specularExponent = getPowerCoefficients(m_specularExponent); > > +- if (m_specularExponent == 1) > > ++ floatArguments.diffuseConstant = data.specularConstant; > > ++ neonData.specularExponent = getPowerCoefficients(data.specularExponent); > > ++ if (data.specularExponent == 1) > > + neonData.flags |= FLAG_SPECULAR_EXPONENT_IS_1; > > + } > > + if (floatArguments.diffuseConstant == 1) > > + neonData.flags |= FLAG_DIFFUSE_CONST_IS_1; > > + > > +- int optimalThreadNumber = ((data.widthDecreasedByOne - 1) * (data.heightDecreasedByOne - 1)) / s_minimalRectDimension; > > ++ static constexpr int minimalRectDimension = 100 * 100; // Empirical data limit for parallel jobs > > ++ int optimalThreadNumber = ((data.width - 2) * (data.height - 2)) / minimalRectDimension; > > + if (optimalThreadNumber > 1) { > > + // Initialize parallel jobs > > +- ParallelJobs<FELightingPaintingDataForNeon> parallelJobs(&WebCore::FELighting::platformApplyNeonWorker, optimalThreadNumber); > > ++ ParallelJobs<FELightingPaintingDataForNeon> parallelJobs(&FELightingSoftwareApplier::platformApplyNeonWorker, optimalThreadNumber); > > + > > + // Fill the parameter array > > + int job = parallelJobs.numberOfJobs(); > > + if (job > 1) { > > + int yStart = 1; > > +- int yStep = (data.heightDecreasedByOne - 1) / job; > > ++ int yStep = (data.height - 2) / job; > > + for (--job; job >= 0; --job) { > > + FELightingPaintingDataForNeon& params = parallelJobs.parameter(job); > > + params = neonData; > > + params.yStart = yStart; > > +- params.pixels += (yStart - 1) * (data.widthDecreasedByOne + 1) * 4; > > ++ params.pixels += (yStart - 1) * data.width * 4; > > + if (job > 0) { > > + params.absoluteHeight = yStep; > > + yStart += yStep; > > + } else > > +- params.absoluteHeight = data.heightDecreasedByOne - yStart; > > ++ params.absoluteHeight = (data.height - 1) - yStart; > > + } > > + parallelJobs.execute(); > > + return; > > +@@ -199,5 +201,3 @@ inline void FELighting::platformApplyNeo > > + } // namespace WebCore > > + > > + #endif // CPU(ARM_NEON) && COMPILER(GCC_COMPATIBLE) > > +- > > +-#endif // FELightingNEON_h > > +--- a/Source/WebCore/platform/graphics/filters/DistantLightSource.h > > ++++ b/Source/WebCore/platform/graphics/filters/DistantLightSource.h > > +@@ -25,6 +25,10 @@ > > + #include "LightSource.h" > > + #include <wtf/Ref.h> > > + > > ++namespace WTF { > > ++class TextStream; > > ++} // namespace WTF > > ++ > > + namespace WebCore { > > + > > + class DistantLightSource : public LightSource { > > +--- a/Source/WebCore/platform/graphics/filters/FELighting.h > > ++++ b/Source/WebCore/platform/graphics/filters/FELighting.h > > +@@ -35,8 +35,6 @@ > > + > > + namespace WebCore { > > + > > +-struct FELightingPaintingDataForNeon; > > +- > > + class FELighting : public FilterEffect { > > + public: > > + const Color& lightingColor() const { return m_lightingColor; } > > +@@ -67,11 +65,6 @@ protected: > > + > > + std::unique_ptr<FilterEffectApplier> createSoftwareApplier() const override; > > + > > +-#if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) > > +- static int getPowerCoefficients(float exponent); > > +- inline void platformApplyNeon(const LightingData&, const LightSource::PaintingData&); > > +-#endif > > +- > > + Color m_lightingColor; > > + float m_surfaceScale; > > + float m_diffuseConstant; > > +--- a/Source/WebCore/platform/graphics/filters/PointLightSource.h > > ++++ b/Source/WebCore/platform/graphics/filters/PointLightSource.h > > +@@ -26,6 +26,10 @@ > > + #include "LightSource.h" > > + #include <wtf/Ref.h> > > + > > ++namespace WTF { > > ++class TextStream; > > ++} // namespace WTF > > ++ > > + namespace WebCore { > > + > > + class PointLightSource : public LightSource { > > +--- a/Source/WebCore/platform/graphics/filters/SpotLightSource.h > > ++++ b/Source/WebCore/platform/graphics/filters/SpotLightSource.h > > +@@ -26,6 +26,10 @@ > > + #include "LightSource.h" > > + #include <wtf/Ref.h> > > + > > ++namespace WTF { > > ++class TextStream; > > ++} // namespace WTF > > ++ > > + namespace WebCore { > > + > > + class SpotLightSource : public LightSource { > > +--- a/Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h > > ++++ b/Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h > > +@@ -36,6 +36,7 @@ > > + namespace WebCore { > > + > > + class FELighting; > > ++struct FELightingPaintingDataForNeon; > > + > > + class FELightingSoftwareApplier final : public FilterEffectConcreteApplier<FELighting> { > > + WTF_MAKE_FAST_ALLOCATED; > > +@@ -132,8 +133,23 @@ private: > > + > > + static void applyPlatformGenericPaint(const LightingData&, const LightSource::PaintingData&, int startY, int endY); > > + static void applyPlatformGenericWorker(ApplyParameters*); > > ++ > > ++#if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) > > ++ static int getPowerCoefficients(float exponent); > > ++ static void platformApplyNeonWorker(FELightingPaintingDataForNeon*); > > ++ inline static void applyPlatformNeon(const LightingData&, const LightSource::PaintingData&); > > ++ > > ++ inline static void applyPlatformGeneric(const LightingData& data, const LightSource::PaintingData& paintingData) > > ++ { > > ++ applyPlatformNeon(data, paintingData); > > ++ } > > ++#else > > + static void applyPlatformGeneric(const LightingData&, const LightSource::PaintingData&); > > ++#endif > > ++ > > + static void applyPlatform(const LightingData&); > > + }; > > + > > + } // namespace WebCore > > ++ > > ++#include "FELightingNEON.h" > > diff --git a/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb b/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb > > index 47e52e25da..76b119c9c7 100644 > > --- a/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb > > +++ b/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb > > @@ -16,6 +16,7 @@ SRC_URI = "https://www.webkitgtk.org/releases/${BPN}-${PV}.tar.xz \ > > file://reproducibility.patch \ > > file://0001-When-building-introspection-files-do-not-quote-CFLAG.patch \ > > file://fix-gstreamer-include-paths.patch \ > > + file://0d3344e17d258106617b0e6d783d073b188a2548.patch \ > > " > > SRC_URI[sha256sum] = "0c260cf2b32f0481d017670dfed1b61e554967cd067195606c9f9eb5fe731743" > > > > -- > > 2.37.3 > >
On 9/14/22 11:02, Khem Raj wrote: > [Please note: This e-mail is from an EXTERNAL e-mail address] > > On Tue, Sep 13, 2022 at 7:25 PM Yu, Mingli <mingli.yu@windriver.com> wrote: >> >> Still failed on beaglebone-yocto: >> >> /build/tmp-glibc/work/cortexa8hf-neon-wrs-linux-gnueabi/webkitgtk/2.36.7-r0/webkitgtk-2.36.7/Source/W >> ebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp:38:8: error: >> standard attributes in middle of decl-specifiers >> 38 | static alignas(16) short s_FELightingConstantsForNeon[] = { >> | ^~~~~~~ >> > > What is your -j value ? please give 4GB per core of memory for > webkitgtk to build. Not specify the -j value explicitly at first and it still failed with the same error even specify the -j value as you mentioned. /build/tmp-glibc/work/cortexa8hf-neon-wrs-linux-gnueabi/webkitgtk/2.36.7-r0/webkitgtk-2.36.7/Source/W ebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp:38:8: error: standard attributes in middle of decl-specifiers 38 | static alignas(16) short s_FELightingConstantsForNeon[] = { | ^~~~~~~ Thanks, > >> Thanks, >> >> On 9/9/22 05:45, Khem Raj wrote: >>> [Please note: This e-mail is from an EXTERNAL e-mail address] >>> >>> Signed-off-by: Khem Raj <raj.khem@gmail.com> >>> Cc: Mingli Yu <mingli.yu@windriver.com> >>> --- >>> v2: Fix commit msg format >>> v3: Apply suggestion from https://github.com/WebKit/WebKit/pull/1233#discussion_r915217428 >>> >>> ...44e17d258106617b0e6d783d073b188a2548.patch | 296 ++++++++++++++++++ >>> meta/recipes-sato/webkit/webkitgtk_2.36.7.bb | 1 + >>> 2 files changed, 297 insertions(+) >>> create mode 100644 meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch >>> >>> diff --git a/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch b/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch >>> new file mode 100644 >>> index 0000000000..32f92f7ff5 >>> --- /dev/null >>> +++ b/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch >>> @@ -0,0 +1,296 @@ >>> +From 0d3344e17d258106617b0e6d783d073b188a2548 Mon Sep 17 00:00:00 2001 >>> +From: Adrian Perez de Castro <aperez@igalia.com> >>> +Date: Thu, 2 Jun 2022 11:19:06 +0300 >>> +Subject: [PATCH] [ARM][NEON] FELightningNEON.cpp fails to build, NEON fast >>> + path seems unused https://bugs.webkit.org/show_bug.cgi?id=241182 >>> + >>> +Reviewed by NOBODY (OOPS!). >>> + >>> +Move the NEON fast path for the SVG lighting filter effects into >>> +FELightingSoftwareApplier, and arrange to actually use them by >>> +forwarding calls to applyPlatformGeneric() into applyPlatformNeon(). >>> + >>> +Some changes were needed to adapt platformApplyNeon() to the current >>> +state of filters after r286140. This was not detected because the code >>> +bitrotted due to it being guarded with CPU(ARM_TRADITIONAL), which does >>> +not get used much these days: CPU(ARM_THUMB2) is more common. It should >>> +be possible to use the NEON fast paths also in Thumb mode, but that is >>> +left for a follow-up fix. >>> + >>> +* Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp: >>> +(WebCore::FELightingSoftwareApplier::platformApplyNeonWorker): >>> +(WebCore::FELightingSoftwareApplier::getPowerCoefficients): >>> +(WebCore::FELighting::platformApplyNeonWorker): Deleted. >>> +(WebCore::FELighting::getPowerCoefficients): Deleted. >>> +* Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h: >>> +(WebCore::FELightingSoftwareApplier::applyPlatformNeon): >>> +(WebCore::FELighting::platformApplyNeon): Deleted. >>> +* Source/WebCore/platform/graphics/filters/DistantLightSource.h: >>> +* Source/WebCore/platform/graphics/filters/FELighting.h: >>> +* Source/WebCore/platform/graphics/filters/PointLightSource.h: >>> +* Source/WebCore/platform/graphics/filters/SpotLightSource.h: >>> +* Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h: >>> +--- >>> +Upstream-Status: Submitted [https://github.com/WebKit/WebKit/pull/1233] >>> +Signed-off-by: Khem Raj <raj.khem@gmail.com> >>> + >>> + .../cpu/arm/filters/FELightingNEON.cpp | 4 +- >>> + .../graphics/cpu/arm/filters/FELightingNEON.h | 54 +++++++++---------- >>> + .../graphics/filters/DistantLightSource.h | 4 ++ >>> + .../platform/graphics/filters/FELighting.h | 7 --- >>> + .../graphics/filters/PointLightSource.h | 4 ++ >>> + .../graphics/filters/SpotLightSource.h | 4 ++ >>> + .../software/FELightingSoftwareApplier.h | 16 ++++++ >>> + 7 files changed, 57 insertions(+), 36 deletions(-) >>> + >>> +--- a/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp >>> ++++ b/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp >>> +@@ -49,7 +49,7 @@ short* feLightingConstantsForNeon() >>> + return s_FELightingConstantsForNeon; >>> + } >>> + >>> +-void FELighting::platformApplyNeonWorker(FELightingPaintingDataForNeon* parameters) >>> ++void FELightingSoftwareApplier::platformApplyNeonWorker(FELightingPaintingDataForNeon* parameters) >>> + { >>> + neonDrawLighting(parameters); >>> + } >>> +@@ -464,7 +464,7 @@ TOSTRING(neonDrawLighting) ":" NL >>> + "b .lightStrengthCalculated" NL >>> + ); // NOLINT >>> + >>> +-int FELighting::getPowerCoefficients(float exponent) >>> ++int FELightingSoftwareApplier::getPowerCoefficients(float exponent) >>> + { >>> + // Calling a powf function from the assembly code would require to save >>> + // and reload a lot of NEON registers. Since the base is in range [0..1] >>> +--- a/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h >>> ++++ b/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h >>> +@@ -24,14 +24,15 @@ >>> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >>> + */ >>> + >>> +-#ifndef FELightingNEON_h >>> +-#define FELightingNEON_h >>> ++#pragma once >>> + >>> + #if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) >>> + >>> +-#include "FELighting.h" >>> ++#include "FELightingSoftwareApplier.h" >>> ++#include "ImageBuffer.h" >>> + #include "PointLightSource.h" >>> + #include "SpotLightSource.h" >>> ++#include <wtf/ObjectIdentifier.h> >>> + #include <wtf/ParallelJobs.h> >>> + >>> + namespace WebCore { >>> +@@ -93,14 +94,14 @@ extern "C" { >>> + void neonDrawLighting(FELightingPaintingDataForNeon*); >>> + } >>> + >>> +-inline void FELighting::platformApplyNeon(const LightingData& data, const LightSource::PaintingData& paintingData) >>> ++inline void FELightingSoftwareApplier::applyPlatformNeon(const FELightingSoftwareApplier::LightingData& data, const LightSource::PaintingData& paintingData) >>> + { >>> +- alignas(16) FELightingFloatArgumentsForNeon floatArguments; >>> +- FELightingPaintingDataForNeon neonData = { >>> ++ WebCore::FELightingFloatArgumentsForNeon alignas(16) floatArguments; >>> ++ WebCore::FELightingPaintingDataForNeon neonData = { >>> + data.pixels->data(), >>> + 1, >>> +- data.widthDecreasedByOne - 1, >>> +- data.heightDecreasedByOne - 1, >>> ++ data.width - 2, >>> ++ data.height - 2, >>> + 0, >>> + 0, >>> + 0, >>> +@@ -111,23 +112,23 @@ inline void FELighting::platformApplyNeo >>> + // Set light source arguments. >>> + floatArguments.constOne = 1; >>> + >>> +- auto color = m_lightingColor.toColorTypeLossy<SRGBA<uint8_t>>().resolved(); >>> ++ auto color = data.lightingColor.toColorTypeLossy<SRGBA<uint8_t>>().resolved(); >>> + >>> + floatArguments.colorRed = color.red; >>> + floatArguments.colorGreen = color.green; >>> + floatArguments.colorBlue = color.blue; >>> + floatArguments.padding4 = 0; >>> + >>> +- if (m_lightSource->type() == LS_POINT) { >>> ++ if (data.lightSource->type() == LS_POINT) { >>> + neonData.flags |= FLAG_POINT_LIGHT; >>> +- PointLightSource& pointLightSource = static_cast<PointLightSource&>(m_lightSource.get()); >>> ++ const auto& pointLightSource = *static_cast<const PointLightSource*>(data.lightSource); >>> + floatArguments.lightX = pointLightSource.position().x(); >>> + floatArguments.lightY = pointLightSource.position().y(); >>> + floatArguments.lightZ = pointLightSource.position().z(); >>> + floatArguments.padding2 = 0; >>> +- } else if (m_lightSource->type() == LS_SPOT) { >>> ++ } else if (data.lightSource->type() == LS_SPOT) { >>> + neonData.flags |= FLAG_SPOT_LIGHT; >>> +- SpotLightSource& spotLightSource = static_cast<SpotLightSource&>(m_lightSource.get()); >>> ++ const auto& spotLightSource = *static_cast<const SpotLightSource*>(data.lightSource); >>> + floatArguments.lightX = spotLightSource.position().x(); >>> + floatArguments.lightY = spotLightSource.position().y(); >>> + floatArguments.lightZ = spotLightSource.position().z(); >>> +@@ -145,7 +146,7 @@ inline void FELighting::platformApplyNeo >>> + if (spotLightSource.specularExponent() == 1) >>> + neonData.flags |= FLAG_CONE_EXPONENT_IS_1; >>> + } else { >>> +- ASSERT(m_lightSource->type() == LS_DISTANT); >>> ++ ASSERT(data.lightSource->type() == LS_DISTANT); >>> + floatArguments.lightX = paintingData.initialLightingData.lightVector.x(); >>> + floatArguments.lightY = paintingData.initialLightingData.lightVector.y(); >>> + floatArguments.lightZ = paintingData.initialLightingData.lightVector.z(); >>> +@@ -155,38 +156,39 @@ inline void FELighting::platformApplyNeo >>> + // Set lighting arguments. >>> + floatArguments.surfaceScale = data.surfaceScale; >>> + floatArguments.minusSurfaceScaleDividedByFour = -data.surfaceScale / 4; >>> +- if (m_lightingType == FELighting::DiffuseLighting) >>> +- floatArguments.diffuseConstant = m_diffuseConstant; >>> ++ if (data.filterType == FilterEffect::Type::FEDiffuseLighting) >>> ++ floatArguments.diffuseConstant = data.diffuseConstant; >>> + else { >>> + neonData.flags |= FLAG_SPECULAR_LIGHT; >>> +- floatArguments.diffuseConstant = m_specularConstant; >>> +- neonData.specularExponent = getPowerCoefficients(m_specularExponent); >>> +- if (m_specularExponent == 1) >>> ++ floatArguments.diffuseConstant = data.specularConstant; >>> ++ neonData.specularExponent = getPowerCoefficients(data.specularExponent); >>> ++ if (data.specularExponent == 1) >>> + neonData.flags |= FLAG_SPECULAR_EXPONENT_IS_1; >>> + } >>> + if (floatArguments.diffuseConstant == 1) >>> + neonData.flags |= FLAG_DIFFUSE_CONST_IS_1; >>> + >>> +- int optimalThreadNumber = ((data.widthDecreasedByOne - 1) * (data.heightDecreasedByOne - 1)) / s_minimalRectDimension; >>> ++ static constexpr int minimalRectDimension = 100 * 100; // Empirical data limit for parallel jobs >>> ++ int optimalThreadNumber = ((data.width - 2) * (data.height - 2)) / minimalRectDimension; >>> + if (optimalThreadNumber > 1) { >>> + // Initialize parallel jobs >>> +- ParallelJobs<FELightingPaintingDataForNeon> parallelJobs(&WebCore::FELighting::platformApplyNeonWorker, optimalThreadNumber); >>> ++ ParallelJobs<FELightingPaintingDataForNeon> parallelJobs(&FELightingSoftwareApplier::platformApplyNeonWorker, optimalThreadNumber); >>> + >>> + // Fill the parameter array >>> + int job = parallelJobs.numberOfJobs(); >>> + if (job > 1) { >>> + int yStart = 1; >>> +- int yStep = (data.heightDecreasedByOne - 1) / job; >>> ++ int yStep = (data.height - 2) / job; >>> + for (--job; job >= 0; --job) { >>> + FELightingPaintingDataForNeon& params = parallelJobs.parameter(job); >>> + params = neonData; >>> + params.yStart = yStart; >>> +- params.pixels += (yStart - 1) * (data.widthDecreasedByOne + 1) * 4; >>> ++ params.pixels += (yStart - 1) * data.width * 4; >>> + if (job > 0) { >>> + params.absoluteHeight = yStep; >>> + yStart += yStep; >>> + } else >>> +- params.absoluteHeight = data.heightDecreasedByOne - yStart; >>> ++ params.absoluteHeight = (data.height - 1) - yStart; >>> + } >>> + parallelJobs.execute(); >>> + return; >>> +@@ -199,5 +201,3 @@ inline void FELighting::platformApplyNeo >>> + } // namespace WebCore >>> + >>> + #endif // CPU(ARM_NEON) && COMPILER(GCC_COMPATIBLE) >>> +- >>> +-#endif // FELightingNEON_h >>> +--- a/Source/WebCore/platform/graphics/filters/DistantLightSource.h >>> ++++ b/Source/WebCore/platform/graphics/filters/DistantLightSource.h >>> +@@ -25,6 +25,10 @@ >>> + #include "LightSource.h" >>> + #include <wtf/Ref.h> >>> + >>> ++namespace WTF { >>> ++class TextStream; >>> ++} // namespace WTF >>> ++ >>> + namespace WebCore { >>> + >>> + class DistantLightSource : public LightSource { >>> +--- a/Source/WebCore/platform/graphics/filters/FELighting.h >>> ++++ b/Source/WebCore/platform/graphics/filters/FELighting.h >>> +@@ -35,8 +35,6 @@ >>> + >>> + namespace WebCore { >>> + >>> +-struct FELightingPaintingDataForNeon; >>> +- >>> + class FELighting : public FilterEffect { >>> + public: >>> + const Color& lightingColor() const { return m_lightingColor; } >>> +@@ -67,11 +65,6 @@ protected: >>> + >>> + std::unique_ptr<FilterEffectApplier> createSoftwareApplier() const override; >>> + >>> +-#if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) >>> +- static int getPowerCoefficients(float exponent); >>> +- inline void platformApplyNeon(const LightingData&, const LightSource::PaintingData&); >>> +-#endif >>> +- >>> + Color m_lightingColor; >>> + float m_surfaceScale; >>> + float m_diffuseConstant; >>> +--- a/Source/WebCore/platform/graphics/filters/PointLightSource.h >>> ++++ b/Source/WebCore/platform/graphics/filters/PointLightSource.h >>> +@@ -26,6 +26,10 @@ >>> + #include "LightSource.h" >>> + #include <wtf/Ref.h> >>> + >>> ++namespace WTF { >>> ++class TextStream; >>> ++} // namespace WTF >>> ++ >>> + namespace WebCore { >>> + >>> + class PointLightSource : public LightSource { >>> +--- a/Source/WebCore/platform/graphics/filters/SpotLightSource.h >>> ++++ b/Source/WebCore/platform/graphics/filters/SpotLightSource.h >>> +@@ -26,6 +26,10 @@ >>> + #include "LightSource.h" >>> + #include <wtf/Ref.h> >>> + >>> ++namespace WTF { >>> ++class TextStream; >>> ++} // namespace WTF >>> ++ >>> + namespace WebCore { >>> + >>> + class SpotLightSource : public LightSource { >>> +--- a/Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h >>> ++++ b/Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h >>> +@@ -36,6 +36,7 @@ >>> + namespace WebCore { >>> + >>> + class FELighting; >>> ++struct FELightingPaintingDataForNeon; >>> + >>> + class FELightingSoftwareApplier final : public FilterEffectConcreteApplier<FELighting> { >>> + WTF_MAKE_FAST_ALLOCATED; >>> +@@ -132,8 +133,23 @@ private: >>> + >>> + static void applyPlatformGenericPaint(const LightingData&, const LightSource::PaintingData&, int startY, int endY); >>> + static void applyPlatformGenericWorker(ApplyParameters*); >>> ++ >>> ++#if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) >>> ++ static int getPowerCoefficients(float exponent); >>> ++ static void platformApplyNeonWorker(FELightingPaintingDataForNeon*); >>> ++ inline static void applyPlatformNeon(const LightingData&, const LightSource::PaintingData&); >>> ++ >>> ++ inline static void applyPlatformGeneric(const LightingData& data, const LightSource::PaintingData& paintingData) >>> ++ { >>> ++ applyPlatformNeon(data, paintingData); >>> ++ } >>> ++#else >>> + static void applyPlatformGeneric(const LightingData&, const LightSource::PaintingData&); >>> ++#endif >>> ++ >>> + static void applyPlatform(const LightingData&); >>> + }; >>> + >>> + } // namespace WebCore >>> ++ >>> ++#include "FELightingNEON.h" >>> diff --git a/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb b/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb >>> index 47e52e25da..76b119c9c7 100644 >>> --- a/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb >>> +++ b/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb >>> @@ -16,6 +16,7 @@ SRC_URI = "https://www.webkitgtk.org/releases/${BPN}-${PV}.tar.xz \ >>> file://reproducibility.patch \ >>> file://0001-When-building-introspection-files-do-not-quote-CFLAG.patch \ >>> file://fix-gstreamer-include-paths.patch \ >>> + file://0d3344e17d258106617b0e6d783d073b188a2548.patch \ >>> " >>> SRC_URI[sha256sum] = "0c260cf2b32f0481d017670dfed1b61e554967cd067195606c9f9eb5fe731743" >>> >>> -- >>> 2.37.3 >>>
diff --git a/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch b/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch new file mode 100644 index 0000000000..32f92f7ff5 --- /dev/null +++ b/meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch @@ -0,0 +1,296 @@ +From 0d3344e17d258106617b0e6d783d073b188a2548 Mon Sep 17 00:00:00 2001 +From: Adrian Perez de Castro <aperez@igalia.com> +Date: Thu, 2 Jun 2022 11:19:06 +0300 +Subject: [PATCH] [ARM][NEON] FELightningNEON.cpp fails to build, NEON fast + path seems unused https://bugs.webkit.org/show_bug.cgi?id=241182 + +Reviewed by NOBODY (OOPS!). + +Move the NEON fast path for the SVG lighting filter effects into +FELightingSoftwareApplier, and arrange to actually use them by +forwarding calls to applyPlatformGeneric() into applyPlatformNeon(). + +Some changes were needed to adapt platformApplyNeon() to the current +state of filters after r286140. This was not detected because the code +bitrotted due to it being guarded with CPU(ARM_TRADITIONAL), which does +not get used much these days: CPU(ARM_THUMB2) is more common. It should +be possible to use the NEON fast paths also in Thumb mode, but that is +left for a follow-up fix. + +* Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp: +(WebCore::FELightingSoftwareApplier::platformApplyNeonWorker): +(WebCore::FELightingSoftwareApplier::getPowerCoefficients): +(WebCore::FELighting::platformApplyNeonWorker): Deleted. +(WebCore::FELighting::getPowerCoefficients): Deleted. +* Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h: +(WebCore::FELightingSoftwareApplier::applyPlatformNeon): +(WebCore::FELighting::platformApplyNeon): Deleted. +* Source/WebCore/platform/graphics/filters/DistantLightSource.h: +* Source/WebCore/platform/graphics/filters/FELighting.h: +* Source/WebCore/platform/graphics/filters/PointLightSource.h: +* Source/WebCore/platform/graphics/filters/SpotLightSource.h: +* Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h: +--- +Upstream-Status: Submitted [https://github.com/WebKit/WebKit/pull/1233] +Signed-off-by: Khem Raj <raj.khem@gmail.com> + + .../cpu/arm/filters/FELightingNEON.cpp | 4 +- + .../graphics/cpu/arm/filters/FELightingNEON.h | 54 +++++++++---------- + .../graphics/filters/DistantLightSource.h | 4 ++ + .../platform/graphics/filters/FELighting.h | 7 --- + .../graphics/filters/PointLightSource.h | 4 ++ + .../graphics/filters/SpotLightSource.h | 4 ++ + .../software/FELightingSoftwareApplier.h | 16 ++++++ + 7 files changed, 57 insertions(+), 36 deletions(-) + +--- a/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp ++++ b/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp +@@ -49,7 +49,7 @@ short* feLightingConstantsForNeon() + return s_FELightingConstantsForNeon; + } + +-void FELighting::platformApplyNeonWorker(FELightingPaintingDataForNeon* parameters) ++void FELightingSoftwareApplier::platformApplyNeonWorker(FELightingPaintingDataForNeon* parameters) + { + neonDrawLighting(parameters); + } +@@ -464,7 +464,7 @@ TOSTRING(neonDrawLighting) ":" NL + "b .lightStrengthCalculated" NL + ); // NOLINT + +-int FELighting::getPowerCoefficients(float exponent) ++int FELightingSoftwareApplier::getPowerCoefficients(float exponent) + { + // Calling a powf function from the assembly code would require to save + // and reload a lot of NEON registers. Since the base is in range [0..1] +--- a/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h ++++ b/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h +@@ -24,14 +24,15 @@ + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +-#ifndef FELightingNEON_h +-#define FELightingNEON_h ++#pragma once + + #if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) + +-#include "FELighting.h" ++#include "FELightingSoftwareApplier.h" ++#include "ImageBuffer.h" + #include "PointLightSource.h" + #include "SpotLightSource.h" ++#include <wtf/ObjectIdentifier.h> + #include <wtf/ParallelJobs.h> + + namespace WebCore { +@@ -93,14 +94,14 @@ extern "C" { + void neonDrawLighting(FELightingPaintingDataForNeon*); + } + +-inline void FELighting::platformApplyNeon(const LightingData& data, const LightSource::PaintingData& paintingData) ++inline void FELightingSoftwareApplier::applyPlatformNeon(const FELightingSoftwareApplier::LightingData& data, const LightSource::PaintingData& paintingData) + { +- alignas(16) FELightingFloatArgumentsForNeon floatArguments; +- FELightingPaintingDataForNeon neonData = { ++ WebCore::FELightingFloatArgumentsForNeon alignas(16) floatArguments; ++ WebCore::FELightingPaintingDataForNeon neonData = { + data.pixels->data(), + 1, +- data.widthDecreasedByOne - 1, +- data.heightDecreasedByOne - 1, ++ data.width - 2, ++ data.height - 2, + 0, + 0, + 0, +@@ -111,23 +112,23 @@ inline void FELighting::platformApplyNeo + // Set light source arguments. + floatArguments.constOne = 1; + +- auto color = m_lightingColor.toColorTypeLossy<SRGBA<uint8_t>>().resolved(); ++ auto color = data.lightingColor.toColorTypeLossy<SRGBA<uint8_t>>().resolved(); + + floatArguments.colorRed = color.red; + floatArguments.colorGreen = color.green; + floatArguments.colorBlue = color.blue; + floatArguments.padding4 = 0; + +- if (m_lightSource->type() == LS_POINT) { ++ if (data.lightSource->type() == LS_POINT) { + neonData.flags |= FLAG_POINT_LIGHT; +- PointLightSource& pointLightSource = static_cast<PointLightSource&>(m_lightSource.get()); ++ const auto& pointLightSource = *static_cast<const PointLightSource*>(data.lightSource); + floatArguments.lightX = pointLightSource.position().x(); + floatArguments.lightY = pointLightSource.position().y(); + floatArguments.lightZ = pointLightSource.position().z(); + floatArguments.padding2 = 0; +- } else if (m_lightSource->type() == LS_SPOT) { ++ } else if (data.lightSource->type() == LS_SPOT) { + neonData.flags |= FLAG_SPOT_LIGHT; +- SpotLightSource& spotLightSource = static_cast<SpotLightSource&>(m_lightSource.get()); ++ const auto& spotLightSource = *static_cast<const SpotLightSource*>(data.lightSource); + floatArguments.lightX = spotLightSource.position().x(); + floatArguments.lightY = spotLightSource.position().y(); + floatArguments.lightZ = spotLightSource.position().z(); +@@ -145,7 +146,7 @@ inline void FELighting::platformApplyNeo + if (spotLightSource.specularExponent() == 1) + neonData.flags |= FLAG_CONE_EXPONENT_IS_1; + } else { +- ASSERT(m_lightSource->type() == LS_DISTANT); ++ ASSERT(data.lightSource->type() == LS_DISTANT); + floatArguments.lightX = paintingData.initialLightingData.lightVector.x(); + floatArguments.lightY = paintingData.initialLightingData.lightVector.y(); + floatArguments.lightZ = paintingData.initialLightingData.lightVector.z(); +@@ -155,38 +156,39 @@ inline void FELighting::platformApplyNeo + // Set lighting arguments. + floatArguments.surfaceScale = data.surfaceScale; + floatArguments.minusSurfaceScaleDividedByFour = -data.surfaceScale / 4; +- if (m_lightingType == FELighting::DiffuseLighting) +- floatArguments.diffuseConstant = m_diffuseConstant; ++ if (data.filterType == FilterEffect::Type::FEDiffuseLighting) ++ floatArguments.diffuseConstant = data.diffuseConstant; + else { + neonData.flags |= FLAG_SPECULAR_LIGHT; +- floatArguments.diffuseConstant = m_specularConstant; +- neonData.specularExponent = getPowerCoefficients(m_specularExponent); +- if (m_specularExponent == 1) ++ floatArguments.diffuseConstant = data.specularConstant; ++ neonData.specularExponent = getPowerCoefficients(data.specularExponent); ++ if (data.specularExponent == 1) + neonData.flags |= FLAG_SPECULAR_EXPONENT_IS_1; + } + if (floatArguments.diffuseConstant == 1) + neonData.flags |= FLAG_DIFFUSE_CONST_IS_1; + +- int optimalThreadNumber = ((data.widthDecreasedByOne - 1) * (data.heightDecreasedByOne - 1)) / s_minimalRectDimension; ++ static constexpr int minimalRectDimension = 100 * 100; // Empirical data limit for parallel jobs ++ int optimalThreadNumber = ((data.width - 2) * (data.height - 2)) / minimalRectDimension; + if (optimalThreadNumber > 1) { + // Initialize parallel jobs +- ParallelJobs<FELightingPaintingDataForNeon> parallelJobs(&WebCore::FELighting::platformApplyNeonWorker, optimalThreadNumber); ++ ParallelJobs<FELightingPaintingDataForNeon> parallelJobs(&FELightingSoftwareApplier::platformApplyNeonWorker, optimalThreadNumber); + + // Fill the parameter array + int job = parallelJobs.numberOfJobs(); + if (job > 1) { + int yStart = 1; +- int yStep = (data.heightDecreasedByOne - 1) / job; ++ int yStep = (data.height - 2) / job; + for (--job; job >= 0; --job) { + FELightingPaintingDataForNeon& params = parallelJobs.parameter(job); + params = neonData; + params.yStart = yStart; +- params.pixels += (yStart - 1) * (data.widthDecreasedByOne + 1) * 4; ++ params.pixels += (yStart - 1) * data.width * 4; + if (job > 0) { + params.absoluteHeight = yStep; + yStart += yStep; + } else +- params.absoluteHeight = data.heightDecreasedByOne - yStart; ++ params.absoluteHeight = (data.height - 1) - yStart; + } + parallelJobs.execute(); + return; +@@ -199,5 +201,3 @@ inline void FELighting::platformApplyNeo + } // namespace WebCore + + #endif // CPU(ARM_NEON) && COMPILER(GCC_COMPATIBLE) +- +-#endif // FELightingNEON_h +--- a/Source/WebCore/platform/graphics/filters/DistantLightSource.h ++++ b/Source/WebCore/platform/graphics/filters/DistantLightSource.h +@@ -25,6 +25,10 @@ + #include "LightSource.h" + #include <wtf/Ref.h> + ++namespace WTF { ++class TextStream; ++} // namespace WTF ++ + namespace WebCore { + + class DistantLightSource : public LightSource { +--- a/Source/WebCore/platform/graphics/filters/FELighting.h ++++ b/Source/WebCore/platform/graphics/filters/FELighting.h +@@ -35,8 +35,6 @@ + + namespace WebCore { + +-struct FELightingPaintingDataForNeon; +- + class FELighting : public FilterEffect { + public: + const Color& lightingColor() const { return m_lightingColor; } +@@ -67,11 +65,6 @@ protected: + + std::unique_ptr<FilterEffectApplier> createSoftwareApplier() const override; + +-#if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) +- static int getPowerCoefficients(float exponent); +- inline void platformApplyNeon(const LightingData&, const LightSource::PaintingData&); +-#endif +- + Color m_lightingColor; + float m_surfaceScale; + float m_diffuseConstant; +--- a/Source/WebCore/platform/graphics/filters/PointLightSource.h ++++ b/Source/WebCore/platform/graphics/filters/PointLightSource.h +@@ -26,6 +26,10 @@ + #include "LightSource.h" + #include <wtf/Ref.h> + ++namespace WTF { ++class TextStream; ++} // namespace WTF ++ + namespace WebCore { + + class PointLightSource : public LightSource { +--- a/Source/WebCore/platform/graphics/filters/SpotLightSource.h ++++ b/Source/WebCore/platform/graphics/filters/SpotLightSource.h +@@ -26,6 +26,10 @@ + #include "LightSource.h" + #include <wtf/Ref.h> + ++namespace WTF { ++class TextStream; ++} // namespace WTF ++ + namespace WebCore { + + class SpotLightSource : public LightSource { +--- a/Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h ++++ b/Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h +@@ -36,6 +36,7 @@ + namespace WebCore { + + class FELighting; ++struct FELightingPaintingDataForNeon; + + class FELightingSoftwareApplier final : public FilterEffectConcreteApplier<FELighting> { + WTF_MAKE_FAST_ALLOCATED; +@@ -132,8 +133,23 @@ private: + + static void applyPlatformGenericPaint(const LightingData&, const LightSource::PaintingData&, int startY, int endY); + static void applyPlatformGenericWorker(ApplyParameters*); ++ ++#if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC_COMPATIBLE) ++ static int getPowerCoefficients(float exponent); ++ static void platformApplyNeonWorker(FELightingPaintingDataForNeon*); ++ inline static void applyPlatformNeon(const LightingData&, const LightSource::PaintingData&); ++ ++ inline static void applyPlatformGeneric(const LightingData& data, const LightSource::PaintingData& paintingData) ++ { ++ applyPlatformNeon(data, paintingData); ++ } ++#else + static void applyPlatformGeneric(const LightingData&, const LightSource::PaintingData&); ++#endif ++ + static void applyPlatform(const LightingData&); + }; + + } // namespace WebCore ++ ++#include "FELightingNEON.h" diff --git a/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb b/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb index 47e52e25da..76b119c9c7 100644 --- a/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb +++ b/meta/recipes-sato/webkit/webkitgtk_2.36.7.bb @@ -16,6 +16,7 @@ SRC_URI = "https://www.webkitgtk.org/releases/${BPN}-${PV}.tar.xz \ file://reproducibility.patch \ file://0001-When-building-introspection-files-do-not-quote-CFLAG.patch \ file://fix-gstreamer-include-paths.patch \ + file://0d3344e17d258106617b0e6d783d073b188a2548.patch \ " SRC_URI[sha256sum] = "0c260cf2b32f0481d017670dfed1b61e554967cd067195606c9f9eb5fe731743"
Signed-off-by: Khem Raj <raj.khem@gmail.com> Cc: Mingli Yu <mingli.yu@windriver.com> --- v2: Fix commit msg format v3: Apply suggestion from https://github.com/WebKit/WebKit/pull/1233#discussion_r915217428 ...44e17d258106617b0e6d783d073b188a2548.patch | 296 ++++++++++++++++++ meta/recipes-sato/webkit/webkitgtk_2.36.7.bb | 1 + 2 files changed, 297 insertions(+) create mode 100644 meta/recipes-sato/webkit/webkitgtk/0d3344e17d258106617b0e6d783d073b188a2548.patch