Changeset 163837 in webkit


Ignore:
Timestamp:
Feb 10, 2014 4:24:58 PM (10 years ago)
Author:
Simon Fraser
Message:

Show a debug tile map indicator for UI-side compositing
https://bugs.webkit.org/show_bug.cgi?id=128553

Reviewed by Tim Horton.

Implement a tiled scrolling indicator for UI-side compositing.

The indicator is created by making another RemoteLayerTreeHost,
and decoding the transaction in it a second time to create a cloned
layer tree. In that clone commit, we modify some layer properties to
make things easier to see.

The cloned layer tree is hosted in the root layer of the main
RemoteLayerTreeHost.

RemoteLayerTreeHost was changed to not need a pointer to the WebPageProxy,
which it only used in the "root layer changed" case; instead, it now just
returns a bool from updateLayerTree() in that situation.

  • UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp: Explanatory comment.
  • UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h:
  • UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm:

(WebKit::RemoteLayerTreeDrawingAreaProxy::RemoteLayerTreeDrawingAreaProxy):
(WebKit::RemoteLayerTreeDrawingAreaProxy::commitLayerTree):
(WebKit::RemoteLayerTreeDrawingAreaProxy::setExposedRect):
(WebKit::RemoteLayerTreeDrawingAreaProxy::indicatorLocation):
(WebKit::RemoteLayerTreeDrawingAreaProxy::updateDebugIndicatorPosition):
(WebKit::RemoteLayerTreeDrawingAreaProxy::indicatorScale):
(WebKit::RemoteLayerTreeDrawingAreaProxy::updateDebugIndicator):
(WebKit::RemoteLayerTreeDrawingAreaProxy::showDebugIndicator):

  • UIProcess/mac/RemoteLayerTreeHost.h:

(WebKit::RemoteLayerTreeHost::rootLayer):
(WebKit::RemoteLayerTreeHost::setIsDebugLayerTreeHost):
(WebKit::RemoteLayerTreeHost::isDebugLayerTreeHost):

  • UIProcess/mac/RemoteLayerTreeHost.mm:

(WebKit::RemoteLayerTreeHost::RemoteLayerTreeHost):
(WebKit::RemoteLayerTreeHost::updateLayerTree):
(WebKit::RemoteLayerTreeHost::createLayer):

