RemoteImageBufferMessageHandler.cpp [plain text]
#include "config.h"
#include "RemoteImageBufferMessageHandler.h"
#if ENABLE(GPU_PROCESS)
#include "ImageDataReference.h"
#include "RemoteRenderingBackend.h"
#include "RemoteRenderingBackendProxyMessages.h"
#include <WebCore/DisplayListItems.h>
namespace WebKit {
using namespace WebCore;
RemoteImageBufferMessageHandler::RemoteImageBufferMessageHandler(const FloatSize& size, RenderingMode renderingMode, float resolutionScale, ColorSpace colorSpace, RemoteRenderingBackend& remoteRenderingBackend)
: m_remoteRenderingBackend(makeWeakPtr(remoteRenderingBackend))
{
m_remoteRenderingBackend->send(Messages::RemoteRenderingBackendProxy::CreateImageBuffer(size, renderingMode, resolutionScale, colorSpace, m_imageBufferIdentifier), m_remoteRenderingBackend->renderingBackendIdentifier());
}
RemoteImageBufferMessageHandler::~RemoteImageBufferMessageHandler()
{
if (!m_remoteRenderingBackend)
return;
m_remoteRenderingBackend->send(Messages::RemoteRenderingBackendProxy::ReleaseImageBuffer(m_imageBufferIdentifier), m_remoteRenderingBackend->renderingBackendIdentifier());
}
RefPtr<ImageData> RemoteImageBufferMessageHandler::getImageData(AlphaPremultiplication outputFormat, const IntRect& srcRect) const
{
IPC::ImageDataReference imageDataReference;
m_remoteRenderingBackend->sendSync(Messages::RemoteRenderingBackendProxy::GetImageData(outputFormat, srcRect, m_imageBufferIdentifier), Messages::RemoteRenderingBackendProxy::GetImageData::Reply(imageDataReference), m_remoteRenderingBackend->renderingBackendIdentifier(), 1_s);
return imageDataReference.buffer();
}
void RemoteImageBufferMessageHandler::waitForCreateImageBufferBackend()
{
if (m_remoteRenderingBackend && !isBackendCreated())
m_remoteRenderingBackend->waitForCreateImageBufferBackend();
}
void RemoteImageBufferMessageHandler::waitForCommitImageBufferFlushContext()
{
if (m_remoteRenderingBackend && isPendingFlush())
m_remoteRenderingBackend->waitForCommitImageBufferFlushContext();
}
void RemoteImageBufferMessageHandler::flushDrawingContext(WebCore::DisplayList::DisplayList& displayList)
{
if (!m_remoteRenderingBackend)
return;
m_remoteRenderingBackend->send(Messages::RemoteRenderingBackendProxy::FlushImageBufferDrawingContext(displayList, m_imageBufferIdentifier), m_remoteRenderingBackend->renderingBackendIdentifier());
displayList.clear();
}
void RemoteImageBufferMessageHandler::flushDrawingContextAndWaitCommit(WebCore::DisplayList::DisplayList& displayList)
{
if (!m_remoteRenderingBackend)
return;
m_sentFlushIdentifier = ImageBufferFlushIdentifier::generate();
m_remoteRenderingBackend->send(Messages::RemoteRenderingBackendProxy::FlushImageBufferDrawingContextAndCommit(displayList, m_sentFlushIdentifier, m_imageBufferIdentifier), m_remoteRenderingBackend->renderingBackendIdentifier());
displayList.clear();
waitForCommitImageBufferFlushContext();
}
void RemoteImageBufferMessageHandler::commitFlushContext(ImageBufferFlushIdentifier flushIdentifier)
{
m_receivedFlushIdentifier = flushIdentifier;
}
}
#endif // ENABLE(GPU_PROCESS)