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