Bug 1357754 - Hook up chaining layer trees. r=botond,jrmuizel
authorKartikaya Gupta <kgupta@mozilla.com>
Thu, 20 Apr 2017 10:38:06 -0400
changeset 403280 e891376e9f56fcaa80f6d4b96df7bb716f67efbd
parent 403279 ea612503b63fd25e54b49d1d59e405c37db6f479
child 403281 9a89384b0d2c19e874059db52db86e893e5c3e6c
push id7391
push usermtabara@mozilla.com
push dateMon, 12 Jun 2017 13:08:53 +0000
treeherdermozilla-beta@2191d7f87e2e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbotond, jrmuizel
bugs1357754
milestone55.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1357754 - Hook up chaining layer trees. r=botond,jrmuizel When APZ traverses a tree using LayerMetricsWrapper, the layer tree already has its RefLayers connected because of the in-scope AutoResolveRefLayers. When traversing using the WebRenderScrollDataWrapper though, this is not the case, and we need to explicitly jump from one layer tree to another during the walk. Thankfully we don't require upwards traversal in the tree or this would be much more complicated. MozReview-Commit-ID: 8gbvUlzghLx
gfx/layers/wr/WebRenderBridgeParent.cpp
gfx/layers/wr/WebRenderBridgeParent.h
gfx/layers/wr/WebRenderScrollDataWrapper.h
--- a/gfx/layers/wr/WebRenderBridgeParent.cpp
+++ b/gfx/layers/wr/WebRenderBridgeParent.cpp
@@ -302,20 +302,28 @@ WebRenderBridgeParent::HandleDPEnd(const
   // to early-return from RecvDPEnd without doing so.
   AutoWebRenderBridgeParentAsyncMessageSender autoAsyncMessageSender(this, &aToDestroy);
 
   ++mWrEpoch; // Update webrender epoch
   ProcessWebRenderCommands(aSize, aCommands, wr::NewEpoch(mWrEpoch),
                            dl, dlDesc, aux, auxDesc);
   HoldPendingTransactionId(mWrEpoch, aTransactionId);
 
+  mScrollData = aScrollData;
   // TODO: pass the WebRenderScrollData to APZ (this will happen in a future
   // patch)
 }
 
+const WebRenderScrollData&
+WebRenderBridgeParent::GetScrollData() const
+{
+  MOZ_ASSERT(mozilla::layers::CompositorThreadHolder::IsInCompositorThread());
+  return mScrollData;
+}
+
 mozilla::ipc::IPCResult
 WebRenderBridgeParent::RecvDPEnd(const gfx::IntSize& aSize,
                                  InfallibleTArray<WebRenderParentCommand>&& aCommands,
                                  InfallibleTArray<OpDestroy>&& aToDestroy,
                                  const uint64_t& aFwdTransactionId,
                                  const uint64_t& aTransactionId,
                                  const ByteBuffer& dl,
                                  const WrBuiltDisplayListDescriptor& dlDesc,
--- a/gfx/layers/wr/WebRenderBridgeParent.h
+++ b/gfx/layers/wr/WebRenderBridgeParent.h
@@ -155,16 +155,18 @@ public:
     aNotifications->AppendElements(Move(mImageCompositeNotifications));
   }
 
   uint32_t GetIdNameSpace()
   {
     return mIdNameSpace;
   }
 
+  const WebRenderScrollData& GetScrollData() const;
+
 private:
   virtual ~WebRenderBridgeParent();
 
   void DeleteOldImages();
   void ProcessWebRenderCommands(const gfx::IntSize &aSize, InfallibleTArray<WebRenderParentCommand>& commands, const wr::Epoch& aEpoch,
                                     const ByteBuffer& dl,
                                     const WrBuiltDisplayListDescriptor& dlDesc,
                                     const ByteBuffer& aux,
@@ -218,15 +220,18 @@ private:
 
   std::queue<PendingTransactionId> mPendingTransactionIds;
   uint32_t mWrEpoch;
   uint32_t mIdNameSpace;
 
   bool mPaused;
   bool mDestroyed;
 
+  // Can only be accessed on the compositor thread.
+  WebRenderScrollData mScrollData;
+
   static uint32_t sIdNameSpace;
 };
 
 } // namespace layers
 } // namespace mozilla
 
 #endif // mozilla_layers_WebRenderBridgeParent_h
--- a/gfx/layers/wr/WebRenderScrollDataWrapper.h
+++ b/gfx/layers/wr/WebRenderScrollDataWrapper.h
@@ -2,16 +2,18 @@
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef GFX_WEBRENDERSCROLLDATAWRAPPER_H
 #define GFX_WEBRENDERSCROLLDATAWRAPPER_H
 
 #include "FrameMetrics.h"
+#include "mozilla/layers/CompositorBridgeParent.h"
+#include "mozilla/layers/WebRenderBridgeParent.h"
 #include "mozilla/layers/WebRenderScrollData.h"
 
 namespace mozilla {
 namespace layers {
 
 /*
  * This class is a wrapper to walk through a WebRenderScrollData object, with
  * an exposed API that is template-compatible to LayerMetricsWrapper. This allows
@@ -152,16 +154,29 @@ public:
     // we compute the first index outside the subtree rooted at this node
     // (in |subtreeLastIndex|) and pass that in to the child wrapper to use as
     // its mContainingSubtreeLastIndex.
     if (mLayer->GetDescendantCount() > 0) {
       size_t prevSiblingIndex = mLayerIndex + 1 + mLayer->GetDescendantCount();
       size_t subtreeLastIndex = std::min(mContainingSubtreeLastIndex, prevSiblingIndex);
       return WebRenderScrollDataWrapper(mData, mLayerIndex + 1, subtreeLastIndex);
     }
+
+    // We've run out of descendants. But! If the original layer was a RefLayer,
+    // then it connects to another layer tree and we need to traverse that too.
+    // So return a WebRenderScrollDataWrapper for the root of the child layer
+    // tree.
+    if (mLayer->GetReferentId()) {
+      CompositorBridgeParent::LayerTreeState* lts =
+          CompositorBridgeParent::GetIndirectShadowTree(mLayer->GetReferentId().value());
+      if (lts && lts->mWrBridge) {
+        return WebRenderScrollDataWrapper(&(lts->mWrBridge->GetScrollData()));
+      }
+    }
+
     return WebRenderScrollDataWrapper();
   }
 
   WebRenderScrollDataWrapper GetPrevSibling() const
   {
     MOZ_ASSERT(IsValid());
 
     if (!AtTopLayer()) {