xf86-video-intel: 6 commits - src/intel_driver.c src/intel_module.c src/sna/blt.c src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/kgem.c src/sna/sna_blt.c src/sna/sna_driver.c src/sna/sna_render_inline.h src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Mon Aug 20 09:11:01 PDT 2012


 src/intel_driver.c          |    2 +-
 src/intel_module.c          |   16 ++++++++++++----
 src/sna/blt.c               |    5 +++++
 src/sna/gen2_render.c       |    3 ++-
 src/sna/gen3_render.c       |    2 +-
 src/sna/gen4_render.c       |    4 ++--
 src/sna/gen5_render.c       |    5 ++---
 src/sna/kgem.c              |    6 ++++++
 src/sna/sna_blt.c           |   18 +++++++++---------
 src/sna/sna_driver.c        |    2 +-
 src/sna/sna_render_inline.h |   26 --------------------------
 src/sna/sna_trapezoids.c    |   23 ++++++++++++++++++++++-
 12 files changed, 63 insertions(+), 49 deletions(-)

New commits:
commit ae6b3c7508d570af94f172d6a91d62d2987d654b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Aug 20 17:03:16 2012 +0100

    Check that the module that indeed i915 before using custom ioctls
    
    Thanks to Adam Jackson for pointing me towards drmGetVersion() and
    Julien Cristau for saying "Yuck!"
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_module.c b/src/intel_module.c
index edea48d..e5f98d4 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -392,11 +392,19 @@ static Bool has_kernel_mode_setting(struct pci_device *dev)
 	ret = FALSE;
 	fd = drmOpen(NULL, id);
 	if (fd != -1) {
-		struct drm_i915_getparam gp;
+		drmVersionPtr version = drmGetVersion(fd);
+		if (version) {
+			ret = strcmp ("i915", version->name) == 0;
+			drmFreeVersion(version);
+		}
+		if (ret) {
+			struct drm_i915_getparam gp;
+			gp.param = I915_PARAM_HAS_GEM;
+			gp.value = &ret;
+			if (drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp))
+				ret = FALSE;
+		}
 
-		gp.param = I915_PARAM_HAS_GEM;
-		gp.value = &ret;
-		(void)drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
 		close(fd);
 	}
 
commit 3c611087e8ae09fc3fe4271f16d912ac8ae89f6b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Aug 20 16:09:25 2012 +0100

    Only open the matching BusID and not the first named
    
    If you pass a name to drmOpen() it will attempt to open any device
    corresponding to that name if it first fails to open the device
    corresponding to the BusID. Obviously we want the failure from opening
    the specified device in order to prevent wrongly opening the first found
    device multiple times.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_driver.c b/src/intel_driver.c
index 1ef06fb..c5be679 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -249,7 +249,7 @@ static Bool intel_open_drm_master(ScrnInfoPtr scrn)
 	snprintf(busid, sizeof(busid), "pci:%04x:%02x:%02x.%d",
 		 dev->domain, dev->bus, dev->dev, dev->func);
 
-	intel->drmSubFD = drmOpen("i915", busid);
+	intel->drmSubFD = drmOpen(NULL, busid);
 	if (intel->drmSubFD == -1) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 			   "[drm] Failed to open DRM device for %s: %s\n",
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 6810c7a..a0beb4c 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -259,7 +259,7 @@ static int sna_open_drm_master(ScrnInfoPtr scrn)
 	snprintf(busid, sizeof(busid), "pci:%04x:%02x:%02x.%d",
 		 pci->domain, pci->bus, pci->dev, pci->func);
 
-	fd = drmOpen("i915", busid);
+	fd = drmOpen(NULL, busid);
 	if (fd == -1) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 			   "[drm] Failed to open DRM device for %s: %s\n",
