Skip to content

Commit

Permalink
[WebGPU] Make RemoteGPU owned by RemoteRenderingBackend rather than G…
Browse files Browse the repository at this point in the history
…PUConnectionToWebProcess

https://bugs.webkit.org/show_bug.cgi?id=255429
<rdar://problem/108171820>

Reviewed by Matt Woodrow.

This patch isn't strictly necessary, but I do think this is a better design.

Previously, every GPU object in the web process got its own identifier, and that identifier got sent to the GPU process.
The GPU process has a GPUConnectionToWebProcess for each web process, and it owned a HashMap<> of the GPU objects for
that web process.

That's okay, but it doesn't fit very well with the design of the GPU process. Every Page in the web process has an
associated RemoteRenderingBackend for that page, which is the owner of all the resources used by that page (the
RemoteRenderingBackend owns a RemoteResourceCache which contains all the resources). It's a generally better design to
match this for WebGPU, and make the GPU object owned by the RemoteRenderingBackend rather than the
GPUConnectionToWebProcess.

There are a few benefits to this design:
1. It more closely matches the ownership model for normal page drawing, which just makes it less complicated to understand
       and reason about
2. At some point, we're going to have to implement interactions with other parts of the web platform (videos, canvas 2d,
       etc.) in WebGPU. All those resources are owned by the RemoteRenderingBackend. We could have each individual entry
       point reach into the RemoteRenderingBackend to pull out what it needs, but it's a more convenient design if
       everything just already lives in the same place.

No tests because there is no behavior change.

* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp:
(WebKit::GPUConnectionToWebProcess::createRemoteGPU): Deleted.
(WebKit::GPUConnectionToWebProcess::releaseRemoteGPU): Deleted.
* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h:
* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.messages.in:
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp:
(WebKit::RemoteRenderingBackend::createRemoteGPU):
(WebKit::RemoteRenderingBackend::releaseRemoteGPU):
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h:
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in:
* Source/WebKit/GPUProcess/graphics/WebGPU/RemoteGPU.cpp:
(WebKit::RemoteGPU::RemoteGPU):
(WebKit::RemoteGPU::initialize):
(WebKit::RemoteGPU::stopListeningForIPC):
* Source/WebKit/GPUProcess/graphics/WebGPU/RemoteGPU.h:
* Source/WebKit/WebProcess/GPU/graphics/WebGPU/RemoteGPUProxy.cpp:
(WebKit::RemoteGPUProxy::create):
(WebKit::RemoteGPUProxy::RemoteGPUProxy):
(WebKit::RemoteGPUProxy::~RemoteGPUProxy):
(WebKit::RemoteGPUProxy::initializeIPC):
(WebKit::RemoteGPUProxy::disconnectGpuProcessIfNeeded): Deleted.
(WebKit::RemoteGPUProxy::gpuProcessConnectionDidClose): Deleted.
(WebKit::RemoteGPUProxy::abandonGPUProcess): Deleted.
* Source/WebKit/WebProcess/GPU/graphics/WebGPU/RemoteGPUProxy.h:
* Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::createGPUForWebGPU const):

Canonical link: https://commits.webkit.org/263054@main
  • Loading branch information
litherum committed Apr 18, 2023
1 parent f7dc489 commit e6f858a
Show file tree
Hide file tree
Showing 11 changed files with 67 additions and 105 deletions.
23 changes: 1 addition & 22 deletions Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2022 Apple Inc. All rights reserved.
* Copyright (C) 2019-2023 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
Expand Down Expand Up @@ -632,27 +632,6 @@ RemoteRenderingBackend* GPUConnectionToWebProcess::remoteRenderingBackend(Render
return it->value.get();
}

void GPUConnectionToWebProcess::createRemoteGPU(WebGPUIdentifier identifier, RenderingBackendIdentifier renderingBackendIdentifier, IPC::StreamServerConnection::Handle&& connectionHandle)
{
auto it = m_remoteRenderingBackendMap.find(renderingBackendIdentifier);
if (it == m_remoteRenderingBackendMap.end())
return;
auto* renderingBackend = it->value.get();

auto addResult = m_remoteGPUMap.ensure(identifier, [&] {
return IPC::ScopedActiveMessageReceiveQueue { RemoteGPU::create(identifier, *this, *renderingBackend, WTFMove(connectionHandle)) };
});
ASSERT_UNUSED(addResult, addResult.isNewEntry);
}

