Bug 1389139 - Add support for transform and perspective display items to layers-free APZ. r?jrmuizel
A basic sanity check here seems to produce the correct behaviour but I'm
not at all confident that this will always do the correct thing in more
complex cases or when perspectives are involved. However this is hard to
test and get working without the testing infrastructure up and running
so I'd rather land this simple code first and then dig into the more
complex cases once we have a way to catch regressions.
MozReview-Commit-ID: E4HytiZowEn
--- a/gfx/layers/wr/WebRenderScrollData.h
+++ b/gfx/layers/wr/WebRenderScrollData.h
@@ -59,18 +59,20 @@ public:
const ScrollMetadata& aData);
// Return the ScrollMetadata object that used to be on the original Layer
// at the given index. Since we deduplicate the ScrollMetadata objects into
// the array in the owning WebRenderScrollData object, we need to be passed
// in a reference to that owner as well.
const ScrollMetadata& GetScrollMetadata(const WebRenderScrollData& aOwner,
size_t aIndex) const;
+ void SetTransform(const gfx::Matrix4x4& aTransform) { mTransform = aTransform; }
gfx::Matrix4x4 GetTransform() const { return mTransform; }
CSSTransformMatrix GetTransformTyped() const;
+ void SetTransformIsPerspective(bool aTransformIsPerspective) { mTransformIsPerspective = aTransformIsPerspective; }
bool GetTransformIsPerspective() const { return mTransformIsPerspective; }
EventRegions GetEventRegions() const { return mEventRegions; }
const LayerIntRegion& GetVisibleRegion() const { return mVisibleRegion; }
void SetReferentId(uint64_t aReferentId) { mReferentId = Some(aReferentId); }
Maybe<uint64_t> GetReferentId() const { return mReferentId; }
EventRegionsOverride GetEventRegionsOverride() const { return mEventRegionsOverride; }
void SetScrollThumbData(const ScrollThumbData& aData) { mScrollThumbData = aData; }
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -7856,16 +7856,27 @@ nsDisplayTransform::CreateWebRenderComma
transformForSC,
nullptr,
filters);
return mStoredList.CreateWebRenderCommands(aBuilder, sc, aParentCommands,
aManager, aDisplayListBuilder);
}
+bool
+nsDisplayTransform::UpdateScrollData(mozilla::layers::WebRenderScrollData* aData,
+ mozilla::layers::WebRenderLayerScrollData* aLayerData)
+{
+ if (aLayerData) {
+ aLayerData->SetTransform(GetTransform());
+ aLayerData->SetTransformIsPerspective(mFrame->HasPerspective());
+ }
+ return true;
+}
+
already_AddRefed<Layer> nsDisplayTransform::BuildLayer(nsDisplayListBuilder *aBuilder,
LayerManager *aManager,
const ContainerLayerParameters& aContainerParameters)
{
/* For frames without transform, it would not be removed for
* backface hidden here. But, it would be removed by the init
* function of nsDisplayTransform.
*/
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -4771,16 +4771,18 @@ public:
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aContainerParameters) override;
virtual bool CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
const StackingContextHelper& aSc,
nsTArray<WebRenderParentCommand>& aParentCommands,
mozilla::layers::WebRenderLayerManager* aManager,
nsDisplayListBuilder* aDisplayListBuilder) override;
+ virtual bool UpdateScrollData(mozilla::layers::WebRenderScrollData* aData,
+ mozilla::layers::WebRenderLayerScrollData* aLayerData) override;
virtual bool ShouldBuildLayerEvenIfInvisible(nsDisplayListBuilder* aBuilder) override;
virtual bool ComputeVisibility(nsDisplayListBuilder *aBuilder,
nsRegion *aVisibleRegion) override;
virtual bool TryMerge(nsDisplayItem *aItem) override;
virtual uint32_t GetPerFrameKey() override { return (mIndex << TYPE_BITS) | nsDisplayItem::GetPerFrameKey(); }
virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,