From 0b55cc54f32b9d4b450ff1eac9d5cb45d5cc9c6d Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Thu, 9 Nov 2017 23:18:39 -0500 Subject: [PATCH] Bug 1416073 - Avoid calling the expensive ComputeScrollMetadata function if we already computed that metadata before. r=jrmuizel MozReview-Commit-ID: 5SwAEA4Wpqw --HG-- extra : rebase_source : 1c717c3f0cfb1c5a94970d5d7cc267ee9570c0ad --- gfx/layers/wr/WebRenderCommandBuilder.cpp | 2 +- gfx/layers/wr/WebRenderScrollData.cpp | 21 ++++++++++++++------- gfx/layers/wr/WebRenderScrollData.h | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/gfx/layers/wr/WebRenderCommandBuilder.cpp b/gfx/layers/wr/WebRenderCommandBuilder.cpp index d0b477ccf166..ffda9ed4289d 100644 --- a/gfx/layers/wr/WebRenderCommandBuilder.cpp +++ b/gfx/layers/wr/WebRenderCommandBuilder.cpp @@ -81,7 +81,7 @@ WebRenderCommandBuilder::BuildWebRenderCommands(wr::DisplayListBuilder& aBuilder 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 rootMetadata = nsLayoutUtils::GetRootMetadata( aDisplayListBuilder, mManager, ContainerLayerParameters(), callback)) { diff --git a/gfx/layers/wr/WebRenderScrollData.cpp b/gfx/layers/wr/WebRenderScrollData.cpp index 97ce9a5b1de0..b7a8d539e9b4 100644 --- a/gfx/layers/wr/WebRenderScrollData.cpp +++ b/gfx/layers/wr/WebRenderScrollData.cpp @@ -54,11 +54,17 @@ WebRenderLayerScrollData::Initialize(WebRenderScrollData& aOwner, asr && asr != aStopAtAsr; asr = asr->mParent) { MOZ_ASSERT(aOwner.GetManager()); - Maybe 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 index = aOwner.HasMetadataFor(scrollId)) { + mScrollIds.AppendElement(index.ref()); + } else { + Maybe 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())); + } } } @@ -200,10 +206,11 @@ WebRenderScrollData::GetScrollMetadata(size_t aIndex) const return mScrollMetadatas[aIndex]; } -bool +Maybe 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 diff --git a/gfx/layers/wr/WebRenderScrollData.h b/gfx/layers/wr/WebRenderScrollData.h index 1e016331a604..0e270d14a8a5 100644 --- a/gfx/layers/wr/WebRenderScrollData.h +++ b/gfx/layers/wr/WebRenderScrollData.h @@ -151,7 +151,7 @@ public: const WebRenderLayerScrollData* GetLayerData(size_t aIndex) const; const ScrollMetadata& GetScrollMetadata(size_t aIndex) const; - bool HasMetadataFor(const FrameMetrics::ViewID& aScrollId) const; + Maybe HasMetadataFor(const FrameMetrics::ViewID& aScrollId) const; const FocusTarget& GetFocusTarget() const { return mFocusTarget; } void SetFocusTarget(const FocusTarget& aFocusTarget);