Title: [280356] trunk/Source
Revision
280356
Author
[email protected]
Date
2021-07-27 15:52:48 -0700 (Tue, 27 Jul 2021)

Log Message

[GPU Process] Start tracking resource uses for NativeImages and Fonts
https://bugs.webkit.org/show_bug.cgi?id=228224

Reviewed by Said Abou-Hallawa.

Source/WebCore:

This is part 3 of https://bugs.webkit.org/show_bug.cgi?id=228216.

This patch triggers the infrastructure added in https://bugs.webkit.org/show_bug.cgi?id=228222 by tracking
resource use counts in the web process. RemoteResourceCacheProxy already is notified whenever a resource
is used, so it records how many of these notifications it receives, and sends that count to the GPU process
with the release message. When the GPU process replays the display lists, it also keeps track of how many
uses it encountered for the resource, via calling through the Replayer::Delegate.

Covered by existing tests.

* platform/graphics/displaylists/DisplayListReplayer.cpp:
(WebCore::DisplayList::applyNativeImageItem):
(WebCore::DisplayList::applySetStateItem):
(WebCore::DisplayList::applyFontItem):
(WebCore::DisplayList::Replayer::applyItem):

Source/WebKit:

This patch extends the existing resource tracking HashMaps used in RemoteResourceCacheProxy to continue
to record what they were recording before, but also include this new resource use count information.

* WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
(WebKit::RemoteResourceCacheProxy::~RemoteResourceCacheProxy):
(WebKit::RemoteResourceCacheProxy::cacheNativeImage):
(WebKit::RemoteResourceCacheProxy::cacheFont):
(WebKit::RemoteResourceCacheProxy::releaseNativeImage):
(WebKit::RemoteResourceCacheProxy::clearFontMap):
(WebKit::RemoteResourceCacheProxy::finalizeRenderingUpdateForFonts):
* WebProcess/GPU/graphics/RemoteResourceCacheProxy.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (280355 => 280356)


--- trunk/Source/WebCore/ChangeLog	2021-07-27 22:52:11 UTC (rev 280355)
+++ trunk/Source/WebCore/ChangeLog	2021-07-27 22:52:48 UTC (rev 280356)
@@ -1,3 +1,26 @@
+2021-07-27  Myles C. Maxfield  <[email protected]>
+
+        [GPU Process] Start tracking resource uses for NativeImages and Fonts
+        https://bugs.webkit.org/show_bug.cgi?id=228224
+
+        Reviewed by Said Abou-Hallawa.
+
+        This is part 3 of https://bugs.webkit.org/show_bug.cgi?id=228216.
+
+        This patch triggers the infrastructure added in https://bugs.webkit.org/show_bug.cgi?id=228222 by tracking
+        resource use counts in the web process. RemoteResourceCacheProxy already is notified whenever a resource
+        is used, so it records how many of these notifications it receives, and sends that count to the GPU process
+        with the release message. When the GPU process replays the display lists, it also keeps track of how many
+        uses it encountered for the resource, via calling through the Replayer::Delegate.
+
+        Covered by existing tests.
+
+        * platform/graphics/displaylists/DisplayListReplayer.cpp:
+        (WebCore::DisplayList::applyNativeImageItem):
+        (WebCore::DisplayList::applySetStateItem):
+        (WebCore::DisplayList::applyFontItem):
+        (WebCore::DisplayList::Replayer::applyItem):
+
 2021-07-27  Alex Christensen  <[email protected]>
 
         document.referrer value is missing trailing slash

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


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp	2021-07-27 22:52:11 UTC (rev 280355)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp	2021-07-27 22:52:48 UTC (rev 280356)
@@ -67,47 +67,61 @@
 }
 
 template<class T>
-inline static std::optional<RenderingResourceIdentifier> applyNativeImageItem(GraphicsContext& context, const NativeImageHashMap& nativeImages, ItemHandle item)
+inline static std::optional<RenderingResourceIdentifier> applyNativeImageItem(GraphicsContext& context, const NativeImageHashMap& nativeImages, ItemHandle item, Replayer::Delegate* delegate)
 {
     auto& nativeImageItem = item.get<T>();
     auto resourceIdentifier = nativeImageItem.imageIdentifier();
     if (auto* image = nativeImages.get(resourceIdentifier)) {
         nativeImageItem.apply(context, *image);
+        if (delegate)
+            delegate->recordResourceUse(resourceIdentifier);
         return std::nullopt;
     }
     return resourceIdentifier;
 }
 