void GPUConnectionToWebProcess::releaseRemoteGPU(WebGPUIdentifier identifier)
{
bool result = m_remoteGPUMap.remove(identifier);
ASSERT_UNUSED(result, result);
if (m_remoteGPUMap.isEmpty())
gpuProcess().tryExitIfUnusedAndUnderMemoryPressure();
}

void GPUConnectionToWebProcess::clearNowPlayingInfo()
{
m_isActiveNowPlayingProcess = false;
Expand Down
9 changes: 1 addition & 8 deletions Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2022 Apple Inc. All rights reserved.
* Copyright (C) 2019-2023 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
Expand Down Expand Up @@ -32,14 +32,12 @@
#include "MessageReceiverMap.h"
#include "RemoteAudioHardwareListenerIdentifier.h"
#include "RemoteAudioSessionIdentifier.h"
#include "RemoteGPU.h"
#include "RemoteImageBuffer.h"
#include "RemoteRemoteCommandListenerIdentifier.h"
#include "RemoteSerializedImageBufferIdentifier.h"
#include "RenderingBackendIdentifier.h"
#include "ScopedActiveMessageReceiveQueue.h"
#include "ThreadSafeObjectHeap.h"
#include "WebGPUIdentifier.h"
#include <WebCore/IntDegrees.h>
#include <WebCore/LibWebRTCEnumTraits.h>
#include <WebCore/NowPlayingManager.h>
Expand Down Expand Up @@ -250,9 +248,6 @@ class GPUConnectionToWebProcess
void releaseGraphicsContextGL(GraphicsContextGLIdentifier);
#endif

void createRemoteGPU(WebGPUIdentifier, RenderingBackendIdentifier, IPC::StreamServerConnection::Handle&&);
void releaseRemoteGPU(WebGPUIdentifier);

void clearNowPlayingInfo();
void setNowPlayingInfo(WebCore::NowPlayingInfo&&);

Expand Down Expand Up @@ -356,8 +351,6 @@ class GPUConnectionToWebProcess
using RemoteGraphicsContextGLMap = HashMap<GraphicsContextGLIdentifier, IPC::ScopedActiveMessageReceiveQueue<RemoteGraphicsContextGL>>;
RemoteGraphicsContextGLMap m_remoteGraphicsContextGLMap;
#endif
using RemoteGPUMap = HashMap<WebGPUIdentifier, IPC::ScopedActiveMessageReceiveQueue<RemoteGPU>>;
RemoteGPUMap m_remoteGPUMap;
ThreadSafeObjectHeap<RemoteSerializedImageBufferIdentifier, RefPtr<RemoteSerializedImageBuffer>> m_remoteSerializedImageBufferObjectHeap;
#if ENABLE(ENCRYPTED_MEDIA)
std::unique_ptr<RemoteCDMFactoryProxy> m_cdmFactoryProxy;
Expand Down
@@ -1,4 +1,4 @@
# Copyright (C) 2019-2021 Apple Inc. All rights reserved.
# Copyright (C) 2019-2023 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
Expand Down Expand Up @@ -30,8 +30,6 @@ messages -> GPUConnectionToWebProcess WantsDispatchMessage {
void CreateGraphicsContextGL(struct WebCore::GraphicsContextGLAttributes attributes, WebKit::GraphicsContextGLIdentifier graphicsContextGLIdentifier, WebKit::RenderingBackendIdentifier renderingBackendIdentifier, IPC::StreamServerConnection::Handle serverConnection) AllowedWhenWaitingForSyncReply
void ReleaseGraphicsContextGL(WebKit::GraphicsContextGLIdentifier graphicsContextGLIdentifier) AllowedWhenWaitingForSyncReply
#endif
void CreateRemoteGPU(WebKit::WebGPUIdentifier identifier, WebKit::RenderingBackendIdentifier renderingBackendIdentifier, IPC::StreamServerConnection::Handle serverConnection) AllowedWhenWaitingForSyncReply
void ReleaseRemoteGPU(WebKit::WebGPUIdentifier identifier) AllowedWhenWaitingForSyncReply
void ClearNowPlayingInfo()
void SetNowPlayingInfo(struct WebCore::NowPlayingInfo nowPlayingInfo)
#if USE(AUDIO_SESSION)
Expand Down
17 changes: 17 additions & 0 deletions Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp
Expand Up @@ -30,6 +30,7 @@

#include "BufferIdentifierSet.h"
#include "GPUConnectionToWebProcess.h"
#include "GPUProcess.h"
#include "Logging.h"
#include "MessageSenderInlines.h"
#include "PlatformImageBufferShareableBackend.h"
Expand Down Expand Up @@ -584,6 +585,22 @@ void RemoteRenderingBackend::lowMemoryHandler(Critical, Synchronous)
#endif
}

void RemoteRenderingBackend::createRemoteGPU(WebGPUIdentifier identifier, IPC::StreamServerConnection::Handle&& connectionHandle)
{
auto addResult = m_remoteGPUMap.ensure(identifier, [&] {
return IPC::ScopedActiveMessageReceiveQueue { RemoteGPU::create(identifier, WTFMove(connectionHandle)) };
});
ASSERT_UNUSED(addResult, addResult.isNewEntry);
}

void RemoteRenderingBackend::releaseRemoteGPU(WebGPUIdentifier identifier)
{
bool result = m_remoteGPUMap.remove(identifier);
ASSERT_UNUSED(result, result);
if (m_remoteGPUMap.isEmpty())
gpuConnectionToWebProcess().gpuProcess().tryExitIfUnusedAndUnderMemoryPressure();
}

} // namespace WebKit

