107 lines
3.0 KiB
Diff
107 lines
3.0 KiB
Diff
From 8aced2158d389d3dcb75710f92db0cee97ad397f Mon Sep 17 00:00:00 2001
|
|
From: Ray Strode <rstrode@redhat.com>
|
|
Date: Wed, 21 Oct 2015 15:47:01 -0400
|
|
Subject: [PATCH] kms-winsys: don't wait for a flip when page flipping fails
|
|
|
|
If we get EACCES from drmPageFlip we're not going to get
|
|
a flip event and shouldn't wait for one.
|
|
|
|
This commit changes the EACCES path to silently ignore the
|
|
failed flip request and just clean up the fb.
|
|
---
|
|
cogl/winsys/cogl-winsys-egl-kms.c | 5 +++--
|
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/cogl/winsys/cogl-winsys-egl-kms.c b/cogl/winsys/cogl-winsys-egl-kms.c
|
|
index 20c325c..b460907 100644
|
|
--- a/cogl/winsys/cogl-winsys-egl-kms.c
|
|
+++ b/cogl/winsys/cogl-winsys-egl-kms.c
|
|
@@ -563,81 +563,82 @@ setup_crtc_modes (CoglDisplay *display, int fb_id)
|
|
CoglRendererKMS *kms_renderer = egl_renderer->platform;
|
|
GList *l;
|
|
|
|
for (l = kms_display->crtcs; l; l = l->next)
|
|
{
|
|
CoglKmsCrtc *crtc = l->data;
|
|
|
|
int ret = drmModeSetCrtc (kms_renderer->fd,
|
|
crtc->id,
|
|
fb_id, crtc->x, crtc->y,
|
|
crtc->connectors, crtc->count,
|
|
crtc->count ? &crtc->mode : NULL);
|
|
if (ret)
|
|
g_warning ("Failed to set crtc mode %s: %m", crtc->mode.name);
|
|
}
|
|
}
|
|
|
|
static void
|
|
flip_all_crtcs (CoglDisplay *display, CoglFlipKMS *flip, int fb_id)
|
|
{
|
|
CoglDisplayEGL *egl_display = display->winsys;
|
|
CoglDisplayKMS *kms_display = egl_display->platform;
|
|
CoglRendererEGL *egl_renderer = display->renderer->winsys;
|
|
CoglRendererKMS *kms_renderer = egl_renderer->platform;
|
|
GList *l;
|
|
gboolean needs_flip = FALSE;
|
|
|
|
for (l = kms_display->crtcs; l; l = l->next)
|
|
{
|
|
CoglKmsCrtc *crtc = l->data;
|
|
- int ret;
|
|
+ int ret = 0;
|
|
|
|
if (crtc->count == 0 || crtc->ignore)
|
|
continue;
|
|
|
|
needs_flip = TRUE;
|
|
|
|
if (!kms_renderer->page_flips_not_supported)
|
|
{
|
|
ret = drmModePageFlip (kms_renderer->fd,
|
|
crtc->id, fb_id,
|
|
DRM_MODE_PAGE_FLIP_EVENT, flip);
|
|
if (ret != 0 && ret != -EACCES)
|
|
{
|
|
g_warning ("Failed to flip: %m");
|
|
kms_renderer->page_flips_not_supported = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
- flip->pending++;
|
|
+ if (ret == 0)
|
|
+ flip->pending++;
|
|
}
|
|
|
|
if (kms_renderer->page_flips_not_supported && needs_flip)
|
|
flip->pending = 1;
|
|
}
|
|
|
|
static void
|
|
crtc_free (CoglKmsCrtc *crtc)
|
|
{
|
|
g_free (crtc->connectors);
|
|
g_slice_free (CoglKmsCrtc, crtc);
|
|
}
|
|
|
|
static CoglKmsCrtc *
|
|
crtc_copy (CoglKmsCrtc *from)
|
|
{
|
|
CoglKmsCrtc *new;
|
|
|
|
new = g_slice_new (CoglKmsCrtc);
|
|
|
|
*new = *from;
|
|
new->connectors = g_memdup (from->connectors, from->count * sizeof(uint32_t));
|
|
|
|
return new;
|
|
}
|
|
|
|
static CoglBool
|
|
_cogl_winsys_egl_display_setup (CoglDisplay *display,
|
|
CoglError **error)
|
|
{
|
|
--
|
|
2.5.0
|
|
|