commit 999a77895fec9d953cdedb4a7665a04e727fd200
parent bc3b5be30a7a777aa23e467843138a122953632f
Author: Timothy Nikkel <tnikkel@gmail.com>
Date: Tue, 16 Dec 2025 10:27:00 +0000
Bug 2006293. Use less stack space in some display building code. r=layout-reviewers,emilio
We can pack AutoCurrentActiveScrolledRootSetter and AutoBuildingDisplayList better to avoid useless padding. Maybe<nsPoint> is 12 bytes so we can fit some small members after it.
AutoPreserves3DContext is big (112 bytes), no sense using stack space for a relatively rare preserve 3d case.
Differential Revision: https://phabricator.services.mozilla.com/D276625
Diffstat:
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp
@@ -3228,11 +3228,13 @@ void nsIFrame::BuildDisplayListForStackingContext(
const bool combines3DTransformWithAncestors =
(extend3DContext || isTransformed) && Combines3DTransformWithAncestors();
- Maybe<nsDisplayListBuilder::AutoPreserves3DContext> autoPreserves3DContext;
+ UniquePtr<nsDisplayListBuilder::AutoPreserves3DContext>
+ autoPreserves3DContext;
if (extend3DContext && !combines3DTransformWithAncestors) {
// Start a new preserves3d context to keep informations on
// nsDisplayListBuilder.
- autoPreserves3DContext.emplace(aBuilder);
+ autoPreserves3DContext =
+ MakeUnique<nsDisplayListBuilder::AutoPreserves3DContext>(aBuilder);
// Save dirty rect on the builder to avoid being distorted for
// multiple transforms along the chain.
aBuilder->SavePreserves3DRect();
diff --git a/layout/painting/nsDisplayList.cpp b/layout/painting/nsDisplayList.cpp
@@ -8870,10 +8870,10 @@ nsDisplayListBuilder::AutoBuildingDisplayList::AutoBuildingDisplayList(
: mBuilder(aBuilder),
mPrevFrame(aBuilder->mCurrentFrame),
mPrevReferenceFrame(aBuilder->mCurrentReferenceFrame),
- mPrevOffset(aBuilder->mCurrentOffsetToReferenceFrame),
- mPrevAdditionalOffset(aBuilder->mAdditionalOffset),
mPrevVisibleRect(aBuilder->mVisibleRect),
mPrevDirtyRect(aBuilder->mDirtyRect),
+ mPrevOffset(aBuilder->mCurrentOffsetToReferenceFrame),
+ mPrevAdditionalOffset(aBuilder->mAdditionalOffset),
mPrevCompositorHitTestInfo(aBuilder->mCompositorHitTestInfo),
mPrevAncestorHasApzAwareEventHandler(
aBuilder->mAncestorHasApzAwareEventHandler),
diff --git a/layout/painting/nsDisplayList.h b/layout/painting/nsDisplayList.h
@@ -1108,10 +1108,10 @@ class nsDisplayListBuilder {
nsDisplayListBuilder* mBuilder;
const nsIFrame* mPrevFrame;
const nsIFrame* mPrevReferenceFrame;
- nsPoint mPrevOffset;
- Maybe<nsPoint> mPrevAdditionalOffset;
nsRect mPrevVisibleRect;
nsRect mPrevDirtyRect;
+ nsPoint mPrevOffset;
+ Maybe<nsPoint> mPrevAdditionalOffset;
gfx::CompositorHitTestInfo mPrevCompositorHitTestInfo;
bool mPrevAncestorHasApzAwareEventHandler;
bool mPrevBuildingInvisibleItems;
@@ -1206,12 +1206,10 @@ class nsDisplayListBuilder {
mSavedActiveScrolledRoot(aBuilder->mCurrentActiveScrolledRoot),
mContentClipASR(aBuilder->ClipState().GetContentClipASR()),
mDescendantsStartIndex(aBuilder->mActiveScrolledRoots.Length()),
- mUsed(false),
mOldScrollParentId(aBuilder->mCurrentScrollParentId),
mOldForceLayer(aBuilder->mForceLayerForScrollParent),
mOldContainsNonMinimalDisplayPort(
- mBuilder->mContainsNonMinimalDisplayPort),
- mCanBeScrollParent(false) {}
+ mBuilder->mContainsNonMinimalDisplayPort) {}
void SetCurrentScrollParentId(ViewID aScrollId) {
// Update the old scroll parent id.
@@ -1294,11 +1292,11 @@ class nsDisplayListBuilder {
* EnterScrollFrame / InsertScrollFrame is called per instance of this
* class.
*/
- bool mUsed;
ViewID mOldScrollParentId;
+ bool mUsed = false;
bool mOldForceLayer;
bool mOldContainsNonMinimalDisplayPort;
- bool mCanBeScrollParent;
+ bool mCanBeScrollParent = false;
};
/**