tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mgfx/webrender_bindings/RenderCompositor.cpp | 13++-----------
Mgfx/webrender_bindings/RenderCompositorD3D11SWGL.cpp | 3+++
Mgfx/webrender_bindings/RenderCompositorLayersSWGL.cpp | 9+++++++++
Mgfx/webrender_bindings/RenderCompositorLayersSWGL.h | 1+
Mgfx/webrender_bindings/RenderCompositorOGLSWGL.cpp | 6++++++
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; }