RemoteRenderingBackendProxy.h [plain text]
#pragma once
#if ENABLE(GPU_PROCESS)
#include "GPUProcessConnection.h"
#include "GPUProcessWakeupMessageArguments.h"
#include "ImageBufferBackendHandle.h"
#include "MessageReceiver.h"
#include "MessageSender.h"
#include "RemoteResourceCacheProxy.h"
#include "RenderingBackendIdentifier.h"
#include <WebCore/DisplayList.h>
#include <WebCore/RenderingResourceIdentifier.h>
#include <wtf/Deque.h>
#include <wtf/WeakPtr.h>
#if PLATFORM(COCOA)
#include <wtf/cocoa/MachSemaphore.h>
#endif
namespace WebCore {
namespace DisplayList {
class DisplayList;
class Item;
}
class FloatSize;
class ImageData;
enum class AlphaPremultiplication : uint8_t;
enum class ColorSpace : uint8_t;
enum class RenderingMode : bool;
}
namespace WebKit {
class DisplayListWriterHandle;
class RemoteRenderingBackendProxy
: public IPC::MessageSender
, private IPC::MessageReceiver
, public GPUProcessConnection::Client {
public:
static std::unique_ptr<RemoteRenderingBackendProxy> create();
~RemoteRenderingBackendProxy();
RemoteResourceCacheProxy& remoteResourceCacheProxy() { return m_remoteResourceCacheProxy; }
WebCore::DisplayList::ItemBufferHandle createItemBuffer(size_t capacity, WebCore::RenderingResourceIdentifier destinationBufferIdentifier);
void didAppendData(const WebCore::DisplayList::ItemBufferHandle&, size_t numberOfBytes, WebCore::DisplayList::DidChangeItemBuffer, WebCore::RenderingResourceIdentifier destinationImageBuffer);
void willAppendItem(WebCore::RenderingResourceIdentifier);
void sendDeferredWakeupMessageIfNeeded();
IPC::Connection* messageSenderConnection() const override;
uint64_t messageSenderDestinationID() const override;
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
RefPtr<WebCore::ImageBuffer> createImageBuffer(const WebCore::FloatSize&, WebCore::RenderingMode, float resolutionScale, WebCore::ColorSpace, WebCore::PixelFormat);
RefPtr<WebCore::ImageData> getImageData(WebCore::AlphaPremultiplication outputFormat, const WebCore::IntRect& srcRect, WebCore::RenderingResourceIdentifier);
String getDataURLForImageBuffer(const String& mimeType, Optional<double> quality, WebCore::PreserveResolution, WebCore::RenderingResourceIdentifier);
Vector<uint8_t> getDataForImageBuffer(const String& mimeType, Optional<double> quality, WebCore::RenderingResourceIdentifier);
Vector<uint8_t> getBGRADataForImageBuffer(WebCore::RenderingResourceIdentifier);
WebCore::DisplayList::FlushIdentifier flushDisplayListAndCommit(const WebCore::DisplayList::DisplayList&, WebCore::RenderingResourceIdentifier);
void cacheNativeImage(const ShareableBitmap::Handle&, WebCore::RenderingResourceIdentifier);
void cacheFont(Ref<WebCore::Font>&&);
void deleteAllFonts();
void releaseRemoteResource(WebCore::RenderingResourceIdentifier);
enum class DidReceiveBackendCreationResult : bool {
ReceivedAnyResponse,
TimeoutOrIPCFailure
};
DidReceiveBackendCreationResult waitForDidCreateImageBufferBackend();
bool waitForDidFlush();
private:
RemoteRenderingBackendProxy();
void gpuProcessConnectionDidClose(GPUProcessConnection&) final;
void connectToGPUProcess();
void reestablishGPUProcessConnection();
void didCreateImageBufferBackend(ImageBufferBackendHandle, WebCore::RenderingResourceIdentifier);
void didFlush(WebCore::DisplayList::FlushIdentifier, WebCore::RenderingResourceIdentifier);
RefPtr<DisplayListWriterHandle> mostRecentlyUsedDisplayListHandle();
RefPtr<DisplayListWriterHandle> findReusableDisplayListHandle(size_t capacity);
void sendWakeupMessage(const GPUProcessWakeupMessageArguments&);
RemoteResourceCacheProxy m_remoteResourceCacheProxy { *this };
HashMap<WebCore::DisplayList::ItemBufferIdentifier, RefPtr<DisplayListWriterHandle>> m_sharedDisplayListHandles;
Deque<WebCore::DisplayList::ItemBufferIdentifier> m_identifiersOfReusableHandles;
RenderingBackendIdentifier m_renderingBackendIdentifier { RenderingBackendIdentifier::generate() };
Optional<WebCore::RenderingResourceIdentifier> m_currentDestinationImageBufferIdentifier;
Optional<GPUProcessWakeupMessageArguments> m_deferredWakeupMessageArguments;
unsigned m_remainingItemsToAppendBeforeSendingWakeup { 0 };
#if PLATFORM(COCOA)
MachSemaphore m_resumeDisplayListSemaphore;
#endif
};
}
#endif // ENABLE(GPU_PROCESS)