Title: [288865] trunk
Revision
288865
Author
[email protected]
Date
2022-01-31 18:57:22 -0800 (Mon, 31 Jan 2022)

Log Message

[GPU Process] Pattern should hold SourceImage which can be converted to a NativeImage only when needed
https://bugs.webkit.org/show_bug.cgi?id=232411
<rdar://problem/84998738>

Reviewed by Darin Adler.

Source/WebCore:

Make Pattern hold a SourceImage and add getters to retrieve a NativeImage
and an ImageBuffer. In these getters the SourceImage will either return
the current image source or get one from the other if needed.

* html/canvas/CanvasPattern.cpp:
(WebCore::CanvasPattern::create):
(WebCore::CanvasPattern::CanvasPattern):
* html/canvas/CanvasPattern.h:
* html/canvas/CanvasRenderingContext2DBase.cpp:
(WebCore::CanvasRenderingContext2DBase::createPattern):
* inspector/InspectorCanvas.cpp:
(WebCore::InspectorCanvas::buildArrayForCanvasPattern):

* platform/graphics/NativeImage.h:
Make NativeImage a thread-safe RefCounted and make its destruction happen
on the main thread. This is similar to what we do for ImageBuffer. And
the reason for this is the message handler in the GPUProcess may create
NativeImages on the main thread as the SourceImages for the Patterns of
the SetState item. These NativeImages will be deleted in the replaying
thread after applying the SetState item.

* platform/graphics/Pattern.cpp:
(WebCore::Pattern::create):
(WebCore::Pattern::Pattern):

* platform/graphics/Pattern.h:
(WebCore::Pattern::encode const):
(WebCore::Pattern::decode):
Add encoding and decoding mehods for Pattern which will be called from
SetState::encode() and SetState::decode().

* platform/graphics/SourceImage.cpp:
(WebCore::SourceImage::nativeImage const):
(WebCore::SourceImage::imageBuffer const):
(WebCore::SourceImage::size const):
(WebCore::SourceImage::nativeImage): Deleted.
(WebCore::SourceImage::imageBuffer): Deleted.
* platform/graphics/SourceImage.h:
Make SourceImage keep the image source it was created with. Get a temporary
image source if it is different from what is stored in m_imageVariant.

* platform/graphics/cairo/PatternCairo.cpp:
(WebCore::Pattern::createPlatformPattern const):
* platform/graphics/cg/PatternCG.cpp:
(WebCore::Pattern::createPlatformPattern const):
* platform/graphics/displaylists/DisplayListItems.cpp:
(WebCore::DisplayList::SetState::SetState):
(WebCore::DisplayList::SetState::apply):
* platform/graphics/displaylists/DisplayListItems.h:
(WebCore::DisplayList::SetState::stateChange):
(WebCore::DisplayList::SetState::encode const):
(WebCore::DisplayList::SetState::decode):
(WebCore::DisplayList::SetState::strokePatternParameters const): Deleted.
(WebCore::DisplayList::SetState::fillPatternParameters const): Deleted.
(WebCore::DisplayList::SetState::strokePatternImageIdentifier const): Deleted.
(WebCore::DisplayList::SetState::fillPatternImageIdentifier const): Deleted.
Simplify SetState by deleting the PatternData members. Replace these members
by the strokePattern and fillPattern since these patterns can be encoded
and decoded.

* platform/graphics/displaylists/DisplayListReplayer.cpp:
(WebCore::DisplayList::applySetStateItem):
* platform/graphics/displaylists/DisplayListResourceHeap.h:
Add the helper LocalResourceHeap::getSourceImage() to be used by
applySetStateItem().

* platform/graphics/filters/software/FETileSoftwareApplier.cpp:
(WebCore::FETileSoftwareApplier::apply const):
* rendering/RenderLayerBacking.cpp:
(WebCore::patternForDescription):
* rendering/svg/RenderSVGResourcePattern.cpp:
(WebCore::RenderSVGResourcePattern::buildPattern):

Source/WebKit:

Add the helpers QualifiedResourceHeap::getSourceImage() and
RemoteResourceCache::cachedSourceImage() which will be used by
RemoteDisplayListRecorder::setState() to replace the
RenderingResourceIdentifier of the pattern's tileImage by an actual
SourceImage.

* GPUProcess/graphics/QualifiedResourceHeap.h:
(WebKit::QualifiedResourceHeap::getSourceImage const):
* GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
(WebKit::RemoteDisplayListRecorder::setState):
(WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer):
(WebKit::RemoteDisplayListRecorder::setStateWithQualifiedIdentifiers): Deleted.
* GPUProcess/graphics/RemoteResourceCache.cpp:
(WebKit::RemoteResourceCache::cachedSourceImage const):
* GPUProcess/graphics/RemoteResourceCache.h:

LayoutTests:

Unskip layout tests for gpu process because they are fixed by this change.

* gpu-process/TestExpectations:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (288864 => 288865)


--- trunk/LayoutTests/ChangeLog	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/LayoutTests/ChangeLog	2022-02-01 02:57:22 UTC (rev 288865)
@@ -1,3 +1,15 @@
+2022-01-31  Said Abou-Hallawa  <[email protected]>
+
+        [GPU Process] Pattern should hold SourceImage which can be converted to a NativeImage only when needed
+        https://bugs.webkit.org/show_bug.cgi?id=232411
+        <rdar://problem/84998738>
+
+        Reviewed by Darin Adler.
+
+        Unskip layout tests for gpu process because they are fixed by this change.
+
+        * gpu-process/TestExpectations:
+
 2022-01-31  Robert Jenner  <[email protected]>
 
         REGRESSION(288052?): editing/execCommand/paste-as-quotation-disconnected-paragraph-ancestor-crash.html makes subsequent test fail, as DumpRenderTree compares to wrong expected result        

Modified: trunk/LayoutTests/gpu-process/TestExpectations (288864 => 288865)


--- trunk/LayoutTests/gpu-process/TestExpectations	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/LayoutTests/gpu-process/TestExpectations	2022-02-01 02:57:22 UTC (rev 288865)
@@ -245,8 +245,6 @@
 imported/blink/svg/as-image/svg-as-image-object-fit-cover.html
 imported/blink/svg/as-image/svgview-references.html
 imported/blink/svg/custom/fill-fallback-currentcolor-1.svg
-imported/blink/svg/custom/transformed-text-pattern.html [ Crash ]
-imported/blink/svg/custom/viewport-resource-inval.svg [ Crash ]
 imported/blink/svg/text/obb-paintserver.html
 imported/mozilla/svg/as-image/background-resize-3.html
 imported/mozilla/svg/as-image/background-resize-4.html
@@ -261,9 +259,6 @@
 imported/mozilla/svg/blend-saturation.svg
 imported/mozilla/svg/conditions-08.svg [ Crash ]
 imported/mozilla/svg/dynamic-pattern-01.svg [ Crash ]
