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

Changeset 286864 in webkit


Ignore:
Timestamp:
Dec 10, 2021, 11:26:37 AM (5 years ago)
Author:
Said Abou-Hallawa
Message:

[GPU Process] [Filters] Make FilterEffectVector a Vector of Ref<FilterEffect>
https://bugs.webkit.org/show_bug.cgi?id=234108

Reviewed by Cameron McCormack.

Source/WebCore:

There is no case that would require inserting a nullptr in FilterEffectVector.

  • platform/graphics/displaylists/DisplayListRecorder.cpp:

(WebCore::DisplayList::Recorder::drawFilteredImageBuffer):

  • platform/graphics/filters/FilterEffect.cpp:

(WebCore::FilterEffect::inputEffect const):

  • platform/graphics/filters/FilterEffect.h:
  • platform/graphics/filters/FilterEffectVector.h:
  • platform/graphics/filters/SourceAlpha.cpp:

(WebCore::SourceAlpha::SourceAlpha):

  • rendering/CSSFilter.cpp:

(WebCore::CSSFilter::buildFilterFunctions):
(WebCore::CSSFilter::effectsOfType const):

  • rendering/svg/RenderSVGResourceFilter.cpp:

(WebCore::RenderSVGResourceFilter::primitiveAttributeChanged):

  • svg/SVGFEBlendElement.cpp:

(WebCore::SVGFEBlendElement::build const):

  • svg/SVGFEColorMatrixElement.cpp:

(WebCore::SVGFEColorMatrixElement::build const):

  • svg/SVGFEComponentTransferElement.cpp:

(WebCore::SVGFEComponentTransferElement::build const):

  • svg/SVGFECompositeElement.cpp:

(WebCore::SVGFECompositeElement::build const):

  • svg/SVGFEConvolveMatrixElement.cpp:

(WebCore::SVGFEConvolveMatrixElement::build const):

  • svg/SVGFEDiffuseLightingElement.cpp:

(WebCore::SVGFEDiffuseLightingElement::build const):

  • svg/SVGFEDisplacementMapElement.cpp:

(WebCore::SVGFEDisplacementMapElement::build const):

  • svg/SVGFEDropShadowElement.cpp:

(WebCore::SVGFEDropShadowElement::build const):

  • svg/SVGFEGaussianBlurElement.cpp:

(WebCore::SVGFEGaussianBlurElement::build const):

  • svg/SVGFEMergeElement.cpp:

(WebCore::SVGFEMergeElement::build const):

  • svg/SVGFEMorphologyElement.cpp:

(WebCore::SVGFEMorphologyElement::build const):

  • svg/SVGFEOffsetElement.cpp:

(WebCore::SVGFEOffsetElement::build const):

  • svg/SVGFESpecularLightingElement.cpp:

(WebCore::SVGFESpecularLightingElement::build const):

  • svg/SVGFETileElement.cpp:

(WebCore::SVGFETileElement::build const):

  • svg/graphics/filters/SVGFilter.cpp:

(WebCore::SVGFilter::effectsOfType const):

  • svg/graphics/filters/SVGFilterBuilder.cpp:

(WebCore::SVGFilterBuilder::clearResultsRecursive):
(WebCore::SVGFilterBuilder::buildEffectExpression const):
(WebCore::SVGFilterBuilder::buildExpression const):

  • svg/graphics/filters/SVGFilterBuilder.h:

(WebCore::SVGFilterBuilder::effectReferences):

Source/WebKit:

  • GPUProcess/graphics/RemoteDisplayListRecorder.cpp:

(WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer):

