xf86-video-intel: 2 commits - src/sna/sna_accel.c src/sna/sna_display.c src/sna/sna.h src/sna/sna_render.c src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Aug 14 10:22:20 PDT 2013


 src/sna/sna.h            |    2 +-
 src/sna/sna_accel.c      |   20 ++++++++++----------
 src/sna/sna_display.c    |   19 +++++++++++--------
 src/sna/sna_render.c     |    8 ++++----
 src/sna/sna_trapezoids.c |    4 ++--
 5 files changed, 28 insertions(+), 25 deletions(-)

New commits:
commit 5d29daa7df72d9a96e044d0706f3014811389629
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 14 18:16:22 2013 +0100

    sna: Make sure the frontbuffer exists before doing pitch checks
    
    An unusual path to be sure, to call sna_crtc_set_mode_major before we
    create a GPU bo for the scanout - but might be possible after a GPU
    hang, or it appears after trying to set a 0x0 mode. At any rate, make
    sure the GPU bo exists before dereferencing.
    
    Bugzilla: https://bugs.launchpad.net/ubuntu/+source/xorg-server/+bug/1212344
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 2a5b4b4..a6a4665 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1093,7 +1093,7 @@ static bool use_shadow(struct sna *sna, xf86CrtcPtr crtc)
 	PictTransform crtc_to_fb;
 	struct pict_f_transform f_crtc_to_fb, f_fb_to_crtc;
 	unsigned long pitch_limit;
-	struct kgem_bo *bo;
+	struct sna_pixmap *priv;
 	BoxRec b;
 
 	assert(sna->scrn->virtualX && sna->scrn->virtualY);
@@ -1118,18 +1118,21 @@ static bool use_shadow(struct sna *sna, xf86CrtcPtr crtc)
 		return true;
 	}
 
-	bo = __sna_pixmap_get_bo(sna->front);
+	priv = sna_pixmap_force_to_gpu(sna->front, MOVE_READ | MOVE_WRITE);
+	if (priv == NULL)
+		return true; /* maybe we can create a bo for the scanout? */
+
 	if (sna->kgem.gen == 071)
-		pitch_limit = bo->tiling ? 16 * 1024 : 32 * 1024;
+		pitch_limit = priv->gpu_bo->tiling ? 16 * 1024 : 32 * 1024;
 	else if ((sna->kgem.gen >> 3) > 4)
 		pitch_limit = 32 * 1024;
 	else if ((sna->kgem.gen >> 3) == 4)
-		pitch_limit = bo->tiling ? 16 * 1024 : 32 * 1024;
+		pitch_limit = priv->gpu_bo->tiling ? 16 * 1024 : 32 * 1024;
 	else if ((sna->kgem.gen >> 3) == 3)
-		pitch_limit = bo->tiling ? 8 * 1024 : 16 * 1024;
+		pitch_limit = priv->gpu_bo->tiling ? 8 * 1024 : 16 * 1024;
 	else
 		pitch_limit = 8 * 1024;
-	if (bo->pitch > pitch_limit)
+	if (priv->gpu_bo->pitch > pitch_limit)
 		return true;
 
 	transform = NULL;
commit a0f90a4c79799780592c004c846a963aad5f28e6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 14 18:12:15 2013 +0100

    sna: Rename sna_pixmap_get_bo()
    
    Mark how dangerous this function is by giving it a __ prefix.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index fe84074..b5613bd 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -607,7 +607,7 @@ sna_drawable_is_clear(DrawablePtr d)
 	return priv && priv->clear && priv->clear_color == 0;
 }
 
