Changeset 163837 in webkit
- Timestamp:
- Feb 10, 2014, 4:24:58 PM (11 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r163836 r163837 1 2014-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 1 42 2014-02-10 Simon Fraser <simon.fraser@apple.com> 2 43 -
trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h
r163676 r163837 75 75 76 76 #if PLATFORM(MAC) 77 v oid setExposedRect(const WebCore::FloatRect&);77 virtual void setExposedRect(const WebCore::FloatRect&); 78 78 WebCore::FloatRect exposedRect() const { return m_exposedRect; } 79 79 void exposedRectChangedTimerFired(WebCore::Timer<DrawingAreaProxy>*); … … 81 81 void setCustomFixedPositionRect(const WebCore::FloatRect&); 82 82 #endif 83 84 virtual void showDebugIndicator(bool) { } 85 virtual bool isShowingDebugIndicator() const { return false; } 83 86 84 87 protected: -
trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp
r163676 r163837 140 140 } 141 141 142 // This comes from the scrolling tree. 142 143 void RemoteScrollingCoordinatorProxy::scrollPositionChanged(WebCore::ScrollingNodeID scrolledNodeID, const WebCore::FloatPoint& newScrollPosition) 143 144 { -
trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h
r163676 r163837 29 29 #include "DrawingAreaProxy.h" 30 30 #include "RemoteLayerTreeHost.h" 31 #include <WebCore/FloatPoint.h> 31 32 #include <WebCore/IntPoint.h> 32 33 #include <WebCore/IntSize.h> … … 43 44 44 45 const RemoteLayerTreeHost& remoteLayerTreeHost() const { return m_remoteLayerTreeHost; } 45 46 46 47 private: 47 48 virtual void sizeDidChange() override; 48 49 virtual void deviceScaleFactorDidChange() override; 49 50 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; 50 61 51 62 // IPC::MessageReceiver … … 62 73 WebCore::IntSize m_lastSentSize; 63 74 WebCore::IntSize m_lastSentLayerPosition; 75 76 std::unique_ptr<RemoteLayerTreeHost> m_debugIndicatorLayerTreeHost; 77 RetainPtr<CALayer> m_tileMapHostLayer; 78 RetainPtr<CALayer> m_exposedRectIndicatorLayer; 64 79 }; 65 80 -
trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm
r163515 r163837 32 32 #import "WebPageProxy.h" 33 33 #import "WebProcessProxy.h" 34 #import <WebCore/WebCoreCALayerExtras.h> 35 36 using namespace WebCore; 34 37 35 38 namespace WebKit { … … 37 40 RemoteLayerTreeDrawingAreaProxy::RemoteLayerTreeDrawingAreaProxy(WebPageProxy* webPageProxy) 38 41 : DrawingAreaProxy(DrawingAreaTypeRemoteLayerTree, webPageProxy) 39 , m_remoteLayerTreeHost( webPageProxy)42 , m_remoteLayerTreeHost() 40 43 , m_isWaitingForDidUpdateGeometry(false) 41 44 { … … 86 89 void RemoteLayerTreeDrawingAreaProxy::commitLayerTree(const RemoteLayerTreeTransaction& layerTreeTransaction, const RemoteScrollingCoordinatorTransaction& scrollingTreeTransaction) 87 90 { 88 m_remoteLayerTreeHost.updateLayerTree(layerTreeTransaction); 91 if (m_remoteLayerTreeHost.updateLayerTree(layerTreeTransaction)) 92 m_webPageProxy->setAcceleratedCompositingRootLayer(m_remoteLayerTreeHost.rootLayer()); 93 89 94 #if ENABLE(ASYNC_SCROLLING) 90 95 m_webPageProxy->scrollingCoordinatorProxy()->updateScrollingTree(scrollingTreeTransaction); … … 93 98 m_webPageProxy->didCommitLayerTree(layerTreeTransaction); 94 99 #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 111 static const float indicatorInset = 10; 112 static const float indicatorTopInset = 100; 113 114 void RemoteLayerTreeDrawingAreaProxy::setExposedRect(const WebCore::FloatRect& r) 115 { 116 DrawingAreaProxy::setExposedRect(r); 117 updateDebugIndicatorPosition(); 118 } 119 120 FloatPoint 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 133 void RemoteLayerTreeDrawingAreaProxy::updateDebugIndicatorPosition() 134 { 135 if (!m_tileMapHostLayer) 136 return; 137 138 [m_tileMapHostLayer setPosition:indicatorLocation()]; 139 } 140 141 float 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 155 void 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 193 void 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 } 95 237 } 96 238 -
trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeHost.h
r161327 r163837 40 40 class RemoteLayerTreeHost { 41 41 public: 42 explicit RemoteLayerTreeHost( WebPageProxy*);42 explicit RemoteLayerTreeHost(); 43 43 virtual ~RemoteLayerTreeHost(); 44 44 45 45 CALayer *getLayer(WebCore::GraphicsLayer::PlatformLayerID) const; 46 CALayer *rootLayer() const { return m_rootLayer; } 46 47 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; } 48 53 49 54 private: 50 55 CALayer *createLayer(RemoteLayerTreeTransaction::LayerCreationProperties); 51 56 52 WebPageProxy* m_webPageProxy;53 54 57 CALayer *m_rootLayer; 55 58 HashMap<WebCore::GraphicsLayer::PlatformLayerID, RetainPtr<CALayer>> m_layers; 59 bool m_isDebugLayerTreeHost; 56 60 }; 57 61 -
trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeHost.mm
r162458 r163837 43 43 namespace WebKit { 44 44 45 RemoteLayerTreeHost::RemoteLayerTreeHost( WebPageProxy* webPageProxy)46 : m_ webPageProxy(webPageProxy)47 , m_ rootLayer(nullptr)45 RemoteLayerTreeHost::RemoteLayerTreeHost() 46 : m_rootLayer(nullptr) 47 , m_isDebugLayerTreeHost(false) 48 48 { 49 49 } … … 53 53 } 54 54 55 void RemoteLayerTreeHost::updateLayerTree(const RemoteLayerTreeTransaction& transaction)55 bool RemoteLayerTreeHost::updateLayerTree(const RemoteLayerTreeTransaction& transaction, float indicatorScaleFactor) 56 56 { 57 57 LOG(RemoteLayerTree, "%s", transaction.description().data()); … … 60 60 createLayer(createdLayer); 61 61 62 bool rootLayerChanged = false; 62 63 CALayer *rootLayer = getLayer(transaction.rootLayerID()); 63 64 if (m_rootLayer != rootLayer) { 64 65 m_rootLayer = rootLayer; 65 m_webPageProxy->setAcceleratedCompositingRootLayer(m_rootLayer);66 rootLayerChanged = true; 66 67 } 67 68 … … 82 83 relatedLayers.set(properties.maskLayerID, getLayer(properties.maskLayerID)); 83 84 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); 85 94 } 86 95 87 96 for (auto destroyedLayer : transaction.destroyedLayers()) 88 97 m_layers.remove(destroyedLayer); 98 99 return rootLayerChanged; 89 100 } 90 101 … … 117 128 break; 118 129 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]); 120 134 break; 121 135 default:
Note:
See TracChangeset
for help on using the changeset viewer.