Title: [284079] trunk/Source/WebKit
Revision
284079
Author
[email protected]
Date
2021-10-12 22:50:33 -0700 (Tue, 12 Oct 2021)

Log Message

[GPU Process] Use IPC streaming for concurrent display list processing
https://bugs.webkit.org/show_bug.cgi?id=230860
rdar://83438038

Reviewed by Tim Horton.

This patch rebuilds the concurrent display list architecture in the web and GPU processes on top of the
streamable IPC connections currently used by WebGL in the GPU process. See below for more details.

There should be no change in behavior.

* GPUProcess/GPUConnectionToWebProcess.cpp:
(WebKit::GPUConnectionToWebProcess::createRenderingBackend):

Pass a StreamConnectionBuffer from the web process to the GPU process when constructing
RemoteRenderingBackend; this serves as the pool of shared memory used to store streaming IPC messages sent from
the web process to the GPU process. I've (somewhat arbitrarily) chosen the size of this StreamConnectionBuffer
to match WebGL's connection buffer, though this can be tuned as needed. In a future patch, we may also want to
implement a mechanism for starting out with a small connection buffer, and growing it by successively larger
segments as needed.

* GPUProcess/GPUConnectionToWebProcess.h:
* GPUProcess/GPUConnectionToWebProcess.messages.in:
* GPUProcess/cocoa/GPUProcessCocoa.mm:
(WebKit::GPUProcess::additionalStateForDiagnosticReport const):

Add a FIXME for re-introducing diagnostic state logging when using streamable IPC.

* GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
(WebKit::RemoteDisplayListRecorder::RemoteDisplayListRecorder):
(WebKit::RemoteDisplayListRecorder::startListeningForIPC):
(WebKit::RemoteDisplayListRecorder::stopListeningForIPC):

Add and remove the remote display list as a destination on the RemoteRenderingBackend's stream connection. Note
that the synchronous dispatch to the main thread here is necessary to maintain the ordering of out-of-stream IPC
messages that may have been received on the IPC thread.

* GPUProcess/graphics/RemoteDisplayListRecorder.h:
(WebKit::RemoteDisplayListRecorder::create):
(WebKit::RemoteDisplayListRecorder::handleItem):
* GPUProcess/graphics/RemoteImageBuffer.h:
(WebKit::RemoteImageBuffer::RemoteImageBuffer):
(WebKit::RemoteImageBuffer::apply): Deleted.

Introduce `m_remoteDisplayList` to RemoteImageBuffer, and remove some logic for applying display list items that
is no longer necessary.

* GPUProcess/graphics/RemoteRenderingBackend.cpp:
(WebKit::RemoteRenderingBackend::create):
(WebKit::RemoteRenderingBackend::RemoteRenderingBackend):

Set up the IPC stream connection and stream connection work queue, and immediately send a wakeup semaphore back
to the web process.

(WebKit::RemoteRenderingBackend::startListeningForIPC):
(WebKit::RemoteRenderingBackend::~RemoteRenderingBackend):
(WebKit::RemoteRenderingBackend::stopListeningForIPC):

Add a mechanism to immediately tell all `m_remoteDisplayLists` to stop listening for streaming IPC messages when
the owning RemoteRenderingBackend stops listening.

(WebKit::RemoteRenderingBackend::dispatch):
(WebKit::RemoteRenderingBackend::didCreateImageBufferBackend):
(WebKit::RemoteRenderingBackend::createImageBufferWithQualifiedIdentifier):
(WebKit::RemoteRenderingBackend::cacheNativeImageWithQualifiedIdentifier):
(WebKit::RemoteRenderingBackend::cacheFontWithQualifiedIdentifier):
(WebKit::RemoteRenderingBackend::finalizeRenderingUpdate):
(WebKit::RemoteRenderingBackend::applyMediaItem): Deleted.
(WebKit::RemoteRenderingBackend::ReplayerDelegate::ReplayerDelegate): Deleted.
(WebKit::RemoteRenderingBackend::ReplayerDelegate::apply): Deleted.
(WebKit::RemoteRenderingBackend::ReplayerDelegate::didCreateMaskImageBuffer): Deleted.
(WebKit::RemoteRenderingBackend::ReplayerDelegate::didResetMaskImageBuffer): Deleted.
(WebKit::RemoteRenderingBackend::ReplayerDelegate::recordResourceUse): Deleted.
(WebKit::RemoteRenderingBackend::submit): Deleted.
(WebKit::RemoteRenderingBackend::nextDestinationImageBufferAfterApplyingDisplayLists): Deleted.
(WebKit::RemoteRenderingBackend::wakeUpAndApplyDisplayList): Deleted.
(WebKit::RemoteRenderingBackend::wakeUpAndApplyDisplayListWithQualifiedIdentifier): Deleted.
(WebKit::RemoteRenderingBackend::setNextItemBufferToRead): Deleted.
(WebKit::RemoteRenderingBackend::didCreateSharedDisplayListHandle): Deleted.
(WebKit::RemoteRenderingBackend::didCreateSharedDisplayListHandleWithQualifiedIdentifier): Deleted.
(WebKit::RemoteRenderingBackend::resumeFromPendingWakeupInformation): Deleted.
(WebKit::RemoteRenderingBackend::didCreateMaskImageBuffer): Deleted.
(WebKit::RemoteRenderingBackend::didResetMaskImageBuffer): Deleted.
(WebKit::RemoteRenderingBackend::decodeItem): Deleted.
(WebKit::RemoteRenderingBackend::lastKnownState const): Deleted.
(WebKit::RemoteRenderingBackend::updateLastKnownState): Deleted.

Remove logic for coordinating wakeups and shared display list item buffers in the GPU process.

* GPUProcess/graphics/RemoteRenderingBackend.h:

Subclass IPC::StreamMessageReceiver. In this new concurrent display list model, RemoteRenderingBackend serves
as a streaming IPC destination alongside each RemoteDisplayListRecorder in the GPU process; all messages
previously sent to the RemoteRenderingBackend as normal IPC are now sent through the connection stream (though
some must be marked as non-stream-encodable).

(WebKit::RemoteRenderingBackend::streamConnection const):
(WebKit::RemoteRenderingBackend::decodeAndCreate): Deleted.
(): Deleted.
(WebKit::RemoteRenderingBackend::PendingWakeupInformation::shouldPerformWakeup const): Deleted.

Delete more logic related to concurrent display lists.

* GPUProcess/graphics/RemoteRenderingBackend.messages.in:

Make RemoteRenderingBackend a stream message receiver.

* GPUProcess/graphics/RemoteRenderingBackendCreationParameters.h:
(WebKit::RemoteRenderingBackendCreationParameters::encode const):
(WebKit::RemoteRenderingBackendCreationParameters::decode):

Remove the IPC::Semaphore here, that was previously used for quick GPU process wakeups. This semaphore is no
longer needed because we always use IPC::Semaphore for waking the GPU process when using streaming IPC.

* GPUProcess/graphics/RemoteResourceCache.h:
* WebProcess/GPU/graphics/RemoteImageBufferProxy.h:

Make the RemoteImageBufferProxy template class directly subclass ConcreteImageBuffer instead of
DisplayList::ImageBuffer; additionally, introduce a `RemoteDisplayListRecorderProxy m_remoteDisplayList` here,
which we use as our drawing graphics context.

(WebKit::RemoteImageBufferProxy::~RemoteImageBufferProxy):
(WebKit::RemoteImageBufferProxy::RemoteImageBufferProxy):
(WebKit::RemoteImageBufferProxy::recordNativeImageUse):
(WebKit::RemoteImageBufferProxy::recordFontUse):
(WebKit::RemoteImageBufferProxy::recordImageBufferUse):
(WebKit::RemoteImageBufferProxy::clearDisplayList): Deleted.
* WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
(WebKit::RemoteRenderingBackendProxy::RemoteRenderingBackendProxy):
(WebKit::RemoteRenderingBackendProxy::ensureGPUProcessConnection):
(WebKit::RemoteRenderingBackendProxy::gpuProcessConnectionDidClose):
(WebKit::RemoteRenderingBackendProxy::createRemoteImageBuffer):
(WebKit::RemoteRenderingBackendProxy::sharedMemoryForGetPixelBuffer):
(WebKit::RemoteRenderingBackendProxy::destroyGetPixelBufferSharedMemory):
(WebKit::RemoteRenderingBackendProxy::getDataURLForImageBuffer):
(WebKit::RemoteRenderingBackendProxy::getDataForImageBuffer):
(WebKit::RemoteRenderingBackendProxy::getShareableBitmap):

Send all IPC messages to RemoteRenderingBackend in the GPU process through the stream connection, instead of
using standard IPC messages. This guarantees ordering when receiving cached resources.

(WebKit::RemoteRenderingBackendProxy::cacheNativeImage):
(WebKit::RemoteRenderingBackendProxy::cacheFont):
(WebKit::RemoteRenderingBackendProxy::deleteAllFonts):
(WebKit::RemoteRenderingBackendProxy::releaseRemoteResource):
(WebKit::RemoteRenderingBackendProxy::finalizeRenderingUpdate):
(WebKit::RemoteRenderingBackendProxy::renderingBackendIdentifier const):
(WebKit::RemoteRenderingBackendProxy::ensureBackendCreated):
(WebKit::RemoteRenderingBackendProxy::streamConnection):

Add a mechanism to ensure that we have the IPC stream wakeup semaphore before grabbing the stream connection.

(WebKit::RemoteRenderingBackendProxy::didCreateWakeUpSemaphoreForDisplayListStream):
(WebKit::RemoteRenderingBackendProxy::willAppendItem): Deleted.
(WebKit::RemoteRenderingBackendProxy::sendWakeupMessage): Deleted.
(WebKit::RemoteRenderingBackendProxy::sendDeferredWakeupMessageIfNeeded): Deleted.
(WebKit::RemoteRenderingBackendProxy::didAppendData): Deleted.
(WebKit::RemoteRenderingBackendProxy::mostRecentlyUsedDisplayListHandle): Deleted.
(WebKit::RemoteRenderingBackendProxy::findReusableDisplayListHandle): Deleted.
(WebKit::RemoteRenderingBackendProxy::createItemBuffer): Deleted.

Remove all logic previously used to coordinate concurrent display list processing on the remote rendering
backend.

* WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
(WebKit::RemoteRenderingBackendProxy::remoteResourceCacheProxy):
(WebKit::RemoteRenderingBackendProxy::sendToStream):
(WebKit::RemoteRenderingBackendProxy::sendSyncToStream):

Add helper methods to send IPC messages to the remote rendering backend through the connection stream.

* WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in:
* WebProcess/WebPage/IPCTestingAPI.cpp:
(WebKit::IPCTestingAPI::encodeRemoteRenderingBackendCreationParameters):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (284078 => 284079)


