зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1360246 - Remove the RelativeToParent functions by propagating StackingContextHelper chains. r=nical
The only remaining callers of RelativeToParent() are in StackingContextHelper itself, which we can remove now by having the SCH take a parent SCH and use it instead of RelativeToParent(). This patch implements this change. This makes a failing test pass, because of how preserve-3d container layers work. Specifically, preserve-3d container layers render their descendants in z-order, not in tree order. If those children were assuming that their parent had already pushed a stacking context, that assumption may have been false because the parent might have not yet been rendered because of z-ordering. By using the StackingContextHelper chain instead of the layer tree ancestry, we fix the stacking-context-relative coordinates being used in the descendant subtree of preserve-3d container layers. MozReview-Commit-ID: HzZvBuAlMdB
This commit is contained in:
Родитель
989470c342
Коммит
48e0e2221d
|
@ -17,30 +17,32 @@ StackingContextHelper::StackingContextHelper()
|
|||
// mOrigin remains at 0,0
|
||||
}
|
||||
|
||||
StackingContextHelper::StackingContextHelper(wr::DisplayListBuilder& aBuilder,
|
||||
StackingContextHelper::StackingContextHelper(const StackingContextHelper& aParentSC,
|
||||
wr::DisplayListBuilder& aBuilder,
|
||||
WebRenderLayer* aLayer,
|
||||
const Maybe<gfx::Matrix4x4>& aTransform)
|
||||
: mBuilder(&aBuilder)
|
||||
{
|
||||
LayerRect scBounds = aLayer->RelativeToParent(aLayer->BoundsForStackingContext());
|
||||
LayerRect scBounds = aLayer->BoundsForStackingContext();
|
||||
Layer* layer = aLayer->GetLayer();
|
||||
gfx::Matrix4x4 transform = aTransform.valueOr(layer->GetTransform());
|
||||
mBuilder->PushStackingContext(wr::ToWrRect(scBounds),
|
||||
mBuilder->PushStackingContext(aParentSC.ToRelativeWrRect(scBounds),
|
||||
1.0f,
|
||||
transform,
|
||||
wr::ToWrMixBlendMode(layer->GetMixBlendMode()));
|
||||
mOrigin = aLayer->Bounds().TopLeft();
|
||||
}
|
||||
|
||||
StackingContextHelper::StackingContextHelper(wr::DisplayListBuilder& aBuilder,
|
||||
StackingContextHelper::StackingContextHelper(const StackingContextHelper& aParentSC,
|
||||
wr::DisplayListBuilder& aBuilder,
|
||||
WebRenderLayer* aLayer,
|
||||
uint64_t aAnimationsId,
|
||||
float* aOpacityPtr,
|
||||
gfx::Matrix4x4* aTransformPtr)
|
||||
: mBuilder(&aBuilder)
|
||||
{
|
||||
LayerRect scBounds = aLayer->RelativeToParent(aLayer->BoundsForStackingContext());
|
||||
mBuilder->PushStackingContext(wr::ToWrRect(scBounds),
|
||||
LayerRect scBounds = aLayer->BoundsForStackingContext();
|
||||
mBuilder->PushStackingContext(aParentSC.ToRelativeWrRect(scBounds),
|
||||
aAnimationsId,
|
||||
aOpacityPtr,
|
||||
aTransformPtr,
|
||||
|
|
|
@ -28,12 +28,14 @@ public:
|
|||
// the transform if provided, otherwise takes the transform from the layer.
|
||||
// It also takes the mix-blend-mode and bounds from the layer, and uses 1.0
|
||||
// for the opacity.
|
||||
StackingContextHelper(wr::DisplayListBuilder& aBuilder,
|
||||
StackingContextHelper(const StackingContextHelper& aParentSC,
|
||||
wr::DisplayListBuilder& aBuilder,
|
||||
WebRenderLayer* aLayer,
|
||||
const Maybe<gfx::Matrix4x4>& aTransform = Nothing());
|
||||
// Alternate constructor which invokes the version of PushStackingContext
|
||||
// for animations.
|
||||
StackingContextHelper(wr::DisplayListBuilder& aBuilder,
|
||||
StackingContextHelper(const StackingContextHelper& aParentSC,
|
||||
wr::DisplayListBuilder& aBuilder,
|
||||
WebRenderLayer* aLayer,
|
||||
uint64_t aAnimationsId,
|
||||
float* aOpacityPtr,
|
||||
|
|
|
@ -62,7 +62,7 @@ WebRenderCanvasLayer::RenderLayer(wr::DisplayListBuilder& aBuilder,
|
|||
transform = Some(GetTransform().PreTranslate(0, mBounds.height, 0).PreScale(1, -1, 1));
|
||||
}
|
||||
|
||||
StackingContextHelper sc(aBuilder, this, transform);
|
||||
StackingContextHelper sc(aSc, aBuilder, this, transform);
|
||||
|
||||
LayerRect rect(0, 0, mBounds.width, mBounds.height);
|
||||
DumpLayerInfo("CanvasLayer", rect);
|
||||
|
|
|
@ -21,7 +21,7 @@ void
|
|||
WebRenderColorLayer::RenderLayer(wr::DisplayListBuilder& aBuilder,
|
||||
const StackingContextHelper& aSc)
|
||||
{
|
||||
StackingContextHelper sc(aBuilder, this);
|
||||
StackingContextHelper sc(aSc, aBuilder, this);
|
||||
|
||||
LayerRect rect = Bounds();
|
||||
DumpLayerInfo("ColorLayer", rect);
|
||||
|
|
|
@ -88,7 +88,7 @@ WebRenderContainerLayer::RenderLayer(wr::DisplayListBuilder& aBuilder,
|
|||
WrBridge()->AddWebRenderParentCommand(anim);
|
||||
}
|
||||
|
||||
StackingContextHelper sc(aBuilder, this, animationsId, opacityForSC, transformForSC);
|
||||
StackingContextHelper sc(aSc, aBuilder, this, animationsId, opacityForSC, transformForSC);
|
||||
|
||||
LayerRect rect = Bounds();
|
||||
DumpLayerInfo("ContainerLayer", rect);
|
||||
|
|
|
@ -165,7 +165,7 @@ WebRenderImageLayer::RenderLayer(wr::DisplayListBuilder& aBuilder,
|
|||
return;
|
||||
}
|
||||
|
||||
StackingContextHelper sc(aBuilder, this);
|
||||
StackingContextHelper sc(aSc, aBuilder, this);
|
||||
|
||||
LayerRect rect(0, 0, size.width, size.height);
|
||||
if (mScaleMode != ScaleMode::SCALE_NONE) {
|
||||
|
|
|
@ -51,19 +51,6 @@ WebRenderLayer::ParentBounds()
|
|||
return LayerRect();
|
||||
}
|
||||
|
||||
LayerRect
|
||||
WebRenderLayer::RelativeToParent(const LayerRect& aRect)
|
||||
{
|
||||
return aRect - ParentBounds().TopLeft();
|
||||
}
|
||||
|
||||
LayerRect
|
||||
WebRenderLayer::RelativeToParent(const LayoutDeviceRect& aRect)
|
||||
{
|
||||
return RelativeToParent(ViewAs<LayerPixel>(
|
||||
aRect, PixelCastJustification::WebRenderHasUnitResolution));
|
||||
}
|
||||
|
||||
gfx::Rect
|
||||
WebRenderLayer::TransformedVisibleBoundsRelativeToParent()
|
||||
{
|
||||
|
|
|
@ -48,9 +48,6 @@ public:
|
|||
WebRenderBridgeChild* WrBridge();
|
||||
WrImageKey GetImageKey();
|
||||
|
||||
LayerRect RelativeToParent(const LayerRect& aRect);
|
||||
LayerRect RelativeToParent(const LayoutDeviceRect& aRect);
|
||||
|
||||
LayerRect Bounds();
|
||||
LayerRect BoundsForStackingContext();
|
||||
protected:
|
||||
|
|
|
@ -89,9 +89,10 @@ WebRenderPaintedLayer::UpdateImageClient()
|
|||
}
|
||||
|
||||
void
|
||||
WebRenderPaintedLayer::CreateWebRenderDisplayList(wr::DisplayListBuilder& aBuilder)
|
||||
WebRenderPaintedLayer::CreateWebRenderDisplayList(wr::DisplayListBuilder& aBuilder,
|
||||
const StackingContextHelper& aSc)
|
||||
{
|
||||
StackingContextHelper sc(aBuilder, this);
|
||||
StackingContextHelper sc(aSc, aBuilder, this);
|
||||
|
||||
LayerRect rect = Bounds();
|
||||
DumpLayerInfo("PaintedLayer", rect);
|
||||
|
@ -145,7 +146,7 @@ WebRenderPaintedLayer::RenderLayer(wr::DisplayListBuilder& aBuilder,
|
|||
MOZ_ASSERT(GetInvalidRegion().IsEmpty());
|
||||
}
|
||||
|
||||
CreateWebRenderDisplayList(aBuilder);
|
||||
CreateWebRenderDisplayList(aBuilder, aSc);
|
||||
}
|
||||
|
||||
} // namespace layers
|
||||
|
|
|
@ -55,7 +55,8 @@ public:
|
|||
private:
|
||||
bool SetupExternalImages();
|
||||
bool UpdateImageClient();
|
||||
void CreateWebRenderDisplayList(wr::DisplayListBuilder& aBuilder);
|
||||
void CreateWebRenderDisplayList(wr::DisplayListBuilder& aBuilder,
|
||||
const StackingContextHelper& aSc);
|
||||
};
|
||||
|
||||
} // namespace layers
|
||||
|
|
|
@ -22,7 +22,7 @@ using namespace mozilla::gfx;
|
|||
|
||||
void
|
||||
WebRenderPaintedLayerBlob::RenderLayer(wr::DisplayListBuilder& aBuilder,
|
||||
const StackingContextHelper& aHelper)
|
||||
const StackingContextHelper& aSc)
|
||||
{
|
||||
LayerIntRegion visibleRegion = GetVisibleRegion();
|
||||
LayerIntRect bounds = visibleRegion.GetBounds();
|
||||
|
@ -78,7 +78,7 @@ WebRenderPaintedLayerBlob::RenderLayer(wr::DisplayListBuilder& aBuilder,
|
|||
DebugOnly<bool> ok = recorder->CopyRecording((char*)bytes.AsSlice().begin().get(), bytes.AsSlice().length());
|
||||
MOZ_ASSERT(ok);
|
||||
|
||||
StackingContextHelper sc(aBuilder, this);
|
||||
StackingContextHelper sc(aSc, aBuilder, this);
|
||||
LayerRect rect = Bounds();
|
||||
DumpLayerInfo("PaintedLayer", rect);
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ public:
|
|||
|
||||
Layer* GetLayer() override { return this; }
|
||||
void RenderLayer(wr::DisplayListBuilder& aBuilder,
|
||||
const StackingContextHelper& aHelper) override;
|
||||
const StackingContextHelper& aSc) override;
|
||||
private:
|
||||
RefPtr<ImageContainer> mImageContainer;
|
||||
RefPtr<ImageClient> mImageClient;
|
||||
|
|
|
@ -46,7 +46,7 @@ fuzzy-if(winWidget&&!layersGPUAccelerated,1,61) == perspective-origin-3a.html pe
|
|||
== perspective-origin-4a.html perspective-origin-4-ref.html
|
||||
fails-if(webrender) == perspective-zindex.html green-rect.html
|
||||
fails-if(webrender) == perspective-zindex-2.html green-rect.html
|
||||
fails-if(webrender) fails-if(stylo) != sorting-1a.html sorting-1-ref.html
|
||||
fails-if(stylo) != sorting-1a.html sorting-1-ref.html
|
||||
# Parallel planes, different z depth
|
||||
fails-if(webrender) == sorting-2a.html sorting-2-ref.html
|
||||
# Parallel planes, same z depth (shouldn't be sorted!)
|
||||
|
|
Загрузка…
Ссылка в новой задаче