tor-browser

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

commit 32a9df75c9eb15b5ffe8028838249f4e0515ea07
parent fc98236489b8b03c65e3ccd530a37d909eaac8cd
Author: Alexandru Marc <amarc@mozilla.com>
Date:   Fri,  5 Dec 2025 15:09:43 +0200

Revert "Bug 2004002 [Wayland] Skip explicit commit to wl_surface and deffer it to glSwapBuffer() operation r=emilio" for causing build bustages @ RenderCompositorEGL.cpp

This reverts commit 740ad2428d516c82f2a336f377e342db5d8a0bae.

Revert "Bug 2004002 [Wayland] Delay EGL window changes to OpenGL rendering to avoid artifacts r=emilio"

This reverts commit 665463a7abfd454454bea8f676dd4a96aee0a92c.

Diffstat:
Mgfx/layers/opengl/CompositorOGL.cpp | 6------
Mgfx/webrender_bindings/RenderCompositorEGL.cpp | 6+-----
Mwidget/gtk/GtkCompositorWidget.cpp | 10----------
Mwidget/gtk/GtkCompositorWidget.h | 3---
Mwidget/gtk/WaylandSurface.cpp | 47+++++++++++++++++------------------------------
Mwidget/gtk/WaylandSurface.h | 12+++---------
Mwidget/gtk/WaylandSurfaceLock.cpp | 8+++-----
Mwidget/gtk/WaylandSurfaceLock.h | 3+--
Mwidget/gtk/nsWindow.h | 5-----
9 files changed, 25 insertions(+), 75 deletions(-)

