xf86-video-intel: 4 commits - src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/sna_accel.c

Chris Wilson ickle at kemper.freedesktop.org
Thu Mar 14 15:04:17 PDT 2013


 src/sna/gen4_render.c |    4 ++--
 src/sna/gen5_render.c |    4 ++--
 src/sna/gen6_render.c |    4 ++--
 src/sna/gen7_render.c |   26 ++++++++++++++++++++++++--
 src/sna/kgem.c        |   21 +++++++++++++++------
 src/sna/sna_accel.c   |   30 ++++++++++++++++++++----------
 6 files changed, 65 insertions(+), 24 deletions(-)

New commits:
commit 94cb10c3f2b9bbb6ae3c76faebe9fc88691224a9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Mar 14 22:02:09 2013 +0000

    sna/gen5+: Add missing float casts in computation of scaled src offsets
    
    Without the casts, the division ends up as 0 rather than the fractional
    offset into the texture.
    
    The casts were missed in the claimed fix:
    
    commit 89038ddb96aabc4bc1f04402b2aca0ce546e8bf3
    Author: Chris Wilson <chris at chris-wilson.co.uk>
    Date:   Thu Feb 28 14:35:54 2013 +0000
    
        sna/video: Correct scaling of source offsets
    
    Reported-by: Roman Elshin <roman.elshin at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=62343
    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 67f7b64..e40a1b7 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1379,10 +1379,10 @@ gen4_render_video(struct sna *sna,
 #endif
 
 	src_scale_x = (float)src_width / dst_width / frame->width;
-	src_offset_x = frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
+	src_offset_x = (float)frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
 
 	src_scale_y = (float)src_height / dst_height / frame->height;
-	src_offset_y = frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
+	src_offset_y = (float)frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
 
 	box = REGION_RECTS(dstRegion);
 	nbox = REGION_NUM_RECTS(dstRegion);
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 8c8a996..8b50d22 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -1363,10 +1363,10 @@ gen5_render_video(struct sna *sna,
 #endif
 
 	src_scale_x = (float)src_width / dst_width / frame->width;
-	src_offset_x = frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
+	src_offset_x = (float)frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
 
 	src_scale_y = (float)src_height / dst_height / frame->height;
-	src_offset_y = frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
+	src_offset_y = (float)frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
 
 	box = REGION_RECTS(dstRegion);
 	nbox = REGION_NUM_RECTS(dstRegion);
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 8d15bd8..64eccc5 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1651,10 +1651,10 @@ gen6_render_video(struct sna *sna,
 #endif
 
 	src_scale_x = (float)src_width / dst_width / frame->width;
-	src_offset_x = frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
+	src_offset_x = (float)frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
 
 	src_scale_y = (float)src_height / dst_height / frame->height;
-	src_offset_y = frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
+	src_offset_y = (float)frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
 
 	box = REGION_RECTS(dstRegion);
 	nbox = REGION_NUM_RECTS(dstRegion);
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 4453797..80fa872 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1792,17 +1792,39 @@ gen7_render_video(struct sna *sna,
 	pix_yoff = 0;
 #endif
 
+	DBG(("%s: src=(%d, %d)x(%d, %d); frame=(%dx%d), dst=(%dx%d)\n",
+	     __FUNCTION__,
+	     frame->src.x1, frame->src.y1,
+	     src_width, src_height,
+	     dst_width, dst_height,
+	     frame->width, frame->height));
+
 	src_scale_x = (float)src_width / dst_width / frame->width;
-	src_offset_x = frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
+	src_offset_x = (float)frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
 
 	src_scale_y = (float)src_height / dst_height / frame->height;
-	src_offset_y = frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
+	src_offset_y = (float)frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
+
+	DBG(("%s: scale=(%f, %f), offset=(%f, %f)\n",
+	     __FUNCTION__,
+	     src_scale_x, src_scale_y,
+	     src_offset_x, src_offset_y));
 
 	box = REGION_RECTS(dstRegion);
 	nbox = REGION_NUM_RECTS(dstRegion);
 	while (nbox--) {
 		BoxRec r;
 
+		DBG(("%s: dst=(%d, %d), (%d, %d) + (%d, %d); src=(%f, %f), (%f, %f)\n",
+		     __FUNCTION__,
+		     box->x1, box->y1,
+		     box->x2, box->y2,
+		     pix_xoff, pix_yoff,
+		     box->x1 * src_scale_x + src_offset_x,
+		     box->y1 * src_scale_y + src_offset_y,
+		     box->x2 * src_scale_x + src_offset_x,
+		     box->y2 * src_scale_y + src_offset_y));
+
 		r.x1 = box->x1 + pix_xoff;
 		r.x2 = box->x2 + pix_xoff;
 		r.y1 = box->y1 + pix_yoff;
commit dad50881d545da665191c6681f2acd0ebc3ddbfc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Mar 14 14:53:13 2013 +0000

    sna: Consider placement hints when choosing userptr read path
    
    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 dfb160b..19fe1e3 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -13468,7 +13468,8 @@ static int sna_create_gc(GCPtr gc)
 static bool
 sna_get_image_blt(DrawablePtr drawable,
 		  RegionPtr region,
-		  char *dst)
+		  char *dst,
+		  unsigned flags)
 {
 	PixmapPtr pixmap = get_drawable_pixmap(drawable);
 	struct sna_pixmap *priv = sna_pixmap(pixmap);
@@ -13477,9 +13478,6 @@ sna_get_image_blt(DrawablePtr drawable,
 	bool ok = false;
 	int pitch;
 
-	if (!USE_USERPTR_DOWNLOADS)
-		return false;
-
 	if (priv == NULL)
 		return false;
 
@@ -13503,7 +13501,10 @@ sna_get_image_blt(DrawablePtr drawable,
 		return true;
 	}
 
-	if (!sna->kgem.has_userptr)
+	if (!sna->kgem.has_userptr || !USE_USERPTR_DOWNLOADS)
+		return false;
+
+	if (flags & (MOVE_WHOLE_HINT | MOVE_INPLACE_HINT))
 		return false;
 
 	if (priv->gpu_damage == NULL)
@@ -13575,14 +13576,15 @@ sna_get_image(DrawablePtr drawable,
 		drawable->bitsPerPixel >= 8 &&
 		PM_IS_SOLID(drawable, mask);
 
-	if (can_blt && sna_get_image_blt(drawable, &region, dst))
-		return;
-
 	flags = MOVE_READ;
 	if ((w | h) == 1)
 		flags |= MOVE_INPLACE_HINT;
 	if (w == drawable->width)
 		flags |= MOVE_WHOLE_HINT;
+
+	if (can_blt && sna_get_image_blt(drawable, &region, dst, flags))
+		return;
+
 	if (!sna_drawable_move_region_to_cpu(drawable, &region, flags))
 		return;
 
commit 11e2802528aed4ef9ffc8b75045c72ac641e54b1
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Mar 14 14:42:25 2013 +0000

    sna: Add handle info to sync DBG
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 538231f..34ea212 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -4769,14 +4769,17 @@ struct kgem_bo *kgem_create_map(struct kgem *kgem,
 
 void kgem_bo_sync__cpu(struct kgem *kgem, struct kgem_bo *bo)
 {
+	DBG(("%s: handle=%d\n", __FUNCTION__, bo->handle));
 	assert(bo->proxy == NULL);
 	kgem_bo_submit(kgem, bo);
 
 	if (bo->domain != DOMAIN_CPU) {
 		struct drm_i915_gem_set_domain set_domain;
 
-		DBG(("%s: SYNC: needs_flush? %d, domain? %d, busy? %d\n", __FUNCTION__,
-		     bo->needs_flush, bo->domain, __kgem_busy(kgem, bo->handle)));
+		DBG(("%s: SYNC: handle=%d, needs_flush? %d, domain? %d, busy? %d\n",
+		     __FUNCTION__, bo->handle,
+		     bo->needs_flush, bo->domain,
+		     __kgem_busy(kgem, bo->handle)));
 
 		VG_CLEAR(set_domain);
 		set_domain.handle = bo->handle;
@@ -4792,6 +4795,7 @@ void kgem_bo_sync__cpu(struct kgem *kgem, struct kgem_bo *bo)
 
 void kgem_bo_sync__cpu_full(struct kgem *kgem, struct kgem_bo *bo, bool write)
 {
+	DBG(("%s: handle=%d\n", __FUNCTION__, bo->handle));
 	assert(bo->proxy == NULL);
 
 	if (write || bo->needs_flush)
@@ -4800,8 +4804,10 @@ void kgem_bo_sync__cpu_full(struct kgem *kgem, struct kgem_bo *bo, bool write)
 	if (bo->domain != DOMAIN_CPU) {
 		struct drm_i915_gem_set_domain set_domain;
 
-		DBG(("%s: SYNC: needs_flush? %d, domain? %d, busy? %d\n", __FUNCTION__,
-		     bo->needs_flush, bo->domain, __kgem_busy(kgem, bo->handle)));
+		DBG(("%s: SYNC: handle=%d, needs_flush? %d, domain? %d, busy? %d\n",
+		     __FUNCTION__, bo->handle,
+		     bo->needs_flush, bo->domain,
+		     __kgem_busy(kgem, bo->handle)));
 
 		VG_CLEAR(set_domain);
 		set_domain.handle = bo->handle;
@@ -4818,14 +4824,17 @@ void kgem_bo_sync__cpu_full(struct kgem *kgem, struct kgem_bo *bo, bool write)
 
 void kgem_bo_sync__gtt(struct kgem *kgem, struct kgem_bo *bo)
 {
+	DBG(("%s: handle=%d\n", __FUNCTION__, bo->handle));
 	assert(bo->proxy == NULL);
 	kgem_bo_submit(kgem, bo);
 
 	if (bo->domain != DOMAIN_GTT) {
 		struct drm_i915_gem_set_domain set_domain;
 
-		DBG(("%s: SYNC: needs_flush? %d, domain? %d, busy? %d\n", __FUNCTION__,
-		     bo->needs_flush, bo->domain, __kgem_busy(kgem, bo->handle)));
+		DBG(("%s: SYNC: handle=%d, needs_flush? %d, domain? %d, busy? %d\n",
+		     __FUNCTION__, bo->handle,
+		     bo->needs_flush, bo->domain,
+		     __kgem_busy(kgem, bo->handle)));
 
 		VG_CLEAR(set_domain);
 		set_domain.handle = bo->handle;
commit 20832494be06da9ebc4801647521f95e092188fc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Mar 14 14:03:00 2013 +0000

    sna: Use userptr downloads for incomplete GPU damaged pixmaps
    
    If the pixmap is not wholly damaged, but still contains the region to be
    read, then use userptr (if available).
    
    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 ea7dc7a..dfb160b 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -13506,8 +13506,16 @@ sna_get_image_blt(DrawablePtr drawable,
 	if (!sna->kgem.has_userptr)
 		return false;
 
-	if (!DAMAGE_IS_ALL(priv->gpu_damage) ||
-	    !__kgem_bo_is_busy(&sna->kgem, priv->gpu_bo))
+	if (priv->gpu_damage == NULL)
+		return false;
+
+	assert(priv->gpu_bo);
+	if (!__kgem_bo_is_busy(&sna->kgem, priv->gpu_bo))
+		return false;
+
+	if (!DAMAGE_IS_ALL(priv->gpu_damage) &&
+	    !sna_damage_contains_box__no_reduce(priv->gpu_damage,
+						&region->extents))
 		return false;
 
 	DBG(("%s: download through a temporary map\n", __FUNCTION__));


More information about the xorg-commit mailing list