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