diff mbox series

[v3] webkitgtk: Fix build on 32bit arm

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

Commit Message

Khem Raj Sept. 8, 2022, 9:45 p.m. UTC
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

Comments

Yu, Mingli Sept. 14, 2022, 2:25 a.m. UTC | #1
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
>
Khem Raj Sept. 14, 2022, 3:02 a.m. UTC | #2
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
> >
Yu, Mingli Sept. 14, 2022, 5:29 a.m. UTC | #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 mbox series

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"