⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 287782 in webkit


Ignore:
Timestamp:
Jan 7, 2022, 2:21:03 PM (5 years ago)
Author:
Said Abou-Hallawa
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):

Location:
trunk/Source
Files:
1 added
26 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r287781 r287782  
     12022-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
    1842022-01-07  Patrick Angle  <pangle@apple.com>
    285
  • trunk/Source/WebCore/Headers.cmake

    r287693 r287782  
    16141614    platform/graphics/filters/FilterOperation.h
    16151615    platform/graphics/filters/FilterOperations.h
     1616    platform/graphics/filters/FilterResults.h
    16161617    platform/graphics/filters/LightSource.h
    16171618    platform/graphics/filters/PointLightSource.h
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r287743 r287782  
    23362336                72B8B0362753441400F752AA /* FilterImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 72435EF4273D07670005E7EE /* FilterImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
    23372337                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, ); }; };
    23382339                72F667E1260C26AC00EE36AD /* DiagnosticLoggingDomain.h in Headers */ = {isa = PBXBuildFile; fileRef = 72F667DF260C264400EE36AD /* DiagnosticLoggingDomain.h */; settings = {ATTRIBUTES = (Private, ); }; };
    23392340                7553CFE8108F473F00EA281E /* TimelineRecordFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 7553CFE6108F473F00EA281E /* TimelineRecordFactory.h */; };
     
    1121911220                71F936F71DD4F99B00922CC7 /* tracks-support.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "tracks-support.js"; sourceTree = "<group>"; };
    1122011221                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>"; };
    1122111223                721443452240C8BA00F12FF7 /* SVGAnimatedValueProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedValueProperty.h; sourceTree = "<group>"; };
    1122211224                721443462240CAD200F12FF7 /* SVGValueProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGValueProperty.h; sourceTree = "<group>"; };
     
    2679226794                                49ECEB651499790D00CDD3A4 /* FilterOperations.cpp */,
    2679326795                                49ECEB661499790D00CDD3A4 /* FilterOperations.h */,
     26796                                7211B5D6276536820076FEF8 /* FilterResults.h */,
    2679426797                                84730D741248F0B300D3A9C9 /* LightSource.h */,
    2679526798                                A1E1154513015C4E0054AC8C /* PointLightSource.cpp */,
     
    3438734390                                49ECEB6E1499790D00CDD3A4 /* FilterOperation.h in Headers */,
    3438834391                                49ECEB701499790D00CDD3A4 /* FilterOperations.h in Headers */,
     34392                                72D73644278461A000398663 /* FilterResults.h in Headers */,
    3438934393                                372C00D9129619F8005C9575 /* FindOptions.h in Headers */,
    3439034394                                A8CFF04F0A154F09000A4234 /* FixedTableLayout.h in Headers */,
  • trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h

    r286538 r287782  
    11/*
    2  * Copyright (C) 2020-2021 Apple Inc.  All rights reserved.
     2 * Copyright (C) 2020-2022 Apple Inc.  All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2828#include "Filter.h"
    2929#include "FilterImage.h"
     30#include "FilterResults.h"
    3031#include "ImageBuffer.h"
    3132#include "PixelBuffer.h"
     
    147148
    148149        const_cast<ConcreteImageBuffer&>(*this).flushDrawingContext();
    149         auto result = filter.apply(this, { { }, logicalSize() });
     150       
     151        FilterResults results;
     152        auto result = filter.apply(this, { { }, logicalSize() }, results);
    150153        if (!result)
    151154            return nullptr;
  • trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp

    r286816 r287782  
    632632}
    633633
    634 void GraphicsContext::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter)
    635 {
    636     auto result = filter.apply(sourceImage, sourceImageRect);
     634void GraphicsContext::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter, FilterResults& results)
     635{
     636    auto result = filter.apply(sourceImage, sourceImageRect, results);
    637637    if (!result)
    638638        return;
  • trunk/Source/WebCore/platform/graphics/GraphicsContext.h

    r286538 r287782  
    8787class AffineTransform;
    8888class Filter;
     89class FilterResults;
    8990class FloatRoundedRect;
    9091class Gradient;
     
    453454    WEBCORE_EXPORT virtual void drawConsumingImageBuffer(RefPtr<ImageBuffer>, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& = { });
    454455
    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&);
    456457
    457458    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  
    313313}
    314314
    315 void DrawFilteredImageBuffer::apply(GraphicsContext& context, WebCore::ImageBuffer* sourceImage)
    316 {
    317     context.drawFilteredImageBuffer(sourceImage, m_sourceImageRect, m_filter);
     315void DrawFilteredImageBuffer::apply(GraphicsContext& context, ImageBuffer* sourceImage, FilterResults& results)
     316{
     317    context.drawFilteredImageBuffer(sourceImage, m_sourceImageRect, m_filter, results);
    318318}
    319319
  • trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h

    r286538 r287782  
    738738    bool isValid() const { return m_imageBufferIdentifier.isValid(); }
    739739
    740     WEBCORE_EXPORT void apply(GraphicsContext&, WebCore::ImageBuffer&) const;
     740    WEBCORE_EXPORT void apply(GraphicsContext&, ImageBuffer&) const;
    741741
    742742    NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const;
     
    925925
    926926    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&);
    928928
    929929    std::optional<FloatRect> globalBounds() const { return std::nullopt; }
     
    10401040    bool isValid() const { return m_imageBufferIdentifier.isValid(); }
    10411041
    1042     WEBCORE_EXPORT void apply(GraphicsContext&, WebCore::ImageBuffer&) const;
     1042    WEBCORE_EXPORT void apply(GraphicsContext&, ImageBuffer&) const;
    10431043
    10441044    NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const;
  • trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp

    r286914 r287782  
    147147}
    148148
    149 void Recorder::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter)
     149void Recorder::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter, FilterResults& results)
    150150{
    151151    appendStateChangeItemIfNecessary();
    152152
    153153    if (sourceImage && !canDrawImageBuffer(*sourceImage)) {
    154         GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
     154        GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter, results);
    155155        return;
    156156    }
     
    178178
    179179        if (!isRecorded) {
    180             GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
     180            GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter, results);
    181181            return;
    182182        }
  • trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h

    r286538 r287782  
    226226#endif
    227227
    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;
    229229
    230230    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  
    11/*
    2  * Copyright (C) 2021 Apple Inc.  All rights reserved.
     2 * Copyright (C) 2021-2022 Apple Inc.  All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    8282}
    8383
    84 RefPtr<FilterImage> Filter::apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect)
     84RefPtr<FilterImage> Filter::apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, FilterResults& results)
    8585{
    8686    RefPtr<FilterImage> input;
     
    9393    }
    9494
    95     auto result = apply(input.get());
     95    auto result = apply(input.get(), results);
    9696    if (!result)
    9797        return nullptr;
  • trunk/Source/WebCore/platform/graphics/filters/Filter.h

    r286824 r287782  
    22 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
    33 * 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.
    55 *
    66 * This library is free software; you can redistribute it and/or
     
    3333class FilterEffect;
    3434class FilterImage;
     35class FilterResults;
    3536
    3637class Filter : public FilterFunction {
     
    6667    bool clampFilterRegionIfNeeded();
    6768
    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&);
    7071
    7172protected:
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp

    r286864 r287782  
    44 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
    55 * Copyright (C) 2012 University of Szeged
    6  * Copyright (C) 2015-2021 Apple Inc. All rights reserved.
     6 * Copyright (C) 2015-2022 Apple Inc. All rights reserved.
    77 *
    88 * This library is free software; you can redistribute it and/or
     
    2828#include "FilterEffectApplier.h"
    2929#include "FilterEffectGeometry.h"
     30#include "FilterResults.h"
    3031#include "ImageBuffer.h"
    3132#include "Logging.h"
     
    100101}
    101102
    102 RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, FilterImage& input)
     103RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, FilterImage& input, FilterResults& results)
    103104{
    104     return apply(filter, FilterImageVector { Ref { input } });
     105    return apply(filter, FilterImageVector { Ref { input } }, results);
    105106}
    106107
    107 RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, const FilterImageVector& inputs, const std::optional<FilterEffectGeometry>& geometry)
     108RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, const FilterImageVector& inputs, FilterResults& results, const std::optional<FilterEffectGeometry>& geometry)
    108109{
    109110    ASSERT(inputs.size() == numberOfImageInputs());
    110111
    111     if (m_filterImage)
    112         return m_filterImage;
     112    if (auto result = results.effectResult(*this))
     113        return result;
    113114
    114115    auto primitiveSubregion = calculatePrimitiveSubregion(filter, inputs, geometry);
     
    127128        return nullptr;
    128129
    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)
    131132        return nullptr;
    132133
     
    142143        correctPremultipliedInputs(inputs);
    143144
    144     if (!applier->apply(filter, inputs, *m_filterImage))
    145         m_filterImage = nullptr;
     145    if (!applier->apply(filter, inputs, *result))
     146        return nullptr;
    146147
    147     return m_filterImage;
     148    results.setEffectResult(*this, inputs, { *result });
     149    return result;
    148150}
    149151
     
    152154    ASSERT_WITH_SECURITY_IMPLICATION(number < m_inputEffects.size());
    153155    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 has
    164     // a result. Can be used if an effect is in an erroneous state.
    165     clearResult();
    166     for (auto& effect : m_inputEffects)
    167         effect->clearResultsRecursive();
    168156}
    169157
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h

    r286864 r287782  
    33 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
    44 * 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.
    66 *
    77 * This library is free software; you can redistribute it and/or
     
    4444
    4545public:
    46     void clearResult() override;
    47     void clearResultsRecursive();
    48     bool hasResult() const { return m_filterImage; }
    49 
    50     RefPtr<FilterImage> filterImage() const { return m_filterImage; }
    5146    FilterImageVector takeImageInputs(FilterImageVector& stack) const;
    5247
     
    5449    FilterEffect& inputEffect(unsigned) const;
    5550
    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);
    5752
    5853    const DestinationColorSpace& operatingColorSpace() const { return m_operatingColorSpace; }
     
    8479    virtual std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const = 0;
    8580
    86     RefPtr<FilterImage> apply(const Filter&, FilterImage& input) override;
     81    RefPtr<FilterImage> apply(const Filter&, FilterImage& input, FilterResults&) override;
    8782
    8883    FilterEffectVector m_inputEffects;
    89 
    90     RefPtr<FilterImage> m_filterImage;
    9184
    9285    DestinationColorSpace m_operatingColorSpace { DestinationColorSpace::SRGB() };
  • trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h

    r286765 r287782  
    11/*
    2  * Copyright (C) 2021 Apple Inc.  All rights reserved.
     2 * Copyright (C) 2021-2022 Apple Inc.  All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    4141
    4242class Filter;
     43class FilterResults;
    4344
    4445enum class FilterRepresentation : uint8_t {
     
    9798#endif
    9899
    99     virtual RefPtr<FilterImage> apply(const Filter&, FilterImage&) { return nullptr; }
     100    virtual RefPtr<FilterImage> apply(const Filter&, FilterImage&, FilterResults&) { return nullptr; }
    100101    virtual IntOutsets outsets() const { return { }; }
    101     virtual void clearResult() { }
    102102
    103103    virtual WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation = FilterRepresentation::TestOutput) const = 0;
  • trunk/Source/WebCore/rendering/CSSFilter.cpp

    r286864 r287782  
    11/*
    2  * Copyright (C) 2011-2021 Apple Inc. All rights reserved.
     2 * Copyright (C) 2011-2022 Apple Inc. All rights reserved.
    33 * Copyright (C) 2013 Google Inc. All rights reserved.
    44 *
     
    382382#endif
    383383
    384 void CSSFilter::clearIntermediateResults()
    385 {
    386     for (auto& function : m_functions)
    387         function->clearResult();
    388 }
    389 
    390 RefPtr<FilterImage> CSSFilter::apply(FilterImage* sourceImage)
     384RefPtr<FilterImage> CSSFilter::apply(FilterImage* sourceImage, FilterResults& results)
    391385{
    392386    if (!sourceImage)
     
    396390
    397391    for (auto& function : m_functions) {
    398         result = function->apply(*this, *result);
     392        result = function->apply(*this, *result, results);
    399393        if (!result)
    400394            return nullptr;
  • trunk/Source/WebCore/rendering/CSSFilter.h

    r286824 r287782  
    11/*
    2  * Copyright (C) 2011-2021 Apple Inc. All rights reserved.
     2 * Copyright (C) 2011-2022 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2828#include "Filter.h"
    2929#include "IntRectExtent.h"
    30 #include "LayoutRect.h"
    31 #include <wtf/TypeCasts.h>
    3230
    3331namespace WebCore {
     
    5856    IntOutsets outsets() const final;
    5957
    60     void clearIntermediateResults();
    61     RefPtr<FilterImage> apply(FilterImage* sourceImage) final;
     58    RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) final;
    6259
    6360private:
  • trunk/Source/WebCore/rendering/RenderLayerFilters.cpp

    r286867 r287782  
    223223    inputContext()->restore();
    224224
    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);
    229227
    230228    LOG_WITH_STREAM(Filters, stream << "RenderLayerFilters " << this << " applyFilterEffect done\n");
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp

    r287677 r287782  
    216216    if (!filterData.boundaries.isEmpty()) {
    217217        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);
    219219    }
    220220
     
    246246        if (!primitve->setFilterEffectAttribute(effect, attribute))
    247247            return;
    248         builder->clearResultsRecursive(*effect);
     248        filterData->results.clearEffectResult(*effect);
    249249
    250250        // Repaint the image on the screen.
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h

    r287677 r287782  
    2424#pragma once
    2525
     26#include "FilterResults.h"
    2627#include "ImageBuffer.h"
    2728#include "RenderSVGResourceContainer.h"
     
    5253    FloatSize scale;
    5354    FilterDataState state { PaintingSource };
     55    FilterResults results;
    5456};
    5557
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp

    r286864 r287782  
    33 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
    44 * 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.
    66 *
    77 * This library is free software; you can redistribute it and/or
     
    2424#include "SVGFilter.h"
    2525
     26#include "FilterResults.h"
    2627#include "SVGFilterBuilder.h"
    2728#include "SVGFilterElement.h"
     
    131132}
    132133
    133 RefPtr<FilterImage> SVGFilter::apply(const Filter&, FilterImage& sourceImage)
     134RefPtr<FilterImage> SVGFilter::apply(const Filter&, FilterImage& sourceImage, FilterResults& results)
    134135{
    135     return apply(&sourceImage);
     136    return apply(&sourceImage, results);
    136137}
    137138
    138 RefPtr<FilterImage> SVGFilter::apply(FilterImage* sourceImage)
     139RefPtr<FilterImage> SVGFilter::apply(FilterImage* sourceImage, FilterResults& results)
    139140{
    140141    ASSERT(!m_expression.isEmpty());
     
    147148
    148149        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 });
    151152                continue;
    152153            }
     
    162163        auto inputs = effect->takeImageInputs(stack);
    163164
    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);
    170166        if (!result)
    171167            return nullptr;
     
    182178    ASSERT(lastEffect());
    183179    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();
    191180}
    192181
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h

    r286824 r287782  
    22 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
    33 * 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.
    55 *
    66 * This library is free software; you can redistribute it and/or
     
    5050    FilterEffectVector effectsOfType(FilterFunction::Type) const final;
    5151
    52     RefPtr<FilterImage> apply(FilterImage* sourceImage) final;
     52    RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) final;
    5353
    5454    WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const final;
     
    6565    FloatSize resolvedSize(const FloatSize&) const final;
    6666
    67     RefPtr<FilterImage> apply(const Filter&, FilterImage& sourceImage) final;
     67    RefPtr<FilterImage> apply(const Filter&, FilterImage& sourceImage, FilterResults&) final;
    6868    IntOutsets outsets() const final;
    69     void clearResult() final;
    7069
    7170    FloatRect m_targetBoundingBox;
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp

    r287710 r287782  
    11/*
    22 * 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.
    44 *
    55 * This library is free software; you can redistribute it and/or
     
    4242    m_builtinEffects.add(SourceGraphic::effectName(), sourceGraphic.ptr());
    4343    m_builtinEffects.add(SourceAlpha::effectName(), SourceAlpha::create(sourceGraphic));
    44     addBuiltinEffects();
    4544}
    4645
     
    103102
    104103        if (auto renderer = effectElement.renderer())
    105             appendEffectToEffectReferences(effect.copyRef(), renderer);
     104            appendEffectToEffectRenderer(*effect, *renderer);
    106105
    107106        add(effectElement.result(), effect);
    108107    }
    109 
    110     if (!effect)
    111         clearEffects();
    112108
    113109    return effect;
     
    143139}
    144140
    145 void SVGFilterBuilder::appendEffectToEffectReferences(RefPtr<FilterEffect>&& effect, RenderObject* object)
     141void SVGFilterBuilder::appendEffectToEffectRenderer(FilterEffect& effect, RenderObject& object)
    146142{
    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);
    183144}
    184145
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h

    r286864 r287782  
    22 * Copyright (C) 2008 Alex Mathews <possessedpenguinbob@gmail.com>
    33 * 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.
    55 *
    66 * This library is free software; you can redistribute it and/or
     
    3232namespace WebCore {
    3333
     34class FilterEffect;
    3435class RenderObject;
    3536class SVGFilterElement;
     
    3839    WTF_MAKE_FAST_ALLOCATED;
    3940public:
    40     typedef HashSet<FilterEffect*> FilterEffectSet;
    41 
    4241    SVGFilterBuilder() = default;
    4342
     
    4948
    5049    void add(const AtomString& id, RefPtr<FilterEffect>);
    51 
    5250    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     }
    6351
    6452    // Required to change the attributes of a filter during an svgAttributeChanged.
     53    void appendEffectToEffectRenderer(FilterEffect&, RenderObject&);
    6554    inline FilterEffect* effectByRenderer(RenderObject* object) { return m_effectRenderer.get(object); }
    66 
    67     void clearEffects();
    68     void clearResultsRecursive(FilterEffect&);
    6955
    7056    void setupBuiltinEffects(Ref<FilterEffect> sourceGraphic);
     
    7359
    7460private:
    75     inline void addBuiltinEffects()
    76     {
    77         for (auto& effect : m_builtinEffects.values())
    78             m_effectReferences.add(effect, FilterEffectSet());
    79     }
    80 
    8161    std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const;
    8262    bool buildEffectExpression(FilterEffect&, FilterEffectVector& stack, unsigned level, SVGFilterExpression&) const;
     
    8464    HashMap<AtomString, RefPtr<FilterEffect>> m_builtinEffects;
    8565    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;
    8966    HashMap<RenderObject*, FilterEffect*> m_effectRenderer;
    9067
  • trunk/Source/WebKit/ChangeLog

    r287781 r287782  
     12022-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
    1122022-01-07  Patrick Angle  <pangle@apple.com>
    213
  • trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp

    r286864 r287782  
    3131#include "RemoteDisplayListRecorderMessages.h"
    3232#include <WebCore/BitmapImage.h>
     33#include <WebCore/FilterResults.h>
    3334
    3435namespace WebKit {
     
    256257    }
    257258
    258     handleItem(DisplayList::DrawFilteredImageBuffer(sourceImageIdentifier, sourceImageRect, WTFMove(filter)), sourceImage.get());
     259    FilterResults results;
     260    handleItem(DisplayList::DrawFilteredImageBuffer(sourceImageIdentifier, sourceImageRect, WTFMove(filter)), sourceImage.get(), results);
    259261}
    260262
Note: See TracChangeset for help on using the changeset viewer.