RemoteLayerTreeDrawingArea.h [plain text]
#pragma once
#include "CallbackID.h"
#include "DrawingArea.h"
#include "GraphicsLayerCARemote.h"
#include "RemoteLayerTreeTransaction.h"
#include <WebCore/AnimationFrameRate.h>
#include <WebCore/GraphicsLayerClient.h>
#include <WebCore/Timer.h>
#include <atomic>
#include <dispatch/dispatch.h>
#include <wtf/HashMap.h>
#include <wtf/WeakPtr.h>
namespace WebCore {
class PlatformCALayer;
class ThreadSafeImageBufferFlusher;
}
namespace WebKit {
class RemoteLayerTreeContext;
class RemoteLayerTreeDisplayRefreshMonitor;
class RemoteLayerTreeDrawingArea : public DrawingArea, public CanMakeWeakPtr<RemoteLayerTreeDrawingArea>, public WebCore::GraphicsLayerClient {
friend class RemoteLayerTreeDisplayRefreshMonitor;
public:
RemoteLayerTreeDrawingArea(WebPage&, const WebPageCreationParameters&);
virtual ~RemoteLayerTreeDrawingArea();
TransactionID nextTransactionID() const { return m_currentTransactionID.next(); }
TransactionID lastCommittedTransactionID() const { return m_currentTransactionID; }
private:
void setNeedsDisplay() override;
void setNeedsDisplayInRect(const WebCore::IntRect&) override;
void scroll(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollDelta) override;
void updateGeometry(const WebCore::IntSize& viewSize, bool flushSynchronously, const WTF::MachSendRight& fencePort) override;
void adoptDisplayRefreshMonitorsFromDrawingArea(DrawingArea&) override;
WebCore::GraphicsLayerFactory* graphicsLayerFactory() override;
void setRootCompositingLayer(WebCore::GraphicsLayer*) override;
void triggerRenderingUpdate() override;
void attachViewOverlayGraphicsLayer(WebCore::GraphicsLayer*) override;
void addTransactionCallbackID(CallbackID) override;
RefPtr<WebCore::DisplayRefreshMonitor> createDisplayRefreshMonitor(WebCore::PlatformDisplayID) override;
void willDestroyDisplayRefreshMonitor(WebCore::DisplayRefreshMonitor*);
void setPreferredFramesPerSecond(WebCore::FramesPerSecond);
bool shouldUseTiledBackingForFrameView(const WebCore::FrameView&) const override;
void updatePreferences(const WebPreferencesStore&) override;
bool supportsAsyncScrolling() const override { return true; }
bool usesDelegatedScrolling() const override { return true; }
bool usesDelegatedPageScaling() const override { return true; }
void setLayerTreeStateIsFrozen(bool) override;
bool layerTreeStateIsFrozen() const override { return m_isRenderingSuspended; }
void forceRepaint() override;
void forceRepaintAsync(WebPage&, CompletionHandler<void()>&&) override;
void setViewExposedRect(Optional<WebCore::FloatRect>) override;
Optional<WebCore::FloatRect> viewExposedRect() const override { return m_viewExposedRect; }
void acceleratedAnimationDidStart(uint64_t layerID, const String& key, MonotonicTime startTime) override;
void acceleratedAnimationDidEnd(uint64_t layerID, const String& key) override;
WebCore::FloatRect exposedContentRect() const override;
void setExposedContentRect(const WebCore::FloatRect&) override;
void didUpdate() override;
#if PLATFORM(IOS_FAMILY)
void setDeviceScaleFactor(float) override;
#endif
void mainFrameContentSizeChanged(const WebCore::IntSize&) override;
void activityStateDidChange(OptionSet<WebCore::ActivityState::Flag> changed, ActivityStateChangeID, const Vector<CallbackID>& callbackIDs) override;
bool addMilestonesToDispatch(OptionSet<WebCore::LayoutMilestone>) override;
void updateRootLayers();
void addCommitHandlers();
void updateRendering();
void startRenderingUpdateTimer();
WebCore::TiledBacking* mainFrameTiledBacking() const;
TransactionID takeNextTransactionID() { return m_currentTransactionID.increment(); }
bool markLayersVolatileImmediatelyIfPossible() override;
void adoptLayersFromDrawingArea(DrawingArea&) override;
class BackingStoreFlusher : public ThreadSafeRefCounted<BackingStoreFlusher> {
public:
static Ref<BackingStoreFlusher> create(IPC::Connection*, std::unique_ptr<IPC::Encoder>, Vector<std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher>>);
void flush();
bool hasFlushed() const { return m_hasFlushed; }
private:
BackingStoreFlusher(IPC::Connection*, std::unique_ptr<IPC::Encoder>, Vector<std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher>>);
RefPtr<IPC::Connection> m_connection;
std::unique_ptr<IPC::Encoder> m_commitEncoder;
Vector<std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher>> m_flushers;
std::atomic<bool> m_hasFlushed;
};
std::unique_ptr<RemoteLayerTreeContext> m_remoteLayerTreeContext;
Ref<WebCore::GraphicsLayer> m_rootLayer;
WebCore::IntSize m_viewSize;
Optional<WebCore::FloatRect> m_viewExposedRect;
WebCore::Timer m_updateRenderingTimer;
bool m_isRenderingSuspended { false };
bool m_hasDeferredRenderingUpdate { false };
bool m_nextRenderingUpdateRequiresSynchronousImageDecoding { false };
bool m_inUpdateRendering { false };
bool m_waitingForBackingStoreSwap { false };
bool m_deferredRenderingUpdateWhileWaitingForBackingStoreSwap { false };
dispatch_queue_t m_commitQueue;
RefPtr<BackingStoreFlusher> m_pendingBackingStoreFlusher;
HashSet<RemoteLayerTreeDisplayRefreshMonitor*> m_displayRefreshMonitors;
HashSet<RemoteLayerTreeDisplayRefreshMonitor*>* m_displayRefreshMonitorsToNotify { nullptr };
TransactionID m_currentTransactionID;
Vector<RemoteLayerTreeTransaction::TransactionCallbackID> m_pendingCallbackIDs;
ActivityStateChangeID m_activityStateChangeID { ActivityStateChangeAsynchronous };
OptionSet<WebCore::LayoutMilestone> m_pendingNewlyReachedPaintingMilestones;
RefPtr<WebCore::GraphicsLayer> m_contentLayer;
RefPtr<WebCore::GraphicsLayer> m_viewOverlayRootLayer;
};
inline bool RemoteLayerTreeDrawingArea::addMilestonesToDispatch(OptionSet<WebCore::LayoutMilestone> paintMilestones)
{
m_pendingNewlyReachedPaintingMilestones.add(paintMilestones);
return true;
}
}
SPECIALIZE_TYPE_TRAITS_DRAWING_AREA(RemoteLayerTreeDrawingArea, DrawingAreaTypeRemoteLayerTree)