Location:
trunk/Source/WebKit2
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r163836 r163837  
     12014-02-10  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Show a debug tile map indicator for UI-side compositing
     4        https://bugs.webkit.org/show_bug.cgi?id=128553
     5
     6        Reviewed by Tim Horton.
     7       
     8        Implement a tiled scrolling indicator for UI-side compositing.
     9       
     10        The indicator is created by making another RemoteLayerTreeHost,
     11        and decoding the transaction in it a second time to create a cloned
     12        layer tree. In that clone commit, we modify some layer properties to
     13        make things easier to see.
     14       
     15        The cloned layer tree is hosted in the root layer of the main
     16        RemoteLayerTreeHost.
     17       
     18        RemoteLayerTreeHost was changed to not need a pointer to the WebPageProxy,
     19        which it only used in the "root layer changed" case; instead, it now just
     20        returns a bool from updateLayerTree() in that situation.
     21
     22        * UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp: Explanatory comment.
     23        * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h:
     24        * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm:
     25        (WebKit::RemoteLayerTreeDrawingAreaProxy::RemoteLayerTreeDrawingAreaProxy):
     26        (WebKit::RemoteLayerTreeDrawingAreaProxy::commitLayerTree):
     27        (WebKit::RemoteLayerTreeDrawingAreaProxy::setExposedRect):
     28        (WebKit::RemoteLayerTreeDrawingAreaProxy::indicatorLocation):
     29        (WebKit::RemoteLayerTreeDrawingAreaProxy::updateDebugIndicatorPosition):
     30        (WebKit::RemoteLayerTreeDrawingAreaProxy::indicatorScale):
     31        (WebKit::RemoteLayerTreeDrawingAreaProxy::updateDebugIndicator):
     32        (WebKit::RemoteLayerTreeDrawingAreaProxy::showDebugIndicator):
     33        * UIProcess/mac/RemoteLayerTreeHost.h:
     34        (WebKit::RemoteLayerTreeHost::rootLayer):
     35        (WebKit::RemoteLayerTreeHost::setIsDebugLayerTreeHost):
     36        (WebKit::RemoteLayerTreeHost::isDebugLayerTreeHost):
     37        * UIProcess/mac/RemoteLayerTreeHost.mm:
     38        (WebKit::RemoteLayerTreeHost::RemoteLayerTreeHost):
     39        (WebKit::RemoteLayerTreeHost::updateLayerTree):
     40        (WebKit::RemoteLayerTreeHost::createLayer):
     41
    1422014-02-10  Simon Fraser  <simon.fraser@apple.com>
    243
  • trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h

    r163676 r163837  
    7575
    7676#if PLATFORM(MAC)
    77     void setExposedRect(const WebCore::FloatRect&);
     77    virtual void setExposedRect(const WebCore::FloatRect&);
    7878    WebCore::FloatRect exposedRect() const { return m_exposedRect; }
    7979    void exposedRectChangedTimerFired(WebCore::Timer<DrawingAreaProxy>*);
     
    8181    void setCustomFixedPositionRect(const WebCore::FloatRect&);
    8282#endif
     83
     84    virtual void showDebugIndicator(bool) { }
     85    virtual bool isShowingDebugIndicator() const { return false; }
    8386
    8487protected:
  • trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp

    r163676 r163837  
    140140}
    141141
     142// This comes from the scrolling tree.
    142143void RemoteScrollingCoordinatorProxy::scrollPositionChanged(WebCore::ScrollingNodeID scrolledNodeID, const WebCore::FloatPoint& newScrollPosition)
    143144{
  • trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h

    r163676 r163837  
    2929#include "DrawingAreaProxy.h"
    3030#include "RemoteLayerTreeHost.h"
     31#include <WebCore/FloatPoint.h>
    3132#include <WebCore/IntPoint.h>
    3233#include <WebCore/IntSize.h>
     
    4344
    4445    const RemoteLayerTreeHost& remoteLayerTreeHost() const { return m_remoteLayerTreeHost; }
    45    
     46
    4647private:
    4748    virtual void sizeDidChange() override;
    4849    virtual void deviceScaleFactorDidChange() override;
    4950    virtual void didUpdateGeometry() override;
     51
     52    void showDebugIndicator(bool);
     53
     54    virtual void setExposedRect(const WebCore::FloatRect&) override;
     55
     56    float indicatorScale(WebCore::IntSize contentsSize) const;
     57    void updateDebugIndicator(WebCore::IntSize contentsSize, bool rootLayerChanged, float scale);
     58    void updateDebugIndicatorPosition();
     59   
     60    WebCore::FloatPoint indicatorLocation() const;
    5061
    5162    // IPC::MessageReceiver
     
    6273    WebCore::IntSize m_lastSentSize;
    6374    WebCore::IntSize m_lastSentLayerPosition;
     75
     76    std::unique_ptr<RemoteLayerTreeHost> m_debugIndicatorLayerTreeHost;
     77    RetainPtr<CALayer> m_tileMapHostLayer;
     78    RetainPtr<CALayer> m_exposedRectIndicatorLayer;
    6479};
    6580
  • trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm

    r163515 r163837  
    3232#import "WebPageProxy.h"
    3333#import "WebProcessProxy.h"
     34#import <WebCore/WebCoreCALayerExtras.h>
     35
     36using namespace WebCore;
    3437
    3538namespace WebKit {
     
    3740RemoteLayerTreeDrawingAreaProxy::RemoteLayerTreeDrawingAreaProxy(WebPageProxy* webPageProxy)
    3841    : DrawingAreaProxy(DrawingAreaTypeRemoteLayerTree, webPageProxy)
    39     , m_remoteLayerTreeHost(webPageProxy)
     42    , m_remoteLayerTreeHost()
    4043    , m_isWaitingForDidUpdateGeometry(false)
    4144{
     
    8689void RemoteLayerTreeDrawingAreaProxy::commitLayerTree(const RemoteLayerTreeTransaction& layerTreeTransaction, const RemoteScrollingCoordinatorTransaction& scrollingTreeTransaction)
    8790{
    88     m_remoteLayerTreeHost.updateLayerTree(layerTreeTransaction);
     91    if (m_remoteLayerTreeHost.updateLayerTree(layerTreeTransaction))
     92        m_webPageProxy->setAcceleratedCompositingRootLayer(m_remoteLayerTreeHost.rootLayer());
     93
    8994#if ENABLE(ASYNC_SCROLLING)
    9095    m_webPageProxy->scrollingCoordinatorProxy()->updateScrollingTree(scrollingTreeTransaction);
     
    9398    m_webPageProxy->didCommitLayerTree(layerTreeTransaction);
    9499#endif
     100
     101    showDebugIndicator(m_webPageProxy->preferences().tiledScrollingIndicatorVisible());
     102
     103    if (m_debugIndicatorLayerTreeHost) {
     104        float scale = indicatorScale(layerTreeTransaction.contentsSize());
     105        bool rootLayerChanged = m_debugIndicatorLayerTreeHost->updateLayerTree(layerTreeTransaction, scale);
     106        updateDebugIndicator(layerTreeTransaction.contentsSize(), rootLayerChanged, scale);
     107        m_debugIndicatorLayerTreeHost->rootLayer().name = @"Indicator host root";
     108    }
     109}
     110
     111static const float indicatorInset = 10;
     112static const float indicatorTopInset = 100;
     113
     114void RemoteLayerTreeDrawingAreaProxy::setExposedRect(const WebCore::FloatRect& r)
     115{
     116    DrawingAreaProxy::setExposedRect(r);
     117    updateDebugIndicatorPosition();
     118}
     119
     120FloatPoint RemoteLayerTreeDrawingAreaProxy::indicatorLocation() const
     121{
     122    if (m_webPageProxy->delegatesScrolling()) {
     123        FloatPoint tiledMapLocation = exposedRect().location();
     124        tiledMapLocation += FloatSize(indicatorInset, indicatorTopInset);
     125        float scale = 1 / m_webPageProxy->pageScaleFactor();
     126        tiledMapLocation.scale(scale, scale);
     127        return tiledMapLocation;
     128    }
     129   
     130    return FloatPoint(indicatorInset, indicatorInset);
     131}
     132
     133void RemoteLayerTreeDrawingAreaProxy::updateDebugIndicatorPosition()
     134{
     135    if (!m_tileMapHostLayer)
     136        return;
     137
     138    [m_tileMapHostLayer setPosition:indicatorLocation()];
     139}
     140
     141float RemoteLayerTreeDrawingAreaProxy::indicatorScale(IntSize contentsSize) const
     142{
     143    // Pick a good scale.
     144    IntSize viewSize = m_webPageProxy->viewSize();
     145
     146    float scale = 1;
     147    if (!contentsSize.isEmpty()) {
     148        float widthScale = std::min<float>((viewSize.width() - 2 * indicatorInset) / contentsSize.width(), 0.05);
     149        scale = std::min(widthScale, static_cast<float>(viewSize.height() - indicatorTopInset - indicatorInset) / contentsSize.height());
     150    }
     151   
     152    return scale;
     153}
     154
     155void RemoteLayerTreeDrawingAreaProxy::updateDebugIndicator(IntSize contentsSize, bool rootLayerChanged, float scale)
     156{
     157    // Make sure we're the last sublayer.
     158    CALayer *rootLayer = m_remoteLayerTreeHost.rootLayer();
     159    [m_tileMapHostLayer removeFromSuperlayer];
     160    [rootLayer addSublayer:m_tileMapHostLayer.get()];
     161
     162    // Pick a good scale.
     163    IntSize viewSize = m_webPageProxy->viewSize();
     164
     165    [m_tileMapHostLayer setBounds:FloatRect(FloatPoint(), contentsSize)];
     166    [m_tileMapHostLayer setPosition:indicatorLocation()];
     167    [m_tileMapHostLayer setTransform:CATransform3DMakeScale(scale, scale, 1)];
     168
     169    if (rootLayerChanged) {
     170        [m_tileMapHostLayer setSublayers:@[]];
     171        [m_tileMapHostLayer addSublayer:m_debugIndicatorLayerTreeHost->rootLayer()];
     172        [m_tileMapHostLayer addSublayer:m_exposedRectIndicatorLayer.get()];
     173    }
     174   
     175    const float indicatorBorderWidth = 1;
     176    float counterScaledBorder = indicatorBorderWidth / scale;
     177
     178    [m_exposedRectIndicatorLayer setBorderWidth:counterScaledBorder];
     179
     180    if (m_webPageProxy->delegatesScrolling()) {
     181        FloatRect scaledExposedRect = exposedRect();
     182        float scale = 1 / m_webPageProxy->pageScaleFactor();
     183        scaledExposedRect.scale(scale, scale);
     184
     185        [m_exposedRectIndicatorLayer setPosition:scaledExposedRect.location()];
     186        [m_exposedRectIndicatorLayer setBounds:FloatRect(FloatPoint(), scaledExposedRect.size())];
     187    } else {
     188        // FIXME: Get the correct scroll position.
     189        [m_exposedRectIndicatorLayer setBounds:FloatRect(FloatPoint(), viewSize)];
     190    }
     191}
     192
     193void RemoteLayerTreeDrawingAreaProxy::showDebugIndicator(bool show)
     194{
     195    if (show == !!m_debugIndicatorLayerTreeHost)
     196        return;
     197   
     198    if (!show) {
     199        [m_tileMapHostLayer removeFromSuperlayer];
     200        m_tileMapHostLayer = nullptr;
     201        m_exposedRectIndicatorLayer = nullptr;
     202        m_debugIndicatorLayerTreeHost = nullptr;
     203        return;
     204    }
     205   
     206    m_debugIndicatorLayerTreeHost = std::make_unique<RemoteLayerTreeHost>();
     207    m_debugIndicatorLayerTreeHost->setIsDebugLayerTreeHost(true);
     208
     209    m_tileMapHostLayer = adoptNS([[CALayer alloc] init]);
     210    [m_tileMapHostLayer setName:@"Tile map host"];
     211    [m_tileMapHostLayer web_disableAllActions];
     212    [m_tileMapHostLayer setAnchorPoint:CGPointZero];
     213    [m_tileMapHostLayer setOpacity:0.8];
     214    [m_tileMapHostLayer setMasksToBounds:YES];
     215    [m_tileMapHostLayer setBorderWidth:2];
     216
     217    RetainPtr<CGColorSpaceRef> colorSpace = adoptCF(CGColorSpaceCreateDeviceRGB());
     218    {
     219        const CGFloat components[] = { 1, 1, 1, 0.6 };
     220        RetainPtr<CGColorRef> color = adoptCF(CGColorCreate(colorSpace.get(), components));
     221        [m_tileMapHostLayer setBackgroundColor:color.get()];
     222
     223        const CGFloat borderCmponents[] = { 0, 0, 0, 1 };
     224        RetainPtr<CGColorRef> borderColor = adoptCF(CGColorCreate(colorSpace.get(), borderCmponents));
     225        [m_tileMapHostLayer setBorderColor:borderColor.get()];
     226    }
     227   
     228    m_exposedRectIndicatorLayer = adoptNS([[CALayer alloc] init]);
     229    [m_exposedRectIndicatorLayer web_disableAllActions];
     230    [m_exposedRectIndicatorLayer setAnchorPoint:CGPointZero];
     231
     232    {
     233        const CGFloat components[] = { 0, 1, 0, 1 };
     234        RetainPtr<CGColorRef> color = adoptCF(CGColorCreate(colorSpace.get(), components));
     235        [m_exposedRectIndicatorLayer setBorderColor:color.get()];
     236    }
    95237}
    96238
  • trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeHost.h

    r161327 r163837  
    4040class RemoteLayerTreeHost {
    4141public:
    42     explicit RemoteLayerTreeHost(WebPageProxy*);
     42    explicit RemoteLayerTreeHost();
    4343    virtual ~RemoteLayerTreeHost();
    4444
    4545    CALayer *getLayer(WebCore::GraphicsLayer::PlatformLayerID) const;
     46    CALayer *rootLayer() const { return m_rootLayer; }
    4647
    47     void updateLayerTree(const RemoteLayerTreeTransaction&);
     48    // Returns true if the root layer changed.
     49    bool updateLayerTree(const RemoteLayerTreeTransaction&, float indicatorScaleFactor  = 1);
     50
     51    void setIsDebugLayerTreeHost(bool flag) { m_isDebugLayerTreeHost = flag; }
     52    bool isDebugLayerTreeHost() const { return m_isDebugLayerTreeHost; }
    4853
    4954private:
    5055    CALayer *createLayer(RemoteLayerTreeTransaction::LayerCreationProperties);
    5156
    52     WebPageProxy* m_webPageProxy;
    53 
    5457    CALayer *m_rootLayer;
    5558    HashMap<WebCore::GraphicsLayer::PlatformLayerID, RetainPtr<CALayer>> m_layers;
     59    bool m_isDebugLayerTreeHost;
    5660};
    5761
  • trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeHost.mm

    r162458 r163837  
    4343namespace WebKit {
    4444
    45 RemoteLayerTreeHost::RemoteLayerTreeHost(WebPageProxy* webPageProxy)
    46     : m_webPageProxy(webPageProxy)
    47     , m_rootLayer(nullptr)
     45RemoteLayerTreeHost::RemoteLayerTreeHost()
     46    : m_rootLayer(nullptr)
     47    , m_isDebugLayerTreeHost(false)
    4848{
    4949}
     
    5353}
    5454
    55 void RemoteLayerTreeHost::updateLayerTree(const RemoteLayerTreeTransaction& transaction)
     55bool RemoteLayerTreeHost::updateLayerTree(const RemoteLayerTreeTransaction& transaction, float indicatorScaleFactor)
    5656{
    5757    LOG(RemoteLayerTree, "%s", transaction.description().data());
     
    6060        createLayer(createdLayer);
    6161
     62    bool rootLayerChanged = false;
    6263    CALayer *rootLayer = getLayer(transaction.rootLayerID());
    6364    if (m_rootLayer != rootLayer) {
    6465        m_rootLayer = rootLayer;
    65         m_webPageProxy->setAcceleratedCompositingRootLayer(m_rootLayer);
     66        rootLayerChanged = true;
    6667    }
    6768
     
    8283            relatedLayers.set(properties.maskLayerID, getLayer(properties.maskLayerID));
    8384
    84         RemoteLayerTreePropertyApplier::applyPropertiesToLayer(layer, properties, relatedLayers);
     85        if (m_isDebugLayerTreeHost) {
     86            RemoteLayerTreeTransaction::LayerProperties propertiesCopy(properties);
     87            propertiesCopy.masksToBounds = false;
     88            if (propertiesCopy.changedProperties & RemoteLayerTreeTransaction::BorderWidthChanged)
     89                propertiesCopy.borderWidth *= 1 / indicatorScaleFactor;
     90           
     91            RemoteLayerTreePropertyApplier::applyPropertiesToLayer(layer, propertiesCopy, relatedLayers);
     92        } else
     93            RemoteLayerTreePropertyApplier::applyPropertiesToLayer(layer, properties, relatedLayers);
    8594    }
    8695
    8796    for (auto destroyedLayer : transaction.destroyedLayers())
    8897        m_layers.remove(destroyedLayer);
     98
     99    return rootLayerChanged;
    89100}
    90101
     
    117128        break;
    118129    case PlatformCALayer::LayerTypeCustom:
    119         layer = WKMakeRenderLayer(properties.hostingContextID);
     130        if (!m_isDebugLayerTreeHost)
     131            layer = WKMakeRenderLayer(properties.hostingContextID);
     132        else
     133            layer = adoptNS([[CALayer alloc] init]);
    120134        break;
    121135    default:
Note: See TracChangeset for help on using the changeset viewer.