| Index: Source/core/rendering/RenderLayer.cpp | 
| diff --git a/Source/core/rendering/RenderLayer.cpp b/Source/core/rendering/RenderLayer.cpp | 
| index 568ec4325ca7a17e61fad7d469a296879bd292b0..f062f1e295d3d4a0d5c002ec39a8ff0d8f40a12d 100644 | 
| --- a/Source/core/rendering/RenderLayer.cpp | 
| +++ b/Source/core/rendering/RenderLayer.cpp | 
| @@ -76,6 +76,8 @@ | 
| #include "core/platform/graphics/FloatPoint3D.h" | 
| #include "core/platform/graphics/FloatRect.h" | 
| #include "core/platform/graphics/GraphicsContextStateSaver.h" | 
| +#include "core/platform/graphics/filters/ReferenceFilter.h" | 
| +#include "core/platform/graphics/filters/SourceGraphic.h" | 
| #include "core/platform/graphics/filters/custom/CustomFilterGlobalContext.h" | 
| #include "core/platform/graphics/filters/custom/CustomFilterOperation.h" | 
| #include "core/platform/graphics/filters/custom/CustomFilterValidatedProgram.h" | 
| @@ -100,6 +102,7 @@ | 
| #include "core/rendering/RenderScrollbarPart.h" | 
| #include "core/rendering/RenderTreeAsText.h" | 
| #include "core/rendering/RenderView.h" | 
| +#include "core/rendering/svg/ReferenceFilterBuilder.h" | 
| #include "core/rendering/svg/RenderSVGResourceClipper.h" | 
| #include <wtf/MemoryInstrumentationVector.h> | 
| #include <wtf/StdLibExtras.h> | 
| @@ -6046,13 +6049,6 @@ void RenderLayer::updateFilters(const RenderStyle* oldStyle, const RenderStyle* | 
| if (shouldUpdateFilters) | 
| backing()->updateFilters(renderer()->style()); | 
| updateOrRemoveFilterEffectRenderer(); | 
| -    // FIXME: Accelerated SVG reference filters still rely on FilterEffectRenderer to build the filter graph. | 
| -    // Thus, we have to call updateFilters again, after we have a FilterEffectRenderer. | 
| -    // FilterEffectRenderer is intended to render software filters and shouldn't be needed for accelerated filters. | 
| -    // We should extract the SVG graph building functionality out of FilterEffectRenderer, and it should happen in RenderLayer::computeFilterOperations. | 
| -    // https://bugs.webkit.org/show_bug.cgi?id=114051 | 
| -    if (shouldUpdateFilters && newStyle->filter().hasReferenceFilter()) | 
| -        backing()->updateFilters(renderer()->style()); | 
| } | 
|  | 
| void RenderLayer::styleChanged(StyleDifference, const RenderStyle* oldStyle) | 
| @@ -6245,6 +6241,22 @@ bool RenderLayer::isCSSCustomFilterEnabled() const | 
| FilterOperations RenderLayer::computeFilterOperations(const RenderStyle* style) | 
| { | 
| const FilterOperations& filters = style->filter(); | 
| +    if (filters.hasReferenceFilter()) { | 
| +        for (size_t i = 0; i < filters.size(); ++i) { | 
| +            FilterOperation* filterOperation = filters.operations().at(i).get(); | 
| +            if (filterOperation->getOperationType() != FilterOperation::REFERENCE) | 
| +                continue; | 
| +            ReferenceFilterOperation* referenceOperation = static_cast<ReferenceFilterOperation*>(filterOperation); | 
| +            // FIXME: Cache the ReferenceFilter if it didn't change. | 
| +            RefPtr<ReferenceFilter> referenceFilter = ReferenceFilter::create(); | 
| +            float zoom = style->effectiveZoom(); | 
| +            referenceFilter->setFilterResolution(FloatSize(zoom, zoom)); | 
| +            referenceFilter->setLastEffect(ReferenceFilterBuilder::build(referenceFilter.get(), renderer(), referenceFilter->sourceGraphic(), | 
| +                referenceOperation)); | 
| +            referenceOperation->setFilter(referenceFilter.release()); | 
| +        } | 
| +    } | 
| + | 
| if (!filters.hasCustomFilter()) | 
| return filters; | 
|  | 
| @@ -6310,14 +6322,7 @@ void RenderLayer::updateOrRemoveFilterEffectRenderer() | 
| if (RenderLayerFilterInfo* filterInfo = this->filterInfo()) | 
| filterInfo->setRenderer(0); | 
|  | 
| -        // FIXME: Accelerated SVG reference filters shouldn't rely on FilterEffectRenderer to build the filter graph. | 
| -        // https://bugs.webkit.org/show_bug.cgi?id=114051 | 
| - | 
| -        // Early-return only if we *don't* have reference filters. | 
| -        // For reference filters, we still want the FilterEffect graph built | 
| -        // for us, even if we're composited. | 
| -        if (!renderer()->style()->filter().hasReferenceFilter()) | 
| -            return; | 
| +        return; | 
| } | 
|  | 
| RenderLayerFilterInfo* filterInfo = ensureFilterInfo(); | 
|  |