Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(265)

Side by Side Diff: cc/layer_tree_host.cc

Issue 11598005: Ref count layer animation controllers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/layer_tree_host.h ('k') | cc/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/layer_tree_host.h ('k') | cc/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698