Title: [287782] trunk/Source
Revision
287782
Author
[email protected]
Date
2022-01-07 14:21:03 -0800 (Fri, 07 Jan 2022)

Log Message

[GPU Process] Remove the result FilterImage from FilterEffect
https://bugs.webkit.org/show_bug.cgi?id=232840
rdar://85425842

Reviewed by Darin Adler.

Source/WebCore:

Removing the result FilterImage from FilterEffect will allow reusing the
same FilterEffect for all the renderers that reference it. The results
will now be stored in the new class 'FilterResults'.

-- FilterData still keeps the results of applying the Filter to its
   renderer in a new member of type FilterResults.

-- RenderLayerFilters will not need to clear its CSSFilter intermediate
   results because this will happen once the temporary FilterResults goes
   out of scope.

FilterResults will have two maps:

1. FilterEffect -> FilterImage: The value is the result FilterImage of
   applying the FilterEffect.
2. FilterImage -> FilterEffectSet: The value is a list of FilterEffects,
   whose FilterImages depend on the key FilterImage.

* Headers.cmake:
* WebCore.xcodeproj/project.pbxproj:
* platform/graphics/ConcreteImageBuffer.h:
* platform/graphics/GraphicsContext.cpp:
(WebCore::GraphicsContext::drawFilteredImageBuffer):
* platform/graphics/GraphicsContext.h:
* platform/graphics/displaylists/DisplayListItems.cpp:
(WebCore::DisplayList::DrawFilteredImageBuffer::apply):
* platform/graphics/displaylists/DisplayListItems.h:
* platform/graphics/displaylists/DisplayListRecorder.cpp:
(WebCore::DisplayList::Recorder::drawFilteredImageBuffer):
* platform/graphics/displaylists/DisplayListRecorder.h:
* platform/graphics/filters/Filter.cpp:
(WebCore::Filter::apply):
* platform/graphics/filters/Filter.h:
* platform/graphics/filters/FilterEffect.cpp:
(WebCore::FilterEffect::apply):
(WebCore::FilterEffect::clearResult): Deleted.
(WebCore::FilterEffect::clearResultsRecursive): Deleted.
* platform/graphics/filters/FilterEffect.h:
(WebCore::FilterEffect::hasResult const): Deleted.
(WebCore::FilterEffect::filterImage const): Deleted.
* platform/graphics/filters/FilterFunction.h:
(WebCore::FilterFunction::apply):
(WebCore::FilterFunction::outsets const):
(WebCore::FilterFunction::clearResult): Deleted.
* platform/graphics/filters/FilterResults.h: Added.
(WebCore::FilterResults::effectResult const):
(WebCore::FilterResults::setEffectResult):
(WebCore::FilterResults::clearEffectResult):
* platform/network/SynchronousLoaderClient.cpp:
* rendering/CSSFilter.cpp:
(WebCore::CSSFilter::apply):
(WebCore::CSSFilter::clearIntermediateResults): Deleted.
* rendering/CSSFilter.h:
* rendering/RenderLayerFilters.cpp:
(WebCore::RenderLayerFilters::applyFilterEffect):
* rendering/svg/RenderSVGResourceFilter.cpp:
(WebCore::RenderSVGResourceFilter::postApplyResource):
(WebCore::RenderSVGResourceFilter::primitiveAttributeChanged):
* rendering/svg/RenderSVGResourceFilter.h:
* svg/graphics/filters/SVGFilter.cpp:
(WebCore::SVGFilter::apply):
(WebCore::SVGFilter::clearResult): Deleted.
* svg/graphics/filters/SVGFilter.h:
* svg/graphics/filters/SVGFilterBuilder.cpp:
(WebCore::SVGFilterBuilder::setupBuiltinEffects):
(WebCore::SVGFilterBuilder::buildFilterEffects):
(WebCore::SVGFilterBuilder::appendEffectToEffectRenderer):
(WebCore::SVGFilterBuilder::appendEffectToEffectReferences): Deleted.
(WebCore::SVGFilterBuilder::clearEffects): Deleted.
(WebCore::SVGFilterBuilder::clearResultsRecursive): Deleted.
* svg/graphics/filters/SVGFilterBuilder.h:
(WebCore::SVGFilterBuilder::lastEffect const): Deleted.
(WebCore::SVGFilterBuilder::effectReferences): Deleted.
(WebCore::SVGFilterBuilder::addBuiltinEffects): Deleted.

Source/WebKit:

* GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
(WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (287781 => 287782)


--- trunk/Source/WebCore/ChangeLog	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/ChangeLog	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,3 +1,86 @@
+2022-01-07  Said Abou-Hallawa  <[email protected]>
+
+        [GPU Process] Remove the result FilterImage from FilterEffect
+        https://bugs.webkit.org/show_bug.cgi?id=232840
+        rdar://85425842
+
+        Reviewed by Darin Adler.
+
+        Removing the result FilterImage from FilterEffect will allow reusing the
+        same FilterEffect for all the renderers that reference it. The results 
+        will now be stored in the new class 'FilterResults'.
+
+        -- FilterData still keeps the results of applying the Filter to its
+           renderer in a new member of type FilterResults.
+
+        -- RenderLayerFilters will not need to clear its CSSFilter intermediate
+           results because this will happen once the temporary FilterResults goes
+           out of scope.
+
+        FilterResults will have two maps:
+
+        1. FilterEffect -> FilterImage: The value is the result FilterImage of 
+           applying the FilterEffect.
+        2. FilterImage -> FilterEffectSet: The value is a list of FilterEffects,
+           whose FilterImages depend on the key FilterImage.
+
+        * Headers.cmake:
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/graphics/ConcreteImageBuffer.h:
+        * platform/graphics/GraphicsContext.cpp:
+        (WebCore::GraphicsContext::drawFilteredImageBuffer):
+        * platform/graphics/GraphicsContext.h:
+        * platform/graphics/displaylists/DisplayListItems.cpp:
+        (WebCore::DisplayList::DrawFilteredImageBuffer::apply):
+        * platform/graphics/displaylists/DisplayListItems.h:
+        * platform/graphics/displaylists/DisplayListRecorder.cpp:
+        (WebCore::DisplayList::Recorder::drawFilteredImageBuffer):
+        * platform/graphics/displaylists/DisplayListRecorder.h:
+        * platform/graphics/filters/Filter.cpp:
+        (WebCore::Filter::apply):
+        * platform/graphics/filters/Filter.h:
+        * platform/graphics/filters/FilterEffect.cpp:
+        (WebCore::FilterEffect::apply):
+        (WebCore::FilterEffect::clearResult): Deleted.
+        (WebCore::FilterEffect::clearResultsRecursive): Deleted.
+        * platform/graphics/filters/FilterEffect.h:
+        (WebCore::FilterEffect::hasResult const): Deleted.
+        (WebCore::FilterEffect::filterImage const): Deleted.
+        * platform/graphics/filters/FilterFunction.h:
+        (WebCore::FilterFunction::apply):
+        (WebCore::FilterFunction::outsets const):
+        (WebCore::FilterFunction::clearResult): Deleted.
+        * platform/graphics/filters/FilterResults.h: Added.
+        (WebCore::FilterResults::effectResult const):
+        (WebCore::FilterResults::setEffectResult):
+        (WebCore::FilterResults::clearEffectResult):
+        * platform/network/SynchronousLoaderClient.cpp:
+        * rendering/CSSFilter.cpp:
+        (WebCore::CSSFilter::apply):
+        (WebCore::CSSFilter::clearIntermediateResults): Deleted.
+        * rendering/CSSFilter.h:
+        * rendering/RenderLayerFilters.cpp:
+        (WebCore::RenderLayerFilters::applyFilterEffect):
+        * rendering/svg/RenderSVGResourceFilter.cpp:
+        (WebCore::RenderSVGResourceFilter::postApplyResource):
+        (WebCore::RenderSVGResourceFilter::primitiveAttributeChanged):
+        * rendering/svg/RenderSVGResourceFilter.h:
+        * svg/graphics/filters/SVGFilter.cpp:
+        (WebCore::SVGFilter::apply):
+        (WebCore::SVGFilter::clearResult): Deleted.
+        * svg/graphics/filters/SVGFilter.h:
+        * svg/graphics/filters/SVGFilterBuilder.cpp:
+        (WebCore::SVGFilterBuilder::setupBuiltinEffects):
+        (WebCore::SVGFilterBuilder::buildFilterEffects):
+        (WebCore::SVGFilterBuilder::appendEffectToEffectRenderer):
+        (WebCore::SVGFilterBuilder::appendEffectToEffectReferences): Deleted.
+        (WebCore::SVGFilterBuilder::clearEffects): Deleted.
+        (WebCore::SVGFilterBuilder::clearResultsRecursive): Deleted.
+        * svg/graphics/filters/SVGFilterBuilder.h:
+        (WebCore::SVGFilterBuilder::lastEffect const): Deleted.
+        (WebCore::SVGFilterBuilder::effectReferences): Deleted.
+        (WebCore::SVGFilterBuilder::addBuiltinEffects): Deleted.
+
 2022-01-07  Patrick Angle  <[email protected]>
 
         [Cocoa] Web Driver: WebSocket over TLS failing over WebDriver with acceptInsecureCerts on Big Sur

Modified: trunk/Source/WebCore/Headers.cmake (287781 => 287782)


--- trunk/Source/WebCore/Headers.cmake	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/Headers.cmake	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1613,6 +1613,7 @@
     platform/graphics/filters/FilterImageVector.h
     platform/graphics/filters/FilterOperation.h
     platform/graphics/filters/FilterOperations.h
+    platform/graphics/filters/FilterResults.h
     platform/graphics/filters/LightSource.h
     platform/graphics/filters/PointLightSource.h
     platform/graphics/filters/SourceAlpha.h

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (287781 => 287782)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2022-01-07 22:21:03 UTC (rev 287782)
@@ -2335,6 +2335,7 @@
 		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, ); }; };
+		72D73644278461A000398663 /* FilterResults.h in Headers */ = {isa = PBXBuildFile; fileRef = 7211B5D6276536820076FEF8 /* FilterResults.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		72F667E1260C26AC00EE36AD /* DiagnosticLoggingDomain.h in Headers */ = {isa = PBXBuildFile; fileRef = 72F667DF260C264400EE36AD /* DiagnosticLoggingDomain.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		7553CFE8108F473F00EA281E /* TimelineRecordFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 7553CFE6108F473F00EA281E /* TimelineRecordFactory.h */; };
 		75793E840D0CE0B3007FC0AC /* MessageEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 75793E810D0CE0B3007FC0AC /* MessageEvent.h */; };
