Changeset 274413 in webkit
- Timestamp:
- Mar 15, 2021 4:34:01 AM (3 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r274412 r274413 1 2021-03-15 Kimmo Kinnunen <kkinnunen@apple.com> 2 3 RemoteRenderingBackend commands are not processed in order if GPU process is waiting for replies 4 https://bugs.webkit.org/show_bug.cgi?id=222099 5 6 Reviewed by Simon Fraser. 7 8 Mark all asynchronous message sends with DispatchMessageEvenWhenWaitingForSyncReply. 9 Otherwise synchronous messages will be dispatched before asynchronous messages. 10 The messages are temporally dependent. 11 12 Consider initial message exchange in canvas-blending-color-over-image.html: 13 GPUConnectionToWebProcess_CreateRenderingBackend 14 RemoteRenderingBackend_CreateImageBuffer 15 RemoteRenderingBackend_DidCreateSharedDisplayListHandle 16 RemoteRenderingBackend_CreateImageBuffer 17 RemoteRenderingBackend_WakeUpAndApplyDisplayList 18 RemoteRenderingBackend_GetDataURLForImageBuffer 19 RemoteRenderingBackendProxy_DidCreateImageBufferBackend 20 RemoteRenderingBackendProxy_DidCreateImageBufferBackend 21 22 If GPU process is waiting for a sync reply when the sequence up 23 until GetDataURL.. arrives, then the dispatch order is: 24 25 GPUConnectionToWebProcess_CreateRenderingBackend 26 RemoteRenderingBackend_GetDataURLForImageBuffer 27 [... rest of the messages] 28 29 This is a rare case, affects only the case where: 30 1) These messages arrive before main thread processes the message queue 31 2) GPU process has sent a synchronous message and is waiting for a reply 32 33 In base case after RenderingBackend has been created and the work queue 34 receive queue has been installed, all messages are moved to the work 35 queue thread and dispatched in order of arrival. 36 37 No new tests, timing dependent and WebKit code cannot be 38 unit tested. 39 40 * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp: 41 (WebKit::RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy): 42 (WebKit::RemoteRenderingBackendProxy::reestablishGPUProcessConnection): 43 (WebKit::RemoteRenderingBackendProxy::createImageBuffer): 44 (WebKit::RemoteRenderingBackendProxy::cacheNativeImage): 45 (WebKit::RemoteRenderingBackendProxy::cacheFont): 46 (WebKit::RemoteRenderingBackendProxy::deleteAllFonts): 47 (WebKit::RemoteRenderingBackendProxy::releaseRemoteResource): 48 (WebKit::RemoteRenderingBackendProxy::sendWakeupMessage): 49 (WebKit::RemoteRenderingBackendProxy::createItemBuffer): 50 1 51 2021-03-15 Kimmo Kinnunen <kkinnunen@apple.com> 2 52 -
trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp
r273301 r274413 59 59 60 60 // Release the RemoteRenderingBackend. 61 send(Messages::GPUConnectionToWebProcess::ReleaseRenderingBackend(m_renderingBackendIdentifier), 0 );61 send(Messages::GPUConnectionToWebProcess::ReleaseRenderingBackend(m_renderingBackendIdentifier), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 62 62 } 63 63 … … 77 77 if (!imageBuffer) 78 78 continue; 79 send(Messages::RemoteRenderingBackend::CreateImageBuffer(imageBuffer->logicalSize(), imageBuffer->renderingMode(), imageBuffer->resolutionScale(), imageBuffer->colorSpace(), imageBuffer->pixelFormat(), imageBuffer->renderingResourceIdentifier()), m_renderingBackendIdentifier );79 send(Messages::RemoteRenderingBackend::CreateImageBuffer(imageBuffer->logicalSize(), imageBuffer->renderingMode(), imageBuffer->resolutionScale(), imageBuffer->colorSpace(), imageBuffer->pixelFormat(), imageBuffer->renderingResourceIdentifier()), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 80 80 imageBuffer->clearBackend(); 81 81 } … … 137 137 138 138 if (imageBuffer) { 139 send(Messages::RemoteRenderingBackend::CreateImageBuffer(size, renderingMode, resolutionScale, colorSpace, pixelFormat, imageBuffer->renderingResourceIdentifier()), m_renderingBackendIdentifier );139 send(Messages::RemoteRenderingBackend::CreateImageBuffer(size, renderingMode, resolutionScale, colorSpace, pixelFormat, imageBuffer->renderingResourceIdentifier()), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 140 140 return imageBuffer; 141 141 } … … 194 194 void RemoteRenderingBackendProxy::cacheNativeImage(const ShareableBitmap::Handle& handle, RenderingResourceIdentifier renderingResourceIdentifier) 195 195 { 196 send(Messages::RemoteRenderingBackend::CacheNativeImage(handle, renderingResourceIdentifier), m_renderingBackendIdentifier );196 send(Messages::RemoteRenderingBackend::CacheNativeImage(handle, renderingResourceIdentifier), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 197 197 } 198 198 199 199 void RemoteRenderingBackendProxy::cacheFont(Ref<WebCore::Font>&& font) 200 200 { 201 send(Messages::RemoteRenderingBackend::CacheFont(WTFMove(font)), m_renderingBackendIdentifier );201 send(Messages::RemoteRenderingBackend::CacheFont(WTFMove(font)), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 202 202 } 203 203 204 204 void RemoteRenderingBackendProxy::deleteAllFonts() 205 205 { 206 send(Messages::RemoteRenderingBackend::DeleteAllFonts(), m_renderingBackendIdentifier );206 send(Messages::RemoteRenderingBackend::DeleteAllFonts(), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 207 207 } 208 208 … … 212 212 m_currentDestinationImageBufferIdentifier = WTF::nullopt; 213 213 214 send(Messages::RemoteRenderingBackend::ReleaseRemoteResource(renderingResourceIdentifier), m_renderingBackendIdentifier );214 send(Messages::RemoteRenderingBackend::ReleaseRemoteResource(renderingResourceIdentifier), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 215 215 } 216 216 … … 263 263 void RemoteRenderingBackendProxy::sendWakeupMessage(const GPUProcessWakeupMessageArguments& arguments) 264 264 { 265 send(Messages::RemoteRenderingBackend::WakeUpAndApplyDisplayList(arguments), m_renderingBackendIdentifier );265 send(Messages::RemoteRenderingBackend::WakeUpAndApplyDisplayList(arguments), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 266 266 } 267 267 … … 364 364 365 365 auto identifier = DisplayList::ItemBufferIdentifier::generate(); 366 send(Messages::RemoteRenderingBackend::DidCreateSharedDisplayListHandle(identifier, { WTFMove(sharedMemoryHandle), sharedMemory->size() }, destinationBufferIdentifier), m_renderingBackendIdentifier );366 send(Messages::RemoteRenderingBackend::DidCreateSharedDisplayListHandle(identifier, { WTFMove(sharedMemoryHandle), sharedMemory->size() }, destinationBufferIdentifier), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 367 367 368 368 auto newHandle = DisplayListWriterHandle::create(identifier, sharedMemory.releaseNonNull());
Note: See TracChangeset
for help on using the changeset viewer.