commit dd6c67b32f726b6ad7f12f3b83f6d8c868ff4dc1
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Aug 20 15:58:03 2012 +0100

    sna: Add a couple of buffer cache management assertions
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index a3df628..3cb9eb6 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1280,6 +1280,7 @@ inline static void kgem_bo_remove_from_inactive(struct kgem *kgem,
 
 	list_del(&bo->list);
 	assert(bo->rq == NULL);
+	assert(bo->exec == NULL);
 	if (bo->map) {
 		assert(!list_is_empty(&bo->vma));
 		list_del(&bo->vma);
@@ -1293,6 +1294,7 @@ inline static void kgem_bo_remove_from_active(struct kgem *kgem,
 	DBG(("%s: removing handle=%d from active\n", __FUNCTION__, bo->handle));
 
 	list_del(&bo->list);
+	assert(bo->rq != NULL);
 	if (bo->rq == &_kgem_static_request)
 		list_del(&bo->request);
 	assert(list_is_empty(&bo->vma));
@@ -1366,6 +1368,7 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags)
 		assert(bo->proxy == NULL);
 		assert(bo->tiling == I915_TILING_NONE);
 		assert(bo->rq == NULL);
+		assert(bo->exec == NULL);
 
 		if (num_pages > num_pages(bo))
 			continue;
@@ -1753,6 +1756,7 @@ static void kgem_commit(struct kgem *kgem)
 		     (unsigned)bo->exec->offset));
 
 		assert(!bo->purged);
+		assert(bo->exec);
 		assert(bo->rq == rq || (bo->proxy->rq == rq));
 
 		bo->presumed_offset = bo->exec->offset;
@@ -2485,6 +2489,8 @@ search_linear_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags)
 			assert(IS_CPU_MAP(bo->map) == for_cpu);
 			assert(bucket(bo) == cache_bucket(num_pages));
 			assert(bo->proxy == NULL);
+			assert(bo->rq == NULL);
+			assert(bo->exec == NULL);
 
 			if (num_pages > num_pages(bo)) {
 				DBG(("inactive too small: %d < %d\n",
commit 01ebdb4d7a8bb751167153554f9122d996e4ea91
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Aug 20 15:33:26 2012 +0100

    sna: Remove confusing is_cpu()
    
    The only real user now has its own heuristics, so convert the remaining
    users over to !is_gpu().
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 31859b4..fea1791 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1479,7 +1479,8 @@ try_blt(struct sna *sna,
 		     src->pDrawable->width, src->pDrawable->height));
 		return true;
 	}
-	return is_cpu(src->pDrawable);
+
+	return !is_gpu(src->pDrawable);
 }
 
 static bool
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 48f104e..72a2575 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2428,7 +2428,7 @@ source_use_blt(struct sna *sna, PicturePtr picture)
 	if (too_large(picture->pDrawable->width, picture->pDrawable->height))
 		return true;
 
-	return is_cpu(picture->pDrawable) || is_dirty(picture->pDrawable);
+	return !is_gpu(picture->pDrawable);
 }
 
 static bool
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index a56ef79..d72a2fd 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1996,7 +1996,7 @@ picture_is_cpu(PicturePtr picture)
 	if (!picture->pDrawable)
 		return false;
 
-	return is_cpu(picture->pDrawable) || is_dirty(picture->pDrawable);
+	return !is_gpu(picture->pDrawable);
 }
 
 static inline bool prefer_blt(struct sna *sna)
@@ -2063,7 +2063,7 @@ untransformed(PicturePtr p)
 static bool
 need_upload(PicturePtr p)
 {
-	return p->pDrawable && untransformed(p) && is_cpu(p->pDrawable);
+	return p->pDrawable && untransformed(p) && !is_gpu(p->pDrawable);
 }
 
 static bool
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 71e77a4..9b976c8 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2012,8 +2012,7 @@ picture_is_cpu(PicturePtr picture)
 	if (!picture->pDrawable)
 		return false;
 
-
-	return is_cpu(picture->pDrawable) || is_dirty(picture->pDrawable);
+	return !is_gpu(picture->pDrawable);
 }
 
 static bool
@@ -2073,7 +2072,7 @@ untransformed(PicturePtr p)
 static bool
 need_upload(PicturePtr p)
 {
-	return p->pDrawable && untransformed(p) && is_cpu(p->pDrawable);
+	return p->pDrawable && untransformed(p) && !is_gpu(p->pDrawable);
 }
 
 static bool
diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h
index 3849a88..64f8a46 100644
--- a/src/sna/sna_render_inline.h
+++ b/src/sna/sna_render_inline.h
@@ -88,32 +88,6 @@ is_gpu(DrawablePtr drawable)
 }
 
 static inline bool
-is_cpu(DrawablePtr drawable)
-{
-	struct sna_pixmap *priv = sna_pixmap_from_drawable(drawable);
-	if (priv == NULL || priv->clear)
-		return true;
-
-	if (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo))
-		return false;
-
-	if (DAMAGE_IS_ALL(priv->cpu_damage))
-		return true;
-
-	if (priv->gpu_damage && kgem_bo_is_busy(priv->gpu_bo))
-		return false;
-
-	return true;
-}
-
-static inline bool
-is_dirty(DrawablePtr drawable)
-{
-	struct sna_pixmap *priv = sna_pixmap_from_drawable(drawable);
-	return priv == NULL || kgem_bo_is_dirty(priv->gpu_bo);
-}
-
-static inline bool
 too_small(struct sna_pixmap *priv)
 {
 	assert(priv);
commit 410316d20299b9ed3447d1d897f904af786ed097
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Aug 20 14:56:12 2012 +0100

    sna: Refine decision making for maybe-inplace trapezoids
    
    In particular, we want to avoid preferentially taking the CPU paths
    when it may force any migration (including clear).
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 6cc03f9..dd438de 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -4660,6 +4660,8 @@ static bool
 trapezoid_spans_maybe_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
 			      PictFormatPtr maskFormat)
 {
+	struct sna_pixmap *priv;
+
 	if (NO_SCAN_CONVERTER)
 		return false;
 
@@ -4712,7 +4714,26 @@ trapezoid_spans_maybe_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
 	}
 
 out:
-	return is_cpu(dst->pDrawable) ? true : dst->pDrawable->width <= TOR_INPLACE_SIZE;
+	priv = sna_pixmap_from_drawable(dst->pDrawable);
+	if (priv == NULL)
+		return true;
+
+	if (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo))
+		return false;
+
+	if (DAMAGE_IS_ALL(priv->cpu_damage) || priv->gpu_damage == NULL)
+		return true;
+
+	if (priv->clear)
+		return dst->pDrawable->width <= TOR_INPLACE_SIZE;
+
+	if (kgem_bo_is_busy(priv->gpu_bo))
+		return false;
+
+	if (priv->cpu_damage)
+		return true;
+
+	return dst->pDrawable->width <= TOR_INPLACE_SIZE;
 }
 
 static bool
