[cogl] update to upstreamed version of patch

Ray Strode rstrode at fedoraproject.org
Mon Mar 23 20:36:12 UTC 2015


commit 17768f909ee53cf4c5f7bdcccc140d57509e3d05
Author: Ray Strode <rstrode at redhat.com>
Date:   Mon Mar 23 16:34:11 2015 -0400

    update to upstreamed version of patch

 ...try-to-hobble-along-if-driver-doesn-t-sup.patch | 255 ++++++++-------------
 cogl.spec                                          |   5 +-
 2 files changed, 103 insertions(+), 157 deletions(-)
---
diff --git a/0001-kms-winsys-try-to-hobble-along-if-driver-doesn-t-sup.patch b/0001-kms-winsys-try-to-hobble-along-if-driver-doesn-t-sup.patch
index 7ae580c..7495798 100644
--- a/0001-kms-winsys-try-to-hobble-along-if-driver-doesn-t-sup.patch
+++ b/0001-kms-winsys-try-to-hobble-along-if-driver-doesn-t-sup.patch
@@ -1,4 +1,4 @@
-From 5c22141866e5335dd111b64349f6ff2ee484a6b4 Mon Sep 17 00:00:00 2001
+From 68d9ba3b653a2fe0f0992ea2b6df753b3bfc9d61 Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode at redhat.com>
 Date: Wed, 11 Mar 2015 12:09:51 -0400
 Subject: [PATCH] kms-winsys: try to hobble along if driver doesn't support
@@ -6,21 +6,20 @@ Subject: [PATCH] kms-winsys: try to hobble along if driver doesn't support
 
 Some drivers ( like mgag200 ) don't yet support drmModePageFlip.
 
-This commit tries to emulate the functionality using drmWaitVBlank
-and drmModeSetCrtc in those cases.
-
-Failing all else, it just falls back to flipping right away.
+This commit forgoes waiting for vblank and flips right away
+in those cases. That prevents the hardware from freezing up the screen,
+but does mean there will be some visible tearing.
 
 https://bugzilla.gnome.org/show_bug.cgi?id=746042
 ---
- cogl/winsys/cogl-winsys-egl-kms.c | 130 +++++++++++++++++++++++++++++++++-----
- 1 file changed, 115 insertions(+), 15 deletions(-)
+ cogl/winsys/cogl-winsys-egl-kms.c | 52 +++++++++++++++++++++++++++++----------
+ 1 file changed, 39 insertions(+), 13 deletions(-)
 
 diff --git a/cogl/winsys/cogl-winsys-egl-kms.c b/cogl/winsys/cogl-winsys-egl-kms.c
-index b06c1da..c66eb45 100644
+index b06c1da..c5d014a 100644
 --- a/cogl/winsys/cogl-winsys-egl-kms.c
 +++ b/cogl/winsys/cogl-winsys-egl-kms.c
-@@ -45,104 +45,107 @@
+@@ -45,60 +45,61 @@
  #include <xf86drm.h>
  #include <xf86drmMode.h>
  #include <gbm.h>
@@ -52,7 +51,6 @@ index b06c1da..c66eb45 100644
    struct gbm_device *gbm;
    CoglClosure *swap_notify_idle;
 +  CoglBool     page_flips_not_supported;
-+  CoglBool     vblank_not_supported;
  } CoglRendererKMS;
  
  typedef struct _CoglOutputKMS
@@ -83,52 +81,7 @@ index b06c1da..c66eb45 100644
    int pending;
  } CoglFlipKMS;
  
- typedef struct _CoglOnscreenKMS
- {
-   struct gbm_surface *surface;
-   uint32_t current_fb_id;
-   uint32_t next_fb_id;
-   struct gbm_bo *current_bo;
-   struct gbm_bo *next_bo;
-   CoglBool pending_swap_notify;
- 
-   EGLSurface *pending_egl_surface;
-   struct gbm_surface *pending_surface;
- } CoglOnscreenKMS;
- 
- static const char device_name[] = "/dev/dri/card0";
-+static void setup_crtc_modes (CoglDisplay *display, int fb_id);
- 
- static void
- _cogl_winsys_renderer_disconnect (CoglRenderer *renderer)
- {
-   CoglRendererEGL *egl_renderer = renderer->winsys;
-   CoglRendererKMS *kms_renderer = egl_renderer->platform;
- 
-   eglTerminate (egl_renderer->edpy);
- 
-   if (kms_renderer->opened_fd >= 0)
-     close (kms_renderer->opened_fd);
- 
-   g_slice_free (CoglRendererKMS, kms_renderer);
-   g_slice_free (CoglRendererEGL, egl_renderer);
- }
- 
- static void
- flush_pending_swap_notify_cb (void *data,
-                               void *user_data)
- {
-   CoglFramebuffer *framebuffer = data;
- 
-   if (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN)
-     {
-       CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
-       CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
-       CoglOnscreenKMS *kms_onscreen = egl_onscreen->platform;
- 
-       if (kms_onscreen->pending_swap_notify)
-         {
-@@ -197,101 +200,168 @@ free_current_bo (CoglOnscreen *onscreen)
+@@ -197,98 +198,107 @@ free_current_bo (CoglOnscreen *onscreen)
        kms_onscreen->current_bo = NULL;
      }
  }
@@ -206,75 +159,16 @@ index b06c1da..c66eb45 100644
 +}
 +
 +static void
