xf86-video-intel: 4 commits - src/sna/kgem.c src/sna/kgem.h src/sna/sna_accel.c src/sna/sna_driver.c src/sna/sna.h

Chris Wilson ickle at kemper.freedesktop.org
Mon Oct 31 02:23:15 PDT 2011


 src/sna/kgem.c       |   24 ++++++++++------
 src/sna/kgem.h       |    2 -
 src/sna/sna.h        |    4 ++
 src/sna/sna_accel.c  |   76 ++++++++++++++++++++++++++++++++++++---------------
 src/sna/sna_driver.c |    5 +++
 5 files changed, 81 insertions(+), 30 deletions(-)

New commits:
commit 9c399c74adc5e5bc7d425382a74d84315d2cef02
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Oct 31 09:20:54 2011 +0000

    sna: Add an option to disable the delayed flush
    
    Section "Device"
      Option "DelayedFlush" "False"
    EndSection
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index ae161a2..4ed3fb8 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -192,6 +192,8 @@ enum {
 	OPTION_RELAXED_FENCING,
 	OPTION_VMAP,
 	OPTION_ZAPHOD,
+	OPTION_DELAYED_FLUSH,
+	NUM_OPTIONS
 };
 
 enum {
@@ -205,6 +207,7 @@ struct sna {
 
 	unsigned flags;
 #define SNA_NO_THROTTLE		0x1
+#define SNA_NO_DELAYED_FLUSH	0x2
 
 	int timer[NUM_TIMERS];
 	int timer_active;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 0b04db8..f6095b5 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -5995,6 +5995,9 @@ static Bool sna_accel_do_flush(struct sna *sna)
 		return FALSE;
 	}
 
+	if (sna->flags & SNA_NO_DELAYED_FLUSH)
+		return TRUE;
+
 	if (sna->timer[FLUSH_TIMER] == -1)
 		return TRUE;
 
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 3e3f65c..46ca5ce 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -91,6 +91,7 @@ static OptionInfoRec sna_options[] = {
    {OPTION_RELAXED_FENCING,	"UseRelaxedFencing",	OPTV_BOOLEAN,	{0},	TRUE},
    {OPTION_VMAP,	"UseVmap",	OPTV_BOOLEAN,	{0},	TRUE},
    {OPTION_ZAPHOD,	"ZaphodHeads",	OPTV_STRING,	{0},	FALSE},
+   {OPTION_DELAYED_FLUSH,	"DelayedFlush",	OPTV_BOOLEAN,	{0},	TRUE},
    {-1,			NULL,		OPTV_NONE,	{0},	FALSE}
 };
 
@@ -506,6 +507,8 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 	sna->flags = 0;
 	if (!xf86ReturnOptValBool(sna->Options, OPTION_THROTTLE, TRUE))
 		sna->flags |= SNA_NO_THROTTLE;
+	if (!xf86ReturnOptValBool(sna->Options, OPTION_DELAYED_FLUSH, TRUE))
+		sna->flags |= SNA_NO_DELAYED_FLUSH;
 
 	xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "Framebuffer %s\n",
 		   sna->tiling & SNA_TILING_FB ? "tiled" : "linear");
@@ -515,6 +518,8 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 		   sna->tiling & SNA_TILING_3D ? "tiled" : "linear");
 	xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "Throttling %sabled\n",
 		   sna->flags & SNA_NO_THROTTLE ? "dis" : "en");
+	xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "Delayed flush %sabled\n",
+		   sna->flags & SNA_NO_DELAYED_FLUSH ? "dis" : "en");
 
 	if (!sna_mode_pre_init(scrn, sna)) {
 		PreInitCleanup(scrn);
commit c8860ce26eaa8f9e876af2354d61c35338076ac8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Oct 30 23:25:48 2011 +0000

    sna: Report whether anything was retired to the inactive list
    
    So that we can skip a fresh search of the inactive list if nothing
    changed.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 86cde01..60ae5ca 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -586,9 +586,10 @@ static void kgem_bo_unref(struct kgem *kgem, struct kgem_bo *bo)
 		__kgem_bo_destroy(kgem, bo);
 }
 