--- trunk/Source/WebKit/ChangeLog	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/ChangeLog	2021-10-13 05:50:33 UTC (rev 284079)
@@ -1,3 +1,180 @@
+2021-10-12  Wenson Hsieh  <[email protected]>
+
+        [GPU Process] Use IPC streaming for concurrent display list processing
+        https://bugs.webkit.org/show_bug.cgi?id=230860
+        rdar://83438038
+
+        Reviewed by Tim Horton.
+
+        This patch rebuilds the concurrent display list architecture in the web and GPU processes on top of the
+        streamable IPC connections currently used by WebGL in the GPU process. See below for more details.
+
+        There should be no change in behavior.
+
+        * GPUProcess/GPUConnectionToWebProcess.cpp:
+        (WebKit::GPUConnectionToWebProcess::createRenderingBackend):
+
+        Pass a StreamConnectionBuffer from the web process to the GPU process when constructing
+        RemoteRenderingBackend; this serves as the pool of shared memory used to store streaming IPC messages sent from
+        the web process to the GPU process. I've (somewhat arbitrarily) chosen the size of this StreamConnectionBuffer
+        to match WebGL's connection buffer, though this can be tuned as needed. In a future patch, we may also want to
+        implement a mechanism for starting out with a small connection buffer, and growing it by successively larger
+        segments as needed.
+
+        * GPUProcess/GPUConnectionToWebProcess.h:
+        * GPUProcess/GPUConnectionToWebProcess.messages.in:
+        * GPUProcess/cocoa/GPUProcessCocoa.mm:
+        (WebKit::GPUProcess::additionalStateForDiagnosticReport const):
+
+        Add a FIXME for re-introducing diagnostic state logging when using streamable IPC.
+
+        * GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
+        (WebKit::RemoteDisplayListRecorder::RemoteDisplayListRecorder):
+        (WebKit::RemoteDisplayListRecorder::startListeningForIPC):
+        (WebKit::RemoteDisplayListRecorder::stopListeningForIPC):
+
+        Add and remove the remote display list as a destination on the RemoteRenderingBackend's stream connection. Note
+        that the synchronous dispatch to the main thread here is necessary to maintain the ordering of out-of-stream IPC
+        messages that may have been received on the IPC thread.
+
+        * GPUProcess/graphics/RemoteDisplayListRecorder.h:
+        (WebKit::RemoteDisplayListRecorder::create):
+        (WebKit::RemoteDisplayListRecorder::handleItem):
+        * GPUProcess/graphics/RemoteImageBuffer.h:
+        (WebKit::RemoteImageBuffer::RemoteImageBuffer):
+        (WebKit::RemoteImageBuffer::apply): Deleted.
+
+        Introduce `m_remoteDisplayList` to RemoteImageBuffer, and remove some logic for applying display list items that
+        is no longer necessary.
+
+        * GPUProcess/graphics/RemoteRenderingBackend.cpp:
+        (WebKit::RemoteRenderingBackend::create):
+        (WebKit::RemoteRenderingBackend::RemoteRenderingBackend):
+
+        Set up the IPC stream connection and stream connection work queue, and immediately send a wakeup semaphore back
+        to the web process.
+
+        (WebKit::RemoteRenderingBackend::startListeningForIPC):
+        (WebKit::RemoteRenderingBackend::~RemoteRenderingBackend):
+        (WebKit::RemoteRenderingBackend::stopListeningForIPC):
+
+        Add a mechanism to immediately tell all `m_remoteDisplayLists` to stop listening for streaming IPC messages when
+        the owning RemoteRenderingBackend stops listening.
+
+        (WebKit::RemoteRenderingBackend::dispatch):
+        (WebKit::RemoteRenderingBackend::didCreateImageBufferBackend):
+        (WebKit::RemoteRenderingBackend::createImageBufferWithQualifiedIdentifier):
+        (WebKit::RemoteRenderingBackend::cacheNativeImageWithQualifiedIdentifier):
+        (WebKit::RemoteRenderingBackend::cacheFontWithQualifiedIdentifier):
+        (WebKit::RemoteRenderingBackend::finalizeRenderingUpdate):
+        (WebKit::RemoteRenderingBackend::applyMediaItem): Deleted.
+        (WebKit::RemoteRenderingBackend::ReplayerDelegate::ReplayerDelegate): Deleted.
+        (WebKit::RemoteRenderingBackend::ReplayerDelegate::apply): Deleted.
+        (WebKit::RemoteRenderingBackend::ReplayerDelegate::didCreateMaskImageBuffer): Deleted.
+        (WebKit::RemoteRenderingBackend::ReplayerDelegate::didResetMaskImageBuffer): Deleted.
+        (WebKit::RemoteRenderingBackend::ReplayerDelegate::recordResourceUse): Deleted.
+        (WebKit::RemoteRenderingBackend::submit): Deleted.
+        (WebKit::RemoteRenderingBackend::nextDestinationImageBufferAfterApplyingDisplayLists): Deleted.
+        (WebKit::RemoteRenderingBackend::wakeUpAndApplyDisplayList): Deleted.
+        (WebKit::RemoteRenderingBackend::wakeUpAndApplyDisplayListWithQualifiedIdentifier): Deleted.
+        (WebKit::RemoteRenderingBackend::setNextItemBufferToRead): Deleted.
+        (WebKit::RemoteRenderingBackend::didCreateSharedDisplayListHandle): Deleted.
+        (WebKit::RemoteRenderingBackend::didCreateSharedDisplayListHandleWithQualifiedIdentifier): Deleted.
+        (WebKit::RemoteRenderingBackend::resumeFromPendingWakeupInformation): Deleted.
+        (WebKit::RemoteRenderingBackend::didCreateMaskImageBuffer): Deleted.
+        (WebKit::RemoteRenderingBackend::didResetMaskImageBuffer): Deleted.
+        (WebKit::RemoteRenderingBackend::decodeItem): Deleted.
+        (WebKit::RemoteRenderingBackend::lastKnownState const): Deleted.
+        (WebKit::RemoteRenderingBackend::updateLastKnownState): Deleted.
+
+        Remove logic for coordinating wakeups and shared display list item buffers in the GPU process.
+
+        * GPUProcess/graphics/RemoteRenderingBackend.h:
+
+        Subclass IPC::StreamMessageReceiver. In this new concurrent display list model, RemoteRenderingBackend serves
+        as a streaming IPC destination alongside each RemoteDisplayListRecorder in the GPU process; all messages
+        previously sent to the RemoteRenderingBackend as normal IPC are now sent through the connection stream (though
+        some must be marked as non-stream-encodable).
+
+        (WebKit::RemoteRenderingBackend::streamConnection const):
+        (WebKit::RemoteRenderingBackend::decodeAndCreate): Deleted.
+        (): Deleted.
+        (WebKit::RemoteRenderingBackend::PendingWakeupInformation::shouldPerformWakeup const): Deleted.
+
+        Delete more logic related to concurrent display lists.
+
+        * GPUProcess/graphics/RemoteRenderingBackend.messages.in:
+
+        Make RemoteRenderingBackend a stream message receiver.
+
+        * GPUProcess/graphics/RemoteRenderingBackendCreationParameters.h:
+        (WebKit::RemoteRenderingBackendCreationParameters::encode const):
+        (WebKit::RemoteRenderingBackendCreationParameters::decode):
+
+        Remove the IPC::Semaphore here, that was previously used for quick GPU process wakeups. This semaphore is no
+        longer needed because we always use IPC::Semaphore for waking the GPU process when using streaming IPC.
+
+        * GPUProcess/graphics/RemoteResourceCache.h:
+        * WebProcess/GPU/graphics/RemoteImageBufferProxy.h:
+
+        Make the RemoteImageBufferProxy template class directly subclass ConcreteImageBuffer instead of
+        DisplayList::ImageBuffer; additionally, introduce a `RemoteDisplayListRecorderProxy m_remoteDisplayList` here,
+        which we use as our drawing graphics context.
+
+        (WebKit::RemoteImageBufferProxy::~RemoteImageBufferProxy):
+        (WebKit::RemoteImageBufferProxy::RemoteImageBufferProxy):
+        (WebKit::RemoteImageBufferProxy::recordNativeImageUse):
+        (WebKit::RemoteImageBufferProxy::recordFontUse):
+        (WebKit::RemoteImageBufferProxy::recordImageBufferUse):
+        (WebKit::RemoteImageBufferProxy::clearDisplayList): Deleted.
+        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
+        (WebKit::RemoteRenderingBackendProxy::RemoteRenderingBackendProxy):
+        (WebKit::RemoteRenderingBackendProxy::ensureGPUProcessConnection):
+        (WebKit::RemoteRenderingBackendProxy::gpuProcessConnectionDidClose):
+        (WebKit::RemoteRenderingBackendProxy::createRemoteImageBuffer):
+        (WebKit::RemoteRenderingBackendProxy::sharedMemoryForGetPixelBuffer):
+        (WebKit::RemoteRenderingBackendProxy::destroyGetPixelBufferSharedMemory):
+        (WebKit::RemoteRenderingBackendProxy::getDataURLForImageBuffer):
+        (WebKit::RemoteRenderingBackendProxy::getDataForImageBuffer):
+        (WebKit::RemoteRenderingBackendProxy::getShareableBitmap):
+
+        Send all IPC messages to RemoteRenderingBackend in the GPU process through the stream connection, instead of
+        using standard IPC messages. This guarantees ordering when receiving cached resources.
+
+        (WebKit::RemoteRenderingBackendProxy::cacheNativeImage):
+        (WebKit::RemoteRenderingBackendProxy::cacheFont):
+        (WebKit::RemoteRenderingBackendProxy::deleteAllFonts):
+        (WebKit::RemoteRenderingBackendProxy::releaseRemoteResource):
+        (WebKit::RemoteRenderingBackendProxy::finalizeRenderingUpdate):
+        (WebKit::RemoteRenderingBackendProxy::renderingBackendIdentifier const):
+        (WebKit::RemoteRenderingBackendProxy::ensureBackendCreated):
+        (WebKit::RemoteRenderingBackendProxy::streamConnection):
+
+        Add a mechanism to ensure that we have the IPC stream wakeup semaphore before grabbing the stream connection.
+
+        (WebKit::RemoteRenderingBackendProxy::didCreateWakeUpSemaphoreForDisplayListStream):
+        (WebKit::RemoteRenderingBackendProxy::willAppendItem): Deleted.
+        (WebKit::RemoteRenderingBackendProxy::sendWakeupMessage): Deleted.
+        (WebKit::RemoteRenderingBackendProxy::sendDeferredWakeupMessageIfNeeded): Deleted.
+        (WebKit::RemoteRenderingBackendProxy::didAppendData): Deleted.
+        (WebKit::RemoteRenderingBackendProxy::mostRecentlyUsedDisplayListHandle): Deleted.
+        (WebKit::RemoteRenderingBackendProxy::findReusableDisplayListHandle): Deleted.
+        (WebKit::RemoteRenderingBackendProxy::createItemBuffer): Deleted.
+
+        Remove all logic previously used to coordinate concurrent display list processing on the remote rendering
+        backend.
+
+        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
+        (WebKit::RemoteRenderingBackendProxy::remoteResourceCacheProxy):
+        (WebKit::RemoteRenderingBackendProxy::sendToStream):
+        (WebKit::RemoteRenderingBackendProxy::sendSyncToStream):
+
+        Add helper methods to send IPC messages to the remote rendering backend through the connection stream.
+
+        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in:
+        * WebProcess/WebPage/IPCTestingAPI.cpp:
+        (WebKit::IPCTestingAPI::encodeRemoteRenderingBackendCreationParameters):
+
 2021-10-12  Ross Kirsling  <[email protected]>
 
         Non-unified build fixes, October 2021 edition.

Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp (284078 => 284079)


--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2021-10-13 05:50:33 UTC (rev 284079)
@@ -474,10 +474,10 @@
 }
 #endif
 
-void GPUConnectionToWebProcess::createRenderingBackend(RemoteRenderingBackendCreationParameters&& creationParameters)
+void GPUConnectionToWebProcess::createRenderingBackend(RemoteRenderingBackendCreationParameters&& creationParameters, IPC::StreamConnectionBuffer&& streamBuffer)
 {
     auto addResult = m_remoteRenderingBackendMap.ensure(creationParameters.identifier, [&]() {
-        return IPC::ScopedActiveMessageReceiveQueue { RemoteRenderingBackend::create(*this, WTFMove(creationParameters)) };
+        return IPC::ScopedActiveMessageReceiveQueue { RemoteRenderingBackend::create(*this, WTFMove(creationParameters), WTFMove(streamBuffer)) };
     });
     ASSERT_UNUSED(addResult, addResult.isNewEntry);
 }

Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h (284078 => 284079)


--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2021-10-13 05:50:33 UTC (rev 284079)
@@ -178,7 +178,7 @@
     RemoteMediaRecorderManager& mediaRecorderManager();
 #endif
 
-    void createRenderingBackend(RemoteRenderingBackendCreationParameters&&);
+    void createRenderingBackend(RemoteRenderingBackendCreationParameters&&, IPC::StreamConnectionBuffer&&);
     void releaseRenderingBackend(RenderingBackendIdentifier);
 
 #if ENABLE(WEBGL)

Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.messages.in (284078 => 284079)


--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.messages.in	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.messages.in	2021-10-13 05:50:33 UTC (rev 284079)
@@ -23,7 +23,7 @@
 #if ENABLE(GPU_PROCESS)
 
 messages -> GPUConnectionToWebProcess WantsDispatchMessage {
-    void CreateRenderingBackend(struct WebKit::RemoteRenderingBackendCreationParameters creationParameters)
+    void CreateRenderingBackend(struct WebKit::RemoteRenderingBackendCreationParameters creationParameters, IPC::StreamConnectionBuffer streamBuffer)
     void ReleaseRenderingBackend(WebKit::RenderingBackendIdentifier renderingBackendIdentifier)
 #if ENABLE(WEBGL)
     void CreateGraphicsContextGL(struct WebCore::GraphicsContextGLAttributes attributes, WebKit::GraphicsContextGLIdentifier graphicsContextGLIdentifier, WebKit::RenderingBackendIdentifier renderingBackendIdentifier, IPC::StreamConnectionBuffer stream)

Modified: trunk/Source/WebKit/GPUProcess/cocoa/GPUProcessCocoa.mm (284078 => 284079)


--- trunk/Source/WebKit/GPUProcess/cocoa/GPUProcessCocoa.mm	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/GPUProcess/cocoa/GPUProcessCocoa.mm	2021-10-13 05:50:33 UTC (rev 284079)
@@ -51,10 +51,7 @@
                 continue;
 
             auto stateInfo = adoptNS([[NSMutableDictionary alloc] initWithCapacity:backendMap.size()]);
-            for (auto& identifierAndBackend : backendMap) {
-                auto& [backendIdentifier, backend] = identifierAndBackend;
-                [stateInfo setObject:@(name(backend->lastKnownState())) forKey:backendIdentifier.loggingString()];
-            }
+            // FIXME: Log some additional diagnostic state on RemoteRenderingBackend.
             [webProcessConnectionInfo setObject:stateInfo.get() forKey:webProcessIdentifier.loggingString()];
         }
 

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp (284078 => 284079)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp	2021-10-13 05:50:33 UTC (rev 284079)
@@ -55,7 +55,10 @@
 {
     ASSERT(!m_isListeningForIPC);
     m_isListeningForIPC = true;
-    // FIXME: Not implemented yet.
+    // FIXME: Can we avoid synchronous dispatch here by adjusting the assertion in `Connection::enqueueMatchingMessagesToMessageReceiveQueue`?
+    callOnMainRunLoopAndWait([&] {
+        m_renderingBackend->streamConnection().startReceivingMessages(*this, Messages::RemoteDisplayListRecorder::messageReceiverName(), m_imageBufferIdentifier.object().toUInt64());
+    });
 }
 
 void RemoteDisplayListRecorder::stopListeningForIPC()
@@ -63,7 +66,7 @@
     if (!m_isListeningForIPC)
         return;
 
-    // FIXME: Not implemented yet.
+    m_renderingBackend->streamConnection().stopReceivingMessages(Messages::RemoteDisplayListRecorder::messageReceiverName(), m_imageBufferIdentifier.object().toUInt64());
     m_isListeningForIPC = false;
 }
 

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h (284078 => 284079)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h	2021-10-13 05:50:33 UTC (rev 284079)
@@ -30,6 +30,8 @@
 #include "Decoder.h"
 #include "GPUConnectionToWebProcess.h"
 #include "Logging.h"
+#include "RemoteDisplayListRecorder.h"
+#include "ScopedActiveMessageReceiveQueue.h"
 #include <WebCore/ConcreteImageBuffer.h>
 #include <WebCore/DisplayList.h>
 #include <WebCore/DisplayListItems.h>
@@ -54,8 +56,9 @@
         : BaseConcreteImageBuffer(parameters, WTFMove(backend), renderingResourceIdentifier.object())
         , m_remoteRenderingBackend(remoteRenderingBackend)
         , m_renderingResourceIdentifier(renderingResourceIdentifier)
+        , m_remoteDisplayList({ RemoteDisplayListRecorder::create(*this, renderingResourceIdentifier, renderingResourceIdentifier.processIdentifier(), remoteRenderingBackend) })
     {
-        m_remoteRenderingBackend.didCreateImageBufferBackend(m_backend->createImageBufferBackendHandle(), renderingResourceIdentifier);
+        m_remoteRenderingBackend.didCreateImageBufferBackend(m_backend->createImageBufferBackendHandle(), renderingResourceIdentifier, *m_remoteDisplayList.get());
     }
 
     ~RemoteImageBuffer()
@@ -77,41 +80,9 @@
 private:
     friend class RemoteRenderingBackend;
 
-    bool apply(WebCore::DisplayList::ItemHandle item, WebCore::GraphicsContext& context)
-    {
-        if (item.is<WebCore::DisplayList::GetPixelBuffer>()) {
-            auto& getPixelBufferItem = item.get<WebCore::DisplayList::GetPixelBuffer>();
-            auto pixelBuffer = BaseConcreteImageBuffer::getPixelBuffer(getPixelBufferItem.outputFormat(), getPixelBufferItem.srcRect());
-            m_remoteRenderingBackend.populateGetPixelBufferSharedMemory(WTFMove(pixelBuffer));
-            return true;
-        }
-
-        if (item.is<WebCore::DisplayList::PutPixelBuffer>()) {
-            auto& putPixelBufferItem = item.get<WebCore::DisplayList::PutPixelBuffer>();
-            putPixelBuffer(putPixelBufferItem.pixelBuffer(), putPixelBufferItem.srcRect(), putPixelBufferItem.destPoint(), putPixelBufferItem.destFormat());
-            return true;
-        }
-
-        if (item.is<WebCore::DisplayList::FlushContext>()) {
-            BaseConcreteImageBuffer::flushContext();
-            auto identifier = item.get<WebCore::DisplayList::FlushContext>().identifier();
-            LOG_WITH_STREAM(SharedDisplayLists, stream << "Acknowledging Flush{" << identifier << "} in Image(" << m_renderingResourceIdentifier << ")");
-            m_remoteRenderingBackend.didFlush(identifier, m_renderingResourceIdentifier);
-            return true;
-        }
-
-        if (item.is<WebCore::DisplayList::MetaCommandChangeItemBuffer>()) {
-            auto nextBufferIdentifier = item.get<WebCore::DisplayList::MetaCommandChangeItemBuffer>().identifier();
-            LOG_WITH_STREAM(SharedDisplayLists, stream << "Switching to Items[" << nextBufferIdentifier << "]");
-            m_remoteRenderingBackend.setNextItemBufferToRead(nextBufferIdentifier, m_renderingResourceIdentifier);
-            return true;
-        }
-
-        return m_remoteRenderingBackend.applyMediaItem(item, context);
-    }
-
     RemoteRenderingBackend& m_remoteRenderingBackend;
     QualifiedRenderingResourceIdentifier m_renderingResourceIdentifier;
