Bug 1247554 - Budget creation of AGRs due to animated offsets and margins; r?benwa draft
authorJamie Nicol <jnicol@mozilla.com>
Thu, 11 Feb 2016 16:59:20 +0000
changeset 331270 3743b3f6c40b2721ca5579c5992bffe2b01b6e17
parent 331269 06655cf94beb42d31827089224d92a6880d0aaad
child 514350 63d94731dc230e82d8d68f5c7bc70ab05e861738
push id10951
push userbmo:jnicol@mozilla.com
push dateTue, 16 Feb 2016 18:31:48 +0000
reviewersbenwa
bugs1247554
milestone47.0a1
Bug 1247554 - Budget creation of AGRs due to animated offsets and margins; r?benwa MozReview-Commit-ID: 28Y0KfEfLRS
layout/base/nsDisplayList.cpp
layout/base/nsDisplayList.h
--- 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;