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" |
11 #include "base/json/json_writer.h" | 11 #include "base/json/json_writer.h" |
12 #include "base/stl_util.h" | |
13 #include "cc/append_quads_data.h" | 12 #include "cc/append_quads_data.h" |
14 #include "cc/damage_tracker.h" | 13 #include "cc/damage_tracker.h" |
15 #include "cc/debug_rect_history.h" | 14 #include "cc/debug_rect_history.h" |
16 #include "cc/delay_based_time_source.h" | 15 #include "cc/delay_based_time_source.h" |
17 #include "cc/delegating_renderer.h" | 16 #include "cc/delegating_renderer.h" |
18 #include "cc/frame_rate_counter.h" | 17 #include "cc/frame_rate_counter.h" |
19 #include "cc/gl_renderer.h" | 18 #include "cc/gl_renderer.h" |
20 #include "cc/heads_up_display_layer_impl.h" | 19 #include "cc/heads_up_display_layer_impl.h" |
21 #include "cc/layer_iterator.h" | 20 #include "cc/layer_iterator.h" |
22 #include "cc/layer_tree_host.h" | 21 #include "cc/layer_tree_host.h" |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 , m_debugState(settings.initialDebugState) | 211 , m_debugState(settings.initialDebugState) |
213 , m_deviceScaleFactor(1) | 212 , m_deviceScaleFactor(1) |
214 , m_visible(true) | 213 , m_visible(true) |
215 , m_contentsTexturesPurged(false) | 214 , m_contentsTexturesPurged(false) |
216 , m_managedMemoryPolicy(PrioritizedResourceManager::defaultMemoryAllocationL
imit(), | 215 , m_managedMemoryPolicy(PrioritizedResourceManager::defaultMemoryAllocationL
imit(), |
217 PriorityCalculator::allowEverythingCutoff(), | 216 PriorityCalculator::allowEverythingCutoff(), |
218 0, | 217 0, |
219 PriorityCalculator::allowNothingCutoff()) | 218 PriorityCalculator::allowNothingCutoff()) |
220 , m_backgroundColor(0) | 219 , m_backgroundColor(0) |
221 , m_hasTransparentBackground(false) | 220 , m_hasTransparentBackground(false) |
| 221 , m_needsAnimateLayers(false) |
222 , m_pinchGestureActive(false) | 222 , m_pinchGestureActive(false) |
223 , m_fpsCounter(FrameRateCounter::create(m_proxy->hasImplThread())) | 223 , m_fpsCounter(FrameRateCounter::create(m_proxy->hasImplThread())) |
224 , m_debugRectHistory(DebugRectHistory::create()) | 224 , m_debugRectHistory(DebugRectHistory::create()) |
225 , m_numImplThreadScrolls(0) | 225 , m_numImplThreadScrolls(0) |
226 , m_numMainThreadScrolls(0) | 226 , m_numMainThreadScrolls(0) |
227 , m_cumulativeNumLayersDrawn(0) | 227 , m_cumulativeNumLayersDrawn(0) |
228 , m_cumulativeNumMissingTiles(0) | 228 , m_cumulativeNumMissingTiles(0) |
229 , m_lastSentMemoryVisibleBytes(0) | 229 , m_lastSentMemoryVisibleBytes(0) |
230 , m_lastSentMemoryVisibleAndNearbyBytes(0) | 230 , m_lastSentMemoryVisibleAndNearbyBytes(0) |
231 , m_lastSentMemoryUseBytes(0) | 231 , m_lastSentMemoryUseBytes(0) |
232 { | 232 { |
233 DCHECK(m_proxy->isImplThread()); | 233 DCHECK(m_proxy->isImplThread()); |
234 didVisibilityChange(this, m_visible); | 234 didVisibilityChange(this, m_visible); |
235 | 235 |
236 // TODO(nduca): For now, assume we have an active tree. This will be removed | 236 // TODO(nduca): For now, assume we have an active tree. This will be removed |
237 // in future patches. | 237 // in future patches. |
238 m_activeTree = LayerTreeImpl::create(this); | 238 m_activeTree = LayerTreeImpl::create(this); |
239 } | 239 } |
240 | 240 |
241 LayerTreeHostImpl::~LayerTreeHostImpl() | 241 LayerTreeHostImpl::~LayerTreeHostImpl() |
242 { | 242 { |
243 DCHECK(m_proxy->isImplThread()); | 243 DCHECK(m_proxy->isImplThread()); |
244 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); | 244 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); |
245 | 245 |
246 if (rootLayer()) { | 246 if (rootLayer()) |
247 clearRenderSurfaces(); | 247 clearRenderSurfaces(); |
248 // The layer trees must be destroyed before the layer tree host. We've | |
249 // made a contract with our animation controllers that the registrar | |
250 // will outlive them, and we must make good. | |
251 m_activeTree.reset(); | |
252 } | |
253 } | 248 } |
254 | 249 |
255 void LayerTreeHostImpl::beginCommit() | 250 void LayerTreeHostImpl::beginCommit() |
256 { | 251 { |
257 } | 252 } |
258 | 253 |
259 void LayerTreeHostImpl::commitComplete() | 254 void LayerTreeHostImpl::commitComplete() |
260 { | 255 { |
261 TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete"); | 256 TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete"); |
262 // Recompute max scroll position; must be after layer content bounds are | 257 // Recompute max scroll position; must be after layer content bounds are |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 if (drawFrame) | 585 if (drawFrame) |
591 occlusionTracker.overdrawMetrics().recordMetrics(this); | 586 occlusionTracker.overdrawMetrics().recordMetrics(this); |
592 | 587 |
593 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); | 588 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); |
594 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); | 589 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); |
595 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); | 590 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); |
596 | 591 |
597 return drawFrame; | 592 return drawFrame; |
598 } | 593 } |
599 | 594 |
| 595 void LayerTreeHostImpl::animateLayersRecursive(LayerImpl* current, base::TimeTic
ks monotonicTime, base::Time wallClockTime, AnimationEventsVector* events, bool&
didAnimate, bool& needsAnimateLayers) |
| 596 { |
| 597 bool subtreeNeedsAnimateLayers = false; |
| 598 |
| 599 LayerAnimationController* currentController = current->layerAnimationControl
ler(); |
| 600 |
| 601 bool hadActiveAnimation = currentController->hasActiveAnimation(); |
| 602 double monotonicTimeSeconds = (monotonicTime - base::TimeTicks()).InSecondsF
(); |
| 603 currentController->animate(monotonicTimeSeconds, events); |
| 604 bool startedAnimation = events->size() > 0; |
| 605 |
| 606 // We animated if we either ticked a running animation, or started a new ani
mation. |
| 607 if (hadActiveAnimation || startedAnimation) |
| 608 didAnimate = true; |
| 609 |
| 610 // If the current controller still has an active animation, we must continue
animating layers. |
| 611 if (currentController->hasActiveAnimation()) |
| 612 subtreeNeedsAnimateLayers = true; |
| 613 |
| 614 for (size_t i = 0; i < current->children().size(); ++i) { |
| 615 bool childNeedsAnimateLayers = false; |
| 616 animateLayersRecursive(current->children()[i], monotonicTime, wallClockT
ime, events, didAnimate, childNeedsAnimateLayers); |
| 617 if (childNeedsAnimateLayers) |
| 618 subtreeNeedsAnimateLayers = true; |
| 619 } |
| 620 |
| 621 needsAnimateLayers = subtreeNeedsAnimateLayers; |
| 622 } |
| 623 |
600 void LayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled) | 624 void LayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled) |
601 { | 625 { |
602 // Lazily create the timeSource adapter so that we can vary the interval for
testing. | 626 // Lazily create the timeSource adapter so that we can vary the interval for
testing. |
603 if (!m_timeSourceClientAdapter) | 627 if (!m_timeSourceClientAdapter) |
604 m_timeSourceClientAdapter = LayerTreeHostImplTimeSourceAdapter::create(t
his, DelayBasedTimeSource::create(lowFrequencyAnimationInterval(), m_proxy->curr
entThread())); | 628 m_timeSourceClientAdapter = LayerTreeHostImplTimeSourceAdapter::create(t
his, DelayBasedTimeSource::create(lowFrequencyAnimationInterval(), m_proxy->curr
entThread())); |
605 | 629 |
606 m_timeSourceClientAdapter->setActive(enabled); | 630 m_timeSourceClientAdapter->setActive(enabled); |
607 } | 631 } |
608 | 632 |
609 gfx::Size LayerTreeHostImpl::contentSize() const | 633 gfx::Size LayerTreeHostImpl::contentSize() const |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
946 return; | 970 return; |
947 m_visible = visible; | 971 m_visible = visible; |
948 didVisibilityChange(this, m_visible); | 972 didVisibilityChange(this, m_visible); |
949 enforceManagedMemoryPolicy(m_managedMemoryPolicy); | 973 enforceManagedMemoryPolicy(m_managedMemoryPolicy); |
950 | 974 |
951 if (!m_renderer) | 975 if (!m_renderer) |
952 return; | 976 return; |
953 | 977 |
954 m_renderer->setVisible(visible); | 978 m_renderer->setVisible(visible); |
955 | 979 |
956 setBackgroundTickingEnabled(!m_visible && !m_activeAnimationControllers.empt
y()); | 980 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers); |
957 } | 981 } |
958 | 982 |
959 bool LayerTreeHostImpl::initializeRenderer(scoped_ptr<OutputSurface> outputSurfa
ce) | 983 bool LayerTreeHostImpl::initializeRenderer(scoped_ptr<OutputSurface> outputSurfa
ce) |
960 { | 984 { |
961 // Since we will create a new resource provider, we cannot continue to use | 985 // Since we will create a new resource provider, we cannot continue to use |
962 // the old resources (i.e. renderSurfaces and texture IDs). Clear them | 986 // the old resources (i.e. renderSurfaces and texture IDs). Clear them |
963 // before we destroy the old resource provider. | 987 // before we destroy the old resource provider. |
964 if (rootLayer()) { | 988 if (rootLayer()) { |
965 clearRenderSurfaces(); | 989 clearRenderSurfaces(); |
966 sendDidLoseOutputSurfaceRecursive(rootLayer()); | 990 sendDidLoseOutputSurfaceRecursive(rootLayer()); |
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1501 m_client->setNeedsRedrawOnImplThread(); | 1525 m_client->setNeedsRedrawOnImplThread(); |
1502 | 1526 |
1503 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { | 1527 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { |
1504 m_pageScaleAnimation.reset(); | 1528 m_pageScaleAnimation.reset(); |
1505 m_client->setNeedsCommitOnImplThread(); | 1529 m_client->setNeedsCommitOnImplThread(); |
1506 } | 1530 } |
1507 } | 1531 } |
1508 | 1532 |
1509 void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time
wallClockTime) | 1533 void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time
wallClockTime) |
1510 { | 1534 { |
1511 if (!m_settings.acceleratedAnimationEnabled || m_activeAnimationControllers.
empty() || !rootLayer()) | 1535 if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers || !roo
tLayer()) |
1512 return; | 1536 return; |
1513 | 1537 |
1514 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); | 1538 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); |
1515 | 1539 |
1516 double monotonicSeconds = (monotonicTime - base::TimeTicks()).InSecondsF(); | 1540 scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEvents
Vector)); |
1517 | 1541 |
1518 scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEvents
Vector)); | 1542 bool didAnimate = false; |
1519 AnimationControllerSet copy = m_activeAnimationControllers; | 1543 animateLayersRecursive(rootLayer(), monotonicTime, wallClockTime, events.get
(), didAnimate, m_needsAnimateLayers); |
1520 for (AnimationControllerSet::iterator iter = copy.begin(); iter != copy.end(
); ++iter) | |
1521 (*iter)->animate(monotonicSeconds, events.get()); | |
1522 | 1544 |
1523 if (!events->empty()) | 1545 if (!events->empty()) |
1524 m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wal
lClockTime); | 1546 m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wal
lClockTime); |
1525 | 1547 |
1526 m_client->setNeedsRedrawOnImplThread(); | 1548 if (didAnimate) |
1527 setBackgroundTickingEnabled(!m_visible && !m_activeAnimationControllers.empt
y()); | 1549 m_client->setNeedsRedrawOnImplThread(); |
| 1550 |
| 1551 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers); |
1528 } | 1552 } |
1529 | 1553 |
1530 base::TimeDelta LayerTreeHostImpl::lowFrequencyAnimationInterval() const | 1554 base::TimeDelta LayerTreeHostImpl::lowFrequencyAnimationInterval() const |
1531 { | 1555 { |
1532 return base::TimeDelta::FromSeconds(1); | 1556 return base::TimeDelta::FromSeconds(1); |
1533 } | 1557 } |
1534 | 1558 |
1535 void LayerTreeHostImpl::sendDidLoseOutputSurfaceRecursive(LayerImpl* current) | 1559 void LayerTreeHostImpl::sendDidLoseOutputSurfaceRecursive(LayerImpl* current) |
1536 { | 1560 { |
1537 DCHECK(current); | 1561 DCHECK(current); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1647 | 1671 |
1648 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1672 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
1649 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1673 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
1650 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1674 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
1651 m_client->setNeedsRedrawOnImplThread(); | 1675 m_client->setNeedsRedrawOnImplThread(); |
1652 | 1676 |
1653 for (size_t i = 0; i < layer->children().size(); ++i) | 1677 for (size_t i = 0; i < layer->children().size(); ++i) |
1654 animateScrollbarsRecursive(layer->children()[i], time); | 1678 animateScrollbarsRecursive(layer->children()[i], time); |
1655 } | 1679 } |
1656 | 1680 |
1657 void LayerTreeHostImpl::DidActivateAnimationController(LayerAnimationController*
controller) { | |
1658 m_activeAnimationControllers.insert(controller); | |
1659 } | |
1660 | |
1661 void LayerTreeHostImpl::DidDeactivateAnimationController(LayerAnimationControlle
r* controller) { | |
1662 if (ContainsKey(m_activeAnimationControllers, controller)) | |
1663 m_activeAnimationControllers.erase(controller); | |
1664 } | |
1665 | |
1666 void LayerTreeHostImpl::RegisterAnimationController(LayerAnimationController* co
ntroller) { | |
1667 #if !defined(NDEBUG) | |
1668 m_allAnimationControllers.insert(controller); | |
1669 #endif | |
1670 } | |
1671 | |
1672 void LayerTreeHostImpl::UnregisterAnimationController(LayerAnimationController*
controller) { | |
1673 #if !defined(NDEBUG) | |
1674 if (ContainsKey(m_allAnimationControllers, controller)) | |
1675 m_allAnimationControllers.erase(controller); | |
1676 #endif | |
1677 DidDeactivateAnimationController(controller); | |
1678 } | |
1679 | |
1680 } // namespace cc | 1681 } // namespace cc |
OLD | NEW |