| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/layer_tree_host_impl.h" | 5 #include "cc/layer_tree_host_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #include "cc/quad_culler.h" | 30 #include "cc/quad_culler.h" |
| 31 #include "cc/render_pass_draw_quad.h" | 31 #include "cc/render_pass_draw_quad.h" |
| 32 #include "cc/rendering_stats.h" | 32 #include "cc/rendering_stats.h" |
| 33 #include "cc/scrollbar_animation_controller.h" | 33 #include "cc/scrollbar_animation_controller.h" |
| 34 #include "cc/scrollbar_layer_impl.h" | 34 #include "cc/scrollbar_layer_impl.h" |
| 35 #include "cc/shared_quad_state.h" | 35 #include "cc/shared_quad_state.h" |
| 36 #include "cc/single_thread_proxy.h" | 36 #include "cc/single_thread_proxy.h" |
| 37 #include "cc/software_renderer.h" | 37 #include "cc/software_renderer.h" |
| 38 #include "cc/solid_color_draw_quad.h" | 38 #include "cc/solid_color_draw_quad.h" |
| 39 #include "cc/texture_uploader.h" | 39 #include "cc/texture_uploader.h" |
| 40 #include "cc/top_controls_manager.h" |
| 40 #include "cc/util.h" | 41 #include "cc/util.h" |
| 41 #include "ui/gfx/size_conversions.h" | 42 #include "ui/gfx/size_conversions.h" |
| 42 #include "ui/gfx/vector2d_conversions.h" | 43 #include "ui/gfx/vector2d_conversions.h" |
| 43 | 44 |
| 44 namespace { | 45 namespace { |
| 45 | 46 |
| 46 void didVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) | 47 void didVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) |
| 47 { | 48 { |
| 48 if (visible) { | 49 if (visible) { |
| 49 TRACE_EVENT_ASYNC_BEGIN1("webkit", "LayerTreeHostImpl::setVisible", id,
"LayerTreeHostImpl", id); | 50 TRACE_EVENT_ASYNC_BEGIN1("webkit", "LayerTreeHostImpl::setVisible", id,
"LayerTreeHostImpl", id); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 , m_cumulativeNumLayersDrawn(0) | 148 , m_cumulativeNumLayersDrawn(0) |
| 148 , m_cumulativeNumMissingTiles(0) | 149 , m_cumulativeNumMissingTiles(0) |
| 149 , m_lastSentMemoryVisibleBytes(0) | 150 , m_lastSentMemoryVisibleBytes(0) |
| 150 , m_lastSentMemoryVisibleAndNearbyBytes(0) | 151 , m_lastSentMemoryVisibleAndNearbyBytes(0) |
| 151 , m_lastSentMemoryUseBytes(0) | 152 , m_lastSentMemoryUseBytes(0) |
| 152 , m_animationRegistrar(AnimationRegistrar::create()) | 153 , m_animationRegistrar(AnimationRegistrar::create()) |
| 153 { | 154 { |
| 154 DCHECK(m_proxy->isImplThread()); | 155 DCHECK(m_proxy->isImplThread()); |
| 155 didVisibilityChange(this, m_visible); | 156 didVisibilityChange(this, m_visible); |
| 156 | 157 |
| 158 if (settings.calculateTopControlsPosition) |
| 159 m_topControlsManager = TopControlsManager::Create(this, settings.topCont
rolsHeightPx); |
| 160 |
| 157 // LTHI always has an active tree. | 161 // LTHI always has an active tree. |
| 158 m_activeTree = LayerTreeImpl::create(this); | 162 m_activeTree = LayerTreeImpl::create(this); |
| 159 } | 163 } |
| 160 | 164 |
| 161 LayerTreeHostImpl::~LayerTreeHostImpl() | 165 LayerTreeHostImpl::~LayerTreeHostImpl() |
| 162 { | 166 { |
| 163 DCHECK(m_proxy->isImplThread()); | 167 DCHECK(m_proxy->isImplThread()); |
| 164 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); | 168 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); |
| 165 | 169 |
| 166 if (rootLayer()) { | 170 if (rootLayer()) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 OutputSurface* LayerTreeHostImpl::outputSurface() const | 234 OutputSurface* LayerTreeHostImpl::outputSurface() const |
| 231 { | 235 { |
| 232 return m_outputSurface.get(); | 236 return m_outputSurface.get(); |
| 233 } | 237 } |
| 234 | 238 |
| 235 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) | 239 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) |
| 236 { | 240 { |
| 237 animatePageScale(monotonicTime); | 241 animatePageScale(monotonicTime); |
| 238 animateLayers(monotonicTime, wallClockTime); | 242 animateLayers(monotonicTime, wallClockTime); |
| 239 animateScrollbars(monotonicTime); | 243 animateScrollbars(monotonicTime); |
| 244 if (m_topControlsManager) |
| 245 m_topControlsManager->Animate(monotonicTime); |
| 240 } | 246 } |
| 241 | 247 |
| 242 void LayerTreeHostImpl::manageTiles() | 248 void LayerTreeHostImpl::manageTiles() |
| 243 { | 249 { |
| 244 DCHECK(m_tileManager); | 250 DCHECK(m_tileManager); |
| 245 m_tileManager->ManageTiles(); | 251 m_tileManager->ManageTiles(); |
| 246 | 252 |
| 247 size_t memoryRequiredBytes; | 253 size_t memoryRequiredBytes; |
| 248 size_t memoryNiceToHaveBytes; | 254 size_t memoryNiceToHaveBytes; |
| 249 size_t memoryUsedBytes; | 255 size_t memoryUsedBytes; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 { | 337 { |
| 332 if (!needsUpdateDrawProperties()) | 338 if (!needsUpdateDrawProperties()) |
| 333 return; | 339 return; |
| 334 | 340 |
| 335 if (!m_renderer) { // For maxTextureSize. | 341 if (!m_renderer) { // For maxTextureSize. |
| 336 // This will get set if renderer gets initialized. | 342 // This will get set if renderer gets initialized. |
| 337 m_needsUpdateDrawProperties = false; | 343 m_needsUpdateDrawProperties = false; |
| 338 return; | 344 return; |
| 339 } | 345 } |
| 340 | 346 |
| 347 if (m_topControlsManager) |
| 348 m_topControlsManager->UpdateDrawPositions(); |
| 341 activeTree()->UpdateDrawProperties(); | 349 activeTree()->UpdateDrawProperties(); |
| 342 if (pendingTree()) | 350 if (pendingTree()) |
| 343 pendingTree()->UpdateDrawProperties(); | 351 pendingTree()->UpdateDrawProperties(); |
| 344 | 352 |
| 345 m_needsUpdateDrawProperties = false; | 353 m_needsUpdateDrawProperties = false; |
| 346 } | 354 } |
| 347 | 355 |
| 348 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 356 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
| 349 { | 357 { |
| 350 renderPassesById[renderPass->id] = renderPass.get(); | 358 renderPassesById[renderPass->id] = renderPass.get(); |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 783 | 791 |
| 784 CompositorFrameMetadata metadata; | 792 CompositorFrameMetadata metadata; |
| 785 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); | 793 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); |
| 786 if (!m_settings.pageScalePinchZoomEnabled) | 794 if (!m_settings.pageScalePinchZoomEnabled) |
| 787 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.page_scale_fac
tor()); | 795 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.page_scale_fac
tor()); |
| 788 metadata.page_scale_factor = m_pinchZoomViewport.total_page_scale_factor(); | 796 metadata.page_scale_factor = m_pinchZoomViewport.total_page_scale_factor(); |
| 789 metadata.viewport_size = m_pinchZoomViewport.Bounds().size(); | 797 metadata.viewport_size = m_pinchZoomViewport.Bounds().size(); |
| 790 metadata.root_layer_size = contentSize(); | 798 metadata.root_layer_size = contentSize(); |
| 791 metadata.min_page_scale_factor = m_pinchZoomViewport.min_page_scale_factor()
; | 799 metadata.min_page_scale_factor = m_pinchZoomViewport.min_page_scale_factor()
; |
| 792 metadata.max_page_scale_factor = m_pinchZoomViewport.max_page_scale_factor()
; | 800 metadata.max_page_scale_factor = m_pinchZoomViewport.max_page_scale_factor()
; |
| 801 if (m_topControlsManager) { |
| 802 metadata.location_bar_offset = gfx::Vector2dF(0.f, m_topControlsManager-
>controls_top_offset()); |
| 803 metadata.content_offset = gfx::Vector2dF(0.f, m_topControlsManager->cont
ent_top_offset()); |
| 804 } |
| 793 | 805 |
| 794 return metadata; | 806 return metadata; |
| 795 } | 807 } |
| 796 | 808 |
| 797 void LayerTreeHostImpl::drawLayers(FrameData& frame) | 809 void LayerTreeHostImpl::drawLayers(FrameData& frame) |
| 798 { | 810 { |
| 799 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); | 811 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); |
| 800 DCHECK(canDraw()); | 812 DCHECK(canDraw()); |
| 801 DCHECK(!frame.renderPasses.empty()); | 813 DCHECK(!frame.renderPasses.empty()); |
| 802 | 814 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 | 921 |
| 910 if (layerImpl->scrollable()) | 922 if (layerImpl->scrollable()) |
| 911 return layerImpl; | 923 return layerImpl; |
| 912 | 924 |
| 913 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()-
>scrollable()) | 925 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()-
>scrollable()) |
| 914 return layerImpl->parent(); | 926 return layerImpl->parent(); |
| 915 | 927 |
| 916 return 0; | 928 return 0; |
| 917 } | 929 } |
| 918 | 930 |
| 931 LayerTreeImpl* LayerTreeHostImpl::activeTree() |
| 932 { |
| 933 return m_activeTree.get(); |
| 934 } |
| 935 |
| 919 void LayerTreeHostImpl::createPendingTree() | 936 void LayerTreeHostImpl::createPendingTree() |
| 920 { | 937 { |
| 921 CHECK(!m_pendingTree); | 938 CHECK(!m_pendingTree); |
| 922 m_pendingTree = LayerTreeImpl::create(this); | 939 m_pendingTree = LayerTreeImpl::create(this); |
| 923 m_client->onCanDrawStateChanged(canDraw()); | 940 m_client->onCanDrawStateChanged(canDraw()); |
| 924 m_client->onHasPendingTreeStateChanged(pendingTree()); | 941 m_client->onHasPendingTreeStateChanged(pendingTree()); |
| 925 } | 942 } |
| 926 | 943 |
| 927 void LayerTreeHostImpl::activatePendingTreeIfNeeded() | 944 void LayerTreeHostImpl::activatePendingTreeIfNeeded() |
| 928 { | 945 { |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1101 updateMaxScrollOffset(); | 1118 updateMaxScrollOffset(); |
| 1102 } | 1119 } |
| 1103 | 1120 |
| 1104 void LayerTreeHostImpl::updateMaxScrollOffset() | 1121 void LayerTreeHostImpl::updateMaxScrollOffset() |
| 1105 { | 1122 { |
| 1106 activeTree()->UpdateMaxScrollOffset(); | 1123 activeTree()->UpdateMaxScrollOffset(); |
| 1107 if (pendingTree()) | 1124 if (pendingTree()) |
| 1108 pendingTree()->UpdateMaxScrollOffset(); | 1125 pendingTree()->UpdateMaxScrollOffset(); |
| 1109 } | 1126 } |
| 1110 | 1127 |
| 1128 void LayerTreeHostImpl::setNeedsUpdateDrawProperties() |
| 1129 { |
| 1130 m_needsUpdateDrawProperties = true; |
| 1131 } |
| 1132 |
| 1111 void LayerTreeHostImpl::setNeedsRedraw() | 1133 void LayerTreeHostImpl::setNeedsRedraw() |
| 1112 { | 1134 { |
| 1113 m_client->setNeedsRedrawOnImplThread(); | 1135 m_client->setNeedsRedrawOnImplThread(); |
| 1114 } | 1136 } |
| 1115 | 1137 |
| 1116 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() | 1138 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() |
| 1117 { | 1139 { |
| 1118 updateDrawProperties(); | 1140 updateDrawProperties(); |
| 1119 return activeTree()->RenderSurfaceLayerList().size(); | 1141 return activeTree()->RenderSurfaceLayerList().size(); |
| 1120 } | 1142 } |
| 1121 | 1143 |
| 1122 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) | 1144 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) |
| 1123 { | 1145 { |
| 1124 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); | 1146 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); |
| 1125 | 1147 |
| 1148 if (m_topControlsManager) |
| 1149 m_topControlsManager->ScrollBegin(); |
| 1150 |
| 1126 DCHECK(!currentlyScrollingLayer()); | 1151 DCHECK(!currentlyScrollingLayer()); |
| 1127 clearCurrentlyScrollingLayer(); | 1152 clearCurrentlyScrollingLayer(); |
| 1128 | 1153 |
| 1129 if (!ensureRenderSurfaceLayerList()) | 1154 if (!ensureRenderSurfaceLayerList()) |
| 1130 return ScrollIgnored; | 1155 return ScrollIgnored; |
| 1131 | 1156 |
| 1132 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); | 1157 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); |
| 1133 | 1158 |
| 1134 // First find out which layer was hit from the saved list of visible layers | 1159 // First find out which layer was hit from the saved list of visible layers |
| 1135 // in the most recent frame. | 1160 // in the most recent frame. |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1248 bool didScroll = false; | 1273 bool didScroll = false; |
| 1249 | 1274 |
| 1250 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { | 1275 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { |
| 1251 if (!layerImpl->scrollable()) | 1276 if (!layerImpl->scrollable()) |
| 1252 continue; | 1277 continue; |
| 1253 | 1278 |
| 1254 PinchZoomViewport* viewport = NULL; | 1279 PinchZoomViewport* viewport = NULL; |
| 1255 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) | 1280 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) |
| 1256 viewport = &m_pinchZoomViewport; | 1281 viewport = &m_pinchZoomViewport; |
| 1257 gfx::Vector2dF appliedDelta; | 1282 gfx::Vector2dF appliedDelta; |
| 1283 if (m_topControlsManager && layerImpl == rootScrollLayer()) |
| 1284 pendingDelta = m_topControlsManager->ScrollBy(pendingDelta); |
| 1285 |
| 1258 if (m_scrollDeltaIsInViewportSpace) { | 1286 if (m_scrollDeltaIsInViewportSpace) { |
| 1259 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; | 1287 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; |
| 1260 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); | 1288 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); |
| 1261 } else | 1289 } else |
| 1262 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); | 1290 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); |
| 1263 | 1291 |
| 1264 // If the layer wasn't able to move, try the next one in the hierarchy. | 1292 // If the layer wasn't able to move, try the next one in the hierarchy. |
| 1265 float moveThresholdSquared = 0.1f * 0.1f; | 1293 float moveThresholdSquared = 0.1f * 0.1f; |
| 1266 if (appliedDelta.LengthSquared() < moveThresholdSquared) | 1294 if (appliedDelta.LengthSquared() < moveThresholdSquared) |
| 1267 continue; | 1295 continue; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1292 return didScroll; | 1320 return didScroll; |
| 1293 } | 1321 } |
| 1294 | 1322 |
| 1295 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() | 1323 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() |
| 1296 { | 1324 { |
| 1297 m_activeTree->ClearCurrentlyScrollingLayer(); | 1325 m_activeTree->ClearCurrentlyScrollingLayer(); |
| 1298 } | 1326 } |
| 1299 | 1327 |
| 1300 void LayerTreeHostImpl::scrollEnd() | 1328 void LayerTreeHostImpl::scrollEnd() |
| 1301 { | 1329 { |
| 1330 if (m_topControlsManager) |
| 1331 m_topControlsManager->ScrollEnd(); |
| 1302 clearCurrentlyScrollingLayer(); | 1332 clearCurrentlyScrollingLayer(); |
| 1303 } | 1333 } |
| 1304 | 1334 |
| 1305 void LayerTreeHostImpl::pinchGestureBegin() | 1335 void LayerTreeHostImpl::pinchGestureBegin() |
| 1306 { | 1336 { |
| 1307 m_pinchGestureActive = true; | 1337 m_pinchGestureActive = true; |
| 1308 m_previousPinchAnchor = gfx::Point(); | 1338 m_previousPinchAnchor = gfx::Point(); |
| 1309 | 1339 |
| 1310 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) | 1340 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) |
| 1311 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); | 1341 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1649 } | 1679 } |
| 1650 | 1680 |
| 1651 skia::RefPtr<SkPicture> LayerTreeHostImpl::capturePicture() | 1681 skia::RefPtr<SkPicture> LayerTreeHostImpl::capturePicture() |
| 1652 { | 1682 { |
| 1653 LayerTreeImpl* tree = pendingTree() ? pendingTree() : activeTree(); | 1683 LayerTreeImpl* tree = pendingTree() ? pendingTree() : activeTree(); |
| 1654 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); | 1684 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); |
| 1655 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); | 1685 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); |
| 1656 } | 1686 } |
| 1657 | 1687 |
| 1658 } // namespace cc | 1688 } // namespace cc |
| OLD | NEW |