xf86-video-intel: 3 commits - src/sna/sna_accel.c src/sna/sna_dri.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Jan 30 00:46:48 PST 2013


 src/sna/sna_accel.c |   36 ++++++++++++++++++++----------------
 src/sna/sna_dri.c   |    6 ++++++
 2 files changed, 26 insertions(+), 16 deletions(-)

New commits:
commit de28027ffc649920268ae6fdd64146f08310e8a4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jan 30 08:42:48 2013 +0000

    sna/dri: Make sure we discard the existing mappings when swapping GPU bo
    
    If the GPU bo is currently mapped to the Pixmap, we need to be sure to
    invalidate that mapping if we swap the GPU bo (for SwapBuffers). If we
    forget, we leave a dangling pointer to chase.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=60042
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 15b87dd..e33cd78 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -498,6 +498,12 @@ static void set_bo(PixmapPtr pixmap, struct kgem_bo *bo)
 	if (priv->gpu_bo != bo) {
 		kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
 		priv->gpu_bo = ref(bo);
+		if (priv->mapped) {
+			assert(!priv->shm && priv->stride);
+			pixmap->devPrivate.ptr = PTR(priv->ptr);
+			pixmap->devKind = priv->stride;
+			priv->mapped = false;
+		}
 	}
 	if (bo->domain != DOMAIN_GPU)
 		bo->domain = DOMAIN_NONE;
commit cf9b9ac3186299ab2418c55e73e19c81e5f615a4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jan 30 08:40:53 2013 +0000

    sna: Only discard the mapping prior to the actual read when uploading
    
    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 862bc2f..d7c639a 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3105,13 +3105,6 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 	if (priv->cpu_damage == NULL)
 		goto done;
 
