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

Michel Dänzer daenzer at kemper.freedesktop.org
Fri Apr 20 15:22:37 UTC 2018


 src/amdgpu_drm_queue.c |    3 +++
 src/amdgpu_kms.c       |   16 ++++++++--------
 src/drmmode_display.c  |   12 ++++++++----
 src/drmmode_display.h  |    2 +-
 4 files changed, 20 insertions(+), 13 deletions(-)

New commits:
commit 36d01989cd842588f12fdae5b2cba5fdcf9c91dd
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Wed Apr 18 11:17:02 2018 +0200

    Abort scanout_update_pending event when possible
    
    We don't need to wait for a non-TearFree scanout update before scanning
    out from the screen pixmap or before flipping, as the scanout update
    won't be visible anyway. Instead, just abort it.

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 2d1540d..dcfc993 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -953,8 +953,8 @@ done:
 		if (drmmode_crtc->scanout[scanout_id].pixmap &&
 		    fb != amdgpu_pixmap_get_fb(drmmode_crtc->
 					       scanout[scanout_id].pixmap)) {
-			drmmode_crtc_wait_pending_event(drmmode_crtc, pAMDGPUEnt->fd,
-							drmmode_crtc->scanout_update_pending);
+			amdgpu_drm_abort_entry(drmmode_crtc->scanout_update_pending);
+			drmmode_crtc->scanout_update_pending = 0;
 			drmmode_crtc_scanout_free(drmmode_crtc);
 		} else if (!drmmode_crtc->tear_free) {
 			drmmode_crtc_scanout_destroy(drmmode,
@@ -3083,8 +3083,12 @@ Bool amdgpu_do_pageflip(ScrnInfoPtr scrn, ClientPtr client,
 			amdgpu_scanout_do_update(crtc, scanout_id, new_front,
 						 extents);
 
-			drmmode_crtc_wait_pending_event(drmmode_crtc, pAMDGPUEnt->fd,
-							drmmode_crtc->scanout_update_pending);
+			if (drmmode_crtc->scanout_update_pending) {
+				drmmode_crtc_wait_pending_event(drmmode_crtc, pAMDGPUEnt->fd,
+								drmmode_crtc->flip_pending);
+				amdgpu_drm_abort_entry(drmmode_crtc->scanout_update_pending);
+				drmmode_crtc->scanout_update_pending = 0;
+			}
 		}
 
 		if (crtc == ref_crtc) {
commit 04a5c5f7cfacad8d9ccffe81e388cc3da2036cb5
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Wed Apr 18 11:03:14 2018 +0200

    Track DRM event queue sequence number in scanout_update_pending
    
    Preparation for next change, no behaviour change intended.

diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
index 6520191..c86c787 100644
--- a/src/amdgpu_kms.c
+++ b/src/amdgpu_kms.c
@@ -424,7 +424,7 @@ amdgpu_scanout_flip_abort(xf86CrtcPtr crtc, void *event_data)
 	AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(crtc->scrn);
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 
-	drmmode_crtc->scanout_update_pending = FALSE;
+	drmmode_crtc->scanout_update_pending = 0;
 	drmmode_fb_reference(pAMDGPUEnt->fd, &drmmode_crtc->flip_pending,
 			     NULL);
 }
@@ -509,7 +509,7 @@ amdgpu_prime_scanout_update_abort(xf86CrtcPtr crtc, void *event_data)
 {
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 
-	drmmode_crtc->scanout_update_pending = FALSE;
+	drmmode_crtc->scanout_update_pending = 0;
 }
 
 void
@@ -650,7 +650,7 @@ amdgpu_prime_scanout_update_handler(xf86CrtcPtr crtc, uint32_t frame, uint64_t u
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 
 	amdgpu_prime_scanout_do_update(crtc, 0);
-	drmmode_crtc->scanout_update_pending = FALSE;
+	drmmode_crtc->scanout_update_pending = 0;
 }
 
 static void
@@ -691,7 +691,7 @@ amdgpu_prime_scanout_update(PixmapDirtyUpdatePtr dirty)
 		return;
 	}
 
-	drmmode_crtc->scanout_update_pending = TRUE;
+	drmmode_crtc->scanout_update_pending = drm_queue_seq;
 }
 
 static void
@@ -749,7 +749,7 @@ amdgpu_prime_scanout_flip(PixmapDirtyUpdatePtr ent)
 	}
 
 	drmmode_crtc->scanout_id = scanout_id;
-	drmmode_crtc->scanout_update_pending = TRUE;
+	drmmode_crtc->scanout_update_pending = drm_queue_seq;
 }
 
 static void
@@ -892,7 +892,7 @@ amdgpu_scanout_update_abort(xf86CrtcPtr crtc, void *event_data)
 {
 	drmmode_crtc_private_ptr drmmode_crtc = event_data;
 
-	drmmode_crtc->scanout_update_pending = FALSE;
+	drmmode_crtc->scanout_update_pending = 0;
 }
 
 static void
@@ -967,7 +967,7 @@ amdgpu_scanout_update(xf86CrtcPtr xf86_crtc)
 		return;
 	}
 
-	drmmode_crtc->scanout_update_pending = TRUE;
+	drmmode_crtc->scanout_update_pending = drm_queue_seq;
 }
 
 static void
@@ -1032,7 +1032,7 @@ amdgpu_scanout_flip(ScreenPtr pScreen, AMDGPUInfoPtr info,
 	}
 
 	drmmode_crtc->scanout_id = scanout_id;
-	drmmode_crtc->scanout_update_pending = TRUE;
+	drmmode_crtc->scanout_update_pending = drm_queue_seq;
 }
 
 static void AMDGPUBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL)
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index 2aa5672..25ae9f8 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -84,7 +84,7 @@ typedef struct {
 	Bool ignore_damage;
 	RegionRec scanout_last_region;
 	unsigned scanout_id;
-	Bool scanout_update_pending;
+	uintptr_t scanout_update_pending;
 	Bool tear_free;
 
 	PixmapPtr prime_scanout_pixmap;
commit 8fcc3a9b43d3907052a83a96e5a2423afab5ad3f
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Wed Apr 18 11:18:59 2018 +0200

    Ignore AMDGPU_DRM_QUEUE_ERROR (0) in amdgpu_drm_abort_entry
    
    This allows a following change to be slightly simpler.

diff --git a/src/amdgpu_drm_queue.c b/src/amdgpu_drm_queue.c
index 2aa21e0..d1456ca 100644
--- a/src/amdgpu_drm_queue.c
+++ b/src/amdgpu_drm_queue.c
@@ -150,6 +150,9 @@ amdgpu_drm_abort_entry(uintptr_t seq)
 {
 	struct amdgpu_drm_queue_entry *e, *tmp;
 
+	if (seq == AMDGPU_DRM_QUEUE_ERROR)
+		return;
+
 	xorg_list_for_each_entry_safe(e, tmp, &amdgpu_drm_queue, list) {
 		if (e->seq == seq) {
 			amdgpu_drm_abort_one(e);


More information about the xorg-commit mailing list