xf86-video-intel: 3 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/sna_accel.c src/sna/sna.h

Chris Wilson ickle at kemper.freedesktop.org
Thu Dec 22 16:46:38 PST 2011


 src/sna/gen2_render.c |   60 ++++++++++++++++++++++++++++++++++++-------
 src/sna/gen3_render.c |   69 +++++++++++++++++++++++++++++++++++++++-----------
 src/sna/gen4_render.c |   65 ++++++++++++++++++++++++++++++++++++++---------
 src/sna/gen5_render.c |   67 +++++++++++++++++++++++++++++++++++++++---------
 src/sna/gen6_render.c |   63 +++++++++++++++++++++++++++++++++++++--------
 src/sna/gen7_render.c |   63 +++++++++++++++++++++++++++++++++++++--------
 src/sna/sna.h         |   27 ++++++++++++++++++-
 src/sna/sna_accel.c   |   33 +++++++++++++----------
 8 files changed, 360 insertions(+), 87 deletions(-)

New commits:
commit 84d97bdba02b909369b54de21425ffc9f6ad581a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Dec 23 00:01:50 2011 +0000

    sna/gen2+: Reuse source channel for mask where possible
    
    GTK+ has a clever trick for premultiplying its images by loading the
    same pixel data into both the source and mask, and then performing the
    composite. This causes us to upload the same pixel data twice!
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 519ba18..f1fdfd6 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1401,6 +1401,42 @@ gen2_composite_fallback(struct sna *sna,
 	return FALSE;
 }
 