-static inline struct kgem_bo *sna_pixmap_get_bo(PixmapPtr pixmap)
+static inline struct kgem_bo *__sna_pixmap_get_bo(PixmapPtr pixmap)
 {
 	return sna_pixmap(pixmap)->gpu_bo;
 }
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 04b063c..c54c254 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4311,7 +4311,7 @@ sna_put_xybitmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 
 	if (bo->tiling == I915_TILING_Y) {
 		DBG(("%s: converting bo from Y-tiling\n", __FUNCTION__));
-		assert(bo == sna_pixmap_get_bo(pixmap));
+		assert(bo == __sna_pixmap_get_bo(pixmap));
 		bo = sna_pixmap_change_tiling(pixmap, I915_TILING_X);
 		if (bo == NULL) {
 			DBG(("%s: fallback -- unable to change tiling\n",
@@ -4435,7 +4435,7 @@ sna_put_xypixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 
 	if (bo->tiling == I915_TILING_Y) {
 		DBG(("%s: converting bo from Y-tiling\n", __FUNCTION__));
-		assert(bo == sna_pixmap_get_bo(pixmap));
+		assert(bo == __sna_pixmap_get_bo(pixmap));
 		bo = sna_pixmap_change_tiling(pixmap, I915_TILING_X);
 		if (bo == NULL) {
 			DBG(("%s: fallback -- unable to change tiling\n",
@@ -5340,7 +5340,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 			if (tmp == NullPixmap)
 				return;
 
-			src_bo = sna_pixmap_get_bo(tmp);
+			src_bo = __sna_pixmap_get_bo(tmp);
 			assert(src_bo != NULL);
 
 			dx = -region->extents.x1;
@@ -7266,7 +7266,7 @@ sna_copy_plane(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 				     &region.extents, &arg.damage);
 	if (arg.bo) {
 		if (arg.bo->tiling == I915_TILING_Y) {
-			assert(arg.bo == sna_pixmap_get_bo(pixmap));
+			assert(arg.bo == __sna_pixmap_get_bo(pixmap));
 			arg.bo = sna_pixmap_change_tiling(pixmap, I915_TILING_X);
 			if (arg.bo == NULL) {
 				DBG(("%s: fallback -- unable to change tiling\n",
@@ -12567,7 +12567,7 @@ sna_poly_fill_rect_stippled_blt(DrawablePtr drawable,
 
 		DBG(("%s: converting bo from Y-tiling\n", __FUNCTION__));
 		/* This is cheating, but only the gpu_bo can be tiled */
-		assert(bo == sna_pixmap_get_bo(pixmap));
+		assert(bo == __sna_pixmap_get_bo(pixmap));
 		bo = sna_pixmap_change_tiling(pixmap, I915_TILING_X);
 		if (bo == NULL) {
 			DBG(("%s: fallback -- unable to change tiling\n",
@@ -13103,7 +13103,7 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc,
 
 	if (bo->tiling == I915_TILING_Y) {
 		DBG(("%s: converting bo from Y-tiling\n", __FUNCTION__));
-		assert(bo == sna_pixmap_get_bo(pixmap));
+		assert(bo == __sna_pixmap_get_bo(pixmap));
 		bo = sna_pixmap_change_tiling(pixmap, I915_TILING_X);
 		if (bo == NULL) {
 			DBG(("%s: fallback -- unable to change tiling\n",
@@ -13762,7 +13762,7 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc,
 
 	if (bo->tiling == I915_TILING_Y) {
 		DBG(("%s: converting bo from Y-tiling\n", __FUNCTION__));
-		assert(bo == sna_pixmap_get_bo(pixmap));
+		assert(bo == __sna_pixmap_get_bo(pixmap));
 		bo = sna_pixmap_change_tiling(pixmap, I915_TILING_X);
 		if (bo == NULL) {
 			DBG(("%s: fallback -- unable to change tiling\n",
@@ -14156,7 +14156,7 @@ sna_push_pixels_solid_blt(GCPtr gc,
 
 	if (bo->tiling == I915_TILING_Y) {
 		DBG(("%s: converting bo from Y-tiling\n", __FUNCTION__));
-		assert(bo == sna_pixmap_get_bo(pixmap));
+		assert(bo == __sna_pixmap_get_bo(pixmap));
 		bo = sna_pixmap_change_tiling(pixmap, I915_TILING_X);
 		if (bo == NULL) {
 			DBG(("%s: fallback -- unable to change tiling\n",
@@ -15089,8 +15089,8 @@ fallback:
 				goto fallback;
 
 			if (!sna->render.copy_boxes(sna, GXcopy,
-						    src, sna_pixmap_get_bo(src), dirty->x, dirty->y,
-						    dst, sna_pixmap_get_bo(dst),0, 0,
+						    src, __sna_pixmap_get_bo(src), dirty->x, dirty->y,
+						    dst, __sna_pixmap_get_bo(dst),0, 0,
 						    box, n, COPY_LAST))
 				goto fallback;
 
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index c87693a..2a5b4b4 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1118,7 +1118,7 @@ static bool use_shadow(struct sna *sna, xf86CrtcPtr crtc)
 		return true;
 	}
 
-	bo = sna_pixmap_get_bo(sna->front);
+	bo = __sna_pixmap_get_bo(sna->front);
 	if (sna->kgem.gen == 071)
 		pitch_limit = bo->tiling ? 16 * 1024 : 32 * 1024;
 	else if ((sna->kgem.gen >> 3) > 4)
@@ -3857,7 +3857,7 @@ sna_crtc_redisplay(xf86CrtcPtr crtc, RegionPtr region)
 		 */
 
 		if (sna->render.copy_boxes(sna, GXcopy,
-					   sna->front, sna_pixmap_get_bo(sna->front), 0, 0,
+					   sna->front, __sna_pixmap_get_bo(sna->front), 0, 0,
 					   &tmp, sna_crtc->bo, -tx, -ty,
 					   REGION_RECTS(region), REGION_NUM_RECTS(region), 0))
 			return;
@@ -3958,7 +3958,7 @@ void sna_mode_redisplay(struct sna *sna)
 	}
 
 	if (sna->mode.shadow_flip == 0) {
-		struct kgem_bo *new = sna_pixmap_get_bo(sna->front);
+		struct kgem_bo *new = __sna_pixmap_get_bo(sna->front);
 		struct kgem_bo *old = sna->mode.shadow;
 
 		DBG(("%s: flipping tear-free outputs\n", __FUNCTION__));
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 1bf11ea..6b883dd 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -1336,7 +1336,7 @@ sna_render_picture_convolve(struct sna *sna,
 
 	ValidatePicture(tmp);
 
-	bo = sna_pixmap_get_bo(pixmap);
+	bo = __sna_pixmap_get_bo(pixmap);
 	if (!sna->render.clear(sna, pixmap, bo)) {
 		FreePicture(tmp, 0);
 		return 0;
@@ -1450,7 +1450,7 @@ sna_render_picture_flatten(struct sna *sna,
 	channel->scale[1] = 1.f / h;
 	channel->offset[0] = -dst_x;
 	channel->offset[1] = -dst_y;
-	channel->bo = kgem_bo_reference(sna_pixmap_get_bo(pixmap));
+	channel->bo = kgem_bo_reference(__sna_pixmap_get_bo(pixmap));
 	FreePicture(tmp, 0);
 
 	return 1;
@@ -1817,7 +1817,7 @@ sna_render_picture_convert(struct sna *sna,
 		FreePicture(dst, 0);
 		FreePicture(src, 0);
 
-		channel->bo = sna_pixmap_get_bo(tmp);
+		channel->bo = __sna_pixmap_get_bo(tmp);
 		kgem_bo_reference(channel->bo);
 		screen->DestroyPixmap(tmp);
 	} else {
@@ -2112,7 +2112,7 @@ sna_render_copy_boxes__overlap(struct sna *sna, uint8_t alu,
 	if (tmp == NULL)
 		return false;
 
-	bo = sna_pixmap_get_bo(tmp);
+	bo = __sna_pixmap_get_bo(tmp);
 	if (bo == NULL)
 		goto out;
 
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index e3b406e..ce2c075 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -6838,7 +6838,7 @@ trap_mask_converter(struct sna *sna,
 	get_drawable_deltas(picture->pDrawable, pixmap, &x, &y);
 	sna = to_sna_from_screen(screen);
 	sna->render.copy_boxes(sna, GXcopy,
-			       scratch, sna_pixmap_get_bo(scratch), -extents.x1, -extents.x1,
+			       scratch, __sna_pixmap_get_bo(scratch), -extents.x1, -extents.x1,
 			       pixmap, priv->gpu_bo, x, y,
 			       &extents, 1, 0);
 	mark_damaged(pixmap, priv, &extents ,x, y);
@@ -6915,7 +6915,7 @@ trap_upload(PicturePtr picture,
 	/* XXX clip boxes */
 	get_drawable_deltas(picture->pDrawable, pixmap, &x, &y);
 	sna->render.copy_boxes(sna, GXcopy,
-			       scratch, sna_pixmap_get_bo(scratch), -extents.x1, -extents.x1,
+			       scratch, __sna_pixmap_get_bo(scratch), -extents.x1, -extents.x1,
 			       pixmap, priv->gpu_bo, x, y,
 			       &extents, 1, 0);
 	mark_damaged(pixmap, priv, &extents, x, y);


More information about the xorg-commit mailing list