Title: [288847] trunk/Source/WebKit
Revision
288847
Author
[email protected]
Date
2022-01-31 14:52:12 -0800 (Mon, 31 Jan 2022)

Log Message

[GPU Process] Remove the resource use counters from the remote resource cache
https://bugs.webkit.org/show_bug.cgi?id=235636

Reviewed by Simon Fraser.

The display list items and the resource management messages are both
communicated from the WebProcess and the GPUProcess through the stream
connection. The resources will be sent to the GPUProcess, consumed by
the display items and then released in the right order. So there is no
need anymore for the resource use counters.

* GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
(WebKit::RemoteDisplayListRecorder::setStateWithQualifiedIdentifiers):
(WebKit::RemoteDisplayListRecorder::clipToImageBufferWithQualifiedIdentifier):
(WebKit::RemoteDisplayListRecorder::drawGlyphsWithQualifiedIdentifier):
(WebKit::RemoteDisplayListRecorder::drawImageBufferWithQualifiedIdentifier):
(WebKit::RemoteDisplayListRecorder::drawNativeImageWithQualifiedIdentifier):
(WebKit::RemoteDisplayListRecorder::drawPatternWithQualifiedIdentifier):
* GPUProcess/graphics/RemoteRenderingBackend.cpp:
(WebKit::RemoteRenderingBackend::releaseRemoteResource):
(WebKit::RemoteRenderingBackend::releaseRemoteResourceWithQualifiedIdentifier):
* GPUProcess/graphics/RemoteRenderingBackend.h:
* GPUProcess/graphics/RemoteRenderingBackend.messages.in:
* GPUProcess/graphics/RemoteResourceCache.cpp:
(WebKit::RemoteResourceCache::cacheImageBuffer):
(WebKit::RemoteResourceCache::cacheNativeImage):
(WebKit::RemoteResourceCache::cacheFont):
(WebKit::RemoteResourceCache::releaseRemoteResource):
(WebKit::RemoteResourceCache::ensureResourceUseCounter): Deleted.
(WebKit::RemoteResourceCache::maybeRemoveResource): Deleted.
(WebKit::RemoteResourceCache::recordResourceUse): Deleted.
(WebKit::RemoteResourceCache::updateHasActiveDrawables): Deleted.
* GPUProcess/graphics/RemoteResourceCache.h:
(WebKit::RemoteResourceCache::hasActiveDrawables const):
(): Deleted.
* WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp:
(WebKit::RemoteDisplayListRecorderProxy::recordResourceUse):
* WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
(WebKit::RemoteRenderingBackendProxy::releaseRemoteResource):
(WebKit::RemoteRenderingBackendProxy::recordNativeImageUse): Deleted.
(WebKit::RemoteRenderingBackendProxy::recordFontUse): Deleted.
(WebKit::RemoteRenderingBackendProxy::recordImageBufferUse): Deleted.
* WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
* WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
(WebKit::RemoteResourceCacheProxy::cacheImageBuffer):
(WebKit::RemoteResourceCacheProxy::cachedImageBuffer const):
(WebKit::RemoteResourceCacheProxy::releaseImageBuffer):
(WebKit::RemoteResourceCacheProxy::recordImageBufferUse):
(WebKit::RemoteResourceCacheProxy::recordNativeImageUse):
(WebKit::RemoteResourceCacheProxy::recordFontUse):
(WebKit::RemoteResourceCacheProxy::releaseNativeImage):
(WebKit::RemoteResourceCacheProxy::clearNativeImageMap):
(WebKit::RemoteResourceCacheProxy::releaseAllRemoteFonts):
(WebKit::RemoteResourceCacheProxy::finalizeRenderingUpdateForFonts):
(WebKit::RemoteResourceCacheProxy::remoteResourceCacheWasDestroyed):
* WebProcess/GPU/graphics/RemoteResourceCacheProxy.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (288846 => 288847)