@@ -11218,6 +11219,7 @@
 		71F6EE41255EDF9C00FC4C5B /* GridTrackSize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GridTrackSize.cpp; sourceTree = "<group>"; };
 		71F936F71DD4F99B00922CC7 /* tracks-support.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode._javascript_; path = "tracks-support.js"; sourceTree = "<group>"; };
 		71FF851822A3F81F005D5959 /* NavigatorMaxTouchPoints.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NavigatorMaxTouchPoints.idl; sourceTree = "<group>"; };
+		7211B5D6276536820076FEF8 /* FilterResults.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilterResults.h; sourceTree = "<group>"; };
 		721443452240C8BA00F12FF7 /* SVGAnimatedValueProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedValueProperty.h; sourceTree = "<group>"; };
 		721443462240CAD200F12FF7 /* SVGValueProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGValueProperty.h; sourceTree = "<group>"; };
 		7214B9B7274458FA003BE6DF /* FilterEffectVector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilterEffectVector.h; sourceTree = "<group>"; };
@@ -26791,6 +26793,7 @@
 				49ECEB641499790D00CDD3A4 /* FilterOperation.h */,
 				49ECEB651499790D00CDD3A4 /* FilterOperations.cpp */,
 				49ECEB661499790D00CDD3A4 /* FilterOperations.h */,
+				7211B5D6276536820076FEF8 /* FilterResults.h */,
 				84730D741248F0B300D3A9C9 /* LightSource.h */,
 				A1E1154513015C4E0054AC8C /* PointLightSource.cpp */,
 				84730D751248F0B300D3A9C9 /* PointLightSource.h */,
@@ -34386,6 +34389,7 @@
 				7246963E275C616700A9156A /* FilterImageVector.h in Headers */,
 				49ECEB6E1499790D00CDD3A4 /* FilterOperation.h in Headers */,
 				49ECEB701499790D00CDD3A4 /* FilterOperations.h in Headers */,
+				72D73644278461A000398663 /* FilterResults.h in Headers */,
 				372C00D9129619F8005C9575 /* FindOptions.h in Headers */,
 				A8CFF04F0A154F09000A4234 /* FixedTableLayout.h in Headers */,
 				6FB7D2DD250FD828000207AA /* FlexFormattingContext.h in Headers */,

Modified: trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h (287781 => 287782)


--- trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2021 Apple Inc.  All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -27,6 +27,7 @@
 
 #include "Filter.h"
 #include "FilterImage.h"
+#include "FilterResults.h"
 #include "ImageBuffer.h"
 #include "PixelBuffer.h"
 
@@ -146,7 +147,9 @@
             return nullptr;
 
         const_cast<ConcreteImageBuffer&>(*this).flushDrawingContext();
-        auto result = filter.apply(this, { { }, logicalSize() });
+        
+        FilterResults results;
+        auto result = filter.apply(this, { { }, logicalSize() }, results);
         if (!result)
             return nullptr;
 

Modified: trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp (287781 => 287782)


--- trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp	2022-01-07 22:21:03 UTC (rev 287782)
@@ -631,9 +631,9 @@
     ImageBuffer::drawConsuming(WTFMove(image), *this, destination, source, options);
 }
 
-void GraphicsContext::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter)
+void GraphicsContext::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter, FilterResults& results)
 {
-    auto result = filter.apply(sourceImage, sourceImageRect);
+    auto result = filter.apply(sourceImage, sourceImageRect, results);
     if (!result)
         return;
     

Modified: trunk/Source/WebCore/platform/graphics/GraphicsContext.h (287781 => 287782)


--- trunk/Source/WebCore/platform/graphics/GraphicsContext.h	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/GraphicsContext.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -86,6 +86,7 @@
 
 class AffineTransform;
 class Filter;
+class FilterResults;
 class FloatRoundedRect;
 class Gradient;
 class GraphicsContextPlatformPrivate;
@@ -452,7 +453,7 @@
     WEBCORE_EXPORT void drawConsumingImageBuffer(RefPtr<ImageBuffer>, const FloatRect& destination, const ImagePaintingOptions& = { });
     WEBCORE_EXPORT virtual void drawConsumingImageBuffer(RefPtr<ImageBuffer>, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& = { });
 
-    WEBCORE_EXPORT virtual void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter&);
+    WEBCORE_EXPORT virtual void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter&, FilterResults&);
 
     virtual void drawPattern(NativeImage&, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& = { }) = 0;
 

Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp (287781 => 287782)


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp	2022-01-07 22:21:03 UTC (rev 287782)
@@ -312,9 +312,9 @@
     ASSERT_NOT_REACHED();
 }
 
-void DrawFilteredImageBuffer::apply(GraphicsContext& context, WebCore::ImageBuffer* sourceImage)
+void DrawFilteredImageBuffer::apply(GraphicsContext& context, ImageBuffer* sourceImage, FilterResults& results)
 {
-    context.drawFilteredImageBuffer(sourceImage, m_sourceImageRect, m_filter);
+    context.drawFilteredImageBuffer(sourceImage, m_sourceImageRect, m_filter, results);
 }
 
 static TextStream& operator<<(TextStream& ts, const DrawFilteredImageBuffer& item)

Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h (287781 => 287782)


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -737,7 +737,7 @@
     FloatRect destinationRect() const { return m_destinationRect; }
     bool isValid() const { return m_imageBufferIdentifier.isValid(); }
 
