xf86-video-intel: src/sna/sna_accel.c src/sna/sna.h

Chris Wilson ickle at kemper.freedesktop.org
Fri Jun 7 08:11:56 PDT 2013


 src/sna/sna.h       |    2 ++
 src/sna/sna_accel.c |   23 +++++++++++++++++++++--
 2 files changed, 23 insertions(+), 2 deletions(-)

New commits:
commit 7151e437df4437df35a67ae125607e665c66353c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 7 16:09:18 2013 +0100

    sna: Track when we write directly to bo through the GTT
    
    In the future, we may need to explicitly flush GTT writes to the
    scanout, so add the infrastructure to do so now.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 79ac1ad..18573a9 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -140,6 +140,7 @@ struct sna_pixmap {
 	uint8_t clear :1;
 	uint8_t header :1;
 	uint8_t cpu :1;
+	uint8_t gtt_dirty :1;
 };
 
 struct sna_glyph {
@@ -217,6 +218,7 @@ struct sna {
 #define SNA_TRIPLE_BUFFER	0x4
 #define SNA_TEAR_FREE		0x10
 #define SNA_FORCE_SHADOW	0x20
+#define SNA_FLUSH_GTT		0x40
 #define SNA_REPROBE		0x80000000
 
 	unsigned cpu_features;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 42f1fa2..1b16bc5 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1828,6 +1828,7 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int flags)
 			sna_damage_destroy(&priv->cpu_damage);
 			priv->clear = false;
 			priv->cpu = false;
+			priv->gtt_dirty = true;
 			list_del(&priv->flush_list);
 
 			assert(!priv->shm);
@@ -1889,6 +1890,7 @@ skip_inplace_map:
 				sna_pixmap_free_cpu(sna, priv);
 				list_del(&priv->flush_list);
 				priv->clear = false;
+				priv->gtt_dirty = true;
 			}
 			priv->cpu = false;
 
@@ -2279,6 +2281,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 								    region);
 				}
 				priv->clear = false;
+				priv->gtt_dirty = true;
 			}
 			assert_pixmap_damage(pixmap);
 			priv->cpu = false;
@@ -2857,6 +2860,8 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 				}
 				if (!ok)
 					return false;
+
+				priv->gtt_dirty = true;
 			}
 		}
 
@@ -3584,6 +3589,8 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 			}
 			if (!ok)
 				return NULL;
+
+			priv->gtt_dirty = true;
 		}
 	}
 
@@ -14192,6 +14199,9 @@ static bool start_flush(struct sna *sna, struct sna_pixmap *scanout)
 	if (!scanout)
 		return false;
 
+	if (sna->flags & SNA_FLUSH_GTT && scanout->gtt_dirty)
+		return true;
+
 	return scanout->cpu_damage || scanout->gpu_bo->exec;
 }
 
@@ -14213,6 +14223,9 @@ static bool stop_flush(struct sna *sna, struct sna_pixmap *scanout)
 	if (!scanout)
 		return false;
 
+	if (sna->flags & SNA_FLUSH_GTT && scanout->gtt_dirty)
+		return true;
+
 	return scanout->cpu_damage || scanout->gpu_bo->needs_flush;
 }
 
@@ -14225,6 +14238,12 @@ static void timer_enable(struct sna *sna, int whom, int interval)
 	DBG(("%s (time=%ld), starting timer %d\n", __FUNCTION__, (long)TIME, whom));
 }
 
+static void sna_pixmap_flush(struct sna *sna, struct sna_pixmap *priv)
+{
+	kgem_bo_flush(&sna->kgem, priv->gpu_bo);
+	priv->gtt_dirty = false;
+}
+
 static bool sna_accel_do_flush(struct sna *sna)
 {
 	struct sna_pixmap *priv;
@@ -14250,7 +14269,7 @@ static bool sna_accel_do_flush(struct sna *sna)
 	} else if (!start_flush(sna, priv)) {
 		DBG(("%s -- no pending write to scanout\n", __FUNCTION__));
 		if (priv)
-			kgem_bo_flush(&sna->kgem, priv->gpu_bo);
+			sna_pixmap_flush(sna, priv);
 	} else
 		timer_enable(sna, FLUSH_TIMER, interval/2);
 
@@ -14427,7 +14446,7 @@ static void sna_accel_flush(struct sna *sna)
 	if (priv) {
 		sna_pixmap_force_to_gpu(priv->pixmap,
 					MOVE_READ | MOVE_ASYNC_HINT);
-		kgem_bo_flush(&sna->kgem, priv->gpu_bo);
+		sna_pixmap_flush(sna, priv);
 		assert(!priv->cpu);
 	}
 


More information about the xorg-commit mailing list