diff --git a/gfx/layers/opengl/CompositorOGL.cpp b/gfx/layers/opengl/CompositorOGL.cpp @@ -742,12 +742,6 @@ Maybe<IntRect> CompositorOGL::BeginFrame(const nsIntRegion& aInvalidRegion, MakeCurrent(ForceMakeCurrent); mWidgetSize = LayoutDeviceIntSize::FromUnknownSize(rect.Size()); -#ifdef MOZ_WAYLAND - if (mWidget && (auto* gtkWidget = mWidget->AsGtk())) { - // Set correct window size to avoid rendering artifacts. - gtkWidget->SetEGLNativeWindowSize(mWidgetSize); - } -#endif } else { MakeCurrent(); } diff --git a/gfx/webrender_bindings/RenderCompositorEGL.cpp b/gfx/webrender_bindings/RenderCompositorEGL.cpp @@ -88,11 +88,7 @@ bool RenderCompositorEGL::BeginFrame() { << "We don't have EGLSurface to draw into. Called too early?"; return false; } -#ifdef MOZ_WAYLAND - if (auto* gtkWidget = mWidget->AsGtk()) { - gtkWidget->SetEGLNativeWindowSize(GetBufferSize()); - } -#endif + if (!MakeCurrent()) { gfxCriticalNote << "Failed to make render context current, can't draw."; return false; diff --git a/widget/gtk/GtkCompositorWidget.cpp b/widget/gtk/GtkCompositorWidget.cpp @@ -122,16 +122,6 @@ EGLNativeWindowType GtkCompositorWidget::GetEGLNativeWindow() { return window; } -void GtkCompositorWidget::SetEGLNativeWindowSize( - const LayoutDeviceIntSize& aEGLWindowSize) { -#if defined(MOZ_WAYLAND) - // We explicitly need to set EGL window size on Wayland only. - if (mWidget && (auto surface = mWidget->GetWaylandSurface())) { - surface->ApplyEGLWindowSize(aEGLWindowSize); - } -#endif -} - LayoutDeviceIntRegion GtkCompositorWidget::GetTransparentRegion() { LayoutDeviceIntRegion fullRegion( LayoutDeviceIntRect(LayoutDeviceIntPoint(), GetClientSize())); diff --git a/widget/gtk/GtkCompositorWidget.h b/widget/gtk/GtkCompositorWidget.h @@ -79,9 +79,6 @@ class GtkCompositorWidget : public CompositorWidget, // Resume rendering with to given aXWindow (X11) or nsWindow (Wayland). void SetRenderingSurface(const uintptr_t aXWindow) override; - // Set EGLWindow size to avoid rendering artifacts - void SetEGLNativeWindowSize(const LayoutDeviceIntSize& aEGLWindowSize); - #if defined(MOZ_X11) Window XWindow() const { return mProvider.GetXWindow(); } #endif diff --git a/widget/gtk/WaylandSurface.cpp b/widget/gtk/WaylandSurface.cpp @@ -792,6 +792,20 @@ void WaylandSurface::SetCeiledScaleLocked( } } +void WaylandSurface::SetRenderingSizeLocked( + const WaylandSurfaceLock& aProofOfLock, DesktopIntSize aSize) { + MOZ_DIAGNOSTIC_ASSERT(&aProofOfLock == mSurfaceLock); + LOGVERBOSE("WaylandSurface::SetRenderingSizeLocked(): size [%d x %d]", + aSize.width, aSize.height); + mSize = aSize; + + // non-EGL rendering changes are applied at WaylandSurface::AttachLocked(). + // We want to sync size changes with matching buffer. + if (mViewportFollowsSizeChanges && mEGLWindow) { + SetViewPortDestLocked(aProofOfLock, aSize); + } +} + void WaylandSurface::SetViewPortDestLocked( const WaylandSurfaceLock& aProofOfLock, DesktopIntSize aDestSize) { MOZ_DIAGNOSTIC_ASSERT(&aProofOfLock == mSurfaceLock); @@ -958,7 +972,6 @@ wl_egl_window* WaylandSurface::GetEGLWindow(DesktopIntSize aSize) { WaylandSurfaceLock lock(this); MOZ_DIAGNOSTIC_ASSERT(mSurface, "Missing wl_surface!"); - mSize = aSize; auto scaledSize = GetScaledSize(aSize); if (!mEGLWindow) { @@ -977,13 +990,13 @@ wl_egl_window* WaylandSurface::GetEGLWindow(DesktopIntSize aSize) { wl_egl_window_resize(mEGLWindow, scaledSize.width, scaledSize.height, 0, 0); } + SetRenderingSizeLocked(lock, aSize); return mEGLWindow; } void WaylandSurface::SetSize(DesktopIntSize aSize) { WaylandSurfaceLock lock(this); - mSize = aSize; auto scaledSize = GetScaledSize(aSize); LOGVERBOSE( @@ -991,37 +1004,11 @@ void WaylandSurface::SetSize(DesktopIntSize aSize) { "scale %f scaled [%d x %d]", aSize.width, aSize.height, GetScale(), scaledSize.width, scaledSize.height); -} - -void WaylandSurface::ApplyEGLWindowSize(LayoutDeviceIntSize aEGLWindowSize) { - // Apply the surface changes by OpenGL swap buffer operation. - WaylandSurfaceLock lock(this, /* aSkipCommit */ true); - - auto scale = GetScale(); - auto surfaceSize = GetScaledSize(mSize); - bool sizeMatches = aEGLWindowSize == surfaceSize; - LOGWAYLAND( - "WaylandSurface::ApplyEGLWindowSize()" - " EGL window size [%d x %d] surface (scaled) size [%d x %d] " - "fractional scale %f matches %d", - aEGLWindowSize.width, aEGLWindowSize.height, surfaceSize.width, - surfaceSize.height, scale, sizeMatches); - - if (mViewportFollowsSizeChanges) { - DesktopIntSize viewportSize; - if (!sizeMatches) { - viewportSize = DesktopIntSize::Round(aEGLWindowSize / - DesktopToLayoutDeviceScale(scale)); - } else { - viewportSize = mSize; - } - SetViewPortDestLocked(lock, viewportSize); - } if (mEGLWindow) { - wl_egl_window_resize(mEGLWindow, aEGLWindowSize.width, - aEGLWindowSize.height, 0, 0); + wl_egl_window_resize(mEGLWindow, scaledSize.width, scaledSize.height, 0, 0); } + SetRenderingSizeLocked(lock, aSize); } void WaylandSurface::InvalidateRegionLocked( diff --git a/widget/gtk/WaylandSurface.h b/widget/gtk/WaylandSurface.h @@ -74,15 +74,6 @@ class WaylandSurface final { // Set WaylandSurface target size (viewport & ELG surface if it's present). void SetSize(DesktopIntSize aSize); - // Apply changes to EGLWindow size set by SetSize(). - // ApplyEGLWindowSize() is called from compostor thread - // right before GL rendering to set EGLWindow size / viewport size - // for actual back buffer. - // - // aEGLWindowSize is scaled backbuffer size and it's used similary - // as WaylandBuffer size at Attach(). - void ApplyEGLWindowSize(LayoutDeviceIntSize aEGLWindowSize); - // Mapped means we have all internals created. bool IsMapped() const { return mIsMapped; } @@ -288,6 +279,9 @@ class WaylandSurface final { WaylandSurfaceLock* aParentWaylandSurfaceLock, DesktopIntPoint aSubsurfacePosition, bool aSubsurfaceDesync); + void SetRenderingSizeLocked(const WaylandSurfaceLock& aProofOfLock, + DesktopIntSize aSize); + wl_surface* Lock(WaylandSurfaceLock* aWaylandSurfaceLock); void Unlock(struct wl_surface** aSurface, WaylandSurfaceLock* aWaylandSurfaceLock); diff --git a/widget/gtk/WaylandSurfaceLock.cpp b/widget/gtk/WaylandSurfaceLock.cpp @@ -15,11 +15,11 @@ namespace mozilla::widget { WaylandSurfaceLock::WaylandSurfaceLock(RefPtr<WaylandSurface> aWaylandSurface, - bool aSkipCommit) { + bool aForceCommit) { #ifdef MOZ_WAYLAND MOZ_DIAGNOSTIC_ASSERT(aWaylandSurface); mWaylandSurface = std::move(aWaylandSurface); - mSkipCommit = aSkipCommit; + mForceCommit = aForceCommit; if (GdkIsWaylandDisplay()) { mSurface = mWaylandSurface->Lock(this); } @@ -38,9 +38,7 @@ void WaylandSurfaceLock::Commit() { WaylandSurfaceLock::~WaylandSurfaceLock() { #ifdef MOZ_WAYLAND if (GdkIsWaylandDisplay()) { - if (mForceCommit || !mSkipCommit) { - Commit(); - } + Commit(); mWaylandSurface->Unlock(&mSurface, this); } #endif diff --git a/widget/gtk/WaylandSurfaceLock.h b/widget/gtk/WaylandSurfaceLock.h @@ -25,7 +25,7 @@ class WaylandSurface; class WaylandSurfaceLock final { public: explicit WaylandSurfaceLock(RefPtr<WaylandSurface> aWaylandSurface, - bool aSkipCommit = false); + bool aForceCommit = false); ~WaylandSurfaceLock(); WaylandSurface* GetWaylandSurface() const; @@ -44,7 +44,6 @@ class WaylandSurfaceLock final { RefPtr<WaylandSurface> mWaylandSurface; wl_surface* mSurface = nullptr; bool mForceCommit = false; - bool mSkipCommit = false; #endif }; diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h @@ -345,11 +345,6 @@ class nsWindow final : public nsIWidget { GdkWindow* GetToplevelGdkWindow() const; GtkWidget* GetGtkWidget() const { return mShell; } nsWindow* GetEffectiveParent(); -#ifdef MOZ_WAYLAND - RefPtr<mozilla::widget::WaylandSurface> GetWaylandSurface() { - return mSurface; - } -#endif bool IsDestroyed() const { return mIsDestroyed; } bool IsPopup() const; bool IsWaylandPopup() const;