Bug 1416073 - Avoid calling the expensive ComputeScrollMetadata function if we already computed that metadata before. r?jrmuizel
MozReview-Commit-ID: 5SwAEA4Wpqw
--- a/gfx/layers/wr/WebRenderCommandBuilder.cpp
+++ b/gfx/layers/wr/WebRenderCommandBuilder.cpp
@@ -76,17 +76,17 @@ WebRenderCommandBuilder::BuildWebRenderC
CreateWebRenderCommandsFromDisplayList(aDisplayList, aDisplayListBuilder,
pageRootSc, aBuilder, aResourceUpdates);
}
// Make a "root" layer data that has everything else as descendants
mLayerScrollData.emplace_back();
mLayerScrollData.back().InitializeRoot(mLayerScrollData.size() - 1);
auto callback = [&aScrollData](FrameMetrics::ViewID aScrollId) -> bool {
- return aScrollData.HasMetadataFor(aScrollId);
+ return aScrollData.HasMetadataFor(aScrollId).isSome();
};
if (Maybe<ScrollMetadata> rootMetadata = nsLayoutUtils::GetRootMetadata(
aDisplayListBuilder, mManager, ContainerLayerParameters(), callback)) {
mLayerScrollData.back().AppendScrollMetadata(aScrollData, rootMetadata.ref());
}
// Append the WebRenderLayerScrollData items into WebRenderScrollData
// in reverse order, from topmost to bottommost. This is in keeping with
// the semantics of WebRenderScrollData.
--- a/gfx/layers/wr/WebRenderScrollData.cpp
+++ b/gfx/layers/wr/WebRenderScrollData.cpp
@@ -49,21 +49,27 @@ WebRenderLayerScrollData::Initialize(Web
mDescendantCount = aDescendantCount;
MOZ_ASSERT(aItem);
aItem->UpdateScrollData(&aOwner, this);
for (const ActiveScrolledRoot* asr = aItem->GetActiveScrolledRoot();
asr && asr != aStopAtAsr;
asr = asr->mParent) {
MOZ_ASSERT(aOwner.GetManager());
- Maybe<ScrollMetadata> metadata = asr->mScrollableFrame->ComputeScrollMetadata(
- nullptr, aOwner.GetManager(), aItem->ReferenceFrame(),
- ContainerLayerParameters(), nullptr);
- MOZ_ASSERT(metadata);
- mScrollIds.AppendElement(aOwner.AddMetadata(metadata.ref()));
+ FrameMetrics::ViewID scrollId = nsLayoutUtils::ViewIDForASR(asr);
+ if (Maybe<size_t> index = aOwner.HasMetadataFor(scrollId)) {
+ mScrollIds.AppendElement(index.ref());
+ } else {
+ Maybe<ScrollMetadata> metadata = asr->mScrollableFrame->ComputeScrollMetadata(
+ nullptr, aOwner.GetManager(), aItem->ReferenceFrame(),
+ ContainerLayerParameters(), nullptr);
+ MOZ_ASSERT(metadata);
+ MOZ_ASSERT(metadata->GetMetrics().GetScrollId() == scrollId);
+ mScrollIds.AppendElement(aOwner.AddMetadata(metadata.ref()));
+ }
}
}
int32_t
WebRenderLayerScrollData::GetDescendantCount() const
{
MOZ_ASSERT(mDescendantCount >= 0); // check that it was set
return mDescendantCount;
@@ -195,20 +201,21 @@ WebRenderScrollData::GetLayerData(size_t
const ScrollMetadata&
WebRenderScrollData::GetScrollMetadata(size_t aIndex) const
{
MOZ_ASSERT(aIndex < mScrollMetadatas.Length());
return mScrollMetadatas[aIndex];
}
-bool
+Maybe<size_t>
WebRenderScrollData::HasMetadataFor(const FrameMetrics::ViewID& aScrollId) const
{
- return mScrollIdMap.find(aScrollId) != mScrollIdMap.end();
+ auto it = mScrollIdMap.find(aScrollId);
+ return (it == mScrollIdMap.end() ? Nothing() : Some(it->second));
}
void
WebRenderScrollData::SetFocusTarget(const FocusTarget& aFocusTarget)
{
mFocusTarget = aFocusTarget;
}
--- a/gfx/layers/wr/WebRenderScrollData.h
+++ b/gfx/layers/wr/WebRenderScrollData.h
@@ -146,17 +146,17 @@ public:
size_t GetLayerCount() const;
// Return a pointer to the scroll data at the given index. Use with caution,
// as the pointer may be invalidated if this WebRenderScrollData is mutated.
WebRenderLayerScrollData* GetLayerDataMutable(size_t aIndex);
const WebRenderLayerScrollData* GetLayerData(size_t aIndex) const;
const ScrollMetadata& GetScrollMetadata(size_t aIndex) const;
- bool HasMetadataFor(const FrameMetrics::ViewID& aScrollId) const;
+ Maybe<size_t> HasMetadataFor(const FrameMetrics::ViewID& aScrollId) const;
const FocusTarget& GetFocusTarget() const { return mFocusTarget; }
void SetFocusTarget(const FocusTarget& aFocusTarget);
void SetIsFirstPaint();
bool IsFirstPaint() const;
void SetPaintSequenceNumber(uint32_t aPaintSequenceNumber);
uint32_t GetPaintSequenceNumber() const;