xf86-video-ati: Branch 'master' - 3 commits

Michel Dänzer daenzer at kemper.freedesktop.org
Sat Feb 27 06:23:08 UTC 2016


 src/radeon_dri2.c      |    5 +++--
 src/radeon_drm_queue.c |   18 +++++++++++++-----
 src/radeon_kms.c       |    9 +--------
 3 files changed, 17 insertions(+), 15 deletions(-)

New commits:
commit e87365117acbd80b7d80fbb5eb30890ef7153291
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Thu Feb 25 16:49:16 2016 +0900

    DRI2: Also clear dri2_flipping when client disconnects before event
    
    Fixes the following problem:
    
    With DRI3 enabled, run glxgears with LIBGL_DRI3_DISABLE=1, make it
    fullscreen and press Escape while it's still fullscreen. This could
    result in dri2_flipping not getting cleared, spuriously preventing apps
    using DRI3 from flipping.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index d30bbd0..740a9d3 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -647,6 +647,9 @@ xf86CrtcPtr radeon_dri2_drawable_crtc(DrawablePtr pDraw, Bool consider_disabled)
 static void
 radeon_dri2_flip_event_abort(ScrnInfoPtr scrn, void *event_data)
 {
+    RADEONInfoPtr info = RADEONPTR(scrn);
+
+    info->drmmode.dri2_flipping = FALSE;
     free(event_data);
 }
 
@@ -654,7 +657,6 @@ static void
 radeon_dri2_flip_event_handler(ScrnInfoPtr scrn, uint32_t frame, uint64_t usec,
 			       void *event_data)
 {
-    RADEONInfoPtr info = RADEONPTR(scrn);
     DRI2FrameEventPtr flip = event_data;
     unsigned tv_sec, tv_usec;
     DrawablePtr drawable;
@@ -698,7 +700,6 @@ radeon_dri2_flip_event_handler(ScrnInfoPtr scrn, uint32_t frame, uint64_t usec,
 	DRI2SwapComplete(flip->client, drawable, frame, tv_sec, tv_usec,
 			 DRI2_FLIP_COMPLETE, flip->event_complete,
 			 flip->event_data);
-	info->drmmode.dri2_flipping = FALSE;
 	break;
     default:
 	xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: unknown vblank event received\n", __func__);
commit d5dbb07db22d5420c81dfebc060f0dd86e7b8a20
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Thu Feb 25 18:02:12 2016 +0900

    Remove radeon_scanout_flip_handler
    
    No longer necessary now that radeon_drm_queue_handler can handle
    e->handler == NULL.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 38f5c4e..d93a4ce 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -486,12 +486,6 @@ radeon_scanout_flip_abort(ScrnInfoPtr scrn, void *event_data)
 }
 
 static void
-radeon_scanout_flip_handler(ScrnInfoPtr scrn, uint32_t frame, uint64_t usec, void *event_data)
-{
-    radeon_scanout_flip_abort(scrn, event_data);
-}
-
-static void
 radeon_scanout_flip(ScreenPtr pScreen, RADEONInfoPtr info,
 		    xf86CrtcPtr xf86_crtc)
 {
@@ -510,8 +504,7 @@ radeon_scanout_flip(ScreenPtr pScreen, RADEONInfoPtr info,
     scrn = xf86_crtc->scrn;
     drm_queue_entry = radeon_drm_queue_alloc(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT,
 					     RADEON_DRM_QUEUE_ID_DEFAULT,
-					     drmmode_crtc,
-					     radeon_scanout_flip_handler,
+					     drmmode_crtc, NULL,
 					     radeon_scanout_flip_abort);
     if (!drm_queue_entry) {
 	xf86DrvMsg(scrn->scrnIndex, X_WARNING,
commit 3989766edde85d1abe7024577b98fc9b007bc02a
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Thu Feb 25 16:43:48 2016 +0900

    drm_queue: Don't abort events immediately from radeon_drm_abort_client
    
    Keep them around until the DRM event arrives, but then call the abort
    functions instead of the handler functions.
    
    This is a prerequisite for the following fix.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/radeon_drm_queue.c b/src/radeon_drm_queue.c
index 5e54ef8..a50a1fd 100644
--- a/src/radeon_drm_queue.c
+++ b/src/radeon_drm_queue.c
@@ -64,8 +64,12 @@ radeon_drm_queue_handler(int fd, unsigned int frame, unsigned int sec,
 	xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_queue, list) {
 		if (e == user_data) {
 			xorg_list_del(&e->list);
-			e->handler(e->scrn, frame,
-				   (uint64_t)sec * 1000000 + usec, e->data);
+			if (e->handler)
+				e->handler(e->scrn, frame,
+					   (uint64_t)sec * 1000000 + usec,
+					   e->data);
+			else
+				e->abort(e->scrn, e->data);
 			free(e);
 			break;
 		}
@@ -115,15 +119,19 @@ radeon_drm_abort_one(struct radeon_drm_queue_entry *e)
 
 /*
  * Abort drm queue entries for a client
+ *
+ * NOTE: This keeps the entries in the list until the DRM event arrives,
+ * but then it calls the abort functions instead of the handler
+ * functions.
  */
 void
 radeon_drm_abort_client(ClientPtr client)
 {
-    struct radeon_drm_queue_entry *e, *tmp;
+    struct radeon_drm_queue_entry *e;
 
-    xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_queue, list) {
+    xorg_list_for_each_entry(e, &radeon_drm_queue, list) {
 	if (e->client == client)
-	    radeon_drm_abort_one(e);
+	    e->handler = NULL;
     }
 }
 


More information about the xorg-commit mailing list