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 |