Title: [280401] trunk/Source
Revision
280401
Author
mmaxfi...@apple.com
Date
2021-07-28 14:46:53 -0700 (Wed, 28 Jul 2021)

Log Message

[GPU Process] Start tracking resource uses for ImageBuffers
https://bugs.webkit.org/show_bug.cgi?id=228225

Reviewed by Said Abou-Hallawa.

Source/WebCore:

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

This works the same way as NativeImages/Fonts (https://bugs.webkit.org/show_bug.cgi?id=228224).
The only real difference to how ImageBuffers work today is that RemoteImageBufferProxy's destructor
doesn't directly tell the RemoteRenderingBackendProxy to release its RenderingResourceIdentifier,
but instead this codepath goes through the RemoteResourceCacheProxy which is tracking the number of
uses of the resource. This is so the RemoteResourceCacheProxy can inject the use count into the
ReleaseRemoteResource command.

Covered by existing tests.

* platform/graphics/displaylists/DisplayListRecorder.cpp:
(WebCore::DisplayList::Recorder::drawImageBuffer):
(WebCore::DisplayList::Recorder::clipToImageBuffer):
* platform/graphics/displaylists/DisplayListRecorder.h:
(WebCore::DisplayList::Recorder::Delegate::recordImageBufferUse):
* platform/graphics/displaylists/DisplayListReplayer.cpp:
(WebCore::DisplayList::applyImageBufferItem):
(WebCore::DisplayList::Replayer::applyItem):

Source/WebKit:

* WebProcess/GPU/graphics/RemoteImageBufferProxy.h:
(WebKit::RemoteImageBufferProxy::~RemoteImageBufferProxy):
* WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
(WebKit::RemoteResourceCacheProxy::cacheImageBuffer):
(WebKit::RemoteResourceCacheProxy::cachedImageBuffer):
(WebKit::RemoteResourceCacheProxy::releaseImageBuffer):
(WebKit::RemoteResourceCacheProxy::recordImageBufferUse):
(WebKit::RemoteResourceCacheProxy::remoteResourceCacheWasDestroyed):
* WebProcess/GPU/graphics/RemoteResourceCacheProxy.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (280400 => 280401)


--- trunk/Source/WebCore/ChangeLog	2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebCore/ChangeLog	2021-07-28 21:46:53 UTC (rev 280401)
@@ -1,3 +1,30 @@
+2021-07-28  Myles C. Maxfield  <mmaxfi...@apple.com>
+
+        [GPU Process] Start tracking resource uses for ImageBuffers
+        https://bugs.webkit.org/show_bug.cgi?id=228225
+
+        Reviewed by Said Abou-Hallawa.
+
+        This is part 4 of https://bugs.webkit.org/show_bug.cgi?id=228216.
+
+        This works the same way as NativeImages/Fonts (https://bugs.webkit.org/show_bug.cgi?id=228224).
+        The only real difference to how ImageBuffers work today is that RemoteImageBufferProxy's destructor
+        doesn't directly tell the RemoteRenderingBackendProxy to release its RenderingResourceIdentifier,
+        but instead this codepath goes through the RemoteResourceCacheProxy which is tracking the number of
+        uses of the resource. This is so the RemoteResourceCacheProxy can inject the use count into the
+        ReleaseRemoteResource command.
+
+        Covered by existing tests.
+
+        * platform/graphics/displaylists/DisplayListRecorder.cpp:
+        (WebCore::DisplayList::Recorder::drawImageBuffer):
+        (WebCore::DisplayList::Recorder::clipToImageBuffer):
+        * platform/graphics/displaylists/DisplayListRecorder.h:
+        (WebCore::DisplayList::Recorder::Delegate::recordImageBufferUse):
+        * platform/graphics/displaylists/DisplayListReplayer.cpp:
+        (WebCore::DisplayList::applyImageBufferItem):
+        (WebCore::DisplayList::Replayer::applyItem):
+
 2021-07-28  Eric Carlson  <eric.carl...@apple.com>
 
         [iOS] Ignore extra route change notifications

Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp (280400 => 280401)


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp	2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp	2021-07-28 21:46:53 UTC (rev 280401)
@@ -204,6 +204,8 @@
         GraphicsContext::drawImageBuffer(imageBuffer, destRect, srcRect, options);
         return;
     }
+    if (m_delegate)
+        m_delegate->recordImageBufferUse(imageBuffer);
     m_displayList.cacheImageBuffer(imageBuffer);
     append<DrawImageBuffer>(imageBuffer.renderingResourceIdentifier(), destRect, srcRect, options);
 }
