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

Unified Diff: cc/layer_tree_host_impl.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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/layer_tree_host_impl.h ('k') | cc/proxy.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/layer_tree_host_impl.cc
diff --git a/cc/layer_tree_host_impl.cc b/cc/layer_tree_host_impl.cc
index 236a63a4cfbde6f6f5a1a009c757ed3fee383c5b..3050ec2217a20235b1a2403a9bfbc6a4907281ba 100644
--- a/cc/layer_tree_host_impl.cc
+++ b/cc/layer_tree_host_impl.cc
@@ -9,7 +9,6 @@
#include "base/basictypes.h"
#include "base/debug/trace_event.h"
#include "base/json/json_writer.h"
-#include "base/stl_util.h"
#include "cc/append_quads_data.h"
#include "cc/damage_tracker.h"
#include "cc/debug_rect_history.h"
@@ -219,6 +218,7 @@ LayerTreeHostImpl::LayerTreeHostImpl(const LayerTreeSettings& settings, LayerTre
PriorityCalculator::allowNothingCutoff())
, m_backgroundColor(0)
, m_hasTransparentBackground(false)
+ , m_needsAnimateLayers(false)
, m_pinchGestureActive(false)
, m_fpsCounter(FrameRateCounter::create(m_proxy->hasImplThread()))
, m_debugRectHistory(DebugRectHistory::create())
@@ -243,13 +243,8 @@ LayerTreeHostImpl::~LayerTreeHostImpl()
DCHECK(m_proxy->isImplThread());
TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()");
- if (rootLayer()) {
+ if (rootLayer())
clearRenderSurfaces();
- // The layer trees must be destroyed before the layer tree host. We've
- // made a contract with our animation controllers that the registrar
- // will outlive them, and we must make good.
- m_activeTree.reset();
- }
}
void LayerTreeHostImpl::beginCommit()
@@ -597,6 +592,35 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
return drawFrame;
}
+void LayerTreeHostImpl::animateLayersRecursive(LayerImpl* current, base::TimeTicks monotonicTime, base::Time wallClockTime, AnimationEventsVector* events, bool& didAnimate, bool& needsAnimateLayers)
+{
+ bool subtreeNeedsAnimateLayers = false;
+
+ LayerAnimationController* currentController = current->layerAnimationController();
+
+ bool hadActiveAnimation = currentController->hasActiveAnimation();
+ double monotonicTimeSeconds = (monotonicTime - base::TimeTicks()).InSecondsF();
+ currentController->animate(monotonicTimeSeconds, events);
+ bool startedAnimation = events->size() > 0;
+
+ // We animated if we either ticked a running animation, or started a new animation.
+ if (hadActiveAnimation || startedAnimation)
+ didAnimate = true;
+
+ // If the current controller still has an active animation, we must continue animating layers.
+ if (currentController->hasActiveAnimation())
+ subtreeNeedsAnimateLayers = true;
+
+ for (size_t i = 0; i < current->children().size(); ++i) {
+ bool childNeedsAnimateLayers = false;
+ animateLayersRecursive(current->children()[i], monotonicTime, wallClockTime, events, didAnimate, childNeedsAnimateLayers);
+ if (childNeedsAnimateLayers)
+ subtreeNeedsAnimateLayers = true;
+ }
+
+ needsAnimateLayers = subtreeNeedsAnimateLayers;
+}
+
void LayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled)
{
// Lazily create the timeSource adapter so that we can vary the interval for testing.
@@ -953,7 +977,7 @@ void LayerTreeHostImpl::setVisible(bool visible)
m_renderer->setVisible(visible);
- setBackgroundTickingEnabled(!m_visible && !m_activeAnimationControllers.empty());
+ setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers);
}
bool LayerTreeHostImpl::initializeRenderer(scoped_ptr<OutputSurface> outputSurface)
@@ -1508,23 +1532,23 @@ void LayerTreeHostImpl::animatePageScale(base::TimeTicks time)
void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time wallClockTime)
{
- if (!m_settings.acceleratedAnimationEnabled || m_activeAnimationControllers.empty() || !rootLayer())
+ if (!m_settings.acceleratedAnimationEnabled || !m_needsAnimateLayers || !rootLayer())
return;
TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers");
- double monotonicSeconds = (monotonicTime - base::TimeTicks()).InSecondsF();
-
scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEventsVector));
- AnimationControllerSet copy = m_activeAnimationControllers;
- for (AnimationControllerSet::iterator iter = copy.begin(); iter != copy.end(); ++iter)
- (*iter)->animate(monotonicSeconds, events.get());
+
+ bool didAnimate = false;
+ animateLayersRecursive(rootLayer(), monotonicTime, wallClockTime, events.get(), didAnimate, m_needsAnimateLayers);
if (!events->empty())
m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wallClockTime);
- m_client->setNeedsRedrawOnImplThread();
- setBackgroundTickingEnabled(!m_visible && !m_activeAnimationControllers.empty());
+ if (didAnimate)
+ m_client->setNeedsRedrawOnImplThread();
+
+ setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers);
}
base::TimeDelta LayerTreeHostImpl::lowFrequencyAnimationInterval() const
@@ -1654,27 +1678,4 @@ void LayerTreeHostImpl::animateScrollbarsRecursive(LayerImpl* layer, base::TimeT
animateScrollbarsRecursive(layer->children()[i], time);
}
-void LayerTreeHostImpl::DidActivateAnimationController(LayerAnimationController* controller) {
- m_activeAnimationControllers.insert(controller);
-}
-
-void LayerTreeHostImpl::DidDeactivateAnimationController(LayerAnimationController* controller) {
- if (ContainsKey(m_activeAnimationControllers, controller))
- m_activeAnimationControllers.erase(controller);
-}
-
-void LayerTreeHostImpl::RegisterAnimationController(LayerAnimationController* controller) {
-#if !defined(NDEBUG)
- m_allAnimationControllers.insert(controller);
-#endif
-}
-
-void LayerTreeHostImpl::UnregisterAnimationController(LayerAnimationController* controller) {
-#if !defined(NDEBUG)
- if (ContainsKey(m_allAnimationControllers, controller))
- m_allAnimationControllers.erase(controller);
-#endif
- DidDeactivateAnimationController(controller);
-}
-
} // namespace cc
« no previous file with comments | « cc/layer_tree_host_impl.h ('k') | cc/proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698