Title: [291053] trunk/Source
Revision
291053
Author
simon.fra...@apple.com
Date
2022-03-09 10:16:03 -0800 (Wed, 09 Mar 2022)

Log Message

Move RemoteLayerBackingStore::Buffer.isVolatile into ImageBufferBackend
https://bugs.webkit.org/show_bug.cgi?id=237631

Reviewed by Tim Horton.
Source/WebCore:

'isVolatile' is a property of a specific image buffer, so it makes more sense to have it in
ImageBuffer[Backend] than RemoteLayerBackingStore. This also allows GPU Process code to
maintain volatility state in the web process, which reduces the amount of IPC needed when
making the front buffer non-volatile before display.

So ImageBufferBackend gets volatilityState()/setVolatilityState(), accessed via ImageBuffer.
This state is maintained by RemoteRenderingBackendProxy for remote buffers. We set the state
to volatile when we receive the IPC reply for markSurfacesVolatile(), which requires
changing the reply to list buffers for which making volatile was successful.

RemoteLayerWithRemoteRenderingBackingStoreCollection::makeFrontBufferNonVolatile() can now
early return when the buffer is already non-volatile, and we have a backend handle (recall
that we clear backend handles when trying to make a buffer volatile).

* platform/graphics/ConcreteImageBuffer.h:
* platform/graphics/ImageBuffer.h:
* platform/graphics/ImageBufferBackend.h:
(WebCore::ImageBufferBackend::volatilityState const):
(WebCore::ImageBufferBackend::setVolatilityState):
* platform/graphics/cg/ImageBufferIOSurfaceBackend.cpp:
(WebCore::ImageBufferIOSurfaceBackend::setVolatile):
(WebCore::ImageBufferIOSurfaceBackend::setNonVolatile):
(WebCore::ImageBufferIOSurfaceBackend::volatilityState const):
(WebCore::ImageBufferIOSurfaceBackend::setVolatilityState):
* platform/graphics/cg/ImageBufferIOSurfaceBackend.h:

Source/WebKit:

'isVolatile' is a property of a specific image buffer, so it makes more sense to have it in
ImageBuffer[Backend] than RemoteLayerBackingStore. This also allows GPU Process code to
maintain volatility state in the web process, which reduces the amount of IPC needed when
making the front buffer non-volatile before display.

So ImageBufferBackend gets volatilityState()/setVolatilityState(), accessed via ImageBuffer.
This state is maintained by RemoteRenderingBackendProxy for remote buffers. We set the state
to volatile when we receive the IPC reply for markSurfacesVolatile(), which requires
changing the reply to list buffers for which making volatile was successful.

RemoteLayerWithRemoteRenderingBackingStoreCollection::makeFrontBufferNonVolatile() can now
early return when the buffer is already non-volatile, and we have a backend handle (recall
that we clear backend handles when trying to make a buffer volatile).

* GPUProcess/graphics/RemoteRenderingBackend.cpp:
(WebKit::RemoteRenderingBackend::markSurfacesVolatile):
* GPUProcess/graphics/RemoteRenderingBackend.h:
* GPUProcess/graphics/RemoteRenderingBackend.messages.in:
* Shared/RemoteLayerTree/RemoteLayerBackingStore.h:
* Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
(WebKit::RemoteLayerBackingStore::applySwappedBuffers):
(WebKit::RemoteLayerBackingStore::setBufferVolatile):
(WebKit::RemoteLayerBackingStore::setBufferNonVolatile):
(WebKit::RemoteLayerBackingStore::didMakeFrontBufferNonVolatile):
(WebKit::RemoteLayerBackingStore::Buffer::discard):
* Shared/RemoteLayerTree/RemoteLayerWithRemoteRenderingBackingStoreCollection.mm:
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::RemoteLayerWithRemoteRenderingBackingStoreCollection):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::makeFrontBufferNonVolatile):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::collectBackingStoreBufferIdentifiersToMarkVolatile):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::sendMarkBuffersVolatile): Call the completion handler inside the callback.
* WebProcess/GPU/graphics/ImageBufferBackendHandleSharing.h:
(WebKit::ImageBufferBackendHandleSharing::hasBackendHandle const):
* WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
(WebKit::RemoteRenderingBackendProxy::swapToValidFrontBuffer):
(WebKit::RemoteRenderingBackendProxy::markSurfaceNonVolatile):
(WebKit::RemoteRenderingBackendProxy::markSurfacesVolatile):
* WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
* WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.cpp:
(WebKit::ImageBufferRemoteIOSurfaceBackend::createBackendHandle const):
(WebKit::ImageBufferRemoteIOSurfaceBackend::hasBackendHandle const):
* WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (291052 => 291053)


