RemoteImageBuffer.h [plain text]
#pragma once
#if ENABLE(GPU_PROCESS)
#include "Decoder.h"
#include "GPUConnectionToWebProcess.h"
#include <WebCore/ConcreteImageBuffer.h>
#include <WebCore/DisplayList.h>
#include <WebCore/DisplayListItems.h>
#include <WebCore/DisplayListReplayer.h>
namespace WebKit {
template<typename BackendType>
class RemoteImageBuffer : public WebCore::ConcreteImageBuffer<BackendType>, public WebCore::DisplayList::Replayer::Delegate {
using BaseConcreteImageBuffer = WebCore::ConcreteImageBuffer<BackendType>;
using BaseConcreteImageBuffer::context;
using BaseConcreteImageBuffer::m_backend;
using BaseConcreteImageBuffer::putImageData;
public:
static auto create(const WebCore::FloatSize& size, float resolutionScale, WebCore::ColorSpace colorSpace, WebCore::PixelFormat pixelFormat, RemoteRenderingBackend& remoteRenderingBackend, WebCore::RenderingResourceIdentifier renderingResourceIdentifier)
{
return BaseConcreteImageBuffer::template create<RemoteImageBuffer>(size, resolutionScale, colorSpace, pixelFormat, nullptr, remoteRenderingBackend, renderingResourceIdentifier);
}
RemoteImageBuffer(const WebCore::ImageBufferBackend::Parameters& parameters, std::unique_ptr<BackendType>&& backend, RemoteRenderingBackend& remoteRenderingBackend, WebCore::RenderingResourceIdentifier renderingResourceIdentifier)
: BaseConcreteImageBuffer(parameters, WTFMove(backend), renderingResourceIdentifier)
, m_remoteRenderingBackend(remoteRenderingBackend)
, m_renderingResourceIdentifier(renderingResourceIdentifier)
{
m_remoteRenderingBackend.didCreateImageBufferBackend(m_backend->createImageBufferBackendHandle(), renderingResourceIdentifier);
}
~RemoteImageBuffer()
{
while (context().stackSize())
context().restore();
}
private:
bool apply(WebCore::DisplayList::ItemHandle item, WebCore::GraphicsContext& context) override
{
if (item.is<WebCore::DisplayList::PutImageData>()) {
auto& putImageDataItem = item.get<WebCore::DisplayList::PutImageData>();
putImageData(putImageDataItem.inputFormat(), putImageDataItem.imageData(), putImageDataItem.srcRect(), putImageDataItem.destPoint(), putImageDataItem.destFormat());
return true;
}
if (item.is<WebCore::DisplayList::FlushContext>()) {
BaseConcreteImageBuffer::flushContext();
auto identifier = item.get<WebCore::DisplayList::FlushContext>().identifier();
m_remoteRenderingBackend.didFlush(identifier, m_renderingResourceIdentifier);
return true;
}
if (item.is<WebCore::DisplayList::MetaCommandChangeItemBuffer>()) {
auto nextBufferIdentifier = item.get<WebCore::DisplayList::MetaCommandChangeItemBuffer>().identifier();
m_remoteRenderingBackend.setNextItemBufferToRead(nextBufferIdentifier, m_renderingResourceIdentifier);
return true;
}
return m_remoteRenderingBackend.applyMediaItem(item, context);
}
RemoteRenderingBackend& m_remoteRenderingBackend;
WebCore::RenderingResourceIdentifier m_renderingResourceIdentifier;
};
}
#endif // ENABLE(GPU_PROCESS)