| 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" |
| 12 #include "cc/append_quads_data.h" | 13 #include "cc/append_quads_data.h" |
| 13 #include "cc/damage_tracker.h" | 14 #include "cc/damage_tracker.h" |
| 14 #include "cc/debug_rect_history.h" | 15 #include "cc/debug_rect_history.h" |
| 15 #include "cc/delay_based_time_source.h" | 16 #include "cc/delay_based_time_source.h" |
| 16 #include "cc/delegating_renderer.h" | 17 #include "cc/delegating_renderer.h" |
| 17 #include "cc/frame_rate_counter.h" | 18 #include "cc/frame_rate_counter.h" |
| 18 #include "cc/gl_renderer.h" | 19 #include "cc/gl_renderer.h" |
| 19 #include "cc/heads_up_display_layer_impl.h" | 20 #include "cc/heads_up_display_layer_impl.h" |
| 20 #include "cc/layer_iterator.h" | 21 #include "cc/layer_iterator.h" |
| 21 #include "cc/layer_tree_host.h" | 22 #include "cc/layer_tree_host.h" |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 , m_debugState(settings.initialDebugState) | 213 , m_debugState(settings.initialDebugState) |
| 213 , m_deviceScaleFactor(1) | 214 , m_deviceScaleFactor(1) |
| 214 , m_visible(true) | 215 , m_visible(true) |
| 215 , m_contentsTexturesPurged(false) | 216 , m_contentsTexturesPurged(false) |
| 216 , m_managedMemoryPolicy(PrioritizedResourceManager::defaultMemoryAllocationL
imit(), | 217 , m_managedMemoryPolicy(PrioritizedResourceManager::defaultMemoryAllocationL
imit(), |
| 217 PriorityCalculator::allowEverythingCutoff(), | 218 PriorityCalculator::allowEverythingCutoff(), |
| 218 0, | 219 0, |
| 219 PriorityCalculator::allowNothingCutoff()) | 220 PriorityCalculator::allowNothingCutoff()) |
| 220 , m_backgroundColor(0) | 221 , m_backgroundColor(0) |
| 221 , m_hasTransparentBackground(false) | 222 , m_hasTransparentBackground(false) |
| 222 , m_needsAnimateLayers(false) | |
| 223 , m_needsUpdateDrawProperties(false) | 223 , m_needsUpdateDrawProperties(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_cumulativeNumLayersDrawn(0) | 229 , m_cumulativeNumLayersDrawn(0) |
| 230 , m_cumulativeNumMissingTiles(0) | 230 , m_cumulativeNumMissingTiles(0) |
| 231 , m_lastSentMemoryVisibleBytes(0) | 231 , m_lastSentMemoryVisibleBytes(0) |
| 232 , m_lastSentMemoryVisibleAndNearbyBytes(0) | 232 , m_lastSentMemoryVisibleAndNearbyBytes(0) |
| 233 , m_lastSentMemoryUseBytes(0) | 233 , m_lastSentMemoryUseBytes(0) |
| 234 { | 234 { |
| 235 DCHECK(m_proxy->isImplThread()); | 235 DCHECK(m_proxy->isImplThread()); |
| 236 didVisibilityChange(this, m_visible); | 236 didVisibilityChange(this, m_visible); |
| 237 | 237 |
| 238 // TODO(nduca): For now, assume we have an active tree. This will be removed | 238 // TODO(nduca): For now, assume we have an active tree. This will be removed |
| 239 // in future patches. | 239 // in future patches. |
| 240 m_activeTree = LayerTreeImpl::create(this); | 240 m_activeTree = LayerTreeImpl::create(this); |
| 241 } | 241 } |
| 242 | 242 |
| 243 LayerTreeHostImpl::~LayerTreeHostImpl() | 243 LayerTreeHostImpl::~LayerTreeHostImpl() |
| 244 { | 244 { |
| 245 DCHECK(m_proxy->isImplThread()); | 245 DCHECK(m_proxy->isImplThread()); |
| 246 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); | 246 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); |
| 247 | 247 |
| 248 if (rootLayer()) | 248 if (rootLayer()) { |
| 249 clearRenderSurfaces(); | 249 clearRenderSurfaces(); |
| 250 // The layer trees must be destroyed before the layer tree host. We've |
| 251 // made a contract with our animation controllers that the registrar |
| 252 // will outlive them, and we must make good. |
| 253 m_activeTree.reset(); |
| 254 m_pendingTree.reset(); |
| 255 } |
| 250 } | 256 } |
| 251 | 257 |
| 252 void LayerTreeHostImpl::beginCommit() | 258 void LayerTreeHostImpl::beginCommit() |
| 253 { | 259 { |
| 254 } | 260 } |
| 255 | 261 |
| 256 void LayerTreeHostImpl::commitComplete() | 262 void LayerTreeHostImpl::commitComplete() |
| 257 { | 263 { |
| 258 TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete"); | 264 TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete"); |
| 259 | 265 |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 if (drawFrame) | 618 if (drawFrame) |
| 613 occlusionTracker.overdrawMetrics().recordMetrics(this); | 619 occlusionTracker.overdrawMetrics().recordMetrics(this); |
| 614 | 620 |
| 615 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); | 621 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); |
| 616 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); | 622 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); |
| 617 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); | 623 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); |
| 618 | 624 |
| 619 return drawFrame; | 625 return drawFrame; |
| 620 } | 626 } |
| 621 | 627 |
| 622 void LayerTreeHostImpl::animateLayersRecursive(LayerImpl* current, base::TimeTic
ks monotonicTime, base::Time wallClockTime, AnimationEventsVector* events, bool&
didAnimate, bool& needsAnimateLayers) | |
| 623 { | |
| 624 bool subtreeNeedsAnimateLayers = false; | |
| 625 | |
| 626 LayerAnimationController* currentController = current->layerAnimationControl
ler(); | |
| 627 | |
| 628 bool hadActiveAnimation = currentController->hasActiveAnimation(); | |
| 629 double monotonicTimeSeconds = (monotonicTime - base::TimeTicks()).InSecondsF
(); | |
| 630 currentController->animate(monotonicTimeSeconds, events); | |
| 631 bool startedAnimation = events->size() > 0; | |
| 632 | |
| 633 // We animated if we either ticked a running animation, or started a new ani
mation. | |
| 634 if (hadActiveAnimation || startedAnimation) | |
| 635 didAnimate = true; | |
| 636 | |
| 637 // If the current controller still has an active animation, we must continue
animating layers. | |
| 638 if (currentController->hasActiveAnimation()) | |
| 639 subtreeNeedsAnimateLayers = true; | |
| 640 | |
| 641 for (size_t i = 0; i < current->children().size(); ++i) { | |
| 642 bool childNeedsAnimateLayers = false; | |
| 643 animateLayersRecursive(current->children()[i], monotonicTime, wallClockT
ime, events, didAnimate, childNeedsAnimateLayers); | |
| 644 if (childNeedsAnimateLayers) | |
| 645 subtreeNeedsAnimateLayers = true; | |
| 646 } | |
| 647 | |
| 648 needsAnimateLayers = subtreeNeedsAnimateLayers; | |
| 649 } | |
| 650 | |
| 651 void LayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled) | 628 void LayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled) |
| 652 { | 629 { |
| 653 // Lazily create the timeSource adapter so that we can vary the interval for
testing. | 630 // Lazily create the timeSource adapter so that we can vary the interval for
testing. |
| 654 if (!m_timeSourceClientAdapter) | 631 if (!m_timeSourceClientAdapter) |
| 655 m_timeSourceClientAdapter = LayerTreeHostImplTimeSourceAdapter::create(t
his, DelayBasedTimeSource::create(lowFrequencyAnimationInterval(), m_proxy->curr
entThread())); | 632 m_timeSourceClientAdapter = LayerTreeHostImplTimeSourceAdapter::create(t
his, DelayBasedTimeSource::create(lowFrequencyAnimationInterval(), m_proxy->curr
entThread())); |
| 656 | 633 |
| 657 m_timeSourceClientAdapter->setActive(enabled); | 634 m_timeSourceClientAdapter->setActive(enabled); |
| 658 } | 635 } |
| 659 | 636 |
| 660 gfx::Size LayerTreeHostImpl::contentSize() const | 637 gfx::Size LayerTreeHostImpl::contentSize() const |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1026 return; | 1003 return; |
| 1027 m_visible = visible; | 1004 m_visible = visible; |
| 1028 didVisibilityChange(this, m_visible); | 1005 didVisibilityChange(this, m_visible); |
| 1029 enforceManagedMemoryPolicy(m_managedMemoryPolicy); | 1006 enforceManagedMemoryPolicy(m_managedMemoryPolicy); |
| 1030 | 1007 |
| 1031 if (!m_renderer) | 1008 if (!m_renderer) |
| 1032 return; | 1009 return; |
| 1033 | 1010 |
| 1034 m_renderer->setVisible(visible); | 1011 m_renderer->setVisible(visible); |
| 1035 | 1012 |
| 1036 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers); | 1013 setBackgroundTickingEnabled(!m_visible && !m_activeAnimationControllers.empt
y()); |
| 1037 } | 1014 } |
| 1038 | 1015 |
| 1039 bool LayerTreeHostImpl::initializeRenderer(scoped_ptr<OutputSurface> outputSurfa
ce) | 1016 bool LayerTreeHostImpl::initializeRenderer(scoped_ptr<OutputSurface> outputSurfa
ce) |
| 1040 { | 1017 { |
| 1041 // Since we will create a new resource provider, we cannot continue to use | 1018 // Since we will create a new resource provider, we cannot continue to use |
| 1042 // the old resources (i.e. renderSurfaces and texture IDs). Clear them | 1019 // the old resources (i.e. renderSurfaces and texture IDs). Clear them |
| 1043 // before we destroy the old resource provider. | 1020 // before we destroy the old resource provider. |
| 1044 if (rootLayer()) { | 1021 if (rootLayer()) { |
| 1045 clearRenderSurfaces(); | 1022 clearRenderSurfaces(); |
| 1046 sendDidLoseOutputSurfaceRecursive(rootLayer()); | 1023 sendDidLoseOutputSurfaceRecursive(rootLayer()); |
| (...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1586 setNeedsUpdateDrawProperties(); | 1563 setNeedsUpdateDrawProperties(); |
| 1587 | 1564 |
| 1588 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { | 1565 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { |
| 1589 m_pageScaleAnimation.reset(); | 1566 m_pageScaleAnimation.reset(); |
| 1590 m_client->setNeedsCommitOnImplThread(); | 1567 m_client->setNeedsCommitOnImplThread(); |
| 1591 } | 1568 } |
| 1592 } | 1569 } |
| 1593 | 1570 |
| 1594 void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time
wallClockTime) | 1571 void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time
wallClockTime) |
| 1595 { | 1572 { |
| 1596 if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers || !roo
tLayer()) | 1573 if (!m_settings.acceleratedAnimationEnabled || m_activeAnimationControllers.
empty() || !rootLayer()) |
| 1597 return; | 1574 return; |
| 1598 | 1575 |
| 1599 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); | 1576 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); |
| 1600 | 1577 |
| 1578 double monotonicSeconds = (monotonicTime - base::TimeTicks()).InSecondsF(); |
| 1579 |
| 1601 scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEvents
Vector)); | 1580 scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEvents
Vector)); |
| 1602 | 1581 AnimationControllerMap copy = m_activeAnimationControllers; |
| 1603 bool didAnimate = false; | 1582 for (AnimationControllerMap::iterator iter = copy.begin(); iter != copy.end(
); ++iter) |
| 1604 animateLayersRecursive(rootLayer(), monotonicTime, wallClockTime, events.get
(), didAnimate, m_needsAnimateLayers); | 1583 (*iter).second->animate(monotonicSeconds, events.get()); |
| 1605 | 1584 |
| 1606 if (!events->empty()) | 1585 if (!events->empty()) |
| 1607 m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wal
lClockTime); | 1586 m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wal
lClockTime); |
| 1608 | 1587 |
| 1609 if (didAnimate) { | 1588 m_client->setNeedsRedrawOnImplThread(); |
| 1610 m_client->setNeedsRedrawOnImplThread(); | 1589 setNeedsUpdateDrawProperties(); |
| 1611 setNeedsUpdateDrawProperties(); | 1590 setBackgroundTickingEnabled(!m_visible && !m_activeAnimationControllers.empt
y()); |
| 1612 } | |
| 1613 | |
| 1614 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers); | |
| 1615 } | 1591 } |
| 1616 | 1592 |
| 1617 base::TimeDelta LayerTreeHostImpl::lowFrequencyAnimationInterval() const | 1593 base::TimeDelta LayerTreeHostImpl::lowFrequencyAnimationInterval() const |
| 1618 { | 1594 { |
| 1619 return base::TimeDelta::FromSeconds(1); | 1595 return base::TimeDelta::FromSeconds(1); |
| 1620 } | 1596 } |
| 1621 | 1597 |
| 1622 void LayerTreeHostImpl::sendDidLoseOutputSurfaceRecursive(LayerImpl* current) | 1598 void LayerTreeHostImpl::sendDidLoseOutputSurfaceRecursive(LayerImpl* current) |
| 1623 { | 1599 { |
| 1624 DCHECK(current); | 1600 DCHECK(current); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1735 | 1711 |
| 1736 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1712 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
| 1737 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1713 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
| 1738 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1714 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
| 1739 m_client->setNeedsRedrawOnImplThread(); | 1715 m_client->setNeedsRedrawOnImplThread(); |
| 1740 | 1716 |
| 1741 for (size_t i = 0; i < layer->children().size(); ++i) | 1717 for (size_t i = 0; i < layer->children().size(); ++i) |
| 1742 animateScrollbarsRecursive(layer->children()[i], time); | 1718 animateScrollbarsRecursive(layer->children()[i], time); |
| 1743 } | 1719 } |
| 1744 | 1720 |
| 1721 scoped_refptr<LayerAnimationController> LayerTreeHostImpl::GetAnimationControlle
rForId(int id) |
| 1722 { |
| 1723 scoped_refptr<LayerAnimationController> toReturn; |
| 1724 if (!ContainsKey(m_allAnimationControllers, id)) { |
| 1725 toReturn = LayerAnimationController::create(id); |
| 1726 toReturn->setAnimationRegistrar(this); |
| 1727 m_allAnimationControllers[id] = toReturn.get(); |
| 1728 } else |
| 1729 toReturn = m_allAnimationControllers[id]; |
| 1730 return toReturn; |
| 1731 } |
| 1732 |
| 1733 void LayerTreeHostImpl::DidActivateAnimationController(LayerAnimationController*
controller) { |
| 1734 m_activeAnimationControllers[controller->id()] = controller; |
| 1735 } |
| 1736 |
| 1737 void LayerTreeHostImpl::DidDeactivateAnimationController(LayerAnimationControlle
r* controller) { |
| 1738 if (ContainsKey(m_activeAnimationControllers, controller->id())) |
| 1739 m_activeAnimationControllers.erase(controller->id()); |
| 1740 } |
| 1741 |
| 1742 void LayerTreeHostImpl::RegisterAnimationController(LayerAnimationController* co
ntroller) { |
| 1743 m_allAnimationControllers[controller->id()] = controller; |
| 1744 } |
| 1745 |
| 1746 void LayerTreeHostImpl::UnregisterAnimationController(LayerAnimationController*
controller) { |
| 1747 if (ContainsKey(m_allAnimationControllers, controller->id())) |
| 1748 m_allAnimationControllers.erase(controller->id()); |
| 1749 DidDeactivateAnimationController(controller); |
| 1750 } |
| 1751 |
| 1745 } // namespace cc | 1752 } // namespace cc |
| OLD | NEW |