-void kgem_retire(struct kgem *kgem)
+bool kgem_retire(struct kgem *kgem)
 {
 	struct kgem_bo *bo, *next;
+	bool retired = false;
 
 	DBG(("%s\n", __FUNCTION__));
 
@@ -602,6 +603,7 @@ void kgem_retire(struct kgem *kgem)
 		bo->gpu = false;
 		list_move(&bo->list, inactive(kgem, bo->size));
 		list_del(&bo->request);
+		retired = true;
 	}
 
 	while (!list_is_empty(&kgem->requests)) {
@@ -641,6 +643,7 @@ void kgem_retire(struct kgem *kgem)
 					     __FUNCTION__, bo->handle));
 					list_move(&bo->list,
 						  inactive(kgem, bo->size));
+					retired = true;
 				} else {
 					DBG(("%s: closing %d\n",
 					     __FUNCTION__, bo->handle));
@@ -657,6 +660,7 @@ void kgem_retire(struct kgem *kgem)
 			assert(rq->bo->gpu == 0);
 			list_move(&rq->bo->list,
 				  inactive(kgem, rq->bo->size));
+			retired = true;
 		} else {
 			kgem->need_purge = 1;
 			gem_close(kgem->fd, rq->bo->handle);
@@ -669,6 +673,8 @@ void kgem_retire(struct kgem *kgem)
 
 	if (kgem->ring && list_is_empty(&kgem->requests))
 		kgem->ring = kgem->mode;
+
+	return retired;
 }
 
 static void kgem_commit(struct kgem *kgem)
@@ -1269,10 +1275,11 @@ struct kgem_bo *kgem_create_linear(struct kgem *kgem, int size)
 		return kgem_bo_reference(bo);
 
 	if (!list_is_empty(&kgem->requests)) {
-		kgem_retire(kgem);
-		bo = search_linear_cache(kgem, size, false);
-		if (bo)
-			return kgem_bo_reference(bo);
+		if (kgem_retire(kgem)) {
+			bo = search_linear_cache(kgem, size, false);
+			if (bo)
+				return kgem_bo_reference(bo);
+		}
 	}
 
 	handle = gem_create(kgem->fd, size);
@@ -1547,9 +1554,10 @@ next_bo:
 	}
 
 	if (flags & CREATE_INACTIVE && !list_is_empty(&kgem->requests)) {
-		kgem_retire(kgem);
-		flags &= ~CREATE_INACTIVE;
-		goto skip_active_search;
+		if (kgem_retire(kgem)) {
+			flags &= ~CREATE_INACTIVE;
+			goto skip_active_search;
+		}
 	}
 
 	handle = gem_create(kgem->fd, size);
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index eb89c63..377670e 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -171,7 +171,7 @@ struct kgem_bo *kgem_create_2d(struct kgem *kgem,
 			       int tiling,
 			       uint32_t flags);
 
-void kgem_retire(struct kgem *kgem);
+bool kgem_retire(struct kgem *kgem);
 
 void _kgem_submit(struct kgem *kgem);
 static inline void kgem_submit(struct kgem *kgem)
commit a7adcc8e47ba550e7c36a6543a6e0d99040c7354
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Oct 30 21:19:35 2011 +0000

    sna: Stash the last scratch pixmap
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 1bb81d0..ae161a2 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -213,6 +213,7 @@ struct sna {
 	struct list dirty_pixmaps;
 
 	PixmapPtr front, shadow;
+	PixmapPtr freed_pixmap;
 
 	struct sna_mode {
 		uint32_t fb_id;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index c0c72ee..0b04db8 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -135,8 +135,16 @@ static Bool sna_destroy_private(PixmapPtr pixmap, struct sna_pixmap *priv)
 		kgem_bo_destroy(&sna->kgem, priv->cpu_bo);
 	}
 
+	if (!sna->freed_pixmap) {
+		sna->freed_pixmap = pixmap;
+		priv->gpu_bo = NULL;
+		priv->cpu_bo = NULL;
+		priv->mapped = 0;
+		return false;
+	}
+
 	free(priv);
-	return TRUE;
+	return true;
 }
 
 static uint32_t sna_pixmap_choose_tiling(PixmapPtr pixmap)
@@ -228,15 +236,25 @@ sna_pixmap_create_scratch(ScreenPtr screen,
 				      CREATE_PIXMAP_USAGE_SCRATCH);
 
 	/* you promise never to access this via the cpu... */
