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

Side by Side Diff: cc/layer_tree_host.cc

Issue 11491003: Revert 171714 - Use an auxiliary list of animation controllers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase 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"
11 #include "base/string_number_conversions.h" 10 #include "base/string_number_conversions.h"
12 #include "cc/font_atlas.h" 11 #include "cc/font_atlas.h"
13 #include "cc/heads_up_display_layer.h" 12 #include "cc/heads_up_display_layer.h"
14 #include "cc/heads_up_display_layer_impl.h" 13 #include "cc/heads_up_display_layer_impl.h"
15 #include "cc/layer.h" 14 #include "cc/layer.h"
16 #include "cc/layer_animation_controller.h" 15 #include "cc/layer_animation_controller.h"
17 #include "cc/layer_iterator.h" 16 #include "cc/layer_iterator.h"
18 #include "cc/layer_tree_host_client.h" 17 #include "cc/layer_tree_host_client.h"
19 #include "cc/layer_tree_host_common.h" 18 #include "cc/layer_tree_host_common.h"
20 #include "cc/layer_tree_host_impl.h" 19 #include "cc/layer_tree_host_impl.h"
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 scoped_ptr<LayerTreeHost> LayerTreeHost::create(LayerTreeHostClient* client, con st LayerTreeSettings& settings, scoped_ptr<Thread> implThread) 170 scoped_ptr<LayerTreeHost> LayerTreeHost::create(LayerTreeHostClient* client, con st LayerTreeSettings& settings, scoped_ptr<Thread> implThread)
172 { 171 {
173 scoped_ptr<LayerTreeHost> layerTreeHost(new LayerTreeHost(client, settings)) ; 172 scoped_ptr<LayerTreeHost> layerTreeHost(new LayerTreeHost(client, settings)) ;
174 if (!layerTreeHost->initialize(implThread.Pass())) 173 if (!layerTreeHost->initialize(implThread.Pass()))
175 return scoped_ptr<LayerTreeHost>(); 174 return scoped_ptr<LayerTreeHost>();
176 return layerTreeHost.Pass(); 175 return layerTreeHost.Pass();
177 } 176 }
178 177
179 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting s& settings) 178 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting s& settings)
180 : m_animating(false) 179 : m_animating(false)
180 , m_needsAnimateLayers(false)
181 , m_needsFullTreeSync(true) 181 , m_needsFullTreeSync(true)
182 , m_client(client) 182 , m_client(client)
183 , m_commitNumber(0) 183 , m_commitNumber(0)
184 , m_renderingStats() 184 , m_renderingStats()
185 , m_rendererInitialized(false) 185 , m_rendererInitialized(false)
186 , m_outputSurfaceLost(false) 186 , m_outputSurfaceLost(false)
187 , m_numTimesRecreateShouldFail(0) 187 , m_numTimesRecreateShouldFail(0)
188 , m_numFailedRecreateAttempts(0) 188 , m_numFailedRecreateAttempts(0)
189 , m_settings(settings) 189 , m_settings(settings)
190 , m_debugState(settings.initialDebugState) 190 , m_debugState(settings.initialDebugState)
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 if (m_rootLayer) 228 if (m_rootLayer)
229 m_rootLayer->setLayerTreeHost(0); 229 m_rootLayer->setLayerTreeHost(0);
230 DCHECK(m_proxy); 230 DCHECK(m_proxy);
231 DCHECK(m_proxy->isMainThread()); 231 DCHECK(m_proxy->isMainThread());
232 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); 232 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost");
233 m_proxy->stop(); 233 m_proxy->stop();
234 numLayerTreeInstances--; 234 numLayerTreeInstances--;
235 RateLimiterMap::iterator it = m_rateLimiters.begin(); 235 RateLimiterMap::iterator it = m_rateLimiters.begin();
236 if (it != m_rateLimiters.end()) 236 if (it != m_rateLimiters.end())
237 it->second->stop(); 237 it->second->stop();
238
239 if (m_rootLayer)
240 m_rootLayer = 0;
241 } 238 }
242 239
243 void LayerTreeHost::setSurfaceReady() 240 void LayerTreeHost::setSurfaceReady()
244 { 241 {
245 m_proxy->setSurfaceReady(); 242 m_proxy->setSurfaceReady();
246 } 243 }
247 244
248 void LayerTreeHost::initializeRenderer() 245 void LayerTreeHost::initializeRenderer()
249 { 246 {
250 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer"); 247 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer");
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 TRACE_EVENT0("cc", "LayerTreeHost::pushPropertiesRecursive"); 380 TRACE_EVENT0("cc", "LayerTreeHost::pushPropertiesRecursive");
384 pushPropertiesRecursive(rootLayer(), hostImpl->rootLayer()); 381 pushPropertiesRecursive(rootLayer(), hostImpl->rootLayer());
385 } 382 }
386 m_needsFullTreeSync = false; 383 m_needsFullTreeSync = false;
387 384
388 if (m_rootLayer && m_hudLayer) 385 if (m_rootLayer && m_hudLayer)
389 hostImpl->activeTree()->set_hud_layer(static_cast<HeadsUpDisplayLayerImp l*>(LayerTreeHostCommon::findLayerInSubtree(hostImpl->rootLayer(), m_hudLayer->i d()))); 386 hostImpl->activeTree()->set_hud_layer(static_cast<HeadsUpDisplayLayerImp l*>(LayerTreeHostCommon::findLayerInSubtree(hostImpl->rootLayer(), m_hudLayer->i d())));
390 else 387 else
391 hostImpl->activeTree()->set_hud_layer(0); 388 hostImpl->activeTree()->set_hud_layer(0);
392 389
390 // We may have added an animation during the tree sync. This will cause both layer tree hosts
391 // to visit their controllers.
392 if (rootLayer() && m_needsAnimateLayers)
393 hostImpl->setNeedsAnimateLayers();
394
393 hostImpl->activeTree()->set_source_frame_number(commitNumber()); 395 hostImpl->activeTree()->set_source_frame_number(commitNumber());
394 hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize()); 396 hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize());
395 hostImpl->setDeviceScaleFactor(deviceScaleFactor()); 397 hostImpl->setDeviceScaleFactor(deviceScaleFactor());
396 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto r, m_maxPageScaleFactor); 398 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto r, m_maxPageScaleFactor);
397 hostImpl->setBackgroundColor(m_backgroundColor); 399 hostImpl->setBackgroundColor(m_backgroundColor);
398 hostImpl->setHasTransparentBackground(m_hasTransparentBackground); 400 hostImpl->setHasTransparentBackground(m_hasTransparentBackground);
399 hostImpl->setDebugState(m_debugState); 401 hostImpl->setDebugState(m_debugState);
400 402
401 m_commitNumber++; 403 m_commitNumber++;
402 } 404 }
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 { 518 {
517 return m_proxy->commitRequested(); 519 return m_proxy->commitRequested();
518 } 520 }
519 521
520 void LayerTreeHost::setAnimationEvents(scoped_ptr<AnimationEventsVector> events, base::Time wallClockTime) 522 void LayerTreeHost::setAnimationEvents(scoped_ptr<AnimationEventsVector> events, base::Time wallClockTime)
521 { 523 {
522 DCHECK(m_proxy->isMainThread()); 524 DCHECK(m_proxy->isMainThread());
523 setAnimationEventsRecursive(*events.get(), m_rootLayer.get(), wallClockTime) ; 525 setAnimationEventsRecursive(*events.get(), m_rootLayer.get(), wallClockTime) ;
524 } 526 }
525 527
528 void LayerTreeHost::didAddAnimation()
529 {
530 m_needsAnimateLayers = true;
531 m_proxy->didAddAnimation();
532 }
533
526 void LayerTreeHost::setRootLayer(scoped_refptr<Layer> rootLayer) 534 void LayerTreeHost::setRootLayer(scoped_refptr<Layer> rootLayer)
527 { 535 {
528 if (m_rootLayer == rootLayer) 536 if (m_rootLayer == rootLayer)
529 return; 537 return;
530 538
531 if (m_rootLayer) 539 if (m_rootLayer)
532 m_rootLayer->setLayerTreeHost(0); 540 m_rootLayer->setLayerTreeHost(0);
533 m_rootLayer = rootLayer; 541 m_rootLayer = rootLayer;
534 if (m_rootLayer) 542 if (m_rootLayer)
535 m_rootLayer->setLayerTreeHost(this); 543 m_rootLayer->setLayerTreeHost(this);
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
918 { 926 {
919 if (deviceScaleFactor == m_deviceScaleFactor) 927 if (deviceScaleFactor == m_deviceScaleFactor)
920 return; 928 return;
921 m_deviceScaleFactor = deviceScaleFactor; 929 m_deviceScaleFactor = deviceScaleFactor;
922 930
923 setNeedsCommit(); 931 setNeedsCommit();
924 } 932 }
925 933
926 void LayerTreeHost::animateLayers(base::TimeTicks time) 934 void LayerTreeHost::animateLayers(base::TimeTicks time)
927 { 935 {
928 if (!m_settings.acceleratedAnimationEnabled || m_activeAnimationControllers. empty()) 936 if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers)
929 return; 937 return;
930 938
931 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); 939 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers");
940 m_needsAnimateLayers = animateLayersRecursive(m_rootLayer.get(), time);
941 }
932 942
943 bool LayerTreeHost::animateLayersRecursive(Layer* current, base::TimeTicks time)
944 {
945 if (!current)
946 return false;
947
948 bool subtreeNeedsAnimateLayers = false;
949 LayerAnimationController* currentController = current->layerAnimationControl ler();
933 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); 950 double monotonicTime = (time - base::TimeTicks()).InSecondsF();
951 currentController->animate(monotonicTime, 0);
934 952
935 AnimationControllerSet copy = m_activeAnimationControllers; 953 // If the current controller still has an active animation, we must continue animating layers.
936 for (AnimationControllerSet::iterator iter = copy.begin(); iter != copy.end( ); ++iter) 954 if (currentController->hasActiveAnimation())
937 (*iter)->animate(monotonicTime, 0); 955 subtreeNeedsAnimateLayers = true;
956
957 for (size_t i = 0; i < current->children().size(); ++i) {
958 if (animateLayersRecursive(current->children()[i].get(), time))
959 subtreeNeedsAnimateLayers = true;
960 }
961
962 return subtreeNeedsAnimateLayers;
938 } 963 }
939 964
940 void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& eve nts, Layer* layer, base::Time wallClockTime) 965 void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& eve nts, Layer* layer, base::Time wallClockTime)
941 { 966 {
942 if (!layer) 967 if (!layer)
943 return; 968 return;
944 969
945 for (size_t eventIndex = 0; eventIndex < events.size(); ++eventIndex) { 970 for (size_t eventIndex = 0; eventIndex < events.size(); ++eventIndex) {
946 if (layer->id() == events[eventIndex].layerId) { 971 if (layer->id() == events[eventIndex].layerId) {
947 if (events[eventIndex].type == AnimationEvent::Started) 972 if (events[eventIndex].type == AnimationEvent::Started)
948 layer->notifyAnimationStarted(events[eventIndex], wallClockTime. ToDoubleT()); 973 layer->notifyAnimationStarted(events[eventIndex], wallClockTime. ToDoubleT());
949 else 974 else
950 layer->notifyAnimationFinished(wallClockTime.ToDoubleT()); 975 layer->notifyAnimationFinished(wallClockTime.ToDoubleT());
951 } 976 }
952 } 977 }
953 978
954 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn dex) 979 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn dex)
955 setAnimationEventsRecursive(events, layer->children()[childIndex].get(), wallClockTime); 980 setAnimationEventsRecursive(events, layer->children()[childIndex].get(), wallClockTime);
956 } 981 }
957 982
958 void LayerTreeHost::DidActivateAnimationController(LayerAnimationController* con troller) {
959 // Controllers register themselves when they have new animations. We need
960 // to commit in this case.
961 setNeedsCommit();
962 m_activeAnimationControllers.insert(controller);
963 }
964
965 void LayerTreeHost::DidDeactivateAnimationController(LayerAnimationController* c ontroller) {
966 if (ContainsKey(m_activeAnimationControllers, controller))
967 m_activeAnimationControllers.erase(controller);
968 }
969
970 void LayerTreeHost::RegisterAnimationController(LayerAnimationController* contro ller) {
971 #if !defined(NDEBUG)
972 m_allAnimationControllers.insert(controller);
973 #endif
974 }
975
976 void LayerTreeHost::UnregisterAnimationController(LayerAnimationController* cont roller) {
977 #if !defined(NDEBUG)
978 if (ContainsKey(m_allAnimationControllers, controller))
979 m_allAnimationControllers.erase(controller);
980 #endif
981 DidDeactivateAnimationController(controller);
982 }
983
984 } // namespace cc 983 } // 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