Title: [286824] trunk/Source
Revision
286824
Author
s...@apple.com
Date
2021-12-09 18:38:54 -0800 (Thu, 09 Dec 2021)

Log Message

[GPU Process] [Filters] Add the encoding and decoding for FEImage
https://bugs.webkit.org/show_bug.cgi?id=234099

Reviewed by Wenson Hsieh.

Source/WebCore:

FEImage needs to encode and decode the RenderingResourceIdentifier of the
Image or the ImageBuffer of its SourceImage.

A new type 'RenderingResourceIdentifier' is added to FEImage::SourceImage
variant. This going to be used while transferring the FEImage from
WebProcess to GPUProcess.

Record-using the Image or ImageBuffer of FEImage::SourceImage has to
happen in Recorder::drawFilteredImageBuffer() since this is the place we
can send messages to GPUProcess.

Resolving RenderingResourceIdentifier of FEImage::SourceImage back to an
Image or an ImageBuffer has to happen in RemoteDisplayListRecorder::
drawFilteredImageBuffer before handling the item DrawFilteredImageBuffer.

Because of the two restrictions above we have to provide the virtual
function Filter::effectsOfType() which is overridden by CSSFilter and
SVGFilter.

* Headers.cmake:
* WebCore.xcodeproj/project.pbxproj:
* platform/graphics/displaylists/DisplayListRecorder.cpp:
(WebCore::DisplayList::Recorder::drawFilteredImageBuffer):
* platform/graphics/filters/Filter.h:
* rendering/CSSFilter.cpp:
(WebCore::CSSFilter::effectsOfType const):
* rendering/CSSFilter.h:
* svg/SVGPreserveAspectRatioValue.cpp:
(WebCore::SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue):
* svg/SVGPreserveAspectRatioValue.h:
(WebCore::SVGPreserveAspectRatioValue::encode const):
(WebCore::SVGPreserveAspectRatioValue::decode):
* svg/graphics/filters/SVGFEImage.cpp:
(WebCore::FEImage::calculateImageRect const):
(WebCore::FEImageSoftwareApplier::apply const):
* svg/graphics/filters/SVGFEImage.h:
(WebCore::FEImage::encode const):
(WebCore::FEImage::decode):
* svg/graphics/filters/SVGFilter.cpp:
(WebCore::SVGFilter::effectsOfType const):
* svg/graphics/filters/SVGFilter.h:

Source/WebKit:

Add the support to encode and decode the FEImage through FilterReference.
The RenderingResourceIdentifier of the Image or the ImageBuffer will be
used while encoding and decoding the FEImage. Resolving the decoded
RenderingResourceIdentifier back to an Image or ImageBuffer will happen
in RemoteDisplayListRecorder::drawFilteredImageBuffer).

* GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
(WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer):
* Platform/IPC/FilterReference.h:
(IPC::FilterReference::encodeFilterEffect):
(IPC::FilterReference::decodeFilterEffect):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (286823 => 286824)