+static int
+reuse_source(struct sna *sna,
+	     PicturePtr src, struct sna_composite_channel *sc, int src_x, int src_y,
+	     PicturePtr mask, struct sna_composite_channel *mc, int msk_x, int msk_y)
+{
+	if (src->pDrawable == NULL || mask->pDrawable != src->pDrawable)
+		return FALSE;
+
+	DBG(("%s: mask reuses source drawable\n", __FUNCTION__));
+
+	if (src_x != msk_x || src_y != msk_y)
+		return FALSE;
+
+	if (!sna_transform_equal(src->transform, mask->transform))
+		return FALSE;
+
+	if (!sna_picture_alphamap_equal(src, mask))
+		return FALSE;
+
+	if (!gen2_check_repeat(mask))
+		return FALSE;
+
+	if (!gen2_check_filter(mask))
+		return FALSE;
+
+	DBG(("%s: reusing source channel for mask with a twist\n",
+	     __FUNCTION__));
+
+	*mc = *sc;
+	mc->repeat = mask->repeat ? mask->repeatType : RepeatNone;
+	mc->filter = mask->filter;
+	mc->pict_format = mask->format;
+	mc->bo = kgem_bo_reference(mc->bo);
+	return TRUE;
+}
+
 static Bool
 gen2_render_composite(struct sna *sna,
 		      uint8_t op,
@@ -1493,16 +1529,20 @@ gen2_render_composite(struct sna *sna,
 	}
 
 	if (mask) {
-		switch (gen2_composite_picture(sna, mask, &tmp->mask,
-					       mask_x, mask_y,
-					       width,  height,
-					       dst_x,  dst_y)) {
-		case -1:
-			goto cleanup_src;
-		case 0:
-			gen2_composite_solid_init(sna, &tmp->mask, 0);
-		case 1:
-			break;
+		if (!reuse_source(sna,
+				  src, &tmp->src, src_x, src_y,
+				  mask, &tmp->mask, mask_x, mask_y)) {
+			switch (gen2_composite_picture(sna, mask, &tmp->mask,
+						       mask_x, mask_y,
+						       width,  height,
+						       dst_x,  dst_y)) {
+			case -1:
+				goto cleanup_src;
+			case 0:
+				gen2_composite_solid_init(sna, &tmp->mask, 0);
+			case 1:
+				break;
+			}
 		}
 
 		if (mask->componentAlpha && PICT_FORMAT_RGB(mask->format)) {
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 12eebaa..5833c1f 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2394,6 +2394,43 @@ gen3_composite_fallback(struct sna *sna,
 	return FALSE;
 }
 
+static int
+reuse_source(struct sna *sna,
+	     PicturePtr src, struct sna_composite_channel *sc, int src_x, int src_y,
+	     PicturePtr mask, struct sna_composite_channel *mc, int msk_x, int msk_y)
+{
+	if (src->pDrawable == NULL || mask->pDrawable != src->pDrawable)
+		return FALSE;
+
+	DBG(("%s: mask reuses source drawable\n", __FUNCTION__));
+
+	if (src_x != msk_x || src_y != msk_y)
+		return FALSE;
+
+	if (!sna_transform_equal(src->transform, mask->transform))
+		return FALSE;
+
+	if (!sna_picture_alphamap_equal(src, mask))
+		return FALSE;
+
+	if (!gen3_check_repeat(mask))
+		return FALSE;
+
+	if (!gen3_check_filter(mask->filter))
+		return FALSE;
+
+	DBG(("%s: reusing source channel for mask with a twist\n",
+	     __FUNCTION__));
+
+	*mc = *sc;
+	mc->repeat = gen3_texture_repeat(mask->repeat ? mask->repeatType : RepeatNone);
+	mc->filter = gen3_filter(mask->filter);
+	mc->pict_format = mask->format;
+	gen3_composite_channel_set_format(mc, mask->format);
+	mc->bo = kgem_bo_reference(mc->bo);
+	return TRUE;
+}
+
 static Bool
 gen3_render_composite(struct sna *sna,
 		      uint8_t op,
@@ -2499,20 +2536,24 @@ gen3_render_composite(struct sna *sna,
 	tmp->need_magic_ca_pass = FALSE;
 	tmp->has_component_alpha = FALSE;
 	if (mask && tmp->src.u.gen3.type != SHADER_ZERO) {
-		tmp->mask.u.gen3.type = SHADER_TEXTURE;
-		DBG(("%s: preparing mask\n", __FUNCTION__));
-		switch (gen3_composite_picture(sna, mask, tmp, &tmp->mask,
-					       mask_x, mask_y,
-					       width,  height,
-					       dst_x,  dst_y)) {
-		case -1:
-			goto cleanup_src;
-		case 0:
-			tmp->mask.u.gen3.type = SHADER_ZERO;
-			break;
-		case 1:
-			gen3_composite_channel_convert(&tmp->mask);
-			break;
+		if (!reuse_source(sna,
+				  src, &tmp->src, src_x, src_y,
+				  mask, &tmp->mask, mask_x, mask_y)) {
+			tmp->mask.u.gen3.type = SHADER_TEXTURE;
+			DBG(("%s: preparing mask\n", __FUNCTION__));
+			switch (gen3_composite_picture(sna, mask, tmp, &tmp->mask,
+						       mask_x, mask_y,
+						       width,  height,
+						       dst_x,  dst_y)) {
+			case -1:
+				goto cleanup_src;
+			case 0:
+				tmp->mask.u.gen3.type = SHADER_ZERO;
+				break;
+			case 1:
+				gen3_composite_channel_convert(&tmp->mask);
+				break;
+			}
 		}
 		DBG(("%s: mask type=%d\n", __FUNCTION__, tmp->mask.u.gen3.type));
 
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 6ccddd2..9f15b3c 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2008,6 +2008,43 @@ gen4_composite_fallback(struct sna *sna,
 	return FALSE;
 }
 
+static int
+reuse_source(struct sna *sna,
+	     PicturePtr src, struct sna_composite_channel *sc, int src_x, int src_y,
+	     PicturePtr mask, struct sna_composite_channel *mc, int msk_x, int msk_y)
+{
+	if (src->pDrawable == NULL || mask->pDrawable != src->pDrawable)
+		return FALSE;
+
+	DBG(("%s: mask reuses source drawable\n", __FUNCTION__));
+
+	if (src_x != msk_x || src_y != msk_y)
+		return FALSE;
+
+	if (!sna_transform_equal(src->transform, mask->transform))
+		return FALSE;
+
+	if (!sna_picture_alphamap_equal(src, mask))
+		return FALSE;
+
+	if (!gen4_check_repeat(mask))
+		return FALSE;
+
+	if (!gen4_check_filter(mask))
+		return FALSE;
+
+	DBG(("%s: reusing source channel for mask with a twist\n",
+	     __FUNCTION__));
+
+	*mc = *sc;
+	mc->repeat = gen4_repeat(mask->repeat ? mask->repeatType : RepeatNone);
+	mc->filter = gen4_filter(mask->filter);
+	mc->pict_format = mask->format;
+	mc->card_format = gen4_get_card_format(mask->format);
+	mc->bo = kgem_bo_reference(mc->bo);
+	return TRUE;
+}
+
 static Bool
 gen4_render_composite(struct sna *sna,
 		      uint8_t op,
@@ -2109,18 +2146,22 @@ gen4_render_composite(struct sna *sna,
 			}
 		}
 
-		switch (gen4_composite_picture(sna, mask, &tmp->mask,
-					       msk_x, msk_y,
-					       width, height,
-					       dst_x, dst_y)) {
-		case -1:
-			DBG(("%s: failed to prepare mask\n", __FUNCTION__));
-			goto cleanup_src;
-		case 0:
-			gen4_composite_solid_init(sna, &tmp->mask, 0);
-		case 1:
-			gen4_composite_channel_convert(&tmp->mask);
-			break;
+		if (!reuse_source(sna,
+				  src, &tmp->src, src_x, src_y,
+				  mask, &tmp->mask, msk_x, msk_y)) {
+			switch (gen4_composite_picture(sna, mask, &tmp->mask,
+						       msk_x, msk_y,
+						       width, height,
+						       dst_x, dst_y)) {
+			case -1:
+				DBG(("%s: failed to prepare mask\n", __FUNCTION__));
+				goto cleanup_src;
+			case 0:
+				gen4_composite_solid_init(sna, &tmp->mask, 0);
+			case 1:
+				gen4_composite_channel_convert(&tmp->mask);
+				break;
+			}
 		}
 
 		tmp->is_affine &= tmp->mask.is_affine;
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 180b561..0b42272 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2050,6 +2050,43 @@ gen5_composite_fallback(struct sna *sna,
 	return FALSE;
 }
 
+static int
+reuse_source(struct sna *sna,
+	     PicturePtr src, struct sna_composite_channel *sc, int src_x, int src_y,
+	     PicturePtr mask, struct sna_composite_channel *mc, int msk_x, int msk_y)
+{
+	if (src->pDrawable == NULL || mask->pDrawable != src->pDrawable)
+		return FALSE;
+
+	DBG(("%s: mask reuses source drawable\n", __FUNCTION__));
+
+	if (src_x != msk_x || src_y != msk_y)
+		return FALSE;
+
+	if (!sna_transform_equal(src->transform, mask->transform))
+		return FALSE;
+
+	if (!sna_picture_alphamap_equal(src, mask))
+		return FALSE;
+
+	if (!gen5_check_repeat(mask))
+		return FALSE;
+
+	if (!gen5_check_filter(mask))
+		return FALSE;
+
+	DBG(("%s: reusing source channel for mask with a twist\n",
+	     __FUNCTION__));
+
+	*mc = *sc;
+	mc->repeat = gen5_repeat(mask->repeat ? mask->repeatType : RepeatNone);
+	mc->filter = gen5_filter(mask->filter);
+	mc->pict_format = mask->format;
+	mc->card_format = gen5_get_card_format(mask->format);
+	mc->bo = kgem_bo_reference(mc->bo);
+	return TRUE;
+}
+
 static Bool
 gen5_render_composite(struct sna *sna,
 		      uint8_t op,
@@ -2152,19 +2189,23 @@ gen5_render_composite(struct sna *sna,
 			}
 		}
 
-		DBG(("%s: preparing mask\n", __FUNCTION__));
-		switch (gen5_composite_picture(sna, mask, &tmp->mask,
-					       msk_x, msk_y,
-					       width, height,
-					       dst_x, dst_y)) {
-		case -1:
-			DBG(("%s: failed to prepare mask picture\n", __FUNCTION__));
-			goto cleanup_src;
-		case 0:
-			gen5_composite_solid_init(sna, &tmp->mask, 0);
-		case 1:
-			gen5_composite_channel_convert(&tmp->mask);
-			break;
+		if (!reuse_source(sna,
+				  src, &tmp->src, src_x, src_y,
+				  mask, &tmp->mask, msk_x, msk_y)) {
+			DBG(("%s: preparing mask\n", __FUNCTION__));
+			switch (gen5_composite_picture(sna, mask, &tmp->mask,
+						       msk_x, msk_y,
+						       width, height,
+						       dst_x, dst_y)) {
+			case -1:
+				DBG(("%s: failed to prepare mask picture\n", __FUNCTION__));
+				goto cleanup_src;
+			case 0:
+				gen5_composite_solid_init(sna, &tmp->mask, 0);
+			case 1:
+				gen5_composite_channel_convert(&tmp->mask);
+				break;
+			}
 		}
 
 		tmp->is_affine &= tmp->mask.is_affine;
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 8e7ea15..985bb90 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2225,6 +2225,43 @@ gen6_composite_fallback(struct sna *sna,
 	return FALSE;
 }
 
+static int
+reuse_source(struct sna *sna,
+	     PicturePtr src, struct sna_composite_channel *sc, int src_x, int src_y,
+	     PicturePtr mask, struct sna_composite_channel *mc, int msk_x, int msk_y)
+{
+	if (src->pDrawable == NULL || mask->pDrawable != src->pDrawable)
+		return FALSE;
+
+	DBG(("%s: mask reuses source drawable\n", __FUNCTION__));
+
+	if (src_x != msk_x || src_y != msk_y)
+		return FALSE;
+
+	if (!sna_transform_equal(src->transform, mask->transform))
+		return FALSE;
+
+	if (!sna_picture_alphamap_equal(src, mask))
+		return FALSE;
+
+	if (!gen6_check_repeat(mask))
+		return FALSE;
+
+	if (!gen6_check_filter(mask))
+		return FALSE;
+
+	DBG(("%s: reusing source channel for mask with a twist\n",
+	     __FUNCTION__));
+
+	*mc = *sc;
+	mc->repeat = gen6_repeat(mask->repeat ? mask->repeatType : RepeatNone);
+	mc->filter = gen6_filter(mask->filter);
+	mc->pict_format = mask->format;
+	mc->card_format = gen6_get_card_format(mask->format);
+	mc->bo = kgem_bo_reference(mc->bo);
+	return TRUE;
+}
+
 static Bool
 gen6_render_composite(struct sna *sna,
 		      uint8_t op,
@@ -2347,17 +2384,21 @@ gen6_render_composite(struct sna *sna,
 			}
 		}
 
-		switch (gen6_composite_picture(sna, mask, &tmp->mask,
-					       msk_x, msk_y,
-					       width, height,
-					       dst_x, dst_y)) {
-		case -1:
-			goto cleanup_src;
-		case 0:
-			gen6_composite_solid_init(sna, &tmp->mask, 0);
-		case 1:
-			gen6_composite_channel_convert(&tmp->mask);
-			break;
+		if (!reuse_source(sna,
+				  src, &tmp->src, src_x, src_y,
+				  mask, &tmp->mask, msk_x, msk_y)) {
+			switch (gen6_composite_picture(sna, mask, &tmp->mask,
+						       msk_x, msk_y,
+						       width, height,
+						       dst_x, dst_y)) {
+			case -1:
+				goto cleanup_src;
+			case 0:
+				gen6_composite_solid_init(sna, &tmp->mask, 0);
+			case 1:
+				gen6_composite_channel_convert(&tmp->mask);
+				break;
+			}
 		}
 
 		tmp->is_affine &= tmp->mask.is_affine;
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 58647f7..5eac9bf 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2338,6 +2338,43 @@ gen7_composite_fallback(struct sna *sna,
 	return FALSE;
 }
 
+static int
+reuse_source(struct sna *sna,
+	     PicturePtr src, struct sna_composite_channel *sc, int src_x, int src_y,
+	     PicturePtr mask, struct sna_composite_channel *mc, int msk_x, int msk_y)
+{
+	if (src->pDrawable == NULL || mask->pDrawable != src->pDrawable)
+		return FALSE;
+
+	DBG(("%s: mask reuses source drawable\n", __FUNCTION__));
+
+	if (src_x != msk_x || src_y != msk_y)
+		return FALSE;
+
+	if (!sna_transform_equal(src->transform, mask->transform))
+		return FALSE;
+
+	if (!sna_picture_alphamap_equal(src, mask))
+		return FALSE;
+
+	if (!gen7_check_repeat(mask))
+		return FALSE;
+
+	if (!gen7_check_filter(mask))
+		return FALSE;
+
+	DBG(("%s: reusing source channel for mask with a twist\n",
+	     __FUNCTION__));
+
+	*mc = *sc;
+	mc->repeat = gen7_repeat(mask->repeat ? mask->repeatType : RepeatNone);
+	mc->filter = gen7_filter(mask->filter);
+	mc->pict_format = mask->format;
+	mc->card_format = gen7_get_card_format(mask->format);
+	mc->bo = kgem_bo_reference(mc->bo);
+	return TRUE;
+}
+
 static Bool
 gen7_render_composite(struct sna *sna,
 		      uint8_t op,
@@ -2460,17 +2497,21 @@ gen7_render_composite(struct sna *sna,
 			}
 		}
 
-		switch (gen7_composite_picture(sna, mask, &tmp->mask,
-					       msk_x, msk_y,
-					       width, height,
-					       dst_x, dst_y)) {
-		case -1:
-			goto cleanup_src;
-		case 0:
-			gen7_composite_solid_init(sna, &tmp->mask, 0);
-		case 1:
-			gen7_composite_channel_convert(&tmp->mask);
-			break;
+		if (!reuse_source(sna,
+				  src, &tmp->src, src_x, src_y,
+				  mask, &tmp->mask, msk_x, msk_y)) {
+			switch (gen7_composite_picture(sna, mask, &tmp->mask,
+						       msk_x, msk_y,
+						       width, height,
+						       dst_x, dst_y)) {
+			case -1:
+				goto cleanup_src;
+			case 0:
+				gen7_composite_solid_init(sna, &tmp->mask, 0);
+			case 1:
+				gen7_composite_channel_convert(&tmp->mask);
+				break;
+			}
 		}
 
 		tmp->is_affine &= tmp->mask.is_affine;
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 1fa3122..1ee4da2 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -507,7 +507,7 @@ _sna_get_transformed_coordinates(int x, int y,
 
 void
 sna_get_transformed_coordinates(int x, int y,
-			       	const PictTransform *transform,
+				const PictTransform *transform,
 				float *x_out, float *y_out);
 
 Bool
@@ -521,6 +521,31 @@ Bool sna_transform_is_integer_translation(const PictTransform *t,
 Bool sna_transform_is_translation(const PictTransform *t,
 				  pixman_fixed_t *tx, pixman_fixed_t *ty);
 
+static inline bool
+sna_transform_equal(const PictTransform *a, const PictTransform *b)
+{
+	if (a == b)
+		return true;
+
+	if (a == NULL || b == NULL)
+		return false;
+
+	return memcmp(a, b, sizeof(*a)) == 0;
+}
+
+static inline bool
+sna_picture_alphamap_equal(PicturePtr a, PicturePtr b)
+{
+	if (a->alphaMap != b->alphaMap)
+		return false;
+
+	if (a->alphaMap)
+		return false;
+
+	return (a->alphaOrigin.x == b->alphaOrigin.x &&
+		a->alphaOrigin.y == b->alphaOrigin.y);
+}
+
 static inline bool wedged(struct sna *sna)
 {
 	return unlikely(sna->kgem.wedged);
commit 281f620573917faef52d9226b12737ce1e2dffdc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Dec 22 22:23:41 2011 +0000

    sna: Age active wholly damaged GPU buffers more slowly
    
    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 b1d1197..910d32e 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -9096,7 +9096,7 @@ sna_pixmap_free_gpu(struct sna *sna, struct sna_pixmap *priv)
 
 static void sna_accel_inactive(struct sna *sna)
 {
-	struct sna_pixmap *priv, *next;
+	struct sna_pixmap *priv;
 	struct list preserve;
 
 	DBG(("%s (time=%ld)\n", __FUNCTION__, (long)GetTimeInMillis()));
@@ -9128,18 +9128,8 @@ static void sna_accel_inactive(struct sna *sna)
 	}
 #endif
 
-	list_init(&preserve);
-	list_for_each_entry_safe(priv, next, &sna->active_pixmaps, inactive) {
-		if (priv->ptr &&
-		    sna_damage_is_all(&priv->gpu_damage,
-				      priv->pixmap->drawable.width,
-				      priv->pixmap->drawable.height)) {
-			sna_pixmap_free_cpu(sna, priv);
-			list_move(&priv->inactive, &preserve);
-		}
-	}
-
 	/* clear out the oldest inactive pixmaps */
+	list_init(&preserve);
 	while (!list_is_empty(&sna->inactive_clock[1])) {
 		priv = list_first_entry(&sna->inactive_clock[1],
 					struct sna_pixmap,
@@ -9149,7 +9139,18 @@ static void sna_accel_inactive(struct sna *sna)
 		 * reap its storage only under memory pressure.
 		 */
 		list_del(&priv->inactive);
-		if (!priv->pinned) {
+		if (priv->pinned)
+			continue;
+
+		if (priv->ptr &&
+		    sna_damage_is_all(&priv->gpu_damage,
+				      priv->pixmap->drawable.width,
+				      priv->pixmap->drawable.height)) {
+			DBG(("%s: discarding inactive CPU shadow\n",
+			     __FUNCTION__));
+			sna_pixmap_free_cpu(sna, priv);
+			list_add(&priv->inactive, &preserve);
+		} else {
 			DBG(("%s: discarding inactive GPU bo handle=%d\n",
 			     __FUNCTION__, priv->gpu_bo->handle));
 			if (!sna_pixmap_free_gpu(sna, priv))
commit f8575b8bd150ae11147fbf6b59171cbbb072dfec
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Dec 22 22:15:42 2011 +0000

    sna: Cancel the immediate batch submit once handled in the block handler
    
    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 8a2ff9a..b1d1197 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -8815,6 +8815,7 @@ sna_accel_flush_callback(CallbackListPtr *list,
 	}
 
 	kgem_submit(&sna->kgem);
+	sna->kgem.flush_now = 0;
 
 	if (sna->kgem.sync) {
 		kgem_sync(&sna->kgem);
@@ -8901,7 +8902,7 @@ static Bool sna_accel_do_flush(struct sna *sna)
 
 	if (sna->kgem.flush_now) {
 		sna->kgem.flush_now = 0;
-		if (priv->gpu_bo->rq != NULL) {
+		if (priv->gpu_bo->exec) {
 			DBG(("%s -- forcing flush\n", __FUNCTION__));
 			sna_accel_drain_timer(sna, FLUSH_TIMER);
 			return TRUE;
@@ -8910,7 +8911,7 @@ static Bool sna_accel_do_flush(struct sna *sna)
 
 	return_if_timer_active(FLUSH_TIMER);
 
-	if (priv->cpu_damage == NULL && priv->gpu_bo->rq == NULL) {
+	if (priv->cpu_damage == NULL && priv->gpu_bo->exec == NULL) {
 		DBG(("%s -- no pending write to scanout\n", __FUNCTION__));
 		return FALSE;
 	}
@@ -9031,6 +9032,7 @@ static bool sna_accel_flush(struct sna *sna)
 		sna_pixmap_move_to_gpu(priv->pixmap);
 	sna->kgem.busy = !nothing_to_do;
 	kgem_bo_flush(&sna->kgem, priv->gpu_bo);
+	sna->kgem.flush_now = 0;
 	return need_throttle;
 }
 


More information about the xorg-commit mailing list