-inline static std::optional<RenderingResourceIdentifier> applySetStateItem(GraphicsContext& context, const NativeImageHashMap& nativeImages, ItemHandle item)
+inline static std::optional<RenderingResourceIdentifier> applySetStateItem(GraphicsContext& context, const NativeImageHashMap& nativeImages, ItemHandle item, Replayer::Delegate* delegate)
 {
     auto& setStateItem = item.get<SetState>();
 
+    RenderingResourceIdentifier strokePatternRenderingResourceIdentifier;
     NativeImage* strokePatternImage = nullptr;
+    RenderingResourceIdentifier fillPatternRenderingResourceIdentifier;
     NativeImage* fillPatternImage = nullptr;
 
-    if (auto resourceIdentifier = setStateItem.strokePatternImageIdentifier()) {
-        strokePatternImage = nativeImages.get(resourceIdentifier);
+    if ((strokePatternRenderingResourceIdentifier = setStateItem.strokePatternImageIdentifier())) {
+        strokePatternImage = nativeImages.get(strokePatternRenderingResourceIdentifier);
         if (!strokePatternImage)
-            return resourceIdentifier;
+            return strokePatternRenderingResourceIdentifier;
     }
 
-    if (auto resourceIdentifier = setStateItem.fillPatternImageIdentifier()) {
-        fillPatternImage = nativeImages.get(resourceIdentifier);
+    if ((fillPatternRenderingResourceIdentifier = setStateItem.fillPatternImageIdentifier())) {
+        fillPatternImage = nativeImages.get(fillPatternRenderingResourceIdentifier);
         if (!fillPatternImage)
-            return resourceIdentifier;
+            return fillPatternRenderingResourceIdentifier;
     }
 
     setStateItem.apply(context, strokePatternImage, fillPatternImage);
+
+    if (!delegate)
+        return std::nullopt;
+
+    if (strokePatternRenderingResourceIdentifier)
+        delegate->recordResourceUse(strokePatternRenderingResourceIdentifier);
+    if (fillPatternRenderingResourceIdentifier)
+        delegate->recordResourceUse(fillPatternRenderingResourceIdentifier);
     return std::nullopt;
 }
 
 template<class T>
-inline static std::optional<RenderingResourceIdentifier> applyFontItem(GraphicsContext& context, const FontRenderingResourceMap& fonts, ItemHandle item)
+inline static std::optional<RenderingResourceIdentifier> applyFontItem(GraphicsContext& context, const FontRenderingResourceMap& fonts, ItemHandle item, Replayer::Delegate* delegate)
 {
     auto& fontItem = item.get<T>();
     auto resourceIdentifier = fontItem.fontIdentifier();
     if (auto* font = fonts.get(resourceIdentifier)) {
         fontItem.apply(context, *font);
+        if (delegate)
+            delegate->recordResourceUse(resourceIdentifier);
         return std::nullopt;
     }
     return resourceIdentifier;
@@ -131,25 +145,25 @@
     }
 
     if (item.is<DrawNativeImage>()) {
-        if (auto missingCachedResourceIdentifier = applyNativeImageItem<DrawNativeImage>(context(), m_nativeImages, item))
+        if (auto missingCachedResourceIdentifier = applyNativeImageItem<DrawNativeImage>(context(), m_nativeImages, 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))
+        if (auto missingCachedResourceIdentifier = applyFontItem<DrawGlyphs>(context(), m_fonts, 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))
+        if (auto missingCachedResourceIdentifier = applyNativeImageItem<DrawPattern>(context(), m_nativeImages, 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))
+        if (auto missingCachedResourceIdentifier = applySetStateItem(context(), m_nativeImages, item, m_delegate))
             return { StopReplayReason::MissingCachedResource, WTFMove(missingCachedResourceIdentifier) };
         return { std::nullopt, std::nullopt };
     }

Modified: trunk/Source/WebKit/ChangeLog (280355 => 280356)


--- trunk/Source/WebKit/ChangeLog	2021-07-27 22:52:11 UTC (rev 280355)
+++ trunk/Source/WebKit/ChangeLog	2021-07-27 22:52:48 UTC (rev 280356)
@@ -1,3 +1,22 @@
+2021-07-27  Myles C. Maxfield  <[email protected]>
+
+        [GPU Process] Start tracking resource uses for NativeImages and Fonts
+        https://bugs.webkit.org/show_bug.cgi?id=228224
+
+        Reviewed by Said Abou-Hallawa.
+
+        This patch extends the existing resource tracking HashMaps used in RemoteResourceCacheProxy to continue
+        to record what they were recording before, but also include this new resource use count information.
+
+        * WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
+        (WebKit::RemoteResourceCacheProxy::~RemoteResourceCacheProxy):
+        (WebKit::RemoteResourceCacheProxy::cacheNativeImage):
+        (WebKit::RemoteResourceCacheProxy::cacheFont):
+        (WebKit::RemoteResourceCacheProxy::releaseNativeImage):
+        (WebKit::RemoteResourceCacheProxy::clearFontMap):
+        (WebKit::RemoteResourceCacheProxy::finalizeRenderingUpdateForFonts):
+        * WebProcess/GPU/graphics/RemoteResourceCacheProxy.h:
+
 2021-07-27  Peng Liu  <[email protected]>
 
         The bundle path of downlevel Safari is wrong

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp (280355 => 280356)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp	2021-07-27 22:52:11 UTC (rev 280355)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp	2021-07-27 22:52:48 UTC (rev 280356)
@@ -41,8 +41,8 @@
 
 RemoteResourceCacheProxy::~RemoteResourceCacheProxy()
 {
-    for (auto& image : m_nativeImages.values())
-        image->removeObserver(*this);
+    for (auto& nativeImageState : m_nativeImages.values())
+        nativeImageState.image->removeObserver(*this);
 }
 
 void RemoteResourceCacheProxy::cacheImageBuffer(WebCore::ImageBuffer& imageBuffer)
@@ -80,8 +80,11 @@
 
 void RemoteResourceCacheProxy::cacheNativeImage(NativeImage& image)
 {
-    if (m_nativeImages.contains(image.renderingResourceIdentifier()))
+    auto iterator = m_nativeImages.find(image.renderingResourceIdentifier());
+    if (iterator != m_nativeImages.end()) {
+        ++iterator->value.useCount;
         return;
+    }
 
     auto bitmap = createShareableBitmapFromNativeImage(image);
     if (!bitmap)
@@ -92,7 +95,7 @@
     if (handle.isNull())
         return;
 
-    m_nativeImages.add(image.renderingResourceIdentifier(), makeWeakPtr(image));
+    m_nativeImages.add(image.renderingResourceIdentifier(), NativeImageState { makeWeakPtr(image), 1 });
 
     // Set itself as an observer to NativeImage, so releaseNativeImage()
     // gets called when NativeImage is being deleleted.
@@ -104,8 +107,8 @@
 
 void RemoteResourceCacheProxy::cacheFont(Font& font)
 {
-    auto result = m_fontIdentifierToLastRenderingUpdateIDMap.ensure(font.renderingResourceIdentifier(), [&] {
-        return m_remoteRenderingBackendProxy.renderingUpdateID();
+    auto result = m_fonts.ensure(font.renderingResourceIdentifier(), [&] {
+        return FontState { m_remoteRenderingBackendProxy.renderingUpdateID(), 1 };
     });
 
     if (result.isNewEntry) {
@@ -114,9 +117,10 @@
         return;
     }
 
-    auto& lastVersion = result.iterator->value;
-    if (lastVersion != m_remoteRenderingBackendProxy.renderingUpdateID()) {
-        lastVersion = m_remoteRenderingBackendProxy.renderingUpdateID();
+    auto& currentState = result.iterator->value;
+    if (currentState.lastRenderingUpdateVersionUsedWithin != m_remoteRenderingBackendProxy.renderingUpdateID()) {
+        currentState.lastRenderingUpdateVersionUsedWithin = m_remoteRenderingBackendProxy.renderingUpdateID();
+        ++currentState.useCount;
         ++m_numberOfFontsUsedInCurrentRenderingUpdate;
     }
 }
@@ -123,10 +127,15 @@
 
 void RemoteResourceCacheProxy::releaseNativeImage(RenderingResourceIdentifier renderingResourceIdentifier)
 {
-    if (!m_nativeImages.remove(renderingResourceIdentifier))
-        return;
+    auto iterator = m_nativeImages.find(renderingResourceIdentifier);
+    RELEASE_ASSERT(iterator != m_nativeImages.end());
 
-    m_remoteRenderingBackendProxy.releaseRemoteResource(renderingResourceIdentifier, 0); // FIXME: Pass the real use count here.
+    auto useCount = iterator->value.useCount;
+
+    auto success = m_nativeImages.remove(iterator);
+    ASSERT_UNUSED(success, success);
+
+    m_remoteRenderingBackendProxy.releaseRemoteResource(renderingResourceIdentifier, useCount);
 }
 
 void RemoteResourceCacheProxy::prepareForNextRenderingUpdate()
@@ -136,9 +145,9 @@
 
 void RemoteResourceCacheProxy::clearFontMap()
 {
-    for (auto& item : m_fontIdentifierToLastRenderingUpdateIDMap)
-        m_remoteRenderingBackendProxy.releaseRemoteResource(item.key, 0); // FIXME: Pass the real use count here.
-    m_fontIdentifierToLastRenderingUpdateIDMap.clear();
+    for (auto& fontState : m_fonts)
+        m_remoteRenderingBackendProxy.releaseRemoteResource(fontState.key, fontState.value.useCount);
+    m_fonts.clear();
     m_numberOfFontsUsedInCurrentRenderingUpdate = 0;
 }
 
@@ -146,7 +155,7 @@
 {
     static constexpr unsigned minimumRenderingUpdateCountToKeepFontAlive = 4;
 
-    unsigned totalFontCount = m_fontIdentifierToLastRenderingUpdateIDMap.size();
+    unsigned totalFontCount = m_fonts.size();
     RELEASE_ASSERT(m_numberOfFontsUsedInCurrentRenderingUpdate <= totalFontCount);
     if (totalFontCount == m_numberOfFontsUsedInCurrentRenderingUpdate)
         return;
@@ -153,14 +162,14 @@
 
     HashSet<WebCore::RenderingResourceIdentifier> toRemove;
     auto renderingUpdateID = m_remoteRenderingBackendProxy.renderingUpdateID();
-    for (auto& item : m_fontIdentifierToLastRenderingUpdateIDMap) {
-        if (renderingUpdateID - item.value >= minimumRenderingUpdateCountToKeepFontAlive) {
+    for (auto& item : m_fonts) {
+        if (renderingUpdateID - item.value.lastRenderingUpdateVersionUsedWithin >= minimumRenderingUpdateCountToKeepFontAlive) {
             toRemove.add(item.key);
-            m_remoteRenderingBackendProxy.releaseRemoteResource(item.key, 0); // FIXME: Pass the real use count here.
+            m_remoteRenderingBackendProxy.releaseRemoteResource(item.key, item.value.useCount);
         }
     }
 
-    m_fontIdentifierToLastRenderingUpdateIDMap.removeIf([&](const auto& bucket) {
+    m_fonts.removeIf([&](const auto& bucket) {
         return toRemove.contains(bucket.key);
     });
 }

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h (280355 => 280356)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h	2021-07-27 22:52:11 UTC (rev 280355)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h	2021-07-27 22:52:48 UTC (rev 280356)
@@ -51,8 +51,8 @@
     void releaseImageBuffer(WebCore::RenderingResourceIdentifier);
 
     void cacheNativeImage(WebCore::NativeImage&);
+    void cacheFont(WebCore::Font&);
 
-    void cacheFont(WebCore::Font&);
     void finalizeRenderingUpdate();
 
     void remoteResourceCacheWasDestroyed();
@@ -60,7 +60,18 @@
 
 private:
     using ImageBufferHashMap = HashMap<WebCore::RenderingResourceIdentifier, WeakPtr<WebCore::ImageBuffer>>;
-    using NativeImageHashMap = HashMap<WebCore::RenderingResourceIdentifier, WeakPtr<WebCore::NativeImage>>;
+
+    struct NativeImageState {
+        WeakPtr<WebCore::NativeImage> image;
+        uint64_t useCount;
+    };
+    using NativeImageHashMap = HashMap<WebCore::RenderingResourceIdentifier, NativeImageState>;
+
+    struct FontState {
+        RenderingUpdateID lastRenderingUpdateVersionUsedWithin;
+        uint64_t useCount;
+    };
+    using FontHashMap = HashMap<WebCore::RenderingResourceIdentifier, FontState>;
     
     void releaseNativeImage(WebCore::RenderingResourceIdentifier) override;
     void finalizeRenderingUpdateForFonts();
@@ -69,8 +80,8 @@
 
     ImageBufferHashMap m_imageBuffers;
     NativeImageHashMap m_nativeImages;
+    FontHashMap m_fonts;
 
-    HashMap<WebCore::RenderingResourceIdentifier, RenderingUpdateID> m_fontIdentifierToLastRenderingUpdateIDMap;
     unsigned m_numberOfFontsUsedInCurrentRenderingUpdate { 0 };
 
     RemoteRenderingBackendProxy& m_remoteRenderingBackendProxy;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to