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

Unified Diff: third_party/WebKit/Source/core/animation/Animation.cpp

Issue 2724083002: [SPv2] Decomposite otherwise-compositable animations that paint nothing. (Closed)
Patch Set: Clean up after initial review. Created 3 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/animation/Animation.cpp
diff --git a/third_party/WebKit/Source/core/animation/Animation.cpp b/third_party/WebKit/Source/core/animation/Animation.cpp
index 6fa80f83fe2cbd13ad14a62a28f32f07f826147f..a7e71b8625e5031f46ba7f3df9de6214c8618ad4 100644
--- a/third_party/WebKit/Source/core/animation/Animation.cpp
+++ b/third_party/WebKit/Source/core/animation/Animation.cpp
@@ -34,6 +34,7 @@
#include "core/animation/CompositorPendingAnimations.h"
#include "core/animation/KeyframeEffectReadOnly.h"
#include "core/animation/css/CSSAnimations.h"
+#include "core/dom/DOMNodeIds.h"
#include "core/dom/Document.h"
#include "core/dom/ExceptionCode.h"
#include "core/dom/StyleChangeReason.h"
@@ -42,6 +43,7 @@
#include "core/frame/UseCounter.h"
#include "core/inspector/InspectorInstrumentation.h"
#include "core/inspector/InspectorTraceEvents.h"
+#include "core/paint/PaintPropertyTreeBuilder.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "platform/WebTaskRunner.h"
#include "platform/animation/CompositorAnimationPlayer.h"
@@ -253,7 +255,10 @@ double Animation::unlimitedCurrentTimeInternal() const {
: calculateCurrentTime();
}
-bool Animation::preCommit(int compositorGroup, bool startOnCompositor) {
+bool Animation::preCommit(
+ int compositorGroup,
+ const Optional<CompositorElementIdSet>& compositedElementIds,
+ bool startOnCompositor) {
PlayStateUpdateScope updateScope(*this, TimingUpdateOnDemand,
DoNotSetCompositorPending);
@@ -291,10 +296,10 @@ bool Animation::preCommit(int compositorGroup, bool startOnCompositor) {
if (shouldStart) {
m_compositorGroup = compositorGroup;
if (startOnCompositor) {
- if (isCandidateForAnimationOnCompositor())
+ if (isCandidateForAnimationOnCompositor(compositedElementIds))
createCompositorPlayer();
- if (maybeStartAnimationOnCompositor())
+ if (maybeStartAnimationOnCompositor(compositedElementIds))
m_compositorState = WTF::wrapUnique(new CompositorState(*this));
else
cancelIncompatibleAnimationsOnCompositor();
@@ -722,7 +727,8 @@ void Animation::forceServiceOnNextFrame() {
m_timeline->wake();
}
-bool Animation::canStartAnimationOnCompositor() const {
+bool Animation::canStartAnimationOnCompositor(
+ const Optional<CompositorElementIdSet>& compositedElementIds) const {
if (m_isCompositedAnimationDisabledForTesting || effectSuppressed())
return false;
@@ -730,21 +736,34 @@ bool Animation::canStartAnimationOnCompositor() const {
if (m_playbackRate == 0 || (std::isinf(effectEnd()) && m_playbackRate < 0) ||
(timeline() && timeline()->playbackRate() != 1))
return false;
+ // If the optional element id set has no value we must be in SPv1 mode in
+ // which case we trust the compositing logic will create a layer if needed.
+ if (compositedElementIds.has_value()) {
+ const KeyframeEffectReadOnly* effect =
+ toKeyframeEffectReadOnly(m_content.get());
+ CompositorElementId targetElementId =
+ createCompositorElementId(DOMNodeIds::idForNode(effect->target()),
+ CompositorSubElementId::Primary);
+ if (!compositedElementIds->contains(targetElementId))
+ return false;
+ }
return m_timeline && m_content && m_content->isKeyframeEffectReadOnly() &&
playing();
}
-bool Animation::isCandidateForAnimationOnCompositor() const {
- if (!canStartAnimationOnCompositor())
+bool Animation::isCandidateForAnimationOnCompositor(
+ const Optional<CompositorElementIdSet>& compositedElementIds) const {
+ if (!canStartAnimationOnCompositor(compositedElementIds))
return false;
return toKeyframeEffectReadOnly(m_content.get())
->isCandidateForAnimationOnCompositor(m_playbackRate);
}
-bool Animation::maybeStartAnimationOnCompositor() {
- if (!canStartAnimationOnCompositor())
+bool Animation::maybeStartAnimationOnCompositor(
+ const Optional<CompositorElementIdSet>& compositedElementIds) {
+ if (!canStartAnimationOnCompositor(compositedElementIds))
return false;
bool reversed = m_playbackRate < 0;

Powered by Google App Engine
This is Rietveld 408576698