#undef MESSAGE_CHECK
Expand Down
10 changes: 10 additions & 0 deletions Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h
Expand Up @@ -34,17 +34,21 @@
#include "MessageReceiver.h"
#include "MessageSender.h"
#include "QualifiedRenderingResourceIdentifier.h"
#include "RemoteGPU.h"
#include "RemoteRenderingBackendCreationParameters.h"
#include "RemoteResourceCache.h"
#include "RemoteSerializedImageBufferIdentifier.h"
#include "RenderingBackendIdentifier.h"
#include "RenderingUpdateID.h"
#include "ScopedActiveMessageReceiveQueue.h"
#include "ScopedRenderingResourcesRequest.h"
#include "StreamConnectionWorkQueue.h"
#include "StreamMessageReceiver.h"
#include "StreamServerConnection.h"
#include "WebGPUIdentifier.h"
#include <WebCore/MediaPlayerIdentifier.h>
#include <WebCore/ProcessIdentity.h>
#include <wtf/HashMap.h>

namespace WTF {
enum class Critical : bool;
Expand Down Expand Up @@ -148,6 +152,9 @@ class RemoteRenderingBackend : private IPC::MessageSender, public IPC::StreamMes
void prepareLayerBuffersForDisplay(const PrepareBackingStoreBuffersInputData&, PrepareBackingStoreBuffersOutputData&);
#endif

void createRemoteGPU(WebGPUIdentifier, IPC::StreamServerConnection::Handle&&);
void releaseRemoteGPU(WebGPUIdentifier);

Ref<IPC::StreamConnectionWorkQueue> m_workQueue;
Ref<IPC::StreamServerConnection> m_streamConnection;
RemoteResourceCache m_remoteResourceCache;
Expand All @@ -162,6 +169,9 @@ class RemoteRenderingBackend : private IPC::MessageSender, public IPC::StreamMes
Lock m_remoteDisplayListsLock;
bool m_canRegisterRemoteDisplayLists WTF_GUARDED_BY_LOCK(m_remoteDisplayListsLock) { false };
HashMap<QualifiedRenderingResourceIdentifier, Ref<RemoteDisplayListRecorder>> m_remoteDisplayLists WTF_GUARDED_BY_CAPABILITY(m_remoteDisplayListsLock);

using RemoteGPUMap = HashMap<WebGPUIdentifier, IPC::ScopedActiveMessageReceiveQueue<RemoteGPU>>;
RemoteGPUMap m_remoteGPUMap;
};

} // namespace WebKit
Expand Down
Expand Up @@ -48,6 +48,9 @@ messages -> RemoteRenderingBackend NotRefCounted Stream {

MoveToSerializedBuffer(WebCore::RenderingResourceIdentifier sourceImageBuffer, WebKit::RemoteSerializedImageBufferWriteReference destination)
MoveToImageBuffer(WebKit::RemoteSerializedImageBufferWriteReference source, WebCore::RenderingResourceIdentifier destinationImageBuffer)

CreateRemoteGPU(WebKit::WebGPUIdentifier identifier, IPC::StreamServerConnection::Handle serverConnection) AllowedWhenWaitingForSyncReply NotStreamEncodable
ReleaseRemoteGPU(WebKit::WebGPUIdentifier identifier) AllowedWhenWaitingForSyncReply
}