-    WEBCORE_EXPORT void apply(GraphicsContext&, WebCore::ImageBuffer&) const;
+    WEBCORE_EXPORT void apply(GraphicsContext&, ImageBuffer&) const;
 
     NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const;
 
@@ -924,7 +924,7 @@
     FloatRect sourceImageRect() const { return m_sourceImageRect; }
 
     NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const;
-    WEBCORE_EXPORT void apply(GraphicsContext&, WebCore::ImageBuffer* sourceImage);
+    WEBCORE_EXPORT void apply(GraphicsContext&, ImageBuffer* sourceImage, FilterResults&);
 
     std::optional<FloatRect> globalBounds() const { return std::nullopt; }
     std::optional<FloatRect> localBounds(const GraphicsContext&) const { return m_sourceImageRect; }
@@ -1039,7 +1039,7 @@
     // FIXME: We might want to validate ImagePaintingOptions.
     bool isValid() const { return m_imageBufferIdentifier.isValid(); }
 
-    WEBCORE_EXPORT void apply(GraphicsContext&, WebCore::ImageBuffer&) const;
+    WEBCORE_EXPORT void apply(GraphicsContext&, ImageBuffer&) const;
 
     NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const;
 

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


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp	2022-01-07 22:21:03 UTC (rev 287782)
@@ -146,12 +146,12 @@
     recordSetMiterLimit(miterLimit);
 }
 
-void Recorder::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter)
+void Recorder::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter, FilterResults& results)
 {
     appendStateChangeItemIfNecessary();
 
     if (sourceImage && !canDrawImageBuffer(*sourceImage)) {
-        GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
+        GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter, results);
         return;
     }
 
@@ -177,7 +177,7 @@
         );
 
         if (!isRecorded) {
-            GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
+            GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter, results);
             return;
         }
     }

Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h (287781 => 287782)


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -225,7 +225,7 @@
     WEBCORE_EXPORT void applyFillPattern() final;
 #endif
 
-    WEBCORE_EXPORT void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter&) final;
+    WEBCORE_EXPORT void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter&, FilterResults&) final;
 
     WEBCORE_EXPORT void drawGlyphs(const Font&, const GlyphBufferGlyph*, const GlyphBufferAdvance*, unsigned numGlyphs, const FloatPoint& anchorPoint, FontSmoothingMode) final;
     WEBCORE_EXPORT void drawGlyphsAndCacheFont(const Font&, const GlyphBufferGlyph*, const GlyphBufferAdvance*, unsigned count, const FloatPoint& localAnchor, FontSmoothingMode) final;

Modified: trunk/Source/WebCore/platform/graphics/filters/Filter.cpp (287781 => 287782)


--- trunk/Source/WebCore/platform/graphics/filters/Filter.cpp	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/filters/Filter.cpp	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 Apple Inc.  All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -81,7 +81,7 @@
     return true;
 }
 
-RefPtr<FilterImage> Filter::apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect)
+RefPtr<FilterImage> Filter::apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, FilterResults& results)
 {
     RefPtr<FilterImage> input;
 
@@ -92,7 +92,7 @@
             return nullptr;
     }
 
-    auto result = apply(input.get());
+    auto result = apply(input.get(), results);
     if (!result)
         return nullptr;
 

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


--- trunk/Source/WebCore/platform/graphics/filters/Filter.h	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/filters/Filter.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2009 Dirk Schulze <[email protected]>
  * Copyright (C) 2013 Google Inc. All rights reserved.
- * Copyright (C) 2021 Apple Inc.  All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc.  All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -32,6 +32,7 @@
 
 class FilterEffect;
 class FilterImage;
+class FilterResults;
 
 class Filter : public FilterFunction {
     using FilterFunction::apply;
@@ -65,8 +66,8 @@
 
     bool clampFilterRegionIfNeeded();
 
-    virtual RefPtr<FilterImage> apply(FilterImage* sourceImage) = 0;
-    WEBCORE_EXPORT RefPtr<FilterImage> apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect);
+    virtual RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) = 0;
+    WEBCORE_EXPORT RefPtr<FilterImage> apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, FilterResults&);
 
 protected:
     using FilterFunction::FilterFunction;

Modified: trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp (287781 => 287782)


--- trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp	2022-01-07 22:21:03 UTC (rev 287782)
@@ -3,7 +3,7 @@
  * Copyright (C) 2009 Dirk Schulze <[email protected]>
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
  * Copyright (C) 2012 University of Szeged
- * Copyright (C) 2015-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2015-2022 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -27,6 +27,7 @@
 #include "Filter.h"
 #include "FilterEffectApplier.h"
 #include "FilterEffectGeometry.h"
+#include "FilterResults.h"
 #include "ImageBuffer.h"
 #include "Logging.h"
 #include <wtf/text/TextStream.h>
@@ -99,17 +100,17 @@
         input->correctPremultipliedPixelBuffer();
 }
 
-RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, FilterImage& input)
+RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, FilterImage& input, FilterResults& results)
 {
-    return apply(filter, FilterImageVector { Ref { input } });
+    return apply(filter, FilterImageVector { Ref { input } }, results);
 }
 
-RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, const FilterImageVector& inputs, const std::optional<FilterEffectGeometry>& geometry)
+RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, const FilterImageVector& inputs, FilterResults& results, const std::optional<FilterEffectGeometry>& geometry)
 {
     ASSERT(inputs.size() == numberOfImageInputs());
 
-    if (m_filterImage)
-        return m_filterImage;
+    if (auto result = results.effectResult(*this))
+        return result;
 
     auto primitiveSubregion = calculatePrimitiveSubregion(filter, inputs, geometry);
     auto imageRect = calculateImageRect(filter, inputs, primitiveSubregion);
@@ -126,8 +127,8 @@
     if (!applier)
         return nullptr;
 
-    m_filterImage = FilterImage::create(primitiveSubregion, imageRect, absoluteImageRect, isAlphaImage, isValidPremultiplied, filter.renderingMode(), imageColorSpace);
-    if (!m_filterImage)
+    auto result = FilterImage::create(primitiveSubregion, imageRect, absoluteImageRect, isAlphaImage, isValidPremultiplied, filter.renderingMode(), imageColorSpace);
+    if (!result)
         return nullptr;
 
     LOG_WITH_STREAM(Filters, stream
@@ -141,10 +142,11 @@
     if (isValidPremultiplied)
         correctPremultipliedInputs(inputs);
 
-    if (!applier->apply(filter, inputs, *m_filterImage))
-        m_filterImage = nullptr;
+    if (!applier->apply(filter, inputs, *result))
+        return nullptr;
 
-    return m_filterImage;
+    results.setEffectResult(*this, inputs, { *result });
+    return result;
 }
 
 FilterEffect& FilterEffect::inputEffect(unsigned number) const
@@ -153,20 +155,6 @@
     return m_inputEffects.at(number);
 }
 
-void FilterEffect::clearResult()
-{
-    m_filterImage = nullptr;
-}
-
-void FilterEffect::clearResultsRecursive()
-{
-    // Clear all results, regardless that the current effect has
-    // a result. Can be used if an effect is in an erroneous state.
-    clearResult();
-    for (auto& effect : m_inputEffects)
-        effect->clearResultsRecursive();
-}
-
 TextStream& FilterEffect::externalRepresentation(TextStream& ts, FilterRepresentation representation) const
 {
     // FIXME: We should dump the subRegions of the filter primitives here later. This isn't

Modified: trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h (287781 => 287782)


--- trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -2,7 +2,7 @@
  * Copyright (C) 2008 Alex Mathews <[email protected]>
  * Copyright (C) 2009 Dirk Schulze <[email protected]>
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -43,17 +43,12 @@
     using FilterFunction::apply;
 
 public:
-    void clearResult() override;
-    void clearResultsRecursive();
-    bool hasResult() const { return m_filterImage; }
-
-    RefPtr<FilterImage> filterImage() const { return m_filterImage; }
     FilterImageVector takeImageInputs(FilterImageVector& stack) const;
 
     FilterEffectVector& inputEffects() { return m_inputEffects; }
     FilterEffect& inputEffect(unsigned) const;
 
-    RefPtr<FilterImage> apply(const Filter&, const FilterImageVector& inputs, const std::optional<FilterEffectGeometry>& = std::nullopt);
+    RefPtr<FilterImage> apply(const Filter&, const FilterImageVector& inputs, FilterResults&, const std::optional<FilterEffectGeometry>& = std::nullopt);
 
     const DestinationColorSpace& operatingColorSpace() const { return m_operatingColorSpace; }
     virtual void setOperatingColorSpace(const DestinationColorSpace& colorSpace) { m_operatingColorSpace = colorSpace; }
@@ -83,12 +78,10 @@
 
     virtual std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const = 0;
 
-    RefPtr<FilterImage> apply(const Filter&, FilterImage& input) override;
+    RefPtr<FilterImage> apply(const Filter&, FilterImage& input, FilterResults&) override;
 
     FilterEffectVector m_inputEffects;
 
-    RefPtr<FilterImage> m_filterImage;
-
     DestinationColorSpace m_operatingColorSpace { DestinationColorSpace::SRGB() };
 };
 

Modified: trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h (287781 => 287782)


--- trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 Apple Inc.  All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -40,6 +40,7 @@
 namespace WebCore {
 
 class Filter;
+class FilterResults;
 
 enum class FilterRepresentation : uint8_t {
     TestOutput,
@@ -96,9 +97,8 @@
     virtual bool supportsCoreImageRendering() const { return false; }
 #endif
 
-    virtual RefPtr<FilterImage> apply(const Filter&, FilterImage&) { return nullptr; }
+    virtual RefPtr<FilterImage> apply(const Filter&, FilterImage&, FilterResults&) { return nullptr; }
     virtual IntOutsets outsets() const { return { }; }
-    virtual void clearResult() { }
 
     virtual WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation = FilterRepresentation::TestOutput) const = 0;
 

Added: trunk/Source/WebCore/platform/graphics/filters/FilterResults.h (0 => 287782)


--- trunk/Source/WebCore/platform/graphics/filters/FilterResults.h	                        (rev 0)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterResults.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2022 Apple Inc.  All rights reserved.
+ *
+ * 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 the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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.
+ */
+
+#pragma once
+
+#include "FilterEffect.h"
+#include "FilterImageVector.h"
+#include <wtf/HashMap.h>
+#include <wtf/HashSet.h>
+
+namespace WebCore {
+
+class FilterEffect;
+class FilterImage;
+
+class FilterResults {
+public:
+    FilterResults() = default;
+
+    FilterImage* effectResult(FilterEffect& effect) const
+    {
+        return m_results.get(effect);
+    }
+
+    void setEffectResult(FilterEffect& effect, const FilterImageVector& inputs, Ref<FilterImage>&& result)
+    {
+        m_results.set({ effect }, WTFMove(result));
+        
+        for (auto& input : inputs)
+            m_resultReferences.add(input, FilterEffectSet()).iterator->value.add(effect);
+    }
+
+    void clearEffectResult(FilterEffect& effect)
+    {
+        auto iterator = m_results.find(effect);
+        if (iterator == m_results.end())
+            return;
+
+        auto result = iterator->value;
+        m_results.remove(iterator);
+
+        for (auto& reference : m_resultReferences.get(result))
+            clearEffectResult(reference);
+    }
+
+private:
+    using FilterEffectSet = HashSet<Ref<FilterEffect>>;
+    HashMap<Ref<FilterEffect>, Ref<FilterImage>> m_results;
+    // The value is a list of FilterEffects, whose FilterImages depend on the key FilterImage.
+    HashMap<Ref<FilterImage>, FilterEffectSet> m_resultReferences;
+};
+
+} // namespace WebCore

Modified: trunk/Source/WebCore/rendering/CSSFilter.cpp (287781 => 287782)


--- trunk/Source/WebCore/rendering/CSSFilter.cpp	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/rendering/CSSFilter.cpp	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2011-2022 Apple Inc. All rights reserved.
  * Copyright (C) 2013 Google Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -381,14 +381,8 @@
 }
 #endif
 
-void CSSFilter::clearIntermediateResults()
+RefPtr<FilterImage> CSSFilter::apply(FilterImage* sourceImage, FilterResults& results)
 {
-    for (auto& function : m_functions)
-        function->clearResult();
-}
-
-RefPtr<FilterImage> CSSFilter::apply(FilterImage* sourceImage)
-{
     if (!sourceImage)
         return nullptr;
     
@@ -395,7 +389,7 @@
     RefPtr<FilterImage> result = sourceImage;
 
     for (auto& function : m_functions) {
-        result = function->apply(*this, *result);
+        result = function->apply(*this, *result, results);
         if (!result)
             return nullptr;
     }

Modified: trunk/Source/WebCore/rendering/CSSFilter.h (287781 => 287782)


--- trunk/Source/WebCore/rendering/CSSFilter.h	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/rendering/CSSFilter.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2011-2022 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -27,8 +27,6 @@
 
 #include "Filter.h"
 #include "IntRectExtent.h"
-#include "LayoutRect.h"
-#include <wtf/TypeCasts.h>
 
 namespace WebCore {
 
@@ -57,8 +55,7 @@
 
     IntOutsets outsets() const final;
 
-    void clearIntermediateResults();
-    RefPtr<FilterImage> apply(FilterImage* sourceImage) final;
+    RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) final;
 
 private:
     CSSFilter(RenderingMode, const FloatSize& filterScale, ClipOperation, bool hasFilterThatMovesPixels, bool hasFilterThatShouldBeRestrictedBySecurityOrigin);

Modified: trunk/Source/WebCore/rendering/RenderLayerFilters.cpp (287781 => 287782)


--- trunk/Source/WebCore/rendering/RenderLayerFilters.cpp	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/rendering/RenderLayerFilters.cpp	2022-01-07 22:21:03 UTC (rev 287782)
@@ -222,11 +222,9 @@
     ASSERT(inputContext());
     inputContext()->restore();
 
-    auto& filter = *m_filter;
+    FilterResults results;
+    destinationContext.drawFilteredImageBuffer(m_sourceImage.get(), m_filterRegion, *m_filter, results);
 
-    destinationContext.drawFilteredImageBuffer(m_sourceImage.get(), m_filterRegion, filter);
-    filter.clearIntermediateResults();
-
     LOG_WITH_STREAM(Filters, stream << "RenderLayerFilters " << this << " applyFilterEffect done\n");
 }
 

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp (287781 => 287782)


--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp	2022-01-07 22:21:03 UTC (rev 287782)
@@ -215,7 +215,7 @@
 
     if (!filterData.boundaries.isEmpty()) {
         filterData.state = FilterData::Built;
-        context->drawFilteredImageBuffer(filterData.sourceGraphicBuffer.get(), filterData.drawingRegion, *filterData.filter);
+        context->drawFilteredImageBuffer(filterData.sourceGraphicBuffer.get(), filterData.drawingRegion, *filterData.filter, filterData.results);
     }
 
     LOG_WITH_STREAM(Filters, stream << "RenderSVGResourceFilter " << this << " postApplyResource done\n");
@@ -245,7 +245,7 @@
         // or none of them will be changed.
         if (!primitve->setFilterEffectAttribute(effect, attribute))
             return;
-        builder->clearResultsRecursive(*effect);
+        filterData->results.clearEffectResult(*effect);
 
         // Repaint the image on the screen.
         markClientForInvalidation(*objectFilterDataPair.key, RepaintInvalidation);

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h (287781 => 287782)


--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -23,6 +23,7 @@
 
 #pragma once
 
+#include "FilterResults.h"
 #include "ImageBuffer.h"
 #include "RenderSVGResourceContainer.h"
 #include "SVGFilter.h"
@@ -51,6 +52,7 @@
     FloatRect drawingRegion;
     FloatSize scale;
     FilterDataState state { PaintingSource };