-imported/mozilla/svg/dynamic-pattern-02.svg [ Crash ]
-imported/mozilla/svg/dynamic-pattern-contents-01.svg [ Crash ]
-imported/mozilla/svg/dynamic-pattern-contents-02.svg [ Crash ]
 imported/mozilla/svg/filters/feComposite-2.svg
 imported/mozilla/svg/filters/feFlood-1.svg
 imported/mozilla/svg/filters/feFlood-2.svg
@@ -270,30 +265,13 @@
 imported/mozilla/svg/filters/feImage-1.svg
 imported/mozilla/svg/linearGradient-basic-03.svg
 imported/mozilla/svg/mask-type-01.svg
-imported/mozilla/svg/objectBoundingBox-and-pattern-01a.svg [ Crash ]
-imported/mozilla/svg/objectBoundingBox-and-pattern-01b.svg [ Crash ]
-imported/mozilla/svg/objectBoundingBox-and-pattern-01c.svg [ Crash ]
-imported/mozilla/svg/objectBoundingBox-and-pattern-02.svg [ Crash ]
-imported/mozilla/svg/objectBoundingBox-and-pattern-03.svg [ Crash ]
 imported/mozilla/svg/opacity-and-gradient-02.svg
 imported/mozilla/svg/paint-order-01.svg
 imported/mozilla/svg/path-02.svg
-imported/mozilla/svg/pattern-basic-01.svg [ Crash ]
-imported/mozilla/svg/pattern-live-01a.svg [ Crash ]
-imported/mozilla/svg/pattern-live-01b.svg [ Crash ]
-imported/mozilla/svg/pattern-scale-01a.svg [ Crash ]
-imported/mozilla/svg/pattern-scale-01b.svg [ Crash ]
-imported/mozilla/svg/pattern-scale-01c.svg [ Crash ]
-imported/mozilla/svg/pattern-transform-presence-01.svg [ Crash ]
 imported/mozilla/svg/pattern-transformed-01.svg
 imported/mozilla/svg/text-gradient-01.svg
 imported/mozilla/svg/text-scale-02.svg
-imported/mozilla/svg/text/mask-content-2.svg [ Crash ]
 imported/mozilla/svg/text/simple-fill-gradient.svg
-imported/mozilla/svg/userSpaceOnUse-and-pattern-01.svg [ Crash ]
-imported/mozilla/svg/viewBox-and-pattern-01.svg [ Crash ]
-imported/mozilla/svg/viewBox-and-pattern-02.svg [ Crash ]
-imported/mozilla/svg/viewBox-and-pattern-03.svg [ Crash ]
 imported/w3c/i18n/bidi/bidi-plaintext-011.html [ Pass ]
 imported/w3c/web-platform-tests/compat/webkit-background-origin-text.html
 imported/w3c/web-platform-tests/compat/webkit-linear-gradient-line-bottom.html
@@ -910,24 +888,7 @@
 imported/w3c/web-platform-tests/mimesniff/mime-types/charset-parameter.window.html
 imported/w3c/web-platform-tests/selection/selection-select-all-move-input-crash.html
 imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-redirect.https.html [ Pass ]
-imported/w3c/web-platform-tests/svg/animations/animateTransform-pattern-transform.html [ Crash ]
-imported/w3c/web-platform-tests/svg/animations/svgenum-animation-1.html [ Crash ]
 imported/w3c/web-platform-tests/svg/extensibility/foreignObject/masked.html
-imported/w3c/web-platform-tests/svg/import/coords-units-01-b-manual.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/import/linking-a-10-f-manual.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/import/masking-path-07-b-manual.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/import/pservers-grad-03-b-manual.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/import/pservers-grad-06-b-manual.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/import/pservers-pattern-01-b-manual.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/import/pservers-pattern-02-f-manual.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/import/pservers-pattern-04-f-manual.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/import/pservers-pattern-05-f-manual.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/import/pservers-pattern-08-f-manual.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/import/pservers-pattern-09-f-manual.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/linking/reftests/href-pattern-element.html [ Crash ]
-imported/w3c/web-platform-tests/svg/painting/currentColor-override-pserver-stroke.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/pservers/reftests/pattern-inheritance-not-in-rendertree-02.tentative.svg [ Crash ]
-imported/w3c/web-platform-tests/svg/render/reftests/filter-effects-on-pattern.html [ Crash ]
 imported/w3c/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-zero.html [ Pass ]
 imported/w3c/web-platform-tests/webaudio/the-audio-api/the-biquadfilternode-interface/no-dezippering.html
 imported/w3c/web-platform-tests/xhr/response-method.htm [ Pass ]
@@ -952,28 +913,11 @@
 svg/batik/paints/patternRegionA.svg [ Crash ]
 svg/batik/paints/patternRegions-positioned-objects.svg [ Crash ]
 svg/batik/paints/patternRegions.svg [ Crash ]
-svg/batik/text/textEffect2.svg [ Crash ]
 svg/clip-path/clip-path-line-use-before-defined.svg [ Pass ]
 svg/clip-path/webkit-clip-path-after.svg
 svg/clip-path/webkit-clip-path-before.svg
-svg/custom/hidpi-masking-clipping.svg [ Crash ]
-svg/custom/href-svg-namespace-static.svg [ Crash ]
-svg/custom/js-late-pattern-creation.svg [ Crash ]
-svg/custom/js-update-pattern.svg [ Crash ]
-svg/custom/large-image-pattern-crash.html [ Crash ]
-svg/custom/local-url-reference-pattern.html [ Crash ]
-svg/custom/new-image-is-html-element.svg [ Crash ]
 svg/custom/subpaths-moveto-only-rendering.svg [ Pass ]
 svg/custom/svg-fonts-skip-ink.html
-svg/dom/viewport-container-crash.svg [ Crash ]
-svg/dynamic-updates/SVGPatternElement-dom-height-attr.html [ Crash ]
-svg/dynamic-updates/SVGPatternElement-dom-patternTransform-attr.html [ Crash ]
-svg/dynamic-updates/SVGPatternElement-dom-patternUnits-attr.html [ Crash ]
-svg/dynamic-updates/SVGPatternElement-dom-width-attr.html [ Crash ]
-svg/dynamic-updates/SVGPatternElement-dom-y-attr.html [ Crash ]
-svg/dynamic-updates/SVGPatternElement-svgdom-patternContentUnits-prop.html [ Crash ]
-svg/dynamic-updates/SVGPatternElement-svgdom-width-prop.html [ Crash ]
-svg/dynamic-updates/SVGPatternElement-svgdom-y-prop.html [ Crash ]
 svg/gradients/gradient-flipped-start-end-points.svg
 svg/gradients/spreadMethod.svg
 svg/gradients/spreadMethodAlpha.svg
@@ -987,11 +931,6 @@
 svg/gradients/stopAlpha.svg
 svg/transforms/transformed-text-fill-gradient.html
 svg/transforms/transformed-text-fill-pattern.html