--- trunk/Source/WebCore/ChangeLog	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebCore/ChangeLog	2022-03-09 18:16:03 UTC (rev 291053)
@@ -1,3 +1,36 @@
+2022-03-09  Simon Fraser  <simon.fra...@apple.com>
+
+        Move RemoteLayerBackingStore::Buffer.isVolatile into ImageBufferBackend
+        https://bugs.webkit.org/show_bug.cgi?id=237631
+
+        Reviewed by Tim Horton.
+
+        'isVolatile' is a property of a specific image buffer, so it makes more sense to have it in
+        ImageBuffer[Backend] than RemoteLayerBackingStore. This also allows GPU Process code to
+        maintain volatility state in the web process, which reduces the amount of IPC needed when
+        making the front buffer non-volatile before display.
+
+        So ImageBufferBackend gets volatilityState()/setVolatilityState(), accessed via ImageBuffer.
+        This state is maintained by RemoteRenderingBackendProxy for remote buffers. We set the state
+        to volatile when we receive the IPC reply for markSurfacesVolatile(), which requires
+        changing the reply to list buffers for which making volatile was successful.
+
+        RemoteLayerWithRemoteRenderingBackingStoreCollection::makeFrontBufferNonVolatile() can now
+        early return when the buffer is already non-volatile, and we have a backend handle (recall
+        that we clear backend handles when trying to make a buffer volatile).
+
+        * platform/graphics/ConcreteImageBuffer.h:
+        * platform/graphics/ImageBuffer.h:
+        * platform/graphics/ImageBufferBackend.h:
+        (WebCore::ImageBufferBackend::volatilityState const):
+        (WebCore::ImageBufferBackend::setVolatilityState):
+        * platform/graphics/cg/ImageBufferIOSurfaceBackend.cpp:
+        (WebCore::ImageBufferIOSurfaceBackend::setVolatile):
+        (WebCore::ImageBufferIOSurfaceBackend::setNonVolatile):
+        (WebCore::ImageBufferIOSurfaceBackend::volatilityState const):
+        (WebCore::ImageBufferIOSurfaceBackend::setVolatilityState):
+        * platform/graphics/cg/ImageBufferIOSurfaceBackend.h:
+
 2022-03-09  Youenn Fablet  <you...@apple.com>
 
         Allow to pass webrtc video frame buffers through RealtimeMediaSource based pipelines

Modified: trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h (291052 => 291053)


--- trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h	2022-03-09 18:16:03 UTC (rev 291053)
@@ -305,6 +305,19 @@
         return SetNonVolatileResult::Valid;
     }
 
+    VolatilityState volatilityState() const final
+    {
+        if (auto* backend = ensureBackendCreated())
+            return backend->volatilityState();
+        return VolatilityState::NonVolatile;
+    }
+
+    void setVolatilityState(VolatilityState volatilityState) final
+    {
+        if (auto* backend = ensureBackendCreated())
+            backend->setVolatilityState(volatilityState);
+    }
+
     std::unique_ptr<ThreadSafeImageBufferFlusher> createFlusher() override
     {
         if (auto* backend = ensureBackendCreated())

Modified: trunk/Source/WebCore/platform/graphics/ImageBuffer.h (291052 => 291053)


--- trunk/Source/WebCore/platform/graphics/ImageBuffer.h	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebCore/platform/graphics/ImageBuffer.h	2022-03-09 18:16:03 UTC (rev 291053)
@@ -93,6 +93,8 @@
     // Returns true on success.
     virtual bool setVolatile() = 0;
     virtual SetNonVolatileResult setNonVolatile() = 0;
+    virtual VolatilityState volatilityState() const = 0;
+    virtual void setVolatilityState(VolatilityState) = 0;
 
     virtual std::unique_ptr<ThreadSafeImageBufferFlusher> createFlusher() = 0;
 

Modified: trunk/Source/WebCore/platform/graphics/ImageBufferBackend.h (291052 => 291053)


--- trunk/Source/WebCore/platform/graphics/ImageBufferBackend.h	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebCore/platform/graphics/ImageBufferBackend.h	2022-03-09 18:16:03 UTC (rev 291053)
@@ -60,6 +60,11 @@
     Empty
 };
 
