commit 43d777d4902a727270600b08cd0028da228f9160 parent 93308a9c6740296c0f07eed661e23a1789699c6d Author: Andrew Osmond <aosmond@gmail.com> Date: Tue, 23 Dec 2025 01:42:06 +0000 Bug 2007373 - Do not fallback directly from SWGL + D3D11/OGL composting to SWGL when creating RenderCompositor. r=gfx-reviewers,lsalzman This should be handled by the higher layers as an explicit fallback step during RenderCompositor creation. This will make our reporting of what compositing our users have much more accurate. Differential Revision: https://phabricator.services.mozilla.com/D277341 Diffstat:
5 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/gfx/webrender_bindings/RenderCompositor.cpp b/gfx/webrender_bindings/RenderCompositor.cpp @@ -220,18 +220,9 @@ UniquePtr<RenderCompositor> RenderCompositor::Create( return RenderCompositorNativeSWGL::Create(aWidget, aError); } #endif - UniquePtr<RenderCompositor> comp = - RenderCompositorLayersSWGL::Create(aWidget, aError); - if (comp) { - return comp; + if (RenderCompositorLayersSWGL::MayCreate(aWidget)) { + return RenderCompositorLayersSWGL::Create(aWidget, aError); } -#if defined(MOZ_WIDGET_ANDROID) - // On Android, we do not want to fallback from RenderCompositorOGLSWGL to - // RenderCompositorSWGL. - if (aWidget->GetCompositorOptions().AllowSoftwareWebRenderOGL()) { - return nullptr; - } -#endif return RenderCompositorSWGL::Create(aWidget, aError); } diff --git a/gfx/webrender_bindings/RenderCompositorD3D11SWGL.cpp b/gfx/webrender_bindings/RenderCompositorD3D11SWGL.cpp @@ -46,12 +46,14 @@ UniquePtr<RenderCompositor> RenderCompositorD3D11SWGL::Create( const RefPtr<widget::CompositorWidget>& aWidget, nsACString& aError) { if (!aWidget->GetCompositorOptions().AllowSoftwareWebRenderD3D11() || !gfx::gfxConfig::IsEnabled(gfx::Feature::D3D11_COMPOSITING)) { + aError.Assign("RcD3D11SWGL(not allowed)"_ns); return nullptr; } void* ctx = wr_swgl_create_context(); if (!ctx) { gfxCriticalNote << "Failed SWGL context creation for WebRender"; + aError.Assign("RcD3D11SWGL(create swgl ctx failed)"_ns); return nullptr; } @@ -60,6 +62,7 @@ UniquePtr<RenderCompositor> RenderCompositorD3D11SWGL::Create( if (!compositor->Initialize(&log)) { gfxCriticalNote << "Failed to initialize CompositorD3D11 for SWGL: " << log.get(); + aError.Assign("RcD3D11SWGL(create CompositorD3D11 failed)"_ns); return nullptr; } return MakeUnique<RenderCompositorD3D11SWGL>(compositor, aWidget, ctx); diff --git a/gfx/webrender_bindings/RenderCompositorLayersSWGL.cpp b/gfx/webrender_bindings/RenderCompositorLayersSWGL.cpp @@ -28,6 +28,15 @@ using namespace gfx; namespace wr { +bool RenderCompositorLayersSWGL::MayCreate( + const RefPtr<widget::CompositorWidget>& aWidget) { +#ifdef XP_WIN + return aWidget->GetCompositorOptions().AllowSoftwareWebRenderD3D11(); +#else + return aWidget->GetCompositorOptions().AllowSoftwareWebRenderOGL(); +#endif +} + UniquePtr<RenderCompositor> RenderCompositorLayersSWGL::Create( const RefPtr<widget::CompositorWidget>& aWidget, nsACString& aError) { #ifdef XP_WIN diff --git a/gfx/webrender_bindings/RenderCompositorLayersSWGL.h b/gfx/webrender_bindings/RenderCompositorLayersSWGL.h @@ -23,6 +23,7 @@ class SurfaceD3D11SWGL; class RenderCompositorLayersSWGL : public RenderCompositor { public: + static bool MayCreate(const RefPtr<widget::CompositorWidget>& aWidget); static UniquePtr<RenderCompositor> Create( const RefPtr<widget::CompositorWidget>& aWidget, nsACString& aError); diff --git a/gfx/webrender_bindings/RenderCompositorOGLSWGL.cpp b/gfx/webrender_bindings/RenderCompositorOGLSWGL.cpp @@ -55,11 +55,13 @@ UniquePtr<RenderCompositor> RenderCompositorOGLSWGL::Create( RenderThread::Get()->SingletonGLForCompositorOGL(); if (!context) { gfxCriticalNote << "SingletonGL does not exist for SWGL"; + aError.Assign("RcOGLSWGL(no singleton gl)"_ns); return nullptr; } auto programs = RenderThread::Get()->GetProgramsForCompositorOGL(); if (!programs) { gfxCriticalNote << "Failed to get Programs for CompositorOGL for SWGL"; + aError.Assign("RcOGLSWGL(no programs)"_ns); return nullptr; } @@ -71,6 +73,7 @@ UniquePtr<RenderCompositor> RenderCompositorOGLSWGL::Create( if (!compositorOGL->Initialize(context, programs, &log)) { gfxCriticalNote << "Failed to initialize CompositorOGL for SWGL: " << log.get(); + aError.Assign("RcOGLSWGL(create CompositorOGL failed)"_ns); return nullptr; } compositor = compositorOGL; @@ -81,18 +84,21 @@ UniquePtr<RenderCompositor> RenderCompositorOGLSWGL::Create( if (!compositorOGL->Initialize(&log)) { gfxCriticalNote << "Failed to initialize CompositorOGL for SWGL: " << log.get(); + aError.Assign("RcOGLSWGL(create CompositorOGL failed)"_ns); return nullptr; } compositor = compositorOGL; #endif if (!compositor) { + aError.Assign("RcOGLSWGL(no CompositorOGL)"_ns); return nullptr; } void* ctx = wr_swgl_create_context(); if (!ctx) { gfxCriticalNote << "Failed SWGL context creation for WebRender"; + aError.Assign("RcOGLSWGL(create swgl ctx failed)"_ns); return nullptr; }