Title: [291214] trunk/Source/WebKit
Revision
291214
Author
simon.fra...@apple.com
Date
2022-03-12 20:54:09 -0800 (Sat, 12 Mar 2022)

Log Message

In RemoteLayerBackingStore, group makeFrontBufferNonVolatile() and swapToValidFrontBuffer() into a single function
https://bugs.webkit.org/show_bug.cgi?id=237806

Reviewed by Tim Horton.

As a step towards reducing the number of sync IPC calls when displaying layers, refactor
code in RemoteLayerBackingStore so that we can do the makeFrontBufferNonVolatile()
and swapToValidFrontBuffer() in a single function. Its return value indicates whether
we need to do any display, or a full display.

* Shared/RemoteLayerTree/RemoteLayerBackingStore.h:
* Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
(WebKit::operator<<):
(WebKit::RemoteLayerBackingStore::prepareToDisplay):
(WebKit::RemoteLayerBackingStore::prepareBuffers):
(WebKit::RemoteLayerBackingStore::paintContents): Fix an assertion that fired for WebGL.
(WebKit::RemoteLayerBackingStore::swapBuffers): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (291213 => 291214)


--- trunk/Source/WebKit/ChangeLog	2022-03-13 03:01:07 UTC (rev 291213)
+++ trunk/Source/WebKit/ChangeLog	2022-03-13 04:54:09 UTC (rev 291214)
@@ -1,3 +1,23 @@
+2022-03-12  Simon Fraser  <simon.fra...@apple.com>
+
+        In RemoteLayerBackingStore, group makeFrontBufferNonVolatile() and swapToValidFrontBuffer() into a single function
+        https://bugs.webkit.org/show_bug.cgi?id=237806
+
+        Reviewed by Tim Horton.
+
+        As a step towards reducing the number of sync IPC calls when displaying layers, refactor
+        code in RemoteLayerBackingStore so that we can do the makeFrontBufferNonVolatile()
+        and swapToValidFrontBuffer() in a single function. Its return value indicates whether
+        we need to do any display, or a full display.
+
+        * Shared/RemoteLayerTree/RemoteLayerBackingStore.h:
+        * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
+        (WebKit::operator<<):
+        (WebKit::RemoteLayerBackingStore::prepareToDisplay):
+        (WebKit::RemoteLayerBackingStore::prepareBuffers):
+        (WebKit::RemoteLayerBackingStore::paintContents): Fix an assertion that fired for WebGL.
+        (WebKit::RemoteLayerBackingStore::swapBuffers): Deleted.
+
 2022-03-12  Commit Queue  <commit-qu...@webkit.org>
 
         Unreviewed, reverting r291209.

Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h (291213 => 291214)


--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h	2022-03-13 03:01:07 UTC (rev 291213)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h	2022-03-13 04:54:09 UTC (rev 291214)
@@ -65,6 +65,14 @@
     void setNeedsDisplay();
 
     void setContents(WTF::MachSendRight&& surfaceHandle);
+
+    enum class PrepareBuffersResult : uint8_t {
+        NeedsFullDisplay,
+        NeedsNormalDisplay,
+        NeedsNoDisplay
+    };
+    PrepareBuffersResult prepareBuffers(bool hasEmptyDirtyRegion);
+
     // Returns true if the backing store changed.
     bool prepareToDisplay();
     void paintContents();
@@ -134,8 +142,6 @@
     bool setBufferVolatile(Buffer&);
     WebCore::SetNonVolatileResult setBufferNonVolatile(Buffer&);
 
-    void swapBuffers();
-
     bool supportsPartialRepaint() const;
 
     PlatformCALayerRemote* m_layer;

Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm (291213 => 291214)


--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm	2022-03-13 03:01:07 UTC (rev 291213)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm	2022-03-13 04:54:09 UTC (rev 291214)
@@ -246,29 +246,6 @@
     m_secondaryBackBuffer.imageBuffer = WTFMove(secondaryBack);
 }
 
-void RemoteLayerBackingStore::swapBuffers()
-{
-    m_contentsBufferHandle = std::nullopt;
-
-    auto* collection = backingStoreCollection();
-    if (!collection)
-        return;
-
-    auto result = collection->swapToValidFrontBuffer(*this);
-    if (result == WebCore::SetNonVolatileResult::Empty)
-        setNeedsDisplay();
-    
-    if (m_frontBuffer.imageBuffer)
-        return;
-
-    m_frontBuffer.imageBuffer = collection->allocateBufferForBackingStore(*this);
-
-#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
-    if (m_includeDisplayList == IncludeDisplayList::Yes)
-        m_frontBuffer.displayListImageBuffer = WebCore::ConcreteImageBuffer<CGDisplayListImageBufferBackend>::create(m_size, m_scale, WebCore::DestinationColorSpace::SRGB(), pixelFormat(), nullptr);
-#endif
-}
-
 bool RemoteLayerBackingStore::supportsPartialRepaint() const
 {
     // FIXME: Find a way to support partial repaint for backing store that
@@ -283,6 +260,18 @@
     m_paintingRects.clear();
 }
 
