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

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
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"
11 #include "cc/font_atlas.h" 12 #include "cc/font_atlas.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 43 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) 64 scoped_ptr<LayerTreeHost> LayerTreeHost::create(LayerTreeHostClient* client, con st LayerTreeSettings& settings, scoped_ptr<Thread> implThread)
64 { 65 {
65 scoped_ptr<LayerTreeHost> layerTreeHost(new LayerTreeHost(client, settings)) ; 66 scoped_ptr<LayerTreeHost> layerTreeHost(new LayerTreeHost(client, settings)) ;
66 if (!layerTreeHost->initialize(implThread.Pass())) 67 if (!layerTreeHost->initialize(implThread.Pass()))
67 return scoped_ptr<LayerTreeHost>(); 68 return scoped_ptr<LayerTreeHost>();
68 return layerTreeHost.Pass(); 69 return layerTreeHost.Pass();
69 } 70 }
70 71
71 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting s& settings) 72 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting s& settings)
72 : m_animating(false) 73 : m_animating(false)
73 , m_needsAnimateLayers(false)
74 , m_needsFullTreeSync(true) 74 , m_needsFullTreeSync(true)
75 , m_client(client) 75 , m_client(client)
76 , m_commitNumber(0) 76 , m_commitNumber(0)
77 , m_renderingStats() 77 , m_renderingStats()
78 , m_rendererInitialized(false) 78 , m_rendererInitialized(false)
79 , m_outputSurfaceLost(false) 79 , m_outputSurfaceLost(false)
80 , m_numTimesRecreateShouldFail(0) 80 , m_numTimesRecreateShouldFail(0)
81 , m_numFailedRecreateAttempts(0) 81 , m_numFailedRecreateAttempts(0)
82 , m_settings(settings) 82 , m_settings(settings)
83 , m_debugState(settings.initialDebugState) 83 , m_debugState(settings.initialDebugState)
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 if (m_rootLayer) 121 if (m_rootLayer)
122 m_rootLayer->setLayerTreeHost(0); 122 m_rootLayer->setLayerTreeHost(0);
123 DCHECK(m_proxy); 123 DCHECK(m_proxy);
124 DCHECK(m_proxy->isMainThread()); 124 DCHECK(m_proxy->isMainThread());
125 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); 125 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost");
126 m_proxy->stop(); 126 m_proxy->stop();
127 numLayerTreeInstances--; 127 numLayerTreeInstances--;
128 RateLimiterMap::iterator it = m_rateLimiters.begin(); 128 RateLimiterMap::iterator it = m_rateLimiters.begin();
129 if (it != m_rateLimiters.end()) 129 if (it != m_rateLimiters.end())
130 it->second->stop(); 130 it->second->stop();
131
132 if (m_rootLayer)
133 m_rootLayer = 0;
enne (OOO) 2012/12/17 20:21:22 style nit: use NULL in Chromium-land. Also, pleas
131 } 134 }
132 135
133 void LayerTreeHost::setSurfaceReady() 136 void LayerTreeHost::setSurfaceReady()
134 { 137 {
135 m_proxy->setSurfaceReady(); 138 m_proxy->setSurfaceReady();
136 } 139 }
137 140
138 void LayerTreeHost::initializeRenderer() 141 void LayerTreeHost::initializeRenderer()
139 { 142 {
140 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer"); 143 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer");
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 TRACE_EVENT0("cc", "LayerTreeHost::pushPropertiesRecursive"); 276 TRACE_EVENT0("cc", "LayerTreeHost::pushPropertiesRecursive");
274 pushPropertiesRecursive(rootLayer(), hostImpl->rootLayer()); 277 pushPropertiesRecursive(rootLayer(), hostImpl->rootLayer());
275 } 278 }
276 m_needsFullTreeSync = false; 279 m_needsFullTreeSync = false;
277 280
278 if (m_rootLayer && m_hudLayer) 281 if (m_rootLayer && m_hudLayer)
279 hostImpl->activeTree()->set_hud_layer(static_cast<HeadsUpDisplayLayerImp l*>(LayerTreeHostCommon::findLayerInSubtree(hostImpl->rootLayer(), m_hudLayer->i d()))); 282 hostImpl->activeTree()->set_hud_layer(static_cast<HeadsUpDisplayLayerImp l*>(LayerTreeHostCommon::findLayerInSubtree(hostImpl->rootLayer(), m_hudLayer->i d())));
280 else 283 else
281 hostImpl->activeTree()->set_hud_layer(0); 284 hostImpl->activeTree()->set_hud_layer(0);
282 285
283 // We may have added an animation during the tree sync. This will cause both layer tree hosts
284 // to visit their controllers.
285 if (rootLayer() && m_needsAnimateLayers)
286 hostImpl->setNeedsAnimateLayers();
287
288 hostImpl->activeTree()->set_source_frame_number(commitNumber()); 286 hostImpl->activeTree()->set_source_frame_number(commitNumber());
289 hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize()); 287 hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize());
290 hostImpl->setDeviceScaleFactor(deviceScaleFactor()); 288 hostImpl->setDeviceScaleFactor(deviceScaleFactor());
291 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto r, m_maxPageScaleFactor); 289 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto r, m_maxPageScaleFactor);
292 hostImpl->setBackgroundColor(m_backgroundColor); 290 hostImpl->setBackgroundColor(m_backgroundColor);
293 hostImpl->setHasTransparentBackground(m_hasTransparentBackground); 291 hostImpl->setHasTransparentBackground(m_hasTransparentBackground);
294 hostImpl->setDebugState(m_debugState); 292 hostImpl->setDebugState(m_debugState);
295 293
296 m_commitNumber++; 294 m_commitNumber++;
297 } 295 }
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 { 409 {
412 return m_proxy->commitRequested(); 410 return m_proxy->commitRequested();
413 } 411 }
414 412
415 void LayerTreeHost::setAnimationEvents(scoped_ptr<AnimationEventsVector> events, base::Time wallClockTime) 413 void LayerTreeHost::setAnimationEvents(scoped_ptr<AnimationEventsVector> events, base::Time wallClockTime)
416 { 414 {
417 DCHECK(m_proxy->isMainThread()); 415 DCHECK(m_proxy->isMainThread());
418 setAnimationEventsRecursive(*events.get(), m_rootLayer.get(), wallClockTime) ; 416 setAnimationEventsRecursive(*events.get(), m_rootLayer.get(), wallClockTime) ;
419 } 417 }
420 418
421 void LayerTreeHost::didAddAnimation()
422 {
423 m_needsAnimateLayers = true;
424 m_proxy->didAddAnimation();
425 }
426
427 void LayerTreeHost::setRootLayer(scoped_refptr<Layer> rootLayer) 419 void LayerTreeHost::setRootLayer(scoped_refptr<Layer> rootLayer)
428 { 420 {
429 if (m_rootLayer == rootLayer) 421 if (m_rootLayer == rootLayer)
430 return; 422 return;
431 423
432 if (m_rootLayer) 424 if (m_rootLayer)
433 m_rootLayer->setLayerTreeHost(0); 425 m_rootLayer->setLayerTreeHost(0);
434 m_rootLayer = rootLayer; 426 m_rootLayer = rootLayer;
435 if (m_rootLayer) 427 if (m_rootLayer)
436 m_rootLayer->setLayerTreeHost(this); 428 m_rootLayer->setLayerTreeHost(this);
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 { 811 {
820 if (deviceScaleFactor == m_deviceScaleFactor) 812 if (deviceScaleFactor == m_deviceScaleFactor)
821 return; 813 return;
822 m_deviceScaleFactor = deviceScaleFactor; 814 m_deviceScaleFactor = deviceScaleFactor;
823 815
824 setNeedsCommit(); 816 setNeedsCommit();
825 } 817 }
826 818
827 void LayerTreeHost::animateLayers(base::TimeTicks time) 819 void LayerTreeHost::animateLayers(base::TimeTicks time)
828 { 820 {
829 if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers) 821 if (!m_settings.acceleratedAnimationEnabled || m_activeAnimationControllers. empty())
830 return; 822 return;
831 823
832 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); 824 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers");
833 m_needsAnimateLayers = animateLayersRecursive(m_rootLayer.get(), time);
834 }
835 825
836 bool LayerTreeHost::animateLayersRecursive(Layer* current, base::TimeTicks time) 826 double monotonicTime = (time - base::TimeTicks()).InSecondsF();
837 {
838 if (!current)
839 return false;
840 827
841 bool subtreeNeedsAnimateLayers = false; 828 AnimationControllerMap copy = m_activeAnimationControllers;
842 LayerAnimationController* currentController = current->layerAnimationControl ler(); 829 for (AnimationControllerMap::iterator iter = copy.begin(); iter != copy.end( ); ++iter)
843 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); 830 (*iter).second->animate(monotonicTime, 0);
844 currentController->animate(monotonicTime, 0);
845
846 // If the current controller still has an active animation, we must continue animating layers.
847 if (currentController->hasActiveAnimation())
848 subtreeNeedsAnimateLayers = true;
849
850 for (size_t i = 0; i < current->children().size(); ++i) {
851 if (animateLayersRecursive(current->children()[i].get(), time))
852 subtreeNeedsAnimateLayers = true;
853 }
854
855 return subtreeNeedsAnimateLayers;
856 } 831 }
857 832
858 void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& eve nts, Layer* layer, base::Time wallClockTime) 833 void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& eve nts, Layer* layer, base::Time wallClockTime)
859 { 834 {
860 if (!layer) 835 if (!layer)
861 return; 836 return;
862 837
863 for (size_t eventIndex = 0; eventIndex < events.size(); ++eventIndex) { 838 for (size_t eventIndex = 0; eventIndex < events.size(); ++eventIndex) {
864 if (layer->id() == events[eventIndex].layerId) { 839 if (layer->id() == events[eventIndex].layerId) {
865 if (events[eventIndex].type == AnimationEvent::Started) 840 if (events[eventIndex].type == AnimationEvent::Started)
866 layer->notifyAnimationStarted(events[eventIndex], wallClockTime. ToDoubleT()); 841 layer->notifyAnimationStarted(events[eventIndex], wallClockTime. ToDoubleT());
867 else 842 else
868 layer->notifyAnimationFinished(wallClockTime.ToDoubleT()); 843 layer->notifyAnimationFinished(wallClockTime.ToDoubleT());
869 } 844 }
870 } 845 }
871 846
872 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn dex) 847 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn dex)
873 setAnimationEventsRecursive(events, layer->children()[childIndex].get(), wallClockTime); 848 setAnimationEventsRecursive(events, layer->children()[childIndex].get(), wallClockTime);
874 } 849 }
875 850
851 scoped_refptr<LayerAnimationController> LayerTreeHost::GetAnimationControllerFor Id(int id)
852 {
853 // On the main thread, animation controllers are created by the layers.
854 NOTREACHED();
855 return NULL;
856 }
857
858 void LayerTreeHost::DidActivateAnimationController(LayerAnimationController* con troller)
859 {
860 // Controllers register themselves when they have new animations. We need
861 // to commit in this case.
862 setNeedsCommit();
863 m_activeAnimationControllers[controller->id()] = controller;
864 }
865
866 void LayerTreeHost::DidDeactivateAnimationController(LayerAnimationController* c ontroller)
867 {
868 if (ContainsKey(m_activeAnimationControllers, controller->id()))
869 m_activeAnimationControllers.erase(controller->id());
870 }
871
872 void LayerTreeHost::RegisterAnimationController(LayerAnimationController* contro ller)
873 {
874 m_allAnimationControllers[controller->id()] = controller;
875 }
876
877 void LayerTreeHost::UnregisterAnimationController(LayerAnimationController* cont roller)
878 {
879 if (ContainsKey(m_allAnimationControllers, controller->id()))
880 m_allAnimationControllers.erase(controller->id());
881 DidDeactivateAnimationController(controller);
882 }
883
876 } // namespace cc 884 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698