xf86-video-intel: 6 commits - src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/sna_blt.c src/sna/sna_composite.c src/sna/sna_trapezoids_mono.c tools/virtual.c

Chris Wilson ickle at kemper.freedesktop.org
Tue Nov 19 04:49:42 PST 2013


 src/sna/gen4_render.c         |   12 ++++++++++--
 src/sna/gen5_render.c         |   12 ++++++++++--
 src/sna/gen6_render.c         |   10 ++++++++--
 src/sna/gen7_render.c         |   17 ++++++++++++++---
 src/sna/sna_blt.c             |    4 ++--
 src/sna/sna_composite.c       |    2 +-
 src/sna/sna_trapezoids_mono.c |    4 ++--
 tools/virtual.c               |   20 +++++++++++++++-----
 8 files changed, 62 insertions(+), 19 deletions(-)

New commits:
commit b14228fafb654fe7d8f8783475aa0c0ba87e4fea
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Nov 19 12:15:24 2013 +0000

    intel-virtual-output: Check for failure to create a clone
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index ab4f12b..2d5a4e4 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -2005,6 +2005,9 @@ static int last_display_add_clones__randr(struct context *ctx)
 		struct clone *clone = add_clone(ctx);
 		RROutput id;
 
+		if (clone == NULL)
+			return -ENOMEM;
+
 		clone->depth = 24;
 		clone->next = display->clone;
 		display->clone = clone;
@@ -2073,6 +2076,9 @@ static int last_display_add_clones__xinerama(struct context *ctx)
 		struct clone *clone = add_clone(ctx);
 		RROutput id;
 
+		if (clone == NULL)
+			return -ENOMEM;
+
 		if (xi[n].width == 0 || xi[n].height == 0)
 			continue;
 
@@ -2130,14 +2136,18 @@ static int last_display_add_clones__xinerama(struct context *ctx)
 static int last_display_add_clones__display(struct context *ctx)
 {
 	struct display *display = last_display(ctx);
-	struct clone *clone = add_clone(ctx);
 	Display *dpy = display->dpy;
+	struct clone *clone;
 	Screen *scr;
 	char buf[80];
 	int ret;
 	RROutput id;
 
-	DBG(("%s(%s)\n", __func__, DisplayString(display->dpy)));
+
+	DBG(("%s(%s)\n", __func__, DisplayString(dpy)));
+	clone = add_clone(ctx);
+	if (clone == NULL)
+		return -ENOMEM;
 
 	clone->depth = 24;
 	clone->next = display->clone;
@@ -2166,7 +2176,7 @@ static int last_display_add_clones__display(struct context *ctx)
 	ret = clone_init_depth(clone);
 	if (ret) {
 		fprintf(stderr, "Failed to negotiate image format for display \"%s\"\n",
-			DisplayString(display->dpy));
+			DisplayString(dpy));
 		return ret;
 	}
 
@@ -2180,7 +2190,7 @@ static int last_display_add_clones__display(struct context *ctx)
 	ret = clone_update_modes__fixed(clone);
 	if (ret) {
 		fprintf(stderr, "Failed to clone display \"%s\"\n",
-			DisplayString(display->dpy));
+			DisplayString(dpy));
 		return ret;
 	}
 
commit 9e6979b67afdd8122a29135d752c6ea84e9af6dc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Nov 19 12:13:26 2013 +0000

    intel-virtual-output: Fix trivial and unlikely fd leak from bumblebee failure
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index c3d7024..ab4f12b 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -1876,7 +1876,7 @@ static int bumblebee_open(struct context *ctx)
 	DBG(("%s query result '%s'\n", __func__, buf));
 
 	if (strncmp(buf, "Value: ", 7))
-		return -ECONNREFUSED;
+		goto err;
 
 	len = 7;
 	while (buf[len] != '\n' && buf[len] != '\0')