--- trunk/Source/WebKit/ChangeLog	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/ChangeLog	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,3 +1,62 @@
+2022-01-31  Said Abou-Hallawa  <[email protected]>
+
+        [GPU Process] Remove the resource use counters from the remote resource cache
+        https://bugs.webkit.org/show_bug.cgi?id=235636
+
+        Reviewed by Simon Fraser.
+
+        The display list items and the resource management messages are both
+        communicated from the WebProcess and the GPUProcess through the stream
+        connection. The resources will be sent to the GPUProcess, consumed by
+        the display items and then released in the right order. So there is no
+        need anymore for the resource use counters.
+
+        * GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
+        (WebKit::RemoteDisplayListRecorder::setStateWithQualifiedIdentifiers):
+        (WebKit::RemoteDisplayListRecorder::clipToImageBufferWithQualifiedIdentifier):
+        (WebKit::RemoteDisplayListRecorder::drawGlyphsWithQualifiedIdentifier):
+        (WebKit::RemoteDisplayListRecorder::drawImageBufferWithQualifiedIdentifier):
+        (WebKit::RemoteDisplayListRecorder::drawNativeImageWithQualifiedIdentifier):
+        (WebKit::RemoteDisplayListRecorder::drawPatternWithQualifiedIdentifier):
+        * GPUProcess/graphics/RemoteRenderingBackend.cpp:
+        (WebKit::RemoteRenderingBackend::releaseRemoteResource):
+        (WebKit::RemoteRenderingBackend::releaseRemoteResourceWithQualifiedIdentifier):
+        * GPUProcess/graphics/RemoteRenderingBackend.h:
+        * GPUProcess/graphics/RemoteRenderingBackend.messages.in:
+        * GPUProcess/graphics/RemoteResourceCache.cpp:
+        (WebKit::RemoteResourceCache::cacheImageBuffer):
+        (WebKit::RemoteResourceCache::cacheNativeImage):
+        (WebKit::RemoteResourceCache::cacheFont):
+        (WebKit::RemoteResourceCache::releaseRemoteResource):
+        (WebKit::RemoteResourceCache::ensureResourceUseCounter): Deleted.
+        (WebKit::RemoteResourceCache::maybeRemoveResource): Deleted.
+        (WebKit::RemoteResourceCache::recordResourceUse): Deleted.
+        (WebKit::RemoteResourceCache::updateHasActiveDrawables): Deleted.
+        * GPUProcess/graphics/RemoteResourceCache.h:
+        (WebKit::RemoteResourceCache::hasActiveDrawables const):
+        (): Deleted.
+        * WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp:
+        (WebKit::RemoteDisplayListRecorderProxy::recordResourceUse):
+        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
+        (WebKit::RemoteRenderingBackendProxy::releaseRemoteResource):
+        (WebKit::RemoteRenderingBackendProxy::recordNativeImageUse): Deleted.
+        (WebKit::RemoteRenderingBackendProxy::recordFontUse): Deleted.
+        (WebKit::RemoteRenderingBackendProxy::recordImageBufferUse): Deleted.
+        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
+        * WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
+        (WebKit::RemoteResourceCacheProxy::cacheImageBuffer):
+        (WebKit::RemoteResourceCacheProxy::cachedImageBuffer const):
+        (WebKit::RemoteResourceCacheProxy::releaseImageBuffer):
+        (WebKit::RemoteResourceCacheProxy::recordImageBufferUse):
+        (WebKit::RemoteResourceCacheProxy::recordNativeImageUse):
+        (WebKit::RemoteResourceCacheProxy::recordFontUse):
+        (WebKit::RemoteResourceCacheProxy::releaseNativeImage):
+        (WebKit::RemoteResourceCacheProxy::clearNativeImageMap):
+        (WebKit::RemoteResourceCacheProxy::releaseAllRemoteFonts):
+        (WebKit::RemoteResourceCacheProxy::finalizeRenderingUpdateForFonts):
+        (WebKit::RemoteResourceCacheProxy::remoteResourceCacheWasDestroyed):
+        * WebProcess/GPU/graphics/RemoteResourceCacheProxy.h:
+
 2022-01-31  Per Arne Vollan  <[email protected]>
 
         [macOS][WP] Add required syscall

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp (288846 => 288847)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -134,12 +134,6 @@
         fillPatternImage = resourceCache().cachedNativeImage(fillPatternImageIdentifier);
 
     handleItem(WTFMove(item), strokePatternImage.get(), fillPatternImage.get());
-
-    if (strokePatternImage)
-        resourceCache().recordResourceUse(strokePatternImageIdentifier);
-
-    if (fillPatternImage)
-        resourceCache().recordResourceUse(fillPatternImageIdentifier);
 }
 
 void RemoteDisplayListRecorder::setLineCap(LineCap lineCap)
