Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 3dd074a9e5d206e613ec48c3d3f57388f00c62c6
      
https://github.com/WebKit/WebKit/commit/3dd074a9e5d206e613ec48c3d3f57388f00c62c6
  Author: Matt Woodrow <[email protected]>
  Date:   2023-12-08 (Fri, 08 Dec 2023)

  Changed paths:
    M Source/WTF/wtf/text/TextStream.h
    M Source/WebKit/CMakeLists.txt
    M Source/WebKit/DerivedSources-input.xcfilelist
    M Source/WebKit/DerivedSources-output.xcfilelist
    M Source/WebKit/DerivedSources.make
    M Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.cpp
    M Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h
    M Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.messages.in
    A Source/WebKit/GPUProcess/graphics/RemoteImageBufferSet.cpp
    A Source/WebKit/GPUProcess/graphics/RemoteImageBufferSet.h
    A Source/WebKit/GPUProcess/graphics/RemoteImageBufferSet.messages.in
    M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp
    M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h
    M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in
    M Source/WebKit/Platform/IPC/StreamClientConnection.h
    M Source/WebKit/Scripts/webkit/messages.py
    M Source/WebKit/Scripts/webkit/tests/MessageArgumentDescriptions.cpp
    A Source/WebKit/Shared/RemoteImageBufferSetIdentifier.h
    M Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h
    M Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm
    M Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStoreCollection.h
    M Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStoreCollection.mm
    M 
Source/WebKit/Shared/RemoteLayerTree/RemoteLayerWithInProcessRenderingBackingStore.h
    M 
Source/WebKit/Shared/RemoteLayerTree/RemoteLayerWithInProcessRenderingBackingStore.mm
    M 
Source/WebKit/Shared/RemoteLayerTree/RemoteLayerWithRemoteRenderingBackingStore.h
    M 
Source/WebKit/Shared/RemoteLayerTree/RemoteLayerWithRemoteRenderingBackingStore.mm
    M Source/WebKit/Shared/RemoteLayerTree/SwapBuffersDisplayRequirement.h
    M Source/WebKit/Shared/WTFArgumentCoders.serialization.in
    M Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in
    M Source/WebKit/Sources.txt
    M Source/WebKit/SourcesCocoa.txt
    M Source/WebKit/WebKit.xcodeproj/project.pbxproj
    M Source/WebKit/WebProcess/GPU/graphics/BufferIdentifierSet.h
    M Source/WebKit/WebProcess/GPU/graphics/BufferIdentifierSet.serialization.in
    M Source/WebKit/WebProcess/GPU/graphics/PrepareBackingStoreBuffersData.cpp
    M Source/WebKit/WebProcess/GPU/graphics/PrepareBackingStoreBuffersData.h
    M 
Source/WebKit/WebProcess/GPU/graphics/PrepareBackingStoreBuffersData.serialization.in
    M Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp
    M Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.h
    M Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.cpp
    M Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h
    A Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferSetProxy.cpp
    A Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferSetProxy.h
    M Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp
    M Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h
    M 
Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in
    M Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.h
    M Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/PDFDocumentLayout.h
    M Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/UnifiedPDFPlugin.h

  Log Message:
  -----------
  Sync wait in 
RemoteLayerWithRemoteRenderingBackingStoreCollection::prepareBackingStoresForDisplay
 delays rendering.
https://bugs.webkit.org/show_bug.cgi?id=265295
<rdar://116792212>

Reviewed by Kimmo Kinnunen.

In order to start issuing rendering commands for a layer, we need to determine 
which ImageBuffer is not
in-use and can be drawn to. We also need to know if the existing pixel contents 
have been discarded due
to being marked volatile. Both of these checks can only be done in the GPU 
process, so the previous
behaviour was to have a synchronous call to prepareBackingStoresForDisplay at 
the start of rendering.

This changes makes that process asynchronous (in the common case), by moving 
management of the buffer
triplet (front, back, secondary back) to the GPU process, and making the choice 
of which buffer is used
opaque from the perspective of the web process.

For each frame, the WebProcess allocates a new image buffer identifier (via 
RemoteDisplayListRecorderProxy),
and the GPU process asynchronously ensures that this is mapped to the right 
ImageBuffer (either by picking
an available one, or allocating if needed, similar to how recycling IOSurfaces 
from the pool happens). It
also queues copying of the pixels from the previous frame, clipping to the new 
draw region, and clearing the
draw region.

The only case where this isn't possible is when the existing front buffer has 
been marked volatile (and
might be discarded). This should be relatively rare (and not happen during high 
performance animations),
and we add a sync wait to determine if the full frame needs to be redrawn or 
not.

This adds a new RemoteRenderingBufferSet object in the GPU process that manages 
the set of buffers, and
preparing backing stores, volatility setting and flushing are changed to happen 
in terms of the buffer set
rather than individual ImageBuffers.