+#if !LOG_DISABLED
+static TextStream& operator<<(TextStream& ts, RemoteLayerBackingStore::PrepareBuffersResult result)
+{
+    switch (result) {
+    case RemoteLayerBackingStore::PrepareBuffersResult::NeedsFullDisplay: ts << "full display"; break;
+    case RemoteLayerBackingStore::PrepareBuffersResult::NeedsNormalDisplay: ts << "normal display"; break;
+    case RemoteLayerBackingStore::PrepareBuffersResult::NeedsNoDisplay: ts << "no display"; break;
+    }
+    return ts;
+}
+#endif
+
 bool RemoteLayerBackingStore::prepareToDisplay()
 {
     ASSERT(!m_frontBufferFlushers.size());
@@ -305,18 +294,16 @@
         return true;
     }
 
-    LOG_WITH_STREAM(RemoteRenderingBufferVolatility, stream << "RemoteLayerBackingStore::display()");
+    m_contentsBufferHandle = std::nullopt;
 
-    // Make the previous front buffer non-volatile early, so that we can dirty the whole layer if it comes back empty.
-    if (collection->makeFrontBufferNonVolatile(*this) == WebCore::SetNonVolatileResult::Empty)
-        setNeedsDisplay();
+    auto displayRequirement = prepareBuffers(m_dirtyRegion.isEmpty() || m_size.isEmpty());
 
-    if (m_dirtyRegion.isEmpty() || m_size.isEmpty()) {
-        LOG_WITH_STREAM(RemoteRenderingBufferVolatility, stream << " no dirty region");
+    LOG_WITH_STREAM(RemoteRenderingBufferVolatility, stream << "RemoteLayerBackingStore " << m_layer->layerID() << " prepareToDisplay() - " << displayRequirement);
+
+    if (displayRequirement == PrepareBuffersResult::NeedsNoDisplay)
         return needToEncodeBackingStore;
-    }
 
-    if (!hasFrontBuffer() || !supportsPartialRepaint())
+    if (displayRequirement == PrepareBuffersResult::NeedsFullDisplay)
         setNeedsDisplay();
 
     if (layerOwner.platformCALayerShowRepaintCounter(m_layer)) {
@@ -324,14 +311,47 @@
         m_dirtyRegion.unite(indicatorRect);
     }
 
-    swapBuffers();
+    if (!m_frontBuffer.imageBuffer) {
+        m_frontBuffer.imageBuffer = collection->allocateBufferForBackingStore(*this);
+
+#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
+        if (m_includeDisplayList == IncludeDisplayList::Yes)
+            m_frontBuffer.displayListImageBuffer = WebCore::ConcreteImageBuffer<CGDisplayListImageBufferBackend>::create(m_size, m_scale, WebCore::DestinationColorSpace::SRGB(), pixelFormat(), nullptr);
+#endif
+    }
+
     return true;
 }
 
+auto RemoteLayerBackingStore::prepareBuffers(bool hasEmptyDirtyRegion) -> PrepareBuffersResult
+{
+    auto* collection = backingStoreCollection();
+    if (!collection)
+        return PrepareBuffersResult::NeedsNoDisplay;
+
+    bool needsFullDisplay = false;
+
+    // Make the previous front buffer non-volatile early, so that we can dirty the whole layer if it comes back empty.
+    if (collection->makeFrontBufferNonVolatile(*this) == WebCore::SetNonVolatileResult::Empty)
+        needsFullDisplay = true;
+
+    if (!needsFullDisplay && hasEmptyDirtyRegion)
+        return PrepareBuffersResult::NeedsNoDisplay;
+
+    if (!hasFrontBuffer() || !supportsPartialRepaint())
+        needsFullDisplay = true;
+
+    auto result = collection->swapToValidFrontBuffer(*this);
+    if (result == WebCore::SetNonVolatileResult::Empty)
+        needsFullDisplay = true;
+
+    return needsFullDisplay ? PrepareBuffersResult::NeedsFullDisplay : PrepareBuffersResult::NeedsNormalDisplay;
+}
+
 void RemoteLayerBackingStore::paintContents()
 {
     if (!m_frontBuffer.imageBuffer) {
-        ASSERT_NOT_REACHED();
+        ASSERT(m_contentsBufferHandle);
         return;
     }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to