-+process_vblank (CoglFlipKMS *flip)
-+{
-+  /* Normally the driver would set the next fb up for
-+   * scan out after vblank for us and then call the
-+   * page flip handler to clean things up.
-+   *
-+   * Not all drivers support the newer page flipping interface
-+   * that provides this functionality, though, so try to emulate
-+   * it
-+   */
-+  if (flip->pending == 1)
-+    {
-+      CoglOnscreen *onscreen = flip->onscreen;
-+      CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
-+      CoglOnscreenKMS *kms_onscreen = egl_onscreen->platform;
-+      CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
-+      CoglContext *context = framebuffer->context;
-+      CoglDisplay *display = context->display;
-+
-+      setup_crtc_modes (display, kms_onscreen->next_fb_id);
-+
-+      process_flip (flip);
-+    }
-+}
-+
-+static void
-+vblank_handler (int fd,
-+                unsigned int frame,
-+                unsigned int sec,
-+                unsigned int usec,
-+                void *data)
-+{
-+  CoglFlipKMS *flip = data;
-+
-+  process_vblank (flip);
-+}
-+
-+static gboolean
-+fake_vblank_timeout_handler (gpointer data)
-+{
-+  CoglFlipKMS *flip = data;
-+
-+  /* Normally the next fb would get setup for
-+   * scan out after a vblank interval.
-+   *
-+   * Not all drivers support vblank notification, though,
-+   * so this handler just processes things right away.
-+   */
-+  process_vblank (flip);
-+
-+  return G_SOURCE_REMOVE;
-+}
-+
-+static void
  handle_drm_event (CoglRendererKMS *kms_renderer)
  {
    drmEventContext evctx;
  
-+  if (kms_renderer->page_flips_not_supported &&
-+      kms_renderer->vblank_not_supported)
++  if (kms_renderer->page_flips_not_supported)
 +    return;
 +
    memset (&evctx, 0, sizeof evctx);
    evctx.version = DRM_EVENT_CONTEXT_VERSION;
--  evctx.page_flip_handler = page_flip_handler;
-+  if (kms_renderer->page_flips_not_supported)
-+    evctx.vblank_handler = vblank_handler;
-+  else
-+    evctx.page_flip_handler = page_flip_handler;
+   evctx.page_flip_handler = page_flip_handler;
    drmHandleEvent (kms_renderer->fd, &evctx);
  }
  
@@ -302,10 +196,11 @@ index b06c1da..c66eb45 100644
    egl_renderer = renderer->winsys;
  
    egl_renderer->platform_vtable = &_cogl_winsys_egl_vtable;
-   egl_renderer->platform = g_slice_new0 (CoglRendererKMS);
-   kms_renderer = egl_renderer->platform;
- 
-@@ -552,75 +622,105 @@ setup_crtc_modes (CoglDisplay *display, int fb_id)
+@@ -548,81 +558,90 @@ static void
+ setup_crtc_modes (CoglDisplay *display, 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;
@@ -332,12 +227,12 @@ index b06c1da..c66eb45 100644
    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 = -1;
+       int ret;
  
        if (crtc->count == 0 || crtc->ignore)
          continue;
@@ -345,8 +240,13 @@ index b06c1da..c66eb45 100644
 -      ret = drmModePageFlip (kms_renderer->fd,
 -                             crtc->id, fb_id,
 -                             DRM_MODE_PAGE_FLIP_EVENT, flip);
++      needs_flip = TRUE;
+ 
+-      if (ret)
 +      if (!kms_renderer->page_flips_not_supported)
-+        {
+         {
+-          g_warning ("Failed to flip: %m");
+-          continue;
 +          ret = drmModePageFlip (kms_renderer->fd,
 +                                 crtc->id, fb_id,
 +                                 DRM_MODE_PAGE_FLIP_EVENT, flip);
@@ -354,42 +254,15 @@ index b06c1da..c66eb45 100644
 +            {
 +              g_warning ("Failed to flip: %m");
 +              kms_renderer->page_flips_not_supported = TRUE;
-+            }
-+        }
- 
--      if (ret)
-+      if (kms_renderer->page_flips_not_supported)
-         {
--          g_warning ("Failed to flip: %m");
--          continue;
-+          drmVBlank watch_for_next_vblank_operation = { 0 };
-+
-+          if (!kms_renderer->vblank_not_supported)
-+            {
-+              /* fall back to older way of waiting for vblanks directly
-+               */
-+              watch_for_next_vblank_operation.request.type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT;
-+              watch_for_next_vblank_operation.request.sequence = 1;
-+              watch_for_next_vblank_operation.request.signal = (gulong) flip;
-+
-+              ret = drmWaitVBlank (kms_renderer->fd, &watch_for_next_vblank_operation);
-+
-+              if (ret)
-+                {
-+                  kms_renderer->vblank_not_supported = TRUE;
-+                  g_warning ("Failed to fall back to waiting for vblanks directly: %m");
-+                }
++              break;
 +            }
          }
  
-+        if (kms_renderer->page_flips_not_supported &&
-+            kms_renderer->vblank_not_supported)
-+          {
-+            g_idle_add (fake_vblank_timeout_handler, flip);
-+          }
-+
        flip->pending++;
      }
++
++  if (kms_renderer->page_flips_not_supported && needs_flip)
++    flip->pending = 1;
  }
  
  static void
