RemoteImageBuffer.h [plain text]
#pragma once
#if ENABLE(GPU_PROCESS)
#include "RemoteImageBufferMessageHandler.h"
#include <WebCore/DisplayListImageBuffer.h>
#include <WebCore/DisplayListItems.h>
#include <WebCore/DisplayListRecorder.h>
namespace WebKit {
class RemoteRenderingBackend;
template<typename BackendType>
class RemoteImageBuffer : public WebCore::DisplayList::ImageBuffer<BackendType>, public RemoteImageBufferMessageHandler {
using BaseDisplayListImageBuffer = WebCore::DisplayList::ImageBuffer<BackendType>;
using BaseDisplayListImageBuffer::m_backend;
using BaseDisplayListImageBuffer::m_drawingContext;
public:
static std::unique_ptr<RemoteImageBuffer> create(const WebCore::FloatSize& size, WebCore::RenderingMode renderingMode, float resolutionScale, WebCore::ColorSpace colorSpace, RemoteRenderingBackend& remoteRenderingBackend)
{
if (BackendType::calculateBackendSize(size, resolutionScale).isEmpty())
return nullptr;
return std::unique_ptr<RemoteImageBuffer>(new RemoteImageBuffer(size, renderingMode, resolutionScale, colorSpace, remoteRenderingBackend));
}
protected:
RemoteImageBuffer(const WebCore::FloatSize& size, WebCore::RenderingMode renderingMode, float resolutionScale, WebCore::ColorSpace colorSpace, RemoteRenderingBackend& remoteRenderingBackend)
: BaseDisplayListImageBuffer(size)
, RemoteImageBufferMessageHandler(size, renderingMode, resolutionScale, colorSpace, remoteRenderingBackend)
{
}
void createBackend(const WebCore::FloatSize& logicalSize, const WebCore::IntSize& backendSize, float resolutionScale, WebCore::ColorSpace colorSpace, ImageBufferBackendHandle handle) override
{
ASSERT(!m_backend);
m_backend = BackendType::create(logicalSize, backendSize, resolutionScale, colorSpace, WTFMove(handle));
}
bool isBackendCreated() const override { return m_backend.get(); }
BackendType* ensureBackendCreated() const override
{
if (!m_backend)
const_cast<RemoteImageBuffer&>(*this).RemoteImageBufferMessageHandler::waitForCreateImageBufferBackend();
return m_backend.get();
}
RefPtr<WebCore::ImageData> getImageData(WebCore::AlphaPremultiplication outputFormat, const WebCore::IntRect& srcRect) const override
{
auto& displayList = const_cast<RemoteImageBuffer*>(this)->m_drawingContext.displayList();
const_cast<RemoteImageBuffer*>(this)->RemoteImageBufferMessageHandler::flushDrawingContext(displayList);
auto result = const_cast<RemoteImageBuffer*>(this)->RemoteImageBufferMessageHandler::getImageData(outputFormat, srcRect);
return result;
}
void putImageData(WebCore::AlphaPremultiplication inputFormat, const WebCore::ImageData& imageData, const WebCore::IntRect& srcRect, const WebCore::IntPoint& destPoint = { }, WebCore::AlphaPremultiplication destFormat = WebCore::AlphaPremultiplication::Premultiplied) override
{
ASSERT(m_backend->resolutionScale() == 1);
m_drawingContext.recorder().putImageData(inputFormat, imageData, srcRect, destPoint, destFormat);
}
void flushContext() override
{
flushDrawingContext();
m_backend->flushContext();
}
void flushDrawingContext() override
{
auto& displayList = m_drawingContext.displayList();
if (displayList.itemCount())
RemoteImageBufferMessageHandler::flushDrawingContextAndWaitCommit(displayList);
}
void willAppendItem(const WebCore::DisplayList::Item&) override
{
constexpr size_t DisplayListBatchSize = 512;
auto& displayList = m_drawingContext.displayList();
if (displayList.itemCount() >= DisplayListBatchSize)
RemoteImageBufferMessageHandler::flushDrawingContext(displayList);
}
};
}
#endif // ENABLE(GPU_PROCESS)