@@ -465,6 +467,8 @@
 
 void Recorder::clipToImageBuffer(ImageBuffer& imageBuffer, const FloatRect& destRect)
 {
+    if (m_delegate)
+        m_delegate->recordImageBufferUse(imageBuffer);
     m_displayList.cacheImageBuffer(imageBuffer);
     append<ClipToImageBuffer>(imageBuffer.renderingResourceIdentifier(), destRect);
 }

Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h (280400 => 280401)


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h	2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h	2021-07-28 21:46:53 UTC (rev 280401)
@@ -70,6 +70,7 @@
         virtual void recordNativeImageUse(NativeImage&) { }
         virtual bool isCachedImageBuffer(const ImageBuffer&) const { return false; }
         virtual void recordFontUse(Font&) { }
+        virtual void recordImageBufferUse(ImageBuffer&) { }
         virtual RenderingMode renderingMode() const { return RenderingMode::Unaccelerated; }
     };
 

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


--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp	2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp	2021-07-28 21:46:53 UTC (rev 280401)
@@ -55,12 +55,14 @@
 }
 
 template<class T>
-inline static std::optional<RenderingResourceIdentifier> applyImageBufferItem(GraphicsContext& context, const ImageBufferHashMap& imageBuffers, ItemHandle item)
+inline static std::optional<RenderingResourceIdentifier> applyImageBufferItem(GraphicsContext& context, const ImageBufferHashMap& imageBuffers, ItemHandle item, Replayer::Delegate* delegate)
 {
     auto& imageBufferItem = item.get<T>();
     auto resourceIdentifier = imageBufferItem.imageBufferIdentifier();
     if (auto* imageBuffer = imageBuffers.get(resourceIdentifier)) {
         imageBufferItem.apply(context, *imageBuffer);
+        if (delegate)
+            delegate->recordResourceUse(resourceIdentifier);
         return std::nullopt;
     }
     return resourceIdentifier;
@@ -133,13 +135,13 @@
         return { std::nullopt, std::nullopt };
 
     if (item.is<DrawImageBuffer>()) {
-        if (auto missingCachedResourceIdentifier = applyImageBufferItem<DrawImageBuffer>(context(), m_imageBuffers, item))
+        if (auto missingCachedResourceIdentifier = applyImageBufferItem<DrawImageBuffer>(context(), m_imageBuffers, 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))
+        if (auto missingCachedResourceIdentifier = applyImageBufferItem<ClipToImageBuffer>(context(), m_imageBuffers, item, m_delegate))
             return { StopReplayReason::MissingCachedResource, WTFMove(missingCachedResourceIdentifier) };
         return { std::nullopt, std::nullopt };
     }

Modified: trunk/Source/WebKit/ChangeLog (280400 => 280401)


--- trunk/Source/WebKit/ChangeLog	2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebKit/ChangeLog	2021-07-28 21:46:53 UTC (rev 280401)
@@ -1,3 +1,20 @@
+2021-07-28  Myles C. Maxfield  <mmaxfi...@apple.com>
+
+        [GPU Process] Start tracking resource uses for ImageBuffers
+        https://bugs.webkit.org/show_bug.cgi?id=228225
+
+        Reviewed by Said Abou-Hallawa.
+
+        * WebProcess/GPU/graphics/RemoteImageBufferProxy.h:
+        (WebKit::RemoteImageBufferProxy::~RemoteImageBufferProxy):
+        * WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
+        (WebKit::RemoteResourceCacheProxy::cacheImageBuffer):
+        (WebKit::RemoteResourceCacheProxy::cachedImageBuffer):
+        (WebKit::RemoteResourceCacheProxy::releaseImageBuffer):
+        (WebKit::RemoteResourceCacheProxy::recordImageBufferUse):
+        (WebKit::RemoteResourceCacheProxy::remoteResourceCacheWasDestroyed):
+        * WebProcess/GPU/graphics/RemoteResourceCacheProxy.h:
+
 2021-07-28  Aditya Keerthi  <akeer...@apple.com>
 
         [iOS] <select> picker value committed to incorrect element after programmatic focus change

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h (280400 => 280401)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h	2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h	2021-07-28 21:46:53 UTC (rev 280401)
@@ -72,7 +72,6 @@
 
         flushDrawingContext();
         m_remoteRenderingBackendProxy->remoteResourceCacheProxy().releaseImageBuffer(m_renderingResourceIdentifier);
-        m_remoteRenderingBackendProxy->releaseRemoteResource(m_renderingResourceIdentifier, 0); // FIXME: Pass the real use count here.
     }
 
     ImageBufferBackendHandle createImageBufferBackendHandle()