@@ -193,7 +187,6 @@
     }
 
     handleItem(DisplayList::ClipToImageBuffer(imageBufferIdentifier.object(), destinationRect), *imageBuffer);
-    resourceCache().recordResourceUse(imageBufferIdentifier);
 }
 
 void RemoteDisplayListRecorder::clipOutToPath(const Path& path)
@@ -275,7 +268,6 @@
     }
 
     handleItem(WTFMove(item), *font);
-    resourceCache().recordResourceUse(fontIdentifier);
 }
 
 void RemoteDisplayListRecorder::drawImageBuffer(RenderingResourceIdentifier imageBufferIdentifier, const FloatRect& destinationRect, const FloatRect& srcRect, const ImagePaintingOptions& options)
@@ -294,7 +286,6 @@
     }
 
     handleItem(DisplayList::DrawImageBuffer(imageBufferIdentifier.object(), destinationRect, srcRect, options), *imageBuffer);
-    resourceCache().recordResourceUse(imageBufferIdentifier);
 }
 
 void RemoteDisplayListRecorder::drawNativeImage(RenderingResourceIdentifier imageIdentifier, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions& options)
@@ -313,7 +304,6 @@
     }
 
     handleItem(DisplayList::DrawNativeImage(imageIdentifier.object(), imageSize, destRect, srcRect, options), *image);
-    resourceCache().recordResourceUse(imageIdentifier);
 }
 
 void RemoteDisplayListRecorder::drawPattern(RenderingResourceIdentifier imageIdentifier, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& transform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)
@@ -332,7 +322,6 @@
     }
 
     handleItem(DisplayList::DrawPattern(imageIdentifier.object(), imageSize, destRect, tileRect, transform, phase, spacing, options), *image);
-    resourceCache().recordResourceUse(imageIdentifier);
 }
 
 void RemoteDisplayListRecorder::beginTransparencyLayer(float opacity)

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp (288846 => 288847)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -390,17 +390,17 @@
     m_remoteResourceCache.deleteAllFonts();
 }
 
