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

Michel Dänzer daenzer at kemper.freedesktop.org
Tue Jun 28 06:43:57 UTC 2016


 src/amdgpu_kms.c      |   42 +++++++++++++++---------------------------
 src/drmmode_display.c |   23 +++++++----------------
 2 files changed, 22 insertions(+), 43 deletions(-)

New commits:
commit a576430526cbc404de64b30e1377a356644e8024
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Fri Jun 24 16:28:25 2016 +0900

    Clear damage in amdgpu_scanout_update if it doesn't intersect the CRTC
    
    There's no need to test that same damage again.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
index 23eb7dc..da009d1 100644
--- a/src/amdgpu_kms.c
+++ b/src/amdgpu_kms.c
@@ -411,8 +411,10 @@ amdgpu_scanout_update(xf86CrtcPtr xf86_crtc)
 		return;
 
 	extents = *RegionExtents(pRegion);
-	if (!amdgpu_scanout_extents_intersect(xf86_crtc, &extents))
+	if (!amdgpu_scanout_extents_intersect(xf86_crtc, &extents)) {
+		RegionEmpty(pRegion);
 		return;
+	}
 
 	scrn = xf86_crtc->scrn;
 	drm_queue_seq = amdgpu_drm_queue_alloc(xf86_crtc,
commit ede7f2bcae63be65e05e3029bfe7c742e5978932
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Fri Jun 24 16:19:15 2016 +0900

    Remove w/h parameters from amdgpu_scanout_extents_intersect
    
    We can use the dimensions of the CRTC's mode instead.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
index 33dd903..23eb7dc 100644
--- a/src/amdgpu_kms.c
+++ b/src/amdgpu_kms.c
@@ -253,8 +253,7 @@ static void amdgpu_dirty_update(ScreenPtr screen)
 #endif
 
 static Bool
-amdgpu_scanout_extents_intersect(xf86CrtcPtr xf86_crtc, BoxPtr extents, int w,
-				 int h)
+amdgpu_scanout_extents_intersect(xf86CrtcPtr xf86_crtc, BoxPtr extents)
 {
 	extents->x1 -= xf86_crtc->filter_width >> 1;
 	extents->x2 += xf86_crtc->filter_width >> 1;
@@ -264,8 +263,8 @@ amdgpu_scanout_extents_intersect(xf86CrtcPtr xf86_crtc, BoxPtr extents, int w,
 
 	extents->x1 = max(extents->x1, 0);
 	extents->y1 = max(extents->y1, 0);
-	extents->x2 = min(extents->x2, w);
-	extents->y2 = min(extents->y2, h);
+	extents->x2 = min(extents->x2, xf86_crtc->mode.HDisplay);
+	extents->y2 = min(extents->y2, xf86_crtc->mode.VDisplay);
 
 	return (extents->x1 < extents->x2 && extents->y1 < extents->y2);
 }
@@ -297,8 +296,7 @@ amdgpu_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id)
 	pScreen = pDraw->pScreen;
 	extents = *RegionExtents(pRegion);
 	RegionEmpty(pRegion);
-	if (!amdgpu_scanout_extents_intersect(xf86_crtc, &extents, pDraw->width,
-					      pDraw->height))
+	if (!amdgpu_scanout_extents_intersect(xf86_crtc, &extents))
 		return FALSE;
 
 #if XF86_CRTC_VERSION >= 4
@@ -396,7 +394,6 @@ amdgpu_scanout_update(xf86CrtcPtr xf86_crtc)
 	drmVBlank vbl;
 	DamagePtr pDamage;
 	RegionPtr pRegion;
-	DrawablePtr pDraw;
 	BoxRec extents;
 
 	if (!xf86_crtc->enabled ||
@@ -413,10 +410,8 @@ amdgpu_scanout_update(xf86CrtcPtr xf86_crtc)
 	if (!RegionNotEmpty(pRegion))
 		return;
 
-	pDraw = &drmmode_crtc->scanout[0].pixmap->drawable;
 	extents = *RegionExtents(pRegion);
-	if (!amdgpu_scanout_extents_intersect(xf86_crtc, &extents, pDraw->width,
-					      pDraw->height))
+	if (!amdgpu_scanout_extents_intersect(xf86_crtc, &extents))
 		return;
 
 	scrn = xf86_crtc->scrn;
commit bf000ea7ef91f5ecb59fc3c1ab8ed9eddcc0841d
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Thu Jun 23 17:28:16 2016 +0900

    Make the dedicated scanout mechanism work with arbitrary transforms v2
    
    This makes TearFree work with arbitrary transforms, and makes transforms
    work better even without TearFree, with xserver >= 1.12.
    
    v2: Preserve clamping of transformed damage extents to CRTC boundaries.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
index b34a223..33dd903 100644
--- a/src/amdgpu_kms.c
+++ b/src/amdgpu_kms.c
@@ -256,19 +256,16 @@ static Bool
 amdgpu_scanout_extents_intersect(xf86CrtcPtr xf86_crtc, BoxPtr extents, int w,
 				 int h)
 {
-	extents->x1 = max(extents->x1 - xf86_crtc->x, 0);
-	extents->y1 = max(extents->y1 - xf86_crtc->y, 0);
-
-	switch (xf86_crtc->rotation & 0xf) {
-	case RR_Rotate_90:
-	case RR_Rotate_270:
-		extents->x2 = min(extents->x2 - xf86_crtc->x, h);
-		extents->y2 = min(extents->y2 - xf86_crtc->y, w);
-		break;
-	default:
-		extents->x2 = min(extents->x2 - xf86_crtc->x, w);
-		extents->y2 = min(extents->y2 - xf86_crtc->y, h);
-	}
+	extents->x1 -= xf86_crtc->filter_width >> 1;
+	extents->x2 += xf86_crtc->filter_width >> 1;
+	extents->y1 -= xf86_crtc->filter_height >> 1;
+	extents->y2 += xf86_crtc->filter_height >> 1;
+	pixman_f_transform_bounds(&xf86_crtc->f_framebuffer_to_crtc, extents);
+
+	extents->x1 = max(extents->x1, 0);
+	extents->y1 = max(extents->y1, 0);
+	extents->x2 = min(extents->x2, w);
+	extents->y2 = min(extents->y2, h);
 
 	return (extents->x1 < extents->x2 && extents->y1 < extents->y2);
 }
@@ -340,12 +337,6 @@ amdgpu_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id)
 			SetPicturePictFilter(src, xf86_crtc->filter, xf86_crtc->params,
 					     xf86_crtc->nparams);
 
-		extents.x1 += xf86_crtc->x - (xf86_crtc->filter_width >> 1);
-		extents.x2 += xf86_crtc->x + (xf86_crtc->filter_width >> 1);
-		extents.y1 += xf86_crtc->y - (xf86_crtc->filter_height >> 1);
-		extents.y2 += xf86_crtc->y + (xf86_crtc->filter_height >> 1);
-		pixman_f_transform_bounds(&xf86_crtc->f_framebuffer_to_crtc, &extents);
-
 		pScreen->SourceValidate = NULL;
 		CompositePicture(PictOpSrc,
 				 src, NULL, dst,
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 5bddfd0..f5d73c4 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -606,15 +606,15 @@ drmmode_handle_transform(xf86CrtcPtr crtc)
 	Bool ret;
 
 #if XF86_CRTC_VERSION >= 7
-	if (!crtc->transformPresent && crtc->rotation != RR_Rotate_0)
+	if (crtc->transformPresent || crtc->rotation != RR_Rotate_0)
 	    crtc->driverIsPerformingTransform = XF86DriverTransformOutput;
 	else
 	    crtc->driverIsPerformingTransform = XF86DriverTransformNone;
 #else
 	AMDGPUInfoPtr info = AMDGPUPTR(crtc->scrn);
 
-	crtc->driverIsPerformingTransform = info->tear_free &&
-		!crtc->transformPresent && crtc->rotation != RR_Rotate_0;
+	crtc->driverIsPerformingTransform = crtc->transformPresent ||
+		(info->tear_free && crtc->rotation != RR_Rotate_0);
 #endif
 
 	ret = xf86CrtcRotate(crtc);
@@ -730,19 +730,10 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 					RegionUninit(pRegion);
 					pRegion->data = NULL;
 					pBox = RegionExtents(pRegion);
-					pBox->x1 = min(pBox->x1, x);
-					pBox->y1 = min(pBox->y1, y);
-
-					switch (crtc->rotation & 0xf) {
-					case RR_Rotate_90:
-					case RR_Rotate_270:
-						pBox->x2 = max(pBox->x2, x + mode->VDisplay);
-						pBox->y2 = max(pBox->y2, y + mode->HDisplay);
-						break;
-					default:
-						pBox->x2 = max(pBox->x2, x + mode->HDisplay);
-						pBox->y2 = max(pBox->y2, y + mode->VDisplay);
-					}
+					pBox->x1 = 0;
+					pBox->y1 = 0;
+					pBox->x2 = max(pBox->x2, pScrn->virtualX);
+					pBox->y2 = max(pBox->y2, pScrn->virtualY);
 				}
 			}
 


More information about the xorg-commit mailing list