summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2014-04-23 22:12:52 -0700
committerNeil Roberts <neil@linux.intel.com>2014-04-30 16:51:18 +0100
commit309bf866ca83664fe8b74f43d55ab7c83110b417 (patch)
tree359b8f3843fd4cd9317277c583a7b96cd1626e01
parente3e516612dcce10b949370bf82a6d821ea8f6d20 (diff)
downloadcogl-309bf866ca83664fe8b74f43d55ab7c83110b417.tar.gz
cogl-winsys-egl-kms: Call swap notify handler even when pageflip ioctl fails
This can happen when we dpms off the output or when login1 takes away drm master status from our drm fd. In either case, we need to call the swap notify handler so that the compositor dosn't get stuck waiting for that notification. The compositor should stop repainting shortly in both cases, as it's either going into dpms off mode or vt switching away. https://bugzilla.gnome.org/show_bug.cgi?id=728979 Reviewed-by: Neil Roberts <neil@linux.intel.com> (cherry picked from commit 22378d572b039e4fe6ceb56e56492470bb461d48)
-rw-r--r--cogl/winsys/cogl-winsys-egl-kms.c41
1 files changed, 28 insertions, 13 deletions
diff --git a/cogl/winsys/cogl-winsys-egl-kms.c b/cogl/winsys/cogl-winsys-egl-kms.c
index acd0d0ce..6d498d4a 100644
--- a/cogl/winsys/cogl-winsys-egl-kms.c
+++ b/cogl/winsys/cogl-winsys-egl-kms.c
@@ -196,6 +196,31 @@ free_current_bo (CoglOnscreen *onscreen)
}
static void
+queue_swap_notify_for_onscreen (CoglOnscreen *onscreen)
+{
+ CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
+ CoglOnscreenKMS *kms_onscreen = egl_onscreen->platform;
+ CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context;
+ CoglRenderer *renderer = context->display->renderer;
+ CoglRendererEGL *egl_renderer = renderer->winsys;
+ CoglRendererKMS *kms_renderer = egl_renderer->platform;
+
+ /* We only want to notify that the swap is complete when the
+ * application calls cogl_context_dispatch so instead of
+ * immediately notifying we queue an idle callback */
+ if (!kms_renderer->swap_notify_idle)
+ {
+ kms_renderer->swap_notify_idle =
+ _cogl_poll_renderer_add_idle (renderer,
+ flush_pending_swap_notify_idle,
+ context,
+ NULL);
+ }
+
+ kms_onscreen->pending_swap_notify = TRUE;
+}
+
+static void
page_flip_handler (int fd,
unsigned int frame,
unsigned int sec,
@@ -217,19 +242,7 @@ page_flip_handler (int fd,
CoglRendererEGL *egl_renderer = renderer->winsys;
CoglRendererKMS *kms_renderer = egl_renderer->platform;
- /* We only want to notify that the swap is complete when the
- * application calls cogl_context_dispatch so instead of
- * immediately notifying we queue an idle callback */
- if (!kms_renderer->swap_notify_idle)
- {
- kms_renderer->swap_notify_idle =
- _cogl_poll_renderer_add_idle (renderer,
- flush_pending_swap_notify_idle,
- context,
- NULL);
- }
-
- kms_onscreen->pending_swap_notify = TRUE;
+ queue_swap_notify_for_onscreen (onscreen);
free_current_bo (onscreen);
@@ -903,6 +916,8 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
kms_onscreen->next_fb_id = 0;
g_slice_free (CoglFlipKMS, flip);
flip = NULL;
+
+ queue_swap_notify_for_onscreen (onscreen);
}
else
{