We unfortuntely still have to have a main-thread sync wait at the end of the 
rendering update, in order to
get the mach_port_t/IOSurface handle for the front buffer used. We also need to 
get the set of
RenderingResourceIdentifiers used, since these are the keys for the CAIOSurface 
caching in the UI process.
In the common case, this message will be sent back while the WebProcess is 
issuing drawing commands, and
the sync wait will process the pending message immediately.
Ideally a future change will handle sending IOSurfaces (via mach_port_t) from 
GPUP to UI process directly,
which would remove the need for this.

The current state is a performance improvement, since we can issue rendering 
commands before any sync
waits, but an ideal future would remove the sync waiting from rendering 
entirely.

This also fixes a bug with volatility, where we can send a volatility request, 
then do a sync prepare for
display (which sets non volatile), and finally process the asynchronous reply 
from the volatility request.
In that case the web process would cache locally that the buffer is volatile 
and not make further requests
for it. This is fixed by tracking transaction identifiers for volatility 
requests to ensure that we don't
get ordering problems.

* Source/WTF/wtf/text/TextStream.h:
(WTF::operator<<):
* Source/WebKit/DerivedSources-input.xcfilelist:
* Source/WebKit/DerivedSources.make:
* Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.cpp:
(WebKit::RemoteImageBuffer::create):
(WebKit::RemoteImageBuffer::RemoteImageBuffer):
* Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h:
(WebKit::RemoteImageBuffer::identifier const):
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp:
(WebKit::RemoteRenderingBackend::didFailCreateImageBuffer):
(WebKit::RemoteRenderingBackend::didCreateImageBuffer):
(WebKit::RemoteRenderingBackend::moveToImageBuffer):
(WebKit::RemoteRenderingBackend::createImageBuffer):
(WebKit::RemoteRenderingBackend::createRemoteRenderingBufferSet):
(WebKit::RemoteRenderingBackend::releaseRemoteRenderingBufferSet):
(WebKit::RemoteRenderingBackend::updateRemoteRenderingBufferSetConfiguration):
(WebKit::RemoteRenderingBackend::createBuffersForDisplay):
(WebKit::RemoteRenderingBackend::markSurfacesVolatile):
(WebKit::handleFromBuffer): Deleted.
(WebKit::RemoteRenderingBackend::prepareBuffersForDisplay): Deleted.
(WebKit::RemoteRenderingBackend::prepareLayerBuffersForDisplay): Deleted.
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h:
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in:
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBufferSet.cpp: Added.
(WebKit::RemoteRenderingBufferSet::updateConfiguration):
(WebKit::RemoteRenderingBufferSet::ensureFrontBufferForDisplay):
(WebKit::RemoteRenderingBufferSet::prepareFrontBufferForDisplay):
(WebKit::RemoteRenderingBufferSet::makeBuffersVolatile):
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBufferSet.h: Added.
(WebKit::RemoteRenderingBufferSet::isOpaque const):
* Source/WebKit/Platform/IPC/StreamClientConnection.h:
(IPC::StreamClientConnection::waitForAsyncReplyAndDispatchImmediately):
* Source/WebKit/Scripts/webkit/messages.py:
(serialized_identifiers):
(class_template_headers):
(headers_for_type):
* Source/WebKit/Shared/RemoteBufferSetIdentifier.h: Copied from 
Source/WebKit/WebProcess/GPU/graphics/BufferIdentifierSet.h.
* Source/WebKit/Shared/RemoteLayerTree/BufferAndBackendInfo.h: Removed.
* Source/WebKit/Shared/RemoteLayerTree/BufferAndBackendInfo.serialization.in: 
Removed.
* Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h:
(WebKit::RemoteLayerBackingStore::dirtyRegion):
(WebKit::RemoteLayerBackingStore::setBufferCacheIdentifiers):
* Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
(WebKit::RemoteLayerBackingStore::ensureBackingStore):
(WebKit::RemoteLayerBackingStore::encode const):
(WebKit::RemoteLayerBackingStoreProperties::decode):
(WebKit::RemoteLayerBackingStoreProperties::dump const):
(WebKit::RemoteLayerBackingStore::setFrontBuffer):
(WebKit::RemoteLayerBackingStore::supportsPartialRepaint const):
(WebKit::RemoteLayerBackingStore::drawingRequiresClearedPixels const):
(WebKit::RemoteLayerBackingStore::setDelegatedContents):
(WebKit::RemoteLayerBackingStore::paintContents):
(WebKit::RemoteLayerBackingStore::drawInContext):
(WebKit::RemoteLayerBackingStoreProperties::applyBackingStoreToLayer):
(WebKit::RemoteLayerBackingStoreProperties::updateCachedBuffers):
(WebKit::RemoteLayerBackingStore::applySwappedBuffers): Deleted.
* Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStoreCollection.h:
(WebKit::RemoteLayerBackingStoreCollection::backingStoreUpdated):
(WebKit::RemoteLayerBackingStoreCollection::backingStoreWillBeEncoded):
* Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreePropertyApplier.mm:
(WebKit::RemoteLayerTreePropertyApplier::applyPropertiesToLayer):
* 
Source/WebKit/Shared/RemoteLayerTree/RemoteLayerWithRemoteRenderingBackingStoreCollection.h:
* 
Source/WebKit/Shared/RemoteLayerTree/RemoteLayerWithRemoteRenderingBackingStoreCollection.mm:
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::paintReachableBackingStoreContents):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::prepareBackingStoresForDisplay):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::allocateBufferForBackingStore):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::collectBackingStoreBufferIdentifiersToMarkVolatile):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::collectAllBufferIdentifiersToMarkVolatile):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::markBackingStoreVolatileAfterReachabilityChange):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::tryMarkAllBackingStoreVolatile):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::markAllBackingStoreVolatileFromTimer):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::sendMarkBuffersVolatile):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::gpuProcessConnectionWasDestroyed):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::backingStoreWasCreated):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::backingStoreWillBeDestroyed):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::backingStoreUpdated):
(WebKit::RemoteLayerWithRemoteRenderingBackingStoreCollection::backingStoreWillBeEncoded):
* Source/WebKit/Shared/WTFArgumentCoders.serialization.in:
* Source/WebKit/Sources.txt:
* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.h:
* 
Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.messages.in:
* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm:
(WebKit::RemoteLayerTreeDrawingAreaProxy::asyncSetLayerContents):
* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeHost.h:
* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeHost.mm:
(WebKit::RemoteLayerTreeHost::asyncSetLayerContents):
* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeNode.h:
(WebKit::RemoteLayerTreeNode::asyncContentsIdentifier const):
(WebKit::RemoteLayerTreeNode::setAsyncContentsIdentifier):
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/GPU/graphics/BufferIdentifierSet.h:
(WebKit::operator<<):
* Source/WebKit/WebProcess/GPU/graphics/BufferIdentifierSet.serialization.in:
* Source/WebKit/WebProcess/GPU/graphics/PrepareBackingStoreBuffersData.cpp:
(WebKit::operator<<):
* Source/WebKit/WebProcess/GPU/graphics/PrepareBackingStoreBuffersData.h:
* 
Source/WebKit/WebProcess/GPU/graphics/PrepareBackingStoreBuffersData.serialization.in:
* Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.cpp:
(WebKit::RemoteImageBufferProxy::RemoteImageBufferProxy):
(WebKit::m_remoteBufferManager):
(WebKit::RemoteImageBufferProxy::remoteBufferWasDestroyed):
(WebKit::RemoteSerializedImageBufferProxy::sinkIntoImageBuffer):
* Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h:
(WebKit::RemoteImageBufferProxy::create):
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
(WebKit::RemoteRenderingBackendProxy::didClose):
(WebKit::RemoteRenderingBackendProxy::createImageBuffer):
(WebKit::RemoteRenderingBackendProxy::createRemoteRenderingBufferSet):
(WebKit::RemoteRenderingBackendProxy::releaseRemoteRenderingBufferSet):
(WebKit::RemoteRenderingBackendProxy::updateRemoteRenderingBufferSetConfiguration):
(WebKit::RemoteRenderingBackendProxy::prepareBuffersForDisplay):
(WebKit::RemoteRenderingBackendProxy::ensurePrepareCompleted):
(WebKit::RemoteRenderingBackendProxy::markSurfacesVolatile):
(WebKit::RemoteRenderingBackendProxy::didMarkLayersAsVolatile):
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in:
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBufferSetProxy.cpp: 
Copied from Source/WebKit/WebProcess/GPU/graphics/BufferIdentifierSet.h.
(WebKit::RemoteRenderingBufferSetProxy::RemoteRenderingBufferSetProxy):
(WebKit::RemoteRenderingBufferSetProxy::~RemoteRenderingBufferSetProxy):
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBufferSetProxy.h: Added.
(WebKit::RemoteRenderingBufferSetProxy::remoteBufferSetIdentifier const):
(WebKit::RemoteRenderingBufferSetProxy::requestedVolatility):
(WebKit::RemoteRenderingBufferSetProxy::confirmedVolatility):
(WebKit::RemoteRenderingBufferSetProxy::addRequestedVolatility):
(WebKit::RemoteRenderingBufferSetProxy::setConfirmedVolatility):
(WebKit::RemoteRenderingBufferSetProxy::clearVolatilityUntilAfter):
(WebKit::operator<<):
* Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
(WebKit::RemoteResourceCacheProxy::remoteResourceCacheWasDestroyed):
* Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.h:
* Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/PDFDocumentLayout.h:
* Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/UnifiedPDFPlugin.h:
* Source/WebKit/WebProcess/WebPage/RemoteLayerTree/GraphicsLayerCARemote.mm:

Canonical link: https://commits.webkit.org/271747@main


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to