-	pixmap = fbCreatePixmap(screen, 0, 0, depth,
-				CREATE_PIXMAP_USAGE_SCRATCH);
-	if (!pixmap)
-		return NullPixmap;
-
-	priv = _sna_pixmap_attach(pixmap);
-	if (!priv) {
-		fbDestroyPixmap(pixmap);
-		return NullPixmap;
+	if (sna->freed_pixmap) {
+		pixmap = sna->freed_pixmap;
+		sna->freed_pixmap = NULL;
+
+		priv = sna_pixmap(pixmap);
+		memset(priv, 0, sizeof(*priv));
+		list_init(&priv->list);
+		priv->pixmap = pixmap;
+	} else {
+		pixmap = fbCreatePixmap(screen, 0, 0, depth,
+					CREATE_PIXMAP_USAGE_SCRATCH);
+		if (!pixmap)
+			return NullPixmap;
+
+		priv = _sna_pixmap_attach(pixmap);
+		if (!priv) {
+			fbDestroyPixmap(pixmap);
+			return NullPixmap;
+		}
 	}
 
 	priv->gpu_bo = kgem_create_2d(&sna->kgem,
@@ -753,15 +771,22 @@ sna_pixmap_create_upload(ScreenPtr screen,
 		return fbCreatePixmap(screen, width, height, depth,
 				      CREATE_PIXMAP_USAGE_SCRATCH);
 
-	pixmap = fbCreatePixmap(screen, 0, 0, depth,
-				CREATE_PIXMAP_USAGE_SCRATCH);
-	if (!pixmap)
-		return NullPixmap;
+	if (sna->freed_pixmap) {
+		pixmap = sna->freed_pixmap;
+		sna->freed_pixmap = NULL;
 
-	priv = malloc(sizeof(*priv));
-	if (!priv) {
-		fbDestroyPixmap(pixmap);
-		return NullPixmap;
+		priv = sna_pixmap(pixmap);
+	} else {
+		pixmap = fbCreatePixmap(screen, 0, 0, depth,
+					CREATE_PIXMAP_USAGE_SCRATCH);
+		if (!pixmap)
+			return NullPixmap;
+
+		priv = malloc(sizeof(*priv));
+		if (!priv) {
+			fbDestroyPixmap(pixmap);
+			return NullPixmap;
+		}
 	}
 
 	priv->gpu_bo = kgem_create_buffer(&sna->kgem,
@@ -6175,6 +6200,12 @@ Bool sna_accel_create(struct sna *sna)
 
 void sna_accel_close(struct sna *sna)
 {
+	if (sna->freed_pixmap) {
+		assert(sna->freed_pixmap->refcnt == 1);
+		sna_destroy_pixmap(sna->freed_pixmap);
+		sna->freed_pixmap = NULL;
+	}
+
 	sna_glyphs_close(sna);
 	sna_gradients_close(sna);
 
commit c8d4f5d32af94f712cc81ff495b19907261759ea
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Oct 30 21:21:25 2011 +0000

    sna: Correct PolyRectangle verticals to be the end-point not the length
    
    Fixes an off-by-one in the drawing of the rectangles caused by a
    too-literal translation of the rectangles into boxes.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 6f0275b..c0c72ee 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4284,7 +4284,7 @@ zero:
 			b[1].y2 += rr.height;
 
 			b[2].y1 = rr.y + 1;
-			b[2].y2 = rr.y + rr.height - 1;
+			b[2].y2 = rr.y + rr.height;
 			b[2].x1 = rr.x;
 			b[2].x2 = rr.x + 1;
 
@@ -4334,7 +4334,7 @@ zero_clipped:
 					box[1].y2 += rr.height;
 
 					box[2].y1 = rr.y + 1;
-					box[2].y2 = box[2].y1 + rr.height - 1;
+					box[2].y2 = box[2].y1 + rr.height;
 					box[2].x1 = rr.x;
 					box[2].x2 = rr.x + 1;
 
@@ -4392,7 +4392,7 @@ zero_clipped:
 					box[1].y2 += rr.height;
 
 					box[2].y1 = rr.y + 1;
-					box[2].y2 = box[2].y1 + rr.height - 1;
+					box[2].y2 = box[2].y1 + rr.height;
 					box[2].x1 = rr.x;
 					box[2].x2 = rr.x + 1;
 


More information about the xorg-commit mailing list