commit 9ed5f83fe7ec71faf40147271aef1cf4a5a38329
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Nov 19 12:09:35 2013 +0000

    sna: Fix use before assignment
    
    mono.sna was being used the line before it was assigned.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids_mono.c b/src/sna/sna_trapezoids_mono.c
index 40d0381..dd629b6 100644
--- a/src/sna/sna_trapezoids_mono.c
+++ b/src/sna/sna_trapezoids_mono.c
@@ -803,8 +803,8 @@ mono_trapezoids_span_converter(struct sna *sna,
 	unbounded = (!sna_drawable_is_clear(dst->pDrawable) &&
 		     !operator_is_bounded(op));
 
-	if (op == PictOpClear && mono.sna->clear)
-		src = mono.sna->clear;
+	if (op == PictOpClear && sna->clear)
+		src = sna->clear;
 
 	mono.sna = sna;
 	if (!mono.sna->render.composite(mono.sna, op, src, NULL, dst,
commit a9d6f897e6d6dc388de24f7b49ba79bf1f6125c3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Nov 19 12:03:33 2013 +0000

    sna: Free composite boxes in the unlikely all-invalid path
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index 6078d52..56e34f3 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -877,7 +877,7 @@ sna_composite_rectangles(CARD8		 op,
 	}
 
 	if (num_boxes == 0)
-		return;
+		goto cleanup_boxes;
 
 	if (!pixman_region_init_rects(&region, boxes, num_boxes))
 		goto cleanup_boxes;
commit 0782d4e57e4ba33aee30925ad276ee4a1ec15feb
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Nov 19 12:01:33 2013 +0000

    sna: Correct check for overwriting last BLT fill
    
    Typo crept in from the reloc rework.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 63153b7..48a7cf6 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -3270,7 +3270,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
 			}
 		} else {
 			if (kgem->nbatch >= 6 &&
-			    kgem->batch[kgem->nbatch-7] == (XY_COLOR_BLT | (cmd & (BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 4) &&
+			    kgem->batch[kgem->nbatch-6] == (XY_COLOR_BLT | (cmd & (BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 4) &&
 			    kgem->batch[kgem->nbatch-4] == ((uint32_t)(box->y1 + dst_dy) << 16 | (uint16_t)(box->x1 + dst_dx)) &&
 			    kgem->batch[kgem->nbatch-3] == ((uint32_t)(box->y2 + dst_dy) << 16 | (uint16_t)(box->x2 + dst_dx))) {
 				DBG(("%s: deleting last fill\n", __FUNCTION__));
@@ -3605,7 +3605,7 @@ bool sna_blt_copy_boxes__with_alpha(struct sna *sna, uint8_t alu,
 			}
 		} else {
 			if (kgem->nbatch >= 6 &&
-			    kgem->batch[kgem->nbatch-7] == (XY_COLOR_BLT | (cmd & (BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 4) &&
+			    kgem->batch[kgem->nbatch-6] == (XY_COLOR_BLT | (cmd & (BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 4) &&
 			    kgem->batch[kgem->nbatch-4] == ((uint32_t)(box->y1 + dst_dy) << 16 | (uint16_t)(box->x1 + dst_dx)) &&
 			    kgem->batch[kgem->nbatch-3] == ((uint32_t)(box->y2 + dst_dy) << 16 | (uint16_t)(box->x2 + dst_dx))) {
 				DBG(("%s: deleting last fill\n", __FUNCTION__));
commit 31f559820dbde1a028a76b9eeaeb1848aec3cc2b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Nov 19 12:00:08 2013 +0000

    sna/gen4+: Clear redirect bo before falling back to BLT paths
    
    Just in case we later try to take action on the already freed
    redirection.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index b122408..c6a1e6d 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2411,8 +2411,13 @@ fallback_blt:
 		kgem_submit(&sna->kgem);
 		if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) {
 			kgem_bo_destroy(&sna->kgem, tmp.src.bo);
-			if (tmp.redirect.real_bo)
+			tmp.src.bo = NULL;
+
+			if (tmp.redirect.real_bo) {
 				kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
+				tmp.redirect.real_bo = NULL;
+			}
+
 			goto fallback_blt;
 		}
 	}
@@ -2441,9 +2446,12 @@ fallback_blt:
 	return true;
 
 fallback_tiled_dst:
-	if (tmp.redirect.real_bo)
+	if (tmp.redirect.real_bo) {
 		kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
+		tmp.redirect.real_bo = NULL;
+	}
 fallback_tiled:
+	assert(tmp.src.bo == NULL);
 	if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 59ce2be..1e90413 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2371,8 +2371,13 @@ fallback_blt:
 		if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) {
 			DBG(("%s: aperture check failed\n", __FUNCTION__));
 			kgem_bo_destroy(&sna->kgem, tmp.src.bo);
-			if (tmp.redirect.real_bo)
+			tmp.src.bo = NULL;
+
+			if (tmp.redirect.real_bo) {
 				kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
+				tmp.redirect.real_bo = NULL;
+			}
+
 			goto fallback_blt;
 		}
 	}
@@ -2421,9 +2426,12 @@ fallback_blt:
 	return true;
 
 fallback_tiled_dst:
-	if (tmp.redirect.real_bo)
+	if (tmp.redirect.real_bo) {
 		kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
+		tmp.redirect.real_bo = NULL;
+	}
 fallback_tiled:
+	assert(tmp.src.bo == NULL);
 	if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index a2b4082..f03b893 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2785,8 +2785,11 @@ fallback_blt:
 			     __FUNCTION__));
 			if (tmp.src.bo != src_bo)
 				kgem_bo_destroy(&sna->kgem, tmp.src.bo);
-			if (tmp.redirect.real_bo)
+			tmp.src.bo = NULL;
+			if (tmp.redirect.real_bo) {
 				kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
+				tmp.redirect.real_bo = NULL;
+			}
 			goto fallback_blt;
 		}
 		_kgem_set_mode(&sna->kgem, KGEM_RENDER);
@@ -2831,9 +2834,12 @@ fallback_blt:
 	return true;
 
 fallback_tiled_dst:
-	if (tmp.redirect.real_bo)
+	if (tmp.redirect.real_bo) {
 		kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
+		tmp.redirect.real_bo = NULL;
+	}
 fallback_tiled:
+	assert(tmp.src.bo == NULL);
 	if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 9a7be4c..bd37ced 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3040,8 +3040,11 @@ fallback_blt:
 		if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, tmp.src.bo, NULL)) {
 			if (tmp.src.bo != src_bo)
 				kgem_bo_destroy(&sna->kgem, tmp.src.bo);
-			if (tmp.redirect.real_bo)
+			tmp.src.bo = NULL;
+			if (tmp.redirect.real_bo) {
 				kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
+				tmp.redirect.real_bo = NULL;
+			}
 			goto fallback_blt;
 		}
 		_kgem_set_mode(&sna->kgem, KGEM_RENDER);
@@ -3086,10 +3089,13 @@ fallback_blt:
 	return true;
 
 fallback_tiled_dst:
-	if (tmp.redirect.real_bo)
+	if (tmp.redirect.real_bo) {
 		kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
+		tmp.redirect.real_bo = NULL;
+	}
 fallback_tiled:
 	DBG(("%s: fallback tiled\n", __FUNCTION__));
+	assert(tmp.src.bo == NULL);
 	if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
@@ -3351,8 +3357,13 @@ gen7_render_fill_boxes(struct sna *sna,
 		kgem_submit(&sna->kgem);
 		if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 			kgem_bo_destroy(&sna->kgem, tmp.src.bo);
-			if (tmp.redirect.real_bo)
+			tmp.src.bo = NULL;
+
+			if (tmp.redirect.real_bo) {
 				kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
+				tmp.redirect.real_bo = NULL;
+			}
+
 			return false;
 		}
 		_kgem_set_mode(&sna->kgem, KGEM_RENDER);


More information about the xorg-commit mailing list