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

Side by Side Diff: third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp

Issue 1770443002: Takeover MT initiated animations from the compositor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nitsnits Created 4 years, 9 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2011, Google Inc. All rights reserved. 2 * Copyright (c) 2011, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 if (m_runState == RunState::PostAnimationCleanup) 136 if (m_runState == RunState::PostAnimationCleanup)
137 resetAnimationState(); 137 resetAnimationState();
138 138
139 if (m_animationCurve && m_runState != RunState::WaitingToCancelOnCompositor) { 139 if (m_animationCurve && m_runState != RunState::WaitingToCancelOnCompositor) {
140 if ((targetPos - m_targetOffset).isZero()) 140 if ((targetPos - m_targetOffset).isZero())
141 return true; 141 return true;
142 142
143 m_targetOffset = targetPos; 143 m_targetOffset = targetPos;
144 ASSERT(m_runState == RunState::RunningOnMainThread 144 ASSERT(m_runState == RunState::RunningOnMainThread
145 || m_runState == RunState::RunningOnCompositor 145 || m_runState == RunState::RunningOnCompositor
146 || m_runState == RunState::RunningOnCompositorButNeedsUpdate); 146 || m_runState == RunState::RunningOnCompositorButNeedsUpdate
147 || m_runState == RunState::RunningOnCompositorButNeedsTakeover);
147 148
148 if (m_runState == RunState::RunningOnCompositor 149 // Running on the main thread, simply update the target offset instead
149 || m_runState == RunState::RunningOnCompositorButNeedsUpdate) { 150 // of sending to the compositor.
150 if (registerAndScheduleAnimation()) 151 if (m_runState == RunState::RunningOnMainThread) {
151 m_runState = RunState::RunningOnCompositorButNeedsUpdate; 152 m_animationCurve->updateTarget(m_timeFunction() - m_startTime, targe tPos);
152 return true; 153 return true;
153 } 154 }
154 155
155 // Running on the main thread, simply update the target offset instead 156 if (registerAndScheduleAnimation())
156 // of sending to the compositor. 157 m_runState = RunState::RunningOnCompositorButNeedsUpdate;
157 m_animationCurve->updateTarget(m_timeFunction() - m_startTime, targetPos );
158 return true; 158 return true;
159 } 159 }
160 160
161 if ((targetPos - currentPosition()).isZero()) 161 if ((targetPos - currentPosition()).isZero())
162 return false; 162 return false;
163 163
164 m_targetOffset = targetPos; 164 m_targetOffset = targetPos;
165 m_startTime = m_timeFunction(); 165 m_startTime = m_timeFunction();
166 166
167 if (registerAndScheduleAnimation()) 167 if (registerAndScheduleAnimation())
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 205
206 void ScrollAnimator::postAnimationCleanupAndReset() 206 void ScrollAnimator::postAnimationCleanupAndReset()
207 { 207 {
208 // Remove the temporary main thread scrolling reason that was added while 208 // Remove the temporary main thread scrolling reason that was added while
209 // main thread had scheduled an animation. 209 // main thread had scheduled an animation.
210 removeMainThreadScrollingReason(); 210 removeMainThreadScrollingReason();
211 211
212 resetAnimationState(); 212 resetAnimationState();
213 } 213 }
214 214
215 bool ScrollAnimator::sendAnimationToCompositor()
216 {
217 if (m_scrollableArea->shouldScrollOnMainThread())
218 return false;
219
220 OwnPtr<CompositorAnimation> animation = adoptPtr(
221 CompositorFactory::current().createAnimation(
222 *m_animationCurve,
223 CompositorTargetProperty::SCROLL_OFFSET));
224 // Being here means that either there is an animation that needs
225 // to be sent to the compositor, or an animation that needs to
226 // be updated (a new scroll event before the previous animation
227 // is finished). In either case, the start time is when the
228 // first animation was initiated. This re-targets the animation
229 // using the current time on main thread.
230 animation->setStartTime(m_startTime);
231
232 int animationId = animation->id();
233 int animationGroupId = animation->group();
234
235 bool sentToCompositor = addAnimation(animation.release());
236 if (sentToCompositor) {
237 m_runState = RunState::RunningOnCompositor;
238 m_compositorAnimationId = animationId;
239 m_compositorAnimationGroupId = animationGroupId;
240 }
241
242 return sentToCompositor;
243 }
244
215 void ScrollAnimator::updateCompositorAnimations() 245 void ScrollAnimator::updateCompositorAnimations()
216 { 246 {
217 if (m_runState == RunState::PostAnimationCleanup) { 247 if (m_runState == RunState::PostAnimationCleanup) {
218 postAnimationCleanupAndReset(); 248 postAnimationCleanupAndReset();
219 return; 249 return;
220 } 250 }
221 251
222 if (m_compositorAnimationId && m_runState != RunState::RunningOnCompositor 252 if (m_compositorAnimationId && m_runState != RunState::RunningOnCompositor
223 && m_runState != RunState::RunningOnCompositorButNeedsUpdate) { 253 && m_runState != RunState::RunningOnCompositorButNeedsUpdate) {
224 // If the current run state is WaitingToSendToCompositor but we have a 254 // If the current run state is WaitingToSendToCompositor but we have a
225 // non-zero compositor animation id, there's a currently running 255 // non-zero compositor animation id, there's a currently running
226 // compositor animation that needs to be removed here before the new 256 // compositor animation that needs to be removed here before the new
227 // animation is added below. 257 // animation is added below.
228 ASSERT(m_runState == RunState::WaitingToCancelOnCompositor 258 ASSERT(m_runState == RunState::WaitingToCancelOnCompositor
229 || m_runState == RunState::WaitingToSendToCompositor); 259 || m_runState == RunState::WaitingToSendToCompositor
260 || m_runState == RunState::RunningOnCompositorButNeedsTakeover);
230 261
231 abortAnimation(); 262 if (m_runState == RunState::RunningOnCompositorButNeedsTakeover) {
263 // The animation is already aborted when the call to
264 // ::takeoverCompositorAnimation is made.
265 m_runState = RunState::WaitingToSendToCompositor;
266 } else {
267 abortAnimation();
268 }
232 269
233 m_compositorAnimationId = 0; 270 m_compositorAnimationId = 0;
234 m_compositorAnimationGroupId = 0; 271 m_compositorAnimationGroupId = 0;
235 if (m_runState == RunState::WaitingToCancelOnCompositor) { 272 if (m_runState == RunState::WaitingToCancelOnCompositor) {
236 postAnimationCleanupAndReset(); 273 postAnimationCleanupAndReset();
237 return; 274 return;
238 } 275 }
239 } 276 }
240 277
241 if (m_runState == RunState::WaitingToSendToCompositor 278 if (m_runState == RunState::WaitingToSendToCompositor
(...skipping 14 matching lines...) Expand all
256 if (!m_animationCurve) { 293 if (!m_animationCurve) {
257 m_animationCurve = adoptPtr(CompositorFactory::current().createScrol lOffsetAnimationCurve( 294 m_animationCurve = adoptPtr(CompositorFactory::current().createScrol lOffsetAnimationCurve(
258 m_targetOffset, 295 m_targetOffset,
259 CompositorAnimationCurve::TimingFunctionTypeEaseInOut, 296 CompositorAnimationCurve::TimingFunctionTypeEaseInOut,
260 m_lastGranularity == ScrollByPixel ? 297 m_lastGranularity == ScrollByPixel ?
261 CompositorScrollOffsetAnimationCurve::ScrollDurationInverseD elta : 298 CompositorScrollOffsetAnimationCurve::ScrollDurationInverseD elta :
262 CompositorScrollOffsetAnimationCurve::ScrollDurationConstant )); 299 CompositorScrollOffsetAnimationCurve::ScrollDurationConstant ));
263 m_animationCurve->setInitialValue(currentPosition()); 300 m_animationCurve->setInitialValue(currentPosition());
264 } 301 }
265 302
266 bool sentToCompositor = false;
267 if (!m_scrollableArea->shouldScrollOnMainThread()) {
268 OwnPtr<CompositorAnimation> animation = adoptPtr(
269 CompositorFactory::current().createAnimation(
270 *m_animationCurve,
271 CompositorTargetProperty::SCROLL_OFFSET));
272 // Being here means that either there is an animation that needs
273 // to be sent to the compositor, or an animation that needs to
274 // be updated (a new scroll event before the previous animation
275 // is finished). In either case, the start time is when the
276 // first animation was initiated. This re-targets the animation
277 // using the current time on main thread.
278 animation->setStartTime(m_startTime);
279
280 int animationId = animation->id();
281 int animationGroupId = animation->group();
282
283 sentToCompositor = addAnimation(animation.release());
284 if (sentToCompositor) {
285 m_runState = RunState::RunningOnCompositor;
286 m_compositorAnimationId = animationId;
287 m_compositorAnimationGroupId = animationGroupId;
288 }
289 }
290
291 bool runningOnMainThread = false; 303 bool runningOnMainThread = false;
304 bool sentToCompositor = sendAnimationToCompositor();
292 if (!sentToCompositor) { 305 if (!sentToCompositor) {
293 runningOnMainThread = registerAndScheduleAnimation(); 306 runningOnMainThread = registerAndScheduleAnimation();
294 if (runningOnMainThread) 307 if (runningOnMainThread)
295 m_runState = RunState::RunningOnMainThread; 308 m_runState = RunState::RunningOnMainThread;
296 } 309 }
297 310
298 // Main thread should deal with the scroll animations it started. 311 // Main thread should deal with the scroll animations it started.
299 if (sentToCompositor || runningOnMainThread) 312 if (sentToCompositor || runningOnMainThread)
300 addMainThreadScrollingReason(); 313 addMainThreadScrollingReason();
301 else 314 else
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 std::move(scrollOffsetAnimationCurve))); 364 std::move(scrollOffsetAnimationCurve)));
352 m_startTime = animationStartTime; 365 m_startTime = animationStartTime;
353 } 366 }
354 } 367 }
355 368
356 void ScrollAnimator::cancelAnimation() 369 void ScrollAnimator::cancelAnimation()
357 { 370 {
358 ScrollAnimatorCompositorCoordinator::cancelAnimation(); 371 ScrollAnimatorCompositorCoordinator::cancelAnimation();
359 } 372 }
360 373
374 void ScrollAnimator::takeoverCompositorAnimation()
375 {
376 if (m_runState == RunState::RunningOnCompositor
377 || m_runState == RunState::RunningOnCompositorButNeedsUpdate)
378 removeMainThreadScrollingReason();
379
380 ScrollAnimatorCompositorCoordinator::takeoverCompositorAnimation();
381 }
382
361 void ScrollAnimator::layerForCompositedScrollingDidChange( 383 void ScrollAnimator::layerForCompositedScrollingDidChange(
362 CompositorAnimationTimeline* timeline) 384 CompositorAnimationTimeline* timeline)
363 { 385 {
364 if (reattachCompositorPlayerIfNeeded(timeline) && m_animationCurve) 386 if (reattachCompositorPlayerIfNeeded(timeline) && m_animationCurve)
365 addMainThreadScrollingReason(); 387 addMainThreadScrollingReason();
366 } 388 }
367 389
368 bool ScrollAnimator::registerAndScheduleAnimation() 390 bool ScrollAnimator::registerAndScheduleAnimation()
369 { 391 {
370 scrollableArea()->registerForAnimation(); 392 scrollableArea()->registerForAnimation();
371 if (!m_scrollableArea->scheduleAnimation()) { 393 if (!m_scrollableArea->scheduleAnimation()) {
372 scrollToOffsetWithoutAnimation(m_targetOffset); 394 scrollToOffsetWithoutAnimation(m_targetOffset);
373 resetAnimationState(); 395 resetAnimationState();
374 return false; 396 return false;
375 } 397 }
376 return true; 398 return true;
377 } 399 }
378 400
379 DEFINE_TRACE(ScrollAnimator) 401 DEFINE_TRACE(ScrollAnimator)
380 { 402 {
381 ScrollAnimatorBase::trace(visitor); 403 ScrollAnimatorBase::trace(visitor);
382 } 404 }
383 405
384 } // namespace blink 406 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698