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

Michel Dänzer daenzer at kemper.freedesktop.org
Thu Aug 3 08:18:34 UTC 2017


 man/amdgpu.man        |    2 +-
 src/amdgpu_dri2.c     |   33 +++++++--------------------------
 src/amdgpu_kms.c      |    2 +-
 src/amdgpu_present.c  |   14 ++++----------
 src/drmmode_display.c |   23 +++++++++++++++--------
 src/drmmode_display.h |   13 +++++++++++++
 6 files changed, 41 insertions(+), 46 deletions(-)

New commits:
commit 9caa9dd9cc5eb9882c4bb85275bc318948dab71f
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Wed Aug 2 19:07:40 2017 +0900

    Allow DRI page flipping when some CRTCs use separate scanout buffers
    
    As long as the CRTC we're synchronizing to doesn't.
    
    (Ported from radeon commit 5309bde0c4e28adf2b167191c6d7011a19e31eed)
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/man/amdgpu.man b/man/amdgpu.man
index d6904b8..ebb472a 100644
--- a/man/amdgpu.man
+++ b/man/amdgpu.man
@@ -77,7 +77,7 @@ Set the default value of the per-output 'TearFree' property, which controls
 tearing prevention using the hardware page flipping mechanism. TearFree is
 on for any CRTC associated with one or more outputs with TearFree on. Two
 separate scanout buffers need to be allocated for each CRTC with TearFree
-on. While TearFree is on for any CRTC, it currently prevents clients from using
+on. While TearFree is on for any CRTC, it may prevent clients from using
 DRI page flipping. If this option is set, the default value of the property
 is 'on' or 'off' accordingly. If this option isn't set, the default value of the
 property is
