2020-04-06 21:07:31 +00:00
|
|
|
diff -up firefox-75.0/modules/libpref/init/StaticPrefList.yaml.mozilla-1623060 firefox-75.0/modules/libpref/init/StaticPrefList.yaml
|
|
|
|
--- firefox-75.0/modules/libpref/init/StaticPrefList.yaml.mozilla-1623060 2020-04-03 21:34:57.000000000 +0200
|
|
|
|
+++ firefox-75.0/modules/libpref/init/StaticPrefList.yaml 2020-04-06 23:03:37.631884410 +0200
|
|
|
|
@@ -8600,15 +8600,6 @@
|
|
|
|
type: RelaxedAtomicBool
|
|
|
|
value: false
|
|
|
|
mirror: always
|
|
|
|
-
|
|
|
|
-# Wayland basic (non-accelerated) compositor cache mode.
|
|
|
|
-# 0 = Default (everything is cached).
|
|
|
|
-# 1 = Cache only missing drawing.
|
|
|
|
-# 2 = No cache
|
|
|
|
-- name: widget.wayland-cache-mode
|
|
|
|
- type: RelaxedAtomicInt32
|
|
|
|
- value: 0
|
|
|
|
- mirror: always
|
|
|
|
#endif
|
2020-03-17 20:28:53 +00:00
|
|
|
|
2020-04-06 21:07:31 +00:00
|
|
|
#---------------------------------------------------------------------------
|
|
|
|
diff -up firefox-75.0/widget/gtk/nsWaylandDisplay.cpp.mozilla-1623060 firefox-75.0/widget/gtk/nsWaylandDisplay.cpp
|
|
|
|
--- firefox-75.0/widget/gtk/nsWaylandDisplay.cpp.mozilla-1623060 2020-04-03 21:35:43.000000000 +0200
|
|
|
|
+++ firefox-75.0/widget/gtk/nsWaylandDisplay.cpp 2020-04-06 23:03:37.632884403 +0200
|
|
|
|
@@ -523,9 +523,6 @@ bool nsWaylandDisplay::IsDMABufVAAPIEnab
|
|
|
|
return IsDMABufEnabled() &&
|
|
|
|
StaticPrefs::widget_wayland_dmabuf_vaapi_enabled();
|
|
|
|
}
|
|
|
|
-int nsWaylandDisplay::GetRenderingCacheModePref() {
|
|
|
|
- return StaticPrefs::widget_wayland_cache_mode();
|
|
|
|
-}
|
|
|
|
|
|
|
|
void* nsGbmLib::sGbmLibHandle = nullptr;
|
|
|
|
void* nsGbmLib::sXf86DrmLibHandle = nullptr;
|
|
|
|
diff -up firefox-75.0/widget/gtk/nsWaylandDisplay.h.mozilla-1623060 firefox-75.0/widget/gtk/nsWaylandDisplay.h
|
|
|
|
--- firefox-75.0/widget/gtk/nsWaylandDisplay.h.mozilla-1623060 2020-04-03 21:35:39.000000000 +0200
|
|
|
|
+++ firefox-75.0/widget/gtk/nsWaylandDisplay.h 2020-04-06 23:03:37.632884403 +0200
|
|
|
|
@@ -93,7 +93,6 @@ class nsWaylandDisplay {
|
2020-03-17 20:28:53 +00:00
|
|
|
static bool IsDMABufTexturesEnabled();
|
|
|
|
static bool IsDMABufWebGLEnabled();
|
2020-04-06 21:07:31 +00:00
|
|
|
static bool IsDMABufVAAPIEnabled();
|
|
|
|
- static int GetRenderingCacheModePref();
|
2020-03-17 20:28:53 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
bool ConfigureGbm();
|
2020-04-06 21:07:31 +00:00
|
|
|
diff -up firefox-75.0/widget/gtk/nsWindow.cpp.mozilla-1623060 firefox-75.0/widget/gtk/nsWindow.cpp
|
|
|
|
--- firefox-75.0/widget/gtk/nsWindow.cpp.mozilla-1623060 2020-04-06 23:03:37.627884434 +0200
|
|
|
|
+++ firefox-75.0/widget/gtk/nsWindow.cpp 2020-04-06 23:03:37.633884397 +0200
|
|
|
|
@@ -7925,3 +7925,15 @@ void nsWindow::SetEGLNativeWindowSize(
|
2020-03-17 20:28:53 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
+}
|
2020-04-06 21:07:31 +00:00
|
|
|
diff -up firefox-75.0/widget/gtk/nsWindow.h.mozilla-1623060 firefox-75.0/widget/gtk/nsWindow.h
|
|
|
|
--- firefox-75.0/widget/gtk/nsWindow.h.mozilla-1623060 2020-04-03 21:35:39.000000000 +0200
|
|
|
|
+++ firefox-75.0/widget/gtk/nsWindow.h 2020-04-06 23:03:37.632884403 +0200
|
|
|
|
@@ -293,6 +293,7 @@ class nsWindow final : public nsBaseWidg
|
2020-03-17 20:28:53 +00:00
|
|
|
int32_t aVertical) override;
|
|
|
|
|
|
|
|
MozContainer* GetMozContainer() { return mContainer; }
|
|
|
|
+ LayoutDeviceIntRect GetMozContainerSize();
|
|
|
|
// GetMozContainerWidget returns the MozContainer even for undestroyed
|
|
|
|
// descendant windows
|
|
|
|
GtkWidget* GetMozContainerWidget();
|
2020-04-06 21:07:31 +00:00
|
|
|
diff -up firefox-75.0/widget/gtk/WindowSurfaceWayland.cpp.mozilla-1623060 firefox-75.0/widget/gtk/WindowSurfaceWayland.cpp
|
|
|
|
--- firefox-75.0/widget/gtk/WindowSurfaceWayland.cpp.mozilla-1623060 2020-04-03 21:35:43.000000000 +0200
|
|
|
|
+++ firefox-75.0/widget/gtk/WindowSurfaceWayland.cpp 2020-04-06 23:03:37.632884403 +0200
|
2020-03-17 20:28:53 +00:00
|
|
|
@@ -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));
|
|
|
|
}
|
2020-04-06 21:07:31 +00:00
|
|
|
diff -up firefox-75.0/widget/gtk/WindowSurfaceWayland.h.mozilla-1623060 firefox-75.0/widget/gtk/WindowSurfaceWayland.h
|
|
|
|
--- firefox-75.0/widget/gtk/WindowSurfaceWayland.h.mozilla-1623060 2020-04-03 21:35:39.000000000 +0200
|
|
|
|
+++ firefox-75.0/widget/gtk/WindowSurfaceWayland.h 2020-04-06 23:03:37.631884410 +0200
|
2020-03-17 20:28:53 +00:00
|
|
|
@@ -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;
|