| 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 , m_cumulativeNumLayersDrawn(0) | 149 , m_cumulativeNumLayersDrawn(0) |
| 149 , m_cumulativeNumMissingTiles(0) | 150 , m_cumulativeNumMissingTiles(0) |
| 150 , m_lastSentMemoryVisibleBytes(0) | 151 , m_lastSentMemoryVisibleBytes(0) |
| 151 , m_lastSentMemoryVisibleAndNearbyBytes(0) | 152 , m_lastSentMemoryVisibleAndNearbyBytes(0) |
| 152 , m_lastSentMemoryUseBytes(0) | 153 , m_lastSentMemoryUseBytes(0) |
| 153 , m_animationRegistrar(AnimationRegistrar::create()) | 154 , m_animationRegistrar(AnimationRegistrar::create()) |
| 154 { | 155 { |
| 155 DCHECK(m_proxy->isImplThread()); | 156 DCHECK(m_proxy->isImplThread()); |
| 156 didVisibilityChange(this, m_visible); | 157 didVisibilityChange(this, m_visible); |
| 157 | 158 |
| 159 if (settings.calculateTopControlsPosition) |
| 160 m_topControlsManager = TopControlsManager::Create(this, settings.topCont
rolsHeightPx); |
| 161 |
| 158 // LTHI always has an active tree. | 162 // LTHI always has an active tree. |
| 159 m_activeTree = LayerTreeImpl::create(this); | 163 m_activeTree = LayerTreeImpl::create(this); |
| 160 } | 164 } |
| 161 | 165 |
| 162 LayerTreeHostImpl::~LayerTreeHostImpl() | 166 LayerTreeHostImpl::~LayerTreeHostImpl() |
| 163 { | 167 { |
| 164 DCHECK(m_proxy->isImplThread()); | 168 DCHECK(m_proxy->isImplThread()); |
| 165 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); | 169 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); |
| 166 | 170 |
| 167 if (rootLayer()) { | 171 if (rootLayer()) { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 OutputSurface* LayerTreeHostImpl::outputSurface() const | 227 OutputSurface* LayerTreeHostImpl::outputSurface() const |
| 224 { | 228 { |
| 225 return m_outputSurface.get(); | 229 return m_outputSurface.get(); |
| 226 } | 230 } |
| 227 | 231 |
| 228 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) | 232 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) |
| 229 { | 233 { |
| 230 animatePageScale(monotonicTime); | 234 animatePageScale(monotonicTime); |
| 231 animateLayers(monotonicTime, wallClockTime); | 235 animateLayers(monotonicTime, wallClockTime); |
| 232 animateScrollbars(monotonicTime); | 236 animateScrollbars(monotonicTime); |
| 237 if (m_topControlsManager) |
| 238 m_topControlsManager->Animate(monotonicTime); |
| 233 } | 239 } |
| 234 | 240 |
| 235 void LayerTreeHostImpl::manageTiles() | 241 void LayerTreeHostImpl::manageTiles() |
| 236 { | 242 { |
| 237 DCHECK(m_tileManager); | 243 DCHECK(m_tileManager); |
| 238 m_tileManager->ManageTiles(); | 244 m_tileManager->ManageTiles(); |
| 239 | 245 |
| 240 size_t memoryRequiredBytes; | 246 size_t memoryRequiredBytes; |
| 241 size_t memoryNiceToHaveBytes; | 247 size_t memoryNiceToHaveBytes; |
| 242 size_t memoryUsedBytes; | 248 size_t memoryUsedBytes; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 { | 330 { |
| 325 if (!needsUpdateDrawProperties()) | 331 if (!needsUpdateDrawProperties()) |
| 326 return; | 332 return; |
| 327 | 333 |
| 328 if (!m_renderer) { // For maxTextureSize. | 334 if (!m_renderer) { // For maxTextureSize. |
| 329 // This will get set if renderer gets initialized. | 335 // This will get set if renderer gets initialized. |
| 330 m_needsUpdateDrawProperties = false; | 336 m_needsUpdateDrawProperties = false; |
| 331 return; | 337 return; |
| 332 } | 338 } |
| 333 | 339 |
| 340 if (m_topControlsManager) |
| 341 m_topControlsManager->UpdateDrawPositions(); |
| 334 activeTree()->UpdateDrawProperties(); | 342 activeTree()->UpdateDrawProperties(); |
| 335 if (pendingTree()) | 343 if (pendingTree()) |
| 336 pendingTree()->UpdateDrawProperties(); | 344 pendingTree()->UpdateDrawProperties(); |
| 337 | 345 |
| 338 m_needsUpdateDrawProperties = false; | 346 m_needsUpdateDrawProperties = false; |
| 339 } | 347 } |
| 340 | 348 |
| 341 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 349 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
| 342 { | 350 { |
| 343 renderPassesById[renderPass->id] = renderPass.get(); | 351 renderPassesById[renderPass->id] = renderPass.get(); |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 | 773 |
| 766 CompositorFrameMetadata metadata; | 774 CompositorFrameMetadata metadata; |
| 767 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); | 775 metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScroll
Layer()->scrollDelta(); |
| 768 if (!m_settings.pageScalePinchZoomEnabled) | 776 if (!m_settings.pageScalePinchZoomEnabled) |
| 769 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.page_scale_fac
tor()); | 777 metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.page_scale_fac
tor()); |
| 770 metadata.page_scale_factor = m_pinchZoomViewport.total_page_scale_factor(); | 778 metadata.page_scale_factor = m_pinchZoomViewport.total_page_scale_factor(); |
| 771 metadata.viewport_size = m_pinchZoomViewport.Bounds().size(); | 779 metadata.viewport_size = m_pinchZoomViewport.Bounds().size(); |
| 772 metadata.root_layer_size = contentSize(); | 780 metadata.root_layer_size = contentSize(); |
| 773 metadata.min_page_scale_factor = m_pinchZoomViewport.min_page_scale_factor()
; | 781 metadata.min_page_scale_factor = m_pinchZoomViewport.min_page_scale_factor()
; |
| 774 metadata.max_page_scale_factor = m_pinchZoomViewport.max_page_scale_factor()
; | 782 metadata.max_page_scale_factor = m_pinchZoomViewport.max_page_scale_factor()
; |
| 783 if (m_topControlsManager) { |
| 784 metadata.location_bar_offset = gfx::Vector2dF(0.f, m_topControlsManager-
>controls_top_offset()); |
| 785 metadata.location_bar_content_translation = gfx::Vector2dF(0.f, m_topCon
trolsManager->content_top_offset()); |
| 786 } |
| 775 | 787 |
| 776 return metadata; | 788 return metadata; |
| 777 } | 789 } |
| 778 | 790 |
| 779 void LayerTreeHostImpl::drawLayers(FrameData& frame) | 791 void LayerTreeHostImpl::drawLayers(FrameData& frame) |
| 780 { | 792 { |
| 781 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); | 793 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); |
| 782 DCHECK(canDraw()); | 794 DCHECK(canDraw()); |
| 783 DCHECK(!frame.renderPasses.empty()); | 795 DCHECK(!frame.renderPasses.empty()); |
| 784 | 796 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 891 | 903 |
| 892 if (layerImpl->scrollable()) | 904 if (layerImpl->scrollable()) |
| 893 return layerImpl; | 905 return layerImpl; |
| 894 | 906 |
| 895 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()-
>scrollable()) | 907 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()-
>scrollable()) |
| 896 return layerImpl->parent(); | 908 return layerImpl->parent(); |
| 897 | 909 |
| 898 return 0; | 910 return 0; |
| 899 } | 911 } |
| 900 | 912 |
| 913 LayerTreeImpl* LayerTreeHostImpl::activeTree() |
| 914 { |
| 915 return m_activeTree.get(); |
| 916 } |
| 917 |
| 901 void LayerTreeHostImpl::createPendingTree() | 918 void LayerTreeHostImpl::createPendingTree() |
| 902 { | 919 { |
| 903 CHECK(!m_pendingTree); | 920 CHECK(!m_pendingTree); |
| 904 m_pendingTree = LayerTreeImpl::create(this); | 921 m_pendingTree = LayerTreeImpl::create(this); |
| 905 m_client->onCanDrawStateChanged(canDraw()); | 922 m_client->onCanDrawStateChanged(canDraw()); |
| 906 m_client->onHasPendingTreeStateChanged(pendingTree()); | 923 m_client->onHasPendingTreeStateChanged(pendingTree()); |
| 907 } | 924 } |
| 908 | 925 |
| 909 void LayerTreeHostImpl::checkForCompletedSetPixels() | 926 void LayerTreeHostImpl::checkForCompletedSetPixels() |
| 910 { | 927 { |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1091 updateMaxScrollOffset(); | 1108 updateMaxScrollOffset(); |
| 1092 } | 1109 } |
| 1093 | 1110 |
| 1094 void LayerTreeHostImpl::updateMaxScrollOffset() | 1111 void LayerTreeHostImpl::updateMaxScrollOffset() |
| 1095 { | 1112 { |
| 1096 activeTree()->UpdateMaxScrollOffset(); | 1113 activeTree()->UpdateMaxScrollOffset(); |
| 1097 if (pendingTree()) | 1114 if (pendingTree()) |
| 1098 pendingTree()->UpdateMaxScrollOffset(); | 1115 pendingTree()->UpdateMaxScrollOffset(); |
| 1099 } | 1116 } |
| 1100 | 1117 |
| 1118 void LayerTreeHostImpl::setNeedsUpdateDrawProperties() |
| 1119 { |
| 1120 m_needsUpdateDrawProperties = true; |
| 1121 } |
| 1122 |
| 1101 void LayerTreeHostImpl::setNeedsRedraw() | 1123 void LayerTreeHostImpl::setNeedsRedraw() |
| 1102 { | 1124 { |
| 1103 m_client->setNeedsRedrawOnImplThread(); | 1125 m_client->setNeedsRedrawOnImplThread(); |
| 1104 } | 1126 } |
| 1105 | 1127 |
| 1106 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() | 1128 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() |
| 1107 { | 1129 { |
| 1108 updateDrawProperties(); | 1130 updateDrawProperties(); |
| 1109 return activeTree()->RenderSurfaceLayerList().size(); | 1131 return activeTree()->RenderSurfaceLayerList().size(); |
| 1110 } | 1132 } |
| 1111 | 1133 |
| 1112 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) | 1134 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) |
| 1113 { | 1135 { |
| 1114 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); | 1136 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); |
| 1115 | 1137 |
| 1138 if (m_topControlsManager) |
| 1139 m_topControlsManager->ScrollBegin(); |
| 1140 |
| 1116 DCHECK(!currentlyScrollingLayer()); | 1141 DCHECK(!currentlyScrollingLayer()); |
| 1117 clearCurrentlyScrollingLayer(); | 1142 clearCurrentlyScrollingLayer(); |
| 1118 | 1143 |
| 1119 if (!ensureRenderSurfaceLayerList()) | 1144 if (!ensureRenderSurfaceLayerList()) |
| 1120 return ScrollIgnored; | 1145 return ScrollIgnored; |
| 1121 | 1146 |
| 1122 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); | 1147 gfx::PointF deviceViewportPoint = gfx::ScalePoint(viewportPoint, m_deviceSca
leFactor); |
| 1123 | 1148 |
| 1124 // First find out which layer was hit from the saved list of visible layers | 1149 // First find out which layer was hit from the saved list of visible layers |
| 1125 // in the most recent frame. | 1150 // in the most recent frame. |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1238 bool didScroll = false; | 1263 bool didScroll = false; |
| 1239 | 1264 |
| 1240 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { | 1265 for (LayerImpl* layerImpl = currentlyScrollingLayer(); layerImpl; layerImpl
= layerImpl->parent()) { |
| 1241 if (!layerImpl->scrollable()) | 1266 if (!layerImpl->scrollable()) |
| 1242 continue; | 1267 continue; |
| 1243 | 1268 |
| 1244 PinchZoomViewport* viewport = NULL; | 1269 PinchZoomViewport* viewport = NULL; |
| 1245 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) | 1270 if (m_settings.pageScalePinchZoomEnabled && layerImpl == rootScrollLayer
()) |
| 1246 viewport = &m_pinchZoomViewport; | 1271 viewport = &m_pinchZoomViewport; |
| 1247 gfx::Vector2dF appliedDelta; | 1272 gfx::Vector2dF appliedDelta; |
| 1273 if (m_topControlsManager && layerImpl == rootScrollLayer()) |
| 1274 pendingDelta = m_topControlsManager->ScrollBy(pendingDelta); |
| 1275 |
| 1248 if (m_scrollDeltaIsInViewportSpace) { | 1276 if (m_scrollDeltaIsInViewportSpace) { |
| 1249 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; | 1277 float scaleFromViewportToScreenSpace = m_deviceScaleFactor; |
| 1250 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); | 1278 appliedDelta = scrollLayerWithViewportSpaceDelta(viewport, *layerImp
l, scaleFromViewportToScreenSpace, viewportPoint, pendingDelta); |
| 1251 } else | 1279 } else |
| 1252 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); | 1280 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); |
| 1253 | 1281 |
| 1254 // If the layer wasn't able to move, try the next one in the hierarchy. | 1282 // If the layer wasn't able to move, try the next one in the hierarchy. |
| 1255 float moveThresholdSquared = 0.1f * 0.1f; | 1283 float moveThresholdSquared = 0.1f * 0.1f; |
| 1256 if (appliedDelta.LengthSquared() < moveThresholdSquared) | 1284 if (appliedDelta.LengthSquared() < moveThresholdSquared) |
| 1257 continue; | 1285 continue; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1282 return didScroll; | 1310 return didScroll; |
| 1283 } | 1311 } |
| 1284 | 1312 |
| 1285 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() | 1313 void LayerTreeHostImpl::clearCurrentlyScrollingLayer() |
| 1286 { | 1314 { |
| 1287 m_activeTree->ClearCurrentlyScrollingLayer(); | 1315 m_activeTree->ClearCurrentlyScrollingLayer(); |
| 1288 } | 1316 } |
| 1289 | 1317 |
| 1290 void LayerTreeHostImpl::scrollEnd() | 1318 void LayerTreeHostImpl::scrollEnd() |
| 1291 { | 1319 { |
| 1320 if (m_topControlsManager) |
| 1321 m_topControlsManager->ScrollEnd(); |
| 1292 clearCurrentlyScrollingLayer(); | 1322 clearCurrentlyScrollingLayer(); |
| 1293 } | 1323 } |
| 1294 | 1324 |
| 1295 void LayerTreeHostImpl::pinchGestureBegin() | 1325 void LayerTreeHostImpl::pinchGestureBegin() |
| 1296 { | 1326 { |
| 1297 m_pinchGestureActive = true; | 1327 m_pinchGestureActive = true; |
| 1298 m_previousPinchAnchor = gfx::Point(); | 1328 m_previousPinchAnchor = gfx::Point(); |
| 1299 | 1329 |
| 1300 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) | 1330 if (rootScrollLayer() && rootScrollLayer()->scrollbarAnimationController()) |
| 1301 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); | 1331 rootScrollLayer()->scrollbarAnimationController()->didPinchGestureBegin(
); |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1639 } | 1669 } |
| 1640 | 1670 |
| 1641 skia::RefPtr<SkPicture> LayerTreeHostImpl::capturePicture() | 1671 skia::RefPtr<SkPicture> LayerTreeHostImpl::capturePicture() |
| 1642 { | 1672 { |
| 1643 LayerTreeImpl* tree = pendingTree() ? pendingTree() : activeTree(); | 1673 LayerTreeImpl* tree = pendingTree() ? pendingTree() : activeTree(); |
| 1644 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); | 1674 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); |
| 1645 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); | 1675 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); |
| 1646 } | 1676 } |
| 1647 | 1677 |
| 1648 } // namespace cc | 1678 } // namespace cc |
| OLD | NEW |