diff --git a/gfx/ipc/CompositorOptions.h b/gfx/ipc/CompositorOptions.h index 42b7e361d6ad..3d695e51dbea 100644 --- a/gfx/ipc/CompositorOptions.h +++ b/gfx/ipc/CompositorOptions.h @@ -42,6 +42,7 @@ class CompositorOptions { bool AllowSoftwareWebRenderOGL() const { return mAllowSoftwareWebRenderOGL; } bool InitiallyPaused() const { return mInitiallyPaused; } bool NeedFastSnaphot() const { return mNeedFastSnaphot; } + bool AllowNativeCompositor() const { return mAllowNativeCompositor; } void SetUseAPZ(bool aUseAPZ) { mUseAPZ = aUseAPZ; } @@ -61,13 +62,18 @@ class CompositorOptions { mNeedFastSnaphot = aNeedFastSnaphot; } + void SetAllowNativeCompositor(bool aAllowNativeCompositor) { + mAllowNativeCompositor = aAllowNativeCompositor; + } + bool EqualsIgnoringApzEnablement(const CompositorOptions& aOther) const { return mUseSoftwareWebRender == aOther.mUseSoftwareWebRender && mAllowSoftwareWebRenderD3D11 == aOther.mAllowSoftwareWebRenderD3D11 && mAllowSoftwareWebRenderOGL == aOther.mAllowSoftwareWebRenderOGL && mInitiallyPaused == aOther.mInitiallyPaused && - mNeedFastSnaphot == aOther.mNeedFastSnaphot; + mNeedFastSnaphot == aOther.mNeedFastSnaphot && + mAllowNativeCompositor == aOther.mAllowNativeCompositor; } bool operator==(const CompositorOptions& aOther) const { @@ -83,6 +89,7 @@ class CompositorOptions { bool mAllowSoftwareWebRenderOGL = false; bool mInitiallyPaused = false; bool mNeedFastSnaphot = false; + bool mAllowNativeCompositor = true; // Make sure to add new fields to the ParamTraits implementation // in LayersMessageUtils.h diff --git a/gfx/layers/ipc/LayersMessageUtils.h b/gfx/layers/ipc/LayersMessageUtils.h index a0e1430ce095..cb5d682666b2 100644 --- a/gfx/layers/ipc/LayersMessageUtils.h +++ b/gfx/layers/ipc/LayersMessageUtils.h @@ -1011,6 +1011,7 @@ struct ParamTraits { WriteParam(aWriter, aParam.mAllowSoftwareWebRenderOGL); WriteParam(aWriter, aParam.mInitiallyPaused); WriteParam(aWriter, aParam.mNeedFastSnaphot); + WriteParam(aWriter, aParam.mAllowNativeCompositor); } static bool Read(MessageReader* aReader, paramType* aResult) { @@ -1019,7 +1020,8 @@ struct ParamTraits { ReadParam(aReader, &aResult->mAllowSoftwareWebRenderD3D11) && ReadParam(aReader, &aResult->mAllowSoftwareWebRenderOGL) && ReadParam(aReader, &aResult->mInitiallyPaused) && - ReadParam(aReader, &aResult->mNeedFastSnaphot); + ReadParam(aReader, &aResult->mNeedFastSnaphot) && + ReadParam(aReader, &aResult->mAllowNativeCompositor); } }; diff --git a/gfx/webrender_bindings/RenderCompositor.cpp b/gfx/webrender_bindings/RenderCompositor.cpp index fd041cb648d1..92432f03763f 100644 --- a/gfx/webrender_bindings/RenderCompositor.cpp +++ b/gfx/webrender_bindings/RenderCompositor.cpp @@ -205,7 +205,10 @@ UniquePtr RenderCompositor::Create( return RenderCompositorNativeSWGL::Create(aWidget, aError); } #elif defined(MOZ_WAYLAND) - if (gfx::gfxVars::UseWebRenderCompositor()) { + // Some widgets on Wayland (D&D popups for instance) can't use native + // compositor due to system limitations. + if (gfx::gfxVars::UseWebRenderCompositor() && + aWidget->GetCompositorOptions().AllowNativeCompositor()) { return RenderCompositorNativeSWGL::Create(aWidget, aError); } #endif @@ -231,7 +234,8 @@ UniquePtr RenderCompositor::Create( #endif #if defined(MOZ_WAYLAND) - if (gfx::gfxVars::UseWebRenderCompositor()) { + if (gfx::gfxVars::UseWebRenderCompositor() && + aWidget->GetCompositorOptions().AllowNativeCompositor()) { return RenderCompositorNativeOGL::Create(aWidget, aError); } #endif diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h index eba170730ac1..c22cb1b878f1 100644 --- a/widget/gtk/nsWindow.h +++ b/widget/gtk/nsWindow.h @@ -432,6 +432,7 @@ class nsWindow final : public nsBaseWidget { LayoutDeviceIntMargin GtkBorderToDevicePixels(const GtkBorder&); bool WidgetTypeSupportsAcceleration() override; + bool WidgetTypeSupportsNativeCompositing() override { return !mIsDragPopup; } nsresult SetSystemFont(const nsCString& aFontName) override; nsresult GetSystemFont(nsCString& aFontName) override; diff --git a/widget/nsBaseWidget.cpp b/widget/nsBaseWidget.cpp index 74767edbd09f..260f34b415a8 100644 --- a/widget/nsBaseWidget.cpp +++ b/widget/nsBaseWidget.cpp @@ -1452,6 +1452,7 @@ already_AddRefed nsBaseWidget::CreateCompositorSession( options.SetAllowSoftwareWebRenderOGL( gfx::gfxVars::AllowSoftwareWebRenderOGL()); } + options.SetAllowNativeCompositor(WidgetTypeSupportsNativeCompositing()); #endif #ifdef MOZ_WIDGET_ANDROID diff --git a/widget/nsBaseWidget.h b/widget/nsBaseWidget.h index 285c87c49fa2..68fd9e329e66 100644 --- a/widget/nsBaseWidget.h +++ b/widget/nsBaseWidget.h @@ -280,6 +280,7 @@ class nsBaseWidget : public nsIWidget, public nsSupportsWeakReference { } bool ComputeShouldAccelerate(); virtual bool WidgetTypeSupportsAcceleration() { return true; } + virtual bool WidgetTypeSupportsNativeCompositing() { return true; } [[nodiscard]] nsresult OnDefaultButtonLoaded( const LayoutDeviceIntRect& aButtonRect) override { return NS_ERROR_NOT_IMPLEMENTED;