--- trunk/Source/WebCore/ChangeLog	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/ChangeLog	2021-12-10 02:38:54 UTC (rev 286824)
@@ -1,3 +1,52 @@
+2021-12-09  Said Abou-Hallawa  <s...@apple.com>
+
+        [GPU Process] [Filters] Add the encoding and decoding for FEImage
+        https://bugs.webkit.org/show_bug.cgi?id=234099
+
+        Reviewed by Wenson Hsieh.
+
+        FEImage needs to encode and decode the RenderingResourceIdentifier of the
+        Image or the ImageBuffer of its SourceImage.
+
+        A new type 'RenderingResourceIdentifier' is added to FEImage::SourceImage
+        variant. This going to be used while transferring the FEImage from 
+        WebProcess to GPUProcess. 
+
+        Record-using the Image or ImageBuffer of FEImage::SourceImage has to
+        happen in Recorder::drawFilteredImageBuffer() since this is the place we
+        can send messages to GPUProcess.
+
+        Resolving RenderingResourceIdentifier of FEImage::SourceImage back to an
+        Image or an ImageBuffer has to happen in RemoteDisplayListRecorder::
+        drawFilteredImageBuffer before handling the item DrawFilteredImageBuffer.
+
+        Because of the two restrictions above we have to provide the virtual
+        function Filter::effectsOfType() which is overridden by CSSFilter and 
+        SVGFilter.
+
+        * Headers.cmake:
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/graphics/displaylists/DisplayListRecorder.cpp:
+        (WebCore::DisplayList::Recorder::drawFilteredImageBuffer):
+        * platform/graphics/filters/Filter.h:
+        * rendering/CSSFilter.cpp:
+        (WebCore::CSSFilter::effectsOfType const):
+        * rendering/CSSFilter.h:
+        * svg/SVGPreserveAspectRatioValue.cpp:
+        (WebCore::SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue):
+        * svg/SVGPreserveAspectRatioValue.h:
+        (WebCore::SVGPreserveAspectRatioValue::encode const):
+        (WebCore::SVGPreserveAspectRatioValue::decode):
+        * svg/graphics/filters/SVGFEImage.cpp:
+        (WebCore::FEImage::calculateImageRect const):
+        (WebCore::FEImageSoftwareApplier::apply const):
+        * svg/graphics/filters/SVGFEImage.h:
+        (WebCore::FEImage::encode const):
+        (WebCore::FEImage::decode):
+        * svg/graphics/filters/SVGFilter.cpp:
+        (WebCore::SVGFilter::effectsOfType const):
+        * svg/graphics/filters/SVGFilter.h:
+
 2021-12-09  Chris Dumez  <cdu...@apple.com>
 
         Add basic support for launching a SharedWorker

Modified: trunk/Source/WebCore/Headers.cmake (286823 => 286824)


--- trunk/Source/WebCore/Headers.cmake	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/Headers.cmake	2021-12-10 02:38:54 UTC (rev 286824)
@@ -1906,6 +1906,7 @@
     svg/SVGLengthValue.h
     svg/SVGParserUtilities.h
     svg/SVGParsingError.h
+    svg/SVGPreserveAspectRatioValue.h
     svg/SVGStringList.h
     svg/SVGTests.h
     svg/SVGUnitTypes.h
@@ -1912,6 +1913,7 @@
 
     svg/graphics/SVGImageCache.h
 
+    svg/graphics/filters/SVGFEImage.h
     svg/graphics/filters/SVGFilter.h
     svg/graphics/filters/SVGFilterExpression.h
 

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (286823 => 286824)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-12-10 02:38:54 UTC (rev 286824)
@@ -2323,6 +2323,7 @@
 		729D05302531424300422098 /* RenderingResourceIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 729D052E25313E2600422098 /* RenderingResourceIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		72A5D192275E8FFE0065833E /* SVGFilterExpression.h in Headers */ = {isa = PBXBuildFile; fileRef = 726CDE25275B489700A445B2 /* SVGFilterExpression.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		72A73BEF245A3F90001C9D03 /* AnimationFrameRate.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A815C238FD50500C00583 /* AnimationFrameRate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		72ACC9C627629A7700D523F7 /* SVGPreserveAspectRatioValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C8F22461DD3D1C500E92DA3 /* SVGPreserveAspectRatioValue.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		72B8B0352753438600F752AA /* FilterFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 7262D756272A174100C56A09 /* FilterFunction.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		72B8B0362753441400F752AA /* FilterImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 72435EF4273D07670005E7EE /* FilterImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		72BAC3AE23E1F0B0008D741C /* ImageBufferBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 72BAC3A523E17328008D741C /* ImageBufferBackend.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -3875,7 +3876,7 @@
 		B222F69D0AB771B80022EFAD /* JSSVGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B222F69B0AB771B80022EFAD /* JSSVGElement.h */; };
 		B22362290C3AF04A0008CA9B /* JSSVGTextPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B22362270C3AF04A0008CA9B /* JSSVGTextPathElement.h */; };
 		B23540F30D00782E002382FA /* StringTruncator.h in Headers */ = {isa = PBXBuildFile; fileRef = B23540F10D00782E002382FA /* StringTruncator.h */; settings = {ATTRIBUTES = (Private, ); }; };
