summaryrefslogtreecommitdiff
path: root/mozilla-1467128.patch
diff options
context:
space:
mode:
Diffstat (limited to 'mozilla-1467128.patch')
-rw-r--r--mozilla-1467128.patch352
1 files changed, 0 insertions, 352 deletions
diff --git a/mozilla-1467128.patch b/mozilla-1467128.patch
deleted file mode 100644
index d50b2e2..0000000
--- a/mozilla-1467128.patch
+++ /dev/null
@@ -1,352 +0,0 @@
-
-# HG changeset patch
-# User Martin Stransky <stransky@redhat.com>
-# Date 1530270941 -7200
-# Node ID 338c0093263be6440a33b79a92801bd2b4658f79
-# Parent 84a6d5a0b551f5da116aab702dd38bb725bc8a08
-Bug 1467128 - [Wayland] Get VSync from Gtk/Wayland, r?lsalzman
-
-VSync on Wayland is a bit tricky as we can get only "last VSync" event signal with
-CLOCK_MONOTONIC timestamp or none (if application is hidden/minimized).
-
-That means we should draw a next frame at "last Vsync + frame delay" time and also
-approximate next VSync event when we don't get any.
-
-MozReview-Commit-ID: FI3Z4nkmDNK
-
-diff --git a/gfx/thebes/gfxPlatformGtk.cpp b/gfx/thebes/gfxPlatformGtk.cpp
---- a/gfx/thebes/gfxPlatformGtk.cpp
-+++ b/gfx/thebes/gfxPlatformGtk.cpp
-@@ -46,16 +46,20 @@
- #include "GLContextGLX.h"
- #include "GLXLibrary.h"
-
- /* Undefine the Status from Xlib since it will conflict with system headers on OSX */
- #if defined(__APPLE__) && defined(Status)
- #undef Status
- #endif
-
-+#ifdef MOZ_WAYLAND
-+#include <gdk/gdkwayland.h>
-+#endif
-+
- #endif /* MOZ_X11 */
-
- #include <fontconfig/fontconfig.h>
-
- #include "nsMathUtils.h"
-
- #define GDK_PIXMAP_SIZE_MAX 32767
-
-@@ -89,16 +93,22 @@ gfxPlatformGtk::gfxPlatformGtk()
- #ifdef MOZ_X11
- if (gfxPlatform::IsHeadless() && GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
- mCompositorDisplay = XOpenDisplay(nullptr);
- MOZ_ASSERT(mCompositorDisplay, "Failed to create compositor display!");
- } else {
- mCompositorDisplay = nullptr;
- }
- #endif // MOZ_X11
-+#ifdef MOZ_WAYLAND
-+ // Wayland compositors use g_get_monotonic_time() to get timestamps.
-+ mWaylandLastVsyncTimestamp = (g_get_monotonic_time() / 1000);
-+ // Set default display fps to 60
-+ mWaylandFrameDelay = 1000/60;
-+#endif
- }
-
- gfxPlatformGtk::~gfxPlatformGtk()
- {
- #ifdef MOZ_X11
- if (mCompositorDisplay) {
- XCloseDisplay(mCompositorDisplay);
- }
-@@ -505,26 +515,26 @@ gfxPlatformGtk::CheckVariationFontSuppor
- // until at least 2.7.1.
- FT_Int major, minor, patch;
- FT_Library_Version(GetFTLibrary(), &major, &minor, &patch);
- return major * 1000000 + minor * 1000 + patch >= 2007001;
- }
-
- #ifdef MOZ_X11
-
--class GLXVsyncSource final : public VsyncSource
-+class GtkVsyncSource final : public VsyncSource
- {
- public:
-- GLXVsyncSource()
-+ GtkVsyncSource()
- {
- MOZ_ASSERT(NS_IsMainThread());
- mGlobalDisplay = new GLXDisplay();
- }
-
-- virtual ~GLXVsyncSource()
-+ virtual ~GtkVsyncSource()
- {
- MOZ_ASSERT(NS_IsMainThread());
- }
-
- virtual Display& GetGlobalDisplay() override
- {
- return *mGlobalDisplay;
- }
-@@ -536,39 +546,52 @@ public:
- public:
- GLXDisplay() : mGLContext(nullptr)
- , mXDisplay(nullptr)
- , mSetupLock("GLXVsyncSetupLock")
- , mVsyncThread("GLXVsyncThread")
- , mVsyncTask(nullptr)
- , mVsyncEnabledLock("GLXVsyncEnabledLock")
- , mVsyncEnabled(false)
-+#ifdef MOZ_WAYLAND
-+ , mIsWaylandDisplay(false)
-+#endif
- {
- }
-
- // Sets up the display's GL context on a worker thread.
- // Required as GLContexts may only be used by the creating thread.
- // Returns true if setup was a success.
- bool Setup()
- {
- MonitorAutoLock lock(mSetupLock);
- MOZ_ASSERT(NS_IsMainThread());
- if (!mVsyncThread.Start())
- return false;
-
- RefPtr<Runnable> vsyncSetup =
-- NewRunnableMethod("GLXVsyncSource::GLXDisplay::SetupGLContext",
-+ NewRunnableMethod("GtkVsyncSource::GLXDisplay::SetupGLContext",
- this,
- &GLXDisplay::SetupGLContext);
- mVsyncThread.message_loop()->PostTask(vsyncSetup.forget());
- // Wait until the setup has completed.
- lock.Wait();
- return mGLContext != nullptr;
- }
-
-+#ifdef MOZ_WAYLAND
-+ bool SetupWayland()
-+ {
-+ MonitorAutoLock lock(mSetupLock);
-+ MOZ_ASSERT(NS_IsMainThread());
-+ mIsWaylandDisplay = true;
-+ return mVsyncThread.Start();
-+ }
-+#endif
-+
- // Called on the Vsync thread to setup the GL context.
- void SetupGLContext()
- {
- MonitorAutoLock lock(mSetupLock);
- MOZ_ASSERT(!NS_IsMainThread());
- MOZ_ASSERT(!mGLContext, "GLContext already setup!");
-
- // Create video sync timer on a separate Display to prevent locking the
-@@ -613,29 +636,35 @@ public:
- }
-
- lock.NotifyAll();
- }
-
- virtual void EnableVsync() override
- {
- MOZ_ASSERT(NS_IsMainThread());
-+#if !defined(MOZ_WAYLAND)
- MOZ_ASSERT(mGLContext, "GLContext not setup!");
-+#endif
-
- MonitorAutoLock lock(mVsyncEnabledLock);
- if (mVsyncEnabled) {
- return;
- }
- mVsyncEnabled = true;
-
- // If the task has not nulled itself out, it hasn't yet realized
- // that vsync was disabled earlier, so continue its execution.
- if (!mVsyncTask) {
- mVsyncTask = NewRunnableMethod(
-- "GLXVsyncSource::GLXDisplay::RunVsync", this, &GLXDisplay::RunVsync);
-+ "GtkVsyncSource::GLXDisplay::RunVsync", this,
-+#if defined(MOZ_WAYLAND)
-+ mIsWaylandDisplay ? &GLXDisplay::RunVsyncWayland :
-+#endif
-+ &GLXDisplay::RunVsync);
- RefPtr<Runnable> addrefedTask = mVsyncTask;
- mVsyncThread.message_loop()->PostTask(addrefedTask.forget());
- }
- }
-
- virtual void DisableVsync() override
- {
- MonitorAutoLock lock(mVsyncEnabledLock);
-@@ -650,17 +679,17 @@ public:
-
- virtual void Shutdown() override
- {
- MOZ_ASSERT(NS_IsMainThread());
- DisableVsync();
-
- // Cleanup thread-specific resources before shutting down.
- RefPtr<Runnable> shutdownTask = NewRunnableMethod(
-- "GLXVsyncSource::GLXDisplay::Cleanup", this, &GLXDisplay::Cleanup);
-+ "GtkVsyncSource::GLXDisplay::Cleanup", this, &GLXDisplay::Cleanup);
- mVsyncThread.message_loop()->PostTask(shutdownTask.forget());
-
- // Stop, waiting for the cleanup task to finish execution.
- mVsyncThread.Stop();
- }
-
- private:
- virtual ~GLXDisplay()
-@@ -709,50 +738,96 @@ public:
- }
- }
-
- lastVsync = TimeStamp::Now();
- NotifyVsync(lastVsync);
- }
- }
-
-+#ifdef MOZ_WAYLAND
-+ /* VSync on Wayland is tricky as we can get only "last VSync" event signal.
-+ * That means we should draw next frame at "last Vsync + frame delay" time.
-+ */
-+ void RunVsyncWayland()
-+ {
-+ MOZ_ASSERT(!NS_IsMainThread());
-+
-+ for (;;) {
-+ {
-+ MonitorAutoLock lock(mVsyncEnabledLock);
-+ if (!mVsyncEnabled) {
-+ mVsyncTask = nullptr;
-+ return;
-+ }
-+ }
-+
-+ gint64 lastVsync = gfxPlatformGtk::GetPlatform()->GetWaylandLastVsync();
-+ gint64 currTime = (g_get_monotonic_time() / 1000);
-+
-+ gint64 remaining = gfxPlatformGtk::GetPlatform()->GetWaylandFrameDelay() -
-+ (currTime - lastVsync);
-+ if (remaining > 0) {
-+ PlatformThread::Sleep(remaining);
-+ } else {
-+ // Time from last HW Vsync is longer than our frame delay,
-+ // use our approximation then.
-+ gfxPlatformGtk::GetPlatform()->SetWaylandLastVsync(currTime);
-+ }
-+
-+ NotifyVsync(TimeStamp::Now());
-+ }
-+ }
-+#endif
-+
- void Cleanup() {
- MOZ_ASSERT(!NS_IsMainThread());
-
- mGLContext = nullptr;
-- XCloseDisplay(mXDisplay);
-+ if (mXDisplay)
-+ XCloseDisplay(mXDisplay);
- }
-
- // Owned by the vsync thread.
- RefPtr<gl::GLContextGLX> mGLContext;
- _XDisplay* mXDisplay;
- Monitor mSetupLock;
- base::Thread mVsyncThread;
- RefPtr<Runnable> mVsyncTask;
- Monitor mVsyncEnabledLock;
- bool mVsyncEnabled;
-+#ifdef MOZ_WAYLAND
-+ bool mIsWaylandDisplay;
-+#endif
- };
- private:
- // We need a refcounted VsyncSource::Display to use chromium IPC runnables.
- RefPtr<GLXDisplay> mGlobalDisplay;
- };
-
- already_AddRefed<gfx::VsyncSource>
- gfxPlatformGtk::CreateHardwareVsyncSource()
- {
-+#ifdef MOZ_WAYLAND
-+ if (GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default())) {
-+ RefPtr<VsyncSource> vsyncSource = new GtkVsyncSource();
-+ VsyncSource::Display& display = vsyncSource->GetGlobalDisplay();
-+ static_cast<GtkVsyncSource::GLXDisplay&>(display).SetupWayland();
-+ return vsyncSource.forget();
-+ }
-+#endif
-+
- // Only use GLX vsync when the OpenGL compositor is being used.
- // The extra cost of initializing a GLX context while blocking the main
- // thread is not worth it when using basic composition.
-- // Also don't use it on non-X11 displays.
- if (gfxConfig::IsEnabled(Feature::HW_COMPOSITING)) {
-- if (GDK_IS_X11_DISPLAY(gdk_display_get_default()) &&
-- gl::sGLXLibrary.SupportsVideoSync()) {
-- RefPtr<VsyncSource> vsyncSource = new GLXVsyncSource();
-+ if (gl::sGLXLibrary.SupportsVideoSync()) {
-+ RefPtr<VsyncSource> vsyncSource = new GtkVsyncSource();
- VsyncSource::Display& display = vsyncSource->GetGlobalDisplay();
-- if (!static_cast<GLXVsyncSource::GLXDisplay&>(display).Setup()) {
-+ if (!static_cast<GtkVsyncSource::GLXDisplay&>(display).Setup()) {
- NS_WARNING("Failed to setup GLContext, falling back to software vsync.");
- return gfxPlatform::CreateHardwareVsyncSource();
- }
- return vsyncSource.forget();
- }
- NS_WARNING("SGI_video_sync unsupported. Falling back to software vsync.");
- }
- return gfxPlatform::CreateHardwareVsyncSource();
-diff --git a/gfx/thebes/gfxPlatformGtk.h b/gfx/thebes/gfxPlatformGtk.h
---- a/gfx/thebes/gfxPlatformGtk.h
-+++ b/gfx/thebes/gfxPlatformGtk.h
-@@ -102,23 +102,42 @@ public:
- #endif
-
- #ifdef MOZ_X11
- Display* GetCompositorDisplay() {
- return mCompositorDisplay;
- }
- #endif // MOZ_X11
-
-+#ifdef MOZ_WAYLAND
-+ void SetWaylandLastVsync(uint32_t aVsyncTimestamp) {
-+ mWaylandLastVsyncTimestamp = aVsyncTimestamp;
-+ }
-+ int64_t GetWaylandLastVsync() {
-+ return mWaylandLastVsyncTimestamp;
-+ }
-+ void SetWaylandFrameDelay(int64_t aFrameDelay) {
-+ mWaylandFrameDelay = aFrameDelay;
-+ }
-+ int64_t GetWaylandFrameDelay() {
-+ return mWaylandFrameDelay;
-+ }
-+#endif
-+
- protected:
- bool CheckVariationFontSupport() override;
-
- int8_t mMaxGenericSubstitutions;
-
- private:
- virtual void GetPlatformCMSOutputProfile(void *&mem,
- size_t &size) override;
-
- #ifdef MOZ_X11
- Display* mCompositorDisplay;
- #endif
-+#ifdef MOZ_WAYLAND
-+ int64_t mWaylandLastVsyncTimestamp;
-+ int64_t mWaylandFrameDelay;
-+#endif
- };
-
- #endif /* GFX_PLATFORM_GTK_H */
bgstack15