123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- From 5ba2d275457c4fdf1efdcca8351792400bda5679 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] 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/Sources.txt:
- * 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:
- Signed-off-by: Adrian Perez de Castro <aperez@igalia.com>
- Upstream: https://bugs.webkit.org/show_bug.cgi?id=241182
- ---
- Source/WebCore/Sources.txt | 1 +
- .../cpu/arm/filters/FELightingNEON.cpp | 6 +--
- .../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 ++++++
- 8 files changed, 59 insertions(+), 37 deletions(-)
- diff --git a/Source/WebCore/Sources.txt b/Source/WebCore/Sources.txt
- index 9ca28a7b2bc0..ed2c7f9f41ee 100644
- --- a/Source/WebCore/Sources.txt
- +++ b/Source/WebCore/Sources.txt
- @@ -2303,6 +2303,7 @@ platform/graphics/controls/MeterPart.cpp
- platform/graphics/controls/ProgressBarPart.cpp
- platform/graphics/controls/SliderTrackPart.cpp
- platform/graphics/cpu/arm/filters/FEBlendNeonApplier.cpp
- +platform/graphics/cpu/arm/filters/FELightingNEON.cpp
- platform/graphics/displaylists/DisplayList.cpp
- platform/graphics/displaylists/DisplayListDrawingContext.cpp
- platform/graphics/displaylists/DisplayListItems.cpp
- diff --git a/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp b/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp
- index f6ff8c20a5a8..dced3d55eb4e 100644
- --- a/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp
- +++ b/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp
- @@ -35,7 +35,7 @@ namespace WebCore {
- // ALPHAX_Q ALPHAY_Q REMAPX_D REMAPY_D
- -static alignas(16) short s_FELightingConstantsForNeon[] = {
- +alignas(16) static short s_FELightingConstantsForNeon[] = {
- // Alpha coefficients.
- -2, 1, 0, -1, 2, 1, 0, -1,
- 0, -1, -2, -1, 0, 1, 2, 1,
- @@ -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]
- diff --git a/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h b/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h
- index b17c603d40d3..fd23e31cce29 100644
- --- 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 = {
- - data.pixels->data(),
- + alignas(16) WebCore::FELightingFloatArgumentsForNeon floatArguments;
- + WebCore::FELightingPaintingDataForNeon neonData = {
- + data.pixels->bytes(),
- 1,
- - data.widthDecreasedByOne - 1,
- - data.heightDecreasedByOne - 1,
- + data.width - 2,
- + data.height - 2,
- 0,
- 0,
- 0,
- @@ -111,23 +112,23 @@ inline void FELighting::platformApplyNeon(const LightingData& data, const LightS
- // 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::platformApplyNeon(const LightingData& data, const LightS
- 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::platformApplyNeon(const LightingData& data, const LightS
- // 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::platformApplyNeon(const LightingData& data, const LightS
- } // namespace WebCore
- #endif // CPU(ARM_NEON) && COMPILER(GCC_COMPATIBLE)
- -
- -#endif // FELightingNEON_h
- diff --git a/Source/WebCore/platform/graphics/filters/DistantLightSource.h b/Source/WebCore/platform/graphics/filters/DistantLightSource.h
- index 70f583b36e2c..7d5d27e5ccf8 100644
- --- a/Source/WebCore/platform/graphics/filters/DistantLightSource.h
- +++ b/Source/WebCore/platform/graphics/filters/DistantLightSource.h
- @@ -26,6 +26,10 @@
- #include <wtf/ArgumentCoder.h>
- #include <wtf/Ref.h>
- +namespace WTF {
- +class TextStream;
- +} // namespace WTF
- +
- namespace WebCore {
- class DistantLightSource : public LightSource {
- diff --git a/Source/WebCore/platform/graphics/filters/FELighting.h b/Source/WebCore/platform/graphics/filters/FELighting.h
- index 179edf6dba24..694d712d56fd 100644
- --- 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:
- bool operator==(const FELighting&) const;
- @@ -68,11 +66,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;
- diff --git a/Source/WebCore/platform/graphics/filters/PointLightSource.h b/Source/WebCore/platform/graphics/filters/PointLightSource.h
- index a8cfdab895a9..34f867bba237 100644
- --- 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 {
- diff --git a/Source/WebCore/platform/graphics/filters/SpotLightSource.h b/Source/WebCore/platform/graphics/filters/SpotLightSource.h
- index 6404467a5b6f..5cac38f22362 100644
- --- 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 {
- diff --git a/Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h b/Source/WebCore/platform/graphics/filters/software/FELightingSoftwareApplier.h
- index c974d92115ff..e2896660cfbd 100644
- --- 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"
- --
- 2.43.1
|