No subject
Wed Aug 1 07:28:53 PDT 2012
* CMakeLists.txt:
* GNUmakefile.am:
* GNUmakefile.list.am:
* Target.pri:
* WebCore.gyp/WebCore.gyp:
* WebCore.gypi:
* WebCore.pri:
* WebCore.xcodeproj/project.pbxproj:
* platform/graphics/cpu/arm/filters/FEBlendNEON.h: Renamed from Source/We=
bCore/platform/graphics/filters/arm/FEBlendNEON.h.
(WebCore):
(FEBlendUtilitiesNEON):
(WebCore::FEBlendUtilitiesNEON::div255):
(WebCore::FEBlendUtilitiesNEON::normal):
(WebCore::FEBlendUtilitiesNEON::multiply):
(WebCore::FEBlendUtilitiesNEON::screen):
(WebCore::FEBlendUtilitiesNEON::darken):
(WebCore::FEBlendUtilitiesNEON::lighten):
(WebCore::FEBlend::platformApplyNEON):
* platform/graphics/cpu/arm/filters/FECompositeArithmeticNEON.h: Renamed =
from Source/WebCore/platform/graphics/filters/arm/FECompositeArithmeticNE=
ON.h.
(WebCore):
(WebCore::FEComposite::computeArithmeticPixelsNeon):
(WebCore::FEComposite::platformArithmeticNeon):
* platform/graphics/cpu/arm/filters/FEGaussianBlurNEON.h: Renamed from So=
urce/WebCore/platform/graphics/filters/arm/FEGaussianBlurNEON.h.
(WebCore):
(WebCore::boxBlurNEON):
* platform/graphics/cpu/arm/filters/FELightingNEON.cpp: Renamed from Sour=
ce/WebCore/platform/graphics/filters/arm/FELightingNEON.cpp.
(WebCore):
(WebCore::feLightingConstantsForNeon):
(WebCore::FELighting::platformApplyNeonWorker):
(WebCore::FELighting::getPowerCoefficients):
* platform/graphics/cpu/arm/filters/FELightingNEON.h: Renamed from Source=
/WebCore/platform/graphics/filters/arm/FELightingNEON.h.
(WebCore):
(FELightingFloatArgumentsForNeon):
(FELightingPaintingDataForNeon):
(WebCore::FELighting::platformApplyNeon):
* platform/graphics/cpu/arm/filters/NEONHelpers.h: Renamed from Source/We=
bCore/platform/graphics/filters/arm/NEONHelpers.h.
(WebCore):
(WebCore::loadRGBA8AsFloat):
(WebCore::storeFloatAsRGBA8):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href=3D"#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMa=
keLists.txt</a></li>
<li><a href=3D"#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeL=
og</a></li>
<li><a href=3D"#trunkSourceWebCoreGNUmakefileam">trunk/Source/WebCore/GNU=
makefile.am</a></li>
<li><a href=3D"#trunkSourceWebCoreGNUmakefilelistam">trunk/Source/WebCore=
/GNUmakefile.list.am</a></li>
<li><a href=3D"#trunkSourceWebCoreTargetpri">trunk/Source/WebCore/Target.=
pri</a></li>
<li><a href=3D"#trunkSourceWebCoreWebCoregypWebCoregyp">trunk/Source/WebC=
ore/WebCore.gyp/WebCore.gyp</a></li>
<li><a href=3D"#trunkSourceWebCoreWebCoregypi">trunk/Source/WebCore/WebCo=
re.gypi</a></li>
<li><a href=3D"#trunkSourceWebCoreWebCorepri">trunk/Source/WebCore/WebCor=
e.pri</a></li>
<li><a href=3D"#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/S=
ource/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li>trunk/Source/WebCore/platform/graphics/cpu/arm/filters/</li>
<li><a href=3D"#trunkSourceWebCoreplatformgraphicscpuarmfiltersFEBlendNEO=
Nh">trunk/Source/WebCore/platform/graphics/cpu/arm/filters/FEBlendNEON.h<=
/a></li>
<li><a href=3D"#trunkSourceWebCoreplatformgraphicscpuarmfiltersFEComposit=
eArithmeticNEONh">trunk/Source/WebCore/platform/graphics/cpu/arm/filters/=
FECompositeArithmeticNEON.h</a></li>
<li><a href=3D"#trunkSourceWebCoreplatformgraphicscpuarmfiltersFEGaussian=
BlurNEONh">trunk/Source/WebCore/platform/graphics/cpu/arm/filters/FEGauss=
ianBlurNEON.h</a></li>
<li><a href=3D"#trunkSourceWebCoreplatformgraphicscpuarmfiltersFELighting=
NEONcpp">trunk/Source/WebCore/platform/graphics/cpu/arm/filters/FELightin=
gNEON.cpp</a></li>
<li><a href=3D"#trunkSourceWebCoreplatformgraphicscpuarmfiltersFELighting=
NEONh">trunk/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingN=
EON.h</a></li>
<li><a href=3D"#trunkSourceWebCoreplatformgraphicscpuarmfiltersNEONHelper=
sh">trunk/Source/WebCore/platform/graphics/cpu/arm/filters/NEONHelpers.h<=
/a></li>
</ul>
<h3>Removed Paths</h3>
<ul>
<li>trunk/Source/WebCore/platform/graphics/filters/arm/</li>
</ul>
</div>
<div id=3D"patch">
<h3>Diff</h3>
<a id=3D"trunkSourceWebCoreCMakeListstxt"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt =
(134766 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/CMakeLists.txt 2012-11-15 1=
3:04:54 UTC (rev 134766)
+++ trunk/Source/WebCore/CMakeLists.txt 2012-11-15 13:42:28 UTC (rev 1347=
67)
</span><span class=3D"lines">@@ -49,8 +49,8 @@
</span><span class=3D"cx"> "${WEBCORE_DIR}/platform/audio"
</span><span class=3D"cx"> "${WEBCORE_DIR}/platform/graphics&quo=
t;
</span><span class=3D"cx"> "${WEBCORE_DIR}/platform/graphics/cpu=
/arm"
</span><ins>+ "${WEBCORE_DIR}/platform/graphics/cpu/arm/filters&q=
uot;
</ins><span class=3D"cx"> "${WEBCORE_DIR}/platform/graphics/filt=
ers"
</span><del>- "${WEBCORE_DIR}/platform/graphics/filters/arm"
</del><span class=3D"cx"> "${WEBCORE_DIR}/platform/graphics/harf=
buzz"
</span><span class=3D"cx"> "${WEBCORE_DIR}/platform/graphics/har=
fbuzz/ng"
</span><span class=3D"cx"> "${WEBCORE_DIR}/platform/graphics/ope=
ntype"
</span><span class=3D"lines">@@ -1904,6 +1904,8 @@
</span><span class=3D"cx"> platform/graphics/TiledBackingStore.cpp
</span><span class=3D"cx"> platform/graphics/WidthIterator.cpp
</span><span class=3D"cx">=20
</span><ins>+ platform/graphics/cpu/arm/filters/FELightingNEON.cpp
+
</ins><span class=3D"cx"> platform/graphics/filters/CustomFilterCompi=
ledProgram.cpp
</span><span class=3D"cx"> platform/graphics/filters/CustomFilterGlob=
alContext.cpp
</span><span class=3D"cx"> platform/graphics/filters/CustomFilterMesh=
.cpp
</span><span class=3D"lines">@@ -1941,8 +1943,6 @@
</span><span class=3D"cx"> platform/graphics/filters/SourceGraphic.cp=
p
</span><span class=3D"cx"> platform/graphics/filters/SpotLightSource.=
cpp
</span><span class=3D"cx">=20
</span><del>- platform/graphics/filters/arm/FELightingNEON.cpp
-
</del><span class=3D"cx"> platform/graphics/texmap/TextureMapper.cpp
</span><span class=3D"cx"> platform/graphics/texmap/TextureMapperBack=
ingStore.cpp
</span><span class=3D"cx"> platform/graphics/texmap/TextureMapperImag=
eBuffer.cpp
</span></span></pre></div>
<a id=3D"trunkSourceWebCoreChangeLog"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (1347=
66 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/ChangeLog 2012-11-15 13:04:=
54 UTC (rev 134766)
+++ trunk/Source/WebCore/ChangeLog 2012-11-15 13:42:28 UTC (rev 134767)
</span><span class=3D"lines">@@ -1,3 +1,54 @@
</span><ins>+2012-11-15 Gabor Rapcsanyi <rgabor at webkit.org>
+
+ Relocate the ARM NEON SVG filter optimizations
+ https://bugs.webkit.org/show_bug.cgi?id=3D102214
+
+ Reviewed by Zoltan Herczeg.
+
+ Relocate the ARM filter optimizations into platform/graphics/cpu=
/arm
+ to keep them together with the others.
+ From now all graphics optimization for ARM NEON should go here.
+
+ * CMakeLists.txt:
+ * GNUmakefile.am:
+ * GNUmakefile.list.am:
+ * Target.pri:
+ * WebCore.gyp/WebCore.gyp:
+ * WebCore.gypi:
+ * WebCore.pri:
+ * WebCore.xcodeproj/project.pbxproj:
+ * platform/graphics/cpu/arm/filters/FEBlendNEON.h: Renamed from =
Source/WebCore/platform/graphics/filters/arm/FEBlendNEON.h.
+ (WebCore):
+ (FEBlendUtilitiesNEON):
+ (WebCore::FEBlendUtilitiesNEON::div255):
+ (WebCore::FEBlendUtilitiesNEON::normal):
+ (WebCore::FEBlendUtilitiesNEON::multiply):
+ (WebCore::FEBlendUtilitiesNEON::screen):
+ (WebCore::FEBlendUtilitiesNEON::darken):
+ (WebCore::FEBlendUtilitiesNEON::lighten):
+ (WebCore::FEBlend::platformApplyNEON):
+ * platform/graphics/cpu/arm/filters/FECompositeArithmeticNEON.h:=
Renamed from Source/WebCore/platform/graphics/filters/arm/FECompositeAri=
thmeticNEON.h.
+ (WebCore):
+ (WebCore::FEComposite::computeArithmeticPixelsNeon):
+ (WebCore::FEComposite::platformArithmeticNeon):
+ * platform/graphics/cpu/arm/filters/FEGaussianBlurNEON.h: Rename=
d from Source/WebCore/platform/graphics/filters/arm/FEGaussianBlurNEON.h.
+ (WebCore):
+ (WebCore::boxBlurNEON):
+ * platform/graphics/cpu/arm/filters/FELightingNEON.cpp: Renamed =
from Source/WebCore/platform/graphics/filters/arm/FELightingNEON.cpp.
+ (WebCore):
+ (WebCore::feLightingConstantsForNeon):
+ (WebCore::FELighting::platformApplyNeonWorker):
+ (WebCore::FELighting::getPowerCoefficients):
+ * platform/graphics/cpu/arm/filters/FELightingNEON.h: Renamed fr=
om Source/WebCore/platform/graphics/filters/arm/FELightingNEON.h.
+ (WebCore):
+ (FELightingFloatArgumentsForNeon):
+ (FELightingPaintingDataForNeon):
+ (WebCore::FELighting::platformApplyNeon):
+ * platform/graphics/cpu/arm/filters/NEONHelpers.h: Renamed from =
Source/WebCore/platform/graphics/filters/arm/NEONHelpers.h.
+ (WebCore):
+ (WebCore::loadRGBA8AsFloat):
+ (WebCore::storeFloatAsRGBA8):
+
</ins><span class=3D"cx"> 2012-11-15 Mike West <mkwst at chromium.org&g=
t;
</span><span class=3D"cx">=20
</span><span class=3D"cx"> We should trigger a console warning wh=
en we encounter invalid sandbox flags.
</span></span></pre></div>
<a id=3D"trunkSourceWebCoreGNUmakefileam"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/GNUmakefile.am =
(134766 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/GNUmakefile.am 2012-11-15 1=
3:04:54 UTC (rev 134766)
+++ trunk/Source/WebCore/GNUmakefile.am 2012-11-15 13:42:28 UTC (rev 1347=
67)
</span><span class=3D"lines">@@ -55,8 +55,8 @@
</span><span class=3D"cx"> -I$(srcdir)/Source/WebCore/platform/audio \
</span><span class=3D"cx"> -I$(srcdir)/Source/WebCore/platform/graphics =
\
</span><span class=3D"cx"> -I$(srcdir)/Source/WebCore/platform/graphics/=
cpu/arm \
</span><ins>+ -I$(srcdir)/Source/WebCore/platform/graphics/cpu/arm/filter=
s/ \
</ins><span class=3D"cx"> -I$(srcdir)/Source/WebCore/platform/graphics/f=
ilters \
</span><del>- -I$(srcdir)/Source/WebCore/platform/graphics/filters/arm \
</del><span class=3D"cx"> -I$(srcdir)/Source/WebCore/platform/graphics/g=
pu \
</span><span class=3D"cx"> -I$(srcdir)/Source/WebCore/platform/graphics/=
opengl \
</span><span class=3D"cx"> -I$(srcdir)/Source/WebCore/platform/graphics/=
opentype \
</span></span></pre></div>
<a id=3D"trunkSourceWebCoreGNUmakefilelistam"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/GNUmakefile.lis=
t.am (134766 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/GNUmakefile.list.am 2012-11=
-15 13:04:54 UTC (rev 134766)
+++ trunk/Source/WebCore/GNUmakefile.list.am 2012-11-15 13:42:28 UTC (rev=
134767)
</span><span class=3D"lines">@@ -4271,6 +4271,12 @@
</span><span class=3D"cx"> Source/WebCore/platform/graphics/ANGLEWebKitB=
ridge.cpp \
</span><span class=3D"cx"> Source/WebCore/platform/graphics/ANGLEWebKitB=
ridge.h \
</span><span class=3D"cx"> Source/WebCore/platform/graphics/cpu/arm/Grap=
hicsContext3DNEON.h \
</span><ins>+ Source/WebCore/platform/graphics/cpu/arm/filters/NEONHelper=
s.h \
+ Source/WebCore/platform/graphics/cpu/arm/filters/FEBlendNEON.h \
+ Source/WebCore/platform/graphics/cpu/arm/filters/FECompositeArithmeticN=
EON.h \
+ Source/WebCore/platform/graphics/cpu/arm/filters/FEGaussianBlurNEON.h \
+ Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.cpp \
+ Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON.h \
</ins><span class=3D"cx"> Source/WebCore/platform/graphics/BitmapImage.c=
pp \
</span><span class=3D"cx"> Source/WebCore/platform/graphics/BitmapImage.=
h \
</span><span class=3D"cx"> Source/WebCore/platform/graphics/Color.cpp \
</span><span class=3D"lines">@@ -4388,12 +4394,6 @@
</span><span class=3D"cx"> Source/WebCore/platform/graphics/filters/Sour=
ceGraphic.h \
</span><span class=3D"cx"> Source/WebCore/platform/graphics/filters/Spot=
LightSource.cpp \
</span><span class=3D"cx"> Source/WebCore/platform/graphics/filters/Spot=
LightSource.h \
</span><del>- Source/WebCore/platform/graphics/filters/arm/NEONHelpers.h =
\
- Source/WebCore/platform/graphics/filters/arm/FEBlendNEON.h \
- Source/WebCore/platform/graphics/filters/arm/FECompositeArithmeticNEON.=
h \
- Source/WebCore/platform/graphics/filters/arm/FEGaussianBlurNEON.h \
- Source/WebCore/platform/graphics/filters/arm/FELightingNEON.cpp \
- Source/WebCore/platform/graphics/filters/arm/FELightingNEON.h \
</del><span class=3D"cx"> Source/WebCore/platform/graphics/FloatPoint3D.=
cpp \
</span><span class=3D"cx"> Source/WebCore/platform/graphics/FloatPoint3D=
.h \
</span><span class=3D"cx"> Source/WebCore/platform/graphics/FloatPoint.c=
pp \
</span></span></pre></div>
<a id=3D"trunkSourceWebCoreTargetpri"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/Target.pri (134=
766 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/Target.pri 2012-11-15 13:04=
:54 UTC (rev 134766)
+++ trunk/Source/WebCore/Target.pri 2012-11-15 13:42:28 UTC (rev 134767)
</span><span class=3D"lines">@@ -2074,6 +2074,11 @@
</span><span class=3D"cx"> platform/mock/ScrollbarThemeMock.h \
</span><span class=3D"cx"> platform/graphics/BitmapImage.h \
</span><span class=3D"cx"> platform/graphics/Color.h \
</span><ins>+ platform/graphics/cpu/arm/filters/NEONHelpers.h \
+ platform/graphics/cpu/arm/filters/FEBlendNEON.h \
+ platform/graphics/cpu/arm/filters/FECompositeArithmeticNEON.h \
+ platform/graphics/cpu/arm/filters/FEGaussianBlurNEON.h \
+ platform/graphics/cpu/arm/filters/FELightingNEON.h \
</ins><span class=3D"cx"> platform/graphics/CrossfadeGeneratedImage.h=
\
</span><span class=3D"cx"> platform/graphics/filters/CustomFilterArra=
yParameter.h \
</span><span class=3D"cx"> platform/graphics/filters/CustomFilterCons=
tants.h \
</span><span class=3D"lines">@@ -2115,11 +2120,6 @@
</span><span class=3D"cx"> platform/graphics/filters/LightSource.h \
</span><span class=3D"cx"> platform/graphics/filters/SourceAlpha.h \
</span><span class=3D"cx"> platform/graphics/filters/SourceGraphic.h =
\
</span><del>- platform/graphics/filters/arm/NEONHelpers.h \
- platform/graphics/filters/arm/FEBlendNEON.h \
- platform/graphics/filters/arm/FECompositeArithmeticNEON.h \
- platform/graphics/filters/arm/FEGaussianBlurNEON.h \
- platform/graphics/filters/arm/FELightingNEON.h \
</del><span class=3D"cx"> platform/graphics/FloatPoint3D.h \
</span><span class=3D"cx"> platform/graphics/FloatPoint.h \
</span><span class=3D"cx"> platform/graphics/FloatQuad.h \
</span><span class=3D"lines">@@ -3501,6 +3501,7 @@
</span><span class=3D"cx">=20
</span><span class=3D"cx"> enable?(FILTERS) {
</span><span class=3D"cx"> SOURCES +=3D \
</span><ins>+ platform/graphics/cpu/arm/filters/FELightingNEON.cpp=
\
</ins><span class=3D"cx"> platform/graphics/filters/CustomFilterG=
lobalContext.cpp \
</span><span class=3D"cx"> platform/graphics/filters/CustomFilter=
Operation.cpp \
</span><span class=3D"cx"> platform/graphics/filters/CustomFilter=
ParameterList.cpp \
</span><span class=3D"lines">@@ -3539,7 +3540,6 @@
</span><span class=3D"cx"> platform/graphics/filters/SpotLightSou=
rce.cpp \
</span><span class=3D"cx"> platform/graphics/filters/SourceAlpha.=
cpp \
</span><span class=3D"cx"> platform/graphics/filters/SourceGraphi=
c.cpp \
</span><del>- platform/graphics/filters/arm/FELightingNEON.cpp \
</del><span class=3D"cx"> }
</span><span class=3D"cx">=20
</span><span class=3D"cx"> enable?(MATHML) {
</span></span></pre></div>
<a id=3D"trunkSourceWebCoreWebCoregypWebCoregyp"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/WebCore.gyp/Web=
Core.gyp (134766 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/WebCore.gyp/WebCore.gyp 201=
2-11-15 13:04:54 UTC (rev 134766)
+++ trunk/Source/WebCore/WebCore.gyp/WebCore.gyp 2012-11-15 13:42:28 UTC =
(rev 134767)
</span><span class=3D"lines">@@ -112,8 +112,8 @@
</span><span class=3D"cx"> '../platform/graphics/chromium',
</span><span class=3D"cx"> '../platform/graphics/chromium/cc',
</span><span class=3D"cx"> '../platform/graphics/cpu/arm',
</span><ins>+ '../platform/graphics/cpu/arm/filters',
</ins><span class=3D"cx"> '../platform/graphics/filters',
</span><del>- '../platform/graphics/filters/arm',
</del><span class=3D"cx"> '../platform/graphics/filters/skia',
</span><span class=3D"cx"> '../platform/graphics/gpu',
</span><span class=3D"cx"> '../platform/graphics/opentype',
</span><span class=3D"lines">@@ -1664,7 +1664,7 @@
</span><span class=3D"cx"> ['exclude', 'platform/Theme\\.cpp$'],
</span><span class=3D"cx"> # *NEON.cpp files need special compile=
options.
</span><span class=3D"cx"> # They are moved to the webcore_arm_ne=
on target.
</span><del>- ['exclude', 'platform/graphics/filters/arm/.*NEON\\.=
(cpp|h)'],
</del><ins>+ ['exclude', 'platform/graphics/cpu/arm/filters/.*NEON=
\\.(cpp|h)'],
</ins><span class=3D"cx"> ['exclude', 'platform/image-encoders/JP=
EGImageEncoder\\.(cpp|h)$'],
</span><span class=3D"cx"> ['exclude', 'platform/image-encoders/P=
NGImageEncoder\\.(cpp|h)$'],
</span><span class=3D"cx"> ['exclude', 'platform/network/Resource=
Handle\\.cpp$'],
</span><span class=3D"lines">@@ -1935,7 +1935,7 @@
</span><span class=3D"cx"> ],
</span><span class=3D"cx"> 'sources/': [
</span><span class=3D"cx"> ['exclude', '.*'],
</span><del>- ['include', 'platform/graphics/filters/arm/.*NEO=
N\\.(cpp|h)'],
</del><ins>+ ['include', 'platform/graphics/cpu/arm/filters/.*=
NEON\\.(cpp|h)'],
</ins><span class=3D"cx"> ],
</span><span class=3D"cx"> 'cflags': ['-marm'],
</span><span class=3D"cx"> 'conditions': [
</span></span></pre></div>
<a id=3D"trunkSourceWebCoreWebCoregypi"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/WebCore.gypi (1=
34766 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/WebCore.gypi 2012-11-15 13:=
04:54 UTC (rev 134766)
+++ trunk/Source/WebCore/WebCore.gypi 2012-11-15 13:42:28 UTC (rev 134767=
)
</span><span class=3D"lines">@@ -415,6 +415,12 @@
</span><span class=3D"cx"> 'platform/graphics/TextRun.h',
</span><span class=3D"cx"> 'platform/graphics/TypesettingFeat=
ures.h',
</span><span class=3D"cx"> 'platform/graphics/cpu/arm/Graphic=
sContext3DNEON.h',
</span><ins>+ 'platform/graphics/cpu/arm/filters/NEONHelpers.h=
',
+ 'platform/graphics/cpu/arm/filters/FEBlendNEON.h',
+ 'platform/graphics/cpu/arm/filters/FECompositeArithmeticNEON=
.h',
+ 'platform/graphics/cpu/arm/filters/FEGaussianBlurNEON.h',
+ 'platform/graphics/cpu/arm/filters/FELightingNEON.cpp',
+ 'platform/graphics/cpu/arm/filters/FELightingNEON.h',
</ins><span class=3D"cx"> 'platform/graphics/cg/ImageBufferDa=
taCG.h',
</span><span class=3D"cx"> 'platform/graphics/mac/ColorMac.h'=
,
</span><span class=3D"cx"> 'platform/graphics/mac/MediaPlayer=
Proxy.h',
</span><span class=3D"lines">@@ -5025,12 +5031,6 @@
</span><span class=3D"cx"> 'platform/graphics/filters/SourceG=
raphic.h',
</span><span class=3D"cx"> 'platform/graphics/filters/SpotLig=
htSource.cpp',
</span><span class=3D"cx"> 'platform/graphics/filters/SpotLig=
htSource.h',
</span><del>- 'platform/graphics/filters/arm/NEONHelpers.h',
- 'platform/graphics/filters/arm/FEBlendNEON.h',
- 'platform/graphics/filters/arm/FECompositeArithmeticNEON.h',
- 'platform/graphics/filters/arm/FEGaussianBlurNEON.h',
- 'platform/graphics/filters/arm/FELightingNEON.cpp',
- 'platform/graphics/filters/arm/FELightingNEON.h',
</del><span class=3D"cx"> 'platform/graphics/filters/skia/FEB=
lendSkia.cpp',
</span><span class=3D"cx"> 'platform/graphics/filters/skia/FE=
ColorMatrixSkia.cpp',
</span><span class=3D"cx"> 'platform/graphics/filters/skia/FE=
ComponentTransferSkia.cpp',
</span></span></pre></div>
<a id=3D"trunkSourceWebCoreWebCorepri"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/WebCore.pri (13=
4766 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/WebCore.pri 2012-11-15 13:0=
4:54 UTC (rev 134766)
+++ trunk/Source/WebCore/WebCore.pri 2012-11-15 13:42:28 UTC (rev 134767)
</span><span class=3D"lines">@@ -54,8 +54,8 @@
</span><span class=3D"cx"> $$SOURCE_DIR/platform/audio \
</span><span class=3D"cx"> $$SOURCE_DIR/platform/graphics \
</span><span class=3D"cx"> $$SOURCE_DIR/platform/graphics/cpu/arm \
</span><ins>+ $$SOURCE_DIR/platform/graphics/cpu/arm/filters \
</ins><span class=3D"cx"> $$SOURCE_DIR/platform/graphics/filters \
</span><del>- $$SOURCE_DIR/platform/graphics/filters/arm \
</del><span class=3D"cx"> $$SOURCE_DIR/platform/graphics/opengl \
</span><span class=3D"cx"> $$SOURCE_DIR/platform/graphics/opentype \
</span><span class=3D"cx"> $$SOURCE_DIR/platform/graphics/qt \
</span></span></pre></div>
<a id=3D"trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodepr=
oj/project.pbxproj (134766 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.p=
bxproj 2012-11-15 13:04:54 UTC (rev 134766)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2012-11-15 13:=
42:28 UTC (rev 134767)
</span><span class=3D"lines">@@ -1377,10 +1377,6 @@
</span><span class=3D"cx"> 49E912AC0EFAC906009D0CAF /* AnimationList.cp=
p in Sources */ =3D {isa =3D PBXBuildFile; fileRef =3D 49E912A70EFAC90600=
9D0CAF /* AnimationList.cpp */; };
</span><span class=3D"cx"> 49E912AD0EFAC906009D0CAF /* AnimationList.h =
in Headers */ =3D {isa =3D PBXBuildFile; fileRef =3D 49E912A80EFAC906009D=
0CAF /* AnimationList.h */; settings =3D {ATTRIBUTES =3D (Private, ); }; =
};
</span><span class=3D"cx"> 49E912AE0EFAC906009D0CAF /* TimingFunction.h=
in Headers */ =3D {isa =3D PBXBuildFile; fileRef =3D 49E912A90EFAC906009=
D0CAF /* TimingFunction.h */; settings =3D {ATTRIBUTES =3D (Private, ); }=
; };
</span><del>- 49ECEB681499790D00CDD3A4 /* FECompositeArithmeticNEON.h in=
Headers */ =3D {isa =3D PBXBuildFile; fileRef =3D 49ECEB5E1499790D00CDD3=
A4 /* FECompositeArithmeticNEON.h */; };
- 49ECEB6A1499790D00CDD3A4 /* FEGaussianBlurNEON.h in Headers */ =3D {is=
a =3D PBXBuildFile; fileRef =3D 49ECEB601499790D00CDD3A4 /* FEGaussianBlu=
rNEON.h */; };
- 49ECEB6B1499790D00CDD3A4 /* FELightingNEON.cpp in Sources */ =3D {isa =
=3D PBXBuildFile; fileRef =3D 49ECEB611499790D00CDD3A4 /* FELightingNEON.=
cpp */; };
- 49ECEB6C1499790D00CDD3A4 /* FELightingNEON.h in Headers */ =3D {isa =3D=
PBXBuildFile; fileRef =3D 49ECEB621499790D00CDD3A4 /* FELightingNEON.h *=
/; };
</del><span class=3D"cx"> 49ECEB6D1499790D00CDD3A4 /* FilterOperation.c=
pp in Sources */ =3D {isa =3D PBXBuildFile; fileRef =3D 49ECEB631499790D0=
0CDD3A4 /* FilterOperation.cpp */; };
</span><span class=3D"cx"> 49ECEB6E1499790D00CDD3A4 /* FilterOperation.=
h in Headers */ =3D {isa =3D PBXBuildFile; fileRef =3D 49ECEB641499790D00=
CDD3A4 /* FilterOperation.h */; settings =3D {ATTRIBUTES =3D (Private, );=
}; };
</span><span class=3D"cx"> 49ECEB6F1499790D00CDD3A4 /* FilterOperations=
.cpp in Sources */ =3D {isa =3D PBXBuildFile; fileRef =3D 49ECEB651499790=
D00CDD3A4 /* FilterOperations.cpp */; };
</span><span class=3D"lines">@@ -8583,10 +8579,6 @@
</span><span class=3D"cx"> 49E912A70EFAC906009D0CAF /* AnimationList.cp=
p */ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType=
=3D sourcecode.cpp.cpp; name =3D AnimationList.cpp; path =3D animation/A=
nimationList.cpp; sourceTree =3D "<group>"; };
</span><span class=3D"cx"> 49E912A80EFAC906009D0CAF /* AnimationList.h =
*/ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D=
sourcecode.c.h; name =3D AnimationList.h; path =3D animation/AnimationLi=
st.h; sourceTree =3D "<group>"; };
</span><span class=3D"cx"> 49E912A90EFAC906009D0CAF /* TimingFunction.h=
*/ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =
=3D sourcecode.c.h; name =3D TimingFunction.h; path =3D animation/TimingF=
unction.h; sourceTree =3D "<group>"; };
</span><del>- 49ECEB5E1499790D00CDD3A4 /* FECompositeArithmeticNEON.h */=
=3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D=
sourcecode.c.h; path =3D FECompositeArithmeticNEON.h; sourceTree =3D &qu=
ot;<group>"; };
- 49ECEB601499790D00CDD3A4 /* FEGaussianBlurNEON.h */ =3D {isa =3D PBXFi=
leReference; fileEncoding =3D 4; lastKnownFileType =3D sourcecode.c.h; pa=
th =3D FEGaussianBlurNEON.h; sourceTree =3D "<group>"; };
- 49ECEB611499790D00CDD3A4 /* FELightingNEON.cpp */ =3D {isa =3D PBXFile=
Reference; fileEncoding =3D 4; lastKnownFileType =3D sourcecode.cpp.cpp; =
path =3D FELightingNEON.cpp; sourceTree =3D "<group>"; };
- 49ECEB621499790D00CDD3A4 /* FELightingNEON.h */ =3D {isa =3D PBXFileRe=
ference; fileEncoding =3D 4; lastKnownFileType =3D sourcecode.c.h; path =3D=
FELightingNEON.h; sourceTree =3D "<group>"; };
</del><span class=3D"cx"> 49ECEB631499790D00CDD3A4 /* FilterOperation.c=
pp */ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileTyp=
e =3D sourcecode.cpp.cpp; name =3D FilterOperation.cpp; path =3D filters/=
FilterOperation.cpp; sourceTree =3D "<group>"; };
</span><span class=3D"cx"> 49ECEB641499790D00CDD3A4 /* FilterOperation.=
h */ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType=
=3D sourcecode.c.h; name =3D FilterOperation.h; path =3D filters/FilterO=
peration.h; sourceTree =3D "<group>"; };
</span><span class=3D"cx"> 49ECEB651499790D00CDD3A4 /* FilterOperations=
.cpp */ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileT=
ype =3D sourcecode.cpp.cpp; name =3D FilterOperations.cpp; path =3D filte=
rs/FilterOperations.cpp; sourceTree =3D "<group>"; };
</span><span class=3D"lines">@@ -10374,7 +10366,6 @@
</span><span class=3D"cx"> 91089D2F14C335CD005AFC49 /* JSUint8ClampedAr=
ray.cpp */ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFi=
leType =3D sourcecode.cpp.cpp; path =3D JSUint8ClampedArray.cpp; sourceTr=
ee =3D "<group>"; };
</span><span class=3D"cx"> 91089D3014C335CD005AFC49 /* JSUint8ClampedAr=
ray.h */ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFile=
Type =3D sourcecode.c.h; path =3D JSUint8ClampedArray.h; sourceTree =3D &=
quot;<group>"; };
</span><span class=3D"cx"> 91A3905814C0F4B900F67901 /* Uint8ClampedArra=
y.idl */ =3D {isa =3D PBXFileReference; lastKnownFileType =3D text; name =
=3D Uint8ClampedArray.idl; path =3D canvas/Uint8ClampedArray.idl; sourceT=
ree =3D "<group>"; };
</span><del>- 930062D7159B45B600ACD48A /* NEONHelpers.h */ =3D {isa =3D =
PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D sourcecode.c.=
h; path =3D NEONHelpers.h; sourceTree =3D "<group>"; };
</del><span class=3D"cx"> 9302B0BC0D79F82900C7EE83 /* PageGroup.cpp */ =
=3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D =
sourcecode.cpp.cpp; path =3D PageGroup.cpp; sourceTree =3D "<grou=
p>"; };
</span><span class=3D"cx"> 9302B0BE0D79F82C00C7EE83 /* PageGroup.h */ =3D=
{isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D sou=
rcecode.c.h; path =3D PageGroup.h; sourceTree =3D "<group>&quo=
t;; };
</span><span class=3D"cx"> 9305B24C098F1B6B00C28855 /* Timer.h */ =3D {=
isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D sourc=
ecode.c.h; path =3D Timer.h; sourceTree =3D "<group>"; };
</span><span class=3D"lines">@@ -10478,6 +10469,12 @@
</span><span class=3D"cx"> 93309EA0099EB78C0056E581 /* SharedTimer.h */=
=3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D=
sourcecode.c.h; path =3D SharedTimer.h; sourceTree =3D "<group&g=
t;"; };
</span><span class=3D"cx"> 93309EA1099EB78C0056E581 /* Timer.cpp */ =3D=
{isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D sou=
rcecode.cpp.cpp; path =3D Timer.cpp; sourceTree =3D "<group>&q=
uot;; };
</span><span class=3D"cx"> 9332AB3D16515D7700D827EC /* GraphicsContext3=
DNEON.h */ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFi=
leType =3D sourcecode.c.h; path =3D GraphicsContext3DNEON.h; sourceTree =3D=
"<group>"; };
</span><ins>+ 9332AB871653A97900D827EC /* FEBlendNEON.h */ =3D {isa =3D =
PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D sourcecode.c.=
h; path =3D FEBlendNEON.h; sourceTree =3D "<group>"; };
+ 9332AB881653A97900D827EC /* FECompositeArithmeticNEON.h */ =3D {isa =3D=
PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D sourcecode.c=
.h; path =3D FECompositeArithmeticNEON.h; sourceTree =3D "<group&=
gt;"; };
+ 9332AB891653A97900D827EC /* FEGaussianBlurNEON.h */ =3D {isa =3D PBXFi=
leReference; fileEncoding =3D 4; lastKnownFileType =3D sourcecode.c.h; pa=
th =3D FEGaussianBlurNEON.h; sourceTree =3D "<group>"; };
+ 9332AB8A1653A97900D827EC /* FELightingNEON.cpp */ =3D {isa =3D PBXFile=
Reference; fileEncoding =3D 4; lastKnownFileType =3D sourcecode.cpp.cpp; =
path =3D FELightingNEON.cpp; sourceTree =3D "<group>"; };
+ 9332AB8B1653A97900D827EC /* FELightingNEON.h */ =3D {isa =3D PBXFileRe=
ference; fileEncoding =3D 4; lastKnownFileType =3D sourcecode.c.h; path =3D=
FELightingNEON.h; sourceTree =3D "<group>"; };
+ 9332AB8C1653A97900D827EC /* NEONHelpers.h */ =3D {isa =3D PBXFileRefer=
ence; fileEncoding =3D 4; lastKnownFileType =3D sourcecode.c.h; path =3D =
NEONHelpers.h; sourceTree =3D "<group>"; };
</ins><span class=3D"cx"> 93354A3B0B24F8C9003F6DEA /* UIEventWithKeySta=
te.cpp */ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFil=
eType =3D sourcecode.cpp.cpp; path =3D UIEventWithKeyState.cpp; sourceTre=
e =3D "<group>"; };
</span><span class=3D"cx"> 933A142B0B7D188600A53FFD /* TextEvent.cpp */=
=3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D=
sourcecode.cpp.cpp; path =3D TextEvent.cpp; sourceTree =3D "<gro=
up>"; };
</span><span class=3D"cx"> 933A142C0B7D188600A53FFD /* TextEvent.idl */=
=3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D=
text; path =3D TextEvent.idl; sourceTree =3D "<group>"; =
};
</span><span class=3D"lines">@@ -10532,7 +10529,6 @@
</span><span class=3D"cx"> 938192040F87E1EC00D5352A /* BinaryPropertyLi=
st.h */ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileT=
ype =3D sourcecode.c.h; path =3D BinaryPropertyList.h; sourceTree =3D &qu=
ot;<group>"; };
</span><span class=3D"cx"> 9382AAB10D8C386100F357A6 /* NodeWithIndex.h =
*/ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D=
sourcecode.c.h; path =3D NodeWithIndex.h; sourceTree =3D "<group=
>"; };
</span><span class=3D"cx"> 9382DF5710A8D5C900925652 /* ColorSpace.h */ =
=3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D =
sourcecode.c.h; path =3D ColorSpace.h; sourceTree =3D "<group>=
"; };
</span><del>- 938C496815AD67E300FCB2E1 /* FEBlendNEON.h */ =3D {isa =3D =
PBXFileReference; fileEncoding =3D 4; lastKnownFileType =3D sourcecode.c.=
h; path =3D FEBlendNEON.h; sourceTree =3D "<group>"; };
</del><span class=3D"cx"> 938E65F009F09840008A48EC /* JSHTMLElementWrap=
perFactory.h */ =3D {isa =3D PBXFileReference; fileEncoding =3D 30; lastK=
nownFileType =3D sourcecode.c.h; path =3D JSHTMLElementWrapperFactory.h; =
sourceTree =3D "<group>"; };
</span><span class=3D"cx"> 938E65F609F0985D008A48EC /* JSHTMLElementWra=
pperFactory.cpp */ =3D {isa =3D PBXFileReference; fileEncoding =3D 30; la=
stKnownFileType =3D sourcecode.cpp.cpp; path =3D JSHTMLElementWrapperFact=
ory.cpp; sourceTree =3D "<group>"; };
</span><span class=3D"cx"> 938E662509F09956008A48EC /* HTMLCanvasElemen=
t.idl */ =3D {isa =3D PBXFileReference; fileEncoding =3D 4; lastKnownFile=
Type =3D text; path =3D HTMLCanvasElement.idl; sourceTree =3D "<g=
roup>"; };
</span><span class=3D"lines">@@ -15421,20 +15417,6 @@
</span><span class=3D"cx"> name =3D animation;
</span><span class=3D"cx"> sourceTree =3D "<group>";
</span><span class=3D"cx"> };
</span><del>- 49ECEB5C1499790D00CDD3A4 /* arm */ =3D {
- isa =3D PBXGroup;
- children =3D (
- 938C496815AD67E300FCB2E1 /* FEBlendNEON.h */,
- 49ECEB5E1499790D00CDD3A4 /* FECompositeArithmeticNEON.h */,
- 49ECEB601499790D00CDD3A4 /* FEGaussianBlurNEON.h */,
- 49ECEB611499790D00CDD3A4 /* FELightingNEON.cpp */,
- 49ECEB621499790D00CDD3A4 /* FELightingNEON.h */,
- 930062D7159B45B600ACD48A /* NEONHelpers.h */,
- );
- name =3D arm;
- path =3D filters/arm;
- sourceTree =3D "<group>";
- };
</del><span class=3D"cx"> 5126E6B60A2E3AEF005C29FA /* icon */ =3D {
</span><span class=3D"cx"> isa =3D PBXGroup;
</span><span class=3D"cx"> children =3D (
</span><span class=3D"lines">@@ -17381,11 +17363,25 @@
</span><span class=3D"cx"> 9332AB3C16515D7700D827EC /* arm */ =3D {
</span><span class=3D"cx"> isa =3D PBXGroup;
</span><span class=3D"cx"> children =3D (
</span><ins>+ 9332AB861653A97900D827EC /* filters */,
</ins><span class=3D"cx"> 9332AB3D16515D7700D827EC /* GraphicsContext=
3DNEON.h */,
</span><span class=3D"cx"> );
</span><span class=3D"cx"> path =3D arm;
</span><span class=3D"cx"> sourceTree =3D "<group>";
</span><span class=3D"cx"> };
</span><ins>+ 9332AB861653A97900D827EC /* filters */ =3D {
+ isa =3D PBXGroup;
+ children =3D (
+ 9332AB871653A97900D827EC /* FEBlendNEON.h */,
+ 9332AB881653A97900D827EC /* FECompositeArithmeticNEON.h */,
+ 9332AB891653A97900D827EC /* FEGaussianBlurNEON.h */,
+ 9332AB8A1653A97900D827EC /* FELightingNEON.cpp */,
+ 9332AB8B1653A97900D827EC /* FELightingNEON.h */,
+ 9332AB8C1653A97900D827EC /* NEONHelpers.h */,
+ );
+ path =3D filters;
+ sourceTree =3D "<group>";
+ };
</ins><span class=3D"cx"> 9363B6290F8E8FE000803810 /* cf */ =3D {
</span><span class=3D"cx"> isa =3D PBXGroup;
</span><span class=3D"cx"> children =3D (
</span><span class=3D"lines">@@ -18279,7 +18275,6 @@
</span><span class=3D"cx"> 5093334E163B0E4300099A60 /* CustomFilterPa=
rameterList.h */,
</span><span class=3D"cx"> 50D32855163B313F0016111E /* ValidatedCusto=
mFilterOperation.cpp */,
</span><span class=3D"cx"> 50D32856163B313F0016111E /* ValidatedCusto=
mFilterOperation.h */,
</span><del>- 49ECEB5C1499790D00CDD3A4 /* arm */,
</del><span class=3D"cx"> 15B3FC1715FB217800A81BCB /* CustomFilterArr=
ayParameter.h */,
</span><span class=3D"cx"> 50D4060F147D49DE00D30BB5 /* CustomFilterCo=
mpiledProgram.cpp */,
</span><span class=3D"cx"> 50D40610147D49DE00D30BB5 /* CustomFilterCo=
mpiledProgram.h */,
</span><span class=3D"lines">@@ -23538,7 +23533,6 @@
</span><span class=3D"cx"> A75E8B8B0E1DE2D6007F2481 /* FEColorMatrix.=
h in Headers */,
</span><span class=3D"cx"> A75E8B8D0E1DE2D6007F2481 /* FEComponentTra=
nsfer.h in Headers */,
</span><span class=3D"cx"> A75E8B8F0E1DE2D6007F2481 /* FEComposite.h =
in Headers */,
</span><del>- 49ECEB681499790D00CDD3A4 /* FECompositeArithmeticNEON.h =
in Headers */,
</del><span class=3D"cx"> 84730D791248F0B300D3A9C9 /* FEConvolveMatri=
x.h in Headers */,
</span><span class=3D"cx"> 50D403C814768C9400D30BB5 /* FECustomFilter=
.h in Headers */,
</span><span class=3D"cx"> 84730D7B1248F0B300D3A9C9 /* FEDiffuseLight=
ing.h in Headers */,
</span><span class=3D"lines">@@ -23546,9 +23540,7 @@
</span><span class=3D"cx"> 4358E8811360A31700E4748C /* FEDropShadow.h=
in Headers */,
</span><span class=3D"cx"> 84730D7F1248F0B300D3A9C9 /* FEFlood.h in H=
eaders */,
</span><span class=3D"cx"> 84801955108BAFB300CB2B1F /* FEGaussianBlur=
.h in Headers */,
</span><del>- 49ECEB6A1499790D00CDD3A4 /* FEGaussianBlurNEON.h in Head=
ers */,
</del><span class=3D"cx"> 84730D811248F0B300D3A9C9 /* FELighting.h in=
Headers */,
</span><del>- 49ECEB6C1499790D00CDD3A4 /* FELightingNEON.h in Headers =
*/,
</del><span class=3D"cx"> 84730D831248F0B300D3A9C9 /* FEMerge.h in He=
aders */,
</span><span class=3D"cx"> 84730D851248F0B300D3A9C9 /* FEMorphology.h=
in Headers */,
</span><span class=3D"cx"> 84730D871248F0B300D3A9C9 /* FEOffset.h in =
Headers */,
</span><span class=3D"lines">@@ -26784,7 +26776,6 @@
</span><span class=3D"cx"> 84730D7E1248F0B300D3A9C9 /* FEFlood.cpp in=
Sources */,
</span><span class=3D"cx"> 84801954108BAFB300CB2B1F /* FEGaussianBlur=
.cpp in Sources */,
</span><span class=3D"cx"> 84730D801248F0B300D3A9C9 /* FELighting.cpp=
in Sources */,
</span><del>- 49ECEB6B1499790D00CDD3A4 /* FELightingNEON.cpp in Source=
s */,
</del><span class=3D"cx"> 84730D821248F0B300D3A9C9 /* FEMerge.cpp in =
Sources */,
</span><span class=3D"cx"> 84730D841248F0B300D3A9C9 /* FEMorphology.c=
pp in Sources */,
</span><span class=3D"cx"> 84730D861248F0B300D3A9C9 /* FEOffset.cpp i=
n Sources */,
</span></span></pre></div>
<a id=3D"trunkSourceWebCoreplatformgraphicscpuarmfiltersFEBlendNEONhfromr=
ev134766trunkSourceWebCoreplatformgraphicsfiltersarmFEBlendNEONh"></a>
<div class=3D"copfile"><h4>Copied: trunk/Source/WebCore/platform/graphics=
/cpu/arm/filters/FEBlendNEON.h (from rev 134766, trunk/Source/WebCore/pla=
tform/graphics/filters/arm/FEBlendNEON.h) (0 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/platform/graphics/cpu/arm/f=
ilters/FEBlendNEON.h (rev 0)
+++ trunk/Source/WebCore/platform/graphics/cpu/arm/filters/FEBlendNEON.h =
2012-11-15 13:42:28 UTC (rev 134767)
</span><span class=3D"lines">@@ -0,0 +1,175 @@
</span><ins>+/*
+ * Copyright (C) 2012 University of Szeged
+ * Copyright (C) 2012 Gabor Rapcsanyi
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in th=
e
+ * documentation and/or other materials provided with the distributio=
n.
+ *
+ * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FEBlendNEON_h
+#define FEBlendNEON_h
+
+#include <wtf/Platform.h>
+
+#if ENABLE(FILTERS) && HAVE(ARM_NEON_INTRINSICS)
+
+#include "FEBlend.h"
+#include <arm_neon.h>
+
+namespace WebCore {
+
+class FEBlendUtilitiesNEON {
+public:
+ static inline uint16x8_t div255(uint16x8_t num, uint16x8_t sixteenCo=
nst255, uint16x8_t sixteenConstOne)
+ {
+ uint16x8_t quotient =3D vshrq_n_u16(num, 8);
+ uint16x8_t remainder =3D vaddq_u16(vsubq_u16(num, vmulq_u16(sixt=
eenConst255, quotient)), sixteenConstOne);
+ return vaddq_u16(quotient, vshrq_n_u16(remainder, 8));
+ }
+
+ static inline uint16x8_t normal(uint16x8_t pixelA, uint16x8_t pixelB=
, uint16x8_t alphaA, uint16x8_t,
+ uint16x8_t sixteenConst255, uint16x8=
_t sixteenConstOne)
+ {
+ uint16x8_t tmp1 =3D vsubq_u16(sixteenConst255, alphaA);
+ uint16x8_t tmp2 =3D vmulq_u16(tmp1, pixelB);
+ uint16x8_t tmp3 =3D div255(tmp2, sixteenConst255, sixteenConstOn=
e);
+ return vaddq_u16(tmp3, pixelA);
+ }
+
+ static inline uint16x8_t multiply(uint16x8_t pixelA, uint16x8_t pixe=
lB, uint16x8_t alphaA, uint16x8_t alphaB,
+ uint16x8_t sixteenConst255, uint16=
x8_t sixteenConstOne)
+ {
+ uint16x8_t tmp1 =3D vsubq_u16(sixteenConst255, alphaA);
+ uint16x8_t tmp2 =3D vmulq_u16(tmp1, pixelB);
+ uint16x8_t tmp3 =3D vaddq_u16(vsubq_u16(sixteenConst255, alphaB)=
, pixelB);
+ uint16x8_t tmp4 =3D vmulq_u16(tmp3, pixelA);
+ uint16x8_t tmp5 =3D vaddq_u16(tmp2, tmp4);
+ return div255(tmp5, sixteenConst255, sixteenConstOne);
+ }
+
+ static inline uint16x8_t screen(uint16x8_t pixelA, uint16x8_t pixelB=
, uint16x8_t, uint16x8_t,
+ uint16x8_t sixteenConst255, uint16x8=
_t sixteenConstOne)
+ {
+ uint16x8_t tmp1 =3D vaddq_u16(pixelA, pixelB);
+ uint16x8_t tmp2 =3D vmulq_u16(pixelA, pixelB);
+ uint16x8_t tmp3 =3D div255(tmp2, sixteenConst255, sixteenConstOn=
e);
+ return vsubq_u16(tmp1, tmp3);
+ }
+
+ static inline uint16x8_t darken(uint16x8_t pixelA, uint16x8_t pixelB=
, uint16x8_t alphaA, uint16x8_t alphaB,
+ uint16x8_t sixteenConst255, uint16x8=
_t sixteenConstOne)
+ {
+ uint16x8_t tmp1 =3D vsubq_u16(sixteenConst255, alphaA);
+ uint16x8_t tmp2 =3D vmulq_u16(tmp1, pixelB);
+ uint16x8_t tmp3 =3D div255(tmp2, sixteenConst255, sixteenConstOn=
e);
+ uint16x8_t tmp4 =3D vaddq_u16(tmp3, pixelA);
+
+ uint16x8_t tmp5 =3D vsubq_u16(sixteenConst255, alphaB);
+ uint16x8_t tmp6 =3D vmulq_u16(tmp5, pixelA);
+ uint16x8_t tmp7 =3D div255(tmp6, sixteenConst255, sixteenConstOn=
e);
+ uint16x8_t tmp8 =3D vaddq_u16(tmp7, pixelB);
+
+ return vminq_u16(tmp4, tmp8);
+ }
+
+ static inline uint16x8_t lighten(uint16x8_t pixelA, uint16x8_t pixel=
B, uint16x8_t alphaA, uint16x8_t alphaB,
+ uint16x8_t sixteenConst255, uint16x=
8_t sixteenConstOne)
+ {
+ uint16x8_t tmp1 =3D vsubq_u16(sixteenConst255, alphaA);
+ uint16x8_t tmp2 =3D vmulq_u16(tmp1, pixelB);
+ uint16x8_t tmp3 =3D div255(tmp2, sixteenConst255, sixteenConstOn=
e);
+ uint16x8_t tmp4 =3D vaddq_u16(tmp3, pixelA);
+
+ uint16x8_t tmp5 =3D vsubq_u16(sixteenConst255, alphaB);
+ uint16x8_t tmp6 =3D vmulq_u16(tmp5, pixelA);
+ uint16x8_t tmp7 =3D div255(tmp6, sixteenConst255, sixteenConstOn=
e);
+ uint16x8_t tmp8 =3D vaddq_u16(tmp7, pixelB);
+
+ return vmaxq_u16(tmp4, tmp8);
+ }
+};
+
+void FEBlend::platformApplyNEON(unsigned char* srcPixelArrayA, unsigned =
char* srcPixelArrayB, unsigned char* dstPixelArray,
+ unsigned colorArrayLength)
+{
+ uint8_t* sourcePixelA =3D reinterpret_cast<uint8_t*>(srcPixelA=
rrayA);
+ uint8_t* sourcePixelB =3D reinterpret_cast<uint8_t*>(srcPixelA=
rrayB);
+ uint8_t* destinationPixel =3D reinterpret_cast<uint8_t*>(dstPi=
xelArray);
+
+ uint16x8_t sixteenConst255 =3D vdupq_n_u16(255);
+ uint16x8_t sixteenConstOne =3D vdupq_n_u16(1);
+
+ unsigned colorOffset =3D 0;
+ while (colorOffset < colorArrayLength) {
+ unsigned char alphaA1 =3D srcPixelArrayA[colorOffset + 3];
+ unsigned char alphaB1 =3D srcPixelArrayB[colorOffset + 3];
+ unsigned char alphaA2 =3D srcPixelArrayA[colorOffset + 7];
+ unsigned char alphaB2 =3D srcPixelArrayB[colorOffset + 7];
+
+ uint16x8_t doubblePixelA =3D vmovl_u8(vld1_u8(sourcePixelA + col=
orOffset));
+ uint16x8_t doubblePixelB =3D vmovl_u8(vld1_u8(sourcePixelB + col=
orOffset));
+ uint16x8_t alphaA =3D vcombine_u16(vdup_n_u16(alphaA1), vdup_n_u=
16(alphaA2));
+ uint16x8_t alphaB =3D vcombine_u16(vdup_n_u16(alphaB1), vdup_n_u=
16(alphaB2));
+
+ uint16x8_t result;
+ switch (m_mode) {
+ case FEBLEND_MODE_NORMAL:
+ result =3D FEBlendUtilitiesNEON::normal(doubblePixelA, doubb=
lePixelB, alphaA, alphaB, sixteenConst255, sixteenConstOne);
+ break;
+ case FEBLEND_MODE_MULTIPLY:
+ result =3D FEBlendUtilitiesNEON::multiply(doubblePixelA, dou=
bblePixelB, alphaA, alphaB, sixteenConst255, sixteenConstOne);
+ break;
+ case FEBLEND_MODE_SCREEN:
+ result =3D FEBlendUtilitiesNEON::screen(doubblePixelA, doubb=
lePixelB, alphaA, alphaB, sixteenConst255, sixteenConstOne);
+ break;
+ case FEBLEND_MODE_DARKEN:
+ result =3D FEBlendUtilitiesNEON::darken(doubblePixelA, doubb=
lePixelB, alphaA, alphaB, sixteenConst255, sixteenConstOne);
+ break;
+ case FEBLEND_MODE_LIGHTEN:
+ result =3D FEBlendUtilitiesNEON::lighten(doubblePixelA, doub=
blePixelB, alphaA, alphaB, sixteenConst255, sixteenConstOne);
+ break;
+ case FEBLEND_MODE_UNKNOWN:
+ default:
+ result =3D vdupq_n_u16(0);
+ break;
+ }
+
+ vst1_u8(destinationPixel + colorOffset, vmovn_u16(result));
+
+ unsigned char alphaR1 =3D 255 - ((255 - alphaA1) * (255 - alphaB=
1)) / 255;
+ unsigned char alphaR2 =3D 255 - ((255 - alphaA2) * (255 - alphaB=
2)) / 255;
+
+ dstPixelArray[colorOffset + 3] =3D alphaR1;
+ dstPixelArray[colorOffset + 7] =3D alphaR2;
+
+ colorOffset +=3D 8;
+ if (colorOffset > colorArrayLength) {
+ ASSERT(colorOffset - 4 =3D=3D colorArrayLength);
+ colorOffset =3D colorArrayLength - 8;
+ }
+ }
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(FILTERS) && HAVE(ARM_NEON_INTRINSICS)
+
+#endif // FEBlendNEON_h
</ins></span></pre></div>
<a id=3D"trunkSourceWebCoreplatformgraphicscpuarmfiltersFECompositeArithm=
eticNEONhfromrev134766trunkSourceWebCoreplatformgraphicsfiltersarmFECompo=
siteArithmeticNEONh"></a>
<div class=3D"copfile"><h4>Copied: trunk/Source/WebCore/platform/graphics=
/cpu/arm/filters/FECompositeArithmeticNEON.h (from rev 134766, trunk/Sour=
ce/WebCore/platform/graphics/filters/arm/FECompositeArithmeticNEON.h) (0 =
=3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/platform/graphics/cpu/arm/f=
ilters/FECompositeArithmeticNEON.h (rev 0)
+++ trunk/Source/WebCore/platform/graphics/cpu/arm/filters/FECompositeAri=
thmeticNEON.h 2012-11-15 13:42:28 UTC (rev 134767)
</span><span class=3D"lines">@@ -0,0 +1,99 @@
</span><ins>+/*
+ * Copyright (C) 2011 University of Szeged
+ * Copyright (C) 2011 Felician Marton
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in th=
e
+ * documentation and/or other materials provided with the distributio=
n.
+ *
+ * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FECompositeArithmeticNEON_h
+#define FECompositeArithmeticNEON_h
+
+#if ENABLE(FILTERS) && HAVE(ARM_NEON_INTRINSICS)
+
+#include "FEComposite.h"
+#include <arm_neon.h>
+
+namespace WebCore {
+
+template <int b1, int b4>
+inline void FEComposite::computeArithmeticPixelsNeon(unsigned char* sour=
ce, unsigned char* destination,
+ unsigned pixelArrayLength, float k1, float k2, float k3, float k4)
+{
+ float32x4_t k1x4 =3D vdupq_n_f32(k1 / 255);
+ float32x4_t k2x4 =3D vdupq_n_f32(k2);
+ float32x4_t k3x4 =3D vdupq_n_f32(k3);
+ float32x4_t k4x4 =3D vdupq_n_f32(k4 * 255);
+ uint32x4_t max255 =3D vdupq_n_u32(255);
+
+ uint32_t* sourcePixel =3D reinterpret_cast<uint32_t*>(source);
+ uint32_t* destinationPixel =3D reinterpret_cast<uint32_t*>(des=
tination);
+ uint32_t* destinationEndPixel =3D destinationPixel + (pixelArrayLeng=
th >> 2);
+
+ while (destinationPixel < destinationEndPixel) {
+ uint32x2_t temporary1 =3D vset_lane_u32(*sourcePixel, temporary1=
, 0);
+ uint16x4_t temporary2 =3D vget_low_u16(vmovl_u8(vreinterpret_u8_=
u32(temporary1)));
+ float32x4_t sourcePixelAsFloat =3D vcvtq_f32_u32(vmovl_u16(tempo=
rary2));
+
+ temporary1 =3D vset_lane_u32(*destinationPixel, temporary1, 0);
+ temporary2 =3D vget_low_u16(vmovl_u8(vreinterpret_u8_u32(tempora=
ry1)));
+ float32x4_t destinationPixelAsFloat =3D vcvtq_f32_u32(vmovl_u16(=
temporary2));
+
+ float32x4_t result =3D vmulq_f32(sourcePixelAsFloat, k2x4);
+ result =3D vmlaq_f32(result, destinationPixelAsFloat, k3x4);
+ if (b1)
+ result =3D vmlaq_f32(result, vmulq_f32(sourcePixelAsFloat, d=
estinationPixelAsFloat), k1x4);
+ if (b4)
+ result =3D vaddq_f32(result, k4x4);
+
+ // Convert result to uint so negative values are converted to ze=
ro.
+ uint16x4_t temporary3 =3D vmovn_u32(vminq_u32(vcvtq_u32_f32(resu=
lt), max255));
+ uint8x8_t temporary4 =3D vmovn_u16(vcombine_u16(temporary3, temp=
orary3));
+ *destinationPixel++ =3D vget_lane_u32(vreinterpret_u32_u8(tempor=
ary4), 0);
+ ++sourcePixel;
+ }
+}
+
+inline void FEComposite::platformArithmeticNeon(unsigned char* source, u=
nsigned char* destination,
+ unsigned pixelArrayLength, float k1, float k2, float k3, float k4)
+{
+ if (!k4) {
+ if (!k1) {
+ computeArithmeticPixelsNeon<0, 0>(source, destination,=
pixelArrayLength, k1, k2, k3, k4);
+ return;
+ }
+
+ computeArithmeticPixelsNeon<1, 0>(source, destination, pix=
elArrayLength, k1, k2, k3, k4);
+ return;
+ }
+
+ if (!k1) {
+ computeArithmeticPixelsNeon<0, 1>(source, destination, pix=
elArrayLength, k1, k2, k3, k4);
+ return;
+ }
+ computeArithmeticPixelsNeon<1, 1>(source, destination, pixelAr=
rayLength, k1, k2, k3, k4);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(FILTERS) && HAVE(ARM_NEON_INTRINSICS)
+
+#endif // FECompositeArithmeticNEON_h
</ins></span></pre></div>
<a id=3D"trunkSourceWebCoreplatformgraphicscpuarmfiltersFEGaussianBlurNEO=
Nhfromrev134766trunkSourceWebCoreplatformgraphicsfiltersarmFEGaussianBlur=
NEONh"></a>
<div class=3D"copfile"><h4>Copied: trunk/Source/WebCore/platform/graphics=
/cpu/arm/filters/FEGaussianBlurNEON.h (from rev 134766, trunk/Source/WebC=
ore/platform/graphics/filters/arm/FEGaussianBlurNEON.h) (0 =3D> 134767)</=
h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/platform/graphics/cpu/arm/f=
ilters/FEGaussianBlurNEON.h (rev 0)
+++ trunk/Source/WebCore/platform/graphics/cpu/arm/filters/FEGaussianBlur=
NEON.h 2012-11-15 13:42:28 UTC (rev 134767)
</span><span class=3D"lines">@@ -0,0 +1,78 @@
</span><ins>+/*
+ * Copyright (C) 2011 University of Szeged
+ * Copyright (C) 2011 Zoltan Herczeg
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in th=
e
+ * documentation and/or other materials provided with the distributio=
n.
+ *
+ * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FEGaussianBlurNEON_h
+#define FEGaussianBlurNEON_h
+
+#if ENABLE(FILTERS) && HAVE(ARM_NEON_INTRINSICS)
+
+#include "FEGaussianBlur.h"
+#include "NEONHelpers.h"
+
+namespace WebCore {
+
+inline void boxBlurNEON(Uint8ClampedArray* srcPixelArray, Uint8ClampedAr=
ray* dstPixelArray,
+ unsigned dx, int dxLeft, int dxRight, int stride=
, int strideLine, int effectWidth, int effectHeight)
+{
+ uint32_t* sourcePixel =3D reinterpret_cast<uint32_t*>(srcPixel=
Array->data());
+ uint32_t* destinationPixel =3D reinterpret_cast<uint32_t*>(dst=
PixelArray->data());
+
+ float32x4_t deltaX =3D vdupq_n_f32(1.0 / dx);
+ int pixelLine =3D strideLine / 4;
+ int pixelStride =3D stride / 4;
+
+ for (int y =3D 0; y < effectHeight; ++y) {
+ int line =3D y * pixelLine;
+ float32x4_t sum =3D vdupq_n_f32(0);
+ // Fill the kernel
+ int maxKernelSize =3D std::min(dxRight, effectWidth);
+ for (int i =3D 0; i < maxKernelSize; ++i) {
+ float32x4_t sourcePixelAsFloat =3D loadRGBA8AsFloat(sourcePi=
xel + line + i * pixelStride);
+ sum =3D vaddq_f32(sum, sourcePixelAsFloat);
+ }
+
+ // Blurring
+ for (int x =3D 0; x < effectWidth; ++x) {
+ int pixelOffset =3D line + x * pixelStride;
+ float32x4_t result =3D vmulq_f32(sum, deltaX);
+ storeFloatAsRGBA8(result, destinationPixel + pixelOffset);
+ if (x >=3D dxLeft) {
+ float32x4_t sourcePixelAsFloat =3D loadRGBA8AsFloat(sour=
cePixel + pixelOffset - dxLeft * pixelStride);
+ sum =3D vsubq_f32(sum, sourcePixelAsFloat);
+ }
+ if (x + dxRight < effectWidth) {
+ float32x4_t sourcePixelAsFloat =3D loadRGBA8AsFloat(sour=
cePixel + pixelOffset + dxRight * pixelStride);
+ sum =3D vaddq_f32(sum, sourcePixelAsFloat);
+ }
+ }
+ }
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(FILTERS) && HAVE(ARM_NEON_INTRINSICS)
+
+#endif // FEGaussianBlurNEON_h
</ins></span></pre></div>
<a id=3D"trunkSourceWebCoreplatformgraphicscpuarmfiltersFELightingNEONcpp=
fromrev134766trunkSourceWebCoreplatformgraphicsfiltersarmFELightingNEONcp=
p"></a>
<div class=3D"copfile"><h4>Copied: trunk/Source/WebCore/platform/graphics=
/cpu/arm/filters/FELightingNEON.cpp (from rev 134766, trunk/Source/WebCor=
e/platform/graphics/filters/arm/FELightingNEON.cpp) (0 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/platform/graphics/cpu/arm/f=
ilters/FELightingNEON.cpp (rev 0)
+++ trunk/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON=
.cpp 2012-11-15 13:42:28 UTC (rev 134767)
</span><span class=3D"lines">@@ -0,0 +1,504 @@
</span><ins>+/*
+ * Copyright (C) 2011 University of Szeged
+ * Copyright (C) 2011 Zoltan Herczeg
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in th=
e
+ * documentation and/or other materials provided with the distributio=
n.
+ *
+ * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "FELightingNEON.h"
+
+#if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GC=
C)
+
+#include <wtf/Alignment.h>
+
+namespace WebCore {
+
+// These constants are copied to the following SIMD registers:
+// ALPHAX_Q ALPHAY_Q REMAPX_D REMAPY_D
+
+static WTF_ALIGNED(short, s_FELightingConstantsForNeon[], 16) =3D {
+ // Alpha coefficients.
+ -2, 1, 0, -1, 2, 1, 0, -1,
+ 0, -1, -2, -1, 0, 1, 2, 1,
+ // Remapping indicies.
+ 0x0f0e, 0x0302, 0x0504, 0x0706,
+ 0x0b0a, 0x1312, 0x1514, 0x1716,
+};
+
+short* feLightingConstantsForNeon()
+{
+ return s_FELightingConstantsForNeon;
+}
+
+void FELighting::platformApplyNeonWorker(FELightingPaintingDataForNeon* =
parameters)
+{
+ neonDrawLighting(parameters);
+}
+
+#define ASSTRING(str) #str
+#define TOSTRING(value) ASSTRING(value)
+
+#define PIXELS_OFFSET TOSTRING(0)
+#define YSTART_OFFSET TOSTRING(4)
+#define WIDTH_OFFSET TOSTRING(8)
+#define HEIGHT_OFFSET TOSTRING(12)
+#define FLAGS_OFFSET TOSTRING(16)
+#define SPECULAR_EXPONENT_OFFSET TOSTRING(20)
+#define CONE_EXPONENT_OFFSET TOSTRING(24)
+#define FLOAT_ARGUMENTS_OFFSET TOSTRING(28)
+#define PAINTING_CONSTANTS_OFFSET TOSTRING(32)
+#define NL "\n"
+
+// Register allocation
+#define PAINTING_DATA_R "r11"
+#define RESET_WIDTH_R PAINTING_DATA_R
+#define PIXELS_R "r4"
+#define WIDTH_R "r5"
+#define HEIGHT_R "r6"
+#define FLAGS_R "r7"
+#define SPECULAR_EXPONENT_R "r8"
+#define CONE_EXPONENT_R "r10"
+#define SCANLINE_R "r12"
+
+#define TMP1_Q "q0"
+#define TMP1_D0 "d0"
+#define TMP1_S0 "s0"
+#define TMP1_S1 "s1"
+#define TMP1_D1 "d1"
+#define TMP1_S2 "s2"
+#define TMP1_S3 "s3"
+#define TMP2_Q "q1"
+#define TMP2_D0 "d2"
+#define TMP2_S0 "s4"
+#define TMP2_S1 "s5"
+#define TMP2_D1 "d3"
+#define TMP2_S2 "s6"
+#define TMP2_S3 "s7"
+#define TMP3_Q "q2"
+#define TMP3_D0 "d4"
+#define TMP3_S0 "s8"
+#define TMP3_S1 "s9"
+#define TMP3_D1 "d5"
+#define TMP3_S2 "s10"
+#define TMP3_S3 "s11"
+
+#define COSINE_OF_ANGLE "s12"
+#define POWF_INT_S "s13"
+#define POWF_FRAC_S "s14"
+#define SPOT_COLOR_Q "q4"
+
+// Because of VMIN and VMAX CONST_ZERO_S and CONST_ONE_S
+// must be placed on the same side of the double vector
+
+// Current pixel position
+#define POSITION_Q "q5"
+#define POSITION_X_S "s20"
+#define POSITION_Y_S "s21"
+#define POSITION_Z_S "s22"
+#define CONST_ZERO_HI_D "d11"
+#define CONST_ZERO_S "s23"
+
+// -------------------------------
+// Variable arguments
+// Misc arguments
+#define READ1_RANGE "d12-d15"
+#define READ2_RANGE "d16-d19"
+#define READ3_RANGE "d20-d21"
+
+#define SCALE_S "s24"
+#define SCALE_DIV4_S "s25"
+#define DIFFUSE_CONST_S "s26"
+
+// Light source position
+#define CONE_CUT_OFF_S "s28"
+#define CONE_FULL_LIGHT_S "s29"
+#define CONE_CUT_OFF_RANGE_S "s30"
+#define CONST_ONE_HI_D "d15"
+#define CONST_ONE_S "s31"
+
+#define LIGHT_Q "q8"
+#define DIRECTION_Q "q9"
+#define COLOR_Q "q10"
+// -------------------------------
+// Constant coefficients
+#define READ4_RANGE "d22-d25"
+#define READ5_RANGE "d26-d27"
+
+#define ALPHAX_Q "q11"
+#define ALPHAY_Q "q12"
+#define REMAPX_D "d26"
+#define REMAPY_D "d27"
+// -------------------------------
+
+#define ALL_ROWS_D "{d28,d29,d30}"
+#define TOP_ROW_D "d28"
+#define MIDDLE_ROW_D "d29"
+#define BOTTOM_ROW_D "d30"
+
+#define GET_LENGTH(source, temp) \
+ "vmul.f32 " temp##_Q ", " source##_Q ", &qu=
ot; source##_Q NL \
+ "vadd.f32 " source##_S3 ", " temp##_S0 ", &=
quot; temp##_S1 NL \
+ "vadd.f32 " source##_S3 ", " source##_S3 ",=
" temp##_S2 NL \
+ "vsqrt.f32 " source##_S3 ", " source##_S3 NL
+
+// destination##_S3 can contain the multiply of length.
+#define DOT_PRODUCT(destination, source1, source2) \
+ "vmul.f32 " destination##_Q ", " source1##_Q &qu=
ot;, " source2##_Q NL \
+ "vadd.f32 " destination##_S0 ", " destination##_=
S0 ", " destination##_S1 NL \
+ "vadd.f32 " destination##_S0 ", " destination##_=
S0 ", " destination##_S2 NL
+
+#define MULTIPLY_BY_DIFFUSE_CONST(normalVectorLength, dotProductLength) =
\
+ "tst " FLAGS_R ", #" TOSTRING(FLAG_DIFFUSE_CONST=
_IS_1) NL \
+ "vmuleq.f32 " TMP2_S1 ", " DIFFUSE_CONST_S "=
;, " normalVectorLength NL \
+ "vdiveq.f32 " TMP2_S1 ", " TMP2_S1 ", "=
; dotProductLength NL \
+ "vdivne.f32 " TMP2_S1 ", " normalVectorLength &q=
uot;, " dotProductLength NL
+
+#define POWF_SQR(value, exponent, current, remaining) \
+ "tst " exponent ", #" ASSTRING(current) NL \
+ "vmulne.f32 " value ", " value ", " PO=
WF_INT_S NL \
+ "tst " exponent ", #" ASSTRING(remaining) NL \
+ "vmulne.f32 " POWF_INT_S ", " POWF_INT_S ",=
" POWF_INT_S NL
+
+#define POWF_SQRT(value, exponent, current, remaining) \
+ "tst " exponent ", #" ASSTRING(remaining) NL \
+ "vsqrtne.f32 " POWF_FRAC_S ", " POWF_FRAC_S NL \
+ "tst " exponent ", #" ASSTRING(current) NL \
+ "vmulne.f32 " value ", " value ", " PO=
WF_FRAC_S NL
+
+// This simplified powf function is sufficiently accurate.
+#define POWF(value, exponent) \
+ "tst " exponent ", #0xfc0" NL \
+ "vmovne.f32 " POWF_INT_S ", " value NL \
+ "tst " exponent ", #0x03f" NL \
+ "vmovne.f32 " POWF_FRAC_S ", " value NL \
+ "vmov.f32 " value ", " CONST_ONE_S NL \
+ \
+ POWF_SQR(value, exponent, 0x040, 0xf80) \
+ POWF_SQR(value, exponent, 0x080, 0xf00) \
+ POWF_SQR(value, exponent, 0x100, 0xe00) \
+ POWF_SQR(value, exponent, 0x200, 0xc00) \
+ POWF_SQR(value, exponent, 0x400, 0x800) \
+ "tst " exponent ", #0x800" NL \
+ "vmulne.f32 " value ", " value ", " PO=
WF_INT_S NL \
+ \
+ POWF_SQRT(value, exponent, 0x20, 0x3f) \
+ POWF_SQRT(value, exponent, 0x10, 0x1f) \
+ POWF_SQRT(value, exponent, 0x08, 0x0f) \
+ POWF_SQRT(value, exponent, 0x04, 0x07) \
+ POWF_SQRT(value, exponent, 0x02, 0x03) \
+ POWF_SQRT(value, exponent, 0x01, 0x01)
+
+// The following algorithm is an ARM-NEON optimized version of
+// the main loop found in FELighting.cpp. Since the whole code
+// is redesigned to be as effective as possible (ARM specific
+// thinking), it is four times faster than its C++ counterpart.
+
+asm ( // NOLINT
+".globl " TOSTRING(neonDrawLighting) NL
+TOSTRING(neonDrawLighting) ":" NL
+ // Because of the clever register allocation, nothing is stored on t=
he stack
+ // except the saved registers.
+ // Stack must be aligned to 8 bytes.
+ "stmdb sp!, {r4-r8, r10, r11, lr}" NL
+ "vstmdb sp!, {d8-d15}" NL
+ "mov " PAINTING_DATA_R ", r0" NL
+
+ // The following two arguments are loaded to SIMD registers.
+ "ldr r0, [" PAINTING_DATA_R ", #" FLOAT_ARGUMENT=
S_OFFSET "]" NL
+ "ldr r1, [" PAINTING_DATA_R ", #" PAINTING_CONST=
ANTS_OFFSET "]" NL
+ "ldr " PIXELS_R ", [" PAINTING_DATA_R ", #&=
quot; PIXELS_OFFSET "]" NL
+ "vldr.f32 " POSITION_Y_S ", [" PAINTING_DATA_R &=
quot;, #" YSTART_OFFSET "]" NL
+ "ldr " WIDTH_R ", [" PAINTING_DATA_R ", #&q=
uot; WIDTH_OFFSET "]" NL
+ "ldr " HEIGHT_R ", [" PAINTING_DATA_R ", #&=
quot; HEIGHT_OFFSET "]" NL
+ "ldr " FLAGS_R ", [" PAINTING_DATA_R ", #&q=
uot; FLAGS_OFFSET "]" NL
+ "ldr " SPECULAR_EXPONENT_R ", [" PAINTING_DATA_R=
", #" SPECULAR_EXPONENT_OFFSET "]" NL
+ "ldr " CONE_EXPONENT_R ", [" PAINTING_DATA_R &qu=
ot;, #" CONE_EXPONENT_OFFSET "]" NL
+
+ // Load all data to the SIMD registers with the least number of inst=
ructions.
+ "vld1.f32 { " READ1_RANGE " }, [r0]!" NL
+ "vld1.f32 { " READ2_RANGE " }, [r0]!" NL
+ "vld1.f32 { " READ3_RANGE " }, [r0]!" NL
+ "vld1.s16 {" READ4_RANGE "}, [r1]!" NL
+ "vld1.s16 {" READ5_RANGE "}, [r1]!" NL
+
+ // Initializing local variables.
+ "mov " SCANLINE_R ", " WIDTH_R ", lsl #2&qu=
ot; NL
+ "add " SCANLINE_R ", " SCANLINE_R ", #8&quo=
t; NL
+ "add " PIXELS_R ", " PIXELS_R ", " SCA=
NLINE_R NL
+ "add " PIXELS_R ", " PIXELS_R ", #3" N=
L
+ "mov r0, #0" NL
+ "vmov.f32 " CONST_ZERO_S ", r0" NL
+ "tst " FLAGS_R ", #" TOSTRING(FLAG_SPOT_LIGHT) N=
L
+ "vmov.f32 " SPOT_COLOR_Q ", " COLOR_Q NL
+ "mov " RESET_WIDTH_R ", " WIDTH_R NL
+
+".mainLoop:" NL
+ "mov r3, #3" NL
+ "vmov.f32 " POSITION_X_S ", " CONST_ONE_S NL
+
+".scanline:" NL
+ // The ROW registers are storing the alpha channel of the last three=
pixels.
+ // The alpha channel is stored as signed short (sint16) values. The =
fourth value
+ // is garbage. The following instructions are shifting out the unnec=
essary alpha
+ // values and load the next ones.
+ "ldrb r0, [" PIXELS_R ", -" SCANLINE_R "]&q=
uot; NL
+ "ldrb r1, [" PIXELS_R ", +" SCANLINE_R "]&q=
uot; NL
+ "ldrb r2, [" PIXELS_R "], #4" NL
+ "vext.s16 " TOP_ROW_D ", " TOP_ROW_D ", &qu=
ot; TOP_ROW_D ", #3" NL
+ "vext.s16 " MIDDLE_ROW_D ", " MIDDLE_ROW_D "=
;, " MIDDLE_ROW_D ", #3" NL
+ "vext.s16 " BOTTOM_ROW_D ", " BOTTOM_ROW_D "=
;, " BOTTOM_ROW_D ", #3" NL
+ "vmov.s16 " TOP_ROW_D "[1], r0" NL
+ "vmov.s16 " MIDDLE_ROW_D "[1], r2" NL
+ "vmov.s16 " BOTTOM_ROW_D "[1], r1" NL
+
+ // The two border pixels (rightmost and leftmost) are skipped when
+ // the next scanline is reached. It also jumps, when the algorithm
+ // is started, and the first free alpha values are loaded to each ro=
w.
+ "subs r3, r3, #1" NL
+ "bne .scanline" NL
+
+ // The light vector goes to TMP1_Q. It is constant in case of distan=
t light.
+ // The fourth value contains the length of the light vector.
+ "tst " FLAGS_R ", #" TOSTRING(FLAG_POINT_LIGHT |=
FLAG_SPOT_LIGHT) NL
+ "beq .distantLight" NL
+
+ "vmov.s16 r3, " MIDDLE_ROW_D "[2]" NL
+ "vmov.f32 " POSITION_Z_S ", r3" NL
+ "vcvt.f32.s32 " POSITION_Z_S ", " POSITION_Z_S N=
L
+ "vmul.f32 " POSITION_Z_S ", " POSITION_Z_S "=
;, " SCALE_S NL
+
+ "vsub.f32 " TMP1_Q ", " LIGHT_Q ", " P=
OSITION_Q NL
+ GET_LENGTH(TMP1, TMP2)
+
+ "tst " FLAGS_R ", #" TOSTRING(FLAG_SPOT_LIGHT) N=
L
+ "bne .cosineOfAngle" NL
+".visiblePixel:" NL
+
+ // | -1 0 1 | | -1 -2 -1 |
+ // X =3D | -2 0 2 | Y =3D | 0 0 0 |
+ // | -1 0 1 | | 1 2 1 |
+
+ // Multiply the alpha values by the X and Y matrices.
+
+ // Moving the 8 alpha value to TMP3.
+ "vtbl.8 " TMP3_D0 ", " ALL_ROWS_D ", "=
REMAPX_D NL
+ "vtbl.8 " TMP3_D1 ", " ALL_ROWS_D ", "=
REMAPY_D NL
+
+ "vmul.s16 " TMP2_Q ", " TMP3_Q ", " AL=
PHAX_Q NL
+ "vpadd.s16 " TMP2_D0 ", " TMP2_D0 ", "=
TMP2_D1 NL
+ "vpadd.s16 " TMP2_D0 ", " TMP2_D0 ", "=
TMP2_D0 NL
+ "vpadd.s16 " TMP2_D0 ", " TMP2_D0 ", "=
TMP2_D0 NL
+ "vmov.s16 r0, " TMP2_D0 "[0]" NL
+
+ "vmul.s16 " TMP2_Q ", " TMP3_Q ", " AL=
PHAY_Q NL
+ "vpadd.s16 " TMP2_D0 ", " TMP2_D0 ", "=
TMP2_D1 NL
+ "vpadd.s16 " TMP2_D0 ", " TMP2_D0 ", "=
TMP2_D0 NL
+ "vpadd.s16 " TMP2_D0 ", " TMP2_D0 ", "=
TMP2_D0 NL
+ "vmov.s16 r1, " TMP2_D0 "[0]" NL
+
+ // r0 and r1 contains the X and Y coordinates of the
+ // normal vector, respectively.
+
+ // Calculating the spot light strength.
+ "tst " FLAGS_R ", #" TOSTRING(FLAG_SPOT_LIGHT) N=
L
+ "beq .endLight" NL
+
+ "vneg.f32 " TMP3_S1 ", " COSINE_OF_ANGLE NL
+ "tst " FLAGS_R ", #" TOSTRING(FLAG_CONE_EXPONENT=
_IS_1) NL
+ "beq .coneExpPowf" NL
+".coneExpPowfFinished:" NL
+
+ // Smoothing the cone edge if necessary.
+ "vcmp.f32 " COSINE_OF_ANGLE ", " CONE_FULL_LIGHT=
_S NL
+ "fmstat" NL
+ "bhi .cutOff" NL
+".cutOffFinished:" NL
+
+ "vmin.f32 " TMP3_D0 ", " TMP3_D0 ", " =
CONST_ONE_HI_D NL
+ "vmul.f32 " COLOR_Q ", " SPOT_COLOR_Q ", &q=
uot; TMP3_D0 "[1]" NL
+
+".endLight:" NL
+ // Summarize:
+ // r0 and r1 contains the normalVector.
+ // TMP1_Q contains the light vector and its length.
+ // COLOR_Q contains the color of the light vector.
+
+ // Test whether both r0 and r1 are zero (Normal vector is (0, 0, 1))=
.
+ "orrs r2, r0, r1" NL
+ "bne .normalVectorIsNonZero" NL
+
+ "tst " FLAGS_R ", #" TOSTRING(FLAG_SPECULAR_LIGH=
T) NL
+ "bne .specularLight1" NL
+
+ // Calculate diffuse light strength.
+ MULTIPLY_BY_DIFFUSE_CONST(TMP1_S2, TMP1_S3)
+ "b .lightStrengthCalculated" NL
+
+".specularLight1:" NL
+ // Calculating specular light strength.
+ "vadd.f32 " TMP1_S2 ", " TMP1_S2 ", " =
TMP1_S3 NL
+ GET_LENGTH(TMP1, TMP2)
+
+ // When the exponent is 1, we don't need to call an expensive powf f=
unction.
+ "tst " FLAGS_R ", #" TOSTRING(FLAG_SPECULAR_EXPO=
NENT_IS_1) NL
+ "vdiveq.f32 " TMP2_S1 ", " TMP1_S2 ", "=
; TMP1_S3 NL
+ "beq .specularExpPowf" NL
+
+ MULTIPLY_BY_DIFFUSE_CONST(TMP1_S2, TMP1_S3)
+ "b .lightStrengthCalculated" NL
+
+".normalVectorIsNonZero:" NL
+ // Normal vector goes to TMP2, and its length is calculated as well.
+ "vmov.s32 " TMP2_S0 ", r0" NL
+ "vcvt.f32.s32 " TMP2_S0 ", " TMP2_S0 NL
+ "vmul.f32 " TMP2_S0 ", " TMP2_S0 ", " =
SCALE_DIV4_S NL
+ "vmov.s32 " TMP2_S1 ", r1" NL
+ "vcvt.f32.s32 " TMP2_S1 ", " TMP2_S1 NL
+ "vmul.f32 " TMP2_S1 ", " TMP2_S1 ", " =
SCALE_DIV4_S NL
+ "vmov.f32 " TMP2_S2 ", " CONST_ONE_S NL
+ GET_LENGTH(TMP2, TMP3)
+
+ "tst " FLAGS_R ", #" TOSTRING(FLAG_SPECULAR_LIGH=
T) NL
+ "bne .specularLight2" NL
+
+ // Calculating diffuse light strength.
+ DOT_PRODUCT(TMP3, TMP2, TMP1)
+ MULTIPLY_BY_DIFFUSE_CONST(TMP3_S0, TMP3_S3)
+ "b .lightStrengthCalculated" NL
+
+".specularLight2:" NL
+ // Calculating specular light strength.
+ "vadd.f32 " TMP1_S2 ", " TMP1_S2 ", " =
TMP1_S3 NL
+ GET_LENGTH(TMP1, TMP3)
+ DOT_PRODUCT(TMP3, TMP2, TMP1)
+
+ // When the exponent is 1, we don't need to call an expensive powf f=
unction.
+ "tst " FLAGS_R ", #" TOSTRING(FLAG_SPECULAR_EXPO=
NENT_IS_1) NL
+ "vdiveq.f32 " TMP2_S1 ", " TMP3_S0 ", "=
; TMP3_S3 NL
+ "beq .specularExpPowf" NL
+ MULTIPLY_BY_DIFFUSE_CONST(TMP3_S0, TMP3_S3)
+
+".lightStrengthCalculated:" NL
+ // TMP2_S1 contains the light strength. Clamp it to [0, 1]
+ "vmax.f32 " TMP2_D0 ", " TMP2_D0 ", " =
CONST_ZERO_HI_D NL
+ "vmin.f32 " TMP2_D0 ", " TMP2_D0 ", " =
CONST_ONE_HI_D NL
+ "vmul.f32 " TMP3_Q ", " COLOR_Q ", " T=
MP2_D0 "[1]" NL
+ "vcvt.u32.f32 " TMP3_Q ", " TMP3_Q NL
+ "vmov.u32 r2, r3, " TMP3_S0 ", " TMP3_S1 NL
+ // The color values are stored in-place.
+ "strb r2, [" PIXELS_R ", #-11]" NL
+ "strb r3, [" PIXELS_R ", #-10]" NL
+ "vmov.u32 r2, " TMP3_S2 NL
+ "strb r2, [" PIXELS_R ", #-9]" NL
+
+ // Continue to the next pixel.
+".blackPixel:" NL
+ "vadd.f32 " POSITION_X_S ", " CONST_ONE_S NL
+ "mov r3, #1" NL
+ "subs " WIDTH_R ", " WIDTH_R ", #1" NL
+ "bne .scanline" NL
+
+ // If the end of the scanline is reached, we continue
+ // to the next scanline.
+ "vadd.f32 " POSITION_Y_S ", " CONST_ONE_S NL
+ "mov " WIDTH_R ", " RESET_WIDTH_R NL
+ "subs " HEIGHT_R ", " HEIGHT_R ", #1" =
NL
+ "bne .mainLoop" NL
+
+ // Return.
+ "vldmia sp!, {d8-d15}" NL
+ "ldmia sp!, {r4-r8, r10, r11, pc}" NL
+
+".distantLight:" NL
+ // In case of distant light, the light vector is constant,
+ // we simply copy it.
+ "vmov.f32 " TMP1_Q ", " LIGHT_Q NL
+ "b .visiblePixel" NL
+
+".cosineOfAngle:" NL
+ // If the pixel is outside of the cone angle, it is simply a black p=
ixel.
+ DOT_PRODUCT(TMP3, TMP1, DIRECTION)
+ "vdiv.f32 " COSINE_OF_ANGLE ", " TMP3_S0 ",=
" TMP1_S3 NL
+ "vcmp.f32 " COSINE_OF_ANGLE ", " CONE_CUT_OFF_S =
NL
+ "fmstat" NL
+ "bls .visiblePixel" NL
+ "mov r0, #0" NL
+ "strh r0, [" PIXELS_R ", #-11]" NL
+ "strb r0, [" PIXELS_R ", #-9]" NL
+ "b .blackPixel" NL
+
+".cutOff:" NL
+ // Smoothing the light strength on the cone edge.
+ "vsub.f32 " TMP3_S0 ", " CONE_CUT_OFF_S ", =
" COSINE_OF_ANGLE NL
+ "vdiv.f32 " TMP3_S0 ", " TMP3_S0 ", " =
CONE_CUT_OFF_RANGE_S NL
+ "vmul.f32 " TMP3_S1 ", " TMP3_S1 ", " =
TMP3_S0 NL
+ "b .cutOffFinished" NL
+
+".coneExpPowf:" NL
+ POWF(TMP3_S1, CONE_EXPONENT_R)
+ "b .coneExpPowfFinished" NL
+
+".specularExpPowf:" NL
+ POWF(TMP2_S1, SPECULAR_EXPONENT_R)
+ "tst " FLAGS_R ", #" TOSTRING(FLAG_DIFFUSE_CONST=
_IS_1) NL
+ "vmuleq.f32 " TMP2_S1 ", " TMP2_S1 ", "=
; DIFFUSE_CONST_S NL
+ "b .lightStrengthCalculated" NL
+); // NOLINT
+
+int FELighting::getPowerCoefficients(float exponent)
+{
+ // Calling a powf function from the assembly code would require to s=
ave
+ // and reload a lot of NEON registers. Since the base is in range [0=
..1]
+ // and only 8 bit precision is required, we use our own powf functio=
n.
+ // This is probably not the best, but it uses only a few registers a=
nd
+ // gives us enough precision (modifying the exponent field directly =
would
+ // also be possible).
+
+ // First, we limit the exponent to maximum of 64, which gives us eno=
ugh
+ // precision. We split the exponent to an integer and fraction part,
+ // since a^x =3D (a^y)*(a^z) where x =3D y+z. The integer exponent o=
f the
+ // power is estimated by square, and the fraction exponent of the po=
wer
+ // is estimated by square root assembly instructions.
+ int i, result;
+
+ if (exponent < 0)
+ exponent =3D 1 / (-exponent);
+
+ if (exponent > 63.99)
+ exponent =3D 63.99;
+
+ exponent /=3D 64;
+ result =3D 0;
+ for (i =3D 11; i >=3D 0; --i) {
+ exponent *=3D 2;
+ if (exponent >=3D 1) {
+ result |=3D 1 << i;
+ exponent -=3D 1;
+ }
+ }
+ return result;
+}
+
+} // namespace WebCore
+
+#endif // CPU(ARM_NEON) && COMPILER(GCC)
</ins></span></pre></div>
<a id=3D"trunkSourceWebCoreplatformgraphicscpuarmfiltersFELightingNEONhfr=
omrev134766trunkSourceWebCoreplatformgraphicsfiltersarmFELightingNEONh"><=
/a>
<div class=3D"copfile"><h4>Copied: trunk/Source/WebCore/platform/graphics=
/cpu/arm/filters/FELightingNEON.h (from rev 134766, trunk/Source/WebCore/=
platform/graphics/filters/arm/FELightingNEON.h) (0 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/platform/graphics/cpu/arm/f=
ilters/FELightingNEON.h (rev 0)
+++ trunk/Source/WebCore/platform/graphics/cpu/arm/filters/FELightingNEON=
.h 2012-11-15 13:42:28 UTC (rev 134767)
</span><span class=3D"lines">@@ -0,0 +1,201 @@
</span><ins>+/*
+ * Copyright (C) 2011 University of Szeged
+ * Copyright (C) 2011 Zoltan Herczeg
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in th=
e
+ * documentation and/or other materials provided with the distributio=
n.
+ *
+ * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FELightingNEON_h
+#define FELightingNEON_h
+
+#if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GC=
C)
+
+#include "FELighting.h"
+#include <wtf/Alignment.h>
+#include <wtf/ParallelJobs.h>
+
+namespace WebCore {
+
+// Otherwise: Distant Light.
+#define FLAG_POINT_LIGHT 0x01
+#define FLAG_SPOT_LIGHT 0x02
+#define FLAG_CONE_EXPONENT_IS_1 0x04
+
+// Otherwise: Diffuse light.
+#define FLAG_SPECULAR_LIGHT 0x10
+#define FLAG_DIFFUSE_CONST_IS_1 0x20
+#define FLAG_SPECULAR_EXPONENT_IS_1 0x40
+
+// Must be aligned to 16 bytes.
+struct FELightingFloatArgumentsForNeon {
+ float surfaceScale;
+ float minusSurfaceScaleDividedByFour;
+ float diffuseConstant;
+ float padding1;
+
+ float coneCutOffLimit;
+ float coneFullLight;
+ float coneCutOffRange;
+ float constOne;
+
+ float lightX;
+ float lightY;
+ float lightZ;
+ float padding2;
+
+ float directionX;
+ float directionY;
+ float directionZ;
+ float padding3;
+
+ float colorRed;
+ float colorGreen;
+ float colorBlue;
+ float padding4;
+};
+
+struct FELightingPaintingDataForNeon {
+ unsigned char* pixels;
+ float yStart;
+ int widthDecreasedByTwo;
+ int absoluteHeight;
+ // Combination of FLAG constants above.
+ int flags;
+ int specularExponent;
+ int coneExponent;
+ FELightingFloatArgumentsForNeon* floatArguments;
+ short* paintingConstants;
+};
+
+short* feLightingConstantsForNeon();
+
+extern "C" {
+void neonDrawLighting(FELightingPaintingDataForNeon*);
+}
+
+inline void FELighting::platformApplyNeon(LightingData& data, LightS=
ource::PaintingData& paintingData)
+{
+ WTF_ALIGNED(FELightingFloatArgumentsForNeon, floatArguments, 16);
+
+ FELightingPaintingDataForNeon neonData =3D {
+ data.pixels->data(),
+ 1,
+ data.widthDecreasedByOne - 1,
+ data.heightDecreasedByOne - 1,
+ 0,
+ 0,
+ 0,
+ &floatArguments,
+ feLightingConstantsForNeon()
+ };
+
+ // Set light source arguments.
+ floatArguments.constOne =3D 1;
+
+ floatArguments.colorRed =3D m_lightingColor.red();
+ floatArguments.colorGreen =3D m_lightingColor.green();
+ floatArguments.colorBlue =3D m_lightingColor.blue();
+ floatArguments.padding4 =3D 0;
+
+ if (m_lightSource->type() =3D=3D LS_POINT) {
+ neonData.flags |=3D FLAG_POINT_LIGHT;
+ PointLightSource* pointLightSource =3D static_cast<PointLight=
Source*>(m_lightSource.get());
+ floatArguments.lightX =3D pointLightSource->position().x();
+ floatArguments.lightY =3D pointLightSource->position().y();
+ floatArguments.lightZ =3D pointLightSource->position().z();
+ floatArguments.padding2 =3D 0;
+ } else if (m_lightSource->type() =3D=3D LS_SPOT) {
+ neonData.flags |=3D FLAG_SPOT_LIGHT;
+ SpotLightSource* spotLightSource =3D static_cast<SpotLightSou=
rce*>(m_lightSource.get());
+ floatArguments.lightX =3D spotLightSource->position().x();
+ floatArguments.lightY =3D spotLightSource->position().y();
+ floatArguments.lightZ =3D spotLightSource->position().z();
+ floatArguments.padding2 =3D 0;
+
+ floatArguments.directionX =3D paintingData.directionVector.x();
+ floatArguments.directionY =3D paintingData.directionVector.y();
+ floatArguments.directionZ =3D paintingData.directionVector.z();
+ floatArguments.padding3 =3D 0;
+
+ floatArguments.coneCutOffLimit =3D paintingData.coneCutOffLimit;
+ floatArguments.coneFullLight =3D paintingData.coneFullLight;
+ floatArguments.coneCutOffRange =3D paintingData.coneCutOffLimit =
- paintingData.coneFullLight;
+ neonData.coneExponent =3D getPowerCoefficients(spotLightSource-&=
gt;specularExponent());
+ if (spotLightSource->specularExponent() =3D=3D 1)
+ neonData.flags |=3D FLAG_CONE_EXPONENT_IS_1;
+ } else {
+ ASSERT(m_lightSource->type() =3D=3D LS_DISTANT);
+ floatArguments.lightX =3D paintingData.lightVector.x();
+ floatArguments.lightY =3D paintingData.lightVector.y();
+ floatArguments.lightZ =3D paintingData.lightVector.z();
+ floatArguments.padding2 =3D 1;
+ }
+
+ // Set lighting arguments.
+ floatArguments.surfaceScale =3D data.surfaceScale;
+ floatArguments.minusSurfaceScaleDividedByFour =3D -data.surfaceScale=
/ 4;
+ if (m_lightingType =3D=3D FELighting::DiffuseLighting)
+ floatArguments.diffuseConstant =3D m_diffuseConstant;
+ else {
+ neonData.flags |=3D FLAG_SPECULAR_LIGHT;
+ floatArguments.diffuseConstant =3D m_specularConstant;
+ neonData.specularExponent =3D getPowerCoefficients(m_specularExp=
onent);
+ if (m_specularExponent =3D=3D 1)
+ neonData.flags |=3D FLAG_SPECULAR_EXPONENT_IS_1;
+ }
+ if (floatArguments.diffuseConstant =3D=3D 1)
+ neonData.flags |=3D FLAG_DIFFUSE_CONST_IS_1;
+
+ int optimalThreadNumber =3D ((data.widthDecreasedByOne - 1) * (data.=
heightDecreasedByOne - 1)) / s_minimalRectDimension;
+ if (optimalThreadNumber > 1) {
+ // Initialize parallel jobs
+ ParallelJobs<FELightingPaintingDataForNeon> parallelJobs(&=
amp;WebCore::FELighting::platformApplyNeonWorker, optimalThreadNumber);
+
+ // Fill the parameter array
+ int job =3D parallelJobs.numberOfJobs();
+ if (job > 1) {
+ int yStart =3D 1;
+ int yStep =3D (data.heightDecreasedByOne - 1) / job;
+ for (--job; job >=3D 0; --job) {
+ FELightingPaintingDataForNeon& params =3D parallelJo=
bs.parameter(job);
+ params =3D neonData;
+ params.yStart =3D yStart;
+ params.pixels +=3D (yStart - 1) * (data.widthDecreasedBy=
One + 1) * 4;
+ if (job > 0) {
+ params.absoluteHeight =3D yStep;
+ yStart +=3D yStep;
+ } else
+ params.absoluteHeight =3D data.heightDecreasedByOne =
- yStart;
+ }
+ parallelJobs.execute();
+ return;
+ }
+ }
+
+ neonDrawLighting(&neonData);
+}
+
+} // namespace WebCore
+
+#endif // CPU(ARM_NEON) && COMPILER(GCC)
+
+#endif // FELightingNEON_h
</ins></span></pre></div>
<a id=3D"trunkSourceWebCoreplatformgraphicscpuarmfiltersNEONHelpershfromr=
ev134766trunkSourceWebCoreplatformgraphicsfiltersarmNEONHelpersh"></a>
<div class=3D"copfile"><h4>Copied: trunk/Source/WebCore/platform/graphics=
/cpu/arm/filters/NEONHelpers.h (from rev 134766, trunk/Source/WebCore/pla=
tform/graphics/filters/arm/NEONHelpers.h) (0 =3D> 134767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebCore/platform/graphics/cpu/arm/f=
ilters/NEONHelpers.h (rev 0)
+++ trunk/Source/WebCore/platform/graphics/cpu/arm/filters/NEONHelpers.h =
2012-11-15 13:42:28 UTC (rev 134767)
</span><span class=3D"lines">@@ -0,0 +1,57 @@
</span><ins>+/*
+ * Copyright (C) 2012 University of Szeged
+ * Copyright (C) 2012 Gabor Rapcsanyi
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in th=
e
+ * documentation and/or other materials provided with the distributio=
n.
+ *
+ * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef NEONHelpers_h
+#define NEONHelpers_h
+
+#include <wtf/Platform.h>
+
+#if ENABLE(FILTERS) && HAVE(ARM_NEON_INTRINSICS)
+
+#include <arm_neon.h>
+
+namespace WebCore {
+
+inline float32x4_t loadRGBA8AsFloat(uint32_t* source)
+{
+ uint32x2_t temporary1 =3D {0, 0};
+ temporary1 =3D vset_lane_u32(*source, temporary1, 0);
+ uint16x4_t temporary2 =3D vget_low_u16(vmovl_u8(vreinterpret_u8_u32(=
temporary1)));
+ return vcvtq_f32_u32(vmovl_u16(temporary2));
+}
+
+inline void storeFloatAsRGBA8(float32x4_t data, uint32_t* destination)
+{
+ uint16x4_t temporary1 =3D vmovn_u32(vcvtq_u32_f32(data));
+ uint8x8_t temporary2 =3D vmovn_u16(vcombine_u16(temporary1, temporar=
y1));
+ *destination =3D vget_lane_u32(vreinterpret_u32_u8(temporary2), 0);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(FILTERS) && HAVE(ARM_NEON_INTRINSICS)
+
+#endif // NEONHelpers_h
</ins></span></pre>
</div>
</div>
</body>
</html>
More information about the webkit-changes
mailing list