Added fix for mozbz#1623060

This commit is contained in:
Martin Stransky 2020-03-17 21:28:53 +01:00
parent c4945dd7fe
commit 7e042054d1
2 changed files with 270 additions and 1 deletions

View File

@ -118,7 +118,7 @@ ExcludeArch: s390x
Summary: Mozilla Firefox Web browser
Name: firefox
Version: 74.0
Release: 7%{?nss_tag}%{?dist}
Release: 8%{?nss_tag}%{?dist}
URL: https://www.mozilla.org/firefox/
License: MPLv1.1 or GPLv2+ or LGPLv2+
Source0: https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz
@ -188,6 +188,7 @@ Patch424: mozilla-1615098.patch
# Wayland specific upstream patches
Patch574: firefox-pipewire.patch
Patch575: mozilla-1609538.patch
Patch576: mozilla-1623060.patch
# PGO/LTO patches
Patch600: pgo.patch
@ -394,6 +395,7 @@ This package contains results of tests executed during build.
# Wayland specific upstream patches
%patch574 -p1 -b .firefox-pipewire
%patch575 -p1 -b .mozilla-1609538
%patch576 -p1 -b .mozilla-1623060
# PGO patches
%patch600 -p1 -b .pgo
@ -960,6 +962,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
#---------------------------------------------------------------------
%changelog
* Tue Mar 17 2020 Martin Stransky <stransky@redhat.com> - 74.0-8
- Added fix for mozbz#1623060
* Mon Mar 16 2020 Martin Stransky <stransky@redhat.com> - 74.0-7
- Use D-Bus remote exclusively for both X11 and Wayland backends
when WAYLAND_DISPLAY is present.

264
mozilla-1623060.patch Normal file
View File

