ThreadedCoordinatedLayerTreeHost.h [plain text]
#pragma once
#if USE(COORDINATED_GRAPHICS_THREADED)
#include "AcceleratedSurface.h"
#include "CoordinatedLayerTreeHost.h"
#include "SimpleViewportController.h"
#include "ThreadedCompositor.h"
#include <wtf/OptionSet.h>
namespace WebCore {
class GraphicsContext;
class GraphicsLayer;
struct CoordinatedGraphicsState;
}
namespace WebKit {
class WebPage;
class ThreadedCoordinatedLayerTreeHost final : public CoordinatedLayerTreeHost, public AcceleratedSurface::Client {
public:
static Ref<ThreadedCoordinatedLayerTreeHost> create(WebPage&);
virtual ~ThreadedCoordinatedLayerTreeHost();
private:
explicit ThreadedCoordinatedLayerTreeHost(WebPage&);
void scrollNonCompositedContents(const WebCore::IntRect& scrollRect) override;
void sizeDidChange(const WebCore::IntSize&) override;
void deviceOrPageScaleFactorChanged() override;
void pageBackgroundTransparencyChanged() override;
void contentsSizeChanged(const WebCore::IntSize&) override;
void didChangeViewportAttributes(WebCore::ViewportAttributes&&) override;
void invalidate() override;
void forceRepaint() override;
void setIsDiscardable(bool) override;
#if PLATFORM(GTK) && PLATFORM(X11) && !USE(REDIRECTED_XCOMPOSITE_WINDOW)
void setNativeSurfaceHandleForCompositing(uint64_t) override;
#endif
class CompositorClient final : public ThreadedCompositor::Client {
WTF_MAKE_NONCOPYABLE(CompositorClient);
public:
CompositorClient(ThreadedCoordinatedLayerTreeHost& layerTreeHost)
: m_layerTreeHost(layerTreeHost)
{
}
private:
void renderNextFrame() override
{
m_layerTreeHost.renderNextFrame();
}
void commitScrollOffset(uint32_t layerID, const WebCore::IntSize& offset) override
{
m_layerTreeHost.commitScrollOffset(layerID, offset);
}
uint64_t nativeSurfaceHandleForCompositing() override
{
return m_layerTreeHost.nativeSurfaceHandleForCompositing();
}
void didDestroyGLContext() override
{
m_layerTreeHost.didDestroyGLContext();
}
void willRenderFrame() override
{
m_layerTreeHost.willRenderFrame();
}
void didRenderFrame() override
{
m_layerTreeHost.didRenderFrame();
}
ThreadedCoordinatedLayerTreeHost& m_layerTreeHost;
};
void didChangeViewport();
void didFlushRootLayer(const WebCore::FloatRect&) override { }
void commitSceneState(const WebCore::CoordinatedGraphicsState&) override;
void releaseUpdateAtlases(Vector<uint32_t>&&) override;
#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
RefPtr<WebCore::DisplayRefreshMonitor> createDisplayRefreshMonitor(WebCore::PlatformDisplayID) override;
#endif
void frameComplete() override;
uint64_t nativeSurfaceHandleForCompositing();
void didDestroyGLContext();
void willRenderFrame();
void didRenderFrame();
enum class DiscardableSyncActions {
UpdateSize = 1 << 1,
UpdateViewport = 1 << 2,
UpdateScale = 1 << 3,
UpdateBackground = 1 << 4
};
CompositorClient m_compositorClient;
std::unique_ptr<AcceleratedSurface> m_surface;
RefPtr<ThreadedCompositor> m_compositor;
SimpleViewportController m_viewportController;
float m_lastPageScaleFactor { 1 };
WebCore::IntPoint m_lastScrollPosition;
bool m_isDiscardable { false };
OptionSet<DiscardableSyncActions> m_discardableSyncActions;
};
}
#endif // USE(COORDINATED_GRAPHICS_THREADED)