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:
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;