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

Unified Diff: third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp

Issue 2029323003: Don't skip a frame when running smooth scroll animation on the main thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nit Created 4 years, 7 months 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
Index: third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
index ef7a5d0f7b7b061d3385d9ac59b56a34564fd148..16e573a942abfd42460037167cf97628de992d10 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
+++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
@@ -186,8 +186,14 @@ bool ScrollAnimator::willAnimateToOffset(const FloatPoint& targetPos)
m_targetOffset = targetPos;
m_startTime = m_timeFunction();
- if (registerAndScheduleAnimation())
- m_runState = RunState::WaitingToSendToCompositor;
+ if (registerAndScheduleAnimation()) {
+ if (m_scrollableArea->shouldScrollOnMainThread()) {
+ createAnimationCurve();
+ m_runState = RunState::RunningOnMainThread;
+ } else {
+ m_runState = RunState::WaitingToSendToCompositor;
+ }
+ }
return true;
}
@@ -287,9 +293,28 @@ bool ScrollAnimator::sendAnimationToCompositor()
return sentToCompositor;
}
+void ScrollAnimator::createAnimationCurve()
+{
+ DCHECK(!m_animationCurve);
+ m_animationCurve = adoptPtr(CompositorFactory::current().createScrollOffsetAnimationCurve(
+ compositorOffsetFromBlinkOffset(m_targetOffset),
+ m_lastGranularity == ScrollByPixel ?
+ CompositorScrollOffsetAnimationCurve::ScrollDurationInverseDelta :
+ CompositorScrollOffsetAnimationCurve::ScrollDurationConstant));
+ m_animationCurve->setInitialValue(compositorOffsetFromBlinkOffset(currentPosition()));
+}
+
void ScrollAnimator::updateCompositorAnimations()
{
ScrollAnimatorCompositorCoordinator::updateCompositorAnimations();
+ if (m_runState == RunState::RunningOnMainThread) {
+ // We add a temporary main thread scrolling reason so that subsequent
+ // scrolls get handled on the main thread. This is removed when the
+ // animation is finished in ::tickAnimation.
+ addMainThreadScrollingReason();
+ return;
+ }
+
if (m_runState == RunState::PostAnimationCleanup) {
postAnimationCleanupAndReset();
return;
@@ -338,14 +363,8 @@ void ScrollAnimator::updateCompositorAnimations()
if (!m_compositorAnimationAttachedToLayerId)
reattachCompositorPlayerIfNeeded(getScrollableArea()->compositorAnimationTimeline());
- if (!m_animationCurve) {
- m_animationCurve = adoptPtr(CompositorFactory::current().createScrollOffsetAnimationCurve(
- compositorOffsetFromBlinkOffset(m_targetOffset),
- m_lastGranularity == ScrollByPixel ?
- CompositorScrollOffsetAnimationCurve::ScrollDurationInverseDelta :
- CompositorScrollOffsetAnimationCurve::ScrollDurationConstant));
- m_animationCurve->setInitialValue(compositorOffsetFromBlinkOffset(currentPosition()));
- }
+ if (!m_animationCurve)
+ createAnimationCurve();
bool runningOnMainThread = false;
bool sentToCompositor = sendAnimationToCompositor();
@@ -366,6 +385,9 @@ void ScrollAnimator::updateCompositorAnimations()
void ScrollAnimator::addMainThreadScrollingReason()
{
if (WebLayer* scrollLayer = toWebLayer(getScrollableArea()->layerForScrolling())) {
+ uint32_t reasons = scrollLayer->mainThreadScrollingReasons();
+ if (reasons & MainThreadScrollingReason::kAnimatingScrollOnMainThread)
+ return;
ajuma 2016/06/02 14:07:27 cc::Layer::AddMainThreadScrollingReasons already e
ymalik 2016/06/02 14:13:10 We essentially call this function every time we're
ajuma 2016/06/02 14:20:27 The call to mainThreadScrollingReasons() winds up
ymalik 2016/06/02 14:30:08 Removed.
scrollLayer->addMainThreadScrollingReasons(
MainThreadScrollingReason::kAnimatingScrollOnMainThread);
}

Powered by Google App Engine
This is Rietveld 408576698