commit 91f1bf971f9cdc6498f513a5ddec1ad7a4e24b3d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Aug 20 15:27:27 2012 +0100

    sna: Correct ordering of calls to memcpy for BLT cpu composite paths
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/blt.c b/src/sna/blt.c
index 1ad5eee..853eb20 100644
--- a/src/sna/blt.c
+++ b/src/sna/blt.c
@@ -153,6 +153,8 @@ memcpy_blt(const void *src, void *dst, int bpp,
 	assert(dst);
 	assert(width && height);
 	assert(bpp >= 8);
+	assert(width*bpp <= 8*src_stride);
+	assert(width*bpp <= 8*dst_stride);
 
 	DBG(("%s: src=(%d, %d), dst=(%d, %d), size=%dx%d, pitch=%d/%d\n",
 	     __FUNCTION__, src_x, src_y, dst_x, dst_y, width, height, src_stride, dst_stride));
@@ -245,6 +247,7 @@ memmove_box(const void *src, void *dst,
 
 	width = (box->x2 - box->x1) * bpp;
 	height = (box->y2 - box->y1);
+	assert(width <= 8*stride);
 	if (width == stride) {
 		width *= height;
 		height = 1;
@@ -372,6 +375,8 @@ memcpy_xor(const void *src, void *dst, int bpp,
 
 	assert(width && height);
 	assert(bpp >= 8);
+	assert(width*bpp <= 8*src_stride);
+	assert(width*bpp <= 8*dst_stride);
 
 	DBG(("%s: src=(%d, %d), dst=(%d, %d), size=%dx%d, pitch=%d/%d, bpp=%d, and=%x, xor=%x\n",
 	     __FUNCTION__,
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 750d749..656e979 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -1278,8 +1278,8 @@ blt_put_composite__cpu(struct sna *sna,
 	memcpy_blt(src->devPrivate.ptr, dst->devPrivate.ptr,
 		   src->drawable.bitsPerPixel, src->devKind, dst->devKind,
 		   r->src.x + op->u.blt.sx, r->src.y + op->u.blt.sy,
-		   r->width, r->height,
-		   r->dst.x + op->dst.x, r->dst.y + op->dst.y);
+		   r->dst.x + op->dst.x, r->dst.y + op->dst.y,
+		   r->width, r->height);
 }
 
 fastcall static void
@@ -1292,8 +1292,8 @@ blt_put_composite_box__cpu(struct sna *sna,
 	memcpy_blt(src->devPrivate.ptr, dst->devPrivate.ptr,
 		   src->drawable.bitsPerPixel, src->devKind, dst->devKind,
 		   box->x1 + op->u.blt.sx, box->y1 + op->u.blt.sy,
-		   box->x2-box->x1, box->y2-box->y1,
-		   box->x1 + op->dst.x, box->y1 + op->dst.y);
+		   box->x1 + op->dst.x, box->y1 + op->dst.y,
+		   box->x2-box->x1, box->y2-box->y1);
 }
 
 static void
@@ -1307,8 +1307,8 @@ blt_put_composite_boxes__cpu(struct sna *sna,
 		memcpy_blt(src->devPrivate.ptr, dst->devPrivate.ptr,
 			   src->drawable.bitsPerPixel, src->devKind, dst->devKind,
 			   box->x1 + op->u.blt.sx, box->y1 + op->u.blt.sy,
-			   box->x2-box->x1, box->y2-box->y1,
-			   box->x1 + op->dst.x, box->y1 + op->dst.y);
+			   box->x1 + op->dst.x, box->y1 + op->dst.y,
+			   box->x2-box->x1, box->y2-box->y1);
 		box++;
 	} while (--n);
 }
@@ -1323,8 +1323,8 @@ blt_put_composite_with_alpha__cpu(struct sna *sna,
 	memcpy_xor(src->devPrivate.ptr, dst->devPrivate.ptr,
 		   src->drawable.bitsPerPixel, src->devKind, dst->devKind,
 		   r->src.x + op->u.blt.sx, r->src.y + op->u.blt.sy,
-		   r->width, r->height,
 		   r->dst.x + op->dst.x, r->dst.y + op->dst.y,
+		   r->width, r->height,
 		   0xffffffff, op->u.blt.pixel);
 
 }
@@ -1339,8 +1339,8 @@ blt_put_composite_box_with_alpha__cpu(struct sna *sna,
 	memcpy_xor(src->devPrivate.ptr, dst->devPrivate.ptr,
 		   src->drawable.bitsPerPixel, src->devKind, dst->devKind,
 		   box->x1 + op->u.blt.sx, box->y1 + op->u.blt.sy,
-		   box->x2-box->x1, box->y2-box->y1,
 		   box->x1 + op->dst.x, box->y1 + op->dst.y,
+		   box->x2-box->x1, box->y2-box->y1,
 		   0xffffffff, op->u.blt.pixel);
 }
 
@@ -1355,8 +1355,8 @@ blt_put_composite_boxes_with_alpha__cpu(struct sna *sna,
 		memcpy_xor(src->devPrivate.ptr, dst->devPrivate.ptr,
 			   src->drawable.bitsPerPixel, src->devKind, dst->devKind,
 			   box->x1 + op->u.blt.sx, box->y1 + op->u.blt.sy,
-			   box->x2-box->x1, box->y2-box->y1,
 			   box->x1 + op->dst.x, box->y1 + op->dst.y,
+			   box->x2-box->x1, box->y2-box->y1,
 			   0xffffffff, op->u.blt.pixel);
 		box++;
 	} while (--n);


More information about the xorg-commit mailing list