@@ -323,6 +322,12 @@
             m_remoteRenderingBackendProxy->remoteResourceCacheProxy().recordFontUse(font);
     }
 
+    void recordImageBufferUse(WebCore::ImageBuffer& imageBuffer) final
+    {
+        if (m_remoteRenderingBackendProxy)
+            m_remoteRenderingBackendProxy->remoteResourceCacheProxy().recordImageBufferUse(imageBuffer);
+    }
+
     WebCore::DisplayList::ItemBufferHandle createItemBuffer(size_t capacity) final
     {
         if (LIKELY(m_remoteRenderingBackendProxy))

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


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp	2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp	2021-07-28 21:46:53 UTC (rev 280401)
@@ -47,19 +47,26 @@
 
 void RemoteResourceCacheProxy::cacheImageBuffer(WebCore::ImageBuffer& imageBuffer)
 {
-    auto addResult = m_imageBuffers.add(imageBuffer.renderingResourceIdentifier(), makeWeakPtr(imageBuffer));
+    auto addResult = m_imageBuffers.add(imageBuffer.renderingResourceIdentifier(), ImageBufferState { makeWeakPtr(imageBuffer), 0 });
     ASSERT_UNUSED(addResult, addResult.isNewEntry);
 }
 
 ImageBuffer* RemoteResourceCacheProxy::cachedImageBuffer(RenderingResourceIdentifier renderingResourceIdentifier)
 {
-    return m_imageBuffers.get(renderingResourceIdentifier).get();
+    return m_imageBuffers.get(renderingResourceIdentifier).imageBuffer.get();
 }
 
 void RemoteResourceCacheProxy::releaseImageBuffer(RenderingResourceIdentifier renderingResourceIdentifier)
 {
-    bool found = m_imageBuffers.remove(renderingResourceIdentifier);
-    ASSERT_UNUSED(found, found);
+    auto iterator = m_imageBuffers.find(renderingResourceIdentifier);
+    RELEASE_ASSERT(iterator != m_imageBuffers.end());
+
+    auto useCount = iterator->value.useCount;
+
+    auto success = m_imageBuffers.remove(iterator);
+    ASSERT_UNUSED(success, success);
+
+    m_remoteRenderingBackendProxy.releaseRemoteResource(renderingResourceIdentifier, useCount);
 }
 
 inline static RefPtr<ShareableBitmap> createShareableBitmapFromNativeImage(NativeImage& image)
@@ -78,6 +85,14 @@
     return bitmap;
 }
 
+void RemoteResourceCacheProxy::recordImageBufferUse(WebCore::ImageBuffer& imageBuffer)
+{
+    auto iterator = m_imageBuffers.find(imageBuffer.renderingResourceIdentifier());
+    ASSERT(iterator != m_imageBuffers.end());
+
+    ++iterator->value.useCount;
+}
+
 void RemoteResourceCacheProxy::recordNativeImageUse(NativeImage& image)
 {
     auto iterator = m_nativeImages.find(image.renderingResourceIdentifier());
@@ -182,11 +197,12 @@
 
 void RemoteResourceCacheProxy::remoteResourceCacheWasDestroyed()
 {
-    for (auto& imageBuffer : m_imageBuffers.values()) {
-        if (!imageBuffer)
+    for (auto& item : m_imageBuffers.values()) {
+        if (!item.imageBuffer)
             continue;
-        m_remoteRenderingBackendProxy.createRemoteImageBuffer(*imageBuffer);
-        imageBuffer->clearBackend();
+        m_remoteRenderingBackendProxy.createRemoteImageBuffer(*item.imageBuffer);
+        item.useCount = 0;
+        item.imageBuffer->clearBackend();
     }
     m_nativeImages.clear();
     clearFontMap();

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


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h	2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h	2021-07-28 21:46:53 UTC (rev 280401)
@@ -52,6 +52,7 @@
 
     void recordNativeImageUse(WebCore::NativeImage&);
     void recordFontUse(WebCore::Font&);
+    void recordImageBufferUse(WebCore::ImageBuffer&);
 
     void finalizeRenderingUpdate();
 
@@ -59,7 +60,11 @@
     void releaseMemory();
 
 private:
-    using ImageBufferHashMap = HashMap<WebCore::RenderingResourceIdentifier, WeakPtr<WebCore::ImageBuffer>>;
+    struct ImageBufferState {
+        WeakPtr<WebCore::ImageBuffer> imageBuffer;
+        uint64_t useCount;
+    };
+    using ImageBufferHashMap = HashMap<WebCore::RenderingResourceIdentifier, ImageBufferState>;
 
     struct NativeImageState {
         WeakPtr<WebCore::NativeImage> image;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to