-void RemoteRenderingBackend::releaseRemoteResource(RenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
+void RemoteRenderingBackend::releaseRemoteResource(RenderingResourceIdentifier renderingResourceIdentifier)
 {
     // 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).
-    releaseRemoteResourceWithQualifiedIdentifier({ renderingResourceIdentifier, m_gpuConnectionToWebProcess->webProcessIdentifier() }, useCount);
+    releaseRemoteResourceWithQualifiedIdentifier({ renderingResourceIdentifier, m_gpuConnectionToWebProcess->webProcessIdentifier() });
 }
 
-void RemoteRenderingBackend::releaseRemoteResourceWithQualifiedIdentifier(QualifiedRenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
+void RemoteRenderingBackend::releaseRemoteResourceWithQualifiedIdentifier(QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
 {
     ASSERT(!RunLoop::isMain());
-    auto success = m_remoteResourceCache.releaseRemoteResource(renderingResourceIdentifier, useCount);
+    auto success = m_remoteResourceCache.releaseRemoteResource(renderingResourceIdentifier);
     MESSAGE_CHECK(success, "Resource is being released before being cached.");
     updateRenderingResourceRequest();
 

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h (288846 => 288847)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -117,7 +117,7 @@
     void cacheNativeImage(const ShareableBitmap::Handle&, WebCore::RenderingResourceIdentifier);
     void cacheFont(Ref<WebCore::Font>&&);
     void deleteAllFonts();
-    void releaseRemoteResource(WebCore::RenderingResourceIdentifier, uint64_t useCount);
+    void releaseRemoteResource(WebCore::RenderingResourceIdentifier);
     void finalizeRenderingUpdate(RenderingUpdateID);
 
     // Received messages translated to use QualifiedRenderingResourceIdentifier.
@@ -127,7 +127,7 @@
     void getShareableBitmapForImageBufferWithQualifiedIdentifier(QualifiedRenderingResourceIdentifier, WebCore::PreserveResolution, CompletionHandler<void(ShareableBitmap::Handle&&)>&&);
     void cacheNativeImageWithQualifiedIdentifier(const ShareableBitmap::Handle&, QualifiedRenderingResourceIdentifier);
     void didCreateSharedDisplayListHandleWithQualifiedIdentifier(WebCore::DisplayList::ItemBufferIdentifier, const SharedMemory::IPCHandle&, QualifiedRenderingResourceIdentifier destinationBufferIdentifier);
-    void releaseRemoteResourceWithQualifiedIdentifier(QualifiedRenderingResourceIdentifier, uint64_t useCount);
+    void releaseRemoteResourceWithQualifiedIdentifier(QualifiedRenderingResourceIdentifier);
     void cacheFontWithQualifiedIdentifier(Ref<WebCore::Font>&&, QualifiedRenderingResourceIdentifier);
 
     Ref<IPC::StreamConnectionWorkQueue> m_workQueue;

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in (288846 => 288847)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,4 +1,4 @@
-# Copyright (C) 2020 Apple Inc. All rights reserved.
+# Copyright (C) 2020-2022 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -35,7 +35,7 @@
     CacheNativeImage(WebKit::ShareableBitmap::Handle handle, WebCore::RenderingResourceIdentifier renderingResourceIdentifier) NotStreamEncodable
     CacheFont(IPC::FontReference font) NotStreamEncodable
     DeleteAllFonts()
-    ReleaseRemoteResource(WebCore::RenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
+    ReleaseRemoteResource(WebCore::RenderingResourceIdentifier renderingResourceIdentifier)
     FinalizeRenderingUpdate(WebKit::RenderingUpdateID renderingUpdateID)
 }
 

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp (288846 => 288847)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -36,20 +36,10 @@
 {
 }
 
-RemoteResourceCache::RemoteResourceCache(RemoteResourceCache&& other)
-    : m_resourceHeap(WTFMove(other.m_resourceHeap))
-    , m_resourceUseCounters(WTFMove(other.m_resourceUseCounters))
-{
-    updateHasActiveDrawables();
-}
-
 void RemoteResourceCache::cacheImageBuffer(Ref<ImageBuffer>&& imageBuffer, QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
 {
     ASSERT(renderingResourceIdentifier.object() == imageBuffer->renderingResourceIdentifier());
     m_resourceHeap.add(renderingResourceIdentifier, WTFMove(imageBuffer));
-    updateHasActiveDrawables();
-
-    ensureResourceUseCounter(renderingResourceIdentifier);
 }
 
 ImageBuffer* RemoteResourceCache::cachedImageBuffer(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
@@ -61,9 +51,6 @@
 {
     ASSERT(renderingResourceIdentifier.object() == image->renderingResourceIdentifier());
     m_resourceHeap.add(renderingResourceIdentifier, WTFMove(image));
-    updateHasActiveDrawables();
-
-    ensureResourceUseCounter(renderingResourceIdentifier);
 }
 
 NativeImage* RemoteResourceCache::cachedNativeImage(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
@@ -75,8 +62,6 @@
 {
     ASSERT(renderingResourceIdentifier.object() == font->renderingResourceIdentifier());
     m_resourceHeap.add(renderingResourceIdentifier, WTFMove(font));
-
-    ensureResourceUseCounter(renderingResourceIdentifier);
 }
 
 Font* RemoteResourceCache::cachedFont(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
@@ -84,103 +69,22 @@
     return m_resourceHeap.getFont(renderingResourceIdentifier);
 }
 
-void RemoteResourceCache::ensureResourceUseCounter(QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
-{
-    auto result = m_resourceUseCounters.add(renderingResourceIdentifier, ResourceUseCounter { });
-    if (!result.isNewEntry) {
-        auto& state = result.iterator->value.state;
-        // FIXME: We should consider making this assertion MESSAGE_CHECK the web process.
-        ASSERT(state == ResourceState::ToBeDeleted);
-        state = ResourceState::Alive;
-    }
-}
-
 void RemoteResourceCache::deleteAllFonts()
 {
     m_resourceHeap.deleteAllFonts();
 }
 
-bool RemoteResourceCache::maybeRemoveResource(QualifiedRenderingResourceIdentifier renderingResourceIdentifier, ResourceUseCountersMap::iterator& iterator)
+bool RemoteResourceCache::releaseRemoteResource(QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
 {
-    auto& value = iterator->value;
-    if (value.state == ResourceState::Alive || value.useOrPendingCount < 0)
-        return true;
-
-    if (value.useOrPendingCount) {
-        // This means we've hit a situation that's something like the following:
-        //
-        // The WP sends:
-        // 1. Send cache resource message
-        // 2. Use resource 2x
-        // 3. Send release resource message with useCount = 2
-        // 4. Send cache resource message again for the same resource
-        // 5. Use resource 4 times
-        // 6. Send release resource message with useCount = 4
-        //
-        // The GPUP sees:
-        // 1. The cache resource message
-        // 2. Use resource 2x
-        // 3. Use resource 3x more times (from step 5 above)
-        // 4. Release resource message with useCount = 2  <== This part right here
-        // 5. ... more stuff ...
-        //
-        // In this situation, we've got a head-start on a future frame's rendering commands,
-        // using a resource which was cached from a previous frame. (This is not a problem.)
-        // Therefore, we know that, in the future, there's going to be another cache resource
-        // message which will want us to cache this exact same resource that we already have
-        // cached.
-        //
-        // So, let's just not remove the resource, just in case there are _more_ rendering
-        // commands we can get a head start on before the cache resource message eventually
-        // gets delivered. The eventual cache resource command is smart enough to realize that
-        // the thing it's supposed to be caching is already in the cache, and will correctly
-        // do nothing.
-
-        return true;
-    }
-
-    m_resourceUseCounters.remove(iterator);
-
     if (m_resourceHeap.removeImageBuffer(renderingResourceIdentifier)
-        || m_resourceHeap.removeNativeImage(renderingResourceIdentifier)) {
-        updateHasActiveDrawables();
+        || m_resourceHeap.removeNativeImage(renderingResourceIdentifier)
+        || m_resourceHeap.removeFont(renderingResourceIdentifier))
         return true;
-    }
-    if (m_resourceHeap.removeFont(renderingResourceIdentifier))
-        return true;
 
     // Caching the remote resource should have happened before releasing it.
     return false;
 }
 
-void RemoteResourceCache::recordResourceUse(QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
-{
-    auto iterator = m_resourceUseCounters.find(renderingResourceIdentifier);
-
-    ASSERT(iterator != m_resourceUseCounters.end());
-
-    ResourceUseCounter& useCounter = iterator->value;
-    ++useCounter.useOrPendingCount;
-
-    maybeRemoveResource(renderingResourceIdentifier, iterator);
-}
-
-bool RemoteResourceCache::releaseRemoteResource(QualifiedRenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
-{
-    auto iterator = m_resourceUseCounters.find(renderingResourceIdentifier);
-    if (iterator == m_resourceUseCounters.end())
-        return false;
-    ResourceUseCounter& useCounter = iterator->value;
-    useCounter.state = ResourceState::ToBeDeleted;
-    useCounter.useOrPendingCount -= useCount;
-    return maybeRemoveResource(renderingResourceIdentifier, iterator);
-}
-
-void RemoteResourceCache::updateHasActiveDrawables()
-{
-    m_hasActiveDrawables = m_resourceHeap.hasImageBuffer() || m_resourceHeap.hasNativeImage();
-}
-
 } // namespace WebKit
 
 #endif // ENABLE(GPU_PROCESS)

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h (288846 => 288847)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2021 Apple Inc.  All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -43,7 +43,6 @@
 class RemoteResourceCache {
 public:
     RemoteResourceCache(WebCore::ProcessIdentifier webProcessIdentifier);
-    RemoteResourceCache(RemoteResourceCache&&);
 
     void cacheImageBuffer(Ref<WebCore::ImageBuffer>&&, QualifiedRenderingResourceIdentifier);
     WebCore::ImageBuffer* cachedImageBuffer(QualifiedRenderingResourceIdentifier) const;
@@ -52,45 +51,14 @@
     void cacheFont(Ref<WebCore::Font>&&, QualifiedRenderingResourceIdentifier);
     WebCore::Font* cachedFont(QualifiedRenderingResourceIdentifier) const;
     void deleteAllFonts();
-    bool releaseRemoteResource(QualifiedRenderingResourceIdentifier, uint64_t useCount);
-    void recordResourceUse(QualifiedRenderingResourceIdentifier);
+    bool releaseRemoteResource(QualifiedRenderingResourceIdentifier);
 
     const WebCore::DisplayList::ResourceHeap& resourceHeap() const { return m_resourceHeap; }
 
-    bool hasActiveDrawables() const { return m_hasActiveDrawables; }
+    bool hasActiveDrawables() const { return m_resourceHeap.hasImageBuffer() || m_resourceHeap.hasNativeImage(); }
 
 private:
-    // Because the cache/release messages are sent asynchronously from the display list items which
-    // reference the resources, it's totally possible that we see a release message before we've
-    // executed all the display list items which reference the resource. The web process tells us
-    // how many display list items will reference this resource, and we defer deletion of the resource
-    // until we execute that many display list items. It's actually a bit worse than this, though,
-    // because we may actually see a *new* cache message during the time when deletion is deferred.
-    //
-    // We can only safely delete a resource when:
-    // 1. All the cache messages have an accompanying release message, and
-    // 2. We've processed as many display list items that reference a particular resource as the web
-    // process has encoded.
-    enum class ResourceState {
-        Alive,
-        ToBeDeleted
-    };
-    struct ResourceUseCounter {
-        ResourceState state { ResourceState::Alive };
-        int64_t useOrPendingCount { 0 };
-    };
-    using ResourceUseCountersMap = HashMap<QualifiedRenderingResourceIdentifier, ResourceUseCounter>;
-
-    bool maybeRemoveResource(QualifiedRenderingResourceIdentifier, ResourceUseCountersMap::iterator&);
-    void ensureResourceUseCounter(QualifiedRenderingResourceIdentifier);
-
-    void updateHasActiveDrawables();
-
     QualifiedResourceHeap m_resourceHeap;
-
-    ResourceUseCountersMap m_resourceUseCounters;
-
-    std::atomic<bool> m_hasActiveDrawables { false };
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp (288846 => 288847)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -419,7 +419,7 @@
         return false;
     }
 
-    m_renderingBackend->recordNativeImageUse(image);
+    m_renderingBackend->remoteResourceCacheProxy().recordNativeImageUse(image);
     return true;
 }
 
@@ -433,7 +433,7 @@
     if (!canDrawImageBuffer(imageBuffer))
         return false;
 
-    m_renderingBackend->recordImageBufferUse(imageBuffer);
+    m_renderingBackend->remoteResourceCacheProxy().recordImageBufferUse(imageBuffer);
     return true;
 }
 
@@ -455,7 +455,7 @@
         return false;
     }
 
-    m_renderingBackend->recordFontUse(font);
+    m_renderingBackend->remoteResourceCacheProxy().recordFontUse(font);
     return true;
 }
 

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp (288846 => 288847)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -258,9 +258,9 @@
     sendToStream(Messages::RemoteRenderingBackend::DeleteAllFonts());
 }
 
-void RemoteRenderingBackendProxy::releaseRemoteResource(RenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
+void RemoteRenderingBackendProxy::releaseRemoteResource(RenderingResourceIdentifier renderingResourceIdentifier)
 {
-    sendToStream(Messages::RemoteRenderingBackend::ReleaseRemoteResource(renderingResourceIdentifier, useCount));
+    sendToStream(Messages::RemoteRenderingBackend::ReleaseRemoteResource(renderingResourceIdentifier));
 }
 
 void RemoteRenderingBackendProxy::finalizeRenderingUpdate()
@@ -326,21 +326,6 @@
     m_needsWakeUpSemaphoreForDisplayListStream = false;
 }
 
-void RemoteRenderingBackendProxy::recordNativeImageUse(NativeImage& image)
-{
-    m_remoteResourceCacheProxy.recordNativeImageUse(image);
-}
-
-void RemoteRenderingBackendProxy::recordFontUse(Font& font)
-{
-    m_remoteResourceCacheProxy.recordFontUse(font);
-}
-
-void RemoteRenderingBackendProxy::recordImageBufferUse(ImageBuffer& imageBuffer)
-{
-    m_remoteResourceCacheProxy.recordImageBufferUse(imageBuffer);
-}
-
 bool RemoteRenderingBackendProxy::isCached(const ImageBuffer& imageBuffer) const
 {
     if (auto cachedImageBuffer = m_remoteResourceCacheProxy.cachedImageBuffer(imageBuffer.renderingResourceIdentifier())) {

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h (288846 => 288847)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -97,7 +97,7 @@
     void cacheNativeImage(const ShareableBitmap::Handle&, WebCore::RenderingResourceIdentifier);
     void cacheFont(Ref<WebCore::Font>&&);
     void deleteAllFonts();
-    void releaseRemoteResource(WebCore::RenderingResourceIdentifier, uint64_t useCount);
+    void releaseRemoteResource(WebCore::RenderingResourceIdentifier);
 
     void finalizeRenderingUpdate();
     RenderingUpdateID renderingUpdateID() const { return m_renderingUpdateID; }
@@ -131,10 +131,6 @@
         sendToStream(WTFMove(message), renderingBackendIdentifier());
     }
 
-    void recordNativeImageUse(WebCore::NativeImage&);
-    void recordFontUse(WebCore::Font&);
-    void recordImageBufferUse(WebCore::ImageBuffer&);
-
 private:
     explicit RemoteRenderingBackendProxy(WebPage&);
 

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


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -46,13 +46,13 @@
 
 void RemoteResourceCacheProxy::cacheImageBuffer(WebCore::ImageBuffer& imageBuffer)
 {
-    auto addResult = m_imageBuffers.add(imageBuffer.renderingResourceIdentifier(), ImageBufferState { imageBuffer, 0 });
+    auto addResult = m_imageBuffers.add(imageBuffer.renderingResourceIdentifier(), imageBuffer);
     ASSERT_UNUSED(addResult, addResult.isNewEntry);
 }
 
 ImageBuffer* RemoteResourceCacheProxy::cachedImageBuffer(RenderingResourceIdentifier renderingResourceIdentifier) const
 {
-    return m_imageBuffers.get(renderingResourceIdentifier).imageBuffer.get();
+    return m_imageBuffers.get(renderingResourceIdentifier).get();
 }
 
 void RemoteResourceCacheProxy::releaseImageBuffer(RenderingResourceIdentifier renderingResourceIdentifier)
@@ -60,12 +60,10 @@
     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);
+    m_remoteRenderingBackendProxy.releaseRemoteResource(renderingResourceIdentifier);
 }
 
 inline static RefPtr<ShareableBitmap> createShareableBitmapFromNativeImage(NativeImage& image)
@@ -87,18 +85,14 @@
 void RemoteResourceCacheProxy::recordImageBufferUse(WebCore::ImageBuffer& imageBuffer)
 {
     auto iterator = m_imageBuffers.find(imageBuffer.renderingResourceIdentifier());
-    ASSERT(iterator != m_imageBuffers.end());
-
-    ++iterator->value.useCount;
+    ASSERT_UNUSED(iterator, iterator != m_imageBuffers.end());
 }
 
 void RemoteResourceCacheProxy::recordNativeImageUse(NativeImage& image)
 {
     auto iterator = m_nativeImages.find(image.renderingResourceIdentifier());
-    if (iterator != m_nativeImages.end()) {
-        ++iterator->value.useCount;
+    if (iterator != m_nativeImages.end())
         return;
-    }
 
     auto bitmap = createShareableBitmapFromNativeImage(image);
     if (!bitmap)
@@ -110,7 +104,7 @@
         return;
 
     handle.takeOwnershipOfMemory(MemoryLedger::Graphics);
-    m_nativeImages.add(image.renderingResourceIdentifier(), NativeImageState { image, 1 });
+    m_nativeImages.add(image.renderingResourceIdentifier(), image);
 
     // Set itself as an observer to NativeImage, so releaseNativeImage()
     // gets called when NativeImage is being deleleted.
@@ -122,9 +116,7 @@
 
 void RemoteResourceCacheProxy::recordFontUse(Font& font)
 {
-    auto result = m_fonts.ensure(font.renderingResourceIdentifier(), [&] {
-        return FontState { m_remoteRenderingBackendProxy.renderingUpdateID(), 1 };
-    });
+    auto result = m_fonts.add(font.renderingResourceIdentifier(), m_remoteRenderingBackendProxy.renderingUpdateID());
 
     if (result.isNewEntry) {
         m_remoteRenderingBackendProxy.cacheFont(font);
@@ -133,9 +125,8 @@
     }
 
     auto& currentState = result.iterator->value;
-    ++currentState.useCount;
-    if (currentState.lastRenderingUpdateVersionUsedWithin != m_remoteRenderingBackendProxy.renderingUpdateID()) {
-        currentState.lastRenderingUpdateVersionUsedWithin = m_remoteRenderingBackendProxy.renderingUpdateID();
+    if (currentState != m_remoteRenderingBackendProxy.renderingUpdateID()) {
+        currentState = m_remoteRenderingBackendProxy.renderingUpdateID();
         ++m_numberOfFontsUsedInCurrentRenderingUpdate;
     }
 }
@@ -145,18 +136,16 @@
     auto iterator = m_nativeImages.find(renderingResourceIdentifier);
     RELEASE_ASSERT(iterator != m_nativeImages.end());
 
-    auto useCount = iterator->value.useCount;
-
     auto success = m_nativeImages.remove(iterator);
     ASSERT_UNUSED(success, success);
 
-    m_remoteRenderingBackendProxy.releaseRemoteResource(renderingResourceIdentifier, useCount);
+    m_remoteRenderingBackendProxy.releaseRemoteResource(renderingResourceIdentifier);
 }
 
 void RemoteResourceCacheProxy::clearNativeImageMap()
 {
     for (auto& nativeImageState : m_nativeImages.values())
-        nativeImageState.image->removeObserver(*this);
+        nativeImageState->removeObserver(*this);
     m_nativeImages.clear();
 }
 
@@ -168,7 +157,7 @@
 void RemoteResourceCacheProxy::releaseAllRemoteFonts()
 {
     for (auto& fontState : m_fonts)
-        m_remoteRenderingBackendProxy.releaseRemoteResource(fontState.key, fontState.value.useCount);
+        m_remoteRenderingBackendProxy.releaseRemoteResource(fontState.key);
 }
 
 void RemoteResourceCacheProxy::clearFontMap()
@@ -189,9 +178,9 @@
     HashSet<WebCore::RenderingResourceIdentifier> toRemove;
     auto renderingUpdateID = m_remoteRenderingBackendProxy.renderingUpdateID();
     for (auto& item : m_fonts) {
-        if (renderingUpdateID - item.value.lastRenderingUpdateVersionUsedWithin >= minimumRenderingUpdateCountToKeepFontAlive) {
+        if (renderingUpdateID - item.value >= minimumRenderingUpdateCountToKeepFontAlive) {
             toRemove.add(item.key);
-            m_remoteRenderingBackendProxy.releaseRemoteResource(item.key, item.value.useCount);
+            m_remoteRenderingBackendProxy.releaseRemoteResource(item.key);
         }
     }
 
@@ -213,17 +202,16 @@
 
     // Get a copy of m_imageBuffers.values() because clearBackend()
     // may release some of the cached ImageBuffers.
-    for (auto& item : copyToVector(m_imageBuffers.values())) {
-        if (!item.imageBuffer)
+    for (auto& imageBuffer : copyToVector(m_imageBuffers.values())) {
+        if (!imageBuffer)
             continue;
-        item.useCount = 0;
-        item.imageBuffer->clearBackend();
+        imageBuffer->clearBackend();
     }
 
-    for (auto& item : m_imageBuffers.values()) {
-        if (!item.imageBuffer)
+    for (auto& imageBuffer : m_imageBuffers.values()) {
+        if (!imageBuffer)
             continue;
-        m_remoteRenderingBackendProxy.createRemoteImageBuffer(*item.imageBuffer);
+        m_remoteRenderingBackendProxy.createRemoteImageBuffer(*imageBuffer);
     }
 }
 

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


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h	2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h	2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020 Apple Inc.  All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -63,23 +63,9 @@
     unsigned imagesCount() const { return m_nativeImages.size(); }
 
 private:
-    struct ImageBufferState {
-        WeakPtr<WebCore::ImageBuffer> imageBuffer;
-        uint64_t useCount;
-    };
-    using ImageBufferHashMap = HashMap<WebCore::RenderingResourceIdentifier, ImageBufferState>;
-
-    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>;
+    using ImageBufferHashMap = HashMap<WebCore::RenderingResourceIdentifier, WeakPtr<WebCore::ImageBuffer>>;
+    using NativeImageHashMap = HashMap<WebCore::RenderingResourceIdentifier, WeakPtr<WebCore::NativeImage>>;
+    using FontHashMap = HashMap<WebCore::RenderingResourceIdentifier, RenderingUpdateID>;
     
     void releaseNativeImage(WebCore::RenderingResourceIdentifier) override;
     void clearNativeImageMap();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to