+enum class VolatilityState : uint8_t {
+    NonVolatile,
+    Volatile
+};
+
 class ThreadSafeImageBufferFlusher {
     WTF_MAKE_FAST_ALLOCATED;
     WTF_MAKE_NONCOPYABLE(ThreadSafeImageBufferFlusher);
@@ -127,6 +132,8 @@
     // Returns true on success.
     virtual bool setVolatile() { return true; }
     virtual SetNonVolatileResult setNonVolatile() { return SetNonVolatileResult::Valid; }
+    virtual VolatilityState volatilityState() const { return VolatilityState::NonVolatile; }
+    virtual void setVolatilityState(VolatilityState) { }
 
     virtual std::unique_ptr<ThreadSafeImageBufferFlusher> createFlusher() { return nullptr; }
 

Modified: trunk/Source/WebCore/platform/graphics/cg/ImageBufferIOSurfaceBackend.cpp (291052 => 291053)


--- trunk/Source/WebCore/platform/graphics/cg/ImageBufferIOSurfaceBackend.cpp	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebCore/platform/graphics/cg/ImageBufferIOSurfaceBackend.cpp	2022-03-09 18:16:03 UTC (rev 291053)
@@ -239,6 +239,7 @@
     if (m_surface->isInUse())
         return false;
 
+    setVolatilityState(VolatilityState::Volatile);
     m_surface->setVolatile(true);
     return true;
 }
@@ -245,9 +246,20 @@
 
 SetNonVolatileResult ImageBufferIOSurfaceBackend::setNonVolatile()
 {
+    setVolatilityState(VolatilityState::NonVolatile);
     return m_surface->setVolatile(false);
 }
 
+VolatilityState ImageBufferIOSurfaceBackend::volatilityState() const
+{
+    return m_volatilityState;
+}
+
+void ImageBufferIOSurfaceBackend::setVolatilityState(VolatilityState volatilityState)
+{
+    m_volatilityState = volatilityState;
+}
+
 void ImageBufferIOSurfaceBackend::releaseBufferToPool()
 {
     IOSurface::moveToPool(WTFMove(m_surface));

Modified: trunk/Source/WebCore/platform/graphics/cg/ImageBufferIOSurfaceBackend.h (291052 => 291053)


--- trunk/Source/WebCore/platform/graphics/cg/ImageBufferIOSurfaceBackend.h	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebCore/platform/graphics/cg/ImageBufferIOSurfaceBackend.h	2022-03-09 18:16:03 UTC (rev 291053)
@@ -70,8 +70,10 @@
     void releaseGraphicsContext() override;
     void releaseBufferToPool() override;
 
-    bool setVolatile() override;
-    SetNonVolatileResult setNonVolatile() override;
+    bool setVolatile() final;
+    SetNonVolatileResult setNonVolatile() final;
+    VolatilityState volatilityState() const final;
+    void setVolatilityState(VolatilityState) final;
 
     void ensureNativeImagesHaveCopiedBackingStore() final;
 
@@ -89,6 +91,7 @@
     mutable bool m_requiresDrawAfterPutPixelBuffer { false };
 
     mutable bool m_needsSetupContext { false };
+    VolatilityState m_volatilityState { VolatilityState::NonVolatile };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebKit/ChangeLog (291052 => 291053)


--- trunk/Source/WebKit/ChangeLog	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/ChangeLog	2022-03-09 18:16:03 UTC (rev 291053)
@@ -1,3 +1,52 @@
+2022-03-09  Simon Fraser  <simon.fra...@apple.com>
+
+        Move RemoteLayerBackingStore::Buffer.isVolatile into ImageBufferBackend
+        https://bugs.webkit.org/show_bug.cgi?id=237631
+
+        Reviewed by Tim Horton.
+        
+        'isVolatile' is a property of a specific image buffer, so it makes more sense to have it in
+        ImageBuffer[Backend] than RemoteLayerBackingStore. This also allows GPU Process code to
+        maintain volatility state in the web process, which reduces the amount of IPC needed when
+        making the front buffer non-volatile before display.
+
+        So ImageBufferBackend gets volatilityState()/setVolatilityState(), accessed via ImageBuffer.
+        This state is maintained by RemoteRenderingBackendProxy for remote buffers. We set the state
+        to volatile when we receive the IPC reply for markSurfacesVolatile(), which requires
+        changing the reply to list buffers for which making volatile was successful.
+
+        RemoteLayerWithRemoteRenderingBackingStoreCollection::makeFrontBufferNonVolatile() can now
+        early return when the buffer is already non-volatile, and we have a backend handle (recall
+        that we clear backend handles when trying to make a buffer volatile).
+
+        * GPUProcess/graphics/RemoteRenderingBackend.cpp:
+        (WebKit::RemoteRenderingBackend::markSurfacesVolatile):
+        * GPUProcess/graphics/RemoteRenderingBackend.h:
+        * GPUProcess/graphics/RemoteRenderingBackend.messages.in:
+        * Shared/RemoteLayerTree/RemoteLayerBackingStore.h:
+        * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
+        (WebKit::RemoteLayerBackingStore::applySwappedBuffers):
+        (WebKit::RemoteLayerBackingStore::setBufferVolatile):
+        (WebKit::RemoteLayerBackingStore::setBufferNonVolatile):
+        (WebKit::RemoteLayerBackingStore::didMakeFrontBufferNonVolatile):
+        (WebKit::RemoteLayerBackingStore::Buffer::discard):
+        * Shared/RemoteLayerTree/RemoteLayerWithRemoteRenderingBackingStoreCollection.mm:
+        (WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::RemoteLayerWithRemoteRenderingBackingStoreCollection):
+        (WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::makeFrontBufferNonVolatile):
+        (WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::collectBackingStoreBufferIdentifiersToMarkVolatile):
+        (WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::sendMarkBuffersVolatile): Call the completion handler inside the callback.
+        * WebProcess/GPU/graphics/ImageBufferBackendHandleSharing.h:
+        (WebKit::ImageBufferBackendHandleSharing::hasBackendHandle const):
+        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
+        (WebKit::RemoteRenderingBackendProxy::swapToValidFrontBuffer):
+        (WebKit::RemoteRenderingBackendProxy::markSurfaceNonVolatile):
+        (WebKit::RemoteRenderingBackendProxy::markSurfacesVolatile):
+        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
+        * WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.cpp:
+        (WebKit::ImageBufferRemoteIOSurfaceBackend::createBackendHandle const):
+        (WebKit::ImageBufferRemoteIOSurfaceBackend::hasBackendHandle const):
+        * WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.h:
+
 2022-03-09  Youenn Fablet  <you...@apple.com>
 
         Allow to pass webrtc video frame buffers through RealtimeMediaSource based pipelines

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp (291052 => 291053)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp	2022-03-09 18:16:03 UTC (rev 291053)
@@ -464,7 +464,7 @@
     completionHandler(resultBufferSet, WTFMove(frontBufferHandle), frontBufferWasEmpty);
 }
 
