Changeset 287782 in webkit
- Timestamp:
- Jan 7, 2022, 2:21:03 PM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 1 added
- 26 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/Headers.cmake (modified) (1 diff)
-
WebCore/WebCore.xcodeproj/project.pbxproj (modified) (4 diffs)
-
WebCore/platform/graphics/ConcreteImageBuffer.h (modified) (3 diffs)
-
WebCore/platform/graphics/GraphicsContext.cpp (modified) (1 diff)
-
WebCore/platform/graphics/GraphicsContext.h (modified) (2 diffs)
-
WebCore/platform/graphics/displaylists/DisplayListItems.cpp (modified) (1 diff)
-
WebCore/platform/graphics/displaylists/DisplayListItems.h (modified) (3 diffs)
-
WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp (modified) (2 diffs)
-
WebCore/platform/graphics/displaylists/DisplayListRecorder.h (modified) (1 diff)
-
WebCore/platform/graphics/filters/Filter.cpp (modified) (3 diffs)
-
WebCore/platform/graphics/filters/Filter.h (modified) (3 diffs)
-
WebCore/platform/graphics/filters/FilterEffect.cpp (modified) (6 diffs)
-
WebCore/platform/graphics/filters/FilterEffect.h (modified) (4 diffs)
-
WebCore/platform/graphics/filters/FilterFunction.h (modified) (3 diffs)
-
WebCore/platform/graphics/filters/FilterResults.h (added)
-
WebCore/rendering/CSSFilter.cpp (modified) (3 diffs)
-
WebCore/rendering/CSSFilter.h (modified) (3 diffs)
-
WebCore/rendering/RenderLayerFilters.cpp (modified) (1 diff)
-
WebCore/rendering/svg/RenderSVGResourceFilter.cpp (modified) (2 diffs)
-
WebCore/rendering/svg/RenderSVGResourceFilter.h (modified) (2 diffs)
-
WebCore/svg/graphics/filters/SVGFilter.cpp (modified) (6 diffs)
-
WebCore/svg/graphics/filters/SVGFilter.h (modified) (3 diffs)
-
WebCore/svg/graphics/filters/SVGFilterBuilder.cpp (modified) (4 diffs)
-
WebCore/svg/graphics/filters/SVGFilterBuilder.h (modified) (6 diffs)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r287781 r287782 1 2022-01-07 Said Abou-Hallawa <said@apple.com> 2 3 [GPU Process] Remove the result FilterImage from FilterEffect 4 https://bugs.webkit.org/show_bug.cgi?id=232840 5 rdar://85425842 6 7 Reviewed by Darin Adler. 8 9 Removing the result FilterImage from FilterEffect will allow reusing the 10 same FilterEffect for all the renderers that reference it. The results 11 will now be stored in the new class 'FilterResults'. 12 13 -- FilterData still keeps the results of applying the Filter to its 14 renderer in a new member of type FilterResults. 15 16 -- RenderLayerFilters will not need to clear its CSSFilter intermediate 17 results because this will happen once the temporary FilterResults goes 18 out of scope. 19 20 FilterResults will have two maps: 21 22 1. FilterEffect -> FilterImage: The value is the result FilterImage of 23 applying the FilterEffect. 24 2. FilterImage -> FilterEffectSet: The value is a list of FilterEffects, 25 whose FilterImages depend on the key FilterImage. 26 27 * Headers.cmake: 28 * WebCore.xcodeproj/project.pbxproj: 29 * platform/graphics/ConcreteImageBuffer.h: 30 * platform/graphics/GraphicsContext.cpp: 31 (WebCore::GraphicsContext::drawFilteredImageBuffer): 32 * platform/graphics/GraphicsContext.h: 33 * platform/graphics/displaylists/DisplayListItems.cpp: 34 (WebCore::DisplayList::DrawFilteredImageBuffer::apply): 35 * platform/graphics/displaylists/DisplayListItems.h: 36 * platform/graphics/displaylists/DisplayListRecorder.cpp: 37 (WebCore::DisplayList::Recorder::drawFilteredImageBuffer): 38 * platform/graphics/displaylists/DisplayListRecorder.h: 39 * platform/graphics/filters/Filter.cpp: 40 (WebCore::Filter::apply): 41 * platform/graphics/filters/Filter.h: 42 * platform/graphics/filters/FilterEffect.cpp: 43 (WebCore::FilterEffect::apply): 44 (WebCore::FilterEffect::clearResult): Deleted. 45 (WebCore::FilterEffect::clearResultsRecursive): Deleted. 46 * platform/graphics/filters/FilterEffect.h: 47 (WebCore::FilterEffect::hasResult const): Deleted. 48 (WebCore::FilterEffect::filterImage const): Deleted. 49 * platform/graphics/filters/FilterFunction.h: 50 (WebCore::FilterFunction::apply): 51 (WebCore::FilterFunction::outsets const): 52 (WebCore::FilterFunction::clearResult): Deleted. 53 * platform/graphics/filters/FilterResults.h: Added. 54 (WebCore::FilterResults::effectResult const): 55 (WebCore::FilterResults::setEffectResult): 56 (WebCore::FilterResults::clearEffectResult): 57 * platform/network/SynchronousLoaderClient.cpp: 58 * rendering/CSSFilter.cpp: 59 (WebCore::CSSFilter::apply): 60 (WebCore::CSSFilter::clearIntermediateResults): Deleted. 61 * rendering/CSSFilter.h: 62 * rendering/RenderLayerFilters.cpp: 63 (WebCore::RenderLayerFilters::applyFilterEffect): 64 * rendering/svg/RenderSVGResourceFilter.cpp: 65 (WebCore::RenderSVGResourceFilter::postApplyResource): 66 (WebCore::RenderSVGResourceFilter::primitiveAttributeChanged): 67 * rendering/svg/RenderSVGResourceFilter.h: 68 * svg/graphics/filters/SVGFilter.cpp: 69 (WebCore::SVGFilter::apply): 70 (WebCore::SVGFilter::clearResult): Deleted. 71 * svg/graphics/filters/SVGFilter.h: 72 * svg/graphics/filters/SVGFilterBuilder.cpp: 73 (WebCore::SVGFilterBuilder::setupBuiltinEffects): 74 (WebCore::SVGFilterBuilder::buildFilterEffects): 75 (WebCore::SVGFilterBuilder::appendEffectToEffectRenderer): 76 (WebCore::SVGFilterBuilder::appendEffectToEffectReferences): Deleted. 77 (WebCore::SVGFilterBuilder::clearEffects): Deleted. 78 (WebCore::SVGFilterBuilder::clearResultsRecursive): Deleted. 79 * svg/graphics/filters/SVGFilterBuilder.h: 80 (WebCore::SVGFilterBuilder::lastEffect const): Deleted. 81 (WebCore::SVGFilterBuilder::effectReferences): Deleted. 82 (WebCore::SVGFilterBuilder::addBuiltinEffects): Deleted. 83 1 84 2022-01-07 Patrick Angle <pangle@apple.com> 2 85 -
trunk/Source/WebCore/Headers.cmake
r287693 r287782 1614 1614 platform/graphics/filters/FilterOperation.h 1615 1615 platform/graphics/filters/FilterOperations.h 1616 platform/graphics/filters/FilterResults.h 1616 1617 platform/graphics/filters/LightSource.h 1617 1618 platform/graphics/filters/PointLightSource.h -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r287743 r287782 2336 2336 72B8B0362753441400F752AA /* FilterImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 72435EF4273D07670005E7EE /* FilterImage.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2337 2337 72BAC3AE23E1F0B0008D741C /* ImageBufferBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 72BAC3A523E17328008D741C /* ImageBufferBackend.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2338 72D73644278461A000398663 /* FilterResults.h in Headers */ = {isa = PBXBuildFile; fileRef = 7211B5D6276536820076FEF8 /* FilterResults.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2338 2339 72F667E1260C26AC00EE36AD /* DiagnosticLoggingDomain.h in Headers */ = {isa = PBXBuildFile; fileRef = 72F667DF260C264400EE36AD /* DiagnosticLoggingDomain.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2339 2340 7553CFE8108F473F00EA281E /* TimelineRecordFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 7553CFE6108F473F00EA281E /* TimelineRecordFactory.h */; }; … … 11219 11220 71F936F71DD4F99B00922CC7 /* tracks-support.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "tracks-support.js"; sourceTree = "<group>"; }; 11220 11221 71FF851822A3F81F005D5959 /* NavigatorMaxTouchPoints.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NavigatorMaxTouchPoints.idl; sourceTree = "<group>"; }; 11222 7211B5D6276536820076FEF8 /* FilterResults.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilterResults.h; sourceTree = "<group>"; }; 11221 11223 721443452240C8BA00F12FF7 /* SVGAnimatedValueProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedValueProperty.h; sourceTree = "<group>"; }; 11222 11224 721443462240CAD200F12FF7 /* SVGValueProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGValueProperty.h; sourceTree = "<group>"; }; … … 26792 26794 49ECEB651499790D00CDD3A4 /* FilterOperations.cpp */, 26793 26795 49ECEB661499790D00CDD3A4 /* FilterOperations.h */, 26796 7211B5D6276536820076FEF8 /* FilterResults.h */, 26794 26797 84730D741248F0B300D3A9C9 /* LightSource.h */, 26795 26798 A1E1154513015C4E0054AC8C /* PointLightSource.cpp */, … … 34387 34390 49ECEB6E1499790D00CDD3A4 /* FilterOperation.h in Headers */, 34388 34391 49ECEB701499790D00CDD3A4 /* FilterOperations.h in Headers */, 34392 72D73644278461A000398663 /* FilterResults.h in Headers */, 34389 34393 372C00D9129619F8005C9575 /* FindOptions.h in Headers */, 34390 34394 A8CFF04F0A154F09000A4234 /* FixedTableLayout.h in Headers */, -
trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h
r286538 r287782 1 1 /* 2 * Copyright (C) 2020-202 1Apple Inc. All rights reserved.2 * Copyright (C) 2020-2022 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 28 28 #include "Filter.h" 29 29 #include "FilterImage.h" 30 #include "FilterResults.h" 30 31 #include "ImageBuffer.h" 31 32 #include "PixelBuffer.h" … … 147 148 148 149 const_cast<ConcreteImageBuffer&>(*this).flushDrawingContext(); 149 auto result = filter.apply(this, { { }, logicalSize() }); 150 151 FilterResults results; 152 auto result = filter.apply(this, { { }, logicalSize() }, results); 150 153 if (!result) 151 154 return nullptr; -
trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp
r286816 r287782 632 632 } 633 633 634 void GraphicsContext::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter )635 { 636 auto result = filter.apply(sourceImage, sourceImageRect );634 void GraphicsContext::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter, FilterResults& results) 635 { 636 auto result = filter.apply(sourceImage, sourceImageRect, results); 637 637 if (!result) 638 638 return; -
trunk/Source/WebCore/platform/graphics/GraphicsContext.h
r286538 r287782 87 87 class AffineTransform; 88 88 class Filter; 89 class FilterResults; 89 90 class FloatRoundedRect; 90 91 class Gradient; … … 453 454 WEBCORE_EXPORT virtual void drawConsumingImageBuffer(RefPtr<ImageBuffer>, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& = { }); 454 455 455 WEBCORE_EXPORT virtual void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& );456 WEBCORE_EXPORT virtual void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter&, FilterResults&); 456 457 457 458 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; -
trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp
r286538 r287782 313 313 } 314 314 315 void DrawFilteredImageBuffer::apply(GraphicsContext& context, WebCore::ImageBuffer* sourceImage)316 { 317 context.drawFilteredImageBuffer(sourceImage, m_sourceImageRect, m_filter );315 void DrawFilteredImageBuffer::apply(GraphicsContext& context, ImageBuffer* sourceImage, FilterResults& results) 316 { 317 context.drawFilteredImageBuffer(sourceImage, m_sourceImageRect, m_filter, results); 318 318 } 319 319 -
trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h
r286538 r287782 738 738 bool isValid() const { return m_imageBufferIdentifier.isValid(); } 739 739 740 WEBCORE_EXPORT void apply(GraphicsContext&, WebCore::ImageBuffer&) const;740 WEBCORE_EXPORT void apply(GraphicsContext&, ImageBuffer&) const; 741 741 742 742 NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const; … … 925 925 926 926 NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const; 927 WEBCORE_EXPORT void apply(GraphicsContext&, WebCore::ImageBuffer* sourceImage);927 WEBCORE_EXPORT void apply(GraphicsContext&, ImageBuffer* sourceImage, FilterResults&); 928 928 929 929 std::optional<FloatRect> globalBounds() const { return std::nullopt; } … … 1040 1040 bool isValid() const { return m_imageBufferIdentifier.isValid(); } 1041 1041 1042 WEBCORE_EXPORT void apply(GraphicsContext&, WebCore::ImageBuffer&) const;1042 WEBCORE_EXPORT void apply(GraphicsContext&, ImageBuffer&) const; 1043 1043 1044 1044 NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const; -
trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp
r286914 r287782 147 147 } 148 148 149 void Recorder::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter )149 void Recorder::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter, FilterResults& results) 150 150 { 151 151 appendStateChangeItemIfNecessary(); 152 152 153 153 if (sourceImage && !canDrawImageBuffer(*sourceImage)) { 154 GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter );154 GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter, results); 155 155 return; 156 156 } … … 178 178 179 179 if (!isRecorded) { 180 GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter );180 GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter, results); 181 181 return; 182 182 } -
trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h
r286538 r287782 226 226 #endif 227 227 228 WEBCORE_EXPORT void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& ) final;228 WEBCORE_EXPORT void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter&, FilterResults&) final; 229 229 230 230 WEBCORE_EXPORT void drawGlyphs(const Font&, const GlyphBufferGlyph*, const GlyphBufferAdvance*, unsigned numGlyphs, const FloatPoint& anchorPoint, FontSmoothingMode) final; -
trunk/Source/WebCore/platform/graphics/filters/Filter.cpp
r286765 r287782 1 1 /* 2 * Copyright (C) 2021 Apple Inc. All rights reserved.2 * Copyright (C) 2021-2022 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 82 82 } 83 83 84 RefPtr<FilterImage> Filter::apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect )84 RefPtr<FilterImage> Filter::apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, FilterResults& results) 85 85 { 86 86 RefPtr<FilterImage> input; … … 93 93 } 94 94 95 auto result = apply(input.get() );95 auto result = apply(input.get(), results); 96 96 if (!result) 97 97 return nullptr; -
trunk/Source/WebCore/platform/graphics/filters/Filter.h
r286824 r287782 2 2 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 3 3 * Copyright (C) 2013 Google Inc. All rights reserved. 4 * Copyright (C) 2021 Apple Inc. All rights reserved.4 * Copyright (C) 2021-2022 Apple Inc. All rights reserved. 5 5 * 6 6 * This library is free software; you can redistribute it and/or … … 33 33 class FilterEffect; 34 34 class FilterImage; 35 class FilterResults; 35 36 36 37 class Filter : public FilterFunction { … … 66 67 bool clampFilterRegionIfNeeded(); 67 68 68 virtual RefPtr<FilterImage> apply(FilterImage* sourceImage ) = 0;69 WEBCORE_EXPORT RefPtr<FilterImage> apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect );69 virtual RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) = 0; 70 WEBCORE_EXPORT RefPtr<FilterImage> apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, FilterResults&); 70 71 71 72 protected: -
trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp
r286864 r287782 4 4 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 5 5 * Copyright (C) 2012 University of Szeged 6 * Copyright (C) 2015-202 1Apple Inc. All rights reserved.6 * Copyright (C) 2015-2022 Apple Inc. All rights reserved. 7 7 * 8 8 * This library is free software; you can redistribute it and/or … … 28 28 #include "FilterEffectApplier.h" 29 29 #include "FilterEffectGeometry.h" 30 #include "FilterResults.h" 30 31 #include "ImageBuffer.h" 31 32 #include "Logging.h" … … 100 101 } 101 102 102 RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, FilterImage& input )103 RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, FilterImage& input, FilterResults& results) 103 104 { 104 return apply(filter, FilterImageVector { Ref { input } } );105 return apply(filter, FilterImageVector { Ref { input } }, results); 105 106 } 106 107 107 RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, const FilterImageVector& inputs, const std::optional<FilterEffectGeometry>& geometry)108 RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, const FilterImageVector& inputs, FilterResults& results, const std::optional<FilterEffectGeometry>& geometry) 108 109 { 109 110 ASSERT(inputs.size() == numberOfImageInputs()); 110 111 111 if ( m_filterImage)112 return m_filterImage;112 if (auto result = results.effectResult(*this)) 113 return result; 113 114 114 115 auto primitiveSubregion = calculatePrimitiveSubregion(filter, inputs, geometry); … … 127 128 return nullptr; 128 129 129 m_filterImage= FilterImage::create(primitiveSubregion, imageRect, absoluteImageRect, isAlphaImage, isValidPremultiplied, filter.renderingMode(), imageColorSpace);130 if (! m_filterImage)130 auto result = FilterImage::create(primitiveSubregion, imageRect, absoluteImageRect, isAlphaImage, isValidPremultiplied, filter.renderingMode(), imageColorSpace); 131 if (!result) 131 132 return nullptr; 132 133 … … 142 143 correctPremultipliedInputs(inputs); 143 144 144 if (!applier->apply(filter, inputs, * m_filterImage))145 m_filterImage =nullptr;145 if (!applier->apply(filter, inputs, *result)) 146 return nullptr; 146 147 147 return m_filterImage; 148 results.setEffectResult(*this, inputs, { *result }); 149 return result; 148 150 } 149 151 … … 152 154 ASSERT_WITH_SECURITY_IMPLICATION(number < m_inputEffects.size()); 153 155 return m_inputEffects.at(number); 154 }155 156 void FilterEffect::clearResult()157 {158 m_filterImage = nullptr;159 }160 161 void FilterEffect::clearResultsRecursive()162 {163 // Clear all results, regardless that the current effect has164 // a result. Can be used if an effect is in an erroneous state.165 clearResult();166 for (auto& effect : m_inputEffects)167 effect->clearResultsRecursive();168 156 } 169 157 -
trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h
r286864 r287782 3 3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 4 4 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 5 * Copyright (C) 2021 Apple Inc. All rights reserved.5 * Copyright (C) 2021-2022 Apple Inc. All rights reserved. 6 6 * 7 7 * This library is free software; you can redistribute it and/or … … 44 44 45 45 public: 46 void clearResult() override;47 void clearResultsRecursive();48 bool hasResult() const { return m_filterImage; }49 50 RefPtr<FilterImage> filterImage() const { return m_filterImage; }51 46 FilterImageVector takeImageInputs(FilterImageVector& stack) const; 52 47 … … 54 49 FilterEffect& inputEffect(unsigned) const; 55 50 56 RefPtr<FilterImage> apply(const Filter&, const FilterImageVector& inputs, const std::optional<FilterEffectGeometry>& = std::nullopt);51 RefPtr<FilterImage> apply(const Filter&, const FilterImageVector& inputs, FilterResults&, const std::optional<FilterEffectGeometry>& = std::nullopt); 57 52 58 53 const DestinationColorSpace& operatingColorSpace() const { return m_operatingColorSpace; } … … 84 79 virtual std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const = 0; 85 80 86 RefPtr<FilterImage> apply(const Filter&, FilterImage& input ) override;81 RefPtr<FilterImage> apply(const Filter&, FilterImage& input, FilterResults&) override; 87 82 88 83 FilterEffectVector m_inputEffects; 89 90 RefPtr<FilterImage> m_filterImage;91 84 92 85 DestinationColorSpace m_operatingColorSpace { DestinationColorSpace::SRGB() }; -
trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h
r286765 r287782 1 1 /* 2 * Copyright (C) 2021 Apple Inc. All rights reserved.2 * Copyright (C) 2021-2022 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 41 41 42 42 class Filter; 43 class FilterResults; 43 44 44 45 enum class FilterRepresentation : uint8_t { … … 97 98 #endif 98 99 99 virtual RefPtr<FilterImage> apply(const Filter&, FilterImage& ) { return nullptr; }100 virtual RefPtr<FilterImage> apply(const Filter&, FilterImage&, FilterResults&) { return nullptr; } 100 101 virtual IntOutsets outsets() const { return { }; } 101 virtual void clearResult() { }102 102 103 103 virtual WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation = FilterRepresentation::TestOutput) const = 0; -
trunk/Source/WebCore/rendering/CSSFilter.cpp
r286864 r287782 1 1 /* 2 * Copyright (C) 2011-202 1Apple Inc. All rights reserved.2 * Copyright (C) 2011-2022 Apple Inc. All rights reserved. 3 3 * Copyright (C) 2013 Google Inc. All rights reserved. 4 4 * … … 382 382 #endif 383 383 384 void CSSFilter::clearIntermediateResults() 385 { 386 for (auto& function : m_functions) 387 function->clearResult(); 388 } 389 390 RefPtr<FilterImage> CSSFilter::apply(FilterImage* sourceImage) 384 RefPtr<FilterImage> CSSFilter::apply(FilterImage* sourceImage, FilterResults& results) 391 385 { 392 386 if (!sourceImage) … … 396 390 397 391 for (auto& function : m_functions) { 398 result = function->apply(*this, *result );392 result = function->apply(*this, *result, results); 399 393 if (!result) 400 394 return nullptr; -
trunk/Source/WebCore/rendering/CSSFilter.h
r286824 r287782 1 1 /* 2 * Copyright (C) 2011-202 1Apple Inc. All rights reserved.2 * Copyright (C) 2011-2022 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 28 28 #include "Filter.h" 29 29 #include "IntRectExtent.h" 30 #include "LayoutRect.h"31 #include <wtf/TypeCasts.h>32 30 33 31 namespace WebCore { … … 58 56 IntOutsets outsets() const final; 59 57 60 void clearIntermediateResults(); 61 RefPtr<FilterImage> apply(FilterImage* sourceImage) final; 58 RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) final; 62 59 63 60 private: -
trunk/Source/WebCore/rendering/RenderLayerFilters.cpp
r286867 r287782 223 223 inputContext()->restore(); 224 224 225 auto& filter = *m_filter; 226 227 destinationContext.drawFilteredImageBuffer(m_sourceImage.get(), m_filterRegion, filter); 228 filter.clearIntermediateResults(); 225 FilterResults results; 226 destinationContext.drawFilteredImageBuffer(m_sourceImage.get(), m_filterRegion, *m_filter, results); 229 227 230 228 LOG_WITH_STREAM(Filters, stream << "RenderLayerFilters " << this << " applyFilterEffect done\n"); -
trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp
r287677 r287782 216 216 if (!filterData.boundaries.isEmpty()) { 217 217 filterData.state = FilterData::Built; 218 context->drawFilteredImageBuffer(filterData.sourceGraphicBuffer.get(), filterData.drawingRegion, *filterData.filter );218 context->drawFilteredImageBuffer(filterData.sourceGraphicBuffer.get(), filterData.drawingRegion, *filterData.filter, filterData.results); 219 219 } 220 220 … … 246 246 if (!primitve->setFilterEffectAttribute(effect, attribute)) 247 247 return; 248 builder->clearResultsRecursive(*effect);248 filterData->results.clearEffectResult(*effect); 249 249 250 250 // Repaint the image on the screen. -
trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h
r287677 r287782 24 24 #pragma once 25 25 26 #include "FilterResults.h" 26 27 #include "ImageBuffer.h" 27 28 #include "RenderSVGResourceContainer.h" … … 52 53 FloatSize scale; 53 54 FilterDataState state { PaintingSource }; 55 FilterResults results; 54 56 }; 55 57 -
trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp
r286864 r287782 3 3 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 4 4 * Copyright (C) 2013 Google Inc. All rights reserved. 5 * Copyright (C) 2021 Apple Inc. All rights reserved.5 * Copyright (C) 2021-2022 Apple Inc. All rights reserved. 6 6 * 7 7 * This library is free software; you can redistribute it and/or … … 24 24 #include "SVGFilter.h" 25 25 26 #include "FilterResults.h" 26 27 #include "SVGFilterBuilder.h" 27 28 #include "SVGFilterElement.h" … … 131 132 } 132 133 133 RefPtr<FilterImage> SVGFilter::apply(const Filter&, FilterImage& sourceImage )134 RefPtr<FilterImage> SVGFilter::apply(const Filter&, FilterImage& sourceImage, FilterResults& results) 134 135 { 135 return apply(&sourceImage );136 return apply(&sourceImage, results); 136 137 } 137 138 138 RefPtr<FilterImage> SVGFilter::apply(FilterImage* sourceImage )139 RefPtr<FilterImage> SVGFilter::apply(FilterImage* sourceImage, FilterResults& results) 139 140 { 140 141 ASSERT(!m_expression.isEmpty()); … … 147 148 148 149 if (effect->filterType() == FilterEffect::Type::SourceGraphic) { 149 if (auto result = effect->filterImage()) {150 stack.append( result.releaseNonNull());150 if (auto result = results.effectResult(effect)) { 151 stack.append({ *result }); 151 152 continue; 152 153 } … … 162 163 auto inputs = effect->takeImageInputs(stack); 163 164 164 if (auto result = effect->filterImage()) { 165 stack.append(result.releaseNonNull()); 166 continue; 167 } 168 169 auto result = term.effect->apply(*this, inputs, geometry); 165 auto result = term.effect->apply(*this, inputs, results, geometry); 170 166 if (!result) 171 167 return nullptr; … … 182 178 ASSERT(lastEffect()); 183 179 return lastEffect()->outsets(); 184 }185 186 void SVGFilter::clearResult()187 {188 ASSERT(!m_expression.isEmpty());189 for (auto& term : m_expression)190 term.effect->clearResult();191 180 } 192 181 -
trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h
r286824 r287782 2 2 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 3 3 * Copyright (C) 2013 Google Inc. All rights reserved. 4 * Copyright (C) 2021 Apple Inc. All rights reserved.4 * Copyright (C) 2021-2022 Apple Inc. All rights reserved. 5 5 * 6 6 * This library is free software; you can redistribute it and/or … … 50 50 FilterEffectVector effectsOfType(FilterFunction::Type) const final; 51 51 52 RefPtr<FilterImage> apply(FilterImage* sourceImage ) final;52 RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) final; 53 53 54 54 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const final; … … 65 65 FloatSize resolvedSize(const FloatSize&) const final; 66 66 67 RefPtr<FilterImage> apply(const Filter&, FilterImage& sourceImage ) final;67 RefPtr<FilterImage> apply(const Filter&, FilterImage& sourceImage, FilterResults&) final; 68 68 IntOutsets outsets() const final; 69 void clearResult() final;70 69 71 70 FloatRect m_targetBoundingBox; -
trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp
r287710 r287782 1 1 /* 2 2 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 3 * Copyright (C) 2021 Apple Inc. All rights reserved.3 * Copyright (C) 2021-2022 Apple Inc. All rights reserved. 4 4 * 5 5 * This library is free software; you can redistribute it and/or … … 42 42 m_builtinEffects.add(SourceGraphic::effectName(), sourceGraphic.ptr()); 43 43 m_builtinEffects.add(SourceAlpha::effectName(), SourceAlpha::create(sourceGraphic)); 44 addBuiltinEffects();45 44 } 46 45 … … 103 102 104 103 if (auto renderer = effectElement.renderer()) 105 appendEffectToEffectRe ferences(effect.copyRef(),renderer);104 appendEffectToEffectRenderer(*effect, *renderer); 106 105 107 106 add(effectElement.result(), effect); 108 107 } 109 110 if (!effect)111 clearEffects();112 108 113 109 return effect; … … 143 139 } 144 140 145 void SVGFilterBuilder::appendEffectToEffectRe ferences(RefPtr<FilterEffect>&& effect, RenderObject*object)141 void SVGFilterBuilder::appendEffectToEffectRenderer(FilterEffect& effect, RenderObject& object) 146 142 { 147 // The effect must be a newly created filter effect. 148 ASSERT(!m_effectReferences.contains(effect)); 149 ASSERT(!object || !m_effectRenderer.contains(object)); 150 m_effectReferences.add(effect, FilterEffectSet()); 151 152 unsigned numberOfInputEffects = effect->inputEffects().size(); 153 154 // It is not possible to add the same value to a set twice. 155 for (unsigned i = 0; i < numberOfInputEffects; ++i) 156 effectReferences(effect->inputEffect(i)).add(effect.get()); 157 158 // If object is null, that means the element isn't attached for some 159 // reason, which in turn mean that certain types of invalidation will not 160 // work (the LayoutObject -> FilterEffect mapping will not be defined). 161 if (object) 162 m_effectRenderer.add(object, effect.get()); 163 } 164 165 void SVGFilterBuilder::clearEffects() 166 { 167 m_lastEffect = nullptr; 168 m_namedEffects.clear(); 169 m_effectReferences.clear(); 170 m_effectRenderer.clear(); 171 addBuiltinEffects(); 172 } 173 174 void SVGFilterBuilder::clearResultsRecursive(FilterEffect& effect) 175 { 176 if (!effect.hasResult()) 177 return; 178 179 effect.clearResult(); 180 181 for (auto& reference : effectReferences(effect)) 182 clearResultsRecursive(*reference); 143 m_effectRenderer.add(&object, &effect); 183 144 } 184 145 -
trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h
r286864 r287782 2 2 * Copyright (C) 2008 Alex Mathews <possessedpenguinbob@gmail.com> 3 3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 4 * Copyright (C) 2021 Apple Inc. All rights reserved.4 * Copyright (C) 2021-2022 Apple Inc. All rights reserved. 5 5 * 6 6 * This library is free software; you can redistribute it and/or … … 32 32 namespace WebCore { 33 33 34 class FilterEffect; 34 35 class RenderObject; 35 36 class SVGFilterElement; … … 38 39 WTF_MAKE_FAST_ALLOCATED; 39 40 public: 40 typedef HashSet<FilterEffect*> FilterEffectSet;41 42 41 SVGFilterBuilder() = default; 43 42 … … 49 48 50 49 void add(const AtomString& id, RefPtr<FilterEffect>); 51 52 50 RefPtr<FilterEffect> getEffectById(const AtomString&) const; 53 FilterEffect* lastEffect() const { return m_lastEffect.get(); }54 55 void appendEffectToEffectReferences(RefPtr<FilterEffect>&&, RenderObject*);56 57 inline FilterEffectSet& effectReferences(FilterEffect& effect)58 {59 // Only allowed for effects belongs to this builder.60 ASSERT(m_effectReferences.contains(&effect));61 return m_effectReferences.find(&effect)->value;62 }63 51 64 52 // Required to change the attributes of a filter during an svgAttributeChanged. 53 void appendEffectToEffectRenderer(FilterEffect&, RenderObject&); 65 54 inline FilterEffect* effectByRenderer(RenderObject* object) { return m_effectRenderer.get(object); } 66 67 void clearEffects();68 void clearResultsRecursive(FilterEffect&);69 55 70 56 void setupBuiltinEffects(Ref<FilterEffect> sourceGraphic); … … 73 59 74 60 private: 75 inline void addBuiltinEffects()76 {77 for (auto& effect : m_builtinEffects.values())78 m_effectReferences.add(effect, FilterEffectSet());79 }80 81 61 std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const; 82 62 bool buildEffectExpression(FilterEffect&, FilterEffectVector& stack, unsigned level, SVGFilterExpression&) const; … … 84 64 HashMap<AtomString, RefPtr<FilterEffect>> m_builtinEffects; 85 65 HashMap<AtomString, RefPtr<FilterEffect>> m_namedEffects; 86 // The value is a list, which contains those filter effects,87 // which depends on the key filter effect.88 HashMap<RefPtr<FilterEffect>, FilterEffectSet> m_effectReferences;89 66 HashMap<RenderObject*, FilterEffect*> m_effectRenderer; 90 67 -
trunk/Source/WebKit/ChangeLog
r287781 r287782 1 2022-01-07 Said Abou-Hallawa <said@apple.com> 2 3 [GPU Process] Remove the result FilterImage from FilterEffect 4 https://bugs.webkit.org/show_bug.cgi?id=232840 5 rdar://85425842 6 7 Reviewed by Darin Adler. 8 9 * GPUProcess/graphics/RemoteDisplayListRecorder.cpp: 10 (WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer): 11 1 12 2022-01-07 Patrick Angle <pangle@apple.com> 2 13 -
trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp
r286864 r287782 31 31 #include "RemoteDisplayListRecorderMessages.h" 32 32 #include <WebCore/BitmapImage.h> 33 #include <WebCore/FilterResults.h> 33 34 34 35 namespace WebKit { … … 256 257 } 257 258 258 handleItem(DisplayList::DrawFilteredImageBuffer(sourceImageIdentifier, sourceImageRect, WTFMove(filter)), sourceImage.get()); 259 FilterResults results; 260 handleItem(DisplayList::DrawFilteredImageBuffer(sourceImageIdentifier, sourceImageRect, WTFMove(filter)), sourceImage.get(), results); 259 261 } 260 262
Note:
See TracChangeset
for help on using the changeset viewer.