diff --git a/gfx/layers/ShareableCanvasRenderer.cpp b/gfx/layers/ShareableCanvasRenderer.cpp index a8f2c92e04c2..460f0688ee50 100644 --- a/gfx/layers/ShareableCanvasRenderer.cpp +++ b/gfx/layers/ShareableCanvasRenderer.cpp @@ -126,9 +126,6 @@ void ShareableCanvasRenderer::UpdateCompositableClient() { if (!YIsDown()) { flags |= TextureFlags::ORIGIN_BOTTOM_LEFT; } - if (IsOpaque()) { - flags |= TextureFlags::IS_OPAQUE; - } // - diff --git a/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp b/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp index d394f1519124..6d0fe71bb69d 100644 --- a/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp +++ b/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp @@ -229,13 +229,11 @@ void MacIOSurfaceTextureHostOGL::PushDisplayItems( case gfx::SurfaceFormat::B8G8R8X8: { MOZ_ASSERT(aImageKeys.length() == 1); MOZ_ASSERT(mSurface->GetPlaneCount() == 0); - // We disable external compositing for RGB surfaces for now until - // we've tested support more thoroughly. Bug 1667917. aBuilder.PushImage(aBounds, aClip, true, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, preferCompositorSurface, - /* aSupportsExternalCompositing */ false); + /* aSupportsExternalCompositing */ true); break; } case gfx::SurfaceFormat::YUV422: { diff --git a/layout/generic/ViewportFrame.cpp b/layout/generic/ViewportFrame.cpp index d521b9a710c5..d3d4ea59e70f 100644 --- a/layout/generic/ViewportFrame.cpp +++ b/layout/generic/ViewportFrame.cpp @@ -113,46 +113,8 @@ static void BuildDisplayListForTopLayerFrame(nsDisplayListBuilder* aBuilder, aList->AppendToTop(&list); } -static bool BackdropListIsOpaque(ViewportFrame* aFrame, - nsDisplayListBuilder* aBuilder, - nsDisplayList* aList) { - // The common case for ::backdrop elements on the top layer is a single - // fixed position container, holding an opaque background color covering - // the whole viewport. - if (aList->Count() != 1 || - aList->GetTop()->GetType() != DisplayItemType::TYPE_FIXED_POSITION) { - return false; - } - - // Make sure the fixed position container isn't clipped or scrollable. - nsDisplayFixedPosition* fixed = - static_cast(aList->GetTop()); - if (fixed->GetActiveScrolledRoot() || fixed->GetClipChain()) { - return false; - } - - nsDisplayList* children = fixed->GetChildren(); - if (!children->GetTop() || - children->GetTop()->GetType() != DisplayItemType::TYPE_BACKGROUND_COLOR) { - return false; - } - - nsDisplayBackgroundColor* child = - static_cast(children->GetTop()); - if (child->GetActiveScrolledRoot() || child->GetClipChain()) { - return false; - } - - // Check that the background color is both opaque, and covering the - // whole viewport. - bool dummy; - nsRegion opaque = child->GetOpaqueRegion(aBuilder, &dummy); - return opaque.Contains(aFrame->GetRect()); -} - void ViewportFrame::BuildDisplayListForTopLayer(nsDisplayListBuilder* aBuilder, - nsDisplayList* aList, - bool* aIsOpaque) { + nsDisplayList* aList) { nsTArray topLayer = PresContext()->Document()->GetTopLayer(); for (dom::Element* elem : topLayer) { if (nsIFrame* frame = elem->GetPrimaryFrame()) { @@ -190,10 +152,6 @@ void ViewportFrame::BuildDisplayListForTopLayer(nsDisplayListBuilder* aBuilder, static_cast(backdropPh)->GetOutOfFlowFrame(); MOZ_ASSERT(backdropFrame); BuildDisplayListForTopLayerFrame(aBuilder, backdropFrame, aList); - - if (aIsOpaque) { - *aIsOpaque = BackdropListIsOpaque(this, aBuilder, aList); - } } BuildDisplayListForTopLayerFrame(aBuilder, frame, aList); } diff --git a/layout/generic/ViewportFrame.h b/layout/generic/ViewportFrame.h index ee68bd35cff3..2ab72b9cd4db 100644 --- a/layout/generic/ViewportFrame.h +++ b/layout/generic/ViewportFrame.h @@ -52,8 +52,7 @@ class ViewportFrame : public nsContainerFrame { const nsDisplayListSet& aLists) override; void BuildDisplayListForTopLayer(nsDisplayListBuilder* aBuilder, - nsDisplayList* aList, - bool* aIsOpaque = nullptr); + nsDisplayList* aList); virtual nscoord GetMinISize(gfxContext* aRenderingContext) override; virtual nscoord GetPrefISize(gfxContext* aRenderingContext) override; diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index e662c5340448..528628d0b5d6 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -3637,36 +3637,28 @@ void ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder, bool addScrollBars = mIsRoot && mWillBuildScrollableLayer && aBuilder->IsPaintingToWindow(); - nsDisplayListCollection set(aBuilder); - if (addScrollBars) { // Add classic scrollbars. - AppendScrollPartsTo(aBuilder, set, createLayersForScrollbars, false); + AppendScrollPartsTo(aBuilder, aLists, createLayersForScrollbars, false); } - nsDisplayListBuilder::AutoBuildingDisplayList building( - aBuilder, mOuter, visibleRect, dirtyRect); + { + nsDisplayListBuilder::AutoBuildingDisplayList building( + aBuilder, mOuter, visibleRect, dirtyRect); - // Don't clip the scrolled child, and don't paint scrollbars/scrollcorner. - // The scrolled frame shouldn't have its own background/border, so we - // can just pass aLists directly. - mOuter->BuildDisplayListForChild(aBuilder, mScrolledFrame, set); - - bool topLayerIsOpaque = false; - if (nsDisplayWrapList* topLayerWrapList = - MaybeCreateTopLayerItems(aBuilder, &topLayerIsOpaque)) { - if (topLayerIsOpaque) { - set.DeleteAll(aBuilder); - } - set.PositionedDescendants()->AppendToTop(topLayerWrapList); + // Don't clip the scrolled child, and don't paint scrollbars/scrollcorner. + // The scrolled frame shouldn't have its own background/border, so we + // can just pass aLists directly. + mOuter->BuildDisplayListForChild(aBuilder, mScrolledFrame, aLists); } + MaybeAddTopLayerItems(aBuilder, aLists); + if (addScrollBars) { // Add overlay scrollbars. - AppendScrollPartsTo(aBuilder, set, createLayersForScrollbars, true); + AppendScrollPartsTo(aBuilder, aLists, createLayersForScrollbars, true); } - set.MoveTo(aLists); return; } @@ -3965,17 +3957,7 @@ void ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder, } } - // Create any required items for the 'top layer' and check if they'll be - // opaque over the entire area of the viewport. If they are, then we can - // skip building display items for the rest of the page. - bool topLayerIsOpaque = false; - if (nsDisplayWrapList* topLayerWrapList = - MaybeCreateTopLayerItems(aBuilder, &topLayerIsOpaque)) { - if (topLayerIsOpaque) { - set.DeleteAll(aBuilder); - } - set.PositionedDescendants()->AppendToTop(topLayerWrapList); - } + MaybeAddTopLayerItems(aBuilder, set); if (willBuildAsyncZoomContainer) { MOZ_ASSERT(mClipAllDescendants); @@ -4078,13 +4060,12 @@ void ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder, scrolledContent.MoveTo(aLists); } -nsDisplayWrapList* ScrollFrameHelper::MaybeCreateTopLayerItems( - nsDisplayListBuilder* aBuilder, bool* aIsOpaque) { +void ScrollFrameHelper::MaybeAddTopLayerItems(nsDisplayListBuilder* aBuilder, + const nsDisplayListSet& aLists) { if (mIsRoot) { if (ViewportFrame* viewportFrame = do_QueryFrame(mOuter->GetParent())) { nsDisplayList topLayerList; - viewportFrame->BuildDisplayListForTopLayer(aBuilder, &topLayerList, - aIsOpaque); + viewportFrame->BuildDisplayListForTopLayer(aBuilder, &topLayerList); if (!topLayerList.IsEmpty()) { nsDisplayListBuilder::AutoBuildingDisplayList buildingDisplayList( aBuilder, viewportFrame); @@ -4098,12 +4079,11 @@ nsDisplayWrapList* ScrollFrameHelper::MaybeCreateTopLayerItems( if (wrapList) { wrapList->SetOverrideZIndex( std::numeric_limitsZIndex())>::max()); - return wrapList; + aLists.PositionedDescendants()->AppendToTop(wrapList); } } } } - return nullptr; } nsRect ScrollFrameHelper::RestrictToRootDisplayPort( diff --git a/layout/generic/nsGfxScrollFrame.h b/layout/generic/nsGfxScrollFrame.h index 2e2937faea1b..e6359ce013c9 100644 --- a/layout/generic/nsGfxScrollFrame.h +++ b/layout/generic/nsGfxScrollFrame.h @@ -95,8 +95,8 @@ class ScrollFrameHelper : public nsIReflowCallback { // wrapped in the async zoom container, if we're building one. // It should not be called with an ASR setter on the stack, as the // top-layer items handle setting up their own ASRs. - nsDisplayWrapList* MaybeCreateTopLayerItems(nsDisplayListBuilder* aBuilder, - bool* aIsOpaque); + void MaybeAddTopLayerItems(nsDisplayListBuilder* aBuilder, + const nsDisplayListSet& aLists); void AppendScrollPartsTo(nsDisplayListBuilder* aBuilder, const nsDisplayListSet& aLists, bool aCreateLayer,