Bug 1382534 - Layerize active masks even with HWA disabled. r=mstange
MozReview-Commit-ID: 6lvOE3fGFAy
--- a/layout/painting/FrameLayerBuilder.cpp
+++ b/layout/painting/FrameLayerBuilder.cpp
@@ -3864,18 +3864,16 @@ SetCSSMaskLayerUserData(Layer* aMaskLaye
aMaskLayer->SetUserData(&gCSSMaskLayerUserData,
new CSSMaskLayerUserData());
}
void
ContainerState::SetupMaskLayerForCSSMask(Layer* aLayer,
nsDisplayMask* aMaskItem)
{
- MOZ_ASSERT(mManager->IsCompositingCheap());
-
RefPtr<ImageLayer> maskLayer =
CreateOrRecycleMaskImageLayerFor(MaskLayerKey(aLayer, Nothing()),
SetCSSMaskLayerUserData);
CSSMaskLayerUserData* oldUserData =
static_cast<CSSMaskLayerUserData*>(maskLayer->GetUserData(&gCSSMaskLayerUserData));
bool snap;
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -9284,30 +9284,32 @@ nsDisplayMask::PaintMask(nsDisplayListBu
return imgParmas.result == mozilla::image::DrawResult::SUCCESS;
}
LayerState
nsDisplayMask::GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aParameters)
{
- if (ShouldPaintOnMaskLayer(aManager)) {
- return RequiredLayerStateForChildren(aBuilder, aManager, aParameters,
- mList, GetAnimatedGeometryRoot());
+ if (CanPaintOnMaskLayer(aManager)) {
+ LayerState result = RequiredLayerStateForChildren(aBuilder, aManager,
+ aParameters, mList, GetAnimatedGeometryRoot());
+ // When we're not active, FrameLayerBuilder will call PaintAsLayer()
+ // on us during painting. In that case we don't want a mask layer to
+ // be created, because PaintAsLayer() takes care of applying the mask.
+ // So we return LAYER_SVG_EFFECTS instead of LAYER_INACTIVE so that
+ // FrameLayerBuilder doesn't set a mask layer on our layer.
+ return result == LAYER_INACTIVE ? LAYER_SVG_EFFECTS : result;
}
return LAYER_SVG_EFFECTS;
}
-bool nsDisplayMask::ShouldPaintOnMaskLayer(LayerManager* aManager)
-{
- if (!aManager->IsCompositingCheap()) {
- return false;
- }
-
+bool nsDisplayMask::CanPaintOnMaskLayer(LayerManager* aManager)
+{
if (!nsSVGIntegrationUtils::IsMaskResourceReady(mFrame)) {
return false;
}
if (gfxPrefs::DrawMaskLayer()) {
return false;
}
@@ -9363,18 +9365,16 @@ nsDisplayMask::ComputeInvalidationRegion
}
}
void
nsDisplayMask::PaintAsLayer(nsDisplayListBuilder* aBuilder,
gfxContext* aCtx,
LayerManager* aManager)
{
- MOZ_ASSERT(!ShouldPaintOnMaskLayer(aManager));
-
// Clip the drawing target by mVisibleRect, which contains the visible
// region of the target frame and its out-of-flow and inflow descendants.
gfxContext* context = aCtx;
Rect bounds =
NSRectToRect(mVisibleRect, mFrame->PresContext()->AppUnitsPerDevPixel());
bounds.RoundOut();
context->Clip(bounds);
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -5536,18 +5536,18 @@ public:
virtual bool CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
mozilla::wr::IpcResourceUpdateQueue& aResources,
const StackingContextHelper& aSc,
mozilla::layers::WebRenderLayerManager* aManager,
nsDisplayListBuilder* aDisplayListBuilder) override;
private:
// According to mask property and the capability of aManager, determine
- // whether paint mask onto a dedicate mask layer.
- bool ShouldPaintOnMaskLayer(LayerManager* aManager);
+ // whether we can paint the mask onto a dedicate mask layer.
+ bool CanPaintOnMaskLayer(LayerManager* aManager);
nsTArray<nsRect> mDestRects;
};
/**
* A display item to paint a stacking context with filter effects set by the
* stacking context root frame's style.
*/