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();