summarylogtreecommitdiffstats
path: root/318.patch
diff options
context:
space:
mode:
Diffstat (limited to '318.patch')
-rw-r--r--318.patch420
1 files changed, 0 insertions, 420 deletions
diff --git a/318.patch b/318.patch
deleted file mode 100644
index b59866f07a51..000000000000
--- a/318.patch
+++ /dev/null
@@ -1,420 +0,0 @@
-From d20697ff5972b363679597372d1a98ff3074085c Mon Sep 17 00:00:00 2001
-From: Daniel van Vugt <daniel.van.vugt@canonical.com>
-Date: Wed, 27 Jun 2018 17:19:27 +0800
-Subject: [PATCH 1/2] renderer-native: Add hardware presentation timing
-
-Add support for getting hardware presentation times from KMS (Wayland
-sessions). Also implement cogl_get_clock_time which is required to compare
-and judge the age of presentation timestamps.
-
-For single monitor systems this is straightforward. For multi-monitor
-systems though we have to choose a display to sync to. The compositor
-already partially solves this for us in the case of only one display
-updating because it will only use the subset of monitors that are
-changing. In the case of multiple monitors consuming the same frame
-concurrently however, we choose the fastest one (in use at the time).
-Note however that we also need !73 to land in order to fully realize
-multiple monitors running at full speed.
----
- src/Makefile.am | 25 +++++++-
- src/backends/native/meta-gpu-kms.c | 69 ++++++++++++++++++++--
- src/backends/native/meta-gpu-kms.h | 3 +
- src/backends/native/meta-renderer-native.c | 38 +++++++++++-
- src/meta-marshal.list | 1 +
- 5 files changed, 128 insertions(+), 8 deletions(-)
- create mode 100644 src/meta-marshal.list
-
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 811e2b86b..56d539836 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -51,6 +51,8 @@ mutter_built_sources = \
- $(dbus_login1_built_sources) \
- meta/meta-enum-types.h \
- meta-enum-types.c \
-+ meta-marshal.c \
-+ meta-marshal.h \
- $(NULL)
-
- if HAVE_REMOTE_DESKTOP
-@@ -677,6 +679,7 @@ EXTRA_DIST += \
- libmutter.pc.in \
- meta-enum-types.h.in \
- meta-enum-types.c.in \
-+ meta-marshal.list \
- org.freedesktop.login1.xml \
- org.gnome.Mutter.DisplayConfig.xml \
- org.gnome.Mutter.IdleMonitor.xml \
-@@ -690,7 +693,10 @@ BUILT_SOURCES = \
- $(libmutterinclude_built_headers)
-
- MUTTER_STAMP_FILES = stamp-meta-enum-types.h
--CLEANFILES += $(MUTTER_STAMP_FILES)
-+CLEANFILES += \
-+ $(MUTTER_STAMP_FILES) \
-+ meta-marshal.c \
-+ meta-marshal.h
-
- meta/meta-enum-types.h: stamp-meta-enum-types.h Makefile
- @true
-@@ -786,3 +792,20 @@ endef
- $(AM_V_GEN)$(WAYLAND_SCANNER) server-header $< $@
- %-server-protocol.h : $(WAYLAND_EGLSTREAM_DATADIR)/%.xml
- $(AM_V_GEN)$(WAYLAND_SCANNER) server-header $< $@
-+
-+meta_marshal_opts = --prefix=meta_marshal --internal
-+
-+meta-marshal.h: meta-marshal.list
-+ $(AM_V_GEN)$(GLIB_GENMARSHAL) \
-+ --header \
-+ $(meta_marshal_opts) \
-+ --output=$@ \
-+ $<
-+
-+meta-marshal.c: meta-marshal.list meta-marshal.h
-+ $(AM_V_GEN)$(GLIB_GENMARSHAL) \
-+ --include-header=meta-marshal.h \
-+ $(meta_marshal_opts) \
-+ --body \
-+ --output=$@ \
-+ $<
-diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
-index c3c5d0d68..26c759031 100644
---- a/src/backends/native/meta-gpu-kms.c
-+++ b/src/backends/native/meta-gpu-kms.c
-@@ -27,6 +27,7 @@
- #include <errno.h>
- #include <poll.h>
- #include <string.h>
-+#include <time.h>
- #include <xf86drm.h>
- #include <xf86drmMode.h>
-
-@@ -51,6 +52,7 @@ typedef struct _MetaGpuKmsFlipClosureContainer
- {
- GClosure *flip_closure;
- MetaGpuKms *gpu_kms;
-+ MetaCrtc *crtc;
- } MetaGpuKmsFlipClosureContainer;
-
- struct _MetaGpuKms
-@@ -61,6 +63,8 @@ struct _MetaGpuKms
- char *file_path;
- GSource *source;
-
-+ clockid_t clock_id;
-+
- drmModeConnector **connectors;
- unsigned int n_connectors;
-
-@@ -165,18 +169,26 @@ meta_gpu_kms_apply_crtc_mode (MetaGpuKms *gpu_kms,
-
- static void
- invoke_flip_closure (GClosure *flip_closure,
-- MetaGpuKms *gpu_kms)
-+ MetaGpuKms *gpu_kms,
-+ MetaCrtc *crtc,
-+ int64_t page_flip_time_ns)
- {
- GValue params[] = {
- G_VALUE_INIT,
-- G_VALUE_INIT
-+ G_VALUE_INIT,
-+ G_VALUE_INIT,
-+ G_VALUE_INIT,
- };
-
- g_value_init (&params[0], G_TYPE_POINTER);
- g_value_set_pointer (&params[0], flip_closure);
- g_value_init (&params[1], G_TYPE_OBJECT);
- g_value_set_object (&params[1], gpu_kms);
-- g_closure_invoke (flip_closure, NULL, 2, params, NULL);
-+ g_value_init (&params[2], G_TYPE_OBJECT);
-+ g_value_set_object (&params[2], crtc);
-+ g_value_init (&params[3], G_TYPE_INT64);
-+ g_value_set_int64 (&params[3], page_flip_time_ns);
-+ g_closure_invoke (flip_closure, NULL, 4, params, NULL);
- g_closure_unref (flip_closure);
- }
-
-@@ -216,6 +228,7 @@ meta_gpu_kms_is_crtc_active (MetaGpuKms *gpu_kms,
-
- MetaGpuKmsFlipClosureContainer *
- meta_gpu_kms_wrap_flip_closure (MetaGpuKms *gpu_kms,
-+ MetaCrtc *crtc,
- GClosure *flip_closure)
- {
- MetaGpuKmsFlipClosureContainer *closure_container;
-@@ -223,7 +236,8 @@ meta_gpu_kms_wrap_flip_closure (MetaGpuKms *gpu_kms,
- closure_container = g_new0 (MetaGpuKmsFlipClosureContainer, 1);
- *closure_container = (MetaGpuKmsFlipClosureContainer) {
- .flip_closure = flip_closure,
-- .gpu_kms = gpu_kms
-+ .gpu_kms = gpu_kms,
-+ .crtc = crtc
- };
-
- return closure_container;
-@@ -263,6 +277,7 @@ meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
- int kms_fd = meta_gpu_kms_get_fd (gpu_kms);
-
- closure_container = meta_gpu_kms_wrap_flip_closure (gpu_kms,
-+ crtc,
- flip_closure);
-
- ret = drmModePageFlip (kms_fd,
-@@ -296,6 +311,23 @@ meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
- return TRUE;
- }
-
-+static int64_t
-+timespec_to_nanoseconds (const struct timespec *ts)
-+{
-+ const int64_t one_billion = 1000000000;
-+
-+ return ((int64_t) ts->tv_sec) * one_billion + ts->tv_nsec;
-+}
-+
-+static int64_t
-+timeval_to_nanoseconds (const struct timeval *tv)
-+{
-+ int64_t usec = ((int64_t) tv->tv_sec) * G_USEC_PER_SEC + tv->tv_usec;
-+ int64_t nsec = usec * 1000;
-+
-+ return nsec;
-+}
-+
- static void
- page_flip_handler (int fd,
- unsigned int frame,
-@@ -306,8 +338,12 @@ page_flip_handler (int fd,
- MetaGpuKmsFlipClosureContainer *closure_container = user_data;
- GClosure *flip_closure = closure_container->flip_closure;
- MetaGpuKms *gpu_kms = closure_container->gpu_kms;
-+ struct timeval page_flip_time = {sec, usec};
-
-- invoke_flip_closure (flip_closure, gpu_kms);
-+ invoke_flip_closure (flip_closure,
-+ gpu_kms,
-+ closure_container->crtc,
-+ timeval_to_nanoseconds (&page_flip_time));
- meta_gpu_kms_flip_closure_container_free (closure_container);
- }
-
-@@ -380,6 +416,17 @@ meta_gpu_kms_get_file_path (MetaGpuKms *gpu_kms)
- return gpu_kms->file_path;
- }
-
-+int64_t
-+meta_gpu_kms_get_current_time_ns (MetaGpuKms *gpu_kms)
-+{
-+ struct timespec ts;
-+
-+ if (clock_gettime (gpu_kms->clock_id, &ts))
-+ return 0;
-+
-+ return timespec_to_nanoseconds (&ts);
-+}
-+
- void
- meta_gpu_kms_set_power_save_mode (MetaGpuKms *gpu_kms,
- uint64_t state)
-@@ -679,6 +726,17 @@ init_crtcs (MetaGpuKms *gpu_kms,
- meta_gpu_take_crtcs (gpu, crtcs);
- }
-
-+static void
-+init_frame_clock (MetaGpuKms *gpu_kms)
-+{
-+ uint64_t uses_monotonic;
-+
-+ if (drmGetCap (gpu_kms->fd, DRM_CAP_TIMESTAMP_MONOTONIC, &uses_monotonic) != 0)
-+ uses_monotonic = 0;
-+
-+ gpu_kms->clock_id = uses_monotonic ? CLOCK_MONOTONIC : CLOCK_REALTIME;
-+}
-+
- static void
- init_outputs (MetaGpuKms *gpu_kms,
- MetaKmsResources *resources)
-@@ -806,6 +864,7 @@ meta_gpu_kms_read_current (MetaGpu *gpu,
- init_modes (gpu_kms, resources.resources);
- init_crtcs (gpu_kms, &resources);
- init_outputs (gpu_kms, &resources);
-+ init_frame_clock (gpu_kms);
-
- meta_kms_resources_release (&resources);
-
-diff --git a/src/backends/native/meta-gpu-kms.h b/src/backends/native/meta-gpu-kms.h
-index 5f77f191a..3e3f45c7e 100644
---- a/src/backends/native/meta-gpu-kms.h
-+++ b/src/backends/native/meta-gpu-kms.h
-@@ -73,6 +73,8 @@ int meta_gpu_kms_get_fd (MetaGpuKms *gpu_kms);
-
- const char * meta_gpu_kms_get_file_path (MetaGpuKms *gpu_kms);
-
-+int64_t meta_gpu_kms_get_current_time_ns (MetaGpuKms *gpu_kms);
-+
- void meta_gpu_kms_get_max_buffer_size (MetaGpuKms *gpu_kms,
- int *max_width,
- int *max_height);
-@@ -89,6 +91,7 @@ gboolean meta_drm_mode_equal (const drmModeModeInfo *one,
- float meta_calculate_drm_mode_refresh_rate (const drmModeModeInfo *mode);
-
- MetaGpuKmsFlipClosureContainer * meta_gpu_kms_wrap_flip_closure (MetaGpuKms *gpu_kms,
-+ MetaCrtc *crtc,
- GClosure *flip_closure);
-
- void meta_gpu_kms_flip_closure_container_free (MetaGpuKmsFlipClosureContainer *closure_container);
-diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
-index f58e6b3e0..b192c3641 100644
---- a/src/backends/native/meta-renderer-native.c
-+++ b/src/backends/native/meta-renderer-native.c
-@@ -62,6 +62,7 @@
- #include "backends/native/meta-monitor-manager-kms.h"
- #include "backends/native/meta-renderer-native.h"
- #include "backends/native/meta-renderer-native-gles3.h"
-+#include "meta-marshal.h"
- #include "cogl/cogl.h"
- #include "core/boxes-private.h"
-
-@@ -1159,6 +1160,8 @@ meta_onscreen_native_swap_drm_fb (CoglOnscreen *onscreen)
- static void
- on_crtc_flipped (GClosure *closure,
- MetaGpuKms *gpu_kms,
-+ MetaCrtc *crtc,
-+ int64_t page_flip_time_ns,
- MetaRendererView *view)
- {
- ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (view);
-@@ -1169,6 +1172,24 @@ on_crtc_flipped (GClosure *closure,
- MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
- MetaRendererNative *renderer_native = onscreen_native->renderer_native;
- MetaGpuKms *render_gpu = onscreen_native->render_gpu;
-+ CoglFrameInfo *frame_info;
-+ float refresh_rate;
-+
-+ frame_info = g_queue_peek_tail (&onscreen->pending_frame_infos);
-+ refresh_rate = crtc && crtc->current_mode ?
-+ crtc->current_mode->refresh_rate :
-+ 0.0f;
-+
-+ /* Only keep the frame info for the fastest CRTC in use, which may not be
-+ * the first one to complete a flip. By only telling the compositor about the
-+ * fastest monitor(s) we direct it to produce new frames fast enough to
-+ * satisfy all monitors.
-+ */
-+ if (refresh_rate >= frame_info->refresh_rate)
-+ {
-+ frame_info->presentation_time = page_flip_time_ns;
-+ frame_info->refresh_rate = refresh_rate;
-+ }
-
- if (gpu_kms != render_gpu)
- {
-@@ -1299,7 +1320,9 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native,
- return FALSE;
-
- closure_container =
-- meta_gpu_kms_wrap_flip_closure (onscreen_native->render_gpu, flip_closure);
-+ meta_gpu_kms_wrap_flip_closure (onscreen_native->render_gpu,
-+ NULL,
-+ flip_closure);
-
- acquire_attribs = (EGLAttrib[]) {
- EGL_DRM_FLIP_EVENT_DATA_NV,
-@@ -1542,7 +1565,7 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen)
- flip_closure = g_cclosure_new (G_CALLBACK (on_crtc_flipped),
- g_object_ref (view),
- (GClosureNotify) flip_closure_destroyed);
-- g_closure_set_marshal (flip_closure, g_cclosure_marshal_VOID__OBJECT);
-+ g_closure_set_marshal (flip_closure, meta_marshal_VOID__OBJECT_OBJECT_INT64);
-
- /* Either flip the CRTC's of the monitor info, if we are drawing just part
- * of the stage, or all of the CRTC's if we are drawing the whole stage.
-@@ -2687,6 +2710,15 @@ meta_renderer_native_create_offscreen (MetaRendererNative *renderer,
- return fb;
- }
-
-+static int64_t
-+meta_renderer_native_get_clock_time (CoglContext *context)
-+{
-+ CoglRenderer *cogl_renderer = cogl_context_get_renderer (context);
-+ MetaGpuKms *gpu_kms = cogl_renderer->custom_winsys_user_data;
-+
-+ return meta_gpu_kms_get_current_time_ns (gpu_kms);
-+}
-+
- static const CoglWinsysVtable *
- get_native_cogl_winsys_vtable (CoglRenderer *cogl_renderer)
- {
-@@ -2715,6 +2747,8 @@ get_native_cogl_winsys_vtable (CoglRenderer *cogl_renderer)
- vtable.onscreen_swap_buffers_with_damage =
- meta_onscreen_native_swap_buffers_with_damage;
-
-+ vtable.context_get_clock_time = meta_renderer_native_get_clock_time;
-+
- vtable_inited = TRUE;
- }
-
-diff --git a/src/meta-marshal.list b/src/meta-marshal.list
-new file mode 100644
-index 000000000..c1f4781d2
---- /dev/null
-+++ b/src/meta-marshal.list
-@@ -0,0 +1 @@
-+VOID:OBJECT,OBJECT,INT64
---
-2.18.1
-
-
-From 1b3109809167c17bfa8713ce906c95e66d2c042f Mon Sep 17 00:00:00 2001
-From: Daniel van Vugt <daniel.van.vugt@canonical.com>
-Date: Tue, 10 Jul 2018 17:46:02 +0800
-Subject: [PATCH 2/2] renderer-native: Advertise _FEATURE_SWAP_THROTTLE
-
-Because it is implemented and always on. By advertising this fact
-the master clock is able to sync to the native refresh rate instead
-of always using the fallback of 60.00Hz.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=781296
----
- src/backends/native/meta-renderer-native.c | 15 +++++++++++++--
- 1 file changed, 13 insertions(+), 2 deletions(-)
-
-diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
-index b192c3641..929e9ca90 100644
---- a/src/backends/native/meta-renderer-native.c
-+++ b/src/backends/native/meta-renderer-native.c
-@@ -2005,6 +2005,13 @@ meta_renderer_native_init_egl_context (CoglContext *cogl_context,
- COGL_WINSYS_FEATURE_MULTIPLE_ONSCREEN,
- TRUE);
-
-+ /* COGL_WINSYS_FEATURE_SWAP_THROTTLE is always true for this renderer
-+ * because we have the call to wait_for_pending_flips on every frame.
-+ */
-+ COGL_FLAGS_SET (cogl_context->winsys_features,
-+ COGL_WINSYS_FEATURE_SWAP_THROTTLE,
-+ TRUE);
-+
- #ifdef HAVE_EGL_DEVICE
- if (renderer_gpu_data->mode == META_RENDERER_NATIVE_MODE_EGL_DEVICE)
- COGL_FLAGS_SET (cogl_context->features,
-@@ -2639,8 +2646,12 @@ meta_renderer_native_create_onscreen (MetaRendererNative *renderer_native,
- }
-
- onscreen = cogl_onscreen_new (context, width, height);
-- cogl_onscreen_set_swap_throttled (onscreen,
-- _clutter_get_sync_to_vblank ());
-+
-+ /* We have wait_for_pending_flips hardcoded, so throttling always. */
-+ cogl_onscreen_set_swap_throttled (onscreen, TRUE);
-+ if (!_clutter_get_sync_to_vblank ())
-+ g_warning ("Request to disable sync-to-vblank is being ignored. "
-+ "MetaRendererNative does not support disabling it.");
-
- if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (onscreen), error))
- {
---
-2.18.1
-