Bug 1247554 - Budget creation of AGRs due to animated offsets and margins; r?benwa
MozReview-Commit-ID: 28Y0KfEfLRS
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -591,28 +591,34 @@ nsDisplayListBuilder::AddAnimationsAndTr
data = null_t();
}
AddAnimationsForProperty(aFrame, aProperty, compositorAnimations,
aLayer, data, pending);
}
const float gWillChangeAreaMultiplier = 3.0f;
+#ifdef MOZ_WIDGET_ANDROID
+const float gAnimationBudgetAreaMultiplier = 0.3f;
+#else
+const float gAnimationBudgetAreaMultiplier = 1.0f;
+#endif
nsDisplayListBuilder::nsDisplayListBuilder(nsIFrame* aReferenceFrame,
Mode aMode, bool aBuildCaret)
: mReferenceFrame(aReferenceFrame),
mIgnoreScrollFrame(nullptr),
mLayerEventRegions(nullptr),
mCurrentTableItem(nullptr),
mCurrentFrame(aReferenceFrame),
mCurrentReferenceFrame(aReferenceFrame),
mCurrentAGR(&mRootAGR),
mRootAGR(aReferenceFrame, nullptr),
mWillChangeBudget(gWillChangeAreaMultiplier),
+ mAnimationBudget(gAnimationBudgetAreaMultiplier),
mDirtyRect(-1,-1,-1,-1),
mGlassDisplayItem(nullptr),
mPendingScrollInfoItems(nullptr),
mCommittedScrollInfoItems(nullptr),
mMode(aMode),
mCurrentScrollParentId(FrameMetrics::NULL_SCROLL_ID),
mCurrentScrollbarTarget(FrameMetrics::NULL_SCROLL_ID),
mCurrentScrollbarFlags(0),
@@ -1085,18 +1091,22 @@ nsDisplayListBuilder::IsAnimatedGeometry
if (aParent) {
*aParent = nsLayoutUtils::GetCrossDocParentFrame(aFrame);
}
return false;
}
if (nsLayoutUtils::IsPopup(aFrame))
return true;
- if (ActiveLayerTracker::IsOffsetOrMarginStyleAnimated(aFrame))
- return true;
+ if (ActiveLayerTracker::IsOffsetOrMarginStyleAnimated(aFrame)) {
+ const bool inBudget = AddToAGRBudget(mAnimationBudget, aFrame, aFrame->GetSize());
+ if (inBudget) {
+ return true;
+ }
+ }
if (!aFrame->GetParent() &&
nsLayoutUtils::ViewportHasDisplayPort(aFrame->PresContext())) {
// Viewport frames in a display port need to be animated geometry roots
// for background-attachment:fixed elements.
return true;
}
if (aFrame->IsTransformed()) {
return true;
--- a/layout/base/nsDisplayList.h
+++ b/layout/base/nsDisplayList.h
@@ -1219,16 +1219,18 @@ private:
// The offset from mCurrentFrame to mCurrentReferenceFrame.
nsPoint mCurrentOffsetToReferenceFrame;
AnimatedGeometryRoot* mCurrentAGR;
AnimatedGeometryRoot mRootAGR;
// will-change budget tracker
AGRBudget mWillChangeBudget;
+ // animation budget tracker
+ AGRBudget mAnimationBudget;
// Any frame listed in this set is already counted in the budget
// and thus is in-budget.
nsTHashtable<nsPtrHashKey<nsIFrame> > mBudgetSet;
// rects are relative to the frame's reference frame
nsDataHashtable<nsPtrHashKey<nsIFrame>, nsRect> mDirtyRectForScrolledContents;