-void RemoteRenderingBackend::markSurfacesVolatile(const Vector<WebCore::RenderingResourceIdentifier>& identifiers, CompletionHandler<void(const Vector<WebCore::RenderingResourceIdentifier>& inUseBufferIdentifiers)>&& completionHandler)
+void RemoteRenderingBackend::markSurfacesVolatile(const Vector<WebCore::RenderingResourceIdentifier>& identifiers, CompletionHandler<void(const Vector<WebCore::RenderingResourceIdentifier>& markedVolatileBufferIdentifiers)>&& completionHandler)
 {
     LOG_WITH_STREAM(RemoteRenderingBufferVolatility, stream << "GPU Process: RemoteRenderingBackend::markSurfacesVolatile " << identifiers);
 
@@ -473,19 +473,19 @@
         return imageBuffer.setVolatile();
     };
 
-    Vector<WebCore::RenderingResourceIdentifier> inUseBufferIdentifiers;
+    Vector<WebCore::RenderingResourceIdentifier> markedVolatileBufferIdentifiers;
     for (auto identifier : identifiers) {
         auto imageBuffer = m_remoteResourceCache.cachedImageBuffer({ identifier, m_gpuConnectionToWebProcess->webProcessIdentifier() });
         if (imageBuffer) {
-            if (!makeVolatile(*imageBuffer))
-                inUseBufferIdentifiers.append(identifier);
+            if (makeVolatile(*imageBuffer))
+                markedVolatileBufferIdentifiers.append(identifier);
         } else
             LOG_WITH_STREAM(RemoteRenderingBufferVolatility, stream << " failed to find ImageBuffer for identifier " << identifier);
     }
 