diff --git a/src/amdgpu_dri2.c b/src/amdgpu_dri2.c
index b4cb1ec..dfbc999 100644
--- a/src/amdgpu_dri2.c
+++ b/src/amdgpu_dri2.c
@@ -600,18 +600,6 @@ can_exchange(ScrnInfoPtr pScrn, DrawablePtr draw,
 	struct dri2_buffer_priv *back_priv = back->driverPrivate;
 	PixmapPtr front_pixmap;
 	PixmapPtr back_pixmap = back_priv->pixmap;
-	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-	int i;
-
-	for (i = 0; i < xf86_config->num_crtc; i++) {
-		xf86CrtcPtr crtc = xf86_config->crtc[i];
-		drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
-
-		if (crtc->enabled &&
-		    (crtc->rotatedData ||
-		     drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo))
-			return FALSE;
-	}
 
 	if (!update_front(draw, front))
 		return FALSE;
@@ -635,9 +623,10 @@ can_exchange(ScrnInfoPtr pScrn, DrawablePtr draw,
 }
 
 static Bool
-can_flip(ScrnInfoPtr pScrn, DrawablePtr draw,
+can_flip(xf86CrtcPtr crtc, DrawablePtr draw,
 	 DRI2BufferPtr front, DRI2BufferPtr back)
 {
+	ScrnInfoPtr pScrn = crtc->scrn;
 	AMDGPUInfoPtr info = AMDGPUPTR(pScrn);
 	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
 	int num_crtcs_on;
@@ -652,15 +641,10 @@ can_flip(ScrnInfoPtr pScrn, DrawablePtr draw,
 		return FALSE;
 
 	for (i = 0, num_crtcs_on = 0; i < config->num_crtc; i++) {
-		xf86CrtcPtr crtc = config->crtc[i];
-		drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
-
-		if (!drmmode_crtc || drmmode_crtc->rotate.bo ||
-		    drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo)
-			return FALSE;
-
-		if (drmmode_crtc_can_flip(crtc))
+		if (drmmode_crtc_can_flip(config->crtc[i]))
 			num_crtcs_on++;
+		else if (config->crtc[i] == crtc)
+			return FALSE;
 	}
 
 	return num_crtcs_on > 0 && can_exchange(pScrn, draw, front, back);
@@ -745,7 +729,7 @@ static void amdgpu_dri2_frame_event_handler(xf86CrtcPtr crtc, uint32_t seq,
 
 	switch (event->type) {
 	case DRI2_FLIP:
-		if (can_flip(scrn, drawable, event->front, event->back) &&
+		if (can_flip(crtc, drawable, event->front, event->back) &&
 		    amdgpu_dri2_schedule_flip(crtc,
 					      event->client,
 					      drawable,
@@ -1237,7 +1221,7 @@ static int amdgpu_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
 	current_msc &= 0xffffffff;
 
 	/* Flips need to be submitted one frame before */
-	if (can_flip(scrn, draw, front, back)) {
+	if (can_flip(crtc, draw, front, back)) {
 		swap_info->type = DRI2_FLIP;
 		flip = 1;
 	}
diff --git a/src/amdgpu_present.c b/src/amdgpu_present.c
index 3754569..550b702 100644
--- a/src/amdgpu_present.c
+++ b/src/amdgpu_present.c
@@ -228,14 +228,7 @@ amdgpu_present_check_unflip(ScrnInfoPtr scrn)
 		return FALSE;
 
 	for (i = 0, num_crtcs_on = 0; i < config->num_crtc; i++) {
-		xf86CrtcPtr crtc = config->crtc[i];
-		drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
-
-		if (!drmmode_crtc || drmmode_crtc->rotate.bo ||
-		    drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo)
-			return FALSE;
-
-		if (drmmode_crtc_can_flip(crtc))
+		if (drmmode_crtc_can_flip(config->crtc[i]))
 			num_crtcs_on++;
 	}
 
@@ -269,6 +262,9 @@ amdgpu_present_check_flip(RRCrtcPtr crtc, WindowPtr window, PixmapPtr pixmap,
 	    amdgpu_pixmap_get_tiling_info(screen->GetScreenPixmap(screen)))
 		return FALSE;
 
+	if (!drmmode_crtc_can_flip(crtc->devPrivate))
+		return FALSE;
+
 	return amdgpu_present_check_unflip(scrn);
 }
 
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 8ddb2ac..75cf784 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -2814,7 +2814,7 @@ Bool amdgpu_do_pageflip(ScrnInfoPtr scrn, ClientPtr client,
 	for (i = 0; i < config->num_crtc; i++) {
 		crtc = config->crtc[i];
 
-		if (!crtc->enabled)
+		if (!drmmode_crtc_can_flip(crtc))
 			continue;
 
 		flipdata->flip_count++;
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index 677f796..ca556f2 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -139,7 +139,9 @@ drmmode_crtc_can_flip(xf86CrtcPtr crtc)
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 
 	return crtc->enabled &&
-		drmmode_crtc->pending_dpms_mode == DPMSModeOn;
+		drmmode_crtc->pending_dpms_mode == DPMSModeOn &&
+		!drmmode_crtc->rotate.bo &&
+		!drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo;
 }
 
 
commit 4441c7c6dde2d71bd44c3031c5679ee3186ea8f9
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Tue Aug 1 17:29:16 2017 +0900

    Add drmmode_crtc_can_flip helper
    
    To reduce code duplication between DRI2 and Present. No functional
    change intended yet.
    
    (Ported from radeon commit 9bc3eef74452d924f9101c024f66ad9b14c404c8)
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/amdgpu_dri2.c b/src/amdgpu_dri2.c
index a854ce5..b4cb1ec 100644
--- a/src/amdgpu_dri2.c
+++ b/src/amdgpu_dri2.c
@@ -655,14 +655,11 @@ can_flip(ScrnInfoPtr pScrn, DrawablePtr draw,
 		xf86CrtcPtr crtc = config->crtc[i];
 		drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 
-		if (!crtc->enabled)
-			continue;
-
 		if (!drmmode_crtc || drmmode_crtc->rotate.bo ||
 		    drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo)
 			return FALSE;
 
-		if (drmmode_crtc->pending_dpms_mode == DPMSModeOn)
+		if (drmmode_crtc_can_flip(crtc))
 			num_crtcs_on++;
 	}
 
diff --git a/src/amdgpu_present.c b/src/amdgpu_present.c
index cf11d2b..3754569 100644
--- a/src/amdgpu_present.c
+++ b/src/amdgpu_present.c
@@ -228,16 +228,14 @@ amdgpu_present_check_unflip(ScrnInfoPtr scrn)
 		return FALSE;
 
 	for (i = 0, num_crtcs_on = 0; i < config->num_crtc; i++) {
-		drmmode_crtc_private_ptr drmmode_crtc = config->crtc[i]->driver_private;
-
-		if (!config->crtc[i]->enabled)
-			continue;
+		xf86CrtcPtr crtc = config->crtc[i];
+		drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 
 		if (!drmmode_crtc || drmmode_crtc->rotate.bo ||
 		    drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo)
 			return FALSE;
 
-		if (drmmode_crtc->pending_dpms_mode == DPMSModeOn)
+		if (drmmode_crtc_can_flip(crtc))
 			num_crtcs_on++;
 	}
 
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index 309ec67..677f796 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -132,6 +132,17 @@ enum drmmode_flip_sync {
 };
 
 
+/* Can the page flip ioctl be used for this CRTC? */
+static inline Bool
+drmmode_crtc_can_flip(xf86CrtcPtr crtc)
+{
+	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+
+	return crtc->enabled &&
+		drmmode_crtc->pending_dpms_mode == DPMSModeOn;
+}
+
+
 static inline void
 drmmode_fb_reference_loc(int drm_fd, struct drmmode_fb **old, struct drmmode_fb *new,
 			 const char *caller, unsigned line)
commit 3e08409344a2fd504429522507592f98555bec05
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Wed Aug 2 19:03:40 2017 +0900

    Use root window (pixmap) instead of screen pixmap for scanout updates
    
    Preparation for following changes, no functional change intended yet.
    
    (Ported from radeon commit c2d26890691ec105858f086b63170ad94c6f7f05)
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
index 2355a89..c86f117 100644
--- a/src/amdgpu_kms.c
+++ b/src/amdgpu_kms.c
@@ -877,7 +877,7 @@ amdgpu_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id)
 		GCPtr gc = GetScratchGC(pDraw->depth, pScreen);
 
 		ValidateGC(pDraw, gc);
-		(*gc->ops->CopyArea)(&pScreen->GetScreenPixmap(pScreen)->drawable,
+		(*gc->ops->CopyArea)(&pScreen->GetWindowPixmap(pScreen->root)->drawable,
 				     pDraw, gc,
 				     xf86_crtc->x + extents.x1, xf86_crtc->y + extents.y1,
 				     extents.x2 - extents.x1, extents.y2 - extents.y1,
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 9b33d4d..8ddb2ac 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -471,11 +471,8 @@ drmmode_crtc_scanout_free(drmmode_crtc_private_ptr drmmode_crtc)
 					     &drmmode_crtc->scanout[1]);
 	}
 
-	if (drmmode_crtc->scanout_damage) {
+	if (drmmode_crtc->scanout_damage)
 		DamageDestroy(drmmode_crtc->scanout_damage);
-		drmmode_crtc->scanout_damage = NULL;
-		RegionUninit(&drmmode_crtc->scanout_last_region);
-	}
 }
 
 void
@@ -543,6 +540,15 @@ amdgpu_screen_damage_report(DamagePtr damage, RegionPtr region, void *closure)
 	damage->damage.data = NULL;
 }
 
+static void
+drmmode_screen_damage_destroy(DamagePtr damage, void *closure)
+{
+	drmmode_crtc_private_ptr drmmode_crtc = closure;
+
+	drmmode_crtc->scanout_damage = NULL;
+	RegionUninit(&drmmode_crtc->scanout_last_region);
+}
+
 static Bool
 drmmode_can_use_hw_cursor(xf86CrtcPtr crtc)
 {
@@ -730,9 +736,10 @@ drmmode_crtc_scanout_update(xf86CrtcPtr crtc, DisplayModePtr mode,
 		if (!drmmode_crtc->scanout_damage) {
 			drmmode_crtc->scanout_damage =
 				DamageCreate(amdgpu_screen_damage_report,
-					     NULL, DamageReportRawRegion,
-					     TRUE, screen, NULL);
-			DamageRegister(&screen->GetScreenPixmap(screen)->drawable,
+					     drmmode_screen_damage_destroy,
+					     DamageReportRawRegion,
+					     TRUE, screen, drmmode_crtc);
+			DamageRegister(&screen->root->drawable,
 				       drmmode_crtc->scanout_damage);
 		}
 


More information about the xorg-commit mailing list