| 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/stl_util.h" |
| 11 #include "cc/append_quads_data.h" | 12 #include "cc/append_quads_data.h" |
| 12 #include "cc/damage_tracker.h" | 13 #include "cc/damage_tracker.h" |
| 13 #include "cc/debug_rect_history.h" | 14 #include "cc/debug_rect_history.h" |
| 14 #include "cc/delay_based_time_source.h" | 15 #include "cc/delay_based_time_source.h" |
| 15 #include "cc/font_atlas.h" | 16 #include "cc/font_atlas.h" |
| 16 #include "cc/frame_rate_counter.h" | 17 #include "cc/frame_rate_counter.h" |
| 17 #include "cc/gl_renderer.h" | 18 #include "cc/gl_renderer.h" |
| 18 #include "cc/heads_up_display_layer_impl.h" | 19 #include "cc/heads_up_display_layer_impl.h" |
| 19 #include "cc/layer_iterator.h" | 20 #include "cc/layer_iterator.h" |
| 20 #include "cc/layer_tree_host.h" | 21 #include "cc/layer_tree_host.h" |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 , m_settings(settings) | 214 , m_settings(settings) |
| 214 , m_deviceScaleFactor(1) | 215 , m_deviceScaleFactor(1) |
| 215 , m_visible(true) | 216 , m_visible(true) |
| 216 , m_contentsTexturesPurged(false) | 217 , m_contentsTexturesPurged(false) |
| 217 , m_managedMemoryPolicy(PrioritizedResourceManager::defaultMemoryAllocationL
imit(), | 218 , m_managedMemoryPolicy(PrioritizedResourceManager::defaultMemoryAllocationL
imit(), |
| 218 PriorityCalculator::allowEverythingCutoff(), | 219 PriorityCalculator::allowEverythingCutoff(), |
| 219 0, | 220 0, |
| 220 PriorityCalculator::allowNothingCutoff()) | 221 PriorityCalculator::allowNothingCutoff()) |
| 221 , m_backgroundColor(0) | 222 , m_backgroundColor(0) |
| 222 , m_hasTransparentBackground(false) | 223 , m_hasTransparentBackground(false) |
| 223 , m_needsAnimateLayers(false) | |
| 224 , m_pinchGestureActive(false) | 224 , m_pinchGestureActive(false) |
| 225 , m_fpsCounter(FrameRateCounter::create(m_proxy->hasImplThread())) | 225 , m_fpsCounter(FrameRateCounter::create(m_proxy->hasImplThread())) |
| 226 , m_debugRectHistory(DebugRectHistory::create()) | 226 , m_debugRectHistory(DebugRectHistory::create()) |
| 227 , m_numImplThreadScrolls(0) | 227 , m_numImplThreadScrolls(0) |
| 228 , m_numMainThreadScrolls(0) | 228 , m_numMainThreadScrolls(0) |
| 229 , m_cumulativeNumLayersInLayerTree(0) | 229 , m_cumulativeNumLayersInLayerTree(0) |
| 230 { | 230 { |
| 231 DCHECK(m_proxy->isImplThread()); | 231 DCHECK(m_proxy->isImplThread()); |
| 232 didVisibilityChange(this, m_visible); | 232 didVisibilityChange(this, m_visible); |
| 233 } | 233 } |
| 234 | 234 |
| 235 LayerTreeHostImpl::~LayerTreeHostImpl() | 235 LayerTreeHostImpl::~LayerTreeHostImpl() |
| 236 { | 236 { |
| 237 DCHECK(m_proxy->isImplThread()); | 237 DCHECK(m_proxy->isImplThread()); |
| 238 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); | 238 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); |
| 239 | 239 |
| 240 if (m_rootLayerImpl) | 240 if (m_rootLayerImpl) { |
| 241 clearRenderSurfaces(); | 241 clearRenderSurfaces(); |
| 242 m_rootLayerImpl.release(); |
| 243 } |
| 242 } | 244 } |
| 243 | 245 |
| 244 void LayerTreeHostImpl::beginCommit() | 246 void LayerTreeHostImpl::beginCommit() |
| 245 { | 247 { |
| 246 } | 248 } |
| 247 | 249 |
| 248 void LayerTreeHostImpl::commitComplete() | 250 void LayerTreeHostImpl::commitComplete() |
| 249 { | 251 { |
| 250 TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete"); | 252 TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete"); |
| 251 // Recompute max scroll position; must be after layer content bounds are | 253 // Recompute max scroll position; must be after layer content bounds are |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 if (drawFrame) | 580 if (drawFrame) |
| 579 occlusionTracker.overdrawMetrics().recordMetrics(this); | 581 occlusionTracker.overdrawMetrics().recordMetrics(this); |
| 580 | 582 |
| 581 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); | 583 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); |
| 582 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); | 584 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); |
| 583 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); | 585 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); |
| 584 | 586 |
| 585 return drawFrame; | 587 return drawFrame; |
| 586 } | 588 } |
| 587 | 589 |
| 588 void LayerTreeHostImpl::animateLayersRecursive(LayerImpl* current, base::TimeTic
ks monotonicTime, base::Time wallClockTime, AnimationEventsVector* events, bool&
didAnimate, bool& needsAnimateLayers) | |
| 589 { | |
| 590 bool subtreeNeedsAnimateLayers = false; | |
| 591 | |
| 592 LayerAnimationController* currentController = current->layerAnimationControl
ler(); | |
| 593 | |
| 594 bool hadActiveAnimation = currentController->hasActiveAnimation(); | |
| 595 double monotonicTimeSeconds = (monotonicTime - base::TimeTicks()).InSecondsF
(); | |
| 596 currentController->animate(monotonicTimeSeconds, events); | |
| 597 bool startedAnimation = events->size() > 0; | |
| 598 | |
| 599 // We animated if we either ticked a running animation, or started a new ani
mation. | |
| 600 if (hadActiveAnimation || startedAnimation) | |
| 601 didAnimate = true; | |
| 602 | |
| 603 // If the current controller still has an active animation, we must continue
animating layers. | |
| 604 if (currentController->hasActiveAnimation()) | |
| 605 subtreeNeedsAnimateLayers = true; | |
| 606 | |
| 607 for (size_t i = 0; i < current->children().size(); ++i) { | |
| 608 bool childNeedsAnimateLayers = false; | |
| 609 animateLayersRecursive(current->children()[i], monotonicTime, wallClockT
ime, events, didAnimate, childNeedsAnimateLayers); | |
| 610 if (childNeedsAnimateLayers) | |
| 611 subtreeNeedsAnimateLayers = true; | |
| 612 } | |
| 613 | |
| 614 needsAnimateLayers = subtreeNeedsAnimateLayers; | |
| 615 } | |
| 616 | |
| 617 void LayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled) | 590 void LayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled) |
| 618 { | 591 { |
| 619 // Lazily create the timeSource adapter so that we can vary the interval for
testing. | 592 // Lazily create the timeSource adapter so that we can vary the interval for
testing. |
| 620 if (!m_timeSourceClientAdapter) | 593 if (!m_timeSourceClientAdapter) |
| 621 m_timeSourceClientAdapter = LayerTreeHostImplTimeSourceAdapter::create(t
his, DelayBasedTimeSource::create(lowFrequencyAnimationInterval(), m_proxy->curr
entThread())); | 594 m_timeSourceClientAdapter = LayerTreeHostImplTimeSourceAdapter::create(t
his, DelayBasedTimeSource::create(lowFrequencyAnimationInterval(), m_proxy->curr
entThread())); |
| 622 | 595 |
| 623 m_timeSourceClientAdapter->setActive(enabled); | 596 m_timeSourceClientAdapter->setActive(enabled); |
| 624 } | 597 } |
| 625 | 598 |
| 626 gfx::Size LayerTreeHostImpl::contentSize() const | 599 gfx::Size LayerTreeHostImpl::contentSize() const |
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 974 return; | 947 return; |
| 975 m_visible = visible; | 948 m_visible = visible; |
| 976 didVisibilityChange(this, m_visible); | 949 didVisibilityChange(this, m_visible); |
| 977 enforceManagedMemoryPolicy(m_managedMemoryPolicy); | 950 enforceManagedMemoryPolicy(m_managedMemoryPolicy); |
| 978 | 951 |
| 979 if (!m_renderer) | 952 if (!m_renderer) |
| 980 return; | 953 return; |
| 981 | 954 |
| 982 m_renderer->setVisible(visible); | 955 m_renderer->setVisible(visible); |
| 983 | 956 |
| 984 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers); | 957 setBackgroundTickingEnabled(!m_visible && !m_activeAnimationControllers.empt
y()); |
| 985 } | 958 } |
| 986 | 959 |
| 987 bool LayerTreeHostImpl::initializeRenderer(scoped_ptr<GraphicsContext> context) | 960 bool LayerTreeHostImpl::initializeRenderer(scoped_ptr<GraphicsContext> context) |
| 988 { | 961 { |
| 989 // Since we will create a new resource provider, we cannot continue to use | 962 // Since we will create a new resource provider, we cannot continue to use |
| 990 // the old resources (i.e. renderSurfaces and texture IDs). Clear them | 963 // the old resources (i.e. renderSurfaces and texture IDs). Clear them |
| 991 // before we destroy the old resource provider. | 964 // before we destroy the old resource provider. |
| 992 if (m_rootLayerImpl) { | 965 if (m_rootLayerImpl) { |
| 993 clearRenderSurfaces(); | 966 clearRenderSurfaces(); |
| 994 sendDidLoseContextRecursive(m_rootLayerImpl.get()); | 967 sendDidLoseContextRecursive(m_rootLayerImpl.get()); |
| (...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1525 m_client->setNeedsRedrawOnImplThread(); | 1498 m_client->setNeedsRedrawOnImplThread(); |
| 1526 | 1499 |
| 1527 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { | 1500 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { |
| 1528 m_pageScaleAnimation.reset(); | 1501 m_pageScaleAnimation.reset(); |
| 1529 m_client->setNeedsCommitOnImplThread(); | 1502 m_client->setNeedsCommitOnImplThread(); |
| 1530 } | 1503 } |
| 1531 } | 1504 } |
| 1532 | 1505 |
| 1533 void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time
wallClockTime) | 1506 void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time
wallClockTime) |
| 1534 { | 1507 { |
| 1535 if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers || !m_r
ootLayerImpl) | 1508 if (!m_settings.acceleratedAnimationEnabled || m_activeAnimationControllers.
empty() || !m_rootLayerImpl) |
| 1536 return; | 1509 return; |
| 1537 | 1510 |
| 1538 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); | 1511 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); |
| 1539 | 1512 |
| 1513 double monotonicSeconds = (monotonicTime - base::TimeTicks()).InSecondsF(); |
| 1514 |
| 1540 scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEvents
Vector)); | 1515 scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEvents
Vector)); |
| 1541 | 1516 AnimationControllerSet copy = m_activeAnimationControllers; |
| 1542 bool didAnimate = false; | 1517 for (AnimationControllerSet::iterator iter = copy.begin(); iter != copy.end(
); ++iter) |
| 1543 animateLayersRecursive(m_rootLayerImpl.get(), monotonicTime, wallClockTime,
events.get(), didAnimate, m_needsAnimateLayers); | 1518 (*iter)->animate(monotonicSeconds, events.get()); |
| 1544 | 1519 |
| 1545 if (!events->empty()) | 1520 if (!events->empty()) |
| 1546 m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wal
lClockTime); | 1521 m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wal
lClockTime); |
| 1547 | 1522 |
| 1548 if (didAnimate) | 1523 m_client->setNeedsRedrawOnImplThread(); |
| 1549 m_client->setNeedsRedrawOnImplThread(); | 1524 setBackgroundTickingEnabled(!m_visible && !m_activeAnimationControllers.empt
y()); |
| 1550 | |
| 1551 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers); | |
| 1552 } | 1525 } |
| 1553 | 1526 |
| 1554 base::TimeDelta LayerTreeHostImpl::lowFrequencyAnimationInterval() const | 1527 base::TimeDelta LayerTreeHostImpl::lowFrequencyAnimationInterval() const |
| 1555 { | 1528 { |
| 1556 return base::TimeDelta::FromSeconds(1); | 1529 return base::TimeDelta::FromSeconds(1); |
| 1557 } | 1530 } |
| 1558 | 1531 |
| 1559 void LayerTreeHostImpl::sendDidLoseContextRecursive(LayerImpl* current) | 1532 void LayerTreeHostImpl::sendDidLoseContextRecursive(LayerImpl* current) |
| 1560 { | 1533 { |
| 1561 DCHECK(current); | 1534 DCHECK(current); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1628 | 1601 |
| 1629 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1602 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
| 1630 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1603 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
| 1631 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1604 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
| 1632 m_client->setNeedsRedrawOnImplThread(); | 1605 m_client->setNeedsRedrawOnImplThread(); |
| 1633 | 1606 |
| 1634 for (size_t i = 0; i < layer->children().size(); ++i) | 1607 for (size_t i = 0; i < layer->children().size(); ++i) |
| 1635 animateScrollbarsRecursive(layer->children()[i], time); | 1608 animateScrollbarsRecursive(layer->children()[i], time); |
| 1636 } | 1609 } |
| 1637 | 1610 |
| 1611 |
| 1612 void LayerTreeHostImpl::Register(LayerAnimationController* controller) { |
| 1613 m_activeAnimationControllers.insert(controller); |
| 1614 } |
| 1615 |
| 1616 void LayerTreeHostImpl::Unregister(LayerAnimationController* controller) { |
| 1617 if (ContainsKey(m_activeAnimationControllers, controller)) |
| 1618 m_activeAnimationControllers.erase(controller); |
| 1619 } |
| 1620 |
| 1638 } // namespace cc | 1621 } // namespace cc |
| OLD | NEW |