RemoteRenderingBackend.cpp [plain text]
#include "config.h"
#include "RemoteRenderingBackend.h"
#if ENABLE(GPU_PROCESS)
#include "GPUConnectionToWebProcess.h"
#include "GPUProcessConnection.h"
#include "PlatformRemoteImageBuffer.h"
#include "RemoteRenderingBackendMessages.h"
#include "RemoteRenderingBackendProxyMessages.h"
#include "WebProcess.h"
namespace WebKit {
using namespace WebCore;
std::unique_ptr<RemoteRenderingBackend> RemoteRenderingBackend::create()
{
return std::unique_ptr<RemoteRenderingBackend>(new RemoteRenderingBackend());
}
RemoteRenderingBackend::RemoteRenderingBackend()
{
IPC::MessageReceiverMap& messageReceiverMap = WebProcess::singleton().ensureGPUProcessConnection().messageReceiverMap();
messageReceiverMap.addMessageReceiver(Messages::RemoteRenderingBackend::messageReceiverName(), m_renderingBackendIdentifier.toUInt64(), *this);
send(Messages::GPUConnectionToWebProcess::CreateRenderingBackend(m_renderingBackendIdentifier), 0);
}
RemoteRenderingBackend::~RemoteRenderingBackend()
{
IPC::MessageReceiverMap& messageReceiverMap = WebProcess::singleton().ensureGPUProcessConnection().messageReceiverMap();
messageReceiverMap.removeMessageReceiver(*this);
send(Messages::GPUConnectionToWebProcess::ReleaseRenderingBackend(m_renderingBackendIdentifier), 0);
}
IPC::Connection* RemoteRenderingBackend::messageSenderConnection() const
{
return &WebProcess::singleton().ensureGPUProcessConnection().connection();
}
uint64_t RemoteRenderingBackend::messageSenderDestinationID() const
{
return m_renderingBackendIdentifier.toUInt64();
}
bool RemoteRenderingBackend::waitForCreateImageBufferBackend()
{
Ref<IPC::Connection> connection = WebProcess::singleton().ensureGPUProcessConnection().connection();
return connection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackend::CreateImageBufferBackend>(m_renderingBackendIdentifier, 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);
}
bool RemoteRenderingBackend::waitForCommitImageBufferFlushContext()
{
Ref<IPC::Connection> connection = WebProcess::singleton().ensureGPUProcessConnection().connection();
return connection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackend::CommitImageBufferFlushContext>(m_renderingBackendIdentifier, 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);
}
std::unique_ptr<ImageBuffer> RemoteRenderingBackend::createImageBuffer(const FloatSize& size, ShouldAccelerate shouldAccelerate, float resolutionScale, ColorSpace colorSpace)
{
if (shouldAccelerate == ShouldAccelerate::Yes) {
if (auto imageBuffer = AcceleratedRemoteImageBuffer::create(size, RenderingMode::RemoteAccelerated, resolutionScale, colorSpace, *this)) {
m_imageBufferMessageHandlerMap.add(imageBuffer->imageBufferIdentifier(), imageBuffer.get());
return imageBuffer;
}
}
if (auto imageBuffer = UnacceleratedRemoteImageBuffer::create(size, RenderingMode::RemoteUnaccelerated, resolutionScale, colorSpace, *this)) {
m_imageBufferMessageHandlerMap.add(imageBuffer->imageBufferIdentifier(), imageBuffer.get());
return imageBuffer;
}
return nullptr;
}
void RemoteRenderingBackend::releaseImageBuffer(ImageBufferIdentifier imageBufferIdentifier)
{
bool found = m_imageBufferMessageHandlerMap.remove(imageBufferIdentifier);
ASSERT_UNUSED(found, found);
}
void RemoteRenderingBackend::createImageBufferBackend(const FloatSize& logicalSize, const IntSize& backendSize, float resolutionScale, ColorSpace colorSpace, ImageBufferBackendHandle handle, ImageBufferIdentifier imageBufferIdentifier)
{
if (auto imageBuffer = m_imageBufferMessageHandlerMap.get(imageBufferIdentifier))
imageBuffer->createBackend(logicalSize, backendSize, resolutionScale, colorSpace, WTFMove(handle));
}
void RemoteRenderingBackend::commitImageBufferFlushContext(ImageBufferFlushIdentifier flushIdentifier, ImageBufferIdentifier imageBufferIdentifier)
{
if (auto imageBuffer = m_imageBufferMessageHandlerMap.get(imageBufferIdentifier))
imageBuffer->commitFlushContext(flushIdentifier);
}
}
#endif // ENABLE(GPU_PROCESS)