-svg/W3C-SVG-1.1-SE/struct-dom-11-f.svg [ Crash ]
-svg/W3C-SVG-1.1/coords-units-01-b.svg [ Crash ]
-svg/W3C-SVG-1.1/pservers-grad-04-b.svg [ Crash ]
-svg/W3C-SVG-1.1/pservers-grad-07-b.svg [ Crash ]
-svg/W3C-SVG-1.1/render-elems-01-t.svg [ Crash ]
 system-preview/badge.html
 webanimations/opacity-animation.html
 webgl/1.0.3/conformance/context/premultiplyalpha-test.html

Modified: trunk/Source/WebCore/ChangeLog (288864 => 288865)


--- trunk/Source/WebCore/ChangeLog	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/ChangeLog	2022-02-01 02:57:22 UTC (rev 288865)
@@ -1,3 +1,84 @@
+2022-01-31  Said Abou-Hallawa  <[email protected]>
+
+        [GPU Process] Pattern should hold SourceImage which can be converted to a NativeImage only when needed
+        https://bugs.webkit.org/show_bug.cgi?id=232411
+        <rdar://problem/84998738>
+
+        Reviewed by Darin Adler.
+
+        Make Pattern hold a SourceImage and add getters to retrieve a NativeImage
+        and an ImageBuffer. In these getters the SourceImage will either return
+        the current image source or get one from the other if needed.
+
+        * html/canvas/CanvasPattern.cpp:
+        (WebCore::CanvasPattern::create):
+        (WebCore::CanvasPattern::CanvasPattern):
+        * html/canvas/CanvasPattern.h:
+        * html/canvas/CanvasRenderingContext2DBase.cpp:
+        (WebCore::CanvasRenderingContext2DBase::createPattern):
+        * inspector/InspectorCanvas.cpp:
+        (WebCore::InspectorCanvas::buildArrayForCanvasPattern):
+
+        * platform/graphics/NativeImage.h:
+        Make NativeImage a thread-safe RefCounted and make its destruction happen
+        on the main thread. This is similar to what we do for ImageBuffer. And
+        the reason for this is the message handler in the GPUProcess may create 
+        NativeImages on the main thread as the SourceImages for the Patterns of
+        the SetState item. These NativeImages will be deleted in the replaying
+        thread after applying the SetState item.
+
+        * platform/graphics/Pattern.cpp:
+        (WebCore::Pattern::create):
+        (WebCore::Pattern::Pattern):
+
+        * platform/graphics/Pattern.h:
+        (WebCore::Pattern::encode const):
+        (WebCore::Pattern::decode):
+        Add encoding and decoding mehods for Pattern which will be called from 
+        SetState::encode() and SetState::decode().
+
+        * platform/graphics/SourceImage.cpp:
+        (WebCore::SourceImage::nativeImage const):
+        (WebCore::SourceImage::imageBuffer const):
+        (WebCore::SourceImage::size const):
+        (WebCore::SourceImage::nativeImage): Deleted.
+        (WebCore::SourceImage::imageBuffer): Deleted.
+        * platform/graphics/SourceImage.h:
+        Make SourceImage keep the image source it was created with. Get a temporary
+        image source if it is different from what is stored in m_imageVariant.
+
+        * platform/graphics/cairo/PatternCairo.cpp:
+        (WebCore::Pattern::createPlatformPattern const):
+        * platform/graphics/cg/PatternCG.cpp:
+        (WebCore::Pattern::createPlatformPattern const):
+        * platform/graphics/displaylists/DisplayListItems.cpp:
+        (WebCore::DisplayList::SetState::SetState):
+        (WebCore::DisplayList::SetState::apply):
+        * platform/graphics/displaylists/DisplayListItems.h:
+        (WebCore::DisplayList::SetState::stateChange):
+        (WebCore::DisplayList::SetState::encode const):
+        (WebCore::DisplayList::SetState::decode):
+        (WebCore::DisplayList::SetState::strokePatternParameters const): Deleted.
+        (WebCore::DisplayList::SetState::fillPatternParameters const): Deleted.
+        (WebCore::DisplayList::SetState::strokePatternImageIdentifier const): Deleted.
+        (WebCore::DisplayList::SetState::fillPatternImageIdentifier const): Deleted.
+        Simplify SetState by deleting the PatternData members. Replace these members
+        by the strokePattern and fillPattern since these patterns can be encoded
+        and decoded. 
+
+        * platform/graphics/displaylists/DisplayListReplayer.cpp:
+        (WebCore::DisplayList::applySetStateItem):
+        * platform/graphics/displaylists/DisplayListResourceHeap.h:
+        Add the helper LocalResourceHeap::getSourceImage() to be used by 
+        applySetStateItem().
+
+        * platform/graphics/filters/software/FETileSoftwareApplier.cpp:
+        (WebCore::FETileSoftwareApplier::apply const):
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::patternForDescription):
+        * rendering/svg/RenderSVGResourcePattern.cpp:
+        (WebCore::RenderSVGResourcePattern::buildPattern):
+
 2022-01-31  Andres Gonzalez  <[email protected]>
 
         Add to AXLogger the ability to log only from the specified thread.

Modified: trunk/Source/WebCore/html/canvas/CanvasPattern.cpp (288864 => 288865)