+    IPC::ScopedActiveMessageReceiveQueue<RemoteDisplayListRecorder> m_remoteDisplayList;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp (284078 => 284079)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp	2021-10-13 05:50:33 UTC (rev 284079)
@@ -28,7 +28,6 @@
 
 #if ENABLE(GPU_PROCESS)
 
-#include "DisplayListReaderHandle.h"
 #include "GPUConnectionToWebProcess.h"
 #include "Logging.h"
 #include "PlatformRemoteImageBuffer.h"
@@ -73,26 +72,27 @@
 namespace WebKit {
 using namespace WebCore;
 
-Ref<RemoteRenderingBackend> RemoteRenderingBackend::create(GPUConnectionToWebProcess& gpuConnectionToWebProcess, RemoteRenderingBackendCreationParameters&& creationParameters)
+Ref<RemoteRenderingBackend> RemoteRenderingBackend::create(GPUConnectionToWebProcess& gpuConnectionToWebProcess, RemoteRenderingBackendCreationParameters&& creationParameters, IPC::StreamConnectionBuffer&& streamBuffer)
 {
-    auto instance = adoptRef(*new RemoteRenderingBackend(gpuConnectionToWebProcess, WTFMove(creationParameters)));
+    auto instance = adoptRef(*new RemoteRenderingBackend(gpuConnectionToWebProcess, WTFMove(creationParameters), WTFMove(streamBuffer)));
     instance->startListeningForIPC();
     return instance;
 }
 
-RemoteRenderingBackend::RemoteRenderingBackend(GPUConnectionToWebProcess& gpuConnectionToWebProcess, RemoteRenderingBackendCreationParameters&& creationParameters)
-    : m_workQueue(WorkQueue::create("RemoteRenderingBackend work queue", WorkQueue::Type::Serial, WorkQueue::QOS::UserInteractive))
+RemoteRenderingBackend::RemoteRenderingBackend(GPUConnectionToWebProcess& gpuConnectionToWebProcess, RemoteRenderingBackendCreationParameters&& creationParameters, IPC::StreamConnectionBuffer&& streamBuffer)
+    : m_workQueue("RemoteRenderingBackend work queue")
+    , m_streamConnection(IPC::StreamServerConnection::create(gpuConnectionToWebProcess.connection(), WTFMove(streamBuffer), m_workQueue))
     , m_remoteResourceCache(gpuConnectionToWebProcess.webProcessIdentifier())
     , m_gpuConnectionToWebProcess(gpuConnectionToWebProcess)
     , m_renderingBackendIdentifier(creationParameters.identifier)
-    , m_resumeDisplayListSemaphore(WTFMove(creationParameters.resumeDisplayListSemaphore))
 {
     ASSERT(RunLoop::isMain());
+    send(Messages::RemoteRenderingBackendProxy::DidCreateWakeUpSemaphoreForDisplayListStream(m_workQueue.wakeUpSemaphore()), m_renderingBackendIdentifier);
 }
 
 void RemoteRenderingBackend::startListeningForIPC()
 {
-    m_gpuConnectionToWebProcess->connection().addWorkQueueMessageReceiver(Messages::RemoteRenderingBackend::messageReceiverName(), m_workQueue, this, m_renderingBackendIdentifier.toUInt64());
+    m_streamConnection->startReceivingMessages(*this, Messages::RemoteRenderingBackend::messageReceiverName(), m_renderingBackendIdentifier.toUInt64());
 }
 
 RemoteRenderingBackend::~RemoteRenderingBackend()
@@ -99,21 +99,20 @@
 {
     // Make sure we destroy the ResourceCache on the WorkQueue since it gets populated on the WorkQueue.
     // Make sure rendering resource request is released after destroying the cache.
-    m_workQueue->dispatch([renderingResourcesRequest = WTFMove(m_renderingResourcesRequest), remoteResourceCache = WTFMove(m_remoteResourceCache)] { });
+    m_workQueue.dispatch([renderingResourcesRequest = WTFMove(m_renderingResourcesRequest), remoteResourceCache = WTFMove(m_remoteResourceCache)] { });
 }
 
 void RemoteRenderingBackend::stopListeningForIPC()
 {
     ASSERT(RunLoop::isMain());
-
-    // The RemoteRenderingBackend destructor won't be called until disconnect() is called and we unregister ourselves as a WorkQueueMessageReceiver because
-    // the IPC::Connection refs its WorkQueueMessageReceivers.
-    m_gpuConnectionToWebProcess->connection().removeWorkQueueMessageReceiver(Messages::RemoteRenderingBackend::messageReceiverName(), m_renderingBackendIdentifier.toUInt64());
+    m_streamConnection->stopReceivingMessages(Messages::RemoteRenderingBackend::messageReceiverName(), m_renderingBackendIdentifier.toUInt64());
+    for (auto& remoteContext : std::exchange(m_remoteDisplayLists, { }))
+        remoteContext.stopListeningForIPC();
 }
 
 void RemoteRenderingBackend::dispatch(Function<void()>&& task)
 {
-    m_workQueue->dispatch(WTFMove(task));
+    m_workQueue.dispatch(WTFMove(task));
 }
 
 IPC::Connection* RemoteRenderingBackend::messageSenderConnection() const
@@ -126,26 +125,9 @@
     return m_renderingBackendIdentifier.toUInt64();
 }
 
-bool RemoteRenderingBackend::applyMediaItem(DisplayList::ItemHandle item, GraphicsContext& context)
+void RemoteRenderingBackend::didCreateImageBufferBackend(ImageBufferBackendHandle handle, QualifiedRenderingResourceIdentifier renderingResourceIdentifier, RemoteDisplayListRecorder& remoteDisplayList)
 {
-    ASSERT(!RunLoop::isMain());
-
-    if (!item.is<DisplayList::PaintFrameForMedia>())
-        return false;
-
-    auto& mediaItem = item.get<DisplayList::PaintFrameForMedia>();
-    callOnMainRunLoopAndWait([&, gpuConnectionToWebProcess = m_gpuConnectionToWebProcess, mediaPlayerIdentifier = mediaItem.identifier()] {
-        auto player = gpuConnectionToWebProcess->remoteMediaPlayerManagerProxy().mediaPlayer(mediaPlayerIdentifier);
-        if (!player)
-            return;
-        // It is currently not safe to call paintFrameForMedia() off the main thread.
-        context.paintFrameForMedia(*player, mediaItem.destination());
-    });
-    return true;
-}
-
-void RemoteRenderingBackend::didCreateImageBufferBackend(ImageBufferBackendHandle handle, QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
-{
+    m_remoteDisplayLists.add(remoteDisplayList);
     MESSAGE_CHECK(renderingResourceIdentifier.processIdentifier() == m_gpuConnectionToWebProcess->webProcessIdentifier(), "Sending didCreateImageBufferBackend() message to the wrong web process.");
     send(Messages::RemoteRenderingBackendProxy::DidCreateImageBufferBackend(WTFMove(handle), renderingResourceIdentifier.object()), m_renderingBackendIdentifier);
 }
@@ -190,215 +172,8 @@
 
     m_remoteResourceCache.cacheImageBuffer(*imageBuffer, imageBufferResourceIdentifier);
     updateRenderingResourceRequest();
-
-    if (m_pendingWakeupInfo && m_pendingWakeupInfo->shouldPerformWakeup(imageBufferResourceIdentifier))
-        resumeFromPendingWakeupInformation();
 }
 
-RemoteRenderingBackend::ReplayerDelegate::ReplayerDelegate(WebCore::ImageBuffer& destination, RemoteRenderingBackend& remoteRenderingBackend, ProcessIdentifier webProcessIdentifier)
-    : m_destination(destination)
-    , m_remoteRenderingBackend(remoteRenderingBackend)
-    , m_webProcessIdentifier(webProcessIdentifier)
-{
-}
-
-bool RemoteRenderingBackend::ReplayerDelegate::apply(WebCore::DisplayList::ItemHandle item, WebCore::GraphicsContext& graphicsContext)
-{
-    auto apply = [&](auto&& destination) {
-        return destination.apply(item, graphicsContext);
-    };
-
-    if (m_destination.renderingMode() == RenderingMode::Accelerated)
-        return apply(static_cast<AcceleratedRemoteImageBuffer&>(m_destination));
-    return apply(static_cast<UnacceleratedRemoteImageBuffer&>(m_destination));
-}
-
-void RemoteRenderingBackend::ReplayerDelegate::didCreateMaskImageBuffer(WebCore::ImageBuffer& imageBuffer)
-{
-    m_remoteRenderingBackend.didCreateMaskImageBuffer(imageBuffer);
-}
-
-void RemoteRenderingBackend::ReplayerDelegate::didResetMaskImageBuffer()
-{
-    m_remoteRenderingBackend.didResetMaskImageBuffer();
-}
-
-void RemoteRenderingBackend::ReplayerDelegate::recordResourceUse(RenderingResourceIdentifier renderingResourceIdentifier)
-{
-    m_remoteRenderingBackend.remoteResourceCache().recordResourceUse({ renderingResourceIdentifier, m_webProcessIdentifier });
-}
-
-DisplayList::ReplayResult RemoteRenderingBackend::submit(const DisplayList::DisplayList& displayList, ImageBuffer& destination)
-{
-    if (displayList.isEmpty())
-        return { };
-
-    ReplayerDelegate replayerDelegate(destination, *this, m_gpuConnectionToWebProcess->webProcessIdentifier());
-
-    return WebCore::DisplayList::Replayer {
-        destination.context(),
-        displayList,
-        &remoteResourceCache().resourceHeap(),
-        m_currentMaskImageBuffer.get(),
-        &replayerDelegate
-    }.replay();
-}
-
-RefPtr<ImageBuffer> RemoteRenderingBackend::nextDestinationImageBufferAfterApplyingDisplayLists(ImageBuffer& initialDestination, size_t initialOffset, DisplayListReaderHandle& handle, GPUProcessWakeupReason reason, ProcessIdentifier webProcessIdentifier)
-{
-    RefPtr destination { &initialDestination };
-    Ref handleProtector { handle };
-
-    auto offset = initialOffset;
-    size_t sizeToRead = 0;
-    do {
-        sizeToRead = handle.unreadBytes();
-    } while (!sizeToRead);
-
-    while (destination) {
-        auto displayList = handle.displayListForReading(offset, sizeToRead, *this);
-        MESSAGE_CHECK_WITH_RETURN_VALUE(displayList, nullptr, "Failed to map display list from shared memory");
-
-#if !LOG_DISABLED
-        auto startTime = MonotonicTime::now();
-#endif
-        auto result = submit(*displayList, *destination);
-        LOG_WITH_STREAM(SharedDisplayLists, stream << "Read [" << offset << ", " << offset + result.numberOfBytesRead << "]; Items[" << handle.identifier() << "] => Image(" << destination->renderingResourceIdentifier() << ") in " << MonotonicTime::now() - startTime);
-        MESSAGE_CHECK_WITH_RETURN_VALUE(result.reasonForStopping != DisplayList::StopReplayReason::InvalidItemOrExtent, nullptr, "Detected invalid display list item or extent");
-        MESSAGE_CHECK_WITH_RETURN_VALUE(result.reasonForStopping != DisplayList::StopReplayReason::OutOfMemory, nullptr, "Cound not allocate memory");
-
-        auto advanceResult = handle.advance(result.numberOfBytesRead);
-        MESSAGE_CHECK_WITH_RETURN_VALUE(advanceResult, nullptr, "Failed to advance display list reader handle");
-        sizeToRead = *advanceResult;
-
-        CheckedSize checkedOffset = offset;
-        checkedOffset += result.numberOfBytesRead;
-        MESSAGE_CHECK_WITH_RETURN_VALUE(!checkedOffset.hasOverflowed(), nullptr, "Overflowed when advancing shared display list handle offset");
-
-        offset = checkedOffset;
-        MESSAGE_CHECK_WITH_RETURN_VALUE(offset <= handle.sharedMemory().size(), nullptr, "Out-of-bounds offset into shared display list handle");
-
-        if (result.reasonForStopping == DisplayList::StopReplayReason::ChangeDestinationImageBuffer) {
-            destination = m_remoteResourceCache.cachedImageBuffer({ *result.nextDestinationImageBuffer, m_gpuConnectionToWebProcess->webProcessIdentifier() });
-            if (!destination) {
-                ASSERT(!m_pendingWakeupInfo);
-                m_pendingWakeupInfo = {{
-                    handle.identifier(),
-                    offset,
-                    { *result.nextDestinationImageBuffer, webProcessIdentifier },
-                    reason,
-                    std::nullopt,
-                    RemoteRenderingBackendState::WaitingForDestinationImageBuffer
-                }};
-            }
-        }
-
-        if (result.reasonForStopping == DisplayList::StopReplayReason::MissingCachedResource) {
-            m_pendingWakeupInfo = {{
-                handle.identifier(),
-                offset,
-                { destination->renderingResourceIdentifier(), webProcessIdentifier },
-                reason,
-                { { *result.missingCachedResourceIdentifier, webProcessIdentifier } },
-                RemoteRenderingBackendState::WaitingForCachedResource
-            }};
-        }
-
-        if (m_pendingWakeupInfo)
-            break;
-
-        if (!sizeToRead) {
-            if (reason != GPUProcessWakeupReason::ItemCountHysteresisExceeded)
-                break;
-
-            handle.startWaiting();
-            m_resumeDisplayListSemaphore.waitFor(30_us);
-
-            auto stopWaitingResult = handle.stopWaiting();
-            MESSAGE_CHECK_WITH_RETURN_VALUE(stopWaitingResult, nullptr, "Invalid waiting status detected when resuming display list processing");
-
-            auto resumeReadingInfo = stopWaitingResult.value();
-            if (!resumeReadingInfo)
-                break;
-
-            sizeToRead = handle.unreadBytes();
-            MESSAGE_CHECK_WITH_RETURN_VALUE(sizeToRead, nullptr, "No unread bytes when resuming display list processing");
-
-            auto newDestinationIdentifier = makeObjectIdentifier<RenderingResourceIdentifierType>(resumeReadingInfo->destination);
-            MESSAGE_CHECK_WITH_RETURN_VALUE(newDestinationIdentifier.isValid(), nullptr, "Invalid image buffer destination when resuming display list processing");
-
-            destination = m_remoteResourceCache.cachedImageBuffer({ newDestinationIdentifier, m_gpuConnectionToWebProcess->webProcessIdentifier() });
-            MESSAGE_CHECK_WITH_RETURN_VALUE(destination, nullptr, "Missing image buffer destination when resuming display list processing");
-
-            offset = resumeReadingInfo->offset;
-        }
-    }
-
-    return destination;
-}
-
-void RemoteRenderingBackend::wakeUpAndApplyDisplayList(const GPUProcessWakeupMessageArguments& arguments)
-{
-    // Immediately turn the RenderingResourceIdentifier (which is error-prone) to a QualifiedRenderingResourceIdentifier,
-    // and use a helper function to make sure that don't accidentally use the RenderingResourceIdentifier (because the helper function can't see it).
-    wakeUpAndApplyDisplayListWithQualifiedIdentifier(arguments.itemBufferIdentifier, arguments.offset, { arguments.destinationImageBufferIdentifier, m_gpuConnectionToWebProcess->webProcessIdentifier() }, arguments.reason);
-}
-
-void RemoteRenderingBackend::wakeUpAndApplyDisplayListWithQualifiedIdentifier(WebCore::DisplayList::ItemBufferIdentifier itemBufferIdentifier, uint64_t offset, QualifiedRenderingResourceIdentifier destinationImageBufferIdentifier, GPUProcessWakeupReason reason)
-{
-    ASSERT(!RunLoop::isMain());
-
-    TraceScope tracingScope(WakeUpAndApplyDisplayListStart, WakeUpAndApplyDisplayListEnd);
-
-    updateLastKnownState(RemoteRenderingBackendState::BeganReplayingDisplayList);
-
-    RefPtr destinationImageBuffer = m_remoteResourceCache.cachedImageBuffer(destinationImageBufferIdentifier);
-    MESSAGE_CHECK(destinationImageBuffer, "Missing destination image buffer");
-
-    auto initialHandle = m_sharedDisplayListHandles.get(itemBufferIdentifier);
-    MESSAGE_CHECK(initialHandle, "Missing initial shared display list handle");
-
-    LOG_WITH_STREAM(SharedDisplayLists, stream << "Waking up to Items[" << itemBufferIdentifier << "] => Image(" << destinationImageBufferIdentifier.object() << ") at " << offset);
-    destinationImageBuffer = nextDestinationImageBufferAfterApplyingDisplayLists(*destinationImageBuffer, offset, *initialHandle, reason, m_gpuConnectionToWebProcess->webProcessIdentifier());
-
-    // FIXME: All the callers pass m_pendingWakeupInfo's fields so the body of this function should just be this loop.
-    while (destinationImageBuffer && m_pendingWakeupInfo) {
-        if (m_pendingWakeupInfo->missingCachedResourceIdentifier)
-            break;
-
-        auto nextHandle = m_sharedDisplayListHandles.get(m_pendingWakeupInfo->itemBufferIdentifier);
-        if (!nextHandle) {
-            // If the handle identifier is currently unknown, wait until the GPU process receives an
-            // IPC message with a shared memory handle to the next item buffer.
-            break;
-        }
-
-        // Otherwise, continue reading the next display list item buffer from the start.
-        auto offset = m_pendingWakeupInfo->offset;
-        auto reason = m_pendingWakeupInfo->reason;
-        m_pendingWakeupInfo = std::nullopt;
-        destinationImageBuffer = nextDestinationImageBufferAfterApplyingDisplayLists(*destinationImageBuffer, offset, *nextHandle, reason, m_gpuConnectionToWebProcess->webProcessIdentifier());
-    }
-    LOG_WITH_STREAM(SharedDisplayLists, stream << "Going back to sleep.");
-
-    if (m_pendingWakeupInfo)
-        updateLastKnownState(m_pendingWakeupInfo->state);
-    else
-        updateLastKnownState(RemoteRenderingBackendState::FinishedReplayingDisplayList);
-}
-
-void RemoteRenderingBackend::setNextItemBufferToRead(DisplayList::ItemBufferIdentifier identifier, QualifiedRenderingResourceIdentifier destinationIdentifier)
-{
-    m_pendingWakeupInfo = {{
-        identifier,
-        SharedDisplayListHandle::headerSize(),
-        destinationIdentifier,
-        GPUProcessWakeupReason::Unspecified,
-        std::nullopt,
-        RemoteRenderingBackendState::WaitingForItemBuffer
-    }};
-}
-
 std::optional<SharedMemory::IPCHandle> RemoteRenderingBackend::updateSharedMemoryForGetPixelBufferHelper(size_t byteCount)
 {
     MESSAGE_CHECK_WITH_RETURN_VALUE(!m_getPixelBufferSharedMemory || byteCount > m_getPixelBufferSharedMemory->size(), std::nullopt, "The existing Shmem for getPixelBuffer() is already big enough to handle the request");
@@ -547,9 +322,6 @@
         return;
 
     m_remoteResourceCache.cacheNativeImage(*image, nativeImageResourceIdentifier);
-
-    if (m_pendingWakeupInfo && m_pendingWakeupInfo->shouldPerformWakeup(nativeImageResourceIdentifier))
-        resumeFromPendingWakeupInformation();
 }
 
 void RemoteRenderingBackend::cacheFont(Ref<WebCore::Font>&& font)
@@ -565,8 +337,6 @@
     ASSERT(!RunLoop::isMain());
 
     m_remoteResourceCache.cacheFont(WTFMove(font), fontResourceIdentifier);
-    if (m_pendingWakeupInfo && m_pendingWakeupInfo->shouldPerformWakeup(fontResourceIdentifier))
-        resumeFromPendingWakeupInformation();
 }
 
 void RemoteRenderingBackend::deleteAllFonts()
@@ -592,169 +362,9 @@
 
 void RemoteRenderingBackend::finalizeRenderingUpdate(RenderingUpdateID renderingUpdateID)
 {
-    auto shouldPerformWakeup = [&] {
-        return m_remoteResourceCache.cachedImageBuffer(m_pendingWakeupInfo->destinationImageBufferIdentifier) && m_sharedDisplayListHandles.contains(m_pendingWakeupInfo->itemBufferIdentifier);
-    };
-
-    if (m_pendingWakeupInfo && shouldPerformWakeup())
-        resumeFromPendingWakeupInformation();
-
     send(Messages::RemoteRenderingBackendProxy::DidFinalizeRenderingUpdate(renderingUpdateID), m_renderingBackendIdentifier);
 }
 
-void RemoteRenderingBackend::didCreateSharedDisplayListHandle(DisplayList::ItemBufferIdentifier itemBufferIdentifier, const SharedMemory::IPCHandle& handle, RenderingResourceIdentifier destinationBufferIdentifier)
-{
-    // Immediately turn the RenderingResourceIdentifier (which is error-prone) to a QualifiedRenderingResourceIdentifier,
-    // and use a helper function to make sure that don't accidentally use the RenderingResourceIdentifier (because the helper function can't see it).
-    didCreateSharedDisplayListHandleWithQualifiedIdentifier(itemBufferIdentifier, handle, { destinationBufferIdentifier, m_gpuConnectionToWebProcess->webProcessIdentifier() });
-}
-
-void RemoteRenderingBackend::didCreateSharedDisplayListHandleWithQualifiedIdentifier(DisplayList::ItemBufferIdentifier itemBufferIdentifier, const SharedMemory::IPCHandle& handle, QualifiedRenderingResourceIdentifier)
-{
-    ASSERT(!RunLoop::isMain());
-    MESSAGE_CHECK(!m_sharedDisplayListHandles.contains(itemBufferIdentifier), "Duplicate shared display list handle");
-
-    if (auto sharedMemory = SharedMemory::map(handle.handle, SharedMemory::Protection::ReadWrite)) {
-        auto handle = DisplayListReaderHandle::create(itemBufferIdentifier, sharedMemory.releaseNonNull());
-        MESSAGE_CHECK(handle, "There must be enough space to create the handle.");
-        m_sharedDisplayListHandles.set(itemBufferIdentifier, handle);
-    }
-
-    if (m_pendingWakeupInfo && m_pendingWakeupInfo->shouldPerformWakeup(itemBufferIdentifier))
-        resumeFromPendingWakeupInformation();
-}
-
-void RemoteRenderingBackend::resumeFromPendingWakeupInformation()
-{
-    auto itemBufferIdentifier = m_pendingWakeupInfo->itemBufferIdentifier;
-    auto offset = m_pendingWakeupInfo->offset;
-    auto destinationImageBufferIdentifier = m_pendingWakeupInfo->destinationImageBufferIdentifier;
-    auto reason = m_pendingWakeupInfo->reason;
-    m_pendingWakeupInfo = std::nullopt;
-    wakeUpAndApplyDisplayListWithQualifiedIdentifier(itemBufferIdentifier, offset, destinationImageBufferIdentifier, reason);
-}
-
-void RemoteRenderingBackend::didCreateMaskImageBuffer(ImageBuffer& imageBuffer)
-{
-    ASSERT(!RunLoop::isMain());
-    MESSAGE_CHECK(!m_currentMaskImageBuffer, "Current mask image buffer is already set.");
-    m_currentMaskImageBuffer = &imageBuffer;
-}
-
-void RemoteRenderingBackend::didResetMaskImageBuffer()
-{
-    ASSERT(!RunLoop::isMain());
-    MESSAGE_CHECK(m_currentMaskImageBuffer, "Current mask image buffer was not already set.");
-    m_currentMaskImageBuffer = nullptr;
-}
-
-std::optional<DisplayList::ItemHandle> WARN_UNUSED_RETURN RemoteRenderingBackend::decodeItem(const uint8_t* data, size_t length, DisplayList::ItemType type, uint8_t* handleLocation)
-{
-    /* This needs to match (1) isInlineItem() in DisplayListItemType.cpp, (2) RemoteImageBufferProxy::encodeItem(),
-     * and (3) all the "static constexpr bool isInlineItem"s inside the individual item classes.
-     * See the comment at the top of DisplayListItems.h for why. */
-
-    switch (type) {
-    case DisplayList::ItemType::BeginClipToDrawingCommands:
-        return decodeAndCreate<DisplayList::BeginClipToDrawingCommands>(data, length, handleLocation);
-    case DisplayList::ItemType::ClipOutToPath:
-        return decodeAndCreate<DisplayList::ClipOutToPath>(data, length, handleLocation);
-    case DisplayList::ItemType::ClipPath:
-        return decodeAndCreate<DisplayList::ClipPath>(data, length, handleLocation);
-    case DisplayList::ItemType::DrawFocusRingPath:
-        return decodeAndCreate<DisplayList::DrawFocusRingPath>(data, length, handleLocation);
-    case DisplayList::ItemType::DrawFocusRingRects:
-        return decodeAndCreate<DisplayList::DrawFocusRingRects>(data, length, handleLocation);
-    case DisplayList::ItemType::DrawGlyphs:
-        return decodeAndCreate<DisplayList::DrawGlyphs>(data, length, handleLocation);
-    case DisplayList::ItemType::DrawLinesForText:
-        return decodeAndCreate<DisplayList::DrawLinesForText>(data, length, handleLocation);
-    case DisplayList::ItemType::DrawPath:
-        return decodeAndCreate<DisplayList::DrawPath>(data, length, handleLocation);
-    case DisplayList::ItemType::FillCompositedRect:
-        return decodeAndCreate<DisplayList::FillCompositedRect>(data, length, handleLocation);
-    case DisplayList::ItemType::FillPath:
-        return decodeAndCreate<DisplayList::FillPath>(data, length, handleLocation);
-    case DisplayList::ItemType::FillRectWithColor:
-        return decodeAndCreate<DisplayList::FillRectWithColor>(data, length, handleLocation);
-    case DisplayList::ItemType::FillRectWithGradient:
-        return decodeAndCreate<DisplayList::FillRectWithGradient>(data, length, handleLocation);
-    case DisplayList::ItemType::FillRectWithRoundedHole:
-        return decodeAndCreate<DisplayList::FillRectWithRoundedHole>(data, length, handleLocation);
-    case DisplayList::ItemType::FillRoundedRect:
-        return decodeAndCreate<DisplayList::FillRoundedRect>(data, length, handleLocation);
-    case DisplayList::ItemType::GetPixelBuffer:
-        return decodeAndCreate<DisplayList::GetPixelBuffer>(data, length, handleLocation);
-    case DisplayList::ItemType::PutPixelBuffer:
-        return decodeAndCreate<DisplayList::PutPixelBuffer>(data, length, handleLocation);
-    case DisplayList::ItemType::SetLineDash:
-        return decodeAndCreate<DisplayList::SetLineDash>(data, length, handleLocation);
-    case DisplayList::ItemType::SetState:
-        return decodeAndCreate<DisplayList::SetState>(data, length, handleLocation);
-    case DisplayList::ItemType::StrokePath:
-        return decodeAndCreate<DisplayList::StrokePath>(data, length, handleLocation);
-    case DisplayList::ItemType::ApplyDeviceScaleFactor:
-#if USE(CG)
-    case DisplayList::ItemType::ApplyFillPattern:
-    case DisplayList::ItemType::ApplyStrokePattern:
-#endif
-    case DisplayList::ItemType::BeginTransparencyLayer:
-    case DisplayList::ItemType::ClearRect:
-    case DisplayList::ItemType::ClearShadow:
-    case DisplayList::ItemType::Clip:
-    case DisplayList::ItemType::ClipOut:
-    case DisplayList::ItemType::ClipToImageBuffer:
-    case DisplayList::ItemType::EndClipToDrawingCommands:
-    case DisplayList::ItemType::ConcatenateCTM:
-    case DisplayList::ItemType::DrawDotsForDocumentMarker:
-    case DisplayList::ItemType::DrawEllipse:
-    case DisplayList::ItemType::DrawImageBuffer:
-    case DisplayList::ItemType::DrawNativeImage:
-    case DisplayList::ItemType::DrawPattern:
-    case DisplayList::ItemType::DrawLine:
-    case DisplayList::ItemType::DrawRect:
-    case DisplayList::ItemType::EndTransparencyLayer:
-    case DisplayList::ItemType::FillEllipse:
-#if ENABLE(INLINE_PATH_DATA)
-    case DisplayList::ItemType::FillLine:
-    case DisplayList::ItemType::FillArc:
-    case DisplayList::ItemType::FillQuadCurve:
-    case DisplayList::ItemType::FillBezierCurve:
-#endif
-    case DisplayList::ItemType::FillRect:
-    case DisplayList::ItemType::FlushContext:
-    case DisplayList::ItemType::MetaCommandChangeDestinationImageBuffer:
-    case DisplayList::ItemType::MetaCommandChangeItemBuffer:
-#if ENABLE(VIDEO)
-    case DisplayList::ItemType::PaintFrameForMedia:
-#endif
-    case DisplayList::ItemType::Restore:
-    case DisplayList::ItemType::Rotate:
-    case DisplayList::ItemType::Save:
-    case DisplayList::ItemType::Scale:
-    case DisplayList::ItemType::SetCTM:
-    case DisplayList::ItemType::SetInlineFillColor:
-    case DisplayList::ItemType::SetInlineStrokeColor:
-    case DisplayList::ItemType::SetLineCap:
-    case DisplayList::ItemType::SetLineJoin:
-    case DisplayList::ItemType::SetMiterLimit:
-    case DisplayList::ItemType::SetStrokeThickness:
-    case DisplayList::ItemType::StrokeEllipse:
-#if ENABLE(INLINE_PATH_DATA)
-    case DisplayList::ItemType::StrokeArc:
-    case DisplayList::ItemType::StrokeQuadCurve:
-    case DisplayList::ItemType::StrokeBezierCurve:
-#endif
-    case DisplayList::ItemType::StrokeRect:
-    case DisplayList::ItemType::StrokeLine:
-    case DisplayList::ItemType::Translate:
-        ASSERT_NOT_REACHED();
-        return std::nullopt;
-    }
-    ASSERT_NOT_REACHED();
-    return std::nullopt;
-}
-
 void RemoteRenderingBackend::updateRenderingResourceRequest()
 {
     bool hasActiveDrawables = m_remoteResourceCache.hasActiveDrawables();
@@ -771,18 +381,6 @@
     return !m_remoteResourceCache.hasActiveDrawables();
 }
 