Location:
trunk/Source
Files:
27 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r286861 r286864  
     12021-12-10  Said Abou-Hallawa  <said@apple.com>
     2
     3        [GPU Process] [Filters] Make FilterEffectVector a Vector of Ref<FilterEffect>
     4        https://bugs.webkit.org/show_bug.cgi?id=234108
     5
     6        Reviewed by Cameron McCormack.
     7
     8        There is no case that would require inserting a nullptr in FilterEffectVector.
     9
     10        * platform/graphics/displaylists/DisplayListRecorder.cpp:
     11        (WebCore::DisplayList::Recorder::drawFilteredImageBuffer):
     12        * platform/graphics/filters/FilterEffect.cpp:
     13        (WebCore::FilterEffect::inputEffect const):
     14        * platform/graphics/filters/FilterEffect.h:
     15        * platform/graphics/filters/FilterEffectVector.h:
     16        * platform/graphics/filters/SourceAlpha.cpp:
     17        (WebCore::SourceAlpha::SourceAlpha):
     18        * rendering/CSSFilter.cpp:
     19        (WebCore::CSSFilter::buildFilterFunctions):
     20        (WebCore::CSSFilter::effectsOfType const):
     21        * rendering/svg/RenderSVGResourceFilter.cpp:
     22        (WebCore::RenderSVGResourceFilter::primitiveAttributeChanged):
     23        * svg/SVGFEBlendElement.cpp:
     24        (WebCore::SVGFEBlendElement::build const):
     25        * svg/SVGFEColorMatrixElement.cpp:
     26        (WebCore::SVGFEColorMatrixElement::build const):
     27        * svg/SVGFEComponentTransferElement.cpp:
     28        (WebCore::SVGFEComponentTransferElement::build const):
     29        * svg/SVGFECompositeElement.cpp:
     30        (WebCore::SVGFECompositeElement::build const):
     31        * svg/SVGFEConvolveMatrixElement.cpp:
     32        (WebCore::SVGFEConvolveMatrixElement::build const):
     33        * svg/SVGFEDiffuseLightingElement.cpp:
     34        (WebCore::SVGFEDiffuseLightingElement::build const):
     35        * svg/SVGFEDisplacementMapElement.cpp:
     36        (WebCore::SVGFEDisplacementMapElement::build const):
     37        * svg/SVGFEDropShadowElement.cpp:
     38        (WebCore::SVGFEDropShadowElement::build const):
     39        * svg/SVGFEGaussianBlurElement.cpp:
     40        (WebCore::SVGFEGaussianBlurElement::build const):
     41        * svg/SVGFEMergeElement.cpp:
     42        (WebCore::SVGFEMergeElement::build const):
     43        * svg/SVGFEMorphologyElement.cpp:
     44        (WebCore::SVGFEMorphologyElement::build const):
     45        * svg/SVGFEOffsetElement.cpp:
     46        (WebCore::SVGFEOffsetElement::build const):
     47        * svg/SVGFESpecularLightingElement.cpp:
     48        (WebCore::SVGFESpecularLightingElement::build const):
     49        * svg/SVGFETileElement.cpp:
     50        (WebCore::SVGFETileElement::build const):
     51        * svg/graphics/filters/SVGFilter.cpp:
     52        (WebCore::SVGFilter::effectsOfType const):
     53        * svg/graphics/filters/SVGFilterBuilder.cpp:
     54        (WebCore::SVGFilterBuilder::clearResultsRecursive):
     55        (WebCore::SVGFilterBuilder::buildEffectExpression const):
     56        (WebCore::SVGFilterBuilder::buildExpression const):
     57        * svg/graphics/filters/SVGFilterBuilder.h:
     58        (WebCore::SVGFilterBuilder::effectReferences):
     59
    1602021-12-10  Devin Rousso  <drousso@apple.com>
    261
  • trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp

    r286824 r286864  
    156156
    157157    for (auto& effect : filter.effectsOfType(FilterEffect::Type::FEImage)) {
    158         bool isRecorded = WTF::switchOn(downcast<FEImage>(effect.get())->sourceImage(),
     158        bool isRecorded = WTF::switchOn(downcast<FEImage>(effect.get()).sourceImage(),
    159159            [&] (const Ref<Image>& image) {
    160160                if (auto nativeImage = image->nativeImage()) {
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp

    r286765 r286864  
    148148}
    149149
    150 FilterEffect* FilterEffect::inputEffect(unsigned number) const
     150FilterEffect& FilterEffect::inputEffect(unsigned number) const
    151151{
    152152    ASSERT_WITH_SECURITY_IMPLICATION(number < m_inputEffects.size());
    153     return m_inputEffects.at(number).get();
     153    return m_inputEffects.at(number);
    154154}
    155155
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h

    r286765 r286864  
    5252
    5353    FilterEffectVector& inputEffects() { return m_inputEffects; }
    54     FilterEffect* inputEffect(unsigned) const;
     54    FilterEffect& inputEffect(unsigned) const;
    5555
    5656    RefPtr<FilterImage> apply(const Filter&, const FilterImageVector& inputs, const std::optional<FilterEffectGeometry>& = std::nullopt);
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffectVector.h

    r285916 r286864  
    3232class FilterEffect;
    3333
    34 using FilterEffectVector = Vector<RefPtr<FilterEffect>>;
     34using FilterEffectVector = Vector<Ref<FilterEffect>>;
    3535
    3636} // namespace WebCore
  • trunk/Source/WebCore/platform/graphics/filters/SourceAlpha.cpp

    r286837 r286864  
    4747{
    4848    setOperatingColorSpace(sourceEffect.operatingColorSpace());
    49     inputEffects().append(&sourceEffect);
     49    inputEffects().append(sourceEffect);
    5050}
    5151
  • trunk/Source/WebCore/rendering/CSSFilter.cpp

    r286824 r286864  
    316316        if (effect) {
    317317            effect->setOperatingColorSpace(DestinationColorSpace::SRGB());
    318             effect->inputEffects() = { WTFMove(previousEffect) };
     318            effect->inputEffects() = { previousEffect.releaseNonNull() };
    319319            m_functions.append({ *effect });
    320320            previousEffect = WTFMove(effect);
     
    354354    for (auto& function : m_functions) {
    355355        if (function->filterType() == filterType) {
    356             effects.append({ downcast<FilterEffect>(function.ptr()) });
     356            effects.append({ downcast<FilterEffect>(function.get()) });
    357357            continue;
    358358        }
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp

    r286835 r286864  
    246246        if (!primitve->setFilterEffectAttribute(effect, attribute))
    247247            return;
    248         builder->clearResultsRecursive(effect);
     248        builder->clearResultsRecursive(*effect);
    249249
    250250        // Repaint the image on the screen.
  • trunk/Source/WebCore/svg/SVGFEBlendElement.cpp

    r285796 r286864  
    110110
    111111    auto effect = FEBlend::create(mode());
    112     effect->inputEffects() = { WTFMove(input1), WTFMove(input2) };
     112    effect->inputEffects() = { input1.releaseNonNull(), input2.releaseNonNull() };
    113113    return effect;
    114114}
  • trunk/Source/WebCore/svg/SVGFEColorMatrixElement.cpp

    r285796 r286864  
    143143
    144144    auto effect = FEColorMatrix::create(filterType, WTFMove(filterValues));
    145     effect->inputEffects() = { WTFMove(input1) };
     145    effect->inputEffects() = { input1.releaseNonNull() };
    146146    return effect;
    147147}
  • trunk/Source/WebCore/svg/SVGFEComponentTransferElement.cpp

    r285796 r286864  
    8888
    8989    auto effect = FEComponentTransfer::create(red, green, blue, alpha);
    90     effect->inputEffects() = { WTFMove(input1) };
     90    effect->inputEffects() = { input1.releaseNonNull() };
    9191    return effect;
    9292}
  • trunk/Source/WebCore/svg/SVGFECompositeElement.cpp

    r285796 r286864  
    141141
    142142    auto effect = FEComposite::create(svgOperator(), k1(), k2(), k3(), k4());
    143     effect->inputEffects() = { WTFMove(input1), WTFMove(input2) };
     143    effect->inputEffects() = { input1.releaseNonNull(), input2.releaseNonNull() };
    144144    return effect;
    145145}
  • trunk/Source/WebCore/svg/SVGFEConvolveMatrixElement.cpp

    r286152 r286864  
    248248
    249249    auto effect = FEConvolveMatrix::create(IntSize(orderXValue, orderYValue), divisorValue, bias(), IntPoint(targetXValue, targetYValue), edgeMode(), FloatPoint(kernelUnitLengthXValue, kernelUnitLengthYValue), preserveAlpha(), kernelMatrix);
    250     effect->inputEffects() = { WTFMove(input1) };
     250    effect->inputEffects() = { input1.releaseNonNull() };
    251251    return effect;
    252252}
  • trunk/Source/WebCore/svg/SVGFEDiffuseLightingElement.cpp

    r285796 r286864  
    172172
    173173    auto effect = FEDiffuseLighting::create(color, surfaceScale(), diffuseConstant(), kernelUnitLengthX(), kernelUnitLengthY(), WTFMove(lightSource));
    174     effect->inputEffects() = { WTFMove(input1) };
     174    effect->inputEffects() = { input1.releaseNonNull() };
    175175    return effect;
    176176}
  • trunk/Source/WebCore/svg/SVGFEDisplacementMapElement.cpp

    r285796 r286864  
    125125
    126126    auto effect = FEDisplacementMap::create(xChannelSelector(), yChannelSelector(), scale());
    127     effect->inputEffects() = { WTFMove(input1), WTFMove(input2) };
     127    effect->inputEffects() = { input1.releaseNonNull(), input2.releaseNonNull() };
    128128    return effect;
    129129}
  • trunk/Source/WebCore/svg/SVGFEDropShadowElement.cpp

    r285796 r286864  
    117117
    118118    auto effect = FEDropShadow::create(stdDeviationX(), stdDeviationY(), dx(), dy(), color, opacity);
    119     effect->inputEffects() = { WTFMove(input1) };
     119    effect->inputEffects() = { input1.releaseNonNull() };
    120120    return effect;
    121121}
  • trunk/Source/WebCore/svg/SVGFEGaussianBlurElement.cpp

    r286152 r286864  
    106106
    107107    auto effect = FEGaussianBlur::create(stdDeviationX(), stdDeviationY(), edgeMode());
    108     effect->inputEffects() = { WTFMove(input1) };
     108    effect->inputEffects() = { input1.releaseNonNull() };
    109109    return effect;
    110110}
  • trunk/Source/WebCore/svg/SVGFEMergeElement.cpp

    r286538 r286864  
    5454        if (!mergeEffect)
    5555            return nullptr;
    56         mergeInputs.append(WTFMove(mergeEffect));
     56        mergeInputs.append(mergeEffect.releaseNonNull());
    5757    }
    5858
  • trunk/Source/WebCore/svg/SVGFEMorphologyElement.cpp

    r286152 r286864  
    127127
    128128    auto effect = FEMorphology::create(svgOperator(), xRadius, yRadius);
    129     effect->inputEffects() = { WTFMove(input1) };
     129    effect->inputEffects() = { input1.releaseNonNull() };
    130130    return effect;
    131131}
  • trunk/Source/WebCore/svg/SVGFEOffsetElement.cpp

    r285796 r286864  
    8989
    9090    auto effect = FEOffset::create(dx(), dy());
    91     effect->inputEffects() = { WTFMove(input1) };
     91    effect->inputEffects() = { input1.releaseNonNull() };
    9292    return effect;
    9393}
  • trunk/Source/WebCore/svg/SVGFESpecularLightingElement.cpp

    r285796 r286864  
    180180
    181181    auto effect = FESpecularLighting::create(color, surfaceScale(), specularConstant(), specularExponent(), kernelUnitLengthX(), kernelUnitLengthY(), WTFMove(lightSource));
    182     effect->inputEffects() = { WTFMove(input1) };
     182    effect->inputEffects() = { input1.releaseNonNull() };
    183183    return effect;
    184184}
  • trunk/Source/WebCore/svg/SVGFETileElement.cpp

    r285796 r286864  
    7878
    7979    auto effect = FETile::create();
    80     effect->inputEffects() = { WTFMove(input1) };
     80    effect->inputEffects() = { input1.releaseNonNull() };
    8181    return effect;
    8282}
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp

    r286824 r286864  
    120120FilterEffectVector SVGFilter::effectsOfType(FilterFunction::Type filterType) const
    121121{
    122     HashSet<RefPtr<FilterEffect>> effects;
     122    HashSet<Ref<FilterEffect>> effects;
    123123
    124124    for (auto& term : m_expression) {
    125125        auto& effect = term.effect;
    126126        if (effect->filterType() == filterType)
    127             effects.add({ effect.ptr() });
     127            effects.add(effect);
    128128    }
    129129
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp

    r286765 r286864  
    172172}
    173173
    174 void SVGFilterBuilder::clearResultsRecursive(FilterEffect* effect)
    175 {
    176     if (!effect->hasResult())
     174void SVGFilterBuilder::clearResultsRecursive(FilterEffect& effect)
     175{
     176    if (!effect.hasResult())
    177177        return;
    178178
    179     effect->clearResult();
     179    effect.clearResult();
    180180
    181181    for (auto& reference : effectReferences(effect))
    182         clearResultsRecursive(reference);
     182        clearResultsRecursive(*reference);
    183183}
    184184
     
    191191}
    192192
    193 bool SVGFilterBuilder::buildEffectExpression(const RefPtr<FilterEffect>& effect, FilterEffectVector& stack, unsigned level, SVGFilterExpression& expression) const
     193bool SVGFilterBuilder::buildEffectExpression(FilterEffect& effect, FilterEffectVector& stack, unsigned level, SVGFilterExpression& expression) const
    194194{
    195195    // A cycle is detected.
     
    199199    stack.append(effect);
    200200   
    201     expression.append({ *effect, effectGeometry(*effect), level });
    202 
    203     for (auto& inputEffect : effect->inputEffects()) {
     201    expression.append({ effect, effectGeometry(effect), level });
     202
     203    for (auto& inputEffect : effect.inputEffects()) {
    204204        if (!buildEffectExpression(inputEffect, stack, level + 1, expression))
    205205            return false;
     
    219219
    220220    FilterEffectVector stack;
    221     if (!buildEffectExpression(m_lastEffect, stack, 0, expression))
     221    if (!buildEffectExpression(*m_lastEffect, stack, 0, expression))
    222222        return false;
    223223
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h

    r286589 r286864  
    5555    void appendEffectToEffectReferences(RefPtr<FilterEffect>&&, RenderObject*);
    5656
    57     inline FilterEffectSet& effectReferences(FilterEffect* effect)
     57    inline FilterEffectSet& effectReferences(FilterEffect& effect)
    5858    {
    5959        // Only allowed for effects belongs to this builder.
    60         ASSERT(m_effectReferences.contains(effect));
    61         return m_effectReferences.find(effect)->value;
     60        ASSERT(m_effectReferences.contains(&effect));
     61        return m_effectReferences.find(&effect)->value;
    6262    }
    6363
     
    6666
    6767    void clearEffects();
    68     void clearResultsRecursive(FilterEffect*);
     68    void clearResultsRecursive(FilterEffect&);
    6969
    7070    void setupBuiltinEffects(Ref<FilterEffect> sourceGraphic);
     
    8080
    8181    std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const;
    82     bool buildEffectExpression(const RefPtr<FilterEffect>&, FilterEffectVector& stack, unsigned level, SVGFilterExpression&) const;
     82    bool buildEffectExpression(FilterEffect&, FilterEffectVector& stack, unsigned level, SVGFilterExpression&) const;
    8383
    8484    HashMap<AtomString, RefPtr<FilterEffect>> m_builtinEffects;
  • trunk/Source/WebKit/ChangeLog

    r286859 r286864  
     12021-12-10  Said Abou-Hallawa  <said@apple.com>
     2
     3        [GPU Process] [Filters] Make FilterEffectVector a Vector of Ref<FilterEffect>
     4        https://bugs.webkit.org/show_bug.cgi?id=234108
     5
     6        Reviewed by Cameron McCormack.
     7
     8        * GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
     9        (WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer):
     10
    1112021-12-10  Per Arne Vollan  <pvollan@apple.com>
    212
  • trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp

    r286824 r286864  
    237237
    238238    for (auto& effect : filter->effectsOfType(FilterEffect::Type::FEImage)) {
    239         auto& feImage = *downcast<FEImage>(effect.get());
     239        auto& feImage = downcast<FEImage>(effect.get());
    240240
    241241        const auto* resourceIdentifier = std::get_if<RenderingResourceIdentifier>(&feImage.sourceImage());
Note: See TracChangeset for help on using the changeset viewer.