| 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.h" | 5 #include "cc/layer_tree_host.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/stl_util.h" |
| 10 #include "cc/font_atlas.h" | 11 #include "cc/font_atlas.h" |
| 11 #include "cc/graphics_context.h" | 12 #include "cc/graphics_context.h" |
| 12 #include "cc/heads_up_display_layer.h" | 13 #include "cc/heads_up_display_layer.h" |
| 13 #include "cc/heads_up_display_layer_impl.h" | 14 #include "cc/heads_up_display_layer_impl.h" |
| 14 #include "cc/layer.h" | 15 #include "cc/layer.h" |
| 15 #include "cc/layer_animation_controller.h" | 16 #include "cc/layer_animation_controller.h" |
| 16 #include "cc/layer_iterator.h" | 17 #include "cc/layer_iterator.h" |
| 17 #include "cc/layer_tree_host_client.h" | 18 #include "cc/layer_tree_host_client.h" |
| 18 #include "cc/layer_tree_host_common.h" | 19 #include "cc/layer_tree_host_common.h" |
| 19 #include "cc/layer_tree_host_impl.h" | 20 #include "cc/layer_tree_host_impl.h" |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 scoped_ptr<LayerTreeHost> LayerTreeHost::create(LayerTreeHostClient* client, con
st LayerTreeSettings& settings, scoped_ptr<Thread> implThread) | 104 scoped_ptr<LayerTreeHost> LayerTreeHost::create(LayerTreeHostClient* client, con
st LayerTreeSettings& settings, scoped_ptr<Thread> implThread) |
| 104 { | 105 { |
| 105 scoped_ptr<LayerTreeHost> layerTreeHost(new LayerTreeHost(client, settings))
; | 106 scoped_ptr<LayerTreeHost> layerTreeHost(new LayerTreeHost(client, settings))
; |
| 106 if (!layerTreeHost->initialize(implThread.Pass())) | 107 if (!layerTreeHost->initialize(implThread.Pass())) |
| 107 return scoped_ptr<LayerTreeHost>(); | 108 return scoped_ptr<LayerTreeHost>(); |
| 108 return layerTreeHost.Pass(); | 109 return layerTreeHost.Pass(); |
| 109 } | 110 } |
| 110 | 111 |
| 111 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting
s& settings) | 112 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting
s& settings) |
| 112 : m_animating(false) | 113 : m_animating(false) |
| 113 , m_needsAnimateLayers(false) | |
| 114 , m_client(client) | 114 , m_client(client) |
| 115 , m_commitNumber(0) | 115 , m_commitNumber(0) |
| 116 , m_renderingStats() | 116 , m_renderingStats() |
| 117 , m_rendererInitialized(false) | 117 , m_rendererInitialized(false) |
| 118 , m_contextLost(false) | 118 , m_contextLost(false) |
| 119 , m_numTimesRecreateShouldFail(0) | 119 , m_numTimesRecreateShouldFail(0) |
| 120 , m_numFailedRecreateAttempts(0) | 120 , m_numFailedRecreateAttempts(0) |
| 121 , m_settings(settings) | 121 , m_settings(settings) |
| 122 , m_deviceScaleFactor(1) | 122 , m_deviceScaleFactor(1) |
| 123 , m_visible(true) | 123 , m_visible(true) |
| (...skipping 26 matching lines...) Expand all Loading... |
| 150 if (m_rootLayer) | 150 if (m_rootLayer) |
| 151 m_rootLayer->setLayerTreeHost(0); | 151 m_rootLayer->setLayerTreeHost(0); |
| 152 DCHECK(m_proxy); | 152 DCHECK(m_proxy); |
| 153 DCHECK(m_proxy->isMainThread()); | 153 DCHECK(m_proxy->isMainThread()); |
| 154 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); | 154 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); |
| 155 m_proxy->stop(); | 155 m_proxy->stop(); |
| 156 numLayerTreeInstances--; | 156 numLayerTreeInstances--; |
| 157 RateLimiterMap::iterator it = m_rateLimiters.begin(); | 157 RateLimiterMap::iterator it = m_rateLimiters.begin(); |
| 158 if (it != m_rateLimiters.end()) | 158 if (it != m_rateLimiters.end()) |
| 159 it->second->stop(); | 159 it->second->stop(); |
| 160 |
| 161 if (m_rootLayer) |
| 162 m_rootLayer = 0; |
| 160 } | 163 } |
| 161 | 164 |
| 162 void LayerTreeHost::setSurfaceReady() | 165 void LayerTreeHost::setSurfaceReady() |
| 163 { | 166 { |
| 164 m_proxy->setSurfaceReady(); | 167 m_proxy->setSurfaceReady(); |
| 165 } | 168 } |
| 166 | 169 |
| 167 void LayerTreeHost::initializeRenderer() | 170 void LayerTreeHost::initializeRenderer() |
| 168 { | 171 { |
| 169 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer"); | 172 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer"); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 m_contentsTextureManager->updateBackingsInDrawingImplTree(); | 274 m_contentsTextureManager->updateBackingsInDrawingImplTree(); |
| 272 m_contentsTextureManager->reduceMemory(hostImpl->resourceProvider()); | 275 m_contentsTextureManager->reduceMemory(hostImpl->resourceProvider()); |
| 273 | 276 |
| 274 hostImpl->setRootLayer(TreeSynchronizer::synchronizeTrees(rootLayer(), hostI
mpl->detachLayerTree(), hostImpl)); | 277 hostImpl->setRootLayer(TreeSynchronizer::synchronizeTrees(rootLayer(), hostI
mpl->detachLayerTree(), hostImpl)); |
| 275 | 278 |
| 276 if (m_rootLayer && m_hudLayer) | 279 if (m_rootLayer && m_hudLayer) |
| 277 hostImpl->setHudLayer(static_cast<HeadsUpDisplayLayerImpl*>(LayerTreeHos
tCommon::findLayerInSubtree(hostImpl->rootLayer(), m_hudLayer->id()))); | 280 hostImpl->setHudLayer(static_cast<HeadsUpDisplayLayerImpl*>(LayerTreeHos
tCommon::findLayerInSubtree(hostImpl->rootLayer(), m_hudLayer->id()))); |
| 278 else | 281 else |
| 279 hostImpl->setHudLayer(0); | 282 hostImpl->setHudLayer(0); |
| 280 | 283 |
| 281 // We may have added an animation during the tree sync. This will cause both
layer tree hosts | |
| 282 // to visit their controllers. | |
| 283 if (rootLayer() && m_needsAnimateLayers) | |
| 284 hostImpl->setNeedsAnimateLayers(); | |
| 285 | |
| 286 hostImpl->setSourceFrameNumber(commitNumber()); | 284 hostImpl->setSourceFrameNumber(commitNumber()); |
| 287 hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize()); | 285 hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize()); |
| 288 hostImpl->setDeviceScaleFactor(deviceScaleFactor()); | 286 hostImpl->setDeviceScaleFactor(deviceScaleFactor()); |
| 289 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto
r, m_maxPageScaleFactor); | 287 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto
r, m_maxPageScaleFactor); |
| 290 hostImpl->setBackgroundColor(m_backgroundColor); | 288 hostImpl->setBackgroundColor(m_backgroundColor); |
| 291 hostImpl->setHasTransparentBackground(m_hasTransparentBackground); | 289 hostImpl->setHasTransparentBackground(m_hasTransparentBackground); |
| 292 | 290 |
| 293 m_commitNumber++; | 291 m_commitNumber++; |
| 294 } | 292 } |
| 295 | 293 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 { | 410 { |
| 413 return m_proxy->commitRequested(); | 411 return m_proxy->commitRequested(); |
| 414 } | 412 } |
| 415 | 413 |
| 416 void LayerTreeHost::setAnimationEvents(scoped_ptr<AnimationEventsVector> events,
base::Time wallClockTime) | 414 void LayerTreeHost::setAnimationEvents(scoped_ptr<AnimationEventsVector> events,
base::Time wallClockTime) |
| 417 { | 415 { |
| 418 DCHECK(m_proxy->isMainThread()); | 416 DCHECK(m_proxy->isMainThread()); |
| 419 setAnimationEventsRecursive(*events.get(), m_rootLayer.get(), wallClockTime)
; | 417 setAnimationEventsRecursive(*events.get(), m_rootLayer.get(), wallClockTime)
; |
| 420 } | 418 } |
| 421 | 419 |
| 422 void LayerTreeHost::didAddAnimation() | |
| 423 { | |
| 424 m_needsAnimateLayers = true; | |
| 425 m_proxy->didAddAnimation(); | |
| 426 } | |
| 427 | |
| 428 void LayerTreeHost::setRootLayer(scoped_refptr<Layer> rootLayer) | 420 void LayerTreeHost::setRootLayer(scoped_refptr<Layer> rootLayer) |
| 429 { | 421 { |
| 430 if (m_rootLayer == rootLayer) | 422 if (m_rootLayer == rootLayer) |
| 431 return; | 423 return; |
| 432 | 424 |
| 433 if (m_rootLayer) | 425 if (m_rootLayer) |
| 434 m_rootLayer->setLayerTreeHost(0); | 426 m_rootLayer->setLayerTreeHost(0); |
| 435 m_rootLayer = rootLayer; | 427 m_rootLayer = rootLayer; |
| 436 if (m_rootLayer) | 428 if (m_rootLayer) |
| 437 m_rootLayer->setLayerTreeHost(this); | 429 m_rootLayer->setLayerTreeHost(this); |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 { | 801 { |
| 810 if (deviceScaleFactor == m_deviceScaleFactor) | 802 if (deviceScaleFactor == m_deviceScaleFactor) |
| 811 return; | 803 return; |
| 812 m_deviceScaleFactor = deviceScaleFactor; | 804 m_deviceScaleFactor = deviceScaleFactor; |
| 813 | 805 |
| 814 setNeedsCommit(); | 806 setNeedsCommit(); |
| 815 } | 807 } |
| 816 | 808 |
| 817 void LayerTreeHost::animateLayers(base::TimeTicks time) | 809 void LayerTreeHost::animateLayers(base::TimeTicks time) |
| 818 { | 810 { |
| 819 if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers) | 811 if (!m_settings.acceleratedAnimationEnabled || m_activeAnimationControllers.
empty()) |
| 820 return; | 812 return; |
| 821 | 813 |
| 822 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); | 814 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); |
| 823 m_needsAnimateLayers = animateLayersRecursive(m_rootLayer.get(), time); | |
| 824 } | |
| 825 | 815 |
| 826 bool LayerTreeHost::animateLayersRecursive(Layer* current, base::TimeTicks time) | 816 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
| 827 { | |
| 828 if (!current) | |
| 829 return false; | |
| 830 | 817 |
| 831 bool subtreeNeedsAnimateLayers = false; | 818 AnimationControllerSet copy = m_activeAnimationControllers; |
| 832 LayerAnimationController* currentController = current->layerAnimationControl
ler(); | 819 for (AnimationControllerSet::iterator iter = copy.begin(); iter != copy.end(
); ++iter) |
| 833 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 820 (*iter)->animate(monotonicTime, 0); |
| 834 currentController->animate(monotonicTime, 0); | |
| 835 | |
| 836 // If the current controller still has an active animation, we must continue
animating layers. | |
| 837 if (currentController->hasActiveAnimation()) | |
| 838 subtreeNeedsAnimateLayers = true; | |
| 839 | |
| 840 for (size_t i = 0; i < current->children().size(); ++i) { | |
| 841 if (animateLayersRecursive(current->children()[i].get(), time)) | |
| 842 subtreeNeedsAnimateLayers = true; | |
| 843 } | |
| 844 | |
| 845 return subtreeNeedsAnimateLayers; | |
| 846 } | 821 } |
| 847 | 822 |
| 848 void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& eve
nts, Layer* layer, base::Time wallClockTime) | 823 void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& eve
nts, Layer* layer, base::Time wallClockTime) |
| 849 { | 824 { |
| 850 if (!layer) | 825 if (!layer) |
| 851 return; | 826 return; |
| 852 | 827 |
| 853 for (size_t eventIndex = 0; eventIndex < events.size(); ++eventIndex) { | 828 for (size_t eventIndex = 0; eventIndex < events.size(); ++eventIndex) { |
| 854 if (layer->id() == events[eventIndex].layerId) { | 829 if (layer->id() == events[eventIndex].layerId) { |
| 855 if (events[eventIndex].type == AnimationEvent::Started) | 830 if (events[eventIndex].type == AnimationEvent::Started) |
| 856 layer->notifyAnimationStarted(events[eventIndex], wallClockTime.
ToDoubleT()); | 831 layer->notifyAnimationStarted(events[eventIndex], wallClockTime.
ToDoubleT()); |
| 857 else | 832 else |
| 858 layer->notifyAnimationFinished(wallClockTime.ToDoubleT()); | 833 layer->notifyAnimationFinished(wallClockTime.ToDoubleT()); |
| 859 } | 834 } |
| 860 } | 835 } |
| 861 | 836 |
| 862 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn
dex) | 837 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn
dex) |
| 863 setAnimationEventsRecursive(events, layer->children()[childIndex].get(),
wallClockTime); | 838 setAnimationEventsRecursive(events, layer->children()[childIndex].get(),
wallClockTime); |
| 864 } | 839 } |
| 865 | 840 |
| 841 void LayerTreeHost::Register(LayerAnimationController* controller) { |
| 842 // Controllers register themselves when they have new animations. We need |
| 843 // to commit in this case. |
| 844 setNeedsCommit(); |
| 845 m_activeAnimationControllers.insert(controller); |
| 846 } |
| 847 |
| 848 void LayerTreeHost::Unregister(LayerAnimationController* controller) { |
| 849 if (ContainsKey(m_activeAnimationControllers, controller)) |
| 850 m_activeAnimationControllers.erase(controller); |
| 851 } |
| 852 |
| 866 } // namespace cc | 853 } // namespace cc |
| OLD | NEW |