Commit 9c32d82d authored by Kevin Ellis's avatar Kevin Ellis Committed by Commit Bot

Do not composite infinite duration animations.

This patch prevents infinite duration animations from running on the
compositor. These animations are locked at progress = 0, and therefore
do not benefit from compositing.  Infinite duration animations are
properly handled when running as main thread animations.

Bug: 1057076
Change-Id: Ibe4d4d9939060aeb8f62f4b5d94ca3d941b07ba1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2087225
Commit-Queue: Kevin Ellis <kevers@chromium.org>
Reviewed-by: default avatarRobert Flack <flackr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#748299}
parent 0e143cb7
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/bindings/core/v8/double_or_scroll_timeline_auto_keyword.h" #include "third_party/blink/renderer/bindings/core/v8/double_or_scroll_timeline_auto_keyword.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_optional_effect_timing.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_scroll_timeline_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_scroll_timeline_options.h"
#include "third_party/blink/renderer/core/animation/animation_clock.h" #include "third_party/blink/renderer/core/animation/animation_clock.h"
#include "third_party/blink/renderer/core/animation/css/compositor_keyframe_double.h" #include "third_party/blink/renderer/core/animation/css/compositor_keyframe_double.h"
...@@ -1379,6 +1380,21 @@ TEST_F(AnimationAnimationTestCompositing, SetKeyframesCausesCompositorPending) { ...@@ -1379,6 +1380,21 @@ TEST_F(AnimationAnimationTestCompositing, SetKeyframesCausesCompositorPending) {
EXPECT_TRUE(animation->CompositorPendingForTesting()); EXPECT_TRUE(animation->CompositorPendingForTesting());
} }
// crbug.com/1057076
// Infinite duration animations should not run on the compositor.
TEST_F(AnimationAnimationTestCompositing, InfiniteDurationAnimation) {
ResetWithCompositedAnimation();
EXPECT_EQ(CompositorAnimations::kNoFailure,
animation->CheckCanStartAnimationOnCompositor(nullptr));
OptionalEffectTiming* effect_timing = OptionalEffectTiming::Create();
effect_timing->setDuration(UnrestrictedDoubleOrString::FromUnrestrictedDouble(
std::numeric_limits<double>::infinity()));
animation->effect()->updateTiming(effect_timing);
EXPECT_EQ(CompositorAnimations::kEffectHasUnsupportedTimingParameters,
animation->CheckCanStartAnimationOnCompositor(nullptr));
}
// Verifies correctness of scroll linked animation current and start times in // Verifies correctness of scroll linked animation current and start times in
// various animation states. // various animation states.
TEST_F(AnimationAnimationTestNoCompositing, ScrollLinkedAnimationCreation) { TEST_F(AnimationAnimationTestNoCompositing, ScrollLinkedAnimationCreation) {
......
...@@ -553,7 +553,8 @@ bool CompositorAnimations::ConvertTimingForCompositor( ...@@ -553,7 +553,8 @@ bool CompositorAnimations::ConvertTimingForCompositor(
return false; return false;
if (!timing.iteration_duration || !timing.iteration_count || if (!timing.iteration_duration || !timing.iteration_count ||
timing.iteration_duration->is_zero()) timing.iteration_duration->is_zero() ||
timing.iteration_duration->is_max())
return false; return false;
// Compositor's time offset is positive for seeking into the animation. // Compositor's time offset is positive for seeking into the animation.
......
<!DOCTYPE html>
<title>Reference for infinite duration animation</title>
<style>
#notes {
position: absolute;
left: 0px;
top: 100px;
}
body {
background: white;
}
</style>
<body>
<p id="notes">
This test creates an infinite duration animations, which should be stuck at
a progress of 0. If any blue pixels appear in the screenshot, the test
fails.
</p>
</body>
<!DOCTYPE html>
<html class="reftest-wait">
<meta charset="UTF-8">
<title>Infinite duration animation</title>
<link rel="match" href="infinite-duration-animation-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="../../testcommon.js"></script>
<style>
#box-1, #box-2 {
border: 1px solid white;
height: 40px;
position: absolute;
top: 40px;
width: 40px;
}
#box-1 {
background: blue;
z-index: 1;
}
#box-2 {
background: white;
z-index: 2;
}
#notes {
position: absolute;
left: 0px;
top: 100px;
}
body {
background: white;
}
</style>
<body>
<div id="box-1"></div>
<div id="box-2"></div>
<p id="notes">
This test creates an infinite duration animations, which should be stuck at
a progress of 0. If any blue pixels appear in the screenshot, the test
fails.
</p>
</body>
<script>
onload = async function() {
// Double rAF to ensure that we are not bogged down during initialization
// and the compositor is ready.
waitForAnimationFrames(2).then(() => {
const elem = document.getElementById('box-1');
const keyframes = [
{ transform: 'translateX(0px)' },
{ transform: 'translateX(100px)' }
];
const effect =
new KeyframeEffect(elem, keyframes,
{iterations: 3, duration: Infinity});
const animation = new Animation(effect);
animation.play();
animation.ready.then(() => {
takeScreenshotDelayed(100);
});
});
};
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment