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 deleted file mode 100644 index 7495798..0000000 --- a/0001-kms-winsys-try-to-hobble-along-if-driver-doesn-t-sup.patch +++ /dev/null @@ -1,366 +0,0 @@ -From 68d9ba3b653a2fe0f0992ea2b6df753b3bfc9d61 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Wed, 11 Mar 2015 12:09:51 -0400 -Subject: [PATCH] kms-winsys: try to hobble along if driver doesn't support - page flips - -Some drivers ( like mgag200 ) don't yet support drmModePageFlip. - -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 | 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..c5d014a 100644 ---- a/cogl/winsys/cogl-winsys-egl-kms.c -+++ b/cogl/winsys/cogl-winsys-egl-kms.c -@@ -45,60 +45,61 @@ - #include - #include - #include - #include - #include - #include - #include - #include - - #include "cogl-winsys-egl-kms-private.h" - #include "cogl-winsys-egl-private.h" - #include "cogl-renderer-private.h" - #include "cogl-framebuffer-private.h" - #include "cogl-onscreen-private.h" - #include "cogl-kms-renderer.h" - #include "cogl-kms-display.h" - #include "cogl-version.h" - #include "cogl-error-private.h" - #include "cogl-poll-private.h" - - static const CoglWinsysEGLVtable _cogl_winsys_egl_vtable; - - static const CoglWinsysVtable *parent_vtable; - - typedef struct _CoglRendererKMS - { - int fd; - int opened_fd; - struct gbm_device *gbm; - CoglClosure *swap_notify_idle; -+ CoglBool page_flips_not_supported; - } CoglRendererKMS; - - typedef struct _CoglOutputKMS - { - drmModeConnector *connector; - drmModeEncoder *encoder; - drmModeCrtc *saved_crtc; - drmModeModeInfo *modes; - int n_modes; - drmModeModeInfo mode; - } CoglOutputKMS; - - typedef struct _CoglDisplayKMS - { - GList *outputs; - GList *crtcs; - - int width, height; - CoglBool pending_set_crtc; - struct gbm_surface *dummy_gbm_surface; - - CoglOnscreen *onscreen; - } CoglDisplayKMS; - - typedef struct _CoglFlipKMS - { - CoglOnscreen *onscreen; - int pending; - } CoglFlipKMS; - -@@ -197,98 +198,107 @@ free_current_bo (CoglOnscreen *onscreen) - kms_onscreen->current_bo = NULL; - } - } - - 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, -- unsigned int usec, -- void *data) -+process_flip (CoglFlipKMS *flip) - { -- CoglFlipKMS *flip = data; -- - /* We're only ready to dispatch a swap notification once all outputs - * have flipped... */ - flip->pending--; - if (flip->pending == 0) - { - CoglOnscreen *onscreen = flip->onscreen; - CoglOnscreenEGL *egl_onscreen = onscreen->winsys; - CoglOnscreenKMS *kms_onscreen = egl_onscreen->platform; - - queue_swap_notify_for_onscreen (onscreen); - - free_current_bo (onscreen); - - kms_onscreen->current_fb_id = kms_onscreen->next_fb_id; - kms_onscreen->next_fb_id = 0; - - kms_onscreen->current_bo = kms_onscreen->next_bo; - kms_onscreen->next_bo = NULL; - - cogl_object_unref (flip->onscreen); - - g_slice_free (CoglFlipKMS, flip); - } - } - - static void -+page_flip_handler (int fd, -+ unsigned int frame, -+ unsigned int sec, -+ unsigned int usec, -+ void *data) -+{ -+ CoglFlipKMS *flip = data; -+ -+ process_flip (flip); -+} -+ -+static void - handle_drm_event (CoglRendererKMS *kms_renderer) - { - drmEventContext evctx; - -+ 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; - drmHandleEvent (kms_renderer->fd, &evctx); - } - - static void - dispatch_kms_events (void *user_data, int revents) - { - CoglRenderer *renderer = user_data; - CoglRendererEGL *egl_renderer = renderer->winsys; - CoglRendererKMS *kms_renderer = egl_renderer->platform; - - if (!revents) - return; - - handle_drm_event (kms_renderer); - } - - static CoglBool - _cogl_winsys_renderer_connect (CoglRenderer *renderer, - CoglError **error) - { - CoglRendererEGL *egl_renderer; - CoglRendererKMS *kms_renderer; - - renderer->winsys = g_slice_new0 (CoglRendererEGL); - egl_renderer = renderer->winsys; - - egl_renderer->platform_vtable = &_cogl_winsys_egl_vtable; -@@ -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; - - 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; - - if (crtc->count == 0 || crtc->ignore) - continue; - -- 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); -+ if (ret) -+ { -+ g_warning ("Failed to flip: %m"); -+ kms_renderer->page_flips_not_supported = TRUE; -+ break; -+ } - } - - 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) - { - 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.3 - diff --git a/cogl.spec b/cogl.spec index 8d5614e..ad9830a 100644 --- a/cogl.spec +++ b/cogl.spec @@ -5,15 +5,14 @@ %global with_tests 1 Name: cogl -Version: 1.20.0 -Release: 4%{?dist} +Version: 1.21.2 +Release: 1%{?dist} Summary: A library for using 3D graphics hardware to draw pretty pictures Group: Development/Libraries License: LGPLv2+ URL: http://www.clutter-project.org/ -Source0: http://download.gnome.org/sources/cogl/1.20/cogl-%{version}.tar.xz -Patch0: 0001-kms-winsys-try-to-hobble-along-if-driver-doesn-t-sup.patch +Source0: http://download.gnome.org/sources/cogl/1.21/cogl-%{version}.tar.xz BuildRequires: cairo-devel BuildRequires: chrpath @@ -89,7 +88,6 @@ This package contains the installable tests for %{cogl}. %prep %setup -q -%patch0 -p1 -b .fall-back-if-no-page-flips %build CFLAGS="$RPM_OPT_FLAGS -fPIC" @@ -154,6 +152,9 @@ chrpath --delete $RPM_BUILD_ROOT%{_libdir}/libcogl-pango.so %endif %changelog +* Fri Aug 21 2015 Kalev Lember - 1.21.2-1 +- Update to 1.21.2 + * Wed Jun 17 2015 Fedora Release Engineering - 1.20.0-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild diff --git a/sources b/sources index df1e8aa..ddd8e7f 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -5b28897194d9ff76a574a9493d1f7ee0 cogl-1.20.0.tar.xz +8d1b8e4b55c70d1bfdf05080778b9ea5 cogl-1.21.2.tar.xz