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

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

Issue 2724083002: [SPv2] Decomposite otherwise-compositable animations that paint nothing. (Closed)
Patch Set: Progress. 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..6b93196a831ae69eadc4a663a51031b7f5614e97 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"
@@ -253,7 +254,10 @@ double Animation::unlimitedCurrentTimeInternal() const {
: calculateCurrentTime();
}
-bool Animation::preCommit(int compositorGroup, bool startOnCompositor) {
+bool Animation::preCommit(
+ int compositorGroup,
+ const Optional<CompositorElementIdSet>& compositedAnimationElementIds,
+ bool startOnCompositor) {
PlayStateUpdateScope updateScope(*this, TimingUpdateOnDemand,
DoNotSetCompositorPending);
@@ -291,10 +295,10 @@ bool Animation::preCommit(int compositorGroup, bool startOnCompositor) {
if (shouldStart) {
m_compositorGroup = compositorGroup;
if (startOnCompositor) {
- if (isCandidateForAnimationOnCompositor())
+ if (isCandidateForAnimationOnCompositor(compositedAnimationElementIds))
createCompositorPlayer();
- if (maybeStartAnimationOnCompositor())
+ if (maybeStartAnimationOnCompositor(compositedAnimationElementIds))
m_compositorState = WTF::wrapUnique(new CompositorState(*this));
else
cancelIncompatibleAnimationsOnCompositor();
@@ -722,7 +726,9 @@ void Animation::forceServiceOnNextFrame() {
m_timeline->wake();
}
-bool Animation::canStartAnimationOnCompositor() const {
+bool Animation::canStartAnimationOnCompositor(
+ const Optional<CompositorElementIdSet>& compositedAnimationElementIds)
+ const {
if (m_isCompositedAnimationDisabledForTesting || effectSuppressed())
return false;
@@ -731,20 +737,38 @@ bool Animation::canStartAnimationOnCompositor() const {
(timeline() && timeline()->playbackRate() != 1))
return false;
+ // TODO(wkorman): Share logic in
+ // PaintPropertyTreeBuilder::createDomNodeBasedCompositorElementId and
+ // consider caching in animation or otherwise somehow if expensive.
+ const KeyframeEffectReadOnly* effect =
+ toKeyframeEffectReadOnly(m_content.get());
+ CompositorElementId targetCompositorElementId = createCompositorElementId(
+ DOMNodeIds::idForNode(effect->target()), CompositorSubElementId::Primary);
+ // 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.
+ bool hasLayer =
+ !compositedAnimationElementIds.has_value() ||
+ compositedAnimationElementIds->contains(targetCompositorElementId);
+ if (!hasLayer)
+ return false;
+
return m_timeline && m_content && m_content->isKeyframeEffectReadOnly() &&
playing();
}
-bool Animation::isCandidateForAnimationOnCompositor() const {
- if (!canStartAnimationOnCompositor())
+bool Animation::isCandidateForAnimationOnCompositor(
+ const Optional<CompositorElementIdSet>& compositedAnimationElementIds)
+ const {
+ if (!canStartAnimationOnCompositor(compositedAnimationElementIds))
return false;
return toKeyframeEffectReadOnly(m_content.get())
->isCandidateForAnimationOnCompositor(m_playbackRate);
}
-bool Animation::maybeStartAnimationOnCompositor() {
- if (!canStartAnimationOnCompositor())
+bool Animation::maybeStartAnimationOnCompositor(
+ const Optional<CompositorElementIdSet>& compositedAnimationElementIds) {
+ if (!canStartAnimationOnCompositor(compositedAnimationElementIds))
return false;
bool reversed = m_playbackRate < 0;

Powered by Google App Engine
This is Rietveld 408576698