-    LOG_WITH_STREAM(RemoteRenderingBufferVolatility, stream << "GPU Process: markSurfacesVolatile - in-use surfaces " << inUseBufferIdentifiers);
+    LOG_WITH_STREAM(RemoteRenderingBufferVolatility, stream << "GPU Process: markSurfacesVolatile - surfaces marked volatile " << markedVolatileBufferIdentifiers);
 
-    completionHandler(inUseBufferIdentifiers);
+    completionHandler(markedVolatileBufferIdentifiers);
 }
 
 void RemoteRenderingBackend::finalizeRenderingUpdate(RenderingUpdateID renderingUpdateID)

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h (291052 => 291053)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h	2022-03-09 18:16:03 UTC (rev 291053)
@@ -118,7 +118,7 @@
     void deleteAllFonts();
     void releaseRemoteResource(WebCore::RenderingResourceIdentifier);
     void finalizeRenderingUpdate(RenderingUpdateID);
-    void markSurfacesVolatile(const Vector<WebCore::RenderingResourceIdentifier>&, CompletionHandler<void(const Vector<WebCore::RenderingResourceIdentifier>& inUseBufferIdentifiers)>&&);
+    void markSurfacesVolatile(const Vector<WebCore::RenderingResourceIdentifier>&, CompletionHandler<void(const Vector<WebCore::RenderingResourceIdentifier>& markedVolatileBufferIdentifiers)>&&);
 
     void markSurfaceNonVolatile(WebCore::RenderingResourceIdentifier, CompletionHandler<void(std::optional<ImageBufferBackendHandle>, bool bufferWasEmpty)>&&);
     void swapToValidFrontBuffer(const BufferIdentifierSet& bufferSet, CompletionHandler<void(const BufferIdentifierSet& swappedBufferSet, std::optional<ImageBufferBackendHandle>&& frontBufferHandle, bool frontBufferWasEmpty)>&&);

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


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in	2022-03-09 18:16:03 UTC (rev 291053)
@@ -40,7 +40,7 @@
     MarkSurfaceNonVolatile(WebCore::RenderingResourceIdentifier renderingResourceIdentifier) -> (std::optional<WebKit::ImageBufferBackendHandle> backendHandle, bool bufferWasEmpty) Synchronous NotStreamEncodable NotStreamEncodableReply
     SwapToValidFrontBuffer(struct WebKit::BufferIdentifierSet bufferSet) -> (struct WebKit::BufferIdentifierSet swappedBufferSet, std::optional<WebKit::ImageBufferBackendHandle> frontBufferHandle, bool frontBufferWasEmpty) Synchronous NotStreamEncodable NotStreamEncodableReply
 
-    MarkSurfacesVolatile(Vector<WebCore::RenderingResourceIdentifier> renderingResourceIdentifiers) -> (Vector<WebCore::RenderingResourceIdentifier> inUseBufferIdentifiers) Synchronous
+    MarkSurfacesVolatile(Vector<WebCore::RenderingResourceIdentifier> renderingResourceIdentifiers) -> (Vector<WebCore::RenderingResourceIdentifier> markedVolatileBufferIdentifiers) Synchronous
 
     FinalizeRenderingUpdate(WebKit::RenderingUpdateID renderingUpdateID)
 }

Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h (291052 => 291053)


--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h	2022-03-09 18:16:03 UTC (rev 291053)
@@ -124,10 +124,6 @@
 #if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
         RefPtr<WebCore::ImageBuffer> displayListImageBuffer;
 #endif
-        // FIXME: This flag needs to be part of ImageBuffer[Backend]. Currently it's not correctly maintained
-        // in the GPU Process code path.
-        bool isVolatile = false;
-
         explicit operator bool() const
         {
             return !!imageBuffer;

Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm (291052 => 291053)


--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm	2022-03-09 18:16:03 UTC (rev 291053)
@@ -246,8 +246,6 @@
     m_backBuffer.imageBuffer = WTFMove(back);
     m_secondaryBackBuffer.imageBuffer = WTFMove(secondaryBack);
 
-    m_frontBuffer.isVolatile = false;
-
     if (frontBufferNeedsDisplay)
         setNeedsDisplay();
 }
