ThreadedCoordinatedLayerTreeHost.h [plain text]
#ifndef ThreadedCoordinatedLayerTreeHost_h
#define ThreadedCoordinatedLayerTreeHost_h
#if USE(COORDINATED_GRAPHICS_THREADED)
#include "LayerTreeContext.h"
#include "LayerTreeHost.h"
#include "ThreadedCompositor.h"
#include <WebCore/CompositingCoordinator.h>
#include <WebCore/FloatPoint.h>
#include <WebCore/FloatRect.h>
#include <WebCore/IntPoint.h>
#include <WebCore/IntRect.h>
#include <WebCore/IntSize.h>
#include <WebCore/PageOverlay.h>
#include <WebCore/Timer.h>
#include <wtf/RunLoop.h>
#include <wtf/Threading.h>
namespace WebCore {
class CoordinatedGraphicsLayerState;
struct CoordinatedGraphicsState;
class CoordinatedSurface;
class GraphicsContext;
class GraphicsLayer;
class GraphicsLayerFactory;
class GraphicsLayerFactory;
}
namespace WebKit {
class WebPage;
class ThreadedCoordinatedLayerTreeHost : public LayerTreeHost, public WebCore::CompositingCoordinator::Client, public ThreadedCompositor::Client {
WTF_MAKE_NONCOPYABLE(ThreadedCoordinatedLayerTreeHost); WTF_MAKE_FAST_ALLOCATED;
public:
static PassRefPtr<ThreadedCoordinatedLayerTreeHost> create(WebPage*);
virtual ~ThreadedCoordinatedLayerTreeHost();
virtual const LayerTreeContext& layerTreeContext() override { return m_layerTreeContext; };
virtual void scheduleLayerFlush() override;
virtual void setLayerFlushSchedulingEnabled(bool) override;
virtual void setShouldNotifyAfterNextScheduledLayerFlush(bool) override;
virtual void setRootCompositingLayer(WebCore::GraphicsLayer*) override;
virtual void invalidate() override;
virtual void setNonCompositedContentsNeedDisplay() override { };
virtual void setNonCompositedContentsNeedDisplayInRect(const WebCore::IntRect&) override { };
virtual void scrollNonCompositedContents(const WebCore::IntRect& scrollRect) override;
virtual void forceRepaint() override;
virtual bool forceRepaintAsync(uint64_t ) override;
virtual void sizeDidChange(const WebCore::IntSize& newSize) override;
virtual void deviceOrPageScaleFactorChanged() override;
virtual void pauseRendering() override;
virtual void resumeRendering() override;
virtual WebCore::GraphicsLayerFactory* graphicsLayerFactory() override;
virtual void pageBackgroundTransparencyChanged() override { };
virtual void viewportSizeChanged(const WebCore::IntSize&) override;
virtual void didChangeViewportProperties(const WebCore::ViewportAttributes&) override;
#if PLATFORM(GTK)
virtual void setNativeSurfaceHandleForCompositing(uint64_t) override;
#endif
#if ENABLE(REQUEST_ANIMATION_FRAME)
virtual void scheduleAnimation() override;
#endif
void setViewOverlayRootLayer(WebCore::GraphicsLayer*);
static PassRefPtr<WebCore::CoordinatedSurface> createCoordinatedSurface(const WebCore::IntSize&, WebCore::CoordinatedSurface::Flags);
protected:
explicit ThreadedCoordinatedLayerTreeHost(WebPage*);
private:
void compositorDidFlushLayers();
void didScaleFactorChanged(float scale, const WebCore::IntPoint& origin);
void updateRootLayers();
void cancelPendingLayerFlush();
void performScheduledLayerFlush();
WebCore::GraphicsLayer* rootLayer() { return m_coordinator->rootLayer(); }
virtual void setVisibleContentsRect(const WebCore::FloatRect&, const WebCore::FloatPoint&, float) override;
virtual void purgeBackingStores() override;
virtual void renderNextFrame() override;
virtual void commitScrollOffset(uint32_t layerID, const WebCore::IntSize& offset) override;
virtual void didFlushRootLayer(const WebCore::FloatRect&) override { }
virtual void notifyFlushRequired() override;
virtual void commitSceneState(const WebCore::CoordinatedGraphicsState&) override;
virtual void paintLayerContents(const WebCore::GraphicsLayer*, WebCore::GraphicsContext&, const WebCore::IntRect& clipRect) override;
LayerTreeContext m_layerTreeContext;
uint64_t m_forceRepaintAsyncCallbackID;
WebCore::IntPoint m_prevScrollPosition;
WebCore::GraphicsLayer* m_contentLayer;
WebCore::GraphicsLayer* m_viewOverlayRootLayer;
std::unique_ptr<WebCore::CompositingCoordinator> m_coordinator;
RefPtr<ThreadedCompositor> m_compositor;
bool m_notifyAfterScheduledLayerFlush;
bool m_isSuspended;
bool m_isWaitingForRenderer;
float m_lastScaleFactor;
WebCore::IntPoint m_lastScrollPosition;
RunLoop::Timer<ThreadedCoordinatedLayerTreeHost> m_layerFlushTimer;
bool m_layerFlushSchedulingEnabled;
};
}
#endif // USE(COORDINATED_GRAPHICS_THREADED)
#endif // ThreadedCoordinatedLayerTreeHost_h