⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 275922 in webkit


Ignore:
Timestamp:
Apr 13, 2021, 6:00:24 PM (5 years ago)
Author:
Chris Dumez
Message:

RemoteRenderingBackendProxy should only relaunch the GPUProcess if it actually needs it
https://bugs.webkit.org/show_bug.cgi?id=224516

Reviewed by Geoff Garen.

Previously, RemoteRenderingBackendProxy would launch the GPUProcess as soon as it was
constructed. This went against the goals of r275887 to delay the GPUProcess launch
until it is actually needed. Also, in case a a GPUProcess crash/termination,
RemoteRenderingBackendProxy would relaunch the GPUProcess right away, even if it
did not need it (No live ImageBuffers). This patch addresses both issues.

This patch is a pre-requirement for terminating the GPUProcess on memory pressure when
it is not used by any tabs.

  • WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:

(WebKit::RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy):
(WebKit::RemoteRenderingBackendProxy::ensureGPUProcessConnection):
(WebKit::RemoteRenderingBackendProxy::gpuProcessConnectionDidClose):
(WebKit::RemoteRenderingBackendProxy::messageSenderConnection const):
(WebKit::RemoteRenderingBackendProxy::waitForDidCreateImageBufferBackend):
(WebKit::RemoteRenderingBackendProxy::waitForDidFlush):

  • WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
Location:
trunk/Source/WebKit
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r275921 r275922  
     12021-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
    1262021-04-13  Chris Dumez  <cdumez@apple.com>
    227
  • trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp

    r275921 r275922  
    5656    }
    5757{
    58     connectToGPUProcess();
    5958}
    6059
    6160RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy()
    6261{
     62    if (!m_gpuProcessConnection)
     63        return;
     64
    6365    // Un-register itself as a MessageReceiver.
    64     IPC::MessageReceiverMap& messageReceiverMap = WebProcess::singleton().ensureGPUProcessConnection().messageReceiverMap();
    65     messageReceiverMap.removeMessageReceiver(*this);
     66    m_gpuProcessConnection->messageReceiverMap().removeMessageReceiver(*this);
    6667
    6768    // Release the RemoteRenderingBackend.
     
    6970}
    7071
    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();
     72GPUProcessConnection& 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
     84void 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;
    8294
    8395    for (auto& imageBuffer : m_remoteResourceCacheProxy.imageBuffers().values()) {
     
    89101}
    90102
    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 
    104103IPC::Connection* RemoteRenderingBackendProxy::messageSenderConnection() const
    105104{
    106     return &WebProcess::singleton().ensureGPUProcessConnection().connection();
     105    return &const_cast<RemoteRenderingBackendProxy&>(*this).ensureGPUProcessConnection().connection();
    107106}
    108107
     
    114113RemoteRenderingBackendProxy::DidReceiveBackendCreationResult RemoteRenderingBackendProxy::waitForDidCreateImageBufferBackend()
    115114{
    116     Ref<IPC::Connection> connection = WebProcess::singleton().ensureGPUProcessConnection().connection();
     115    auto connection = makeRefPtr(messageSenderConnection());
    117116    if (!connection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy::DidCreateImageBufferBackend>(renderingBackendIdentifier(), 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives))
    118117        return DidReceiveBackendCreationResult::TimeoutOrIPCFailure;
     
    122121bool RemoteRenderingBackendProxy::waitForDidFlush()
    123122{
    124     Ref<IPC::Connection> connection = WebProcess::singleton().ensureGPUProcessConnection().connection();
     123    auto connection = makeRefPtr(messageSenderConnection());
    125124    return connection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy::DidFlush>(renderingBackendIdentifier(), 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);
    126125}
  • trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h

    r275768 r275922  
    117117    void gpuProcessConnectionDidClose(GPUProcessConnection&) final;
    118118
    119     void connectToGPUProcess();
    120     void reestablishGPUProcessConnection();
     119    GPUProcessConnection& ensureGPUProcessConnection();
    121120
    122121    // Messages to be received.
     
    140139    uint64_t m_getImageDataSharedMemoryLength { 0 };
    141140    WebCore::Timer m_destroyGetImageDataSharedMemoryTimer { *this, &RemoteRenderingBackendProxy::destroyGetImageDataSharedMemory };
     141    WeakPtr<GPUProcessConnection> m_gpuProcessConnection;
    142142};
    143143
Note: See TracChangeset for help on using the changeset viewer.