@@ -531,15 +529,11 @@
 
 bool RemoteLayerBackingStore::setBufferVolatile(Buffer& buffer)
 {
-    if (!buffer.imageBuffer || buffer.isVolatile)
+    if (!buffer.imageBuffer || buffer.imageBuffer->volatilityState() == WebCore::VolatilityState::Volatile)
         return true;
 
     buffer.imageBuffer->releaseGraphicsContext();
-    if (buffer.imageBuffer->setVolatile()) {
-        buffer.isVolatile = true;
-        return true;
-    }
-    return false;
+    return buffer.imageBuffer->setVolatile();
 }
 
 WebCore::SetNonVolatileResult RemoteLayerBackingStore::setBufferNonVolatile(Buffer& buffer)
@@ -549,10 +543,9 @@
     if (!buffer.imageBuffer)
         return WebCore::SetNonVolatileResult::Valid; // Not really valid but the caller only checked the Empty state.
 
-    if (!buffer.isVolatile)
+    if (buffer.imageBuffer->volatilityState() == WebCore::VolatilityState::NonVolatile)
         return WebCore::SetNonVolatileResult::Valid;
 
-    buffer.isVolatile = false;
     return buffer.imageBuffer->setNonVolatile();
 }
 
@@ -576,7 +569,6 @@
 
 void RemoteLayerBackingStore::didMakeFrontBufferNonVolatile(WebCore::SetNonVolatileResult result)
 {
-    m_frontBuffer.isVolatile = false;
     if (result == WebCore::SetNonVolatileResult::Empty)
         setNeedsDisplay();
 }
