| 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 "base/string_number_conversions.h" | 11 #include "base/string_number_conversions.h" |
| 12 #include "cc/animation_registrar.h" |
| 11 #include "cc/font_atlas.h" | 13 #include "cc/font_atlas.h" |
| 12 #include "cc/heads_up_display_layer.h" | 14 #include "cc/heads_up_display_layer.h" |
| 13 #include "cc/heads_up_display_layer_impl.h" | 15 #include "cc/heads_up_display_layer_impl.h" |
| 14 #include "cc/layer.h" | 16 #include "cc/layer.h" |
| 15 #include "cc/layer_animation_controller.h" | 17 #include "cc/layer_animation_controller.h" |
| 16 #include "cc/layer_iterator.h" | 18 #include "cc/layer_iterator.h" |
| 17 #include "cc/layer_tree_host_client.h" | 19 #include "cc/layer_tree_host_client.h" |
| 18 #include "cc/layer_tree_host_common.h" | 20 #include "cc/layer_tree_host_common.h" |
| 19 #include "cc/layer_tree_host_impl.h" | 21 #include "cc/layer_tree_host_impl.h" |
| 20 #include "cc/layer_tree_impl.h" | 22 #include "cc/layer_tree_impl.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 scoped_ptr<LayerTreeHost> LayerTreeHost::create(LayerTreeHostClient* client, con
st LayerTreeSettings& settings, scoped_ptr<Thread> implThread) | 65 scoped_ptr<LayerTreeHost> LayerTreeHost::create(LayerTreeHostClient* client, con
st LayerTreeSettings& settings, scoped_ptr<Thread> implThread) |
| 64 { | 66 { |
| 65 scoped_ptr<LayerTreeHost> layerTreeHost(new LayerTreeHost(client, settings))
; | 67 scoped_ptr<LayerTreeHost> layerTreeHost(new LayerTreeHost(client, settings))
; |
| 66 if (!layerTreeHost->initialize(implThread.Pass())) | 68 if (!layerTreeHost->initialize(implThread.Pass())) |
| 67 return scoped_ptr<LayerTreeHost>(); | 69 return scoped_ptr<LayerTreeHost>(); |
| 68 return layerTreeHost.Pass(); | 70 return layerTreeHost.Pass(); |
| 69 } | 71 } |
| 70 | 72 |
| 71 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting
s& settings) | 73 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting
s& settings) |
| 72 : m_animating(false) | 74 : m_animating(false) |
| 73 , m_needsAnimateLayers(false) | |
| 74 , m_needsFullTreeSync(true) | 75 , m_needsFullTreeSync(true) |
| 75 , m_client(client) | 76 , m_client(client) |
| 76 , m_commitNumber(0) | 77 , m_commitNumber(0) |
| 77 , m_renderingStats() | 78 , m_renderingStats() |
| 78 , m_rendererInitialized(false) | 79 , m_rendererInitialized(false) |
| 79 , m_outputSurfaceLost(false) | 80 , m_outputSurfaceLost(false) |
| 80 , m_numTimesRecreateShouldFail(0) | 81 , m_numTimesRecreateShouldFail(0) |
| 81 , m_numFailedRecreateAttempts(0) | 82 , m_numFailedRecreateAttempts(0) |
| 82 , m_settings(settings) | 83 , m_settings(settings) |
| 83 , m_debugState(settings.initialDebugState) | 84 , m_debugState(settings.initialDebugState) |
| 84 , m_deviceScaleFactor(1) | 85 , m_deviceScaleFactor(1) |
| 85 , m_visible(true) | 86 , m_visible(true) |
| 86 , m_pageScaleFactor(1) | 87 , m_pageScaleFactor(1) |
| 87 , m_minPageScaleFactor(1) | 88 , m_minPageScaleFactor(1) |
| 88 , m_maxPageScaleFactor(1) | 89 , m_maxPageScaleFactor(1) |
| 89 , m_triggerIdleUpdates(true) | 90 , m_triggerIdleUpdates(true) |
| 90 , m_backgroundColor(SK_ColorWHITE) | 91 , m_backgroundColor(SK_ColorWHITE) |
| 91 , m_hasTransparentBackground(false) | 92 , m_hasTransparentBackground(false) |
| 92 , m_partialTextureUpdateRequests(0) | 93 , m_partialTextureUpdateRequests(0) |
| 94 , m_animationRegistrar(AnimationRegistrar::create()) |
| 93 { | 95 { |
| 94 numLayerTreeInstances++; | 96 numLayerTreeInstances++; |
| 95 } | 97 } |
| 96 | 98 |
| 97 bool LayerTreeHost::initialize(scoped_ptr<Thread> implThread) | 99 bool LayerTreeHost::initialize(scoped_ptr<Thread> implThread) |
| 98 { | 100 { |
| 99 if (implThread) | 101 if (implThread) |
| 100 return initializeProxy(ThreadProxy::create(this, implThread.Pass())); | 102 return initializeProxy(ThreadProxy::create(this, implThread.Pass())); |
| 101 else | 103 else |
| 102 return initializeProxy(SingleThreadProxy::create(this)); | 104 return initializeProxy(SingleThreadProxy::create(this)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 121 if (m_rootLayer) | 123 if (m_rootLayer) |
| 122 m_rootLayer->setLayerTreeHost(0); | 124 m_rootLayer->setLayerTreeHost(0); |
| 123 DCHECK(m_proxy); | 125 DCHECK(m_proxy); |
| 124 DCHECK(m_proxy->isMainThread()); | 126 DCHECK(m_proxy->isMainThread()); |
| 125 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); | 127 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); |
| 126 m_proxy->stop(); | 128 m_proxy->stop(); |
| 127 numLayerTreeInstances--; | 129 numLayerTreeInstances--; |
| 128 RateLimiterMap::iterator it = m_rateLimiters.begin(); | 130 RateLimiterMap::iterator it = m_rateLimiters.begin(); |
| 129 if (it != m_rateLimiters.end()) | 131 if (it != m_rateLimiters.end()) |
| 130 it->second->stop(); | 132 it->second->stop(); |
| 133 |
| 134 if (m_rootLayer) { |
| 135 // The layer tree must be destroyed before the layer tree host. We've |
| 136 // made a contract with our animation controllers that the registrar |
| 137 // will outlive them, and we must make good. |
| 138 m_rootLayer = NULL; |
| 139 } |
| 131 } | 140 } |
| 132 | 141 |
| 133 void LayerTreeHost::setSurfaceReady() | 142 void LayerTreeHost::setSurfaceReady() |
| 134 { | 143 { |
| 135 m_proxy->setSurfaceReady(); | 144 m_proxy->setSurfaceReady(); |
| 136 } | 145 } |
| 137 | 146 |
| 138 void LayerTreeHost::initializeRenderer() | 147 void LayerTreeHost::initializeRenderer() |
| 139 { | 148 { |
| 140 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer"); | 149 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer"); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 TRACE_EVENT0("cc", "LayerTreeHost::pushPropertiesRecursive"); | 287 TRACE_EVENT0("cc", "LayerTreeHost::pushPropertiesRecursive"); |
| 279 pushPropertiesRecursive(rootLayer(), hostImpl->rootLayer()); | 288 pushPropertiesRecursive(rootLayer(), hostImpl->rootLayer()); |
| 280 } | 289 } |
| 281 m_needsFullTreeSync = false; | 290 m_needsFullTreeSync = false; |
| 282 | 291 |
| 283 if (m_rootLayer && m_hudLayer) | 292 if (m_rootLayer && m_hudLayer) |
| 284 hostImpl->activeTree()->set_hud_layer(static_cast<HeadsUpDisplayLayerImp
l*>(LayerTreeHostCommon::findLayerInSubtree(hostImpl->rootLayer(), m_hudLayer->i
d()))); | 293 hostImpl->activeTree()->set_hud_layer(static_cast<HeadsUpDisplayLayerImp
l*>(LayerTreeHostCommon::findLayerInSubtree(hostImpl->rootLayer(), m_hudLayer->i
d()))); |
| 285 else | 294 else |
| 286 hostImpl->activeTree()->set_hud_layer(0); | 295 hostImpl->activeTree()->set_hud_layer(0); |
| 287 | 296 |
| 288 // We may have added an animation during the tree sync. This will cause both
layer tree hosts | |
| 289 // to visit their controllers. | |
| 290 if (rootLayer() && m_needsAnimateLayers) | |
| 291 hostImpl->setNeedsAnimateLayers(); | |
| 292 | |
| 293 hostImpl->activeTree()->set_source_frame_number(commitNumber()); | 297 hostImpl->activeTree()->set_source_frame_number(commitNumber()); |
| 294 hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize()); | 298 hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize()); |
| 295 hostImpl->setDeviceScaleFactor(deviceScaleFactor()); | 299 hostImpl->setDeviceScaleFactor(deviceScaleFactor()); |
| 296 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto
r, m_maxPageScaleFactor); | 300 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto
r, m_maxPageScaleFactor); |
| 297 hostImpl->setBackgroundColor(m_backgroundColor); | 301 hostImpl->setBackgroundColor(m_backgroundColor); |
| 298 hostImpl->setHasTransparentBackground(m_hasTransparentBackground); | 302 hostImpl->setHasTransparentBackground(m_hasTransparentBackground); |
| 299 hostImpl->setDebugState(m_debugState); | 303 hostImpl->setDebugState(m_debugState); |
| 300 | 304 |
| 301 m_commitNumber++; | 305 m_commitNumber++; |
| 302 } | 306 } |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 { | 420 { |
| 417 return m_proxy->commitRequested(); | 421 return m_proxy->commitRequested(); |
| 418 } | 422 } |
| 419 | 423 |
| 420 void LayerTreeHost::setAnimationEvents(scoped_ptr<AnimationEventsVector> events,
base::Time wallClockTime) | 424 void LayerTreeHost::setAnimationEvents(scoped_ptr<AnimationEventsVector> events,
base::Time wallClockTime) |
| 421 { | 425 { |
| 422 DCHECK(m_proxy->isMainThread()); | 426 DCHECK(m_proxy->isMainThread()); |
| 423 setAnimationEventsRecursive(*events.get(), m_rootLayer.get(), wallClockTime)
; | 427 setAnimationEventsRecursive(*events.get(), m_rootLayer.get(), wallClockTime)
; |
| 424 } | 428 } |
| 425 | 429 |
| 426 void LayerTreeHost::didAddAnimation() | |
| 427 { | |
| 428 m_needsAnimateLayers = true; | |
| 429 m_proxy->didAddAnimation(); | |
| 430 } | |
| 431 | |
| 432 void LayerTreeHost::setRootLayer(scoped_refptr<Layer> rootLayer) | 430 void LayerTreeHost::setRootLayer(scoped_refptr<Layer> rootLayer) |
| 433 { | 431 { |
| 434 if (m_rootLayer == rootLayer) | 432 if (m_rootLayer == rootLayer) |
| 435 return; | 433 return; |
| 436 | 434 |
| 437 if (m_rootLayer) | 435 if (m_rootLayer) |
| 438 m_rootLayer->setLayerTreeHost(0); | 436 m_rootLayer->setLayerTreeHost(0); |
| 439 m_rootLayer = rootLayer; | 437 m_rootLayer = rootLayer; |
| 440 if (m_rootLayer) | 438 if (m_rootLayer) |
| 441 m_rootLayer->setLayerTreeHost(this); | 439 m_rootLayer->setLayerTreeHost(this); |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 824 { | 822 { |
| 825 if (deviceScaleFactor == m_deviceScaleFactor) | 823 if (deviceScaleFactor == m_deviceScaleFactor) |
| 826 return; | 824 return; |
| 827 m_deviceScaleFactor = deviceScaleFactor; | 825 m_deviceScaleFactor = deviceScaleFactor; |
| 828 | 826 |
| 829 setNeedsCommit(); | 827 setNeedsCommit(); |
| 830 } | 828 } |
| 831 | 829 |
| 832 void LayerTreeHost::animateLayers(base::TimeTicks time) | 830 void LayerTreeHost::animateLayers(base::TimeTicks time) |
| 833 { | 831 { |
| 834 if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers) | 832 if (!m_settings.acceleratedAnimationEnabled || m_animationRegistrar->active_
animation_controllers().empty()) |
| 835 return; | 833 return; |
| 836 | 834 |
| 837 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); | 835 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); |
| 838 m_needsAnimateLayers = animateLayersRecursive(m_rootLayer.get(), time); | |
| 839 } | |
| 840 | 836 |
| 841 bool LayerTreeHost::animateLayersRecursive(Layer* current, base::TimeTicks time) | 837 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
| 842 { | |
| 843 if (!current) | |
| 844 return false; | |
| 845 | 838 |
| 846 bool subtreeNeedsAnimateLayers = false; | 839 AnimationRegistrar::AnimationControllerMap copy = m_animationRegistrar->acti
ve_animation_controllers(); |
| 847 LayerAnimationController* currentController = current->layerAnimationControl
ler(); | 840 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(
); iter != copy.end(); ++iter) |
| 848 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 841 (*iter).second->animate(monotonicTime, 0); |
| 849 currentController->animate(monotonicTime, 0); | |
| 850 | |
| 851 // If the current controller still has an active animation, we must continue
animating layers. | |
| 852 if (currentController->hasActiveAnimation()) | |
| 853 subtreeNeedsAnimateLayers = true; | |
| 854 | |
| 855 for (size_t i = 0; i < current->children().size(); ++i) { | |
| 856 if (animateLayersRecursive(current->children()[i].get(), time)) | |
| 857 subtreeNeedsAnimateLayers = true; | |
| 858 } | |
| 859 | |
| 860 return subtreeNeedsAnimateLayers; | |
| 861 } | 842 } |
| 862 | 843 |
| 863 void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& eve
nts, Layer* layer, base::Time wallClockTime) | 844 void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& eve
nts, Layer* layer, base::Time wallClockTime) |
| 864 { | 845 { |
| 865 if (!layer) | 846 if (!layer) |
| 866 return; | 847 return; |
| 867 | 848 |
| 868 for (size_t eventIndex = 0; eventIndex < events.size(); ++eventIndex) { | 849 for (size_t eventIndex = 0; eventIndex < events.size(); ++eventIndex) { |
| 869 if (layer->id() == events[eventIndex].layerId) { | 850 if (layer->id() == events[eventIndex].layerId) { |
| 870 if (events[eventIndex].type == AnimationEvent::Started) | 851 if (events[eventIndex].type == AnimationEvent::Started) |
| 871 layer->notifyAnimationStarted(events[eventIndex], wallClockTime.
ToDoubleT()); | 852 layer->notifyAnimationStarted(events[eventIndex], wallClockTime.
ToDoubleT()); |
| 872 else | 853 else |
| 873 layer->notifyAnimationFinished(wallClockTime.ToDoubleT()); | 854 layer->notifyAnimationFinished(wallClockTime.ToDoubleT()); |
| 874 } | 855 } |
| 875 } | 856 } |
| 876 | 857 |
| 877 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn
dex) | 858 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn
dex) |
| 878 setAnimationEventsRecursive(events, layer->children()[childIndex].get(),
wallClockTime); | 859 setAnimationEventsRecursive(events, layer->children()[childIndex].get(),
wallClockTime); |
| 879 } | 860 } |
| 880 | 861 |
| 881 } // namespace cc | 862 } // namespace cc |
| OLD | NEW |