Diff
Modified: trunk/Source/WebKit/ChangeLog (269942 => 269943)
--- trunk/Source/WebKit/ChangeLog 2020-11-18 05:09:50 UTC (rev 269942)
+++ trunk/Source/WebKit/ChangeLog 2020-11-18 06:15:45 UTC (rev 269943)
@@ -1,3 +1,52 @@
+2020-11-17 Tim Horton <[email protected]>
+
+ GPU-process-hosted RemoteLayerBackingStore should flush off the main thread
+ https://bugs.webkit.org/show_bug.cgi?id=219063
+
+ Reviewed by Simon Fraser.
+
+ * GPUProcess/graphics/RemoteRenderingBackend.h:
+ * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
+ (WebKit::RemoteLayerBackingStore::display):
+ Construct the ImageBuffer flusher /after/ submitting the final DisplayList,
+ so that it takes the correct flush identifier.
+
+ * GPUProcess/graphics/RemoteImageBuffer.h:
+ * GPUProcess/graphics/RemoteRenderingBackend.cpp:
+ (WebKit::RemoteRenderingBackend::didFlush):
+ (WebKit::RemoteRenderingBackend::flushDisplayListWasCommitted): Deleted.
+ * WebProcess/GPU/graphics/RemoteImageBufferProxy.h:
+ (WebKit::RemoteImageBufferProxy::didFlush):
+ (WebKit::RemoteImageBufferProxy::lastSentFlushIdentifier const):
+ (WebKit::RemoteImageBufferProxy::waitForDidFlushOnSecondaryThread):
+ (WebKit::RemoteImageBufferProxy::hasPendingFlush const):
+ (WebKit::RemoteImageBufferProxy::waitForDidFlushWithTimeout):
+ (WebKit::ThreadSafeRemoteImageBufferFlusher::ThreadSafeRemoteImageBufferFlusher):
+ (WebKit::RemoteImageBufferProxy::commitFlushDisplayList): Deleted.
+ (WebKit::RemoteImageBufferProxy::isPendingFlush const): Deleted.
+ (WebKit::RemoteImageBufferProxy::timeoutWaitForFlushDisplayListWasCommitted): Deleted.
+ Some renames:
+
+ Rename flushDisplayListWasCommitted to didFlush; this is the back-message from
+ GPU process to Web Content process that a FlushContext display list item was completed successfully.
+ Rename isPendingFlush to hasPendingFlush, for grammar.
+ Rename timeoutWaitForFlushDisplayListWasCommitted to waitForDidFlushWithTimeout, for similar reasons.
+ Rename waitForFlushDisplayListWasCommitted to waitForDidFlush.
+ Rename commitFlushDisplayList to didFlush.
+
+ * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
+ (WebKit::RemoteRenderingBackendProxy::waitForDidFlush):
+ (WebKit::RemoteRenderingBackendProxy::didFlush):
+ (WebKit::RemoteRenderingBackendProxy::waitForFlushDisplayListWasCommitted): Deleted.
+ (WebKit::RemoteRenderingBackendProxy::flushDisplayListWasCommitted): Deleted.
+ * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
+ * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in:
+ Reimplement ThreadSafeRemoteImageBufferFlusher such that it waits
+ (on the RemoteLayerTreeDrawingArea CommitQueue, in the only current use of it)
+ for the correct flush reply to come in before continuing. This is analogous
+ to what we do for in-process buffers, where we call CGContextFlush()
+ in the flusher.
+
2020-11-17 Chris Dumez <[email protected]>
[iOS] ASSERTION FAILED: Completion handler should always be called under WebKit::GPUProcess::didReceiveMessage
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h (269942 => 269943)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h 2020-11-18 05:09:50 UTC (rev 269942)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h 2020-11-18 06:15:45 UTC (rev 269943)
@@ -87,7 +87,7 @@
if (item.is<WebCore::DisplayList::FlushContext>()) {
BaseConcreteImageBuffer::flushContext();
auto identifier = item.get<WebCore::DisplayList::FlushContext>().identifier();
- m_remoteRenderingBackend.flushDisplayListWasCommitted(identifier, m_renderingResourceIdentifier);
+ m_remoteRenderingBackend.didFlush(identifier, m_renderingResourceIdentifier);
return true;
}
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp (269942 => 269943)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp 2020-11-18 05:09:50 UTC (rev 269942)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp 2020-11-18 06:15:45 UTC (rev 269943)
@@ -104,9 +104,9 @@
send(Messages::RemoteRenderingBackendProxy::ImageBufferBackendWasCreated(logicalSize, backendSize, resolutionScale, colorSpace, pixelFormat, WTFMove(handle), renderingResourceIdentifier), m_renderingBackendIdentifier);
}
-void RemoteRenderingBackend::flushDisplayListWasCommitted(DisplayList::FlushIdentifier flushIdentifier, RenderingResourceIdentifier renderingResourceIdentifier)
+void RemoteRenderingBackend::didFlush(DisplayList::FlushIdentifier flushIdentifier, RenderingResourceIdentifier renderingResourceIdentifier)
{
- send(Messages::RemoteRenderingBackendProxy::FlushDisplayListWasCommitted(flushIdentifier, renderingResourceIdentifier), m_renderingBackendIdentifier);
+ send(Messages::RemoteRenderingBackendProxy::DidFlush(flushIdentifier, renderingResourceIdentifier), m_renderingBackendIdentifier);
}
void RemoteRenderingBackend::createImageBuffer(const FloatSize& logicalSize, RenderingMode renderingMode, float resolutionScale, ColorSpace colorSpace, PixelFormat pixelFormat, RenderingResourceIdentifier renderingResourceIdentifier)
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h (269942 => 269943)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h 2020-11-18 05:09:50 UTC (rev 269942)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h 2020-11-18 06:15:45 UTC (rev 269943)
@@ -71,7 +71,7 @@
// Messages to be sent.
void imageBufferBackendWasCreated(const WebCore::FloatSize& logicalSize, const WebCore::IntSize& backendSize, float resolutionScale, WebCore::ColorSpace, WebCore::PixelFormat, ImageBufferBackendHandle, WebCore::RenderingResourceIdentifier);
- void flushDisplayListWasCommitted(WebCore::DisplayList::FlushIdentifier, WebCore::RenderingResourceIdentifier);
+ void didFlush(WebCore::DisplayList::FlushIdentifier, WebCore::RenderingResourceIdentifier);
void setNextItemBufferToRead(WebCore::DisplayList::ItemBufferIdentifier);
Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm (269942 => 269943)
--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm 2020-11-18 05:09:50 UTC (rev 269942)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm 2020-11-18 06:15:45 UTC (rev 269943)
@@ -313,13 +313,13 @@
m_dirtyRegion = WebCore::Region();
m_paintingRects.clear();
- m_frontBufferFlusher = m_frontBuffer.imageBuffer->createFlusher();
-
m_layer->owner()->platformCALayerLayerDidDisplay(m_layer);
// FIXME: This method has a weird name. This is "submit work".
m_frontBuffer.imageBuffer->flushDrawingContextAndCommit();
+ m_frontBufferFlusher = m_frontBuffer.imageBuffer->createFlusher();
+
return true;
}
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h (269942 => 269943)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h 2020-11-18 05:09:50 UTC (rev 269942)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h 2020-11-18 06:15:45 UTC (rev 269943)
@@ -34,29 +34,15 @@
#include <WebCore/DisplayListImageBuffer.h>
#include <WebCore/DisplayListItems.h>
#include <WebCore/DisplayListRecorder.h>
+#include <wtf/Condition.h>
+#include <wtf/Lock.h>
#include <wtf/SystemTracing.h>
namespace WebKit {
class RemoteRenderingBackend;
+template<typename BackendType> class ThreadSafeRemoteImageBufferFlusher;
-class ThreadSafeRemoteImageBufferFlusher : public WebCore::ThreadSafeImageBufferFlusher {
- WTF_MAKE_FAST_ALLOCATED;
-public:
- ThreadSafeRemoteImageBufferFlusher(WebCore::ImageBuffer& imageBuffer)
- {
- // FIXME: We shouldn't synchronously wait on the flush until flush() is called, but have to invent
- // a thread-safe way to wait on the incoming message.
- imageBuffer.flushDrawingContext();
- }
-
- void flush() override
- {
- }
-
-private:
-};
-
template<typename BackendType>
class RemoteImageBufferProxy : public WebCore::DisplayList::ImageBuffer<BackendType>, public WebCore::DisplayList::Recorder::Delegate, public WebCore::DisplayList::ItemBufferWritingClient {
using BaseDisplayListImageBuffer = WebCore::DisplayList::ImageBuffer<BackendType>;
@@ -90,9 +76,11 @@
m_backend = BackendType::create(logicalSize, backendSize, resolutionScale, colorSpace, pixelFormat, WTFMove(handle));
}
- void commitFlushDisplayList(WebCore::DisplayList::FlushIdentifier flushIdentifier)
+ void didFlush(WebCore::DisplayList::FlushIdentifier flushIdentifier)
{
+ auto locker = holdLock(m_receivedFlushIdentifierLock);
m_receivedFlushIdentifier = flushIdentifier;
+ m_receivedFlushIdentifierChangedCondition.notifyAll();
}
const WebCore::FloatSize& size() const { return m_size; }
@@ -107,7 +95,23 @@
return m_backend->createImageBufferBackendHandle();
}
+ WebCore::DisplayList::FlushIdentifier lastSentFlushIdentifier() const { return m_sentFlushIdentifier; }
+
+ void waitForDidFlushOnSecondaryThread(WebCore::DisplayList::FlushIdentifier targetFlushIdentifier)
+ {
+ ASSERT(!isMainThread());
+ auto locker = holdLock(m_receivedFlushIdentifierLock);
+ m_receivedFlushIdentifierChangedCondition.wait(m_receivedFlushIdentifierLock, [&] {
+ return m_receivedFlushIdentifier == targetFlushIdentifier;
+ });
+
+ // Nothing should have sent more drawing commands to the GPU process
+ // while waiting for this ImageBuffer to be flushed.
+ ASSERT(m_sentFlushIdentifier == targetFlushIdentifier);
+ }
+
protected:
+ friend class RemoteRenderingBackend;
RemoteImageBufferProxy(const WebCore::FloatSize& size, WebCore::RenderingMode renderingMode, float resolutionScale, WebCore::ColorSpace colorSpace, WebCore::PixelFormat pixelFormat, RemoteRenderingBackendProxy& remoteRenderingBackendProxy)
: BaseDisplayListImageBuffer(size, this)
, m_remoteRenderingBackendProxy(makeWeakPtr(remoteRenderingBackendProxy))
@@ -124,9 +128,9 @@
m_drawingContext.displayList().setTracksDrawingItemExtents(false);
}
- bool isPendingFlush() const { return m_sentFlushIdentifier != m_receivedFlushIdentifier; }
+ bool hasPendingFlush() const { return m_sentFlushIdentifier != m_receivedFlushIdentifier; }
- void timeoutWaitForFlushDisplayListWasCommitted()
+ void waitForDidFlushWithTimeout()
{
if (!m_remoteRenderingBackendProxy)
return;
@@ -133,8 +137,8 @@
// Wait for our DisplayList to be flushed but do not hang.
static constexpr unsigned maxWaitingFlush = 3;
- for (unsigned numWaitingFlush = 0; numWaitingFlush < maxWaitingFlush && isPendingFlush(); ++numWaitingFlush)
- m_remoteRenderingBackendProxy->waitForFlushDisplayListWasCommitted();
+ for (unsigned numWaitingFlush = 0; numWaitingFlush < maxWaitingFlush && hasPendingFlush(); ++numWaitingFlush)
+ m_remoteRenderingBackendProxy->waitForDidFlush();
}
BackendType* ensureBackendCreated() const override
@@ -181,7 +185,7 @@
{
TraceScope tracingScope(FlushRemoteImageBufferStart, FlushRemoteImageBufferEnd);
flushDrawingContextAndCommit();
- timeoutWaitForFlushDisplayListWasCommitted();
+ waitForDidFlushWithTimeout();
}
void flushDrawingContextAndCommit() override
@@ -337,10 +341,12 @@
std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher> createFlusher() override
{
- return WTF::makeUnique<ThreadSafeRemoteImageBufferFlusher>(*this);
+ return WTF::makeUnique<ThreadSafeRemoteImageBufferFlusher<BackendType>>(*this);
}
WebCore::DisplayList::FlushIdentifier m_sentFlushIdentifier;
+ Lock m_receivedFlushIdentifierLock;
+ Condition m_receivedFlushIdentifierChangedCondition;
WebCore::DisplayList::FlushIdentifier m_receivedFlushIdentifier;
WeakPtr<RemoteRenderingBackendProxy> m_remoteRenderingBackendProxy;
size_t m_itemCountInCurrentDisplayList { 0 };
@@ -351,6 +357,26 @@
WebCore::PixelFormat m_pixelFormat;
};
+template<typename BackendType>
+class ThreadSafeRemoteImageBufferFlusher final : public WebCore::ThreadSafeImageBufferFlusher {
+ WTF_MAKE_FAST_ALLOCATED;
+public:
+ ThreadSafeRemoteImageBufferFlusher(RemoteImageBufferProxy<BackendType>& imageBuffer)
+ : m_imageBuffer(imageBuffer)
+ , m_targetFlushIdentifier(imageBuffer.lastSentFlushIdentifier())
+ {
+ }
+
+ void flush() final
+ {
+ m_imageBuffer->waitForDidFlushOnSecondaryThread(m_targetFlushIdentifier);
+ }
+
+private:
+ Ref<RemoteImageBufferProxy<BackendType>> m_imageBuffer;
+ WebCore::DisplayList::FlushIdentifier m_targetFlushIdentifier;
+};
+
} // namespace WebKit
#endif // ENABLE(GPU_PROCESS)
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp (269942 => 269943)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp 2020-11-18 05:09:50 UTC (rev 269942)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp 2020-11-18 06:15:45 UTC (rev 269943)
@@ -118,10 +118,10 @@
return connection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy::ImageBufferBackendWasCreated>(m_renderingBackendIdentifier, 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);
}
-bool RemoteRenderingBackendProxy::waitForFlushDisplayListWasCommitted()
+bool RemoteRenderingBackendProxy::waitForDidFlush()
{
Ref<IPC::Connection> connection = WebProcess::singleton().ensureGPUProcessConnection().connection();
- return connection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy::FlushDisplayListWasCommitted>(m_renderingBackendIdentifier, 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);
+ return connection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy::DidFlush>(m_renderingBackendIdentifier, 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);
}
RefPtr<ImageBuffer> RemoteRenderingBackendProxy::createImageBuffer(const FloatSize& size, RenderingMode renderingMode, float resolutionScale, ColorSpace colorSpace, PixelFormat pixelFormat)
@@ -195,7 +195,7 @@
downcast<UnacceleratedRemoteImageBufferProxy>(*imageBuffer).createBackend(logicalSize, backendSize, resolutionScale, colorSpace, pixelFormat, WTFMove(handle));
}
-void RemoteRenderingBackendProxy::flushDisplayListWasCommitted(DisplayList::FlushIdentifier flushIdentifier, RenderingResourceIdentifier renderingResourceIdentifier)
+void RemoteRenderingBackendProxy::didFlush(DisplayList::FlushIdentifier flushIdentifier, RenderingResourceIdentifier renderingResourceIdentifier)
{
auto imageBuffer = m_remoteResourceCacheProxy.cachedImageBuffer(renderingResourceIdentifier);
if (!imageBuffer)
@@ -202,9 +202,9 @@
return;
if (imageBuffer->isAccelerated())
- downcast<AcceleratedRemoteImageBufferProxy>(*imageBuffer).commitFlushDisplayList(flushIdentifier);
+ downcast<AcceleratedRemoteImageBufferProxy>(*imageBuffer).didFlush(flushIdentifier);
else
- downcast<UnacceleratedRemoteImageBufferProxy>(*imageBuffer).commitFlushDisplayList(flushIdentifier);
+ downcast<UnacceleratedRemoteImageBufferProxy>(*imageBuffer).didFlush(flushIdentifier);
}
void RemoteRenderingBackendProxy::updateReusableHandles()
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h (269942 => 269943)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h 2020-11-18 05:09:50 UTC (rev 269942)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h 2020-11-18 06:15:45 UTC (rev 269943)
@@ -82,7 +82,7 @@
void releaseRemoteResource(WebCore::RenderingResourceIdentifier);
bool waitForImageBufferBackendWasCreated();
- bool waitForFlushDisplayListWasCommitted();
+ bool waitForDidFlush();
private:
RemoteRenderingBackendProxy();
@@ -96,7 +96,7 @@
// Messages to be received.
void imageBufferBackendWasCreated(const WebCore::FloatSize& logicalSize, const WebCore::IntSize& backendSize, float resolutionScale, WebCore::ColorSpace, WebCore::PixelFormat, ImageBufferBackendHandle, WebCore::RenderingResourceIdentifier);
- void flushDisplayListWasCommitted(WebCore::DisplayList::FlushIdentifier, WebCore::RenderingResourceIdentifier);
+ void didFlush(WebCore::DisplayList::FlushIdentifier, WebCore::RenderingResourceIdentifier);
RemoteResourceCacheProxy m_remoteResourceCacheProxy { *this };
HashMap<WebCore::DisplayList::ItemBufferIdentifier, RefPtr<DisplayListWriterHandle>> m_sharedDisplayListHandles;
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in (269942 => 269943)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in 2020-11-18 05:09:50 UTC (rev 269942)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in 2020-11-18 06:15:45 UTC (rev 269943)
@@ -24,7 +24,7 @@
messages -> RemoteRenderingBackendProxy NotRefCounted {
ImageBufferBackendWasCreated(WebCore::FloatSize logicalSize, WebCore::IntSize backendSize, float resolutionScale, WebCore::ColorSpace colorSpace, enum:uint8_t WebCore::PixelFormat pixelFormat, WebKit::ImageBufferBackendHandle handle, WebCore::RenderingResourceIdentifier renderingResourceIdentifier)
- FlushDisplayListWasCommitted(WebCore::DisplayList::FlushIdentifier flushIdentifier, WebCore::RenderingResourceIdentifier renderingResourceIdentifier)
+ DidFlush(WebCore::DisplayList::FlushIdentifier flushIdentifier, WebCore::RenderingResourceIdentifier renderingResourceIdentifier)
}
#endif // ENABLE(GPU_PROCESS)