--- trunk/Source/WebCore/html/canvas/CanvasPattern.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/html/canvas/CanvasPattern.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -34,12 +34,12 @@
 
 namespace WebCore {
 
-Ref<CanvasPattern> CanvasPattern::create(Ref<NativeImage>&& image, bool repeatX, bool repeatY, bool originClean)
+Ref<CanvasPattern> CanvasPattern::create(SourceImage&& image, bool repeatX, bool repeatY, bool originClean)
 {
     return adoptRef(*new CanvasPattern(WTFMove(image), repeatX, repeatY, originClean));
 }
 
-CanvasPattern::CanvasPattern(Ref<NativeImage>&& image, bool repeatX, bool repeatY, bool originClean)
+CanvasPattern::CanvasPattern(SourceImage&& image, bool repeatX, bool repeatY, bool originClean)
     : m_pattern(Pattern::create(WTFMove(image), { repeatX, repeatY }))
     , m_originClean(originClean)
 {

Modified: trunk/Source/WebCore/html/canvas/CanvasPattern.h (288864 => 288865)


--- trunk/Source/WebCore/html/canvas/CanvasPattern.h	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/html/canvas/CanvasPattern.h	2022-02-01 02:57:22 UTC (rev 288865)
@@ -32,13 +32,13 @@
 
 namespace WebCore {
 
-class NativeImage;
 class Pattern;
+class SourceImage;
 struct DOMMatrix2DInit;
 
 class CanvasPattern : public RefCounted<CanvasPattern> {
 public:
-    static Ref<CanvasPattern> create(Ref<NativeImage>&&, bool repeatX, bool repeatY, bool originClean);
+    static Ref<CanvasPattern> create(SourceImage&&, bool repeatX, bool repeatY, bool originClean);
     ~CanvasPattern();
 
     static bool parseRepetitionType(const String&, bool& repeatX, bool& repeatY);
@@ -51,7 +51,7 @@
     ExceptionOr<void> setTransform(DOMMatrix2DInit&&);
 
 private:
-    CanvasPattern(Ref<NativeImage>&&, bool repeatX, bool repeatY, bool originClean);
+    CanvasPattern(SourceImage&&, bool repeatX, bool repeatY, bool originClean);
 
     Ref<Pattern> m_pattern;
     bool m_originClean;

Modified: trunk/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp (288864 => 288865)


--- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -1953,7 +1953,7 @@
     if (!nativeImage)
         return Exception { InvalidStateError };
 
-    return RefPtr<CanvasPattern> { CanvasPattern::create(nativeImage.releaseNonNull(), repeatX, repeatY, originClean) };
+    return RefPtr<CanvasPattern> { CanvasPattern::create({ nativeImage.releaseNonNull() }, repeatX, repeatY, originClean) };
 }
 
 ExceptionOr<RefPtr<CanvasPattern>> CanvasRenderingContext2DBase::createPattern(CanvasBase& canvas, bool repeatX, bool repeatY)
@@ -1969,7 +1969,7 @@
     if (!nativeImage)
         return Exception { InvalidStateError };
 
-    return RefPtr<CanvasPattern> { CanvasPattern::create(nativeImage.releaseNonNull(), repeatX, repeatY, canvas.originClean()) };
+    return RefPtr<CanvasPattern> { CanvasPattern::create({ nativeImage.releaseNonNull() }, repeatX, repeatY, canvas.originClean()) };
 }
     
 #if ENABLE(VIDEO)
@@ -1984,7 +1984,7 @@
 
 #if USE(CG)
     if (auto nativeImage = videoElement.nativeImageForCurrentTime())
-        return RefPtr<CanvasPattern> { CanvasPattern::create(nativeImage.releaseNonNull(), repeatX, repeatY, originClean) };
+        return RefPtr<CanvasPattern> { CanvasPattern::create({ nativeImage.releaseNonNull() }, repeatX, repeatY, originClean) };
 #endif
 
     auto renderingMode = drawingContext() ? drawingContext()->renderingMode() : RenderingMode::Unaccelerated;
@@ -1994,7 +1994,7 @@
 
     videoElement.paintCurrentFrameInContext(imageBuffer->context(), FloatRect(FloatPoint(), size(videoElement)));
     
-    return RefPtr<CanvasPattern> { CanvasPattern::create(ImageBuffer::sinkIntoNativeImage(WTFMove(imageBuffer)).releaseNonNull(), repeatX, repeatY, originClean) };
+    return RefPtr<CanvasPattern> { CanvasPattern::create({ imageBuffer.releaseNonNull() }, repeatX, repeatY, originClean) };
 }
 
 #endif

Modified: trunk/Source/WebCore/inspector/InspectorCanvas.cpp (288864 => 288865)


--- trunk/Source/WebCore/inspector/InspectorCanvas.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/inspector/InspectorCanvas.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -1336,10 +1336,7 @@
 
 Ref<JSON::ArrayOf<JSON::Value>> InspectorCanvas::buildArrayForCanvasPattern(const CanvasPattern& canvasPattern)
 {
-    auto& tileImage = canvasPattern.pattern().tileImage();
-    FloatRect rect = { { }, tileImage.size() };
-    auto imageBuffer = ImageBuffer::create(tileImage.size(), RenderingMode::Unaccelerated, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8);
-    imageBuffer->context().drawNativeImage(tileImage, tileImage.size(), rect, rect);
+    auto imageBuffer = canvasPattern.pattern().tileImageBuffer();
 
     String repeat;
     bool repeatX = canvasPattern.pattern().repeatX();

Modified: trunk/Source/WebCore/platform/graphics/NativeImage.h (288864 => 288865)


--- trunk/Source/WebCore/platform/graphics/NativeImage.h	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/NativeImage.h	2022-02-01 02:57:22 UTC (rev 288865)
@@ -38,7 +38,7 @@
 
 namespace WebCore {
 
-class NativeImage : public RefCounted<NativeImage>, public CanMakeWeakPtr<NativeImage> {
+class NativeImage : public ThreadSafeRefCounted<NativeImage, WTF::DestructionThread::Main>, public CanMakeWeakPtr<NativeImage> {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     class Observer {

Modified: trunk/Source/WebCore/platform/graphics/Pattern.cpp (288864 => 288865)


--- trunk/Source/WebCore/platform/graphics/Pattern.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/Pattern.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -31,13 +31,13 @@
 
 namespace WebCore {
 
-Ref<Pattern> Pattern::create(Ref<NativeImage>&& tileImage, const Parameters& parameters)
+Ref<Pattern> Pattern::create(SourceImage&& tileImage, const Parameters& parameters)
 {
     return adoptRef(*new Pattern(WTFMove(tileImage), parameters));
 }
 
-Pattern::Pattern(Ref<NativeImage>&& image, const Parameters& parameters)
-    : m_tileImage(WTFMove(image))
+Pattern::Pattern(SourceImage&& tileImage, const Parameters& parameters)
+    : m_tileImage(WTFMove(tileImage))
     , m_parameters(parameters)
 {
 }

Modified: trunk/Source/WebCore/platform/graphics/Pattern.h (288864 => 288865)


--- trunk/Source/WebCore/platform/graphics/Pattern.h	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/Pattern.h	2022-02-01 02:57:22 UTC (rev 288865)
@@ -28,7 +28,7 @@
 #pragma once
 
 #include "AffineTransform.h"
-#include "Image.h"
+#include "SourceImage.h"
 
 #include <wtf/Ref.h>
 #include <wtf/RefCounted.h>
@@ -45,7 +45,6 @@
 
 class AffineTransform;
 class GraphicsContext;
-class Image;
 
 class Pattern final : public RefCounted<Pattern> {
 public:
@@ -63,24 +62,31 @@
         bool repeatY;
     };
 
-    WEBCORE_EXPORT static Ref<Pattern> create(Ref<NativeImage>&& tileImage, const Parameters& = { });
+    WEBCORE_EXPORT static Ref<Pattern> create(SourceImage&& tileImage, const Parameters& = { });
     WEBCORE_EXPORT ~Pattern();
 
-    NativeImage& tileImage() const { return m_tileImage.get(); }
+    const SourceImage& tileImage() const { return m_tileImage; }
+    RefPtr<NativeImage> tileNativeImage() const { return m_tileImage.nativeImage(); }
+    RefPtr<ImageBuffer> tileImageBuffer() const { return m_tileImage.imageBuffer(); }
     const Parameters& parameters() const { return m_parameters; }
 
     // Pattern space is an abstract space that maps to the default user space by the transformation 'userSpaceTransform'
     PlatformPatternPtr createPlatformPattern(const AffineTransform& userSpaceTransform) const;
 
+    void setTileImage(SourceImage&& tileImage) { m_tileImage = WTFMove(tileImage); }
     void setPatternSpaceTransform(const AffineTransform&);
+
     const AffineTransform& patternSpaceTransform() const { return m_parameters.patternSpaceTransform; };
     bool repeatX() const { return m_parameters.repeatX; }
     bool repeatY() const { return m_parameters.repeatY; }
 
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static std::optional<Ref<Pattern>> decode(Decoder&);
+
 private:
-    Pattern(Ref<NativeImage>&&, const Parameters&);
+    Pattern(SourceImage&&, const Parameters&);
 
-    Ref<NativeImage> m_tileImage;
+    SourceImage m_tileImage;
     Parameters m_parameters;
 };
 
@@ -113,4 +119,27 @@
     return {{ *repeatX, *repeatY, *patternSpaceTransform }};
 }
 
+template<class Encoder>
+void Pattern::encode(Encoder& encoder) const
+{
+    encoder << m_tileImage;
+    encoder << m_parameters;
+}
+
+template<class Decoder>
+std::optional<Ref<Pattern>> Pattern::decode(Decoder& decoder)
+{
+    std::optional<SourceImage> tileImage;
+    decoder >> tileImage;
+    if (!tileImage)
+        return std::nullopt;
+
+    std::optional<Parameters> parameters;
+    decoder >> parameters;
+    if (!parameters)
+        return std::nullopt;
+
+    return Pattern::create(WTFMove(*tileImage), *parameters);
+}
+
 } //namespace

Modified: trunk/Source/WebCore/platform/graphics/SourceImage.cpp (288864 => 288865)


--- trunk/Source/WebCore/platform/graphics/SourceImage.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/SourceImage.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -42,7 +42,7 @@
     return nullptr;
 }
 
-NativeImage* SourceImage::nativeImage()
+RefPtr<NativeImage> SourceImage::nativeImage() const
 {
     if (!std::holds_alternative<Ref<ImageBuffer>>(m_imageVariant))
         return nativeImageIfExists();
@@ -52,8 +52,7 @@
     if (!nativeImage)
         return nullptr;
 
-    m_imageVariant = nativeImage.releaseNonNull();
-    return nativeImageIfExists();
+    return nativeImage;
 }
 
 ImageBuffer* SourceImage::imageBufferIfExists() const
@@ -63,7 +62,7 @@
     return nullptr;
 }
 
-ImageBuffer* SourceImage::imageBuffer()
+RefPtr<ImageBuffer> SourceImage::imageBuffer() const
 {
     if (!std::holds_alternative<Ref<NativeImage>>(m_imageVariant))
         return imageBufferIfExists();
@@ -77,8 +76,7 @@
 
     imageBuffer->context().drawNativeImage(nativeImage, rect.size(), rect, rect);
 
-    m_imageVariant = imageBuffer.releaseNonNull();
-    return imageBufferIfExists();
+    return imageBuffer;
 }
 
 RenderingResourceIdentifier SourceImage::imageIdentifier() const
@@ -96,4 +94,20 @@
     );
 }
 
