Diff
Modified: trunk/Source/WebCore/ChangeLog (283970 => 283971)
--- trunk/Source/WebCore/ChangeLog 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebCore/ChangeLog 2021-10-12 08:02:45 UTC (rev 283971)
@@ -11,6 +11,72 @@
2021-10-11 Myles C. Maxfield <[email protected]>
+ [GPU Process] Unique RenderingResourceIdentifiers Part 8: Consolidate DisplayList::ResourceHeap
+ https://bugs.webkit.org/show_bug.cgi?id=231411
+ <rdar://problem/84013167>
+
+ Reviewed by Simon Fraser.
+
+ Display lists need to be replayed within a context, and that context includes a collection of resources
+ that the display list items might reference. For example, if there's a display list item that says to draw
+ an image, the image needs to be present in the collection.
+
+ We were representing this collection of resources as 3 independent HashMap<RenderingResourceIdentifier, T>s.
+ This is kind of unfortunate, because it means 3 objects are passed around in parallel as arguments to the
+ relevant places which need them. It's more elegant to wrap an object around these 3 HashMaps, to avoid
+ polluting functions' parameter lists.
+
+ Not only that, but the GPU process doesn't want the key to these HashMaps to be RenderingResourceIdentifiers.
+ Instead, the GPU process wants the key to be QualifiedRenderingResourceIdentifiers (see
+ https://bugs.webkit.org/show_bug.cgi?id=217638). Wrapping an object around these HashMaps allows a layer of
+ indirection, where the GPU process can implement the interface of this object, but internally represent the
+ HashMaps using different keys. WebCore shouldn't know about QualifiedRenderingResourceIdentifiers, so this
+ layer of indirection is necessary for that goal.
+
+ No new tests because there is no behavior change.
+
+ * Headers.cmake:
+ * WebCore.xcodeproj/project.pbxproj:
+ * platform/graphics/Font.h:
+ * platform/graphics/ImageBuffer.h:
+ * platform/graphics/NativeImage.h:
+ * platform/graphics/displaylists/DisplayList.cpp:
+ (WebCore::DisplayList::DisplayList::DisplayList):
+ (WebCore::DisplayList::DisplayList::operator=):
+ (WebCore::DisplayList::DisplayList::clear):
+ (WebCore::DisplayList::m_nativeImages): Deleted.
+ * platform/graphics/displaylists/DisplayList.h:
+ (WebCore::DisplayList::DisplayList::resourceHeap const):
+ (WebCore::DisplayList::DisplayList::cacheImageBuffer):
+ (WebCore::DisplayList::DisplayList::cacheNativeImage):
+ (WebCore::DisplayList::DisplayList::cacheFont):
+ (WebCore::DisplayList::DisplayList::imageBuffers const): Deleted.
+ (WebCore::DisplayList::DisplayList::nativeImages const): Deleted.
+ (WebCore::DisplayList::DisplayList::fonts const): Deleted.
+ * platform/graphics/displaylists/DisplayListReplayer.cpp:
+ (WebCore::DisplayList::Replayer::Replayer):
+ (WebCore::DisplayList::applyImageBufferItem):
+ (WebCore::DisplayList::applyNativeImageItem):
+ (WebCore::DisplayList::applySetStateItem):
+ (WebCore::DisplayList::applyFontItem):
+ (WebCore::DisplayList::Replayer::applyItem):
+ * platform/graphics/displaylists/DisplayListReplayer.h:
+ * platform/graphics/displaylists/DisplayListResourceHeap.h: Added.
+ (WebCore::DisplayList::ResourceHeap::add):
+ (WebCore::DisplayList::ResourceHeap::getImageBuffer const):
+ (WebCore::DisplayList::ResourceHeap::getNativeImage const):
+ (WebCore::DisplayList::ResourceHeap::getFont const):
+ (WebCore::DisplayList::ResourceHeap::hasImageBuffer const):
+ (WebCore::DisplayList::ResourceHeap::hasNativeImage const):
+ (WebCore::DisplayList::ResourceHeap::hasFont const):
+ (WebCore::DisplayList::ResourceHeap::removeImageBuffer):
+ (WebCore::DisplayList::ResourceHeap::removeNativeImage):
+ (WebCore::DisplayList::ResourceHeap::removeFont):
+ (WebCore::DisplayList::ResourceHeap::clear):
+ (WebCore::DisplayList::ResourceHeap::deleteAllFonts):
+
+2021-10-11 Myles C. Maxfield <[email protected]>
+
[GPU Process] Unique RenderingResourceIdentifiers Part 6: Uniquify more of RemoteDisplayListRecorder at entry points
https://bugs.webkit.org/show_bug.cgi?id=231552
<rdar://problem/84130587>
Modified: trunk/Source/WebCore/Headers.cmake (283970 => 283971)
--- trunk/Source/WebCore/Headers.cmake 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebCore/Headers.cmake 2021-10-12 08:02:45 UTC (rev 283971)
@@ -1404,6 +1404,7 @@
platform/graphics/displaylists/DisplayListRecorder.h
platform/graphics/displaylists/DisplayListRecorderImpl.h
platform/graphics/displaylists/DisplayListReplayer.h
+ platform/graphics/displaylists/DisplayListResourceHeap.h
platform/graphics/displaylists/InMemoryDisplayList.h
platform/graphics/cv/ImageTransferSessionVT.h
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (283970 => 283971)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2021-10-12 08:02:45 UTC (rev 283971)
@@ -650,6 +650,7 @@
1CAF34820A6C405200ABE06E /* WebScriptObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1CAF347F0A6C405200ABE06E /* WebScriptObject.mm */; };
1CAF34830A6C405200ABE06E /* WebScriptObjectPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CAF34800A6C405200ABE06E /* WebScriptObjectPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
1CAF56DB25301AC80017B472 /* DrawGlyphsRecorder.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CAF56D8253014570017B472 /* DrawGlyphsRecorder.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 1CBF900F270FF8F6000C457D /* DisplayListResourceHeap.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CBF900D270FF8F6000C457D /* DisplayListResourceHeap.h */; settings = {ATTRIBUTES = (Private, ); }; };
1CC54AFE270F96AE005BF8BE /* ProcessQualified.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CC54AFB270F92DA005BF8BE /* ProcessQualified.h */; settings = {ATTRIBUTES = (Private, ); }; };
1CCD81502231F83E0065FC2B /* WebCoreResourceHandleAsOperationQueueDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = E152551416FD234F003D7ADB /* WebCoreResourceHandleAsOperationQueueDelegate.mm */; };
1CCDF5BE1990332400BCEBAD /* SVGToOTFFontConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CCDF5BC1990332400BCEBAD /* SVGToOTFFontConversion.h */; };
@@ -7073,6 +7074,7 @@
1CAF56DE2530245A0017B472 /* DrawGlyphsRecorderCoreText.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DrawGlyphsRecorderCoreText.cpp; sourceTree = "<group>"; };
1CB6B4F8217B83930093B9CD /* TextDecorationThickness.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TextDecorationThickness.h; sourceTree = "<group>"; };
1CB6B4FB217B83940093B9CD /* TextUnderlineOffset.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TextUnderlineOffset.h; sourceTree = "<group>"; };
+ 1CBF900D270FF8F6000C457D /* DisplayListResourceHeap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DisplayListResourceHeap.h; sourceTree = "<group>"; };
1CC54AFB270F92DA005BF8BE /* ProcessQualified.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ProcessQualified.h; sourceTree = "<group>"; };
1CCDF5BB1990332400BCEBAD /* SVGToOTFFontConversion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGToOTFFontConversion.cpp; sourceTree = "<group>"; };
1CCDF5BC1990332400BCEBAD /* SVGToOTFFontConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGToOTFFontConversion.h; sourceTree = "<group>"; };
@@ -18280,6 +18282,7 @@
0FE5FBCF1C3DD51E0007A2CA /* DisplayListRecorderImpl.h */,
0FE5FBD01C3DD51E0007A2CA /* DisplayListReplayer.cpp */,
0FE5FBD11C3DD51E0007A2CA /* DisplayListReplayer.h */,
+ 1CBF900D270FF8F6000C457D /* DisplayListResourceHeap.h */,
1CE8863E26105A5F000C816C /* InMemoryDisplayList.cpp */,
1CE8863F26105A5F000C816C /* InMemoryDisplayList.h */,
);
@@ -32457,6 +32460,7 @@
F429950F270E75000032298B /* DisplayListRecorder.h in Headers */,
0FE5FBD71C3DD51E0007A2CA /* DisplayListRecorderImpl.h in Headers */,
0FE5FBD91C3DD51E0007A2CA /* DisplayListReplayer.h in Headers */,
+ 1CBF900F270FF8F6000C457D /* DisplayListResourceHeap.h in Headers */,
49AF2D6914435D050016A784 /* DisplayRefreshMonitor.h in Headers */,
2D29ECC6192ECC8300984B78 /* DisplayRefreshMonitorClient.h in Headers */,
0FBB5FBE260991D20054572C /* DisplayRefreshMonitorFactory.h in Headers */,
Modified: trunk/Source/WebCore/platform/graphics/Font.h (283970 => 283971)
--- trunk/Source/WebCore/platform/graphics/Font.h 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebCore/platform/graphics/Font.h 2021-10-12 08:02:45 UTC (rev 283971)
@@ -391,8 +391,6 @@
return width;
}
-using FontRenderingResourceMap = HashMap<RenderingResourceIdentifier, Ref<Font>>;
-
} // namespace WebCore
namespace WTF {
Modified: trunk/Source/WebCore/platform/graphics/ImageBuffer.h (283970 => 283971)
--- trunk/Source/WebCore/platform/graphics/ImageBuffer.h 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebCore/platform/graphics/ImageBuffer.h 2021-10-12 08:02:45 UTC (rev 283971)
@@ -142,6 +142,4 @@
virtual void drawConsuming(GraphicsContext&, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions&) = 0;
};
-using ImageBufferHashMap = HashMap<RenderingResourceIdentifier, Ref<ImageBuffer>>;
-
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/graphics/NativeImage.h (283970 => 283971)
--- trunk/Source/WebCore/platform/graphics/NativeImage.h 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebCore/platform/graphics/NativeImage.h 2021-10-12 08:02:45 UTC (rev 283971)
@@ -75,6 +75,4 @@
RenderingResourceIdentifier m_renderingResourceIdentifier;
};
-using NativeImageHashMap = HashMap<RenderingResourceIdentifier, Ref<NativeImage>>;
-
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayList.cpp (283970 => 283971)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayList.cpp 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayList.cpp 2021-10-12 08:02:45 UTC (rev 283971)
@@ -52,8 +52,7 @@
#endif
DisplayList::DisplayList(DisplayList&& other)
- : m_imageBuffers(std::exchange(other.m_imageBuffers, { }))
- , m_nativeImages(std::exchange(other.m_nativeImages, { }))
+ : m_resourceHeap(std::exchange(other.m_resourceHeap, { }))
, m_items(std::exchange(other.m_items, nullptr))
, m_drawingItemExtents(std::exchange(other.m_drawingItemExtents, { }))
{
@@ -69,8 +68,7 @@
DisplayList& DisplayList::operator=(DisplayList&& other)
{
- m_imageBuffers = std::exchange(other.m_imageBuffers, { });
- m_nativeImages = std::exchange(other.m_nativeImages, { });
+ m_resourceHeap = std::exchange(other.m_resourceHeap, { });
m_items = std::exchange(other.m_items, nullptr);
m_drawingItemExtents = std::exchange(other.m_drawingItemExtents, { });
return *this;
@@ -81,8 +79,7 @@
if (m_items)
m_items->clear();
m_drawingItemExtents.clear();
- m_imageBuffers.clear();
- m_nativeImages.clear();
+ m_resourceHeap.clear();
}
bool DisplayList::shouldDumpForFlags(AsTextFlags flags, ItemHandle item)
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayList.h (283970 => 283971)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayList.h 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayList.h 2021-10-12 08:02:45 UTC (rev 283971)
@@ -27,6 +27,7 @@
#include "DisplayListItemBuffer.h"
#include "DisplayListItemType.h"
+#include "DisplayListResourceHeap.h"
#include "FloatRect.h"
#include "Font.h"
#include "GraphicsContext.h"
@@ -73,9 +74,7 @@
String asText(AsTextFlags) const;
- const ImageBufferHashMap& imageBuffers() const { return m_imageBuffers; }
- const NativeImageHashMap& nativeImages() const { return m_nativeImages; }
- const FontRenderingResourceMap& fonts() const { return m_fonts; }
+ const ResourceHeap& resourceHeap() const { return m_resourceHeap; }
WEBCORE_EXPORT void setItemBufferReadingClient(ItemBufferReadingClient*);
WEBCORE_EXPORT void setItemBufferWritingClient(ItemBufferWritingClient*);
@@ -113,30 +112,22 @@
void cacheImageBuffer(WebCore::ImageBuffer& imageBuffer)
{
- m_imageBuffers.ensure(imageBuffer.renderingResourceIdentifier(), [&]() {
- return Ref { imageBuffer };
- });
+ m_resourceHeap.add(imageBuffer.renderingResourceIdentifier(), Ref { imageBuffer });
}
void cacheNativeImage(NativeImage& image)
{
- m_nativeImages.ensure(image.renderingResourceIdentifier(), [&]() {
- return Ref { image };
- });
+ m_resourceHeap.add(image.renderingResourceIdentifier(), Ref { image });
}
void cacheFont(Font& font)
{
- m_fonts.ensure(font.renderingResourceIdentifier(), [&]() {
- return Ref { font };
- });
+ m_resourceHeap.add(font.renderingResourceIdentifier(), Ref { font });
}
static bool shouldDumpForFlags(AsTextFlags, ItemHandle);
- ImageBufferHashMap m_imageBuffers;
- NativeImageHashMap m_nativeImages;
- FontRenderingResourceMap m_fonts;
+ ResourceHeap m_resourceHeap;
std::unique_ptr<ItemBuffer> m_items;
Vector<std::optional<FloatRect>> m_drawingItemExtents;
bool m_tracksDrawingItemExtents { true };
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp (283970 => 283971)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp 2021-10-12 08:02:45 UTC (rev 283971)
@@ -28,6 +28,7 @@
#include "DisplayListItems.h"
#include "DisplayListIterator.h"
+#include "DisplayListResourceHeap.h"
#include "GraphicsContext.h"
#include "InMemoryDisplayList.h"
#include "Logging.h"
@@ -36,13 +37,11 @@
namespace WebCore {
namespace DisplayList {
-Replayer::Replayer(GraphicsContext& context, const DisplayList& displayList, const ImageBufferHashMap* imageBuffers, const NativeImageHashMap* nativeImages, const FontRenderingResourceMap* fonts, ImageBuffer* maskImageBuffer, Delegate* delegate)
+Replayer::Replayer(GraphicsContext& context, const DisplayList& displayList, const ResourceHeap* resourceHeap, ImageBuffer* maskImageBuffer, Delegate* delegate)
: m_context(context)
, m_maskImageBuffer(maskImageBuffer)
, m_displayList(displayList)
- , m_imageBuffers(imageBuffers ? *imageBuffers : m_displayList.imageBuffers())
- , m_nativeImages(nativeImages ? *nativeImages : m_displayList.nativeImages())
- , m_fonts(fonts ? *fonts : m_displayList.fonts())
+ , m_resourceHeap(resourceHeap ? *resourceHeap : m_displayList.resourceHeap())
, m_delegate(delegate)
{
}
@@ -55,11 +54,11 @@
}
template<class T>
-inline static std::optional<RenderingResourceIdentifier> applyImageBufferItem(GraphicsContext& context, const ImageBufferHashMap& imageBuffers, ItemHandle item, Replayer::Delegate* delegate)
+inline static std::optional<RenderingResourceIdentifier> applyImageBufferItem(GraphicsContext& context, const ResourceHeap& resourceHeap, ItemHandle item, Replayer::Delegate* delegate)
{
auto& imageBufferItem = item.get<T>();
auto resourceIdentifier = imageBufferItem.imageBufferIdentifier();
- if (auto* imageBuffer = imageBuffers.get(resourceIdentifier)) {
+ if (auto* imageBuffer = resourceHeap.getImageBuffer(resourceIdentifier)) {
imageBufferItem.apply(context, *imageBuffer);
if (delegate)
delegate->recordResourceUse(resourceIdentifier);
@@ -69,11 +68,11 @@
}
template<class T>
-inline static std::optional<RenderingResourceIdentifier> applyNativeImageItem(GraphicsContext& context, const NativeImageHashMap& nativeImages, ItemHandle item, Replayer::Delegate* delegate)
+inline static std::optional<RenderingResourceIdentifier> applyNativeImageItem(GraphicsContext& context, const ResourceHeap& resourceHeap, ItemHandle item, Replayer::Delegate* delegate)
{
auto& nativeImageItem = item.get<T>();
auto resourceIdentifier = nativeImageItem.imageIdentifier();
- if (auto* image = nativeImages.get(resourceIdentifier)) {
+ if (auto* image = resourceHeap.getNativeImage(resourceIdentifier)) {
nativeImageItem.apply(context, *image);
if (delegate)
delegate->recordResourceUse(resourceIdentifier);
@@ -82,7 +81,7 @@
return resourceIdentifier;
}
-inline static std::optional<RenderingResourceIdentifier> applySetStateItem(GraphicsContext& context, const NativeImageHashMap& nativeImages, ItemHandle item, Replayer::Delegate* delegate)
+inline static std::optional<RenderingResourceIdentifier> applySetStateItem(GraphicsContext& context, const ResourceHeap& resourceHeap, ItemHandle item, Replayer::Delegate* delegate)
{
auto& setStateItem = item.get<SetState>();
@@ -92,13 +91,13 @@
NativeImage* fillPatternImage = nullptr;
if ((strokePatternRenderingResourceIdentifier = setStateItem.strokePatternImageIdentifier())) {
- strokePatternImage = nativeImages.get(strokePatternRenderingResourceIdentifier);
+ strokePatternImage = resourceHeap.getNativeImage(strokePatternRenderingResourceIdentifier);
if (!strokePatternImage)
return strokePatternRenderingResourceIdentifier;
}
if ((fillPatternRenderingResourceIdentifier = setStateItem.fillPatternImageIdentifier())) {
- fillPatternImage = nativeImages.get(fillPatternRenderingResourceIdentifier);
+ fillPatternImage = resourceHeap.getNativeImage(fillPatternRenderingResourceIdentifier);
if (!fillPatternImage)
return fillPatternRenderingResourceIdentifier;
}
@@ -116,11 +115,11 @@
}
template<class T>
-inline static std::optional<RenderingResourceIdentifier> applyFontItem(GraphicsContext& context, const FontRenderingResourceMap& fonts, ItemHandle item, Replayer::Delegate* delegate)
+inline static std::optional<RenderingResourceIdentifier> applyFontItem(GraphicsContext& context, const ResourceHeap& resourceHeap, ItemHandle item, Replayer::Delegate* delegate)
{
auto& fontItem = item.get<T>();
auto resourceIdentifier = fontItem.fontIdentifier();
- if (auto* font = fonts.get(resourceIdentifier)) {
+ if (auto* font = resourceHeap.getFont(resourceIdentifier)) {
fontItem.apply(context, *font);
if (delegate)
delegate->recordResourceUse(resourceIdentifier);
@@ -135,37 +134,37 @@
return { std::nullopt, std::nullopt };
if (item.is<DrawImageBuffer>()) {
- if (auto missingCachedResourceIdentifier = applyImageBufferItem<DrawImageBuffer>(context(), m_imageBuffers, item, m_delegate))
+ if (auto missingCachedResourceIdentifier = applyImageBufferItem<DrawImageBuffer>(context(), m_resourceHeap, item, m_delegate))
return { StopReplayReason::MissingCachedResource, WTFMove(missingCachedResourceIdentifier) };
return { std::nullopt, std::nullopt };
}
if (item.is<ClipToImageBuffer>()) {
- if (auto missingCachedResourceIdentifier = applyImageBufferItem<ClipToImageBuffer>(context(), m_imageBuffers, item, m_delegate))
+ if (auto missingCachedResourceIdentifier = applyImageBufferItem<ClipToImageBuffer>(context(), m_resourceHeap, item, m_delegate))
return { StopReplayReason::MissingCachedResource, WTFMove(missingCachedResourceIdentifier) };
return { std::nullopt, std::nullopt };
}
if (item.is<DrawNativeImage>()) {
- if (auto missingCachedResourceIdentifier = applyNativeImageItem<DrawNativeImage>(context(), m_nativeImages, item, m_delegate))
+ if (auto missingCachedResourceIdentifier = applyNativeImageItem<DrawNativeImage>(context(), m_resourceHeap, item, m_delegate))
return { StopReplayReason::MissingCachedResource, WTFMove(missingCachedResourceIdentifier) };
return { std::nullopt, std::nullopt };
}
if (item.is<DrawGlyphs>()) {
- if (auto missingCachedResourceIdentifier = applyFontItem<DrawGlyphs>(context(), m_fonts, item, m_delegate))
+ if (auto missingCachedResourceIdentifier = applyFontItem<DrawGlyphs>(context(), m_resourceHeap, item, m_delegate))
return { StopReplayReason::MissingCachedResource, WTFMove(missingCachedResourceIdentifier) };
return { std::nullopt, std::nullopt };
}
if (item.is<DrawPattern>()) {
- if (auto missingCachedResourceIdentifier = applyNativeImageItem<DrawPattern>(context(), m_nativeImages, item, m_delegate))
+ if (auto missingCachedResourceIdentifier = applyNativeImageItem<DrawPattern>(context(), m_resourceHeap, item, m_delegate))
return { StopReplayReason::MissingCachedResource, WTFMove(missingCachedResourceIdentifier) };
return { std::nullopt, std::nullopt };
}
if (item.is<SetState>()) {
- if (auto missingCachedResourceIdentifier = applySetStateItem(context(), m_nativeImages, item, m_delegate))
+ if (auto missingCachedResourceIdentifier = applySetStateItem(context(), m_resourceHeap, item, m_delegate))
return { StopReplayReason::MissingCachedResource, WTFMove(missingCachedResourceIdentifier) };
return { std::nullopt, std::nullopt };
}
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.h (283970 => 283971)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.h 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.h 2021-10-12 08:02:45 UTC (rev 283971)
@@ -37,6 +37,8 @@
namespace DisplayList {
+class ResourceHeap;
+
enum class StopReplayReason : uint8_t {
ReplayedAllItems,
MissingCachedResource,
@@ -57,7 +59,7 @@
WTF_MAKE_NONCOPYABLE(Replayer);
public:
class Delegate;
- WEBCORE_EXPORT Replayer(GraphicsContext&, const DisplayList&, const ImageBufferHashMap* = nullptr, const NativeImageHashMap* = nullptr, const FontRenderingResourceMap* = nullptr, WebCore::ImageBuffer* maskImageBuffer = nullptr, Delegate* = nullptr);
+ WEBCORE_EXPORT Replayer(GraphicsContext&, const DisplayList&, const ResourceHeap* = nullptr, WebCore::ImageBuffer* maskImageBuffer = nullptr, Delegate* = nullptr);
WEBCORE_EXPORT ~Replayer();
WEBCORE_EXPORT ReplayResult replay(const FloatRect& initialClip = { }, bool trackReplayList = false);
@@ -78,9 +80,7 @@
GraphicsContext& m_context;
RefPtr<WebCore::ImageBuffer> m_maskImageBuffer;
const DisplayList& m_displayList;
- const ImageBufferHashMap& m_imageBuffers;
- const NativeImageHashMap& m_nativeImages;
- const FontRenderingResourceMap& m_fonts;
+ const ResourceHeap& m_resourceHeap;
Delegate* m_delegate;
};
Added: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListResourceHeap.h (0 => 283971)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListResourceHeap.h (rev 0)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListResourceHeap.h 2021-10-12 08:02:45 UTC (rev 283971)
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "Font.h"
+#include "ImageBuffer.h"
+#include "NativeImage.h"
+#include "RenderingResourceIdentifier.h"
+#include <wtf/HashMap.h>
+#include <wtf/RefCounted.h>
+
+namespace WebCore {
+namespace DisplayList {
+
+class ResourceHeap {
+public:
+ void add(RenderingResourceIdentifier renderingResourceIdentifier, Ref<ImageBuffer>&& imageBuffer)
+ {
+ if (m_resources.add(renderingResourceIdentifier, RefPtr<ImageBuffer>(WTFMove(imageBuffer))).isNewEntry)
+ ++m_imageBufferCount;
+ }
+
+ void add(RenderingResourceIdentifier renderingResourceIdentifier, Ref<NativeImage>&& image)
+ {
+ if (m_resources.add(renderingResourceIdentifier, RefPtr<NativeImage>(WTFMove(image))).isNewEntry)
+ ++m_nativeImageCount;
+ }
+
+ void add(RenderingResourceIdentifier renderingResourceIdentifier, Ref<Font>&& font)
+ {
+ if (m_resources.add(renderingResourceIdentifier, RefPtr<Font>(WTFMove(font))).isNewEntry)
+ ++m_fontCount;
+ }
+
+ ImageBuffer* getImageBuffer(RenderingResourceIdentifier renderingResourceIdentifier) const
+ {
+ return get<ImageBuffer>(renderingResourceIdentifier);
+ }
+
+ NativeImage* getNativeImage(RenderingResourceIdentifier renderingResourceIdentifier) const
+ {
+ return get<NativeImage>(renderingResourceIdentifier);
+ }
+
+ Font* getFont(RenderingResourceIdentifier renderingResourceIdentifier) const
+ {
+ return get<Font>(renderingResourceIdentifier);
+ }
+
+ bool hasImageBuffer() const
+ {
+ return m_imageBufferCount;
+ }
+
+ bool hasNativeImage() const
+ {
+ return m_nativeImageCount;
+ }
+
+ bool hasFont() const
+ {
+ return m_fontCount;
+ }
+
+ bool removeImageBuffer(RenderingResourceIdentifier renderingResourceIdentifier)
+ {
+ return remove<ImageBuffer>(renderingResourceIdentifier, m_imageBufferCount);
+ }
+
+ bool removeNativeImage(RenderingResourceIdentifier renderingResourceIdentifier)
+ {
+ return remove<NativeImage>(renderingResourceIdentifier, m_nativeImageCount);
+ }
+
+ bool removeFont(RenderingResourceIdentifier renderingResourceIdentifier)
+ {
+ return remove<Font>(renderingResourceIdentifier, m_fontCount);
+ }
+
+ void clear()
+ {
+ m_resources.clear();
+ m_imageBufferCount = 0;
+ m_nativeImageCount = 0;
+ m_fontCount = 0;
+ }
+
+ void deleteAllFonts()
+ {
+ m_resources.removeIf([] (const auto& resource) {
+ return WTF::holds_alternative<RefPtr<Font>>(resource.value);
+ });
+ m_fontCount = 0;
+ }
+
+private:
+ template <typename T>
+ T* get(RenderingResourceIdentifier renderingResourceIdentifier) const
+ {
+ auto iterator = m_resources.find(renderingResourceIdentifier);
+ if (iterator == m_resources.end())
+ return nullptr;
+ if (!WTF::holds_alternative<RefPtr<T>>(iterator->value))
+ return nullptr;
+ return WTF::get<RefPtr<T>>(iterator->value).get();
+ }
+
+ template <typename T>
+ bool remove(RenderingResourceIdentifier renderingResourceIdentifier, unsigned& counter)
+ {
+ auto iterator = m_resources.find(renderingResourceIdentifier);
+ if (iterator == m_resources.end())
+ return false;
+ if (!WTF::holds_alternative<RefPtr<T>>(iterator->value))
+ return false;
+ auto result = m_resources.remove(iterator);
+ ASSERT(result);
+ --counter;
+ return result;
+ }
+
+ using Resource = Variant<RefPtr<ImageBuffer>, RefPtr<NativeImage>, RefPtr<Font>>;
+ HashMap<RenderingResourceIdentifier, Resource> m_resources;
+ unsigned m_imageBufferCount { 0 };
+ unsigned m_nativeImageCount { 0 };
+ unsigned m_fontCount { 0 };
+};
+
+}
+}
Property changes on: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListResourceHeap.h
___________________________________________________________________
Added: svn:eol-style
+native
\ No newline at end of property
Added: svn:keywords
+Author Date Id Rev URL
\ No newline at end of property
Modified: trunk/Source/WebKit/ChangeLog (283970 => 283971)
--- trunk/Source/WebKit/ChangeLog 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebKit/ChangeLog 2021-10-12 08:02:45 UTC (rev 283971)
@@ -1,5 +1,32 @@
2021-10-11 Myles C. Maxfield <[email protected]>
+ [GPU Process] Unique RenderingResourceIdentifiers Part 8: Consolidate DisplayList::ResourceHeap
+ https://bugs.webkit.org/show_bug.cgi?id=231411
+ <rdar://problem/84013167>
+
+ Reviewed by Simon Fraser.
+
+ * GPUProcess/graphics/RemoteRenderingBackend.cpp:
+ (WebKit::RemoteRenderingBackend::submit):
+ * GPUProcess/graphics/RemoteResourceCache.cpp:
+ (WebKit::RemoteResourceCache::RemoteResourceCache):
+ (WebKit::RemoteResourceCache::cacheImageBuffer):
+ (WebKit::RemoteResourceCache::cachedImageBuffer const):
+ (WebKit::RemoteResourceCache::cacheNativeImage):
+ (WebKit::RemoteResourceCache::cachedNativeImage const):
+ (WebKit::RemoteResourceCache::cacheFont):
+ (WebKit::RemoteResourceCache::cachedFont const):
+ (WebKit::RemoteResourceCache::deleteAllFonts):
+ (WebKit::RemoteResourceCache::maybeRemoveResource):
+ (WebKit::RemoteResourceCache::updateHasActiveDrawables):
+ * GPUProcess/graphics/RemoteResourceCache.h:
+ (WebKit::RemoteResourceCache::resourceHeap const):
+ (WebKit::RemoteResourceCache::imageBuffers const): Deleted.
+ (WebKit::RemoteResourceCache::nativeImages const): Deleted.
+ (WebKit::RemoteResourceCache::fonts const): Deleted.
+
+2021-10-11 Myles C. Maxfield <[email protected]>
+
[GPU Process] Unique RenderingResourceIdentifiers Part 5: Migrate RemoteResourceCache to QualifiedRenderingResourceIdentifier
https://bugs.webkit.org/show_bug.cgi?id=231407
<rdar://problem/84010479>
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp (283970 => 283971)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp 2021-10-12 08:02:45 UTC (rev 283971)
@@ -238,9 +238,7 @@
return WebCore::DisplayList::Replayer {
destination.context(),
displayList,
- &remoteResourceCache().imageBuffers(),
- &remoteResourceCache().nativeImages(),
- &remoteResourceCache().fonts(),
+ &remoteResourceCache().resourceHeap(),
m_currentMaskImageBuffer.get(),
&replayerDelegate
}.replay();
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp (283970 => 283971)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp 2021-10-12 08:02:45 UTC (rev 283971)
@@ -38,9 +38,7 @@
RemoteResourceCache::RemoteResourceCache(RemoteResourceCache&& other)
: m_webProcessIdentifier(other.m_webProcessIdentifier)
- , m_imageBuffers(WTFMove(other.m_imageBuffers))
- , m_nativeImages(WTFMove(other.m_nativeImages))
- , m_fonts(WTFMove(other.m_fonts))
+ , m_resourceHeap(WTFMove(other.m_resourceHeap))
, m_resourceUseCounters(WTFMove(other.m_resourceUseCounters))
{
updateHasActiveDrawables();
@@ -50,7 +48,7 @@
{
ASSERT(renderingResourceIdentifier.object() == imageBuffer->renderingResourceIdentifier());
ASSERT(renderingResourceIdentifier.processIdentifier() == m_webProcessIdentifier);
- m_imageBuffers.add(renderingResourceIdentifier.object(), WTFMove(imageBuffer));
+ m_resourceHeap.add(renderingResourceIdentifier.object(), WTFMove(imageBuffer));
updateHasActiveDrawables();
ensureResourceUseCounter(renderingResourceIdentifier);
@@ -59,7 +57,7 @@
ImageBuffer* RemoteResourceCache::cachedImageBuffer(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
{
ASSERT(renderingResourceIdentifier.processIdentifier() == m_webProcessIdentifier);
- return m_imageBuffers.get(renderingResourceIdentifier.object());
+ return m_resourceHeap.getImageBuffer(renderingResourceIdentifier.object());
}
void RemoteResourceCache::cacheNativeImage(Ref<NativeImage>&& image, QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
@@ -66,7 +64,7 @@
{
ASSERT(renderingResourceIdentifier.object() == image->renderingResourceIdentifier());
ASSERT(renderingResourceIdentifier.processIdentifier() == m_webProcessIdentifier);
- m_nativeImages.add(renderingResourceIdentifier.object(), WTFMove(image));
+ m_resourceHeap.add(renderingResourceIdentifier.object(), WTFMove(image));
updateHasActiveDrawables();
ensureResourceUseCounter(renderingResourceIdentifier);
@@ -75,7 +73,7 @@
NativeImage* RemoteResourceCache::cachedNativeImage(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
{
ASSERT(renderingResourceIdentifier.processIdentifier() == m_webProcessIdentifier);
- return m_nativeImages.get(renderingResourceIdentifier.object());
+ return m_resourceHeap.getNativeImage(renderingResourceIdentifier.object());
}
void RemoteResourceCache::cacheFont(Ref<Font>&& font, QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
@@ -82,7 +80,7 @@
{
ASSERT(renderingResourceIdentifier.object() == font->renderingResourceIdentifier());
ASSERT(renderingResourceIdentifier.processIdentifier() == m_webProcessIdentifier);
- m_fonts.add(renderingResourceIdentifier.object(), WTFMove(font));
+ m_resourceHeap.add(renderingResourceIdentifier.object(), WTFMove(font));
ensureResourceUseCounter(renderingResourceIdentifier);
}
@@ -89,7 +87,7 @@
Font* RemoteResourceCache::cachedFont(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
{
- return m_fonts.get(renderingResourceIdentifier.object());
+ return m_resourceHeap.getFont(renderingResourceIdentifier.object());
}
void RemoteResourceCache::ensureResourceUseCounter(QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
@@ -105,7 +103,7 @@
void RemoteResourceCache::deleteAllFonts()
{
- m_fonts.clear();
+ m_resourceHeap.deleteAllFonts();
}
bool RemoteResourceCache::maybeRemoveResource(QualifiedRenderingResourceIdentifier renderingResourceIdentifier, ResourceUseCountersMap::iterator& iterator)
@@ -149,11 +147,12 @@
m_resourceUseCounters.remove(iterator);
- if (m_imageBuffers.remove(renderingResourceIdentifier.object()) || m_nativeImages.remove(renderingResourceIdentifier.object())) {
+ if (m_resourceHeap.removeImageBuffer(renderingResourceIdentifier.object())
+ || m_resourceHeap.removeNativeImage(renderingResourceIdentifier.object())) {
updateHasActiveDrawables();
return true;
}
- if (m_fonts.remove(renderingResourceIdentifier.object()))
+ if (m_resourceHeap.removeFont(renderingResourceIdentifier.object()))
return true;
// Caching the remote resource should have happened before releasing it.
@@ -185,7 +184,7 @@
void RemoteResourceCache::updateHasActiveDrawables()
{
- m_hasActiveDrawables = !m_imageBuffers.isEmpty() || !m_nativeImages.isEmpty();
+ m_hasActiveDrawables = m_resourceHeap.hasImageBuffer() || m_resourceHeap.hasNativeImage();
}
} // namespace WebKit
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h (283970 => 283971)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h 2021-10-12 08:02:45 UTC (rev 283971)
@@ -54,9 +54,7 @@
bool releaseRemoteResource(QualifiedRenderingResourceIdentifier, uint64_t useCount);
void recordResourceUse(QualifiedRenderingResourceIdentifier);
- const WebCore::ImageBufferHashMap& imageBuffers() const { return m_imageBuffers; }
- const WebCore::NativeImageHashMap& nativeImages() const { return m_nativeImages; }
- const WebCore::FontRenderingResourceMap& fonts() const { return m_fonts; }
+ const WebCore::DisplayList::ResourceHeap& resourceHeap() const { return m_resourceHeap; }
bool hasActiveDrawables() const { return m_hasActiveDrawables; }
@@ -89,9 +87,7 @@
WebCore::ProcessIdentifier m_webProcessIdentifier;
- WebCore::ImageBufferHashMap m_imageBuffers;
- WebCore::NativeImageHashMap m_nativeImages;
- WebCore::FontRenderingResourceMap m_fonts;
+ WebCore::DisplayList::ResourceHeap m_resourceHeap;
std::atomic<bool> m_hasActiveDrawables { false };
ResourceUseCountersMap m_resourceUseCounters;
Modified: trunk/Tools/ChangeLog (283970 => 283971)
--- trunk/Tools/ChangeLog 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Tools/ChangeLog 2021-10-12 08:02:45 UTC (rev 283971)
@@ -1,3 +1,14 @@
+2021-10-11 Myles C. Maxfield <[email protected]>
+
+ [GPU Process] Unique RenderingResourceIdentifiers Part 8: Consolidate DisplayList::ResourceHeap
+ https://bugs.webkit.org/show_bug.cgi?id=231411
+ <rdar://problem/84013167>
+
+ Reviewed by Simon Fraser.
+
+ * TestWebKitAPI/Tests/WebCore/cg/DisplayListTestsCG.cpp:
+ (TestWebKitAPI::TEST):
+
2021-10-11 Darin Adler <[email protected]>
Slightly better idiom for ARC debug autorelease workaround
Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/cg/DisplayListTestsCG.cpp (283970 => 283971)
--- trunk/Tools/TestWebKitAPI/Tests/WebCore/cg/DisplayListTestsCG.cpp 2021-10-12 06:32:55 UTC (rev 283970)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/cg/DisplayListTestsCG.cpp 2021-10-12 08:02:45 UTC (rev 283971)
@@ -31,6 +31,7 @@
#include <WebCore/DisplayList.h>
#include <WebCore/DisplayListItems.h>
#include <WebCore/DisplayListReplayer.h>
+#include <WebCore/DisplayListResourceHeap.h>
#include <WebCore/Gradient.h>
#include <WebCore/GraphicsContextCG.h>
@@ -72,10 +73,10 @@
{
auto imageBuffer = ImageBuffer::create({ 100, 100 }, RenderingMode::Unaccelerated, 1, colorSpace, PixelFormat::BGRA8);
- ImageBufferHashMap imageBufferMap;
- imageBufferMap.set(imageBufferIdentifier, imageBuffer.releaseNonNull());
+ ResourceHeap resourceHeap;
+ resourceHeap.add(imageBufferIdentifier, imageBuffer.releaseNonNull());
- Replayer replayer { context, list, &imageBufferMap };
+ Replayer replayer { context, list, &resourceHeap };
auto result = replayer.replay();
EXPECT_EQ(result.numberOfBytesRead, list.sizeInBytes());
EXPECT_EQ(result.reasonForStopping, StopReplayReason::ReplayedAllItems);