-	if (priv->mapped) {
-		assert(priv->stride && priv->stride);
-		pixmap->devPrivate.ptr = PTR(priv->ptr);
-		pixmap->devKind = priv->stride;
-		priv->mapped = false;
-	}
-
 	if (priv->shm) {
 		assert(!priv->flush);
 		sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
@@ -3133,7 +3126,12 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 						    box, n, 0);
 		}
 		if (!ok) {
-			assert(!priv->mapped);
+			if (priv->mapped) {
+				assert(priv->stride && priv->stride);
+				pixmap->devPrivate.ptr = PTR(priv->ptr);
+				pixmap->devKind = priv->stride;
+				priv->mapped = false;
+			}
 			if (pixmap->devPrivate.ptr == NULL) {
 				assert(priv->ptr && priv->stride);
 				pixmap->devPrivate.ptr = PTR(priv->ptr);
commit a66c5f9ed51e1dcfc2ab03339795b73617629196
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jan 30 08:22:00 2013 +0000

    sna: Before replacing the devPrivate.ptr assert it is not already mapped
    
    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 7525c4f..862bc2f 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -463,6 +463,7 @@ sna_pixmap_alloc_cpu(struct sna *sna,
 	assert(priv->ptr);
 done:
 	assert(priv->stride);
+	assert(!priv->mapped);
 	pixmap->devPrivate.ptr = PTR(priv->ptr);
 	pixmap->devKind = priv->stride;
 	return priv->ptr != NULL;
@@ -1018,6 +1019,7 @@ sna_share_pixmap_backing(PixmapPtr pixmap, ScreenPtr slave, void **fd_handle)
 	assert((priv->gpu_bo->pitch & 255) == 0);
 
 	/* And export the bo->pitch via pixmap->devKind */
+	assert(!priv->mapped);
 	pixmap->devPrivate.ptr = kgem_bo_map__async(&sna->kgem, priv->gpu_bo);
 	if (pixmap->devPrivate.ptr == NULL)
 		return FALSE;
@@ -1121,6 +1123,7 @@ sna_create_pixmap_shared(struct sna *sna, ScreenPtr screen,
 		assert(priv->gpu_bo->tiling == I915_TILING_NONE);
 		assert((priv->gpu_bo->pitch & 255) == 0);
 
+		assert(!priv->mapped);
 		pixmap->devPrivate.ptr =
 			kgem_bo_map__async(&sna->kgem, priv->gpu_bo);
 		if (pixmap->devPrivate.ptr == NULL) {
@@ -1578,6 +1581,7 @@ skip_inplace_map:
 		DBG(("%s: try to operate inplace (GTT)\n", __FUNCTION__));
 		assert(priv->cpu == false);
 
+		assert(!priv->mapped);
 		pixmap->devPrivate.ptr =
 			kgem_bo_map(&sna->kgem, priv->gpu_bo);
 		if (pixmap->devPrivate.ptr != NULL) {
@@ -1603,7 +1607,7 @@ skip_inplace_map:
 	}
 
 	if (priv->mapped) {
-		assert(!priv->shm);
+		assert(!priv->shm && priv->stride);
 		pixmap->devPrivate.ptr = PTR(priv->ptr);
 		pixmap->devKind = priv->stride;
 		priv->mapped = false;
@@ -1618,6 +1622,7 @@ skip_inplace_map:
 
 		DBG(("%s: try to operate inplace (CPU)\n", __FUNCTION__));
 
+		assert(!priv->mapped);
 		pixmap->devPrivate.ptr =
 			kgem_bo_map__cpu(&sna->kgem, priv->gpu_bo);
 		if (pixmap->devPrivate.ptr != NULL) {
@@ -1934,6 +1939,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 
 		DBG(("%s: try to operate inplace\n", __FUNCTION__));
 
+		assert(!priv->mapped);
 		pixmap->devPrivate.ptr =
 			kgem_bo_map(&sna->kgem, priv->gpu_bo);
 		if (pixmap->devPrivate.ptr != NULL) {
@@ -2463,12 +2469,12 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 							    box, n, 0);
 			}
 			if (!ok) {
+				assert(!priv->mapped);
 				if (pixmap->devPrivate.ptr == NULL) {
-					assert(priv->ptr);
+					assert(priv->ptr && priv->stride);
 					pixmap->devPrivate.ptr = PTR(priv->ptr);
 					pixmap->devKind = priv->stride;
 				}
-				assert(!priv->mapped);
 				if (n == 1 && !priv->pinned &&
 				    box->x1 <= 0 && box->y1 <= 0 &&
 				    box->x2 >= pixmap->drawable.width &&
@@ -2503,12 +2509,12 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 						    box, 1, 0);
 		}
 		if (!ok) {
+			assert(!priv->mapped);
 			if (pixmap->devPrivate.ptr == NULL) {
-				assert(priv->ptr);
+				assert(priv->ptr && priv->stride);
 				pixmap->devPrivate.ptr = PTR(priv->ptr);
 				pixmap->devKind = priv->stride;
 			}
-			assert(!priv->mapped);
 			ok = sna_write_boxes(sna, pixmap,
 					     priv->gpu_bo, 0, 0,
 					     pixmap->devPrivate.ptr,
@@ -2534,12 +2540,12 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 						    box, n, 0);
 		}
 		if (!ok) {
+			assert(!priv->mapped);
 			if (pixmap->devPrivate.ptr == NULL) {
-				assert(priv->ptr);
+				assert(priv->ptr && priv->stride);
 				pixmap->devPrivate.ptr = PTR(priv->ptr);
 				pixmap->devKind = priv->stride;
 			}
-			assert(!priv->mapped);
 			ok = sna_write_boxes(sna, pixmap,
 					     priv->gpu_bo, 0, 0,
 					     pixmap->devPrivate.ptr,
@@ -3100,7 +3106,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 		goto done;
 
 	if (priv->mapped) {
-		assert(priv->stride);
+		assert(priv->stride && priv->stride);
 		pixmap->devPrivate.ptr = PTR(priv->ptr);
 		pixmap->devKind = priv->stride;
 		priv->mapped = false;
@@ -3127,12 +3133,12 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 						    box, n, 0);
 		}
 		if (!ok) {
+			assert(!priv->mapped);
 			if (pixmap->devPrivate.ptr == NULL) {
-				assert(priv->ptr);
+				assert(priv->ptr && priv->stride);
 				pixmap->devPrivate.ptr = PTR(priv->ptr);
 				pixmap->devKind = priv->stride;
 			}
-			assert(!priv->mapped);
 			if (n == 1 && !priv->pinned &&
 			    (box->x2 - box->x1) >= pixmap->drawable.width &&
 			    (box->y2 - box->y1) >= pixmap->drawable.height) {


More information about the xorg-commit mailing list