-RemoteRenderingBackendState RemoteRenderingBackend::lastKnownState() const
-{
-    ASSERT(RunLoop::isMain());
-    return m_lastKnownState.load();
-}
-
-void RemoteRenderingBackend::updateLastKnownState(RemoteRenderingBackendState state)
-{
-    ASSERT(!RunLoop::isMain());
-    m_lastKnownState.storeRelaxed(state);
-}
-
 void RemoteRenderingBackend::performWithMediaPlayerOnMainThread(MediaPlayerIdentifier identifier, Function<void(MediaPlayer&)>&& callback)
 {
     callOnMainRunLoopAndWait([&, gpuConnectionToWebProcess = m_gpuConnectionToWebProcess, identifier] {

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h (284078 => 284079)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h	2021-10-13 05:50:33 UTC (rev 284079)
@@ -28,17 +28,20 @@
 #if ENABLE(GPU_PROCESS)
 
 #include "Connection.h"
-#include "GPUProcessWakeupMessageArguments.h"
 #include "IPCSemaphore.h"
 #include "ImageBufferBackendHandle.h"
 #include "MessageReceiver.h"
 #include "MessageSender.h"
 #include "QualifiedRenderingResourceIdentifier.h"
+#include "RemoteDisplayListRecorder.h"
 #include "RemoteRenderingBackendState.h"
 #include "RemoteResourceCache.h"
 #include "RenderingBackendIdentifier.h"
 #include "RenderingUpdateID.h"
 #include "ScopedRenderingResourcesRequest.h"
+#include "StreamConnectionWorkQueue.h"
+#include "StreamMessageReceiver.h"
+#include "StreamServerConnection.h"
 #include <WebCore/ColorSpace.h>
 #include <WebCore/DisplayList.h>
 #include <WebCore/DisplayListItems.h>
@@ -48,11 +51,6 @@
 
 namespace WebCore {
 
-namespace DisplayList {
-class DisplayList;
-class Item;
-}
-
 class DestinationColorSpace;
 class FloatSize;
 class NativeImage;
@@ -63,34 +61,24 @@
 
 namespace WebKit {
 
-class DisplayListReaderHandle;
 class GPUConnectionToWebProcess;
+class RemoteDisplayListRecorder;
 struct RemoteRenderingBackendCreationParameters;
 
-class RemoteRenderingBackend
-    : private IPC::MessageSender
-    , public IPC::Connection::WorkQueueMessageReceiver
-    , public WebCore::DisplayList::ItemBufferReadingClient {
+class RemoteRenderingBackend : private IPC::MessageSender, public IPC::StreamMessageReceiver {
 public:
-
-    static Ref<RemoteRenderingBackend> create(GPUConnectionToWebProcess&, RemoteRenderingBackendCreationParameters&&);
+    static Ref<RemoteRenderingBackend> create(GPUConnectionToWebProcess&, RemoteRenderingBackendCreationParameters&&, IPC::StreamConnectionBuffer&&);
     virtual ~RemoteRenderingBackend();
     void stopListeningForIPC();
 
     RemoteResourceCache& remoteResourceCache() { return m_remoteResourceCache; }
 
-    // Rendering operations.
-    bool applyMediaItem(WebCore::DisplayList::ItemHandle, WebCore::GraphicsContext&);
+    void didReceiveStreamMessage(IPC::StreamServerConnectionBase&, IPC::Decoder&) final;
 
     // Messages to be sent.
-    void didCreateImageBufferBackend(ImageBufferBackendHandle, QualifiedRenderingResourceIdentifier);
+    void didCreateImageBufferBackend(ImageBufferBackendHandle, QualifiedRenderingResourceIdentifier, RemoteDisplayListRecorder&);
     void didFlush(WebCore::GraphicsContextFlushIdentifier, QualifiedRenderingResourceIdentifier);
 
-    void setNextItemBufferToRead(WebCore::DisplayList::ItemBufferIdentifier, QualifiedRenderingResourceIdentifier destination);
-
-    void didCreateMaskImageBuffer(WebCore::ImageBuffer&);
-    void didResetMaskImageBuffer();
-
     void populateGetPixelBufferSharedMemory(std::optional<WebCore::PixelBuffer>&&);
 
     bool allowsExitUnderMemoryPressure() const;
@@ -98,47 +86,22 @@
     // Runs Function in RemoteRenderingBackend task queue.
     void dispatch(Function<void()>&&);
 
-    RemoteRenderingBackendState lastKnownState() const;
-
+    IPC::StreamServerConnection& streamConnection() const { return m_streamConnection.get(); }
     void performWithMediaPlayerOnMainThread(WebCore::MediaPlayerIdentifier, Function<void(WebCore::MediaPlayer&)>&&);
 
 private:
-    RemoteRenderingBackend(GPUConnectionToWebProcess&, RemoteRenderingBackendCreationParameters&&);
+    RemoteRenderingBackend(GPUConnectionToWebProcess&, RemoteRenderingBackendCreationParameters&&, IPC::StreamConnectionBuffer&&);
     void startListeningForIPC();
 
-    std::optional<WebCore::DisplayList::ItemHandle> WARN_UNUSED_RETURN decodeItem(const uint8_t* data, size_t length, WebCore::DisplayList::ItemType, uint8_t* handleLocation) override;
-
-    template<typename T>
-    std::optional<WebCore::DisplayList::ItemHandle> WARN_UNUSED_RETURN decodeAndCreate(const uint8_t* data, size_t length, uint8_t* handleLocation)
-    {
-        if (auto item = IPC::Decoder::decodeSingleObject<T>(data, length)) {
-            // FIXME: WebKit2 should not need to know that the first 8 bytes at the handle are reserved for the type.
-            // Need to figure out a way to keep this knowledge within display list code in WebCore.
-            new (handleLocation + sizeof(uint64_t)) T(WTFMove(*item));
-            return {{ handleLocation }};
-        }
-        return std::nullopt;
-    }
-
-    WebCore::DisplayList::ReplayResult submit(const WebCore::DisplayList::DisplayList&, WebCore::ImageBuffer& destination);
-    RefPtr<WebCore::ImageBuffer> nextDestinationImageBufferAfterApplyingDisplayLists(WebCore::ImageBuffer& initialDestination, size_t initialOffset, DisplayListReaderHandle&, GPUProcessWakeupReason, WebCore::ProcessIdentifier webProcessIdentifier);
-
     std::optional<SharedMemory::IPCHandle> updateSharedMemoryForGetPixelBufferHelper(size_t byteCount);
     void updateRenderingResourceRequest();
 
-    void updateLastKnownState(RemoteRenderingBackendState);
-
     // IPC::MessageSender.
     IPC::Connection* messageSenderConnection() const override;
     uint64_t messageSenderDestinationID() const override;
 
-    // IPC::MessageReceiver
-    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
-    bool didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, UniqueRef<IPC::Encoder>&) override;
-
     // Messages to be received.
     void createImageBuffer(const WebCore::FloatSize& logicalSize, WebCore::RenderingMode, float resolutionScale, const WebCore::DestinationColorSpace&, WebCore::PixelFormat, WebCore::RenderingResourceIdentifier);
-    void wakeUpAndApplyDisplayList(const GPUProcessWakeupMessageArguments&);
     void updateSharedMemoryForGetPixelBuffer(uint32_t byteCount, CompletionHandler<void(const SharedMemory::IPCHandle&)>&&);
     void semaphoreForGetPixelBuffer(CompletionHandler<void(const IPC::Semaphore&)>&&);
     void updateSharedMemoryAndSemaphoreForGetPixelBuffer(uint32_t byteCount, CompletionHandler<void(const SharedMemory::IPCHandle&, const IPC::Semaphore&)>&&);
@@ -151,10 +114,8 @@
     void deleteAllFonts();
     void releaseRemoteResource(WebCore::RenderingResourceIdentifier, uint64_t useCount);
     void finalizeRenderingUpdate(RenderingUpdateID);
-    void didCreateSharedDisplayListHandle(WebCore::DisplayList::ItemBufferIdentifier, const SharedMemory::IPCHandle&, WebCore::RenderingResourceIdentifier destinationBufferIdentifier);
 
     // Received messages translated to use QualifiedRenderingResourceIdentifier.
-    void wakeUpAndApplyDisplayListWithQualifiedIdentifier(WebCore::DisplayList::ItemBufferIdentifier, uint64_t offset, QualifiedRenderingResourceIdentifier, GPUProcessWakeupReason);
     void createImageBufferWithQualifiedIdentifier(const WebCore::FloatSize& logicalSize, WebCore::RenderingMode, float resolutionScale, const WebCore::DestinationColorSpace&, WebCore::PixelFormat, QualifiedRenderingResourceIdentifier);
     void getDataURLForImageBufferWithQualifiedIdentifier(const String& mimeType, std::optional<double> quality, WebCore::PreserveResolution, QualifiedRenderingResourceIdentifier, CompletionHandler<void(String&&)>&&);
     void getDataForImageBufferWithQualifiedIdentifier(const String& mimeType, std::optional<double> quality, QualifiedRenderingResourceIdentifier, CompletionHandler<void(Vector<uint8_t>&&)>&&);
@@ -164,55 +125,15 @@
     void releaseRemoteResourceWithQualifiedIdentifier(QualifiedRenderingResourceIdentifier, uint64_t useCount);
     void cacheFontWithQualifiedIdentifier(Ref<WebCore::Font>&&, QualifiedRenderingResourceIdentifier);
 
-    void resumeFromPendingWakeupInformation();
-
-    class ReplayerDelegate : public WebCore::DisplayList::Replayer::Delegate {
-    public:
-        ReplayerDelegate(WebCore::ImageBuffer&, RemoteRenderingBackend&, WebCore::ProcessIdentifier webProcessIdentifier);
-
-    private:
-        bool apply(WebCore::DisplayList::ItemHandle, WebCore::GraphicsContext&) final;
-        void didCreateMaskImageBuffer(WebCore::ImageBuffer&) final;
-        void didResetMaskImageBuffer() final;
-        void recordResourceUse(WebCore::RenderingResourceIdentifier) final;
-
-        WebCore::ImageBuffer& m_destination;
-        RemoteRenderingBackend& m_remoteRenderingBackend;
-        WebCore::ProcessIdentifier m_webProcessIdentifier;
-    };
-
-    struct PendingWakeupInformation {
-        WebCore::DisplayList::ItemBufferIdentifier itemBufferIdentifier;
-        uint64_t offset { 0 };
-        QualifiedRenderingResourceIdentifier destinationImageBufferIdentifier;
-        GPUProcessWakeupReason reason { GPUProcessWakeupReason::Unspecified };
-        std::optional<QualifiedRenderingResourceIdentifier> missingCachedResourceIdentifier;
-        RemoteRenderingBackendState state { RemoteRenderingBackendState::Initialized };
-
-        bool shouldPerformWakeup(QualifiedRenderingResourceIdentifier identifier) const
-        {
-            return destinationImageBufferIdentifier == identifier
-                || missingCachedResourceIdentifier == identifier;
-        }
-
-        bool shouldPerformWakeup(WebCore::DisplayList::ItemBufferIdentifier identifier) const
-        {
-            return itemBufferIdentifier == identifier;
-        }
-    };
-
-    Ref<WorkQueue> m_workQueue;
+    IPC::StreamConnectionWorkQueue m_workQueue;
+    Ref<IPC::StreamServerConnection> m_streamConnection;
     RemoteResourceCache m_remoteResourceCache;
     Ref<GPUConnectionToWebProcess> m_gpuConnectionToWebProcess;
     RenderingBackendIdentifier m_renderingBackendIdentifier;
-    HashMap<WebCore::DisplayList::ItemBufferIdentifier, RefPtr<DisplayListReaderHandle>> m_sharedDisplayListHandles;
-    std::optional<PendingWakeupInformation> m_pendingWakeupInfo;
-    IPC::Semaphore m_resumeDisplayListSemaphore;
     IPC::Semaphore m_getPixelBufferSemaphore;
     RefPtr<SharedMemory> m_getPixelBufferSharedMemory;
     ScopedRenderingResourcesRequest m_renderingResourcesRequest;
-    RefPtr<WebCore::ImageBuffer> m_currentMaskImageBuffer;
-    Atomic<RemoteRenderingBackendState> m_lastKnownState { RemoteRenderingBackendState::Initialized };
+    WeakHashSet<RemoteDisplayListRecorder> m_remoteDisplayLists;
 };
 
 } // namespace WebKit

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


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in	2021-10-13 05:50:33 UTC (rev 284079)
@@ -22,20 +22,18 @@
 
 #if ENABLE(GPU_PROCESS)
 
-messages -> RemoteRenderingBackend {
+messages -> RemoteRenderingBackend NotRefCounted Stream {
     CreateImageBuffer(WebCore::FloatSize logicalSize, WebCore::RenderingMode renderingMode, float resolutionScale, WebCore::DestinationColorSpace colorSpace, enum:uint8_t WebCore::PixelFormat pixelFormat, WebCore::RenderingResourceIdentifier renderingResourceIdentifier)
-    WakeUpAndApplyDisplayList(struct WebKit::GPUProcessWakeupMessageArguments arguments)
-    UpdateSharedMemoryForGetPixelBuffer(uint32_t byteCount) -> (WebKit::SharedMemory::IPCHandle handle) Synchronous
-    SemaphoreForGetPixelBuffer() -> (IPC::Semaphore semaphore) Synchronous
-    UpdateSharedMemoryAndSemaphoreForGetPixelBuffer(uint32_t byteCount) -> (WebKit::SharedMemory::IPCHandle handle, IPC::Semaphore semaphore) Synchronous
+    UpdateSharedMemoryForGetPixelBuffer(uint32_t byteCount) -> (WebKit::SharedMemory::IPCHandle handle) Synchronous NotStreamEncodableReply
+    SemaphoreForGetPixelBuffer() -> (IPC::Semaphore semaphore) Synchronous NotStreamEncodableReply
+    UpdateSharedMemoryAndSemaphoreForGetPixelBuffer(uint32_t byteCount) -> (WebKit::SharedMemory::IPCHandle handle, IPC::Semaphore semaphore) Synchronous NotStreamEncodableReply
     DestroyGetPixelBufferSharedMemory()
     GetDataURLForImageBuffer(String mimeType, std::optional<double> quality, enum:uint8_t WebCore::PreserveResolution preserveResolution, WebCore::RenderingResourceIdentifier renderingResourceIdentifier) -> (String urlString) Synchronous
     GetDataForImageBuffer(String mimeType, std::optional<double> quality, WebCore::RenderingResourceIdentifier renderingResourceIdentifier) -> (Vector<uint8_t> data) Synchronous
-    GetShareableBitmapForImageBuffer(WebCore::RenderingResourceIdentifier imageBuffer, enum:uint8_t WebCore::PreserveResolution preserveResolution) -> (WebKit::ShareableBitmap::Handle handle) Synchronous
-    CacheNativeImage(WebKit::ShareableBitmap::Handle handle, WebCore::RenderingResourceIdentifier renderingResourceIdentifier)
-    CacheFont(IPC::FontReference font)
+    GetShareableBitmapForImageBuffer(WebCore::RenderingResourceIdentifier imageBuffer, enum:uint8_t WebCore::PreserveResolution preserveResolution) -> (WebKit::ShareableBitmap::Handle handle) Synchronous NotStreamEncodableReply
+    CacheNativeImage(WebKit::ShareableBitmap::Handle handle, WebCore::RenderingResourceIdentifier renderingResourceIdentifier) NotStreamEncodable
+    CacheFont(IPC::FontReference font) NotStreamEncodable
     DeleteAllFonts()
-    DidCreateSharedDisplayListHandle(WebCore::DisplayList::ItemBufferIdentifier identifier, WebKit::SharedMemory::IPCHandle handle, WebCore::RenderingResourceIdentifier destinationBufferIdentifier)
     ReleaseRemoteResource(WebCore::RenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
     FinalizeRenderingUpdate(WebKit::RenderingUpdateID renderingUpdateID)
 }

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackendCreationParameters.h (284078 => 284079)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackendCreationParameters.h	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackendCreationParameters.h	2021-10-13 05:50:33 UTC (rev 284079)
@@ -36,13 +36,12 @@
 
 struct RemoteRenderingBackendCreationParameters {
     RenderingBackendIdentifier identifier;
-    IPC::Semaphore resumeDisplayListSemaphore;
     WebPageProxyIdentifier pageProxyID;
     WebCore::PageIdentifier pageID;
 
     void encode(IPC::Encoder& encoder) const
     {
-        encoder << identifier << resumeDisplayListSemaphore << pageProxyID << pageID;
+        encoder << identifier << pageProxyID << pageID;
     }
 
     static std::optional<RemoteRenderingBackendCreationParameters> decode(IPC::Decoder& decoder)
@@ -52,11 +51,6 @@
         if (!identifier)
             return std::nullopt;
 
-        std::optional<IPC::Semaphore> resumeDisplayListSemaphore;
-        decoder >> resumeDisplayListSemaphore;
-        if (!resumeDisplayListSemaphore)
-            return std::nullopt;
-
         std::optional<WebPageProxyIdentifier> pageProxyID;
         decoder >> pageProxyID;
         if (!pageProxyID)
@@ -67,7 +61,7 @@
         if (!pageID)
             return std::nullopt;
 
-        return {{ *identifier, WTFMove(*resumeDisplayListSemaphore), *pageProxyID, *pageID }};
+        return { { *identifier, *pageProxyID, *pageID } };
     }
 };
 

Modified: trunk/Source/WebKit/GPUProcess/mac/com.apple.WebKit.GPUProcess.sb.in (284078 => 284079)


--- trunk/Source/WebKit/GPUProcess/mac/com.apple.WebKit.GPUProcess.sb.in	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/GPUProcess/mac/com.apple.WebKit.GPUProcess.sb.in	2021-10-13 05:50:33 UTC (rev 284079)
@@ -742,9 +742,7 @@
 (allow mach-lookup
        (global-name "com.apple.audio.audiohald")
        (global-name "com.apple.CARenderServer") ; Needed for [CAContext remoteContextWithOptions]
-#if __MAC_OS_X_VERSION_MIN_REQUIRED < 120000
        (global-name "com.apple.lsd.mapdb")
-#endif
        (global-name "com.apple.fonts")
        (global-name "com.apple.PowerManagement.control")
        (global-name "com.apple.trustd.agent")

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h (284078 => 284079)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h	2021-10-13 05:50:33 UTC (rev 284079)
@@ -29,13 +29,13 @@
 
 #include "Encoder.h"
 #include "Logging.h"
+#include "RemoteDisplayListRecorderProxy.h"
+#include "RemoteRenderingBackendMessages.h"
 #include "RemoteRenderingBackendProxy.h"
 #include "SharedMemory.h"
+#include <WebCore/ConcreteImageBuffer.h>
 #include <WebCore/DisplayList.h>
-#include <WebCore/DisplayListImageBuffer.h>
 #include <WebCore/DisplayListItems.h>
-#include <WebCore/DisplayListRecorder.h>
-#include <WebCore/DisplayListReplayer.h>
 #include <WebCore/MIMETypeRegistry.h>
 #include <wtf/Condition.h>
 #include <wtf/Lock.h>
@@ -47,12 +47,11 @@
 template<typename BackendType> class ThreadSafeRemoteImageBufferFlusher;
 
 template<typename BackendType>
-class RemoteImageBufferProxy : public WebCore::DisplayList::ImageBuffer<BackendType>, public WebCore::DisplayList::RecorderImpl::Delegate, public WebCore::DisplayList::ItemBufferWritingClient {
-    using BaseDisplayListImageBuffer = WebCore::DisplayList::ImageBuffer<BackendType>;
-    using BaseDisplayListImageBuffer::m_backend;
-    using BaseDisplayListImageBuffer::m_drawingContext;
-    using BaseDisplayListImageBuffer::m_renderingResourceIdentifier;
-    using BaseDisplayListImageBuffer::resolutionScale;
+class RemoteImageBufferProxy : public WebCore::ConcreteImageBuffer<BackendType> {
+    using BaseConcreteImageBuffer = WebCore::ConcreteImageBuffer<BackendType>;
+    using BaseConcreteImageBuffer::m_backend;
+    using BaseConcreteImageBuffer::m_renderingResourceIdentifier;
+    using BaseConcreteImageBuffer::resolutionScale;
 
 public:
     static RefPtr<RemoteImageBufferProxy> create(const WebCore::FloatSize& size, float resolutionScale, const WebCore::DestinationColorSpace& colorSpace, WebCore::PixelFormat pixelFormat, RemoteRenderingBackendProxy& remoteRenderingBackendProxy)
@@ -66,7 +65,7 @@
     ~RemoteImageBufferProxy()
     {
         if (!m_remoteRenderingBackendProxy || m_remoteRenderingBackendProxy->isGPUProcessConnectionClosed()) {
-            clearDisplayList();
+            m_remoteDisplayList.resetNeedsFlush();
             return;
         }
 
@@ -98,19 +97,14 @@
 
 protected:
     RemoteImageBufferProxy(const WebCore::ImageBufferBackend::Parameters& parameters, RemoteRenderingBackendProxy& remoteRenderingBackendProxy)
-        : BaseDisplayListImageBuffer(parameters, this)
+        : BaseConcreteImageBuffer(parameters)
         , m_remoteRenderingBackendProxy(makeWeakPtr(remoteRenderingBackendProxy))
+        , m_remoteDisplayList(*this, remoteRenderingBackendProxy, { { }, BaseConcreteImageBuffer::logicalSize() }, BaseConcreteImageBuffer::baseTransform())
     {
         ASSERT(m_remoteRenderingBackendProxy);
         m_remoteRenderingBackendProxy->remoteResourceCacheProxy().cacheImageBuffer(*this);
-
-        m_drawingContext.displayList().setItemBufferWritingClient(this);
-        m_drawingContext.displayList().setItemBufferReadingClient(nullptr);
-        m_drawingContext.displayList().setTracksDrawingItemExtents(false);
     }
 
-    WebCore::RenderingMode renderingMode() const final { return BaseDisplayListImageBuffer::renderingMode(); }
-
     // It is safe to access m_receivedFlushIdentifier from the main thread without locking since it
     // only gets modified on the main thread.
     bool hasPendingFlush() const WTF_IGNORES_THREAD_SAFETY_ANALYSIS
@@ -219,7 +213,7 @@
             return std::nullopt;
 
         auto& mutableThis = const_cast<RemoteImageBufferProxy&>(*this);
-        mutableThis.m_drawingContext.recorder().getPixelBuffer(destinationFormat, srcRect);
+        mutableThis.m_remoteDisplayList.getPixelBuffer(destinationFormat, srcRect);
         mutableThis.flushDrawingContextAsync();
 
         if (m_remoteRenderingBackendProxy->waitForGetPixelBufferToComplete(timeout))
@@ -229,12 +223,28 @@
         return pixelBuffer;
     }
 
+    void clearBackend() final
+    {
+        m_remoteDisplayList.resetNeedsFlush();
+        BaseConcreteImageBuffer::clearBackend();
+    }
+
+    WebCore::GraphicsContext& context() const final
+    {
+        return const_cast<RemoteImageBufferProxy*>(this)->m_remoteDisplayList;
+    }
+
+    WebCore::GraphicsContext* drawingContext() final
+    {
+        return &m_remoteDisplayList;
+    }
+
     void putPixelBuffer(const WebCore::PixelBuffer& pixelBuffer, const WebCore::IntRect& srcRect, const WebCore::IntPoint& destPoint = { }, WebCore::AlphaPremultiplication destFormat = WebCore::AlphaPremultiplication::Premultiplied) final
     {
         // The math inside PixelBuffer::create() doesn't agree with the math inside ImageBufferBackend::putPixelBuffer() about how m_resolutionScale interacts with the data in the ImageBuffer.
         // This means that putPixelBuffer() is only called when resolutionScale() == 1.
         ASSERT(resolutionScale() == 1);
-        m_drawingContext.recorder().putPixelBuffer(pixelBuffer, srcRect, destPoint, destFormat);
+        m_remoteDisplayList.putPixelBuffer(pixelBuffer, srcRect, destPoint, destFormat);
     }
 
     bool prefersPreparationForDisplay() final { return true; }
@@ -260,94 +270,32 @@
         if (UNLIKELY(!m_remoteRenderingBackendProxy))
             return;
 
-        if (!m_drawingContext.displayList().isEmpty() || !hasPendingFlush()) {
+        if (m_remoteDisplayList.needsFlush() || !hasPendingFlush()) {
             m_sentFlushIdentifier = WebCore::GraphicsContextFlushIdentifier::generate();
-            m_drawingContext.recorder().flushContext(m_sentFlushIdentifier);
+            m_remoteDisplayList.flushContext(m_sentFlushIdentifier);
         }
 
-        m_remoteRenderingBackendProxy->sendDeferredWakeupMessageIfNeeded();
-        clearDisplayList();
+        m_remoteDisplayList.resetNeedsFlush();
     }
 
-    void recordNativeImageUse(WebCore::NativeImage& image) final
+    void recordNativeImageUse(WebCore::NativeImage& image)
     {
         if (m_remoteRenderingBackendProxy)
             m_remoteRenderingBackendProxy->remoteResourceCacheProxy().recordNativeImageUse(image);
     }
 
-    bool isCachedImageBuffer(const WebCore::ImageBuffer& imageBuffer) const final
+    void recordFontUse(WebCore::Font& font)
     {
-        if (!m_remoteRenderingBackendProxy)
-            return false;
-        auto cachedImageBuffer = m_remoteRenderingBackendProxy->remoteResourceCacheProxy().cachedImageBuffer(imageBuffer.renderingResourceIdentifier());
-        ASSERT(!cachedImageBuffer || cachedImageBuffer == &imageBuffer);
-        return cachedImageBuffer;
-    }
-
-    void changeDestinationImageBuffer(WebCore::RenderingResourceIdentifier nextImageBuffer) final
-    {
-        bool wasEmpty = m_drawingContext.displayList().isEmpty();
-        m_drawingContext.displayList().template append<WebCore::DisplayList::MetaCommandChangeDestinationImageBuffer>(nextImageBuffer);
-        if (wasEmpty)
-            clearDisplayList();
-    }
-
-    void prepareToAppendDisplayListItems(WebCore::DisplayList::ItemBufferHandle&& handle) final
-    {
-        m_drawingContext.displayList().prepareToAppend(WTFMove(handle));
-    }
-
-    void clearDisplayList()
-    {
-        m_drawingContext.displayList().clear();
-    }
-
-    bool canAppendItemOfType(WebCore::DisplayList::ItemType) final
-    {
-        if (UNLIKELY(!m_remoteRenderingBackendProxy))
-            return false;
-        m_remoteRenderingBackendProxy->willAppendItem(m_renderingResourceIdentifier);
-        return true;
-    }
-
-    void didAppendData(const WebCore::DisplayList::ItemBufferHandle& handle, size_t numberOfBytes, WebCore::DisplayList::DidChangeItemBuffer didChangeItemBuffer) final
-    {
-        if (LIKELY(m_remoteRenderingBackendProxy))
-            m_remoteRenderingBackendProxy->didAppendData(handle, numberOfBytes, didChangeItemBuffer, m_renderingResourceIdentifier);
-    }
-
-    void recordFontUse(WebCore::Font& font) final
-    {
         if (m_remoteRenderingBackendProxy)
             m_remoteRenderingBackendProxy->remoteResourceCacheProxy().recordFontUse(font);
     }
 
-    void recordImageBufferUse(WebCore::ImageBuffer& imageBuffer) final
+    void recordImageBufferUse(WebCore::ImageBuffer& imageBuffer)
     {
         if (m_remoteRenderingBackendProxy)
             m_remoteRenderingBackendProxy->remoteResourceCacheProxy().recordImageBufferUse(imageBuffer);
     }
 
-    WebCore::DisplayList::ItemBufferHandle createItemBuffer(size_t capacity) final
-    {
-        if (LIKELY(m_remoteRenderingBackendProxy))
-            return m_remoteRenderingBackendProxy->createItemBuffer(capacity, m_renderingResourceIdentifier);
-
-        ASSERT_NOT_REACHED();
-        return { };
-    }
-
-    RefPtr<WebCore::SharedBuffer> encodeItemOutOfLine(const WebCore::DisplayList::DisplayListItem& item) const final
-    {
-        return std::visit([](const auto& displayListItem) -> RefPtr<WebCore::SharedBuffer> {
-            using DisplayListItemType = typename WTF::RemoveCVAndReference<decltype(displayListItem)>::type;
-            if constexpr (!DisplayListItemType::isInlineItem)
-                return IPC::Encoder::encodeSingleObject<DisplayListItemType>(displayListItem);
-            RELEASE_ASSERT_NOT_REACHED();
-            return nullptr;
-        }, item);
-    }
-
     std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher> createFlusher() final
     {
         return WTF::makeUnique<ThreadSafeRemoteImageBufferFlusher<BackendType>>(*this);
@@ -358,6 +306,7 @@
     Condition m_receivedFlushIdentifierChangedCondition;
     WebCore::GraphicsContextFlushIdentifier m_receivedFlushIdentifier WTF_GUARDED_BY_LOCK(m_receivedFlushIdentifierLock); // Only modified on the main thread but may get queried on a secondary thread.
     WeakPtr<RemoteRenderingBackendProxy> m_remoteRenderingBackendProxy;
+    RemoteDisplayListRecorderProxy m_remoteDisplayList;
 };
 
 template<typename BackendType>

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


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp	2021-10-13 05:50:33 UTC (rev 284079)
@@ -28,7 +28,6 @@
 
 #if ENABLE(GPU_PROCESS)
 
-#include "DisplayListWriterHandle.h"
 #include "GPUConnectionToWebProcess.h"
 #include "Logging.h"
 #include "PlatformRemoteImageBufferProxy.h"
@@ -52,7 +51,6 @@
 RemoteRenderingBackendProxy::RemoteRenderingBackendProxy(WebPage& webPage)
     : m_parameters {
         RenderingBackendIdentifier::generate(),
-        IPC::Semaphore { },
         webPage.webPageProxyIdentifier(),
         webPage.identifier()
     }
@@ -77,7 +75,9 @@
         auto& gpuProcessConnection = WebProcess::singleton().ensureGPUProcessConnection();
         gpuProcessConnection.addClient(*this);
         gpuProcessConnection.messageReceiverMap().addMessageReceiver(Messages::RemoteRenderingBackendProxy::messageReceiverName(), renderingBackendIdentifier().toUInt64(), *this);
-        gpuProcessConnection.connection().send(Messages::GPUConnectionToWebProcess::CreateRenderingBackend(m_parameters), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+        static constexpr auto connectionBufferSize = 1 << 21;
+        m_streamConnection = makeUnique<IPC::StreamClientConnection>(gpuProcessConnection.connection(), connectionBufferSize);
+        gpuProcessConnection.connection().send(Messages::GPUConnectionToWebProcess::CreateRenderingBackend(m_parameters, m_streamConnection->streamBuffer()), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
         m_gpuProcessConnection = makeWeakPtr(gpuProcessConnection);
     }
     return *m_gpuProcessConnection;
@@ -91,12 +91,6 @@
 
     m_remoteResourceCacheProxy.remoteResourceCacheWasDestroyed();
 
-    m_identifiersOfReusableHandles.clear();
-    m_sharedDisplayListHandles.clear();
-    m_currentDestinationImageBufferIdentifier = std::nullopt;
-    m_deferredWakeupMessageArguments = std::nullopt;
-    m_remainingItemsToAppendBeforeSendingWakeup = 0;
-
     if (m_destroyGetPixelBufferSharedMemoryTimer.isActive())
         m_destroyGetPixelBufferSharedMemoryTimer.stop();
     m_getPixelBufferSemaphore = std::nullopt;
@@ -133,7 +127,7 @@
 
 void RemoteRenderingBackendProxy::createRemoteImageBuffer(ImageBuffer& imageBuffer)
 {
-    send(Messages::RemoteRenderingBackend::CreateImageBuffer(imageBuffer.logicalSize(), imageBuffer.renderingMode(), imageBuffer.resolutionScale(), imageBuffer.colorSpace(), imageBuffer.pixelFormat(), imageBuffer.renderingResourceIdentifier()), renderingBackendIdentifier(), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+    sendToStream(Messages::RemoteRenderingBackend::CreateImageBuffer(imageBuffer.logicalSize(), imageBuffer.renderingMode(), imageBuffer.resolutionScale(), imageBuffer.colorSpace(), imageBuffer.pixelFormat(), imageBuffer.renderingResourceIdentifier()));
 }
 
 RefPtr<ImageBuffer> RemoteRenderingBackendProxy::createImageBuffer(const FloatSize& size, RenderingMode renderingMode, float resolutionScale, const DestinationColorSpace& colorSpace, PixelFormat pixelFormat)
@@ -163,8 +157,6 @@
 
 SharedMemory* RemoteRenderingBackendProxy::sharedMemoryForGetPixelBuffer(size_t dataSize, IPC::Timeout timeout)
 {
-    sendDeferredWakeupMessageIfNeeded();
-
     bool needsSharedMemory = !m_getPixelBufferSharedMemory || dataSize > m_getPixelBufferSharedMemoryLength;
     bool needsSemaphore = !m_getPixelBufferSemaphore;
 
@@ -175,11 +167,11 @@
     IPC::Semaphore semaphore;
 
     if (needsSharedMemory && needsSemaphore)
-        sendSync(Messages::RemoteRenderingBackend::UpdateSharedMemoryAndSemaphoreForGetPixelBuffer(dataSize), Messages::RemoteRenderingBackend::UpdateSharedMemoryAndSemaphoreForGetPixelBuffer::Reply(handle, semaphore), renderingBackendIdentifier(), timeout, IPC::SendSyncOption::MaintainOrderingWithAsyncMessages);
+        sendSyncToStream(Messages::RemoteRenderingBackend::UpdateSharedMemoryAndSemaphoreForGetPixelBuffer(dataSize), Messages::RemoteRenderingBackend::UpdateSharedMemoryAndSemaphoreForGetPixelBuffer::Reply(handle, semaphore), timeout);
     else if (needsSharedMemory)
-        sendSync(Messages::RemoteRenderingBackend::UpdateSharedMemoryForGetPixelBuffer(dataSize), Messages::RemoteRenderingBackend::UpdateSharedMemoryForGetPixelBuffer::Reply(handle), renderingBackendIdentifier(), timeout, IPC::SendSyncOption::MaintainOrderingWithAsyncMessages);
+        sendSyncToStream(Messages::RemoteRenderingBackend::UpdateSharedMemoryForGetPixelBuffer(dataSize), Messages::RemoteRenderingBackend::UpdateSharedMemoryForGetPixelBuffer::Reply(handle), timeout);
     else if (needsSemaphore)
-        sendSync(Messages::RemoteRenderingBackend::SemaphoreForGetPixelBuffer(), Messages::RemoteRenderingBackend::SemaphoreForGetPixelBuffer::Reply(semaphore), renderingBackendIdentifier(), timeout);
+        sendSyncToStream(Messages::RemoteRenderingBackend::SemaphoreForGetPixelBuffer(), Messages::RemoteRenderingBackend::SemaphoreForGetPixelBuffer::Reply(semaphore), timeout);
 
     if (!handle.handle.isNull()) {
         m_getPixelBufferSharedMemory = SharedMemory::map(handle.handle, SharedMemory::Protection::ReadOnly);
@@ -204,33 +196,27 @@
 void RemoteRenderingBackendProxy::destroyGetPixelBufferSharedMemory()
 {
     m_getPixelBufferSharedMemory = nullptr;
-    send(Messages::RemoteRenderingBackend::DestroyGetPixelBufferSharedMemory(), renderingBackendIdentifier(), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+    sendToStream(Messages::RemoteRenderingBackend::DestroyGetPixelBufferSharedMemory());
 }
 
 String RemoteRenderingBackendProxy::getDataURLForImageBuffer(const String& mimeType, std::optional<double> quality, PreserveResolution preserveResolution, RenderingResourceIdentifier renderingResourceIdentifier)
 {
-    sendDeferredWakeupMessageIfNeeded();
-
     String urlString;
-    sendSync(Messages::RemoteRenderingBackend::GetDataURLForImageBuffer(mimeType, quality, preserveResolution, renderingResourceIdentifier), Messages::RemoteRenderingBackend::GetDataURLForImageBuffer::Reply(urlString), renderingBackendIdentifier(), 1_s);
+    sendSyncToStream(Messages::RemoteRenderingBackend::GetDataURLForImageBuffer(mimeType, quality, preserveResolution, renderingResourceIdentifier), Messages::RemoteRenderingBackend::GetDataURLForImageBuffer::Reply(urlString), 1_s);
     return urlString;
 }
 
 Vector<uint8_t> RemoteRenderingBackendProxy::getDataForImageBuffer(const String& mimeType, std::optional<double> quality, RenderingResourceIdentifier renderingResourceIdentifier)
 {
-    sendDeferredWakeupMessageIfNeeded();
-
     Vector<uint8_t> data;
-    sendSync(Messages::RemoteRenderingBackend::GetDataForImageBuffer(mimeType, quality, renderingResourceIdentifier), Messages::RemoteRenderingBackend::GetDataForImageBuffer::Reply(data), renderingBackendIdentifier(), 1_s);
+    sendSyncToStream(Messages::RemoteRenderingBackend::GetDataForImageBuffer(mimeType, quality, renderingResourceIdentifier), Messages::RemoteRenderingBackend::GetDataForImageBuffer::Reply(data), 1_s);
     return data;
 }
 
 RefPtr<ShareableBitmap> RemoteRenderingBackendProxy::getShareableBitmap(RenderingResourceIdentifier imageBuffer, PreserveResolution preserveResolution)
 {
-    sendDeferredWakeupMessageIfNeeded();
-
     ShareableBitmap::Handle handle;
-    auto sendResult = sendSync(Messages::RemoteRenderingBackend::GetShareableBitmapForImageBuffer(imageBuffer, preserveResolution), Messages::RemoteRenderingBackend::GetShareableBitmapForImageBuffer::Reply(handle), renderingBackendIdentifier(), 1_s);
+    auto sendResult = sendSyncToStream(Messages::RemoteRenderingBackend::GetShareableBitmapForImageBuffer(imageBuffer, preserveResolution), Messages::RemoteRenderingBackend::GetShareableBitmapForImageBuffer::Reply(handle), 1_s);
     if (handle.isNull())
         return { };
     ASSERT_UNUSED(sendResult, sendResult);
@@ -239,30 +225,27 @@
 
 void RemoteRenderingBackendProxy::cacheNativeImage(const ShareableBitmap::Handle& handle, RenderingResourceIdentifier renderingResourceIdentifier)
 {
-    send(Messages::RemoteRenderingBackend::CacheNativeImage(handle, renderingResourceIdentifier), renderingBackendIdentifier(), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+    sendToStream(Messages::RemoteRenderingBackend::CacheNativeImage(handle, renderingResourceIdentifier));
 }
 
-void RemoteRenderingBackendProxy::cacheFont(Ref<WebCore::Font>&& font)
+void RemoteRenderingBackendProxy::cacheFont(Ref<Font>&& font)
 {
-    send(Messages::RemoteRenderingBackend::CacheFont(WTFMove(font)), renderingBackendIdentifier(), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+    sendToStream(Messages::RemoteRenderingBackend::CacheFont(WTFMove(font)));
 }
 
 void RemoteRenderingBackendProxy::deleteAllFonts()
 {
-    send(Messages::RemoteRenderingBackend::DeleteAllFonts(), renderingBackendIdentifier(), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+    sendToStream(Messages::RemoteRenderingBackend::DeleteAllFonts());
 }
 
 void RemoteRenderingBackendProxy::releaseRemoteResource(RenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
 {
-    if (renderingResourceIdentifier == m_currentDestinationImageBufferIdentifier)
-        m_currentDestinationImageBufferIdentifier = std::nullopt;
-
-    send(Messages::RemoteRenderingBackend::ReleaseRemoteResource(renderingResourceIdentifier, useCount), renderingBackendIdentifier(), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+    sendToStream(Messages::RemoteRenderingBackend::ReleaseRemoteResource(renderingResourceIdentifier, useCount));
 }
 
 void RemoteRenderingBackendProxy::finalizeRenderingUpdate()
 {
-    send(Messages::RemoteRenderingBackend::FinalizeRenderingUpdate(m_renderingUpdateID), renderingBackendIdentifier(), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+    sendToStream(Messages::RemoteRenderingBackend::FinalizeRenderingUpdate(m_renderingUpdateID));
     m_remoteResourceCacheProxy.finalizeRenderingUpdate();
     m_renderingUpdateID.increment();
 }
@@ -293,160 +276,36 @@
     m_didRenderingUpdateID = std::min(didRenderingUpdateID, m_renderingUpdateID);
 }
 
-void RemoteRenderingBackendProxy::willAppendItem(RenderingResourceIdentifier newDestinationIdentifier)
+RenderingBackendIdentifier RemoteRenderingBackendProxy::renderingBackendIdentifier() const
 {
-    if (m_currentDestinationImageBufferIdentifier == newDestinationIdentifier)
-        return;
-
-    if (auto previousDestinationBufferIdentifier = std::exchange(m_currentDestinationImageBufferIdentifier, newDestinationIdentifier)) {
-        if (auto imageBuffer = m_remoteResourceCacheProxy.cachedImageBuffer(*previousDestinationBufferIdentifier))
-            imageBuffer->changeDestinationImageBuffer(newDestinationIdentifier);
-        else
-            ASSERT_NOT_REACHED();
-    }
-
-    auto handle = mostRecentlyUsedDisplayListHandle();
-    if (UNLIKELY(!handle))
-        return;
-
-    auto newDestination = m_remoteResourceCacheProxy.cachedImageBuffer(newDestinationIdentifier);
-    if (UNLIKELY(!newDestination)) {
-        ASSERT_NOT_REACHED();
-        return;
-    }
-
-    handle->moveWritableOffsetToStartIfPossible();
-    newDestination->prepareToAppendDisplayListItems(handle->createHandle());
+    return m_parameters.identifier;
 }
 
-void RemoteRenderingBackendProxy::sendWakeupMessage(const GPUProcessWakeupMessageArguments& arguments)
+RenderingBackendIdentifier RemoteRenderingBackendProxy::ensureBackendCreated()
 {
-    LOG_WITH_STREAM(SharedDisplayLists, stream << "Sending wakeup: Items[" << arguments.itemBufferIdentifier << "] => Image(" << arguments.destinationImageBufferIdentifier << ") at " << arguments.offset);
-    send(Messages::RemoteRenderingBackend::WakeUpAndApplyDisplayList(arguments), renderingBackendIdentifier(), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+    ensureGPUProcessConnection();
+    return renderingBackendIdentifier();
 }
 
-void RemoteRenderingBackendProxy::sendDeferredWakeupMessageIfNeeded()
+IPC::StreamClientConnection& RemoteRenderingBackendProxy::streamConnection()
 {
-    auto arguments = std::exchange(m_deferredWakeupMessageArguments, std::nullopt);
-    if (!arguments)
-        return;
-
-    sendWakeupMessage(*arguments);
-    m_remainingItemsToAppendBeforeSendingWakeup = 0;
+    ensureGPUProcessConnection();
+    if (UNLIKELY(m_needsWakeUpSemaphoreForDisplayListStream))
+        messageSenderConnection()->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy::DidCreateWakeUpSemaphoreForDisplayListStream>(renderingBackendIdentifier(), 3_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);
+    return *m_streamConnection;
 }
 
-void RemoteRenderingBackendProxy::didAppendData(const DisplayList::ItemBufferHandle& handle, size_t numberOfBytes, DisplayList::DidChangeItemBuffer didChangeItemBuffer, RenderingResourceIdentifier destinationImageBuffer)
+void RemoteRenderingBackendProxy::didCreateWakeUpSemaphoreForDisplayListStream(IPC::Semaphore&& semaphore)
 {
-    auto* sharedHandle = m_sharedDisplayListHandles.get(handle.identifier);
-    if (UNLIKELY(!sharedHandle))
-        RELEASE_ASSERT_NOT_REACHED();
-
-    bool wasEmpty = sharedHandle->advance(numberOfBytes) == numberOfBytes;
-    if (!wasEmpty || didChangeItemBuffer == DisplayList::DidChangeItemBuffer::Yes) {
-        if (m_deferredWakeupMessageArguments) {
-            auto imageBuffer = m_remoteResourceCacheProxy.cachedImageBuffer(m_deferredWakeupMessageArguments->destinationImageBufferIdentifier);
-            if (imageBuffer && imageBuffer->backend() && sharedHandle->tryToResume({ m_deferredWakeupMessageArguments->offset, m_deferredWakeupMessageArguments->destinationImageBufferIdentifier.toUInt64() })) {
-                m_parameters.resumeDisplayListSemaphore.signal();
-                m_deferredWakeupMessageArguments = std::nullopt;
-                m_remainingItemsToAppendBeforeSendingWakeup = 0;
-            } else if (!--m_remainingItemsToAppendBeforeSendingWakeup) {
-                m_deferredWakeupMessageArguments->reason = GPUProcessWakeupReason::ItemCountHysteresisExceeded;
-                sendWakeupMessage(*std::exchange(m_deferredWakeupMessageArguments, std::nullopt));
-            }
-        }
+    if (!m_streamConnection) {
+        ASSERT_NOT_REACHED();
         return;
     }
 
-    sendDeferredWakeupMessageIfNeeded();
-
-    auto imageBuffer = m_remoteResourceCacheProxy.cachedImageBuffer(destinationImageBuffer);
-    auto offsetToRead = sharedHandle->writableOffset() - numberOfBytes;
-    if (imageBuffer && imageBuffer->backend() && sharedHandle->tryToResume({ offsetToRead, destinationImageBuffer.toUInt64() })) {
-        m_parameters.resumeDisplayListSemaphore.signal();
-        return;
-    }
-
-    // Instead of sending the wakeup message immediately, wait for some additional data. This gives the
-    // web process a "head start", decreasing the likelihood that the GPU process will encounter frequent
-    // wakeups when processing a large amount of display list items.
-    constexpr unsigned itemCountHysteresisBeforeSendingWakeup = 512;
-
-    m_remainingItemsToAppendBeforeSendingWakeup = itemCountHysteresisBeforeSendingWakeup;
-    m_deferredWakeupMessageArguments = {{ handle.identifier, offsetToRead, destinationImageBuffer }};
+    m_streamConnection->setWakeUpSemaphore(WTFMove(semaphore));
+    m_needsWakeUpSemaphoreForDisplayListStream = false;
 }
 
-RefPtr<DisplayListWriterHandle> RemoteRenderingBackendProxy::mostRecentlyUsedDisplayListHandle()
-{
-    if (UNLIKELY(m_identifiersOfReusableHandles.isEmpty()))
-        return nullptr;
-
-    return m_sharedDisplayListHandles.get(m_identifiersOfReusableHandles.first());
-}
-
-RefPtr<DisplayListWriterHandle> RemoteRenderingBackendProxy::findReusableDisplayListHandle(size_t capacity)
-{
-    auto mostRecentlyUsedHandle = mostRecentlyUsedDisplayListHandle();
-    if (UNLIKELY(!mostRecentlyUsedHandle))
-        return nullptr;
-
-    mostRecentlyUsedHandle->moveWritableOffsetToStartIfPossible();
-    if (mostRecentlyUsedHandle->availableCapacity() >= capacity)
-        return mostRecentlyUsedHandle;
-
-    m_identifiersOfReusableHandles.append(m_identifiersOfReusableHandles.takeFirst());
-
-    auto leastRecentlyUsedIdentifier = m_identifiersOfReusableHandles.first();
-    if (leastRecentlyUsedIdentifier != mostRecentlyUsedHandle->identifier()) {
-        RefPtr handle = m_sharedDisplayListHandles.get(leastRecentlyUsedIdentifier);
-        if (handle->moveWritableOffsetToStartIfPossible() && handle->availableCapacity() >= capacity)
-            return handle;
-    }
-
-    return nullptr;
-}
-
-DisplayList::ItemBufferHandle RemoteRenderingBackendProxy::createItemBuffer(size_t capacity, RenderingResourceIdentifier destinationBufferIdentifier)
-{
-    if (auto handle = findReusableDisplayListHandle(capacity)) {
-        LOG_WITH_STREAM(SharedDisplayLists, stream << "Reusing Items[" << handle->identifier() << "] => Image(" << destinationBufferIdentifier << ") (remaining capacity: " << handle->availableCapacity() << ")");
-        return handle->createHandle();
-    }
-
-    static constexpr size_t defaultSharedItemBufferSize = 1 << 16;
-    static_assert(defaultSharedItemBufferSize > SharedDisplayListHandle::headerSize());
-
-    auto sharedMemory = SharedMemory::allocate(std::max(defaultSharedItemBufferSize, capacity + SharedDisplayListHandle::headerSize()));
-    if (!sharedMemory)
-        return { };
-
-    SharedMemory::Handle sharedMemoryHandle;
-    sharedMemory->createHandle(sharedMemoryHandle, SharedMemory::Protection::ReadWrite);
-
-    auto identifier = DisplayList::ItemBufferIdentifier::generate();
-    send(Messages::RemoteRenderingBackend::DidCreateSharedDisplayListHandle(identifier, { WTFMove(sharedMemoryHandle), sharedMemory->size() }, destinationBufferIdentifier), renderingBackendIdentifier(), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
-
-    auto newHandle = DisplayListWriterHandle::create(identifier, sharedMemory.releaseNonNull());
-    RELEASE_ASSERT(newHandle, "There must be enough space to create the handle.");
-    auto displayListHandle = newHandle->createHandle();
-
-    m_identifiersOfReusableHandles.prepend(identifier);
-    m_sharedDisplayListHandles.set(identifier, WTFMove(newHandle));
-
-    LOG_WITH_STREAM(SharedDisplayLists, stream << "Allocated Items[" << identifier << "] => Image(" << destinationBufferIdentifier << ")");
-    return displayListHandle;
-}
-
-RenderingBackendIdentifier RemoteRenderingBackendProxy::renderingBackendIdentifier() const
-{
-    return m_parameters.identifier;
-}
-
-RenderingBackendIdentifier RemoteRenderingBackendProxy::ensureBackendCreated()
-{
-    ensureGPUProcessConnection();
-    return renderingBackendIdentifier();
-}
-
 void RemoteRenderingBackendProxy::recordNativeImageUse(NativeImage& image)
 {
     m_remoteResourceCacheProxy.recordNativeImageUse(image);

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


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h	2021-10-13 05:50:33 UTC (rev 284079)
@@ -33,11 +33,13 @@
 #include "ImageBufferBackendHandle.h"
 #include "MessageReceiver.h"
 #include "MessageSender.h"
+#include "RemoteDisplayListRecorderMessages.h"
 #include "RemoteRenderingBackendCreationParameters.h"
+#include "RemoteRenderingBackendMessages.h"
 #include "RemoteResourceCacheProxy.h"
 #include "RenderingBackendIdentifier.h"
 #include "RenderingUpdateID.h"
-#include <WebCore/DisplayList.h>
+#include "StreamClientConnection.h"
 #include <WebCore/RenderingResourceIdentifier.h>
 #include <WebCore/Timer.h>
 #include <wtf/Deque.h>
@@ -45,11 +47,6 @@
 
 namespace WebCore {
 
-namespace DisplayList {
-class DisplayList;
-class Item;
-}
-
 class DestinationColorSpace;
 class FloatSize;
 class PixelBuffer;
@@ -61,7 +58,6 @@
 
 namespace WebKit {
 
-class DisplayListWriterHandle;
 class WebPage;
 
 class RemoteRenderingBackendProxy
@@ -77,12 +73,7 @@
     using WeakValueType = GPUProcessConnection::Client::WeakValueType;
 
     RemoteResourceCacheProxy& remoteResourceCacheProxy() { return m_remoteResourceCacheProxy; }
-    WebCore::DisplayList::ItemBufferHandle createItemBuffer(size_t capacity, WebCore::RenderingResourceIdentifier destinationBufferIdentifier);
 
-    void didAppendData(const WebCore::DisplayList::ItemBufferHandle&, size_t numberOfBytes, WebCore::DisplayList::DidChangeItemBuffer, WebCore::RenderingResourceIdentifier destinationImageBuffer);
-    void willAppendItem(WebCore::RenderingResourceIdentifier);
-    void sendDeferredWakeupMessageIfNeeded();
-
     SharedMemory* sharedMemoryForGetPixelBuffer(size_t dataSize, IPC::Timeout);
     bool waitForGetPixelBufferToComplete(IPC::Timeout);
     void destroyGetPixelBufferSharedMemory();
@@ -101,7 +92,6 @@
     RefPtr<WebCore::ImageBuffer> createImageBuffer(const WebCore::FloatSize&, WebCore::RenderingMode, float resolutionScale, const WebCore::DestinationColorSpace&, WebCore::PixelFormat);
     String getDataURLForImageBuffer(const String& mimeType, std::optional<double> quality, WebCore::PreserveResolution, WebCore::RenderingResourceIdentifier);
     Vector<uint8_t> getDataForImageBuffer(const String& mimeType, std::optional<double> quality, WebCore::RenderingResourceIdentifier);
-    WebCore::GraphicsContextFlushIdentifier flushDisplayListAndCommit(const WebCore::DisplayList::DisplayList&, WebCore::RenderingResourceIdentifier);
     RefPtr<ShareableBitmap> getShareableBitmap(WebCore::RenderingResourceIdentifier, WebCore::PreserveResolution);
     void cacheNativeImage(const ShareableBitmap::Handle&, WebCore::RenderingResourceIdentifier);
     void cacheFont(Ref<WebCore::Font>&&);
@@ -125,10 +115,13 @@
 
     bool isGPUProcessConnectionClosed() const { return !m_gpuProcessConnection; }
 
+    void didCreateWakeUpSemaphoreForDisplayListStream(IPC::Semaphore&&);
+
     template<typename T, typename U>
     void sendToStream(T&& message, ObjectIdentifier<U> identifier)
     {
-        // FIXME: Not yet implemented.
+        // FIXME: We should consider making the send timeout finite.
+        streamConnection().send(WTFMove(message), identifier, Seconds::infinity());
     }
 
     template<typename T>
@@ -144,6 +137,14 @@
 private:
     explicit RemoteRenderingBackendProxy(WebPage&);
 
+    IPC::StreamClientConnection& streamConnection();
+
+    template<typename T>
+    auto sendSyncToStream(T&& message, typename T::Reply&& reply, IPC::Timeout timeout)
+    {
+        return streamConnection().sendSync(WTFMove(message), WTFMove(reply), renderingBackendIdentifier(), timeout);
+    }
+
     // GPUProcessConnection::Client
     void gpuProcessConnectionDidClose(GPUProcessConnection&) final;
 
@@ -154,21 +155,11 @@
     void didFlush(WebCore::GraphicsContextFlushIdentifier, WebCore::RenderingResourceIdentifier);
     void didFinalizeRenderingUpdate(RenderingUpdateID didRenderingUpdateID);
 
-    RefPtr<DisplayListWriterHandle> mostRecentlyUsedDisplayListHandle();
-    RefPtr<DisplayListWriterHandle> findReusableDisplayListHandle(size_t capacity);
-
-    void sendWakeupMessage(const GPUProcessWakeupMessageArguments&);
-
+    std::unique_ptr<IPC::StreamClientConnection> m_streamConnection;
     RemoteRenderingBackendCreationParameters m_parameters;
     WeakPtr<GPUProcessConnection> m_gpuProcessConnection;
     RemoteResourceCacheProxy m_remoteResourceCacheProxy { *this };
 
-    HashMap<WebCore::DisplayList::ItemBufferIdentifier, RefPtr<DisplayListWriterHandle>> m_sharedDisplayListHandles;
-    Deque<WebCore::DisplayList::ItemBufferIdentifier> m_identifiersOfReusableHandles;
-    std::optional<WebCore::RenderingResourceIdentifier> m_currentDestinationImageBufferIdentifier;
-    std::optional<GPUProcessWakeupMessageArguments> m_deferredWakeupMessageArguments;
-    unsigned m_remainingItemsToAppendBeforeSendingWakeup { 0 };
-
     std::optional<IPC::Semaphore> m_getPixelBufferSemaphore;
     RefPtr<SharedMemory> m_getPixelBufferSharedMemory;
     uint64_t m_getPixelBufferSharedMemoryLength { 0 };
@@ -176,6 +167,8 @@
 
     RenderingUpdateID m_renderingUpdateID;
     RenderingUpdateID m_didRenderingUpdateID;
+
+    bool m_needsWakeUpSemaphoreForDisplayListStream { true };
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in (284078 => 284079)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in	2021-10-13 05:50:33 UTC (rev 284079)
@@ -26,6 +26,7 @@
     DidCreateImageBufferBackend(WebKit::ImageBufferBackendHandle handle, WebCore::RenderingResourceIdentifier renderingResourceIdentifier)
     DidFlush(WebCore::GraphicsContextFlushIdentifier flushIdentifier, WebCore::RenderingResourceIdentifier renderingResourceIdentifier)
     DidFinalizeRenderingUpdate(WebKit::RenderingUpdateID didRenderingUpdateID)
+    DidCreateWakeUpSemaphoreForDisplayListStream(IPC::Semaphore wakeUpSemaphore)
 }
 
 #endif // ENABLE(GPU_PROCESS)

Modified: trunk/Source/WebKit/WebProcess/WebPage/IPCTestingAPI.cpp (284078 => 284079)


--- trunk/Source/WebKit/WebProcess/WebPage/IPCTestingAPI.cpp	2021-10-13 05:44:42 UTC (rev 284078)
+++ trunk/Source/WebKit/WebProcess/WebPage/IPCTestingAPI.cpp	2021-10-13 05:50:33 UTC (rev 284079)
@@ -761,13 +761,6 @@
     if (!identifier)
         return false;
 
-    auto jsSemaphore = jsObject->get(globalObject, JSC::Identifier::fromString(globalObject->vm(), "semaphore"_s));
-    if (scope.exception())
-        return false;
-    RefPtr semaphoreObject = JSIPCSemaphore::toWrapped(toRef(globalObject), toRef(jsSemaphore));
-    if (!semaphoreObject)
-        return false;
-
     auto pageProxyID = getObjectIdentifierFromProperty<WebPageProxyIdentifierType>(globalObject, jsObject, "pageProxyID"_s, scope);
     if (!pageProxyID)
         return false;
@@ -776,10 +769,8 @@
     if (!pageID)
         return false;
 
-    auto semaphore = semaphoreObject->exchange();
-    RemoteRenderingBackendCreationParameters parameters { *identifier, WTFMove(semaphore), *pageProxyID, *pageID };
+    RemoteRenderingBackendCreationParameters parameters { *identifier, *pageProxyID, *pageID };
     encoder << parameters;
-    semaphoreObject->exchange(WTFMove(parameters.resumeDisplayListSemaphore));
     return true;
 }
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to