@ -0,0 +1,264 @@
diff -up firefox-74.0/widget/gtk/nsWaylandDisplay.cpp.mozilla-1623060 firefox-74.0/widget/gtk/nsWaylandDisplay.cpp
--- firefox-74.0/widget/gtk/nsWaylandDisplay.cpp.mozilla-1623060 2020-03-17 14:19:04.394231493 +0100
+++ firefox-74.0/widget/gtk/nsWaylandDisplay.cpp 2020-03-17 14:23:47.445480363 +0100
@@ -26,15 +26,12 @@ namespace widget {
#define DMABUF_BASIC_PREF "widget.wayland_dmabuf_basic_compositor.enabled"
// Enable dmabuf for WebGL backend
#define DMABUF_WEBGL_PREF "widget.wayland_dmabuf_webgl.enabled"
-// See WindowSurfaceWayland::RenderingCacheMode for details.
-#define CACHE_MODE_PREF "widget.wayland_cache_mode"
bool nsWaylandDisplay::sIsDMABufEnabled = false;
int nsWaylandDisplay::sIsDMABufPrefTextState = false;
int nsWaylandDisplay::sIsDMABufPrefBasicCompositorState = false;
int nsWaylandDisplay::sIsDMABufPrefWebGLState = false;
bool nsWaylandDisplay::sIsDMABufConfigured = false;
-int nsWaylandDisplay::sRenderingCacheModePref = -1;
bool nsWaylandDisplay::sIsPrefLoaded = false;
wl_display* WaylandDisplayGetWLDisplay(GdkDisplay* aGdkDisplay) {
@@ -423,7 +420,6 @@ nsWaylandDisplay::nsWaylandDisplay(wl_di
sIsDMABufPrefBasicCompositorState =
Preferences::GetBool(DMABUF_BASIC_PREF, false);
sIsDMABufPrefWebGLState = Preferences::GetBool(DMABUF_WEBGL_PREF, false);
- sRenderingCacheModePref = Preferences::GetInt(CACHE_MODE_PREF, 0);
sIsPrefLoaded = true;
}
diff -up firefox-74.0/widget/gtk/nsWaylandDisplay.h.mozilla-1623060 firefox-74.0/widget/gtk/nsWaylandDisplay.h
--- firefox-74.0/widget/gtk/nsWaylandDisplay.h.mozilla-1623060 2020-03-17 14:19:04.394231493 +0100
+++ firefox-74.0/widget/gtk/nsWaylandDisplay.h 2020-03-17 14:22:49.867838072 +0100
@@ -91,9 +91,6 @@ class nsWaylandDisplay {
static bool IsDMABufTexturesEnabled();
static bool IsDMABufWebGLEnabled();
- // See WindowSurfaceWayland::CacheMode for details.
- int GetRenderingCacheModePref() { return sRenderingCacheModePref; };
-
private:
bool ConfigureGbm();
@@ -121,8 +118,7 @@ class nsWaylandDisplay {
static int sIsDMABufPrefTextState;
static int sIsDMABufPrefBasicCompositorState;
static int sIsDMABufPrefWebGLState;
- static bool sIsDMABufConfigured;
- static int sRenderingCacheModePref;
+ static bool sIsDMABufConfigured;
static bool sIsPrefLoaded;
};
diff -up firefox-74.0/widget/gtk/nsWindow.cpp.mozilla-1623060 firefox-74.0/widget/gtk/nsWindow.cpp
--- firefox-74.0/widget/gtk/nsWindow.cpp.mozilla-1623060 2020-03-17 14:19:04.393231499 +0100
+++ firefox-74.0/widget/gtk/nsWindow.cpp 2020-03-17 14:19:04.395231487 +0100
@@ -7839,3 +7839,15 @@ void nsWindow::SetEGLNativeWindowSize(
nsWindow* nsWindow::GetFocusedWindow() { return gFocusWindow; }
#endif
+
+LayoutDeviceIntRect nsWindow::GetMozContainerSize() {
+ LayoutDeviceIntRect size(0, 0, 0, 0);
+ if (mContainer) {
+ GtkAllocation allocation;
+ gtk_widget_get_allocation(GTK_WIDGET(mContainer), &allocation);
+ int scale = GdkScaleFactor();
+ size.width = allocation.width * scale;
+ size.height = allocation.height * scale;
+ }
+ return size;
+}
diff -up firefox-74.0/widget/gtk/nsWindow.h.mozilla-1623060 firefox-74.0/widget/gtk/nsWindow.h
--- firefox-74.0/widget/gtk/nsWindow.h.mozilla-1623060 2020-03-09 14:10:19.000000000 +0100
+++ firefox-74.0/widget/gtk/nsWindow.h 2020-03-17 14:19:04.395231487 +0100
@@ -291,6 +291,7 @@ class nsWindow final : public nsBaseWidg
int32_t aVertical) override;
MozContainer* GetMozContainer() { return mContainer; }
+ LayoutDeviceIntRect GetMozContainerSize();
// GetMozContainerWidget returns the MozContainer even for undestroyed
// descendant windows
GtkWidget* GetMozContainerWidget();
diff -up firefox-74.0/widget/gtk/WindowSurfaceWayland.cpp.mozilla-1623060 firefox-74.0/widget/gtk/WindowSurfaceWayland.cpp
--- firefox-74.0/widget/gtk/WindowSurfaceWayland.cpp.mozilla-1623060 2020-03-09 14:10:19.000000000 +0100
+++ firefox-74.0/widget/gtk/WindowSurfaceWayland.cpp 2020-03-17 14:19:04.394231493 +0100
@@ -527,9 +527,6 @@ WindowSurfaceWayland::WindowSurfaceWayla
mShmBackupBuffer[i] = nullptr;
mDMABackupBuffer[i] = nullptr;
}
- mRenderingCacheMode = static_cast<RenderingCacheMode>(
- mWaylandDisplay->GetRenderingCacheModePref());
- LOGWAYLAND(("WindowSurfaceWayland Cache mode %d\n", mRenderingCacheMode));
}
WindowSurfaceWayland::~WindowSurfaceWayland() {
@@ -650,14 +647,13 @@ WindowBackBuffer* WindowSurfaceWayland::
LOGWAYLAND(
("WindowSurfaceWayland::NewWaylandBuffer [%p] Requested buffer [%d "
"x %d] DMABuf %d\n",
- (void*)this, mBufferScreenRect.width, mBufferScreenRect.height,
- aUseDMABufBackend));
+ (void*)this, mWidgetRect.width, mWidgetRect.height, aUseDMABufBackend));
mWaylandBuffer = WaylandBufferFindAvailable(
- mBufferScreenRect.width, mBufferScreenRect.height, aUseDMABufBackend);
+ mWidgetRect.width, mWidgetRect.height, aUseDMABufBackend);
if (!mWaylandBuffer) {
- mWaylandBuffer = CreateWaylandBuffer(
- mBufferScreenRect.width, mBufferScreenRect.height, aUseDMABufBackend);
+ mWaylandBuffer = CreateWaylandBuffer(mWidgetRect.width, mWidgetRect.height,
+ aUseDMABufBackend);
}
return mWaylandBuffer;
@@ -667,7 +663,7 @@ WindowBackBuffer* WindowSurfaceWayland::
LOGWAYLAND(
("WindowSurfaceWayland::GetWaylandBufferRecent [%p] Requested buffer [%d "
"x %d]\n",
- (void*)this, mBufferScreenRect.width, mBufferScreenRect.height));
+ (void*)this, mWidgetRect.width, mWidgetRect.height));
// There's no buffer created yet, create a new one for partial screen updates.
if (!mWaylandBuffer) {
@@ -679,10 +675,9 @@ WindowBackBuffer* WindowSurfaceWayland::
return nullptr;
}
- if (mWaylandBuffer->IsMatchingSize(mBufferScreenRect.width,
- mBufferScreenRect.height)) {
- LOGWAYLAND((" Size is ok, use the buffer [%d x %d]\n",
- mBufferScreenRect.width, mBufferScreenRect.height));
+ if (mWaylandBuffer->IsMatchingSize(mWidgetRect.width, mWidgetRect.height)) {
+ LOGWAYLAND((" Size is ok, use the buffer [%d x %d]\n", mWidgetRect.width,
+ mWidgetRect.height));
return mWaylandBuffer;
}
@@ -697,7 +692,7 @@ WindowBackBuffer* WindowSurfaceWayland::
LOGWAYLAND(
("WindowSurfaceWayland::GetWaylandBufferWithSwitch [%p] Requested buffer "
"[%d x %d]\n",
- (void*)this, mBufferScreenRect.width, mBufferScreenRect.height));
+ (void*)this, mWidgetRect.width, mWidgetRect.height));
// There's no buffer created yet or actual buffer is attached, get a new one.
// Use DMABuf for fullscreen updates only.
@@ -706,18 +701,21 @@ WindowBackBuffer* WindowSurfaceWayland::
}
// Reuse existing buffer
- LOGWAYLAND((" Reuse buffer with resize [%d x %d]\n",
- mBufferScreenRect.width, mBufferScreenRect.height));
+ LOGWAYLAND((" Reuse buffer with resize [%d x %d]\n", mWidgetRect.width,
+ mWidgetRect.height));
// OOM here, just return null to skip this frame.
- if (!mWaylandBuffer->Resize(mBufferScreenRect.width,
- mBufferScreenRect.height)) {
+ if (!mWaylandBuffer->Resize(mWidgetRect.width, mWidgetRect.height)) {
return nullptr;
}
return mWaylandBuffer;
}
already_AddRefed<gfx::DrawTarget> WindowSurfaceWayland::LockWaylandBuffer() {
+ // Allocated wayland buffer must match widget size, otherwise wayland
+ // compositor is confused and may produce various rendering artifacts.
+ mWidgetRect = mWindow->GetMozContainerSize();
+
// mCanSwitchWaylandBuffer set means we're getting buffer for fullscreen
// update. We can use DMABuf and we can get a new buffer for drawing.
WindowBackBuffer* buffer = mCanSwitchWaylandBuffer
@@ -858,12 +856,12 @@ already_AddRefed<gfx::DrawTarget> Window
LOGWAYLAND((" windowRedraw = %d\n", windowRedraw));
#if MOZ_LOGGING
- if (!(mBufferScreenRect == lockedScreenRect)) {
+ if (!(mLockedScreenRect == lockedScreenRect)) {
LOGWAYLAND((" screen size changed\n"));
}
#endif
- if (!(mBufferScreenRect == lockedScreenRect)) {
+ if (!(mLockedScreenRect == lockedScreenRect)) {
// Screen (window) size changed and we still have some painting pending
// for the last window size. That can happen when window is resized.
// We can't commit them any more as they're for former window size, so
@@ -878,17 +876,21 @@ already_AddRefed<gfx::DrawTarget> Window
// as it produces artifacts.
return nullptr;
}
- mBufferScreenRect = lockedScreenRect;
+ mLockedScreenRect = lockedScreenRect;
}
- if (mRenderingCacheMode == CACHE_ALL) {
- mDrawToWaylandBufferDirectly = windowRedraw;
- } else if (mRenderingCacheMode == CACHE_MISSING) {
+ LayoutDeviceIntRect size = mWindow->GetMozContainerSize();
+
+ // We can draw directly only when widget has the same size as wl_buffer
+ mDrawToWaylandBufferDirectly = (size.width == mLockedScreenRect.width &&
+ size.height == mLockedScreenRect.height);
+
+ // We can draw directly only when we redraw significant part of the window
+ // to avoid flickering.
+ if (mDrawToWaylandBufferDirectly) {
mDrawToWaylandBufferDirectly =
windowRedraw || (lockSize.width * 3 > lockedScreenRect.width &&
lockSize.height * 3 > lockedScreenRect.height);
- } else {
- mDrawToWaylandBufferDirectly = true;
}
if (mDrawToWaylandBufferDirectly) {
@@ -903,11 +905,6 @@ already_AddRefed<gfx::DrawTarget> Window
}
}
- // Any caching is disabled and we don't have any back buffer available.
- if (mRenderingCacheMode == CACHE_NONE) {
- return nullptr;
- }
-
// We do indirect drawing because there isn't any front buffer available.
// Do indirect drawing to mImageSurface which is commited to wayland
// wl_buffer by DrawDelayedImageCommits() later.
@@ -1151,7 +1148,7 @@ void WindowSurfaceWayland::Commit(const
("WindowSurfaceWayland::Commit [%p] damage size [%d, %d] -> [%d x %d]"
"screenSize [%d x %d]\n",
(void*)this, lockSize.x, lockSize.y, lockSize.width, lockSize.height,
- mBufferScreenRect.width, mBufferScreenRect.height));
+ mLockedScreenRect.width, mLockedScreenRect.height));
LOGWAYLAND((" mDrawToWaylandBufferDirectly = %d\n",
mDrawToWaylandBufferDirectly));
}
diff -up firefox-74.0/widget/gtk/WindowSurfaceWayland.h.mozilla-1623060 firefox-74.0/widget/gtk/WindowSurfaceWayland.h
--- firefox-74.0/widget/gtk/WindowSurfaceWayland.h.mozilla-1623060 2020-03-09 14:10:18.000000000 +0100
+++ firefox-74.0/widget/gtk/WindowSurfaceWayland.h 2020-03-17 14:19:04.394231493 +0100
@@ -261,8 +261,14 @@ class WindowSurfaceWayland : public Wind
nsWindow* mWindow;
// Buffer screen rects helps us understand if we operate on
// the same window size as we're called on WindowSurfaceWayland::Lock().
- // mBufferScreenRect is window size when our wayland buffer was allocated.
- LayoutDeviceIntRect mBufferScreenRect;
+ // mLockedScreenRect is window size when our wayland buffer was allocated.
+ LayoutDeviceIntRect mLockedScreenRect;
+
+ // WidgetRect is an actual size of mozcontainer widget. It can be
+ // different than mLockedScreenRect during resize when mBounds are updated
+ // immediately but actual GtkWidget size is updated asynchronously
+ // (see Bug 1489463).
+ LayoutDeviceIntRect mWidgetRect;
nsWaylandDisplay* mWaylandDisplay;
// Actual buffer (backed by wl_buffer) where all drawings go into.
@@ -327,9 +333,6 @@ class WindowSurfaceWayland : public Wind
bool mIsMainThread;
- // Image caching strategy, see RenderingCacheMode for details.
- RenderingCacheMode mRenderingCacheMode;
-
static bool UseDMABufBackend();
static bool mUseDMABufInitialized;
static bool mUseDMABuf;