@@ -418,6 +291,76 @@ index b06c1da..c66eb45 100644
  {
    CoglDisplayEGL *egl_display = display->winsys;
    CoglDisplayKMS *kms_display;
+   CoglRendererEGL *egl_renderer = display->renderer->winsys;
+   CoglRendererKMS *kms_renderer = egl_renderer->platform;
+@@ -918,60 +937,67 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
+ 
+   /* If this is the first framebuffer to be presented then we now setup the
+    * crtc modes, else we flip from the previous buffer */
+   if (kms_display->pending_set_crtc)
+     {
+       setup_crtc_modes (context->display, kms_onscreen->next_fb_id);
+       kms_display->pending_set_crtc = FALSE;
+     }
+ 
+   flip = g_slice_new0 (CoglFlipKMS);
+   flip->onscreen = onscreen;
+ 
+   flip_all_crtcs (context->display, flip, kms_onscreen->next_fb_id);
+ 
+   if (flip->pending == 0)
+     {
+       drmModeRmFB (kms_renderer->fd, kms_onscreen->next_fb_id);
+       gbm_surface_release_buffer (kms_onscreen->surface,
+                                   kms_onscreen->next_bo);
+       kms_onscreen->next_bo = NULL;
+       kms_onscreen->next_fb_id = 0;
+       g_slice_free (CoglFlipKMS, flip);
+       flip = NULL;
+ 
+       queue_swap_notify_for_onscreen (onscreen);
+     }
+   else
+     {
+       /* Ensure the onscreen remains valid while it has any pending flips... */
+       cogl_object_ref (flip->onscreen);
++
++      /* Process flip right away if we can't wait for vblank */
++      if (kms_renderer->page_flips_not_supported)
++        {
++          setup_crtc_modes (context->display, kms_onscreen->next_fb_id);
++          process_flip (flip);
++        }
+     }
+ }
+ 
+ static CoglBool
+ _cogl_winsys_egl_context_init (CoglContext *context,
+                                CoglError **error)
+ {
+   COGL_FLAGS_SET (context->features,
+                   COGL_FEATURE_ID_SWAP_BUFFERS_EVENT, TRUE);
+   /* TODO: remove this deprecated feature */
+   COGL_FLAGS_SET (context->winsys_features,
+                   COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT,
+                   TRUE);
+   COGL_FLAGS_SET (context->winsys_features,
+                   COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT,
+                   TRUE);
+ 
+   return TRUE;
+ }
+ 
+ static CoglBool
+ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
+                             CoglError **error)
+ {
+   CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
+   CoglContext *context = framebuffer->context;
+   CoglDisplay *display = context->display;
+   CoglDisplayEGL *egl_display = display->winsys;
+   CoglDisplayKMS *kms_display = egl_display->platform;
+   CoglRenderer *renderer = display->renderer;
 -- 
-2.3.1
+2.3.3
 
diff --git a/cogl.spec b/cogl.spec
index ac95ef7..59d6a5b 100644
--- a/cogl.spec
+++ b/cogl.spec
@@ -6,7 +6,7 @@
 
 Name:          cogl
 Version:       1.20.0
-Release:       2%{?dist}
+Release:       3%{?dist}
 Summary:       A library for using 3D graphics hardware to draw pretty pictures
 
 Group:         Development/Libraries
@@ -154,6 +154,9 @@ chrpath --delete $RPM_BUILD_ROOT%{_libdir}/libcogl-pango.so
 %endif
 
 %changelog
+* Mon Mar 23 2015 Ray Strode <rstrode at redhat.com> 1.20.0-3
+- Update to upstreamed version of mgag200 fix
+
 * Wed Mar 11 2015 Ray Strode <rstrode at redhat.com> 1.20.0-2
 - Try to fix wayland on mgag200
 


More information about the scm-commits mailing list