@@ -627,7 +619,6 @@
 
 void RemoteLayerBackingStore::Buffer::discard()
 {
-    isVolatile = false;
     if (imageBuffer)
         imageBuffer->releaseBufferToPool();
     imageBuffer = nullptr;

Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerWithRemoteRenderingBackingStoreCollection.mm (291052 => 291053)


--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerWithRemoteRenderingBackingStoreCollection.mm	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerWithRemoteRenderingBackingStoreCollection.mm	2022-03-09 18:16:03 UTC (rev 291053)
@@ -45,11 +45,25 @@
 
 void RemoteLayerWithRemoteRenderingBackingStoreCollection::makeFrontBufferNonVolatile(RemoteLayerBackingStore& backingStore)
 {
-    auto& remoteRenderingBackend = layerTreeContext().ensureRemoteRenderingBackendProxy();
     auto frontBuffer = backingStore.bufferForType(RemoteLayerBackingStore::BufferType::Front);
     if (!frontBuffer)
         return;
 
+    auto hasBackendHandle = [](const WebCore::ImageBuffer& buffer) {
+        if (auto* backend = buffer.ensureBackendCreated()) {
+            auto* sharing = backend->toBackendSharing();
+            if (is<ImageBufferBackendHandleSharing>(sharing))
+                return downcast<ImageBufferBackendHandleSharing>(*sharing).hasBackendHandle();
+        }
+        return false;
+    };
+
+    LOG_WITH_STREAM(RemoteRenderingBufferVolatility, stream << "RemoteLayerWithRemoteRenderingBackingStoreCollection::makeFrontBufferNonVolatile - front buffer " << frontBuffer->renderingResourceIdentifier() << " is non volatile " << (frontBuffer->volatilityState() == WebCore::VolatilityState::NonVolatile));
+
+    if (frontBuffer->volatilityState() == WebCore::VolatilityState::NonVolatile && hasBackendHandle(*frontBuffer))
+        return;
+
+    auto& remoteRenderingBackend = layerTreeContext().ensureRemoteRenderingBackendProxy();
     auto result = remoteRenderingBackend.markSurfaceNonVolatile(frontBuffer->renderingResourceIdentifier());
     backingStore.didMakeFrontBufferNonVolatile(result);
 }
@@ -77,12 +91,14 @@
 {
     ASSERT(!m_inLayerFlush);
 
-    // FIXME: This doesn't consult RemoteLayerBackingStore::Buffer::isVolatile, so we may redundantly request volatility.
     auto collectBuffer = [&](RemoteLayerBackingStore::BufferType bufferType) {
         auto buffer = backingStore.bufferForType(bufferType);
         if (!buffer)
             return;
 
+        if (buffer->volatilityState() != WebCore::VolatilityState::NonVolatile)
+            return;
+
         backingStore.willMakeBufferVolatile(bufferType);
         identifiers.append(buffer->renderingResourceIdentifier());
     };
@@ -178,14 +194,10 @@
 {
     auto& remoteRenderingBackend = m_layerTreeContext.ensureRemoteRenderingBackendProxy();
     
-    Vector<WebCore::RenderingResourceIdentifier> inUseBufferIdentifiers;
-    remoteRenderingBackend.markSurfacesVolatile(WTFMove(identifiers), [&inUseBufferIdentifiers](Vector<WebCore::RenderingResourceIdentifier>&& inUseBuffers) {
-        inUseBufferIdentifiers = WTFMove(inUseBuffers);
+    remoteRenderingBackend.markSurfacesVolatile(WTFMove(identifiers), [completionHandler = WTFMove(completionHandler)](bool markedAllVolatile) mutable {
+        LOG_WITH_STREAM(RemoteRenderingBufferVolatility, stream << "RemoteLayerWithRemoteRenderingBackingStoreCollection::sendMarkBuffersVolatile: marked all volatile " << markedAllVolatile);
+        completionHandler(markedAllVolatile);
     });
-
-    LOG_WITH_STREAM(RemoteRenderingBufferVolatility, stream << "RemoteLayerWithRemoteRenderingBackingStoreCollection::sendMarkBuffersVolatile: " << inUseBufferIdentifiers.size() << " buffers still in-use");
-    // FIXME: inUseBufferIdentifiers will be used to map back to an ImageBuffer and maintain its "isVolatile" flag.
-    completionHandler(inUseBufferIdentifiers.isEmpty());
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/ImageBufferBackendHandleSharing.h (291052 => 291053)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/ImageBufferBackendHandleSharing.h	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/ImageBufferBackendHandleSharing.h	2022-03-09 18:16:03 UTC (rev 291053)
@@ -37,6 +37,7 @@
     virtual ImageBufferBackendHandle createBackendHandle() const = 0;
 
     virtual void setBackendHandle(ImageBufferBackendHandle&&) { }
+    virtual bool hasBackendHandle() const { return false; }
     virtual void clearBackendHandle() { }
 
 private:

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


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp	2022-03-09 18:16:03 UTC (rev 291053)
@@ -304,7 +304,9 @@
     sendSyncToStream(Messages::RemoteRenderingBackend::SwapToValidFrontBuffer(bufferSet),
         Messages::RemoteRenderingBackend::SwapToValidFrontBuffer::Reply(swappedBufferSet, frontBufferHandle, frontBufferWasEmpty));
 
-    auto fetchBufferWithIdentifier = [&](std::optional<RenderingResourceIdentifier> identifier, std::optional<ImageBufferBackendHandle>&& handle = std::nullopt) -> RefPtr<ImageBuffer> {
+    ALWAYS_LOG_WITH_STREAM(stream << "RemoteRenderingBackendProxy::swapToValidFrontBuffer swapped to " << swappedBufferSet.front << " " << swappedBufferSet.back << " " << swappedBufferSet.secondaryBack);
+
+    auto fetchBufferWithIdentifier = [&](std::optional<RenderingResourceIdentifier> identifier, std::optional<ImageBufferBackendHandle>&& handle = std::nullopt, bool isFrontBuffer = false) -> RefPtr<ImageBuffer> {
         if (!identifier)
             return nullptr;
 
@@ -319,6 +321,11 @@
                     downcast<ImageBufferBackendHandleSharing>(*sharing).setBackendHandle(WTFMove(*handle));
             }
         }
+        
+        if (isFrontBuffer) {
+            // We know the GPU Process always sets the new front buffer to be non-volatile.
+            buffer->setVolatilityState(VolatilityState::NonVolatile);
+        }
 
         return buffer;
     };
@@ -325,7 +332,7 @@
 
     return {
         {
-            fetchBufferWithIdentifier(swappedBufferSet.front, WTFMove(frontBufferHandle)),
+            fetchBufferWithIdentifier(swappedBufferSet.front, WTFMove(frontBufferHandle), true),
             fetchBufferWithIdentifier(swappedBufferSet.back),
             fetchBufferWithIdentifier(swappedBufferSet.secondaryBack)
         },
@@ -348,18 +355,27 @@
             if (is<ImageBufferBackendHandleSharing>(sharing))
                 downcast<ImageBufferBackendHandleSharing>(*sharing).setBackendHandle(WTFMove(*backendHandle));
         }
+
+        buffer->setVolatilityState(VolatilityState::NonVolatile);
     }
 
     return bufferWasEmpty ? SetNonVolatileResult::Empty : SetNonVolatileResult::Valid;
 }
 
-void RemoteRenderingBackendProxy::markSurfacesVolatile(Vector<WebCore::RenderingResourceIdentifier>&& identifiers, CompletionHandler<void(Vector<WebCore::RenderingResourceIdentifier>&&)>&& completionHandler)
+void RemoteRenderingBackendProxy::markSurfacesVolatile(Vector<WebCore::RenderingResourceIdentifier>&& identifiers, CompletionHandler<void(bool)>&& completionHandler)
 {
-    Vector<WebCore::RenderingResourceIdentifier> inUseBufferIdentifiers;
-    // FIXME: This should become async when webkit.org/b/235965 is fixed.
-    sendSyncToStream(Messages::RemoteRenderingBackend::MarkSurfacesVolatile(identifiers), Messages::RemoteRenderingBackend::MarkSurfacesVolatile::Reply(inUseBufferIdentifiers));
+    Vector<WebCore::RenderingResourceIdentifier> markedVolatileBufferIdentifiers;
+    // FIXME: This could become async when webkit.org/b/235965 is fixed (but be careful with buffer volatility state).
+    sendSyncToStream(Messages::RemoteRenderingBackend::MarkSurfacesVolatile(identifiers), Messages::RemoteRenderingBackend::MarkSurfacesVolatile::Reply(markedVolatileBufferIdentifiers));
 
-    completionHandler(WTFMove(inUseBufferIdentifiers));
+    for (auto identifier : markedVolatileBufferIdentifiers) {
+        auto imageBuffer = m_remoteResourceCacheProxy.cachedImageBuffer(identifier);
+        if (imageBuffer)
+            imageBuffer->setVolatilityState(WebCore::VolatilityState::Volatile);
+    }
+    
+    bool markedAllVolatile = identifiers.size() == markedVolatileBufferIdentifiers.size();
+    completionHandler(markedAllVolatile);
 }
 
 void RemoteRenderingBackendProxy::finalizeRenderingUpdate()

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


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h	2022-03-09 18:16:03 UTC (rev 291053)
@@ -93,7 +93,7 @@
     void cacheFont(Ref<WebCore::Font>&&);
     void deleteAllFonts();
     void releaseRemoteResource(WebCore::RenderingResourceIdentifier);
-    void markSurfacesVolatile(Vector<WebCore::RenderingResourceIdentifier>&&, CompletionHandler<void(Vector<WebCore::RenderingResourceIdentifier>&& inUseBufferIdentifiers)>&&);
+    void markSurfacesVolatile(Vector<WebCore::RenderingResourceIdentifier>&&, CompletionHandler<void(bool madeAllVolatile)>&&);
 
     WebCore::SetNonVolatileResult markSurfaceNonVolatile(WebCore::RenderingResourceIdentifier);
 

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.cpp (291052 => 291053)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.cpp	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.cpp	2022-03-09 18:16:03 UTC (rev 291053)
@@ -66,6 +66,11 @@
 
 ImageBufferBackendHandle ImageBufferRemoteIOSurfaceBackend::createBackendHandle() const
 {
+    if (!std::holds_alternative<MachSendRight>(m_handle)) {
+        RELEASE_ASSERT_NOT_REACHED();
+        return { };
+    }
+
     return std::get<MachSendRight>(m_handle).copySendRight();
 }
 
@@ -79,6 +84,11 @@
     m_handle = { };
 }
 
+bool ImageBufferRemoteIOSurfaceBackend::hasBackendHandle() const
+{
+    return std::holds_alternative<MachSendRight>(m_handle);
+}
+
 GraphicsContext& ImageBufferRemoteIOSurfaceBackend::context() const
 {
     RELEASE_ASSERT_NOT_REACHED();

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.h (291052 => 291053)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.h	2022-03-09 18:13:10 UTC (rev 291052)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.h	2022-03-09 18:16:03 UTC (rev 291053)
@@ -72,12 +72,18 @@
 
     unsigned bytesPerRow() const final;
 
+    WebCore::VolatilityState volatilityState() const final { return m_volatilityState; }
+    void setVolatilityState(WebCore::VolatilityState volatilityState) final { m_volatilityState = volatilityState; }
+
     // ImageBufferBackendSharing
     ImageBufferBackendSharing* toBackendSharing() final { return this; }
     void setBackendHandle(ImageBufferBackendHandle&&) final;
     void clearBackendHandle() final;
+    bool hasBackendHandle() const final;
 
     ImageBufferBackendHandle m_handle;
+
+    WebCore::VolatilityState m_volatilityState { WebCore::VolatilityState::NonVolatile };
 };
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to