Changeset 275922 in webkit
- Timestamp:
- Apr 13, 2021, 6:00:24 PM (5 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp (modified) (5 diffs)
-
WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r275921 r275922 1 2021-04-13 Chris Dumez <cdumez@apple.com> 2 3 RemoteRenderingBackendProxy should only relaunch the GPUProcess if it actually needs it 4 https://bugs.webkit.org/show_bug.cgi?id=224516 5 6 Reviewed by Geoff Garen. 7 8 Previously, RemoteRenderingBackendProxy would launch the GPUProcess as soon as it was 9 constructed. This went against the goals of r275887 to delay the GPUProcess launch 10 until it is actually needed. Also, in case a a GPUProcess crash/termination, 11 RemoteRenderingBackendProxy would relaunch the GPUProcess right away, even if it 12 did not need it (No live ImageBuffers). This patch addresses both issues. 13 14 This patch is a pre-requirement for terminating the GPUProcess on memory pressure when 15 it is not used by any tabs. 16 17 * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp: 18 (WebKit::RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy): 19 (WebKit::RemoteRenderingBackendProxy::ensureGPUProcessConnection): 20 (WebKit::RemoteRenderingBackendProxy::gpuProcessConnectionDidClose): 21 (WebKit::RemoteRenderingBackendProxy::messageSenderConnection const): 22 (WebKit::RemoteRenderingBackendProxy::waitForDidCreateImageBufferBackend): 23 (WebKit::RemoteRenderingBackendProxy::waitForDidFlush): 24 * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h: 25 1 26 2021-04-13 Chris Dumez <cdumez@apple.com> 2 27 -
trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp
r275921 r275922 56 56 } 57 57 { 58 connectToGPUProcess();59 58 } 60 59 61 60 RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy() 62 61 { 62 if (!m_gpuProcessConnection) 63 return; 64 63 65 // Un-register itself as a MessageReceiver. 64 IPC::MessageReceiverMap& messageReceiverMap = WebProcess::singleton().ensureGPUProcessConnection().messageReceiverMap(); 65 messageReceiverMap.removeMessageReceiver(*this); 66 m_gpuProcessConnection->messageReceiverMap().removeMessageReceiver(*this); 66 67 67 68 // Release the RemoteRenderingBackend. … … 69 70 } 70 71 71 void RemoteRenderingBackendProxy::connectToGPUProcess() 72 { 73 auto& connection = WebProcess::singleton().ensureGPUProcessConnection(); 74 connection.addClient(*this); 75 connection.messageReceiverMap().addMessageReceiver(Messages::RemoteRenderingBackendProxy::messageReceiverName(), renderingBackendIdentifier().toUInt64(), *this); 76 send(Messages::GPUConnectionToWebProcess::CreateRenderingBackend(m_parameters), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 77 } 78 79 void RemoteRenderingBackendProxy::reestablishGPUProcessConnection() 80 { 81 connectToGPUProcess(); 72 GPUProcessConnection& RemoteRenderingBackendProxy::ensureGPUProcessConnection() 73 { 74 if (!m_gpuProcessConnection) { 75 auto& gpuProcessConnection = WebProcess::singleton().ensureGPUProcessConnection(); 76 gpuProcessConnection.addClient(*this); 77 gpuProcessConnection.messageReceiverMap().addMessageReceiver(Messages::RemoteRenderingBackendProxy::messageReceiverName(), renderingBackendIdentifier().toUInt64(), *this); 78 gpuProcessConnection.connection().send(Messages::GPUConnectionToWebProcess::CreateRenderingBackend(m_parameters), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 79 m_gpuProcessConnection = makeWeakPtr(gpuProcessConnection); 80 } 81 return *m_gpuProcessConnection; 82 } 83 84 void RemoteRenderingBackendProxy::gpuProcessConnectionDidClose(GPUProcessConnection& previousConnection) 85 { 86 previousConnection.removeClient(*this); 87 m_gpuProcessConnection = nullptr; 88 89 m_identifiersOfReusableHandles.clear(); 90 m_sharedDisplayListHandles.clear(); 91 m_currentDestinationImageBufferIdentifier = WTF::nullopt; 92 m_deferredWakeupMessageArguments = WTF::nullopt; 93 m_remainingItemsToAppendBeforeSendingWakeup = 0; 82 94 83 95 for (auto& imageBuffer : m_remoteResourceCacheProxy.imageBuffers().values()) { … … 89 101 } 90 102 91 void RemoteRenderingBackendProxy::gpuProcessConnectionDidClose(GPUProcessConnection& previousConnection)92 {93 previousConnection.removeClient(*this);94 95 m_identifiersOfReusableHandles.clear();96 m_sharedDisplayListHandles.clear();97 m_currentDestinationImageBufferIdentifier = WTF::nullopt;98 m_deferredWakeupMessageArguments = WTF::nullopt;99 m_remainingItemsToAppendBeforeSendingWakeup = 0;100 101 reestablishGPUProcessConnection();102 }103 104 103 IPC::Connection* RemoteRenderingBackendProxy::messageSenderConnection() const 105 104 { 106 return & WebProcess::singleton().ensureGPUProcessConnection().connection();105 return &const_cast<RemoteRenderingBackendProxy&>(*this).ensureGPUProcessConnection().connection(); 107 106 } 108 107 … … 114 113 RemoteRenderingBackendProxy::DidReceiveBackendCreationResult RemoteRenderingBackendProxy::waitForDidCreateImageBufferBackend() 115 114 { 116 Ref<IPC::Connection> connection = WebProcess::singleton().ensureGPUProcessConnection().connection();115 auto connection = makeRefPtr(messageSenderConnection()); 117 116 if (!connection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy::DidCreateImageBufferBackend>(renderingBackendIdentifier(), 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives)) 118 117 return DidReceiveBackendCreationResult::TimeoutOrIPCFailure; … … 122 121 bool RemoteRenderingBackendProxy::waitForDidFlush() 123 122 { 124 Ref<IPC::Connection> connection = WebProcess::singleton().ensureGPUProcessConnection().connection();123 auto connection = makeRefPtr(messageSenderConnection()); 125 124 return connection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy::DidFlush>(renderingBackendIdentifier(), 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives); 126 125 } -
trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h
r275768 r275922 117 117 void gpuProcessConnectionDidClose(GPUProcessConnection&) final; 118 118 119 void connectToGPUProcess(); 120 void reestablishGPUProcessConnection(); 119 GPUProcessConnection& ensureGPUProcessConnection(); 121 120 122 121 // Messages to be received. … … 140 139 uint64_t m_getImageDataSharedMemoryLength { 0 }; 141 140 WebCore::Timer m_destroyGetImageDataSharedMemoryTimer { *this, &RemoteRenderingBackendProxy::destroyGetImageDataSharedMemory }; 141 WeakPtr<GPUProcessConnection> m_gpuProcessConnection; 142 142 }; 143 143
Note:
See TracChangeset
for help on using the changeset viewer.