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

Side by Side Diff: cc/layer_tree_host.cc

Issue 11443004: Maintain global lists of 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 "cc/font_atlas.h" 10 #include "cc/font_atlas.h"
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 scoped_ptr<LayerTreeHost> LayerTreeHost::create(LayerTreeHostClient* client, con st LayerTreeSettings& settings, scoped_ptr<Thread> implThread) 153 scoped_ptr<LayerTreeHost> LayerTreeHost::create(LayerTreeHostClient* client, con st LayerTreeSettings& settings, scoped_ptr<Thread> implThread)
154 { 154 {
155 scoped_ptr<LayerTreeHost> layerTreeHost(new LayerTreeHost(client, settings)) ; 155 scoped_ptr<LayerTreeHost> layerTreeHost(new LayerTreeHost(client, settings)) ;
156 if (!layerTreeHost->initialize(implThread.Pass())) 156 if (!layerTreeHost->initialize(implThread.Pass()))
157 return scoped_ptr<LayerTreeHost>(); 157 return scoped_ptr<LayerTreeHost>();
158 return layerTreeHost.Pass(); 158 return layerTreeHost.Pass();
159 } 159 }
160 160
161 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting s& settings) 161 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting s& settings)
162 : m_animating(false) 162 : m_animating(false)
163 , m_needsAnimateLayers(false)
164 , m_needsFullTreeSync(true) 163 , m_needsFullTreeSync(true)
165 , m_client(client) 164 , m_client(client)
166 , m_commitNumber(0) 165 , m_commitNumber(0)
167 , m_renderingStats() 166 , m_renderingStats()
168 , m_rendererInitialized(false) 167 , m_rendererInitialized(false)
169 , m_contextLost(false) 168 , m_contextLost(false)
170 , m_numTimesRecreateShouldFail(0) 169 , m_numTimesRecreateShouldFail(0)
171 , m_numFailedRecreateAttempts(0) 170 , m_numFailedRecreateAttempts(0)
172 , m_settings(settings) 171 , m_settings(settings)
173 , m_debugState(settings.initialDebugState) 172 , m_debugState(settings.initialDebugState)
(...skipping 28 matching lines...) Expand all
202 if (m_rootLayer) 201 if (m_rootLayer)
203 m_rootLayer->setLayerTreeHost(0); 202 m_rootLayer->setLayerTreeHost(0);
204 DCHECK(m_proxy); 203 DCHECK(m_proxy);
205 DCHECK(m_proxy->isMainThread()); 204 DCHECK(m_proxy->isMainThread());
206 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); 205 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost");
207 m_proxy->stop(); 206 m_proxy->stop();
208 numLayerTreeInstances--; 207 numLayerTreeInstances--;
209 RateLimiterMap::iterator it = m_rateLimiters.begin(); 208 RateLimiterMap::iterator it = m_rateLimiters.begin();
210 if (it != m_rateLimiters.end()) 209 if (it != m_rateLimiters.end())
211 it->second->stop(); 210 it->second->stop();
211
212 if (m_rootLayer)
213 m_rootLayer = 0;
212 } 214 }
213 215
214 void LayerTreeHost::setSurfaceReady() 216 void LayerTreeHost::setSurfaceReady()
215 { 217 {
216 m_proxy->setSurfaceReady(); 218 m_proxy->setSurfaceReady();
217 } 219 }
218 220
219 void LayerTreeHost::initializeRenderer() 221 void LayerTreeHost::initializeRenderer()
220 { 222 {
221 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer"); 223 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer");
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 TRACE_EVENT0("cc", "LayerTreeHost::pushPropertiesRecursive"); 353 TRACE_EVENT0("cc", "LayerTreeHost::pushPropertiesRecursive");
352 pushPropertiesRecursive(rootLayer(), hostImpl->rootLayer()); 354 pushPropertiesRecursive(rootLayer(), hostImpl->rootLayer());
353 } 355 }
354 m_needsFullTreeSync = false; 356 m_needsFullTreeSync = false;
355 357
356 if (m_rootLayer && m_hudLayer) 358 if (m_rootLayer && m_hudLayer)
357 hostImpl->setHudLayer(static_cast<HeadsUpDisplayLayerImpl*>(LayerTreeHos tCommon::findLayerInSubtree(hostImpl->rootLayer(), m_hudLayer->id()))); 359 hostImpl->setHudLayer(static_cast<HeadsUpDisplayLayerImpl*>(LayerTreeHos tCommon::findLayerInSubtree(hostImpl->rootLayer(), m_hudLayer->id())));
358 else 360 else
359 hostImpl->setHudLayer(0); 361 hostImpl->setHudLayer(0);
360 362
361 // We may have added an animation during the tree sync. This will cause both layer tree hosts
362 // to visit their controllers.
363 if (rootLayer() && m_needsAnimateLayers)
364 hostImpl->setNeedsAnimateLayers();
365
366 hostImpl->setSourceFrameNumber(commitNumber()); 363 hostImpl->setSourceFrameNumber(commitNumber());
367 hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize()); 364 hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize());
368 hostImpl->setDeviceScaleFactor(deviceScaleFactor()); 365 hostImpl->setDeviceScaleFactor(deviceScaleFactor());
369 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto r, m_maxPageScaleFactor); 366 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto r, m_maxPageScaleFactor);
370 hostImpl->setBackgroundColor(m_backgroundColor); 367 hostImpl->setBackgroundColor(m_backgroundColor);
371 hostImpl->setHasTransparentBackground(m_hasTransparentBackground); 368 hostImpl->setHasTransparentBackground(m_hasTransparentBackground);
372 hostImpl->setDebugState(m_debugState); 369 hostImpl->setDebugState(m_debugState);
373 370
374 m_commitNumber++; 371 m_commitNumber++;
375 } 372 }
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 { 486 {
490 return m_proxy->commitRequested(); 487 return m_proxy->commitRequested();
491 } 488 }
492 489
493 void LayerTreeHost::setAnimationEvents(scoped_ptr<AnimationEventsVector> events, base::Time wallClockTime) 490 void LayerTreeHost::setAnimationEvents(scoped_ptr<AnimationEventsVector> events, base::Time wallClockTime)
494 { 491 {
495 DCHECK(m_proxy->isMainThread()); 492 DCHECK(m_proxy->isMainThread());
496 setAnimationEventsRecursive(*events.get(), m_rootLayer.get(), wallClockTime) ; 493 setAnimationEventsRecursive(*events.get(), m_rootLayer.get(), wallClockTime) ;
497 } 494 }
498 495
499 void LayerTreeHost::didAddAnimation()
500 {
501 m_needsAnimateLayers = true;
502 m_proxy->didAddAnimation();
503 }
504
505 void LayerTreeHost::setRootLayer(scoped_refptr<Layer> rootLayer) 496 void LayerTreeHost::setRootLayer(scoped_refptr<Layer> rootLayer)
506 { 497 {
507 if (m_rootLayer == rootLayer) 498 if (m_rootLayer == rootLayer)
508 return; 499 return;
509 500
510 if (m_rootLayer) 501 if (m_rootLayer)
511 m_rootLayer->setLayerTreeHost(0); 502 m_rootLayer->setLayerTreeHost(0);
512 m_rootLayer = rootLayer; 503 m_rootLayer = rootLayer;
513 if (m_rootLayer) 504 if (m_rootLayer)
514 m_rootLayer->setLayerTreeHost(this); 505 m_rootLayer->setLayerTreeHost(this);
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
897 { 888 {
898 if (deviceScaleFactor == m_deviceScaleFactor) 889 if (deviceScaleFactor == m_deviceScaleFactor)
899 return; 890 return;
900 m_deviceScaleFactor = deviceScaleFactor; 891 m_deviceScaleFactor = deviceScaleFactor;
901 892
902 setNeedsCommit(); 893 setNeedsCommit();
903 } 894 }
904 895
905 void LayerTreeHost::animateLayers(base::TimeTicks time) 896 void LayerTreeHost::animateLayers(base::TimeTicks time)
906 { 897 {
907 if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers) 898 if (!m_settings.acceleratedAnimationEnabled || AnimationRegistrar::GetActive Controllers(AnimationRegistrar::MainThread).empty())
908 return; 899 return;
909 900
910 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); 901 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers");
911 m_needsAnimateLayers = animateLayersRecursive(m_rootLayer.get(), time);
912 }
913 902
914 bool LayerTreeHost::animateLayersRecursive(Layer* current, base::TimeTicks time) 903 double monotonicTime = (time - base::TimeTicks()).InSecondsF();
915 {
916 if (!current)
917 return false;
918 904
919 bool subtreeNeedsAnimateLayers = false; 905 AnimationRegistrar::AnimationControllerSet copy = AnimationRegistrar::GetAct iveControllers(AnimationRegistrar::MainThread);
920 LayerAnimationController* currentController = current->layerAnimationControl ler(); 906 for (AnimationRegistrar::AnimationControllerSet::iterator iter = copy.begin( ); iter != copy.end(); ++iter)
921 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); 907 (*iter)->animate(monotonicTime, 0);
922 currentController->animate(monotonicTime, 0);
923
924 // If the current controller still has an active animation, we must continue animating layers.
925 if (currentController->hasActiveAnimation())
926 subtreeNeedsAnimateLayers = true;
927
928 for (size_t i = 0; i < current->children().size(); ++i) {
929 if (animateLayersRecursive(current->children()[i].get(), time))
930 subtreeNeedsAnimateLayers = true;
931 }
932
933 return subtreeNeedsAnimateLayers;
934 } 908 }
935 909
936 void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& eve nts, Layer* layer, base::Time wallClockTime) 910 void LayerTreeHost::setAnimationEventsRecursive(const AnimationEventsVector& eve nts, Layer* layer, base::Time wallClockTime)
937 { 911 {
938 if (!layer) 912 if (!layer)
939 return; 913 return;
940 914
941 for (size_t eventIndex = 0; eventIndex < events.size(); ++eventIndex) { 915 for (size_t eventIndex = 0; eventIndex < events.size(); ++eventIndex) {
942 if (layer->id() == events[eventIndex].layerId) { 916 if (layer->id() == events[eventIndex].layerId) {
943 if (events[eventIndex].type == AnimationEvent::Started) 917 if (events[eventIndex].type == AnimationEvent::Started)
944 layer->notifyAnimationStarted(events[eventIndex], wallClockTime. ToDoubleT()); 918 layer->notifyAnimationStarted(events[eventIndex], wallClockTime. ToDoubleT());
945 else 919 else
946 layer->notifyAnimationFinished(wallClockTime.ToDoubleT()); 920 layer->notifyAnimationFinished(wallClockTime.ToDoubleT());
947 } 921 }
948 } 922 }
949 923
950 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn dex) 924 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn dex)
951 setAnimationEventsRecursive(events, layer->children()[childIndex].get(), wallClockTime); 925 setAnimationEventsRecursive(events, layer->children()[childIndex].get(), wallClockTime);
952 } 926 }
953 927
954 } // namespace cc 928 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698