- Revision
- 159079
- Author
- [email protected]
- Date
- 2013-11-11 16:20:20 -0800 (Mon, 11 Nov 2013)
Log Message
Remote Layer Tree: Implement Page Overlays
https://bugs.webkit.org/show_bug.cgi?id=124165
<rdar://problem/15199056>
Reviewed by Anders Carlsson.
Implement page overlays, very similar to how they work in TiledCoreAnimationDrawingArea,
but manipulating the PlatformCALayer tree instead of the CALayer tree directly.
* WebProcess/WebPage/mac/RemoteLayerTreeContext.h:
* WebProcess/WebPage/mac/RemoteLayerTreeContext.mm:
(WebKit::RemoteLayerTreeContext::outOfTreeLayerWasAdded):
(WebKit::RemoteLayerTreeContext::outOfTreeLayerWillBeRemoved):
(WebKit::RemoteLayerTreeContext::flushLayers):
Add a list of out-of-tree GraphicsLayers which are flushed in addition
to the page's GraphicsLayer tree, and functions to manipulate this list.
* WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h:
Make RemoteLayerTreeDrawingArea a GraphicsLayerClient, so we can get callbacks
from the GraphicsLayers that drive our page overlays.
Override the relevant page overlay functions.
Add storage for the root layer, view size, and a map of PageOverlay->GraphicsLayer.
* WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
(WebKit::RemoteLayerTreeDrawingArea::setRootCompositingLayer):
Store the root GraphicsLayer for later use.
(WebKit::RemoteLayerTreeDrawingArea::updateGeometry):
Update the size of the page overlays when the DrawingArea's geometry changes.
(WebKit::RemoteLayerTreeDrawingArea::updatePreferences):
Update the page overlay settings when necessary.
(WebKit::RemoteLayerTreeDrawingArea::didInstallPageOverlay):
Create a GraphicsLayer for our page overlay, set it up, and parent it.
Inform the RemoteLayerTreeContext that it will need to flush this GraphicsLayer,
since it's not a part of the page's GraphicsLayer tree.
(WebKit::RemoteLayerTreeDrawingArea::didUninstallPageOverlay):
Tear down our page overlay's GraphicsLayer.
(WebKit::RemoteLayerTreeDrawingArea::setPageOverlayNeedsDisplay):
(WebKit::RemoteLayerTreeDrawingArea::setPageOverlayOpacity):
(WebKit::RemoteLayerTreeDrawingArea::paintContents):
(WebKit::RemoteLayerTreeDrawingArea::deviceScaleFactor):
Modified Paths
Diff
Modified: trunk/Source/WebKit2/ChangeLog (159078 => 159079)
--- trunk/Source/WebKit2/ChangeLog 2013-11-12 00:19:47 UTC (rev 159078)
+++ trunk/Source/WebKit2/ChangeLog 2013-11-12 00:20:20 UTC (rev 159079)
@@ -1,3 +1,51 @@
+2013-11-11 Tim Horton <[email protected]>
+
+ Remote Layer Tree: Implement Page Overlays
+ https://bugs.webkit.org/show_bug.cgi?id=124165
+ <rdar://problem/15199056>
+
+ Reviewed by Anders Carlsson.
+
+ Implement page overlays, very similar to how they work in TiledCoreAnimationDrawingArea,
+ but manipulating the PlatformCALayer tree instead of the CALayer tree directly.
+
+ * WebProcess/WebPage/mac/RemoteLayerTreeContext.h:
+ * WebProcess/WebPage/mac/RemoteLayerTreeContext.mm:
+ (WebKit::RemoteLayerTreeContext::outOfTreeLayerWasAdded):
+ (WebKit::RemoteLayerTreeContext::outOfTreeLayerWillBeRemoved):
+ (WebKit::RemoteLayerTreeContext::flushLayers):
+ Add a list of out-of-tree GraphicsLayers which are flushed in addition
+ to the page's GraphicsLayer tree, and functions to manipulate this list.
+
+ * WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h:
+ Make RemoteLayerTreeDrawingArea a GraphicsLayerClient, so we can get callbacks
+ from the GraphicsLayers that drive our page overlays.
+ Override the relevant page overlay functions.
+ Add storage for the root layer, view size, and a map of PageOverlay->GraphicsLayer.
+
+ * WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
+ (WebKit::RemoteLayerTreeDrawingArea::setRootCompositingLayer):
+ Store the root GraphicsLayer for later use.
+
+ (WebKit::RemoteLayerTreeDrawingArea::updateGeometry):
+ Update the size of the page overlays when the DrawingArea's geometry changes.
+
+ (WebKit::RemoteLayerTreeDrawingArea::updatePreferences):
+ Update the page overlay settings when necessary.
+
+ (WebKit::RemoteLayerTreeDrawingArea::didInstallPageOverlay):
+ Create a GraphicsLayer for our page overlay, set it up, and parent it.
+ Inform the RemoteLayerTreeContext that it will need to flush this GraphicsLayer,
+ since it's not a part of the page's GraphicsLayer tree.
+
+ (WebKit::RemoteLayerTreeDrawingArea::didUninstallPageOverlay):
+ Tear down our page overlay's GraphicsLayer.
+
+ (WebKit::RemoteLayerTreeDrawingArea::setPageOverlayNeedsDisplay):
+ (WebKit::RemoteLayerTreeDrawingArea::setPageOverlayOpacity):
+ (WebKit::RemoteLayerTreeDrawingArea::paintContents):
+ (WebKit::RemoteLayerTreeDrawingArea::deviceScaleFactor):
+
2013-11-11 Anders Carlsson <[email protected]>
Add a FrameLoadState object and begin moving loading related members from WebFrameProxy
Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeContext.h (159078 => 159079)
--- trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeContext.h 2013-11-12 00:19:47 UTC (rev 159078)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeContext.h 2013-11-12 00:20:20 UTC (rev 159079)
@@ -51,6 +51,9 @@
void layerWasCreated(PlatformCALayerRemote*, WebCore::PlatformCALayer::LayerType);
void layerWillBeDestroyed(PlatformCALayerRemote*);
+ void outOfTreeLayerWasAdded(WebCore::GraphicsLayer*);
+ void outOfTreeLayerWillBeRemoved(WebCore::GraphicsLayer*);
+
LayerHostingMode layerHostingMode() const { return m_webPage->layerHostingMode(); }
private:
@@ -64,6 +67,7 @@
WebCore::Timer<RemoteLayerTreeContext> m_layerFlushTimer;
RefPtr<PlatformCALayerRemote> m_rootLayer;
+ Vector<WebCore::GraphicsLayer*> m_outOfTreeLayers;
Vector<RemoteLayerTreeTransaction::LayerCreationProperties> m_createdLayers;
Vector<RemoteLayerTreeTransaction::LayerID> m_destroyedLayers;
Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeContext.mm (159078 => 159079)
--- trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeContext.mm 2013-11-12 00:19:47 UTC (rev 159078)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeContext.mm 2013-11-12 00:20:20 UTC (rev 159079)
@@ -78,6 +78,19 @@
m_destroyedLayers.append(layer->layerID());
}
+void RemoteLayerTreeContext::outOfTreeLayerWasAdded(GraphicsLayer* layer)
+{
+ ASSERT(!m_outOfTreeLayers.contains(layer));
+ m_outOfTreeLayers.append(layer);
+}
+
+void RemoteLayerTreeContext::outOfTreeLayerWillBeRemoved(GraphicsLayer* layer)
+{
+ size_t layerIndex = m_outOfTreeLayers.find(layer);
+ ASSERT(layerIndex != notFound);
+ m_outOfTreeLayers.remove(layerIndex);
+}
+
void RemoteLayerTreeContext::scheduleLayerFlush()
{
if (m_layerFlushTimer.isActive())
@@ -108,6 +121,9 @@
m_webPage->layoutIfNeeded();
m_webPage->corePage()->mainFrame().view()->flushCompositingStateIncludingSubframes();
+ for (const auto& layer : m_outOfTreeLayers)
+ layer->flushCompositingStateForThisLayerOnly();
+
transaction.setCreatedLayers(std::move(m_createdLayers));
transaction.setDestroyedLayerIDs(std::move(m_destroyedLayers));
m_rootLayer->recursiveBuildTransaction(transaction);
Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h (159078 => 159079)
--- trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h 2013-11-12 00:19:47 UTC (rev 159078)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h 2013-11-12 00:20:20 UTC (rev 159079)
@@ -27,12 +27,19 @@
#define RemoteLayerTreeDrawingArea_h
#include "DrawingArea.h"
+#include "GraphicsLayerCARemote.h"
+#include <WebCore/GraphicsLayerClient.h>
+#include <wtf/HashMap.h>
+namespace WebCore {
+class PlatformCALayer;
+}
+
namespace WebKit {
class RemoteLayerTreeContext;
-class RemoteLayerTreeDrawingArea : public DrawingArea {
+class RemoteLayerTreeDrawingArea : public DrawingArea, public WebCore::GraphicsLayerClient {
public:
RemoteLayerTreeDrawingArea(WebPage*, const WebPageCreationParameters&);
virtual ~RemoteLayerTreeDrawingArea();
@@ -52,7 +59,24 @@
virtual void updatePreferences(const WebPreferencesStore&) OVERRIDE;
+ virtual void didInstallPageOverlay(PageOverlay*) OVERRIDE;
+ virtual void didUninstallPageOverlay(PageOverlay*) OVERRIDE;
+ virtual void setPageOverlayNeedsDisplay(PageOverlay*, const WebCore::IntRect&) OVERRIDE;
+ virtual void setPageOverlayOpacity(PageOverlay*, float) OVERRIDE;
+
+ // WebCore::GraphicsLayerClient
+ virtual void notifyAnimationStarted(const WebCore::GraphicsLayer*, double time) OVERRIDE { }
+ virtual void notifyFlushRequired(const WebCore::GraphicsLayer*) OVERRIDE { }
+ virtual void paintContents(const WebCore::GraphicsLayer*, WebCore::GraphicsContext&, WebCore::GraphicsLayerPaintingPhase, const WebCore::IntRect& clipRect) OVERRIDE;
+ virtual float deviceScaleFactor() const OVERRIDE;
+ virtual void didCommitChangesForLayer(const WebCore::GraphicsLayer*) const OVERRIDE { }
+
std::unique_ptr<RemoteLayerTreeContext> m_remoteLayerTreeContext;
+ RefPtr<WebCore::PlatformCALayer> m_rootLayer;
+
+ HashMap<PageOverlay*, std::unique_ptr<GraphicsLayerCARemote>> m_pageOverlayLayers;
+
+ WebCore::IntSize m_viewSize;
};
} // namespace WebKit
Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm (159078 => 159079)
--- trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm 2013-11-12 00:19:47 UTC (rev 159078)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm 2013-11-12 00:20:20 UTC (rev 159079)
@@ -27,6 +27,7 @@
#import "RemoteLayerTreeDrawingArea.h"
#import "DrawingAreaProxyMessages.h"
+#import "GraphicsLayerCARemote.h"
#import "RemoteLayerTreeContext.h"
#import "WebPage.h"
#import <WebCore/Frame.h>
@@ -68,6 +69,8 @@
void RemoteLayerTreeDrawingArea::setRootCompositingLayer(GraphicsLayer* rootLayer)
{
+ m_rootLayer = rootLayer ? static_cast<GraphicsLayerCARemote*>(rootLayer)->platformCALayer() : nullptr;
+
m_remoteLayerTreeContext->setRootLayer(rootLayer);
}
@@ -78,7 +81,15 @@
void RemoteLayerTreeDrawingArea::updateGeometry(const IntSize& viewSize, const IntSize& layerPosition)
{
+ m_viewSize = viewSize;
m_webPage->setSize(viewSize);
+
+ for (const auto& overlayAndLayer : m_pageOverlayLayers) {
+ GraphicsLayer* layer = overlayAndLayer.value.get();
+ if (layer->drawsContent())
+ layer->setSize(viewSize);
+ }
+
scheduleCompositingLayerFlush();
m_webPage->send(Messages::DrawingAreaProxy::DidUpdateGeometry());
@@ -97,6 +108,83 @@
// in order to be scrolled by the ScrollingCoordinator.
settings.setAcceleratedCompositingForFixedPositionEnabled(true);
settings.setFixedPositionCreatesStackingContext(true);
+
+ for (const auto& overlayAndLayer : m_pageOverlayLayers) {
+ overlayAndLayer.value->setAcceleratesDrawing(settings.acceleratedDrawingEnabled());
+ overlayAndLayer.value->setShowDebugBorder(settings.showDebugBorders());
+ overlayAndLayer.value->setShowRepaintCounter(settings.showRepaintCounter());
+ }
}
+void RemoteLayerTreeDrawingArea::didInstallPageOverlay(PageOverlay* pageOverlay)
+{
+ std::unique_ptr<GraphicsLayerCARemote> layer(static_cast<GraphicsLayerCARemote*>(GraphicsLayer::create(graphicsLayerFactory(), this).release()));
+#ifndef NDEBUG
+ layer->setName("page overlay content");
+#endif
+
+ layer->setAcceleratesDrawing(m_webPage->corePage()->settings().acceleratedDrawingEnabled());
+ layer->setShowDebugBorder(m_webPage->corePage()->settings().showDebugBorders());
+ layer->setShowRepaintCounter(m_webPage->corePage()->settings().showRepaintCounter());
+
+ m_rootLayer->appendSublayer(layer->platformCALayer());
+ m_remoteLayerTreeContext->outOfTreeLayerWasAdded(layer.get());
+
+ m_pageOverlayLayers.add(pageOverlay, std::move(layer));
+ scheduleCompositingLayerFlush();
+}
+
+void RemoteLayerTreeDrawingArea::didUninstallPageOverlay(PageOverlay* pageOverlay)
+{
+ std::unique_ptr<GraphicsLayerCARemote> layer = m_pageOverlayLayers.take(pageOverlay);
+ ASSERT(layer);
+
+ m_remoteLayerTreeContext->outOfTreeLayerWillBeRemoved(layer.get());
+ layer->platformCALayer()->removeFromSuperlayer();
+
+ scheduleCompositingLayerFlush();
+}
+
+void RemoteLayerTreeDrawingArea::setPageOverlayNeedsDisplay(PageOverlay* pageOverlay, const IntRect& rect)
+{
+ GraphicsLayerCARemote* layer = m_pageOverlayLayers.get(pageOverlay);
+
+ if (!layer)
+ return;
+
+ if (!layer->drawsContent()) {
+ layer->setDrawsContent(true);
+ layer->setSize(m_viewSize);
+ }
+
+ layer->setNeedsDisplayInRect(rect);
+ scheduleCompositingLayerFlush();
+}
+
+void RemoteLayerTreeDrawingArea::setPageOverlayOpacity(PageOverlay* pageOverlay, float opacity)
+{
+ GraphicsLayerCARemote* layer = m_pageOverlayLayers.get(pageOverlay);
+
+ if (!layer)
+ return;
+
+ layer->setOpacity(opacity);
+ scheduleCompositingLayerFlush();
+}
+
+void RemoteLayerTreeDrawingArea::paintContents(const GraphicsLayer* graphicsLayer, GraphicsContext& graphicsContext, GraphicsLayerPaintingPhase, const IntRect& clipRect)
+{
+ for (const auto& overlayAndLayer : m_pageOverlayLayers) {
+ if (overlayAndLayer.value.get() == graphicsLayer) {
+ m_webPage->drawPageOverlay(overlayAndLayer.key, graphicsContext, clipRect);
+ break;
+ }
+ }
+}
+
+float RemoteLayerTreeDrawingArea::deviceScaleFactor() const
+{
+ return m_webPage->corePage()->deviceScaleFactor();
+}
+
} // namespace WebKit