+    FilterResults results;
 };
 
 class GraphicsContext;

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


--- trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp	2022-01-07 22:21:03 UTC (rev 287782)
@@ -2,7 +2,7 @@
  * Copyright (C) 2009 Dirk Schulze <[email protected]>
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
  * Copyright (C) 2013 Google Inc. All rights reserved.
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -23,6 +23,7 @@
 #include "config.h"
 #include "SVGFilter.h"
 
+#include "FilterResults.h"
 #include "SVGFilterBuilder.h"
 #include "SVGFilterElement.h"
 #include "SourceGraphic.h"
@@ -130,12 +131,12 @@
     return copyToVector(effects);
 }
 
-RefPtr<FilterImage> SVGFilter::apply(const Filter&, FilterImage& sourceImage)
+RefPtr<FilterImage> SVGFilter::apply(const Filter&, FilterImage& sourceImage, FilterResults& results)
 {
-    return apply(&sourceImage);
+    return apply(&sourceImage, results);
 }
 
-RefPtr<FilterImage> SVGFilter::apply(FilterImage* sourceImage)
+RefPtr<FilterImage> SVGFilter::apply(FilterImage* sourceImage, FilterResults& results)
 {
     ASSERT(!m_expression.isEmpty());
 
@@ -146,8 +147,8 @@
         auto geometry = term.geometry;
 
         if (effect->filterType() == FilterEffect::Type::SourceGraphic) {
-            if (auto result = effect->filterImage()) {
-                stack.append(result.releaseNonNull());
+            if (auto result = results.effectResult(effect)) {
+                stack.append({ *result });
                 continue;
             }
 
@@ -161,12 +162,7 @@
         // Need to remove the inputs here in case the effect already has a result.
         auto inputs = effect->takeImageInputs(stack);
 
-        if (auto result = effect->filterImage()) {
-            stack.append(result.releaseNonNull());
-            continue;
-        }
-
-        auto result = term.effect->apply(*this, inputs, geometry);
+        auto result = term.effect->apply(*this, inputs, results, geometry);
         if (!result)
             return nullptr;
 
@@ -183,13 +179,6 @@
     return lastEffect()->outsets();
 }
 
-void SVGFilter::clearResult()
-{
-    ASSERT(!m_expression.isEmpty());
-    for (auto& term : m_expression)
-        term.effect->clearResult();
-}
-
 TextStream& SVGFilter::externalRepresentation(TextStream& ts, FilterRepresentation representation) const
 {
     for (auto it = m_expression.rbegin(), end = m_expression.rend(); it != end; ++it) {

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


--- trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2009 Dirk Schulze <[email protected]>
  * Copyright (C) 2013 Google Inc. All rights reserved.
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -49,7 +49,7 @@
     RefPtr<FilterEffect> lastEffect() const final;
     FilterEffectVector effectsOfType(FilterFunction::Type) const final;
 
-    RefPtr<FilterImage> apply(FilterImage* sourceImage) final;
+    RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) final;
 
     WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const final;
 
@@ -64,9 +64,8 @@
 #endif
     FloatSize resolvedSize(const FloatSize&) const final;
 
-    RefPtr<FilterImage> apply(const Filter&, FilterImage& sourceImage) final;
+    RefPtr<FilterImage> apply(const Filter&, FilterImage& sourceImage, FilterResults&) final;
     IntOutsets outsets() const final;
-    void clearResult() final;
 
     FloatRect m_targetBoundingBox;
     SVGUnitTypes::SVGUnitType m_primitiveUnits;

Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp (287781 => 287782)


--- trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2009 Dirk Schulze <[email protected]>
- * Copyright (C) 2021 Apple Inc.  All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc.  All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -41,7 +41,6 @@
 {
     m_builtinEffects.add(SourceGraphic::effectName(), sourceGraphic.ptr());
     m_builtinEffects.add(SourceAlpha::effectName(), SourceAlpha::create(sourceGraphic));
-    addBuiltinEffects();
 }
 
 static OptionSet<FilterEffectGeometry::Flags> effectGeometryFlagsForElement(SVGElement& element)
@@ -102,14 +101,11 @@
 #endif
 
         if (auto renderer = effectElement.renderer())
-            appendEffectToEffectReferences(effect.copyRef(), renderer);
+            appendEffectToEffectRenderer(*effect, *renderer);
 
         add(effectElement.result(), effect);
     }
 
-    if (!effect)
-        clearEffects();
-
     return effect;
 }
 
@@ -142,46 +138,11 @@
     return m_namedEffects.get(id);
 }
 
-void SVGFilterBuilder::appendEffectToEffectReferences(RefPtr<FilterEffect>&& effect, RenderObject* object)
+void SVGFilterBuilder::appendEffectToEffectRenderer(FilterEffect& effect, RenderObject& object)
 {
-    // The effect must be a newly created filter effect.
-    ASSERT(!m_effectReferences.contains(effect));
-    ASSERT(!object || !m_effectRenderer.contains(object));
-    m_effectReferences.add(effect, FilterEffectSet());
-
-    unsigned numberOfInputEffects = effect->inputEffects().size();
-
-    // It is not possible to add the same value to a set twice.
-    for (unsigned i = 0; i < numberOfInputEffects; ++i)
-        effectReferences(effect->inputEffect(i)).add(effect.get());
-
-    // If object is null, that means the element isn't attached for some
-    // reason, which in turn mean that certain types of invalidation will not
-    // work (the LayoutObject -> FilterEffect mapping will not be defined).
-    if (object)
-        m_effectRenderer.add(object, effect.get());
+    m_effectRenderer.add(&object, &effect);
 }
 
