Bug 1389139 - Add transforms for reflayer equivalents in the layers-free APZ world. r?jrmuizel draft
authorKartikaya Gupta <kgupta@mozilla.com>
Wed, 16 Aug 2017 12:50:37 -0400
changeset 647600 0458b52bab59c77976076a55d1850ec32254efae
parent 647599 e729353f807609e994ae8ead49c4a96fea244a01
child 726567 8a80729f94eb7d176a193dc28f93d7ba625e6870
push id74471
push userkgupta@mozilla.com
push dateWed, 16 Aug 2017 16:51:04 +0000
reviewersjrmuizel
bugs1389139
milestone57.0a1
Bug 1389139 - Add transforms for reflayer equivalents in the layers-free APZ world. r?jrmuizel In normal gecko, RefLayer instances also have a transform, which needs to be propagated to APZ in layers-free mode. MozReview-Commit-ID: DaEyvpumG9F
layout/ipc/RenderFrameParent.cpp
layout/ipc/RenderFrameParent.h
--- a/layout/ipc/RenderFrameParent.cpp
+++ b/layout/ipc/RenderFrameParent.cpp
@@ -385,32 +385,35 @@ bool
 nsDisplayRemote::CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
                                          const StackingContextHelper& aSc,
                                          nsTArray<WebRenderParentCommand>& aParentCommands,
                                          mozilla::layers::WebRenderLayerManager* aManager,
                                          nsDisplayListBuilder* aDisplayListBuilder)
 {
   MOZ_ASSERT(aManager->IsLayersFreeTransaction());
 
+  mOffset = mozilla::layout::GetContentRectLayerOffset(mFrame, aDisplayListBuilder);
+
   mozilla::LayoutDeviceRect visible = mozilla::LayoutDeviceRect::FromAppUnits(
       GetVisibleRect(), mFrame->PresContext()->AppUnitsPerDevPixel());
-  visible += mozilla::layout::GetContentRectLayerOffset(mFrame, aDisplayListBuilder);
+  visible += mOffset;
 
   aBuilder.PushIFrame(aSc.ToRelativeLayoutRect(visible),
       mozilla::wr::AsPipelineId(GetRemoteLayersId()));
 
   return true;
 }
 
 bool
 nsDisplayRemote::UpdateScrollData(mozilla::layers::WebRenderScrollData* aData,
                                   mozilla::layers::WebRenderLayerScrollData* aLayerData)
 {
   if (aLayerData) {
     aLayerData->SetReferentId(GetRemoteLayersId());
+    aLayerData->SetTransform(mozilla::gfx::Matrix4x4::Translation(mOffset.x, mOffset.y, 0.0));
   }
   return true;
 }
 
 uint64_t
 nsDisplayRemote::GetRemoteLayersId() const
 {
   return mRemoteFrame->GetLayersId();
--- a/layout/ipc/RenderFrameParent.h
+++ b/layout/ipc/RenderFrameParent.h
@@ -170,13 +170,14 @@ public:
                                 mozilla::layers::WebRenderLayerScrollData* aLayerData) override;
 
   uint64_t GetRemoteLayersId() const;
 
   NS_DISPLAY_DECL_NAME("Remote", TYPE_REMOTE)
 
 private:
   RenderFrameParent* mRemoteFrame;
+  mozilla::LayoutDeviceIntPoint mOffset;
   mozilla::layers::EventRegionsOverride mEventRegionsOverride;
 };
 
 
 #endif  // mozilla_layout_RenderFrameParent_h