#endif // ENABLE(GPU_PROCESS)
11 changes: 2 additions & 9 deletions Source/WebKit/GPUProcess/graphics/WebGPU/RemoteGPU.cpp
Expand Up @@ -28,13 +28,11 @@

#if ENABLE(GPU_PROCESS)

#include "GPUConnectionToWebProcess.h"
#include "RemoteAdapter.h"
#include "RemoteCompositorIntegration.h"
#include "RemoteGPUMessages.h"
#include "RemoteGPUProxyMessages.h"
#include "RemotePresentationContext.h"
#include "RemoteRenderingBackend.h"
#include "StreamServerConnection.h"
#include "WebGPUObjectHeap.h"
#include <pal/graphics/WebGPU/WebGPU.h>
Expand All @@ -48,30 +46,25 @@

namespace WebKit {

RemoteGPU::RemoteGPU(WebGPUIdentifier identifier, GPUConnectionToWebProcess& gpuConnectionToWebProcess, RemoteRenderingBackend& renderingBackend, IPC::StreamServerConnection::Handle&& connectionHandle)
: m_gpuConnectionToWebProcess(gpuConnectionToWebProcess)
, m_workQueue(IPC::StreamConnectionWorkQueue::create("WebGPU work queue"))
RemoteGPU::RemoteGPU(WebGPUIdentifier identifier, IPC::StreamServerConnection::Handle&& connectionHandle)
: m_workQueue(IPC::StreamConnectionWorkQueue::create("WebGPU work queue"))
, m_streamConnection(IPC::StreamServerConnection::create(WTFMove(connectionHandle), workQueue()))
, m_objectHeap(WebGPU::ObjectHeap::create())
, m_identifier(identifier)
, m_renderingBackend(renderingBackend)
, m_webProcessIdentifier(gpuConnectionToWebProcess.webProcessIdentifier())
{
}

RemoteGPU::~RemoteGPU() = default;

void RemoteGPU::initialize()
{
assertIsMainRunLoop();
workQueue().dispatch([protectedThis = Ref { *this }]() mutable {
protectedThis->workQueueInitialize();
});
}

void RemoteGPU::stopListeningForIPC()
{
assertIsMainRunLoop();
workQueue().dispatch([this]() {
workQueueUninitialize();
});
Expand Down
12 changes: 3 additions & 9 deletions Source/WebKit/GPUProcess/graphics/WebGPU/RemoteGPU.h
Expand Up @@ -51,9 +51,6 @@ class StreamServerConnection;

namespace WebKit {

class GPUConnectionToWebProcess;
class RemoteRenderingBackend;

namespace WebGPU {
class ObjectHeap;
struct RequestAdapterOptions;
Expand All @@ -62,9 +59,9 @@ struct RequestAdapterOptions;
class RemoteGPU final : public IPC::StreamMessageReceiver {
WTF_MAKE_FAST_ALLOCATED;
public:
static Ref<RemoteGPU> create(WebGPUIdentifier identifier, GPUConnectionToWebProcess& gpuConnectionToWebProcess, RemoteRenderingBackend& renderingBackend, IPC::StreamServerConnection::Handle&& serverConnection)
static Ref<RemoteGPU> create(WebGPUIdentifier identifier, IPC::StreamServerConnection::Handle&& serverConnection)
{
auto result = adoptRef(*new RemoteGPU(identifier, gpuConnectionToWebProcess, renderingBackend, WTFMove(serverConnection)));
auto result = adoptRef(*new RemoteGPU(identifier, WTFMove(serverConnection)));
result->initialize();
return result;
}
Expand All @@ -76,7 +73,7 @@ class RemoteGPU final : public IPC::StreamMessageReceiver {
private:
friend class WebGPU::ObjectHeap;

RemoteGPU(WebGPUIdentifier, GPUConnectionToWebProcess&, RemoteRenderingBackend&, IPC::StreamServerConnection::Handle&&);
RemoteGPU(WebGPUIdentifier, IPC::StreamServerConnection::Handle&&);

RemoteGPU(const RemoteGPU&) = delete;
RemoteGPU(RemoteGPU&&) = delete;
Expand All @@ -102,14 +99,11 @@ class RemoteGPU final : public IPC::StreamMessageReceiver {

void createCompositorIntegration(WebGPUIdentifier);

WeakPtr<GPUConnectionToWebProcess> m_gpuConnectionToWebProcess;
Ref<IPC::StreamConnectionWorkQueue> m_workQueue;
RefPtr<IPC::StreamServerConnection> m_streamConnection;
RefPtr<PAL::WebGPU::GPU> m_backing WTF_GUARDED_BY_CAPABILITY(workQueue());
Ref<WebGPU::ObjectHeap> m_objectHeap WTF_GUARDED_BY_CAPABILITY(workQueue());
const WebGPUIdentifier m_identifier;
Ref<RemoteRenderingBackend> m_renderingBackend;
const WebCore::ProcessIdentifier m_webProcessIdentifier;
};

} // namespace WebKit
Expand Down
51 changes: 17 additions & 34 deletions Source/WebKit/WebProcess/GPU/graphics/WebGPU/RemoteGPUProxy.cpp
Expand Up @@ -43,68 +43,51 @@

namespace WebKit {

RefPtr<RemoteGPUProxy> RemoteGPUProxy::create(GPUProcessConnection& gpuProcessConnection, WebGPU::ConvertToBackingContext& convertToBackingContext, WebGPUIdentifier identifier, RenderingBackendIdentifier renderingBackend)
RefPtr<RemoteGPUProxy> RemoteGPUProxy::create(Ref<IPC::StreamClientConnection>&& remoteRenderingBackendStreamClientConnection, RenderingBackendIdentifier renderingBackendIdentifier, WebGPU::ConvertToBackingContext& convertToBackingContext, WebGPUIdentifier identifier, RenderingBackendIdentifier renderingBackend)
{
constexpr size_t connectionBufferSizeLog2 = 21;
auto [clientConnection, serverConnectionHandle] = IPC::StreamClientConnection::create(connectionBufferSizeLog2);
if (!clientConnection)
return nullptr;
auto remoteGPUProxy = adoptRef(new RemoteGPUProxy(gpuProcessConnection, clientConnection.releaseNonNull(), convertToBackingContext, identifier));
auto remoteGPUProxy = adoptRef(new RemoteGPUProxy(WTFMove(remoteRenderingBackendStreamClientConnection), clientConnection.releaseNonNull(), renderingBackendIdentifier, convertToBackingContext, identifier));
remoteGPUProxy->initializeIPC(WTFMove(serverConnectionHandle), renderingBackend);
return remoteGPUProxy;
}


RemoteGPUProxy::RemoteGPUProxy(GPUProcessConnection& gpuProcessConnection, Ref<IPC::StreamClientConnection> clientConnection, WebGPU::ConvertToBackingContext& convertToBackingContext, WebGPUIdentifier identifier)
RemoteGPUProxy::RemoteGPUProxy(Ref<IPC::StreamClientConnection>&& remoteRenderingBackendStreamClientConnection, Ref<IPC::StreamClientConnection>&& streamConnectionForGPU, RenderingBackendIdentifier renderingBackendIdentifier, WebGPU::ConvertToBackingContext& convertToBackingContext, WebGPUIdentifier identifier)
: m_backing(identifier)
, m_convertToBackingContext(convertToBackingContext)
, m_gpuProcessConnection(&gpuProcessConnection)
, m_streamConnection(WTFMove(clientConnection))
, m_remoteRenderingBackendStreamClientConnection(WTFMove(remoteRenderingBackendStreamClientConnection))
, m_streamConnectionForGPU(WTFMove(streamConnectionForGPU))
, m_renderingBackendIdentifier(renderingBackendIdentifier)
{
}

RemoteGPUProxy::~RemoteGPUProxy()
{
disconnectGpuProcessIfNeeded();
m_streamConnectionForGPU->invalidate();
m_remoteRenderingBackendStreamClientConnection->send(Messages::RemoteRenderingBackend::ReleaseRemoteGPU(m_backing), m_renderingBackendIdentifier, Seconds::infinity());
}

void RemoteGPUProxy::didClose(IPC::Connection&)
{
m_lost = true;
}

void RemoteGPUProxy::initializeIPC(IPC::StreamServerConnection::Handle&& serverConnectionHandle, RenderingBackendIdentifier renderingBackend)
{
m_gpuProcessConnection->addClient(*this);
m_gpuProcessConnection->connection().send(Messages::GPUConnectionToWebProcess::CreateRemoteGPU(m_backing, renderingBackend, WTFMove(serverConnectionHandle)), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
m_streamConnection->open(*this);
m_remoteRenderingBackendStreamClientConnection->send(Messages::RemoteRenderingBackend::CreateRemoteGPU(m_backing, WTFMove(serverConnectionHandle)), m_renderingBackendIdentifier, Seconds::infinity());
m_streamConnectionForGPU->open(*this);
// TODO: We must wait until initialized, because at the moment we cannot receive IPC messages
// during wait while in synchronous stream send. Should be fixed as part of https://bugs.webkit.org/show_bug.cgi?id=217211.
waitUntilInitialized();
}

void RemoteGPUProxy::disconnectGpuProcessIfNeeded()
{
if (m_gpuProcessConnection) {
m_streamConnection->invalidate();
m_gpuProcessConnection->connection().send(Messages::GPUConnectionToWebProcess::ReleaseRemoteGPU(m_backing), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
m_gpuProcessConnection = nullptr;
}
}

void RemoteGPUProxy::gpuProcessConnectionDidClose(GPUProcessConnection& connection)
{
ASSERT(m_gpuProcessConnection);
ASSERT(&connection == m_gpuProcessConnection);
abandonGPUProcess();
}

void RemoteGPUProxy::abandonGPUProcess()
{
m_streamConnection->invalidate();
m_gpuProcessConnection = nullptr;
m_lost = true;
}

void RemoteGPUProxy::wasCreated(bool didSucceed, IPC::Semaphore&& wakeUpSemaphore, IPC::Semaphore&& clientWaitSemaphore)
{
ASSERT(!m_didInitialize);
m_streamConnection->setSemaphores(WTFMove(wakeUpSemaphore), WTFMove(clientWaitSemaphore));
m_streamConnectionForGPU->setSemaphores(WTFMove(wakeUpSemaphore), WTFMove(clientWaitSemaphore));
m_didInitialize = true;
m_lost = !didSucceed;
}
Expand All @@ -113,7 +96,7 @@ void RemoteGPUProxy::waitUntilInitialized()
{
if (m_didInitialize)
return;
if (m_streamConnection->waitForAndDispatchImmediately<Messages::RemoteGPUProxy::WasCreated>(m_backing, defaultSendTimeout))
if (m_streamConnectionForGPU->waitForAndDispatchImmediately<Messages::RemoteGPUProxy::WasCreated>(m_backing, defaultSendTimeout))
return;
m_lost = true;
}
Expand Down

0 comments on commit e6f858a

Please sign in to comment.