Changeset 269943 in webkit
- Timestamp:
- Nov 17, 2020 10:15:45 PM (3 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r269935 r269943 1 2020-11-17 Tim Horton <timothy_horton@apple.com> 2 3 GPU-process-hosted RemoteLayerBackingStore should flush off the main thread 4 https://bugs.webkit.org/show_bug.cgi?id=219063 5 6 Reviewed by Simon Fraser. 7 8 * GPUProcess/graphics/RemoteRenderingBackend.h: 9 * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm: 10 (WebKit::RemoteLayerBackingStore::display): 11 Construct the ImageBuffer flusher /after/ submitting the final DisplayList, 12 so that it takes the correct flush identifier. 13 14 * GPUProcess/graphics/RemoteImageBuffer.h: 15 * GPUProcess/graphics/RemoteRenderingBackend.cpp: 16 (WebKit::RemoteRenderingBackend::didFlush): 17 (WebKit::RemoteRenderingBackend::flushDisplayListWasCommitted): Deleted. 18 * WebProcess/GPU/graphics/RemoteImageBufferProxy.h: 19 (WebKit::RemoteImageBufferProxy::didFlush): 20 (WebKit::RemoteImageBufferProxy::lastSentFlushIdentifier const): 21 (WebKit::RemoteImageBufferProxy::waitForDidFlushOnSecondaryThread): 22 (WebKit::RemoteImageBufferProxy::hasPendingFlush const): 23 (WebKit::RemoteImageBufferProxy::waitForDidFlushWithTimeout): 24 (WebKit::ThreadSafeRemoteImageBufferFlusher::ThreadSafeRemoteImageBufferFlusher): 25 (WebKit::RemoteImageBufferProxy::commitFlushDisplayList): Deleted. 26 (WebKit::RemoteImageBufferProxy::isPendingFlush const): Deleted. 27 (WebKit::RemoteImageBufferProxy::timeoutWaitForFlushDisplayListWasCommitted): Deleted. 28 Some renames: 29 30 Rename flushDisplayListWasCommitted to didFlush; this is the back-message from 31 GPU process to Web Content process that a FlushContext display list item was completed successfully. 32 Rename isPendingFlush to hasPendingFlush, for grammar. 33 Rename timeoutWaitForFlushDisplayListWasCommitted to waitForDidFlushWithTimeout, for similar reasons. 34 Rename waitForFlushDisplayListWasCommitted to waitForDidFlush. 35 Rename commitFlushDisplayList to didFlush. 36 37 * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp: 38 (WebKit::RemoteRenderingBackendProxy::waitForDidFlush): 39 (WebKit::RemoteRenderingBackendProxy::didFlush): 40 (WebKit::RemoteRenderingBackendProxy::waitForFlushDisplayListWasCommitted): Deleted. 41 (WebKit::RemoteRenderingBackendProxy::flushDisplayListWasCommitted): Deleted. 42 * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h: 43 * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in: 44 Reimplement ThreadSafeRemoteImageBufferFlusher such that it waits 45 (on the RemoteLayerTreeDrawingArea CommitQueue, in the only current use of it) 46 for the correct flush reply to come in before continuing. This is analogous 47 to what we do for in-process buffers, where we call CGContextFlush() 48 in the flusher. 49 1 50 2020-11-17 Chris Dumez <cdumez@apple.com> 2 51 -
trunk/Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h
r269710 r269943 88 88 BaseConcreteImageBuffer::flushContext(); 89 89 auto identifier = item.get<WebCore::DisplayList::FlushContext>().identifier(); 90 m_remoteRenderingBackend. flushDisplayListWasCommitted(identifier, m_renderingResourceIdentifier);90 m_remoteRenderingBackend.didFlush(identifier, m_renderingResourceIdentifier); 91 91 return true; 92 92 } -
trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp
r269789 r269943 105 105 } 106 106 107 void RemoteRenderingBackend:: flushDisplayListWasCommitted(DisplayList::FlushIdentifier flushIdentifier, RenderingResourceIdentifier renderingResourceIdentifier)108 { 109 send(Messages::RemoteRenderingBackendProxy:: FlushDisplayListWasCommitted(flushIdentifier, renderingResourceIdentifier), m_renderingBackendIdentifier);107 void RemoteRenderingBackend::didFlush(DisplayList::FlushIdentifier flushIdentifier, RenderingResourceIdentifier renderingResourceIdentifier) 108 { 109 send(Messages::RemoteRenderingBackendProxy::DidFlush(flushIdentifier, renderingResourceIdentifier), m_renderingBackendIdentifier); 110 110 } 111 111 -
trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h
r269710 r269943 72 72 // Messages to be sent. 73 73 void imageBufferBackendWasCreated(const WebCore::FloatSize& logicalSize, const WebCore::IntSize& backendSize, float resolutionScale, WebCore::ColorSpace, WebCore::PixelFormat, ImageBufferBackendHandle, WebCore::RenderingResourceIdentifier); 74 void flushDisplayListWasCommitted(WebCore::DisplayList::FlushIdentifier, WebCore::RenderingResourceIdentifier);74 void didFlush(WebCore::DisplayList::FlushIdentifier, WebCore::RenderingResourceIdentifier); 75 75 76 76 void setNextItemBufferToRead(WebCore::DisplayList::ItemBufferIdentifier); -
trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm
r269895 r269943 314 314 m_paintingRects.clear(); 315 315 316 m_frontBufferFlusher = m_frontBuffer.imageBuffer->createFlusher();317 318 316 m_layer->owner()->platformCALayerLayerDidDisplay(m_layer); 319 317 320 318 // FIXME: This method has a weird name. This is "submit work". 321 319 m_frontBuffer.imageBuffer->flushDrawingContextAndCommit(); 320 321 m_frontBufferFlusher = m_frontBuffer.imageBuffer->createFlusher(); 322 322 323 323 return true; -
trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h
r269824 r269943 35 35 #include <WebCore/DisplayListItems.h> 36 36 #include <WebCore/DisplayListRecorder.h> 37 #include <wtf/Condition.h> 38 #include <wtf/Lock.h> 37 39 #include <wtf/SystemTracing.h> 38 40 … … 40 42 41 43 class RemoteRenderingBackend; 42 43 class ThreadSafeRemoteImageBufferFlusher : public WebCore::ThreadSafeImageBufferFlusher { 44 WTF_MAKE_FAST_ALLOCATED; 45 public: 46 ThreadSafeRemoteImageBufferFlusher(WebCore::ImageBuffer& imageBuffer) 47 { 48 // FIXME: We shouldn't synchronously wait on the flush until flush() is called, but have to invent 49 // a thread-safe way to wait on the incoming message. 50 imageBuffer.flushDrawingContext(); 51 } 52 53 void flush() override 54 { 55 } 56 57 private: 58 }; 44 template<typename BackendType> class ThreadSafeRemoteImageBufferFlusher; 59 45 60 46 template<typename BackendType> … … 91 77 } 92 78 93 void commitFlushDisplayList(WebCore::DisplayList::FlushIdentifier flushIdentifier) 94 { 79 void didFlush(WebCore::DisplayList::FlushIdentifier flushIdentifier) 80 { 81 auto locker = holdLock(m_receivedFlushIdentifierLock); 95 82 m_receivedFlushIdentifier = flushIdentifier; 83 m_receivedFlushIdentifierChangedCondition.notifyAll(); 96 84 } 97 85 … … 108 96 } 109 97 98 WebCore::DisplayList::FlushIdentifier lastSentFlushIdentifier() const { return m_sentFlushIdentifier; } 99 100 void waitForDidFlushOnSecondaryThread(WebCore::DisplayList::FlushIdentifier targetFlushIdentifier) 101 { 102 ASSERT(!isMainThread()); 103 auto locker = holdLock(m_receivedFlushIdentifierLock); 104 m_receivedFlushIdentifierChangedCondition.wait(m_receivedFlushIdentifierLock, [&] { 105 return m_receivedFlushIdentifier == targetFlushIdentifier; 106 }); 107 108 // Nothing should have sent more drawing commands to the GPU process 109 // while waiting for this ImageBuffer to be flushed. 110 ASSERT(m_sentFlushIdentifier == targetFlushIdentifier); 111 } 112 110 113 protected: 114 friend class RemoteRenderingBackend; 111 115 RemoteImageBufferProxy(const WebCore::FloatSize& size, WebCore::RenderingMode renderingMode, float resolutionScale, WebCore::ColorSpace colorSpace, WebCore::PixelFormat pixelFormat, RemoteRenderingBackendProxy& remoteRenderingBackendProxy) 112 116 : BaseDisplayListImageBuffer(size, this) … … 125 129 } 126 130 127 bool isPendingFlush() const { return m_sentFlushIdentifier != m_receivedFlushIdentifier; }128 129 void timeoutWaitForFlushDisplayListWasCommitted()131 bool hasPendingFlush() const { return m_sentFlushIdentifier != m_receivedFlushIdentifier; } 132 133 void waitForDidFlushWithTimeout() 130 134 { 131 135 if (!m_remoteRenderingBackendProxy) … … 134 138 // Wait for our DisplayList to be flushed but do not hang. 135 139 static constexpr unsigned maxWaitingFlush = 3; 136 for (unsigned numWaitingFlush = 0; numWaitingFlush < maxWaitingFlush && isPendingFlush(); ++numWaitingFlush)137 m_remoteRenderingBackendProxy->waitFor FlushDisplayListWasCommitted();140 for (unsigned numWaitingFlush = 0; numWaitingFlush < maxWaitingFlush && hasPendingFlush(); ++numWaitingFlush) 141 m_remoteRenderingBackendProxy->waitForDidFlush(); 138 142 } 139 143 … … 182 186 TraceScope tracingScope(FlushRemoteImageBufferStart, FlushRemoteImageBufferEnd); 183 187 flushDrawingContextAndCommit(); 184 timeoutWaitForFlushDisplayListWasCommitted();188 waitForDidFlushWithTimeout(); 185 189 } 186 190 … … 338 342 std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher> createFlusher() override 339 343 { 340 return WTF::makeUnique<ThreadSafeRemoteImageBufferFlusher >(*this);344 return WTF::makeUnique<ThreadSafeRemoteImageBufferFlusher<BackendType>>(*this); 341 345 } 342 346 343 347 WebCore::DisplayList::FlushIdentifier m_sentFlushIdentifier; 348 Lock m_receivedFlushIdentifierLock; 349 Condition m_receivedFlushIdentifierChangedCondition; 344 350 WebCore::DisplayList::FlushIdentifier m_receivedFlushIdentifier; 345 351 WeakPtr<RemoteRenderingBackendProxy> m_remoteRenderingBackendProxy; … … 352 358 }; 353 359 360 template<typename BackendType> 361 class ThreadSafeRemoteImageBufferFlusher final : public WebCore::ThreadSafeImageBufferFlusher { 362 WTF_MAKE_FAST_ALLOCATED; 363 public: 364 ThreadSafeRemoteImageBufferFlusher(RemoteImageBufferProxy<BackendType>& imageBuffer) 365 : m_imageBuffer(imageBuffer) 366 , m_targetFlushIdentifier(imageBuffer.lastSentFlushIdentifier()) 367 { 368 } 369 370 void flush() final 371 { 372 m_imageBuffer->waitForDidFlushOnSecondaryThread(m_targetFlushIdentifier); 373 } 374 375 private: 376 Ref<RemoteImageBufferProxy<BackendType>> m_imageBuffer; 377 WebCore::DisplayList::FlushIdentifier m_targetFlushIdentifier; 378 }; 379 354 380 } // namespace WebKit 355 381 -
trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp
r269809 r269943 119 119 } 120 120 121 bool RemoteRenderingBackendProxy::waitFor FlushDisplayListWasCommitted()121 bool RemoteRenderingBackendProxy::waitForDidFlush() 122 122 { 123 123 Ref<IPC::Connection> connection = WebProcess::singleton().ensureGPUProcessConnection().connection(); 124 return connection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy:: FlushDisplayListWasCommitted>(m_renderingBackendIdentifier, 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);124 return connection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy::DidFlush>(m_renderingBackendIdentifier, 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives); 125 125 } 126 126 … … 196 196 } 197 197 198 void RemoteRenderingBackendProxy:: flushDisplayListWasCommitted(DisplayList::FlushIdentifier flushIdentifier, RenderingResourceIdentifier renderingResourceIdentifier)198 void RemoteRenderingBackendProxy::didFlush(DisplayList::FlushIdentifier flushIdentifier, RenderingResourceIdentifier renderingResourceIdentifier) 199 199 { 200 200 auto imageBuffer = m_remoteResourceCacheProxy.cachedImageBuffer(renderingResourceIdentifier); … … 203 203 204 204 if (imageBuffer->isAccelerated()) 205 downcast<AcceleratedRemoteImageBufferProxy>(*imageBuffer). commitFlushDisplayList(flushIdentifier);205 downcast<AcceleratedRemoteImageBufferProxy>(*imageBuffer).didFlush(flushIdentifier); 206 206 else 207 downcast<UnacceleratedRemoteImageBufferProxy>(*imageBuffer). commitFlushDisplayList(flushIdentifier);207 downcast<UnacceleratedRemoteImageBufferProxy>(*imageBuffer).didFlush(flushIdentifier); 208 208 } 209 209 -
trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h
r269809 r269943 83 83 84 84 bool waitForImageBufferBackendWasCreated(); 85 bool waitFor FlushDisplayListWasCommitted();85 bool waitForDidFlush(); 86 86 87 87 private: … … 97 97 // Messages to be received. 98 98 void imageBufferBackendWasCreated(const WebCore::FloatSize& logicalSize, const WebCore::IntSize& backendSize, float resolutionScale, WebCore::ColorSpace, WebCore::PixelFormat, ImageBufferBackendHandle, WebCore::RenderingResourceIdentifier); 99 void flushDisplayListWasCommitted(WebCore::DisplayList::FlushIdentifier, WebCore::RenderingResourceIdentifier);99 void didFlush(WebCore::DisplayList::FlushIdentifier, WebCore::RenderingResourceIdentifier); 100 100 101 101 RemoteResourceCacheProxy m_remoteResourceCacheProxy { *this }; -
trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in
r269710 r269943 25 25 messages -> RemoteRenderingBackendProxy NotRefCounted { 26 26 ImageBufferBackendWasCreated(WebCore::FloatSize logicalSize, WebCore::IntSize backendSize, float resolutionScale, WebCore::ColorSpace colorSpace, enum:uint8_t WebCore::PixelFormat pixelFormat, WebKit::ImageBufferBackendHandle handle, WebCore::RenderingResourceIdentifier renderingResourceIdentifier) 27 FlushDisplayListWasCommitted(WebCore::DisplayList::FlushIdentifier flushIdentifier, WebCore::RenderingResourceIdentifier renderingResourceIdentifier)27 DidFlush(WebCore::DisplayList::FlushIdentifier flushIdentifier, WebCore::RenderingResourceIdentifier renderingResourceIdentifier) 28 28 } 29 29
Note: See TracChangeset
for help on using the changeset viewer.