-void SVGFilterBuilder::clearEffects()
-{
-    m_lastEffect = nullptr;
-    m_namedEffects.clear();
-    m_effectReferences.clear();
-    m_effectRenderer.clear();
-    addBuiltinEffects();
-}
-
-void SVGFilterBuilder::clearResultsRecursive(FilterEffect& effect)
-{
-    if (!effect.hasResult())
-        return;
-
-    effect.clearResult();
-
-    for (auto& reference : effectReferences(effect))
-        clearResultsRecursive(*reference);
-}
-
 std::optional<FilterEffectGeometry> SVGFilterBuilder::effectGeometry(FilterEffect& effect) const
 {
     auto it = m_effectGeometryMap.find(effect);

Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h (287781 => 287782)


--- trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2008 Alex Mathews <[email protected]>
  * Copyright (C) 2009 Dirk Schulze <[email protected]>
- * Copyright (C) 2021 Apple Inc.  All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc.  All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -31,6 +31,7 @@
 
 namespace WebCore {
 
+class FilterEffect;
 class RenderObject;
 class SVGFilterElement;
 
@@ -37,8 +38,6 @@
 class SVGFilterBuilder {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    typedef HashSet<FilterEffect*> FilterEffectSet;
-
     SVGFilterBuilder() = default;
 
     void setTargetBoundingBox(const FloatRect& r) { m_targetBoundingBox = r; }
@@ -48,44 +47,22 @@
     void setPrimitiveUnits(SVGUnitTypes::SVGUnitType units) { m_primitiveUnits = units; }
 
     void add(const AtomString& id, RefPtr<FilterEffect>);
-
     RefPtr<FilterEffect> getEffectById(const AtomString&) const;
-    FilterEffect* lastEffect() const { return m_lastEffect.get(); }
 
-    void appendEffectToEffectReferences(RefPtr<FilterEffect>&&, RenderObject*);
-
-    inline FilterEffectSet& effectReferences(FilterEffect& effect)
-    {
-        // Only allowed for effects belongs to this builder.
-        ASSERT(m_effectReferences.contains(&effect));
-        return m_effectReferences.find(&effect)->value;
-    }
-
     // Required to change the attributes of a filter during an svgAttributeChanged.
+    void appendEffectToEffectRenderer(FilterEffect&, RenderObject&);
     inline FilterEffect* effectByRenderer(RenderObject* object) { return m_effectRenderer.get(object); }
 
-    void clearEffects();
-    void clearResultsRecursive(FilterEffect&);
-
     void setupBuiltinEffects(Ref<FilterEffect> sourceGraphic);
     RefPtr<FilterEffect> buildFilterEffects(SVGFilterElement&);
     bool buildExpression(SVGFilterExpression&) const;
 
 private:
-    inline void addBuiltinEffects()
-    {
-        for (auto& effect : m_builtinEffects.values())
-            m_effectReferences.add(effect, FilterEffectSet());
-    }
-
     std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const;
     bool buildEffectExpression(FilterEffect&, FilterEffectVector& stack, unsigned level, SVGFilterExpression&) const;
 
     HashMap<AtomString, RefPtr<FilterEffect>> m_builtinEffects;
     HashMap<AtomString, RefPtr<FilterEffect>> m_namedEffects;
-    // The value is a list, which contains those filter effects,
-    // which depends on the key filter effect.
-    HashMap<RefPtr<FilterEffect>, FilterEffectSet> m_effectReferences;
     HashMap<RenderObject*, FilterEffect*> m_effectRenderer;
 
     RefPtr<FilterEffect> m_lastEffect;

Modified: trunk/Source/WebKit/ChangeLog (287781 => 287782)


--- trunk/Source/WebKit/ChangeLog	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebKit/ChangeLog	2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,3 +1,14 @@
+2022-01-07  Said Abou-Hallawa  <[email protected]>
+
+        [GPU Process] Remove the result FilterImage from FilterEffect
+        https://bugs.webkit.org/show_bug.cgi?id=232840
+        rdar://85425842
+
+        Reviewed by Darin Adler.
+
+        * GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
+        (WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer):
+
 2022-01-07  Patrick Angle  <[email protected]>
 
         [Cocoa] Web Driver: WebSocket over TLS failing over WebDriver with acceptInsecureCerts on Big Sur

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp (287781 => 287782)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp	2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp	2022-01-07 22:21:03 UTC (rev 287782)
@@ -30,6 +30,7 @@
 
 #include "RemoteDisplayListRecorderMessages.h"
 #include <WebCore/BitmapImage.h>
+#include <WebCore/FilterResults.h>
 
 namespace WebKit {
 using namespace WebCore;
@@ -255,7 +256,8 @@
         }
     }
 
-    handleItem(DisplayList::DrawFilteredImageBuffer(sourceImageIdentifier, sourceImageRect, WTFMove(filter)), sourceImage.get());
+    FilterResults results;
+    handleItem(DisplayList::DrawFilteredImageBuffer(sourceImageIdentifier, sourceImageRect, WTFMove(filter)), sourceImage.get(), results);
 }
 
 void RemoteDisplayListRecorder::drawGlyphs(DisplayList::DrawGlyphs&& item)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to