-		B25599850D00D8BA00BB825C /* SVGFEImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B25598EB0D00D8B900BB825C /* SVGFEImage.h */; };
+		B25599850D00D8BA00BB825C /* SVGFEImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B25598EB0D00D8B900BB825C /* SVGFEImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		B25599A40D00D8BA00BB825C /* SVGImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B255990C0D00D8B900BB825C /* SVGImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		B25599A50D00D8BA00BB825C /* EmptyClients.h in Headers */ = {isa = PBXBuildFile; fileRef = B255990D0D00D8B900BB825C /* EmptyClients.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		B27535650B053814002CE64F /* PDFDocumentImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B27535370B053814002CE64F /* PDFDocumentImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -37208,6 +37209,7 @@
 				B2227A910D00BF220071B782 /* SVGPolygonElement.h in Headers */,
 				B2227A940D00BF220071B782 /* SVGPolylineElement.h in Headers */,
 				B2227A970D00BF220071B782 /* SVGPreserveAspectRatio.h in Headers */,
+				72ACC9C627629A7700D523F7 /* SVGPreserveAspectRatioValue.h in Headers */,
 				55DCC52822407B2000C26E32 /* SVGPrimitiveList.h in Headers */,
 				72144333223EC8B000F12FF7 /* SVGProperty.h in Headers */,
 				72144334223EC91600F12FF7 /* SVGPropertyOwner.h in Headers */,

Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp (286823 => 286824)


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp	2021-12-10 02:38:54 UTC (rev 286824)
@@ -34,6 +34,7 @@
 #include "Logging.h"
 #include "MediaPlayer.h"
 #include "NotImplemented.h"
+#include "SVGFEImage.h"
 #include <wtf/MathExtras.h>
 #include <wtf/text/TextStream.h>
 
@@ -148,13 +149,40 @@
 {
     appendStateChangeItemIfNecessary();
 
-    if (!sourceImage) {
-        recordDrawFilteredImageBuffer({ }, sourceImageRect, filter);
+    if (sourceImage && !canDrawImageBuffer(*sourceImage)) {
+        GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
         return;
     }
 
-    if (!canDrawImageBuffer(*sourceImage)) {
-        GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
+    for (auto& effect : filter.effectsOfType(FilterEffect::Type::FEImage)) {
+        bool isRecorded = WTF::switchOn(downcast<FEImage>(effect.get())->sourceImage(),
+            [&] (const Ref<Image>& image) {
+                if (auto nativeImage = image->nativeImage()) {
+                    recordResourceUse(*nativeImage);
+                    return true;
+                }
+                return false;
+            },
+            [&] (const Ref<ImageBuffer>& imageBuffer) {
+                if (canDrawImageBuffer(imageBuffer)) {
+                    recordResourceUse(imageBuffer);
+                    return true;
+                }
+                return false;
+            },
+            [&] (RenderingResourceIdentifier) {
+                return true;
+            }
+        );
+
+        if (!isRecorded) {
+            GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
+            return;
+        }
+    }
+
+    if (!sourceImage) {
+        recordDrawFilteredImageBuffer({ }, sourceImageRect, filter);
         return;
     }
 

Modified: trunk/Source/WebCore/platform/graphics/filters/Filter.h (286823 => 286824)


--- trunk/Source/WebCore/platform/graphics/filters/Filter.h	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/platform/graphics/filters/Filter.h	2021-12-10 02:38:54 UTC (rev 286824)
@@ -21,6 +21,7 @@
 
 #pragma once
 
+#include "FilterEffectVector.h"
 #include "FilterFunction.h"
 #include "FloatRect.h"
 #include "GraphicsTypes.h"
@@ -60,6 +61,7 @@
     FloatRect clipToMaxEffectRect(const FloatRect& imageRect, const FloatRect& primitiveSubregion) const;
 
     virtual RefPtr<FilterEffect> lastEffect() const = 0;
+    virtual FilterEffectVector effectsOfType(FilterFunction::Type) const = 0;
 
     bool clampFilterRegionIfNeeded();
 

Modified: trunk/Source/WebCore/rendering/CSSFilter.cpp (286823 => 286824)


--- trunk/Source/WebCore/rendering/CSSFilter.cpp	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/rendering/CSSFilter.cpp	2021-12-10 02:38:54 UTC (rev 286824)
@@ -347,6 +347,25 @@
     return downcast<FilterEffect>(function.ptr());
 }
 
+FilterEffectVector CSSFilter::effectsOfType(FilterFunction::Type filterType) const
+{
+    FilterEffectVector effects;
+
+    for (auto& function : m_functions) {
+        if (function->filterType() == filterType) {
+            effects.append({ downcast<FilterEffect>(function.ptr()) });
+            continue;
+        }
+
+        if (function->isSVGFilter()) {
+            auto& filter = downcast<SVGFilter>(function.get());
+            effects.appendVector(filter.effectsOfType(filterType));
+        }
+    }
+
+    return effects;
+}
+
 #if USE(CORE_IMAGE)
 bool CSSFilter::supportsCoreImageRendering() const
 {

Modified: trunk/Source/WebCore/rendering/CSSFilter.h (286823 => 286824)


--- trunk/Source/WebCore/rendering/CSSFilter.h	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/rendering/CSSFilter.h	2021-12-10 02:38:54 UTC (rev 286824)
@@ -53,6 +53,8 @@
     bool hasFilterThatShouldBeRestrictedBySecurityOrigin() const { return m_hasFilterThatShouldBeRestrictedBySecurityOrigin; }
 
     RefPtr<FilterEffect> lastEffect() const final;
+    FilterEffectVector effectsOfType(FilterFunction::Type) const final;
+
     IntOutsets outsets() const final;
 
     void clearIntermediateResults();

Modified: trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.cpp (286823 => 286824)


--- trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.cpp	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.cpp	2021-12-10 02:38:54 UTC (rev 286824)
@@ -31,15 +31,15 @@
 
 namespace WebCore {
 
-SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue()
-    : m_align(SVG_PRESERVEASPECTRATIO_XMIDYMID)
-    , m_meetOrSlice(SVG_MEETORSLICE_MEET)
+SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue(StringView value)
 {
+    parse(value);
 }
 
-SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue(StringView value)
+SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue(SVGPreserveAspectRatioType align, SVGMeetOrSliceType meetOrSlice)
+    : m_align(align)
+    , m_meetOrSlice(meetOrSlice)
 {
-    parse(value);
 }
 
 ExceptionOr<void> SVGPreserveAspectRatioValue::setAlign(unsigned short align)

Modified: trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.h (286823 => 286824)


--- trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.h	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.h	2021-12-10 02:38:54 UTC (rev 286824)
@@ -51,8 +51,9 @@
         SVG_MEETORSLICE_SLICE = 2
     };
 
-    SVGPreserveAspectRatioValue();
+    SVGPreserveAspectRatioValue() = default;
     SVGPreserveAspectRatioValue(StringView);
+    WEBCORE_EXPORT SVGPreserveAspectRatioValue(SVGPreserveAspectRatioType, SVGMeetOrSliceType);
 
     ExceptionOr<void> setAlign(unsigned short);
     unsigned short align() const { return m_align; }
@@ -70,9 +71,12 @@
 
     String valueAsString() const;
 
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static std::optional<SVGPreserveAspectRatioValue> decode(Decoder&);
+
 private:
-    SVGPreserveAspectRatioType m_align;
-    SVGMeetOrSliceType m_meetOrSlice;
+    SVGPreserveAspectRatioType m_align { SVG_PRESERVEASPECTRATIO_XMIDYMID };
+    SVGMeetOrSliceType m_meetOrSlice { SVG_MEETORSLICE_MEET };
 
     template<typename CharacterType> bool parseInternal(StringParsingBuffer<CharacterType>&, bool validate);
 };
@@ -84,4 +88,59 @@
     static String toString(const SVGPreserveAspectRatioValue& type) { return type.valueAsString(); }
 };
 
+template<class Encoder>
+void SVGPreserveAspectRatioValue::encode(Encoder& encoder) const
+{
+    encoder << m_align;
+    encoder << m_meetOrSlice;
+}
+
+template<class Decoder>
+std::optional<SVGPreserveAspectRatioValue> SVGPreserveAspectRatioValue::decode(Decoder& decoder)
+{
+    std::optional<SVGPreserveAspectRatioType> align;
+    decoder >> align;
+    if (!align)
+        return std::nullopt;
+
+    std::optional<SVGMeetOrSliceType> meetOrSlice;
+    decoder >> meetOrSlice;
+    if (!meetOrSlice)
+        return std::nullopt;
+
+    return SVGPreserveAspectRatioValue(*align, *meetOrSlice);
+}
+
 } // namespace WebCore
+
+namespace WTF {
+
+template<> struct EnumTraits<WebCore::SVGPreserveAspectRatioValue::SVGPreserveAspectRatioType> {
+    using values = EnumValues<
+        WebCore::SVGPreserveAspectRatioValue::SVGPreserveAspectRatioType,
+
+        WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_UNKNOWN,
+        WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_NONE,
+        WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMINYMIN,
+        WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMIDYMIN,
+        WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMAXYMIN,
+        WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMINYMID,
+        WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMIDYMID,
+        WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMAXYMID,
+        WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMINYMAX,
+        WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMIDYMAX,
+        WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMAXYMAX
+    >;
+};
+
+template<> struct EnumTraits<WebCore::SVGPreserveAspectRatioValue::SVGMeetOrSliceType> {
+    using values = EnumValues<
+        WebCore::SVGPreserveAspectRatioValue::SVGMeetOrSliceType,
+
+        WebCore::SVGPreserveAspectRatioValue::SVG_MEETORSLICE_UNKNOWN,
+        WebCore::SVGPreserveAspectRatioValue::SVG_MEETORSLICE_MEET,
+        WebCore::SVGPreserveAspectRatioValue::SVG_MEETORSLICE_SLICE
+    >;
+};
+
+} // namespace WTF

Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp (286823 => 286824)


--- trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp	2021-12-10 02:38:54 UTC (rev 286824)
@@ -61,6 +61,10 @@
         },
         [&] (const Ref<ImageBuffer>&) {
             return primitiveSubregion;
+        },
+        [&] (RenderingResourceIdentifier) {
+            ASSERT_NOT_REACHED();
+            return FloatRect();
         }
     );
     return filter.clipToMaxEffectRect(imageRect, primitiveSubregion);