+IntSize SourceImage::size() const
+{
+    return WTF::switchOn(m_imageVariant,
+        [&] (const Ref<NativeImage>& nativeImage) {
+            return nativeImage->size();
+        },
+        [&] (const Ref<ImageBuffer>& imageBuffer) {
+            return imageBuffer->backendSize();
+        },
+        [&] (RenderingResourceIdentifier) -> IntSize {
+            ASSERT_NOT_REACHED();
+            return { };
+        }
+    );
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/graphics/SourceImage.h (288864 => 288865)


--- trunk/Source/WebCore/platform/graphics/SourceImage.h	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/SourceImage.h	2022-02-01 02:57:22 UTC (rev 288865)
@@ -42,12 +42,13 @@
     SourceImage(ImageVariant&&);
 
     NativeImage* nativeImageIfExists() const;
-    NativeImage* nativeImage();
+    RefPtr<NativeImage> nativeImage() const;
 
     ImageBuffer* imageBufferIfExists() const;
-    ImageBuffer* imageBuffer();
+    RefPtr<ImageBuffer> imageBuffer() const;
 
     RenderingResourceIdentifier imageIdentifier() const;
+    IntSize size() const;
 
     template<class Encoder> void encode(Encoder&) const;
     template<class Decoder> static std::optional<SourceImage> decode(Decoder&);

Modified: trunk/Source/WebCore/platform/graphics/cairo/PatternCairo.cpp (288864 => 288865)


--- trunk/Source/WebCore/platform/graphics/cairo/PatternCairo.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/cairo/PatternCairo.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -35,7 +35,11 @@
 
 cairo_pattern_t* Pattern::createPlatformPattern(const AffineTransform&) const
 {
-    auto platformImage = tileImage().platformImage();
+    auto nativeImage = tileNativeImage();
+    if (!nativeImage)
+        return nullptr;
+
+    auto platformImage = nativeImage->platformImage();
     if (!platformImage)
         return nullptr;
 

Modified: trunk/Source/WebCore/platform/graphics/cg/PatternCG.cpp (288864 => 288865)


--- trunk/Source/WebCore/platform/graphics/cg/PatternCG.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/cg/PatternCG.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -55,16 +55,20 @@
 
 RetainPtr<CGPatternRef> Pattern::createPlatformPattern(const AffineTransform& userSpaceTransform) const
 {
-    FloatRect tileRect = { { }, tileImage().size() };
+    auto nativeImage = tileNativeImage();
+    if (!nativeImage)
+        return nullptr;
 
-    AffineTransform patternTransform = userSpaceTransform * patternSpaceTransform();
+    auto platformImage = nativeImage->platformImage();
+    if (!platformImage)
+        return nullptr;
+
+    FloatRect tileRect = { { }, nativeImage->size() };
+
+    auto patternTransform = userSpaceTransform * patternSpaceTransform();
     patternTransform.scaleNonUniform(1, -1);
     patternTransform.translate(0, -tileRect.height());
 
-    PlatformImagePtr platformImage = tileImage().platformImage();
-    if (!platformImage)
-        return nullptr;
-
     // If we're repeating in both directions, we can use image-backed patterns
     // instead of custom patterns, and avoid tiling-edge pixel cracks.
     if (repeatX() && repeatY())

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


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -153,19 +153,13 @@
 {
 }
 
-SetState::SetState(const GraphicsContextStateChange& stateChange, const PatternData& strokePattern, const PatternData& fillPattern)
+SetState::SetState(const GraphicsContextStateChange& stateChange)
     : m_stateChange(stateChange)
-    , m_strokePattern(strokePattern)
-    , m_fillPattern(fillPattern)
 {
 }
 
-void SetState::apply(GraphicsContext& context, NativeImage* strokePatternImage, NativeImage* fillPatternImage)
+void SetState::apply(GraphicsContext& context)
 {
-    if (m_stateChange.m_changeFlags.contains(GraphicsContextState::StrokePatternChange) && strokePatternImage)
-        m_stateChange.m_state.strokePattern = Pattern::create(*strokePatternImage, m_strokePattern.parameters);
-    if (m_stateChange.m_changeFlags.contains(GraphicsContextState::FillPatternChange) && fillPatternImage)
-        m_stateChange.m_state.fillPattern = Pattern::create(*fillPatternImage, m_fillPattern.parameters);
     m_stateChange.apply(context);
 }
 

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


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h	2022-02-01 02:57:22 UTC (rev 288865)
@@ -249,27 +249,17 @@
     WEBCORE_EXPORT SetState(const GraphicsContextState&, GraphicsContextState::StateChangeFlags);
 
     const GraphicsContextStateChange& stateChange() const { return m_stateChange; }
-    const Pattern::Parameters& strokePatternParameters() const { return m_strokePattern.parameters; }
-    const Pattern::Parameters& fillPatternParameters() const { return m_fillPattern.parameters; }
-    RenderingResourceIdentifier strokePatternImageIdentifier() const { return m_strokePattern.tileImageIdentifier; }
-    RenderingResourceIdentifier fillPatternImageIdentifier() const { return m_fillPattern.tileImageIdentifier; }
+    GraphicsContextStateChange& stateChange() { return m_stateChange; }
 
     template<class Encoder> void encode(Encoder&) const;
     template<class Decoder> static std::optional<SetState> decode(Decoder&);
 
-    WEBCORE_EXPORT void apply(GraphicsContext&, NativeImage* strokePatternImage, NativeImage* fillPatternImage);
+    WEBCORE_EXPORT void apply(GraphicsContext&);
 
 private:
-    struct PatternData {
-        RenderingResourceIdentifier tileImageIdentifier;
-        Pattern::Parameters parameters;
-    };
+    WEBCORE_EXPORT SetState(const GraphicsContextStateChange&);
 
-    WEBCORE_EXPORT SetState(const GraphicsContextStateChange&, const PatternData& strokePattern, const PatternData& fillPattern);
-
     GraphicsContextStateChange m_stateChange;
-    PatternData m_strokePattern;
-    PatternData m_fillPattern;
 };
 
 template<class Encoder>
@@ -287,8 +277,7 @@
 
     if (changeFlags.contains(GraphicsContextState::StrokePatternChange)) {
         ASSERT(state.strokePattern);
-        encoder << state.strokePattern->tileImage().renderingResourceIdentifier();
-        encoder << state.strokePattern->parameters();
+        encoder << *state.strokePattern;
     }
 
     if (changeFlags.contains(GraphicsContextState::FillGradientChange)) {
@@ -298,8 +287,7 @@
 
     if (changeFlags.contains(GraphicsContextState::FillPatternChange)) {
         ASSERT(state.fillPattern);
-        encoder << state.fillPattern->tileImage().renderingResourceIdentifier();
-        encoder << state.fillPattern->parameters();
+        encoder << *state.fillPattern;
     }
 
     if (changeFlags.contains(GraphicsContextState::ShadowChange)) {
@@ -363,9 +351,6 @@
     GraphicsContextStateChange stateChange;
     stateChange.m_changeFlags = *changeFlags;
 
-    PatternData strokePattern;
-    PatternData fillPattern;
-
     if (stateChange.m_changeFlags.contains(GraphicsContextState::StrokeGradientChange)) {
         auto strokeGradient = Gradient::decode(decoder);
         if (!strokeGradient)
@@ -375,17 +360,11 @@
     }
 
     if (stateChange.m_changeFlags.contains(GraphicsContextState::StrokePatternChange)) {
-        std::optional<RenderingResourceIdentifier> renderingResourceIdentifier;
-        decoder >> renderingResourceIdentifier;
-        if (!renderingResourceIdentifier)
+        auto strokePattern = Pattern::decode(decoder);
+        if (!strokePattern)
             return std::nullopt;
 
-        std::optional<Pattern::Parameters> parameters;
-        decoder >> parameters;
-        if (!parameters)
-            return std::nullopt;
-
-        strokePattern = { *renderingResourceIdentifier, *parameters };
+        stateChange.m_state.strokePattern = WTFMove(*strokePattern);
     }
 
     if (stateChange.m_changeFlags.contains(GraphicsContextState::FillGradientChange)) {
@@ -397,17 +376,11 @@
     }
 
     if (stateChange.m_changeFlags.contains(GraphicsContextState::FillPatternChange)) {
-        std::optional<RenderingResourceIdentifier> renderingResourceIdentifier;
-        decoder >> renderingResourceIdentifier;
-        if (!renderingResourceIdentifier)
+        auto fillPattern = Pattern::decode(decoder);
+        if (!fillPattern)
             return std::nullopt;
 
-        std::optional<Pattern::Parameters> parameters;
-        decoder >> parameters;
-        if (!parameters)
-            return std::nullopt;
-
-        fillPattern = { *renderingResourceIdentifier, *parameters };
+        stateChange.m_state.fillPattern = WTFMove(*fillPattern);
     }
 
     if (stateChange.m_changeFlags.contains(GraphicsContextState::ShadowChange)) {
@@ -565,7 +538,7 @@
         stateChange.m_state.shadowsIgnoreTransforms = *shadowsIgnoreTransforms;
     }
 
-    return {{ stateChange, strokePattern, fillPattern }};
+    return { { stateChange } };
 }
 
 class SetLineCap {

Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp (288864 => 288865)


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -83,34 +83,37 @@
 
 inline static std::optional<RenderingResourceIdentifier> applySetStateItem(GraphicsContext& context, const ResourceHeap& resourceHeap, ItemHandle item, Replayer::Delegate* delegate)
 {
+    RenderingResourceIdentifier strokePatternImageIdentifier;
+    RenderingResourceIdentifier fillPatternImageIdentifier;
     auto& setStateItem = item.get<SetState>();
 
-    RenderingResourceIdentifier strokePatternRenderingResourceIdentifier;
-    NativeImage* strokePatternImage = nullptr;
-    RenderingResourceIdentifier fillPatternRenderingResourceIdentifier;
-    NativeImage* fillPatternImage = nullptr;
+    if (auto& strokePattern = setStateItem.stateChange().m_state.strokePattern) {
+        strokePatternImageIdentifier = strokePattern->tileImage().imageIdentifier();
+        auto strokePatternImage = resourceHeap.getSourceImage(strokePatternImageIdentifier);
+        if (!strokePatternImage)
+            return strokePatternImageIdentifier;
 
-    if ((strokePatternRenderingResourceIdentifier = setStateItem.strokePatternImageIdentifier())) {
-        strokePatternImage = resourceHeap.getNativeImage(strokePatternRenderingResourceIdentifier);
-        if (!strokePatternImage)
-            return strokePatternRenderingResourceIdentifier;
+        strokePattern->setTileImage(WTFMove(*strokePatternImage));
     }
 
-    if ((fillPatternRenderingResourceIdentifier = setStateItem.fillPatternImageIdentifier())) {
-        fillPatternImage = resourceHeap.getNativeImage(fillPatternRenderingResourceIdentifier);
+    if (auto& fillPattern = setStateItem.stateChange().m_state.fillPattern) {
+        fillPatternImageIdentifier = fillPattern->tileImage().imageIdentifier();
+        auto fillPatternImage = resourceHeap.getSourceImage(fillPatternImageIdentifier);
         if (!fillPatternImage)
-            return fillPatternRenderingResourceIdentifier;
+            return fillPatternImageIdentifier;
+
+        fillPattern->setTileImage(WTFMove(*fillPatternImage));
     }
 
-    setStateItem.apply(context, strokePatternImage, fillPatternImage);
+    setStateItem.apply(context);
 
     if (!delegate)
         return std::nullopt;
 
-    if (strokePatternRenderingResourceIdentifier)
-        delegate->recordResourceUse(strokePatternRenderingResourceIdentifier);
-    if (fillPatternRenderingResourceIdentifier)
-        delegate->recordResourceUse(fillPatternRenderingResourceIdentifier);
+    if (strokePatternImageIdentifier)
+        delegate->recordResourceUse(strokePatternImageIdentifier);
+    if (fillPatternImageIdentifier)
+        delegate->recordResourceUse(fillPatternImageIdentifier);
     return std::nullopt;
 }
 

Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListResourceHeap.h (288864 => 288865)


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListResourceHeap.h	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListResourceHeap.h	2022-02-01 02:57:22 UTC (rev 288865)
@@ -29,6 +29,7 @@
 #include "ImageBuffer.h"
 #include "NativeImage.h"
 #include "RenderingResourceIdentifier.h"
+#include "SourceImage.h"
 #include <wtf/HashMap.h>
 #include <wtf/RefCounted.h>
 
@@ -41,6 +42,7 @@
 
     virtual ImageBuffer* getImageBuffer(RenderingResourceIdentifier) const = 0;
     virtual NativeImage* getNativeImage(RenderingResourceIdentifier) const = 0;
+    virtual std::optional<SourceImage> getSourceImage(RenderingResourceIdentifier) const = 0;
     virtual Font* getFont(RenderingResourceIdentifier) const = 0;
 };
 
@@ -71,6 +73,20 @@
         return get<NativeImage>(renderingResourceIdentifier);
     }
 
+    std::optional<SourceImage> getSourceImage(RenderingResourceIdentifier renderingResourceIdentifier) const final
+    {
+        if (!renderingResourceIdentifier)
+            return std::nullopt;
+
+        if (auto nativeImage = getNativeImage(renderingResourceIdentifier))
+            return { { *nativeImage } };
+
+        if (auto imageBuffer = getImageBuffer(renderingResourceIdentifier))
+            return { { *imageBuffer } };
+
+        return std::nullopt;
+    }
+
     Font* getFont(RenderingResourceIdentifier renderingResourceIdentifier) const final
     {
         return get<Font>(renderingResourceIdentifier);

Modified: trunk/Source/WebCore/platform/graphics/filters/software/FETileSoftwareApplier.cpp (288864 => 288865)


--- trunk/Source/WebCore/platform/graphics/filters/software/FETileSoftwareApplier.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/platform/graphics/filters/software/FETileSoftwareApplier.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -57,14 +57,10 @@
     tileImageContext.translate(-tileRect.location());
     tileImageContext.drawImageBuffer(*inputImage, inputImageRect.location());
 
-    auto patternImage = ImageBuffer::sinkIntoNativeImage(WTFMove(tileImage));
-    if (!patternImage)
-        return false;
-
     AffineTransform patternTransform;
     patternTransform.translate(tileRect.location() - maxResultRect.location());
 
-    auto pattern = Pattern::create(patternImage.releaseNonNull(), { true, true, patternTransform });
+    auto pattern = Pattern::create({ tileImage.releaseNonNull() }, { true, true, patternTransform });
 
     auto& resultContext = resultImage->context();
     resultContext.setFillPattern(WTFMove(pattern));

Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (288864 => 288865)


--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -3335,13 +3335,11 @@
         imageContext.drawText(font, textRun, { textGap, yOffset }, 0);
     }
 
-    auto tileImage = ImageBuffer::sinkIntoNativeImage(WTFMove(imageBuffer));
-
     AffineTransform patternOffsetTransform;
     patternOffsetTransform.translate(contentOffset + description.phase);
     patternOffsetTransform.scale(1 / destContext.scaleFactor());
 
-    return Pattern::create(tileImage.releaseNonNull(), { true, true, patternOffsetTransform});
+    return Pattern::create({ imageBuffer.releaseNonNull() }, { true, true, patternOffsetTransform });
 };
 #endif
 

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp (288864 => 288865)


--- trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -113,10 +113,6 @@
 
     auto tileImageSize = tileImage->logicalSize();
 
-    auto copiedImage = ImageBuffer::sinkIntoNativeImage(WTFMove(tileImage));
-    if (!copiedImage)
-        return nullptr;
-
     // Compute pattern space transformation.
     auto patternData = makeUnique<PatternData>();
     patternData->transform.translate(tileBoundaries.location());
@@ -134,7 +130,7 @@
     }
 
     // Build pattern.
-    patternData->pattern = Pattern::create(copiedImage.releaseNonNull(), { true, true, patternData->transform });
+    patternData->pattern = Pattern::create({ tileImage.releaseNonNull() }, { true, true, patternData->transform });
 
     // Various calls above may trigger invalidations in some fringe cases (ImageBuffer allocation
     // failures in the SVG image cache for example). To avoid having our PatternData deleted by

Modified: trunk/Source/WebKit/ChangeLog (288864 => 288865)


--- trunk/Source/WebKit/ChangeLog	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebKit/ChangeLog	2022-02-01 02:57:22 UTC (rev 288865)
@@ -1,3 +1,27 @@
+2022-01-31  Said Abou-Hallawa  <[email protected]>
+
+        [GPU Process] Pattern should hold SourceImage which can be converted to a NativeImage only when needed
+        https://bugs.webkit.org/show_bug.cgi?id=232411
+        <rdar://problem/84998738>
+
+        Reviewed by Darin Adler.
+
+        Add the helpers QualifiedResourceHeap::getSourceImage() and 
+        RemoteResourceCache::cachedSourceImage() which will be used by
+        RemoteDisplayListRecorder::setState() to replace the 
+        RenderingResourceIdentifier of the pattern's tileImage by an actual
+        SourceImage.
+
+        * GPUProcess/graphics/QualifiedResourceHeap.h:
+        (WebKit::QualifiedResourceHeap::getSourceImage const):
+        * GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
+        (WebKit::RemoteDisplayListRecorder::setState):
+        (WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer):
+        (WebKit::RemoteDisplayListRecorder::setStateWithQualifiedIdentifiers): Deleted.
+        * GPUProcess/graphics/RemoteResourceCache.cpp:
+        (WebKit::RemoteResourceCache::cachedSourceImage const):
+        * GPUProcess/graphics/RemoteResourceCache.h:
+
 2022-01-31  Matt Gilligan  <[email protected]>
 
         [iOS] Don't register undo actions in undoManager overridden by WKWebView client

Modified: trunk/Source/WebKit/GPUProcess/graphics/QualifiedResourceHeap.h (288864 => 288865)


--- trunk/Source/WebKit/GPUProcess/graphics/QualifiedResourceHeap.h	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebKit/GPUProcess/graphics/QualifiedResourceHeap.h	2022-02-01 02:57:22 UTC (rev 288865)
@@ -69,6 +69,11 @@
         return get<WebCore::NativeImage>({ renderingResourceIdentifier, m_webProcessIdentifier });
     }
 
+    std::optional<WebCore::SourceImage> getSourceImage(WebCore::RenderingResourceIdentifier renderingResourceIdentifier) const final
+    {
+        return getSourceImage({ renderingResourceIdentifier, m_webProcessIdentifier });
+    }
+
     WebCore::Font* getFont(WebCore::RenderingResourceIdentifier renderingResourceIdentifier) const final
     {
         return get<WebCore::Font>({ renderingResourceIdentifier, m_webProcessIdentifier });
@@ -83,7 +88,21 @@
     {
         return get<WebCore::NativeImage>(renderingResourceIdentifier);
     }
+    
+    std::optional<WebCore::SourceImage> getSourceImage(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
+    {
+        if (!renderingResourceIdentifier)
+            return std::nullopt;
 
+        if (auto nativeImage = getNativeImage(renderingResourceIdentifier))
+            return { { *nativeImage } };
+
+        if (auto imageBuffer = getImageBuffer(renderingResourceIdentifier))
+            return { { *imageBuffer } };
+
+        return std::nullopt;
+    }
+
     WebCore::Font* getFont(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
     {
         return get<WebCore::Font>(renderingResourceIdentifier);

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp (288864 => 288865)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -116,24 +116,25 @@
 
 void RemoteDisplayListRecorder::setState(DisplayList::SetState&& item)
 {
-    // Immediately turn the RenderingResourceIdentifier (which is error-prone) to a QualifiedRenderingResourceIdentifier,
-    // and use a helper function to make sure that don't accidentally use the RenderingResourceIdentifier (because the helper function can't see it).
-    auto strokePatternImageIdentifier = item.strokePatternImageIdentifier();
-    auto fillPatternImageIdentifier = item.fillPatternImageIdentifier();
-    setStateWithQualifiedIdentifiers(WTFMove(item), { strokePatternImageIdentifier, m_webProcessIdentifier }, { fillPatternImageIdentifier, m_webProcessIdentifier });
-}
+    auto fixPatternTileImage = [&](Pattern* pattern) -> bool {
+        if (!pattern)
+            return true;
+        auto sourceImage = resourceCache().cachedSourceImage({ pattern->tileImage().imageIdentifier(), m_webProcessIdentifier });
+        if (!sourceImage) {
+            ASSERT_NOT_REACHED();
+            return false;
+        }
+        pattern->setTileImage(WTFMove(*sourceImage));
+        return true;
+    };
 
-void RemoteDisplayListRecorder::setStateWithQualifiedIdentifiers(DisplayList::SetState&& item, QualifiedRenderingResourceIdentifier strokePatternImageIdentifier, QualifiedRenderingResourceIdentifier fillPatternImageIdentifier)
-{
-    RefPtr<NativeImage> strokePatternImage;
-    if (strokePatternImageIdentifier)
-        strokePatternImage = resourceCache().cachedNativeImage(strokePatternImageIdentifier);
+    if (!fixPatternTileImage(item.stateChange().m_state.strokePattern.get()))
+        return;
 
-    RefPtr<NativeImage> fillPatternImage;
-    if (fillPatternImageIdentifier)
-        fillPatternImage = resourceCache().cachedNativeImage(fillPatternImageIdentifier);
+    if (!fixPatternTileImage(item.stateChange().m_state.fillPattern.get()))
+        return;
 
-    handleItem(WTFMove(item), strokePatternImage.get(), fillPatternImage.get());
+    handleItem(WTFMove(item));
 }
 
 void RemoteDisplayListRecorder::setLineCap(LineCap lineCap)
@@ -232,21 +233,13 @@
     for (auto& effect : filter->effectsOfType(FilterEffect::Type::FEImage)) {
         auto& feImage = downcast<FEImage>(effect.get());
 
-        auto imageIdentifier = feImage.sourceImage().imageIdentifier();
-        if (!imageIdentifier) {
+        auto sourceImage = resourceCache().cachedSourceImage({ feImage.sourceImage().imageIdentifier(), m_webProcessIdentifier });
+        if (!sourceImage) {
             ASSERT_NOT_REACHED();
             return;
         }
 
-        if (auto nativeImage = resourceCache().cachedNativeImage({ imageIdentifier, m_webProcessIdentifier })) {
-            feImage.setImageSource({ *nativeImage });
-            continue;
-        }
-
-        if (auto imageBuffer = resourceCache().cachedImageBuffer({ imageIdentifier, m_webProcessIdentifier })) {
-            feImage.setImageSource({ *imageBuffer });
-            continue;
-        }
+        feImage.setImageSource(WTFMove(*sourceImage));
     }
 
     FilterResults results;

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp (288864 => 288865)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp	2022-02-01 02:57:22 UTC (rev 288865)
@@ -58,6 +58,11 @@
     return m_resourceHeap.getNativeImage(renderingResourceIdentifier);
 }
 
+std::optional<WebCore::SourceImage> RemoteResourceCache::cachedSourceImage(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
+{
+    return m_resourceHeap.getSourceImage(renderingResourceIdentifier);
+}
+
 void RemoteResourceCache::cacheFont(Ref<Font>&& font, QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
 {
     ASSERT(renderingResourceIdentifier.object() == font->renderingResourceIdentifier());

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h (288864 => 288865)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h	2022-02-01 02:43:09 UTC (rev 288864)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h	2022-02-01 02:57:22 UTC (rev 288865)
@@ -48,6 +48,7 @@
     WebCore::ImageBuffer* cachedImageBuffer(QualifiedRenderingResourceIdentifier) const;
     void cacheNativeImage(Ref<WebCore::NativeImage>&&, QualifiedRenderingResourceIdentifier);
     WebCore::NativeImage* cachedNativeImage(QualifiedRenderingResourceIdentifier) const;
+    std::optional<WebCore::SourceImage> cachedSourceImage(QualifiedRenderingResourceIdentifier) const;
     void cacheFont(Ref<WebCore::Font>&&, QualifiedRenderingResourceIdentifier);
     WebCore::Font* cachedFont(QualifiedRenderingResourceIdentifier) const;
     void deleteAllFonts();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to