xf86-video-intel: 2 commits - src/sna/gen6_render.c src/sna/gen7_render.c src/sna/gen8_render.c src/sna/sna_dri2.c src/sna/sna_render.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Aug 19 09:03:22 PDT 2015


 src/sna/gen6_render.c |    3 +--
 src/sna/gen7_render.c |    3 +--
 src/sna/gen8_render.c |    3 +--
 src/sna/sna_dri2.c    |   23 ++++++++++++++++++++++-
 src/sna/sna_render.c  |    4 ++--
 5 files changed, 27 insertions(+), 9 deletions(-)

New commits:
commit 6027bfc461c01838577be052d1a76ffc6906e3cc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 19 16:49:01 2015 +0100

    sna/dri2: Also track the front bo as an active buffer
    
    This so that we permanently exclude the active front buffer from the set
    of triple buffer replacements.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=91658
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index eb5a558..41354e8 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -508,6 +508,8 @@ static struct kgem_bo *sna_pixmap_set_dri(struct sna *sna,
 			sna_pixmap_change_tiling(pixmap, tiling);
 	}
 
+	priv->gpu_bo->active_scanout++;
+
 	return priv->gpu_bo;
 }
 
@@ -857,6 +859,9 @@ static void _sna_dri2_destroy_buffer(struct sna *sna,
 		assert(priv->pinned & PIN_DRI2);
 		assert(priv->flush);
 
+		assert(priv->gpu_bo->active_scanout > 0);
+		priv->gpu_bo->active_scanout--;
+
 		/* Undo the DRI markings on this pixmap */
 		DBG(("%s: releasing last DRI pixmap=%ld, scanout?=%d\n",
 		     __FUNCTION__,
@@ -1379,6 +1384,8 @@ sna_dri2_copy_region(DrawablePtr draw,
 	assert(get_private(src)->refcnt);
 	assert(get_private(dst)->refcnt);
 
+	assert(get_private(src)->bo != get_private(dst)->bo);
+
 	assert(get_private(src)->bo->refcnt);
 	assert(get_private(dst)->bo->refcnt);
 
@@ -1850,12 +1857,16 @@ sna_dri2_flip(struct sna_dri2_event *info)
 	tmp_pitch = info->front->pitch;
 	tmp_flags = info->front->flags;
 
+	assert(tmp_bo->active_scanout > 0);
+	tmp_bo->active_scanout--;
+
 	set_bo(info->sna->front, bo);
 
 	info->front->flags = info->back->flags;
 	info->front->name = info->back->name;
 	info->front->pitch = info->back->pitch;
 	get_private(info->front)->bo = bo;
+	bo->active_scanout++;
 
 	info->back->flags = tmp_flags;
 	info->back->name = tmp_name;
@@ -2244,6 +2255,10 @@ sna_dri2_xchg(DrawablePtr draw, DRI2BufferPtr front, DRI2BufferPtr back)
 	get_private(back)->bo = front_bo;
 	mark_stale(back);
 
+	assert(front_bo->active_scanout > 0);
+	front_bo->active_scanout--;
+	back_bo->active_scanout++;
+
 	tmp = front->name;
 	front->name = back->name;
 	back->name = tmp;
@@ -2576,6 +2591,8 @@ void sna_dri2_vblank_handler(struct drm_event_vblank *event)
 			info->back->flags = info->pending.flags;
 			info->pending.bo = NULL;
 
+			assert(get_private(info->back)->bo != get_private(info->front)->bo);
+
 			if (can_xchg(info->sna, info->draw, info->front, info->back))
 				sna_dri2_xchg(info->draw, info->front, info->back);
 			else if (can_xchg_crtc(info->sna, info->draw, info->crtc,
@@ -2715,7 +2732,10 @@ sna_dri2_immediate_blit(struct sna *sna,
 		}
 
 		if (chain->pending.bo == NULL) {
-			DBG(("%s: setting as pending blit\n", __FUNCTION__));
+			DBG(("%s: setting handle=%d as pending blit (current event front=%d, back=%d)\n", __FUNCTION__,
+			     get_private(info->back)->bo->handle,
+			     get_private(chain->front)->bo->handle,
+			     get_private(chain->back)->bo->handle));
 			chain->pending.bo = ref(get_private(info->back)->bo);
 			chain->pending.size = get_private(info->back)->size;
 			chain->pending.name = info->back->name;
commit 8a59e85801cb0592eb2d0a074d9254d26a65240f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 19 16:39:11 2015 +0100

    sna/dri2: Initialise scratch.pScreen for copying
    
    Down one particular patch (overlapping render copies) the
    scratch.pScreen is dereferenced (to create a temporary Pixmap). Ensure
    that we populate it before hand.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=91658
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index ca1f9c5..0fc1021 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2797,8 +2797,7 @@ fallback_blt:
 		assert(src->depth == dst->depth);
 		assert(src->width == dst->width);
 		assert(src->height == dst->height);
-		return sna_render_copy_boxes__overlap(sna, alu,
-						      src, src_bo,
+		return sna_render_copy_boxes__overlap(sna, alu, dst, dst_bo,
 						      src_dx, src_dy,
 						      dst_dx, dst_dy,
 						      box, n, &extents);
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 74bac5a..8ff9150 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3002,8 +3002,7 @@ fallback_blt:
 		assert(src->depth == dst->depth);
 		assert(src->width == dst->width);
 		assert(src->height == dst->height);
-		return sna_render_copy_boxes__overlap(sna, alu,
-						      src, src_bo,
+		return sna_render_copy_boxes__overlap(sna, alu, dst, dst_bo,
 						      src_dx, src_dy,
 						      dst_dx, dst_dy,
 						      box, n, &extents);
diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c
index 3d7f3a5..0b4638a 100644
--- a/src/sna/gen8_render.c
+++ b/src/sna/gen8_render.c
@@ -2854,8 +2854,7 @@ fallback_blt:
 		assert(src->depth == dst->depth);
 		assert(src->width == dst->width);
 		assert(src->height == dst->height);
-		return sna_render_copy_boxes__overlap(sna, alu,
-						      src, src_bo,
+		return sna_render_copy_boxes__overlap(sna, alu, dst, dst_bo,
 						      src_dx, src_dy,
 						      dst_dx, dst_dy,
 						      box, n, &extents);
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index e627902..eb5a558 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -1186,6 +1186,7 @@ __sna_dri2_copy_region(struct sna *sna, DrawablePtr draw, RegionPtr region,
 	} else
 		flags &= ~DRI2_SYNC;
 
+	scratch.pScreen = draw->pScreen;
 	scratch.x = scratch.y = 0;
 	scratch.width = scratch.height = 0;
 	scratch.depth = draw->depth;
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index a994505..89267a3 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -2169,11 +2169,11 @@ copy_overlap(struct sna *sna, uint8_t alu,
 	ret = (sna->render.copy_boxes(sna, GXcopy,
 				      draw, bo, src_dx, src_dy,
 				      &tmp->drawable, tmp_bo, -extents->x1, -extents->y1,
-				      box, n , 0) &&
+				      box, n, 0) &&
 	       sna->render.copy_boxes(sna, alu,
 				      &tmp->drawable, tmp_bo, -extents->x1, -extents->y1,
 				      draw, bo, dst_dx, dst_dy,
-				      box, n , 0));
+				      box, n, 0));
 
 	screen->DestroyPixmap(tmp);
 	return ret;


More information about the xorg-commit mailing list