@@ -101,6 +105,9 @@
             imageRect.scale(filter.filterScale());
             imageRect = IntRect(imageRect) - result.absoluteImageRect().location();
             context.drawImageBuffer(imageBuffer, imageRect.location());
+        },
+        [&] (RenderingResourceIdentifier) {
+            ASSERT_NOT_REACHED();
         }
     );
 

Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.h (286823 => 286824)


--- trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.h	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.h	2021-12-10 02:38:54 UTC (rev 286824)
@@ -24,6 +24,7 @@
 #pragma once
 
 #include "FilterEffect.h"
+#include "Image.h"
 #include "SVGPreserveAspectRatioValue.h"
 
 namespace WebCore {
@@ -33,10 +34,14 @@
 
 class FEImage final : public FilterEffect {
 public:
-    using SourceImage = std::variant<Ref<Image>, Ref<ImageBuffer>>;
+    using SourceImage = std::variant<
+        Ref<Image>,
+        Ref<ImageBuffer>,
+        RenderingResourceIdentifier
+    >;
 
     static Ref<FEImage> create(Ref<Image>&&, const SVGPreserveAspectRatioValue&);
-    static Ref<FEImage> create(SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
+    WEBCORE_EXPORT static Ref<FEImage> create(SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
 
     const SourceImage& sourceImage() const { return m_sourceImage; }
     void setImageSource(SourceImage&& sourceImage) { m_sourceImage = WTFMove(sourceImage); }
@@ -44,6 +49,9 @@
     FloatRect sourceImageRect() const { return m_sourceImageRect; }
     const SVGPreserveAspectRatioValue& preserveAspectRatio() const { return m_preserveAspectRatio; }
 
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static std::optional<Ref<FEImage>> decode(Decoder&);
+
 private:
     FEImage(SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
 
@@ -63,6 +71,47 @@
     SVGPreserveAspectRatioValue m_preserveAspectRatio;
 };
 
+template<class Encoder>
+void FEImage::encode(Encoder& encoder) const
+{
+    WTF::switchOn(m_sourceImage,
+        [&] (const Ref<Image>& image) {
+            if (auto nativeImage = image->nativeImage())
+                encoder << nativeImage->renderingResourceIdentifier();
+        },
+        [&] (const Ref<ImageBuffer>& imageBuffer) {
+            encoder << imageBuffer->renderingResourceIdentifier();
+        },
+        [&] (RenderingResourceIdentifier renderingResourceIdentifier) {
+            encoder << renderingResourceIdentifier;
+        }
+    );
+
+    encoder << m_sourceImageRect;
+    encoder << m_preserveAspectRatio;
+}
+
+template<class Decoder>
+std::optional<Ref<FEImage>> FEImage::decode(Decoder& decoder)
+{
+    std::optional<RenderingResourceIdentifier> imageIdentifier;
+    decoder >> imageIdentifier;
+    if (!imageIdentifier)
+        return std::nullopt;
+
+    std::optional<FloatRect> sourceImageRect;
+    decoder >> sourceImageRect;
+    if (!sourceImageRect)
+        return std::nullopt;
+
+    std::optional<SVGPreserveAspectRatioValue> preserveAspectRatio;
+    decoder >> preserveAspectRatio;
+    if (!preserveAspectRatio)
+        return std::nullopt;
+
+    return FEImage::create(*imageIdentifier, *sourceImageRect, *preserveAspectRatio);
+}
+
 } // namespace WebCore
 
 SPECIALIZE_TYPE_TRAITS_FILTER_EFFECT(FEImage)

Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp (286823 => 286824)


--- trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp	2021-12-10 02:38:54 UTC (rev 286824)
@@ -117,6 +117,19 @@
     return m_expression.last().effect.ptr();
 }
 
+FilterEffectVector SVGFilter::effectsOfType(FilterFunction::Type filterType) const
+{
+    HashSet<RefPtr<FilterEffect>> effects;
+
+    for (auto& term : m_expression) {
+        auto& effect = term.effect;
+        if (effect->filterType() == filterType)
+            effects.add({ effect.ptr() });
+    }
+
+    return copyToVector(effects);
+}
+
 RefPtr<FilterImage> SVGFilter::apply(const Filter&, FilterImage& sourceImage)
 {
     return apply(&sourceImage);

Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h (286823 => 286824)


--- trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h	2021-12-10 02:38:54 UTC (rev 286824)
@@ -47,6 +47,7 @@
     const SVGFilterExpression& _expression_() const { return m_expression; }
     
     RefPtr<FilterEffect> lastEffect() const final;
+    FilterEffectVector effectsOfType(FilterFunction::Type) const final;
 
     RefPtr<FilterImage> apply(FilterImage* sourceImage) final;
 

Modified: trunk/Source/WebKit/ChangeLog (286823 => 286824)


--- trunk/Source/WebKit/ChangeLog	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebKit/ChangeLog	2021-12-10 02:38:54 UTC (rev 286824)
@@ -1,3 +1,22 @@
+2021-12-09  Said Abou-Hallawa  <s...@apple.com>
+
+        [GPU Process] [Filters] Add the encoding and decoding for FEImage
+        https://bugs.webkit.org/show_bug.cgi?id=234099
+
+        Reviewed by Wenson Hsieh.
+
+        Add the support to encode and decode the FEImage through FilterReference.
+        The RenderingResourceIdentifier of the Image or the ImageBuffer will be
+        used while encoding and decoding the FEImage. Resolving the decoded
+        RenderingResourceIdentifier back to an Image or ImageBuffer will happen
+        in RemoteDisplayListRecorder::drawFilteredImageBuffer).
+
+        * GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
+        (WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer):
+        * Platform/IPC/FilterReference.h:
+        (IPC::FilterReference::encodeFilterEffect):
+        (IPC::FilterReference::decodeFilterEffect):
+
 2021-12-09  Aditya Keerthi  <akeer...@apple.com>
 
         [iOS] Add SPI to enable find interactions on WKWebView

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp (286823 => 286824)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp	2021-12-10 02:38:54 UTC (rev 286824)
@@ -29,6 +29,7 @@
 #if ENABLE(GPU_PROCESS)
 
 #include "RemoteDisplayListRecorderMessages.h"
+#include <WebCore/BitmapImage.h>
 
 namespace WebKit {
 using namespace WebCore;
@@ -234,6 +235,26 @@
 
     auto filter = filterReference.takeFilter();
 
+    for (auto& effect : filter->effectsOfType(FilterEffect::Type::FEImage)) {
+        auto& feImage = *downcast<FEImage>(effect.get());
+
+        const auto* resourceIdentifier = std::get_if<RenderingResourceIdentifier>(&feImage.sourceImage());
+        if (!resourceIdentifier) {
+            ASSERT_NOT_REACHED();
+            return;
+        }
+
+        if (auto nativeImage = resourceCache().cachedNativeImage({ *resourceIdentifier, m_webProcessIdentifier })) {
+            feImage.setImageSource(Ref<Image> { BitmapImage::create(nativeImage) });
+            continue;
+        }
+
+        if (auto imageBuffer = resourceCache().cachedImageBuffer({ *resourceIdentifier, m_webProcessIdentifier })) {
+            feImage.setImageSource({ *imageBuffer });
+            continue;
+        }
+    }
+
     handleItem(DisplayList::DrawFilteredImageBuffer(sourceImageIdentifier, sourceImageRect, WTFMove(filter)), sourceImage.get());
 }
 

Modified: trunk/Source/WebKit/Platform/IPC/FilterReference.h (286823 => 286824)


--- trunk/Source/WebKit/Platform/IPC/FilterReference.h	2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebKit/Platform/IPC/FilterReference.h	2021-12-10 02:38:54 UTC (rev 286824)
@@ -44,6 +44,7 @@
 #include <WebCore/FETurbulence.h>
 #include <WebCore/Filter.h>
 #include <WebCore/FilterEffectVector.h>
+#include <WebCore/SVGFEImage.h>
 #include <WebCore/SVGFilter.h>
 #include <WebCore/SourceAlpha.h>
 #include <WebCore/SourceGraphic.h>
@@ -139,7 +140,7 @@
         break;
 
     case WebCore::FilterEffect::Type::FEImage:
-        // FIXME: encode FEImage.
+        downcast<WebCore::FEImage>(effect).encode(encoder);
         break;
 
     case WebCore::FilterEffect::Type::FEMerge:
@@ -229,7 +230,7 @@
         break;
 
     case WebCore::FilterEffect::Type::FEImage:
-        // FIXME: decode FEImage.
+        effect = WebCore::FEImage::decode(decoder);
         break;
 
     case WebCore::FilterEffect::Type::FEMerge:
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to