xf86-video-intel: 5 commits - src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/sna_video.c src/sna/sna_video.h src/sna/sna_video_overlay.c src/sna/sna_video_sprite.c src/sna/sna_video_textured.c

Chris Wilson ickle at kemper.freedesktop.org
Tue Dec 18 15:11:01 PST 2012


 src/sna/gen3_render.c        |   26 ++----
 src/sna/gen4_render.c        |   17 +---
 src/sna/gen5_render.c        |   17 +---
 src/sna/gen6_render.c        |   17 +---
 src/sna/gen7_render.c        |   17 +---
 src/sna/sna_video.c          |  173 +++++++++++++++++++++----------------------
 src/sna/sna_video.h          |    2 
 src/sna/sna_video_overlay.c  |   12 ++
 src/sna/sna_video_sprite.c   |   57 +++++++++-----
 src/sna/sna_video_textured.c |    7 -
 10 files changed, 180 insertions(+), 165 deletions(-)

New commits:
commit bfd96b092db5e4e0fc2446752deafd1156cf37b3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Dec 18 20:54:33 2012 +0000

    sna/video: Fix presentation of cropped sprites
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
index 7d335c0..0a0f152 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -100,9 +100,17 @@ sna_video_buffer(struct sna *sna,
 	if (video->buf && __kgem_bo_size(video->buf) < frame->size)
 		sna_video_free_buffers(sna, video);
 
-	if (video->buf == NULL)
-		video->buf = kgem_create_linear(&sna->kgem, frame->size,
-						CREATE_GTT_MAP);
+	if (video->buf == NULL) {
+		if (video->tiled) {
+			video->buf = kgem_create_2d(&sna->kgem,
+						    frame->width, frame->height, 32,
+						    I915_TILING_X,
+						    CREATE_EXACT | CREATE_SCANOUT);
+		} else {
+			video->buf = kgem_create_linear(&sna->kgem, frame->size,
+							CREATE_GTT_MAP);
+		}
+	}
 
 	return video->buf;
 }
@@ -178,7 +186,7 @@ sna_video_clip_helper(ScrnInfoPtr scrn,
 		frame->image.y2 = ALIGN(frame->src.y2, 2);
 	} else {
 		frame->image.y1 = frame->src.y1;
-		frame->image.y1 = frame->src.y2;
+		frame->image.y2 = frame->src.y2;
 	}
 
 	return ret;
@@ -197,29 +205,10 @@ sna_video_frame_init(struct sna *sna,
 	frame->width = width;
 	frame->height = height;
 
-	/* Only needs to be DWORD-aligned for textured on i915, but overlay has
-	 * stricter requirements.
-	 */
-	if (video->textured) {
-		align = 4;
-	} else {
-		if (sna->kgem.gen >= 040)
-			/* Actually the alignment is 64 bytes, too. But the
-			 * stride must be at least 512 bytes. Take the easy fix
-			 * and align on 512 bytes unconditionally. */
-			align = 512;
-		else if (sna->kgem.gen < 021)
-			/* Harsh, errata on these chipsets limit the stride
-			 * to be a multiple of 256 bytes.
-			 */
-			align = 256;
-		else
-			align = 64;
-	}
-
+	align = video->alignment;
 #if SNA_XVMC
 	/* for i915 xvmc, hw requires 1kb aligned surfaces */
-	if (id == FOURCC_XVMC && sna->kgem.gen < 040)
+	if (id == FOURCC_XVMC && sna->kgem.gen < 040 && align < 1024)
 		align = 1024;
 #endif
 
@@ -453,13 +442,16 @@ sna_video_copy_data(struct sna *sna,
 {
 	uint8_t *dst;
 
-	DBG(("%s: handle=%d, size=%dx%d, rotation=%d\n",
+	DBG(("%s: handle=%d, size=%dx%d, rotation=%d, is-texture=%d\n",
 	     __FUNCTION__, frame->bo ? frame->bo->handle : 0,
-	     frame->width, frame->height, video->rotation));
-	DBG(("%s: top=%d, left=%d\n", __FUNCTION__, frame->top, frame->left));
+	     frame->width, frame->height, video->rotation, video->textured));
+	DBG(("%s: image=(%d, %d), (%d, %d), source=(%d, %d), (%d, %d)\n",
+	     __FUNCTION__,
+	     frame->image.x1, frame->image.y1, frame->image.x2, frame->image.y2,
+	     frame->src.x1, frame->src.y1, frame->src.x2, frame->src.y2));
 
 	/* In the common case, we can simply the upload in a single pwrite */
-	if (video->rotation == RR_Rotate_0) {
+	if (video->rotation == RR_Rotate_0 && !video->tiled) {
 		if (is_planar_fourcc(frame->id)) {
 			int w = frame->image.x2 - frame->image.x1;
 			int h = frame->image.y2 - frame->image.y1;
diff --git a/src/sna/sna_video.h b/src/sna/sna_video.h
index 774ddb8..c0c023c 100644
--- a/src/sna/sna_video.h
+++ b/src/sna/sna_video.h
@@ -57,6 +57,8 @@ struct sna_video {
 	struct kgem_bo *old_buf[2];
 	struct kgem_bo *buf;
 
+	int alignment;
+	bool tiled;
 	bool textured;
 	Rotation rotation;
 	int plane;
diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
index a1a905a..3655b87 100644
--- a/src/sna/sna_video_overlay.c
+++ b/src/sna/sna_video_overlay.c
@@ -702,6 +702,18 @@ XF86VideoAdaptorPtr sna_video_overlay_setup(struct sna *sna,
 	adaptor->PutImage = sna_video_overlay_put_image;
 	adaptor->QueryImageAttributes = sna_video_overlay_query_video_attributes;
 
+	if (sna->kgem.gen >= 040)
+		/* Actually the alignment is 64 bytes, too. But the
+		 * stride must be at least 512 bytes. Take the easy fix
+		 * and align on 512 bytes unconditionally. */
+		video->alignment = 512;
+	else if (sna->kgem.gen < 021)
+		/* Harsh, errata on these chipsets limit the stride
+		 * to be a multiple of 256 bytes.
+		 */
+		video->alignment = 256;
+	else
+		video->alignment = 64;
 	video->textured = false;
 	video->color_key = sna_video_overlay_color_key(sna);
 	video->brightness = -19;	/* (255/219) * -16 */
diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
index 79b4af2..7737460 100644
--- a/src/sna/sna_video_sprite.c
+++ b/src/sna/sna_video_sprite.c
@@ -38,6 +38,7 @@
 #include <X11/extensions/Xv.h>
 #include <fourcc.h>
 #include <i915_drm.h>
+#include <errno.h>
 
 #ifdef  DRM_IOCTL_MODE_GETPLANERESOURCES
 #include <drm_fourcc.h>
@@ -62,13 +63,14 @@ static XF86AttributeRec attribs[] = {
 
 static void sna_video_sprite_off(struct sna *sna, struct sna_video *video)
 {
+	struct drm_mode_set_plane s;
+
 	if (video->plane == 0)
 		return;
 
-	if (drmModeSetPlane(sna->kgem.fd,
-			    video->plane, 0, 0, 0,
-			    0, 0, 0, 0,
-			    0, 0, 0, 0))
+	memset(&s, 0, sizeof(s));
+	s.plane_id = video->plane;
+	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_SETPLANE, &s))
 		xf86DrvMsg(sna->scrn->scrnIndex, X_ERROR,
 			   "failed to disable plane\n");
 
@@ -183,7 +185,10 @@ sna_video_sprite_show(struct sna *sna,
 		      xf86CrtcPtr crtc,
 		      BoxPtr dstBox)
 {
-	uint32_t plane = sna_crtc_to_plane(crtc);
+	struct drm_mode_set_plane s;
+
+	VG_CLEAR(s);
+	s.plane_id = sna_crtc_to_plane(crtc);
 
 	update_dst_box_to_crtc_coords(sna, crtc, dstBox);
 	if (crtc->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
@@ -193,13 +198,13 @@ sna_video_sprite_show(struct sna *sna,
 	}
 
 #if defined(DRM_I915_SET_SPRITE_DESTKEY)
-	if (video->color_key_changed || video->plane != plane) {
+	if (video->color_key_changed || video->plane != s.plane_id) {
 		struct drm_intel_set_sprite_destkey set;
 
 		DBG(("%s: updating color key: %x\n",
 		     __FUNCTION__, video->color_key));
 
-		set.plane_id = plane;
+		set.plane_id = s.plane_id;
 		set.value = video->color_key;
 
 		if (drmIoctl(sna->kgem.fd,
@@ -230,8 +235,9 @@ sna_video_sprite_show(struct sna *sna,
 		pitches[0] = frame->pitch[0];
 		offsets[0] = 0;
 
-		DBG(("%s: creating new fb for handle=%d\n",
-		     __FUNCTION__, frame->bo->handle));
+		DBG(("%s: creating new fb for handle=%d, width=%d, height=%d, stride=%d\n",
+		     __FUNCTION__, frame->bo->handle,
+		     frame->width, frame->height, frame->pitch[0]));
 
 		if (drmModeAddFB2(sna->kgem.fd,
 				  frame->width, frame->height, pixel_format,
@@ -245,22 +251,33 @@ sna_video_sprite_show(struct sna *sna,
 		frame->bo->scanout = true;
 	}
 
-	DBG(("%s: updating plane=%d, handle=%d [fb %d], dst=(%d,%d)x(%d,%d)\n",
-	     __FUNCTION__, plane, frame->bo->handle, frame->bo->delta,
-	     dstBox->x1, dstBox->y1,
-	     dstBox->x2 - dstBox->x1, dstBox->y2 - dstBox->y1));
 	assert(frame->bo->scanout);
 	assert(frame->bo->delta);
 
-	if (drmModeSetPlane(sna->kgem.fd,
-			    plane, sna_crtc_id(crtc), frame->bo->delta, 0,
-			    dstBox->x1, dstBox->y1,
-			    dstBox->x2 - dstBox->x1, dstBox->y2 - dstBox->y1,
-			    0, 0, frame->width << 16, frame->height << 16))
+	s.crtc_id = sna_crtc_id(crtc);
+	s.fb_id = frame->bo->delta;
+	s.flags = 0;
+	s.crtc_x = dstBox->x1;
+	s.crtc_y = dstBox->y1;
+	s.crtc_w = dstBox->x2 - dstBox->x1;
+	s.crtc_h = dstBox->y2 - dstBox->y1;
+	s.src_x = 0;
+	s.src_y = 0;
+	s.src_w = (frame->image.x2 - frame->image.x1) << 16;
+	s.src_h = (frame->image.y2 - frame->image.y1) << 16;
+
+	DBG(("%s: updating crtc=%d, plane=%d, handle=%d [fb %d], dst=(%d,%d)x(%d,%d), src=(%d,%d)x(%d,%d)\n",
+	     __FUNCTION__, s.crtc_id, s.plane_id, frame->bo->handle, s.fb_id,
+	     s.crtc_x, s.crtc_y, s.crtc_w, s.crtc_h,
+	     s.src_x >> 16, s.src_y >> 16, s.src_w >> 16, s.src_h >> 16));
+
+	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_SETPLANE, &s)) {
+		DBG(("SET_PLANE failed: ret=%d\n", errno));
 		return false;
+	}
 
 	frame->bo->domain = DOMAIN_NONE;
-	video->plane = plane;
+	video->plane = s.plane_id;
 	return true;
 }
 
@@ -422,7 +439,7 @@ XF86VideoAdaptorPtr sna_video_sprite_setup(struct sna *sna,
 	adaptor->PutImage = sna_video_sprite_put_image;
 	adaptor->QueryImageAttributes = sna_video_sprite_query_attrs;
 
-	video->textured = false;
+	video->alignment = 64;
 	video->color_key = sna_video_sprite_color_key(sna);
 	video->color_key_changed = true;
 	video->brightness = -19;	/* (255/219) * -16 */
diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
index cc35c57..c5947ed 100644
--- a/src/sna/sna_video_textured.c
+++ b/src/sna/sna_video_textured.c
@@ -453,6 +453,7 @@ XF86VideoAdaptorPtr sna_video_textured_setup(struct sna *sna,
 		struct sna_video *v = &video[i];
 
 		v->textured = true;
+		video->alignment = 4;
 		v->rotation = RR_Rotate_0;
 		v->SyncToVblank = 1;
 
commit 2df1b1abf0728f28d2803a096f945779cbe7c70b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Dec 18 16:07:26 2012 +0000

    sna/video: Fix up copying cropped textured video packed data
    
    Simply ignore the cropping and copy the whole plane rather than
    complicate the computation of the packed destination pixels.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
index eb38457..7d335c0 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -356,11 +356,22 @@ sna_copy_packed_data(struct sna_video *video,
 {
 	int pitch = frame->width << 1;
 	const uint8_t *src, *s;
-	int w = frame->image.x2 - frame->image.x1;
-	int h = frame->image.y2 - frame->image.y1;
+	int x, y, w, h;
 	int i, j;
 
-	src = buf + (frame->image.y1 * pitch) + (frame->image.x1 << 1);
+	if (video->textured) {
+		/* XXX support copying cropped extents */
+		x = y = 0;
+		w = frame->width;
+		h = frame->height;
+	} else {
+		x = frame->image.x1;
+		y = frame->image.y1;
+		w = frame->image.x2 - frame->image.x1;
+		h = frame->image.y2 - frame->image.y1;
+	}
+
+	src = buf + (y * pitch) + (x << 1);
 
 	switch (video->rotation) {
 	case RR_Rotate_0:
@@ -383,7 +394,7 @@ sna_copy_packed_data(struct sna_video *video,
 			src += pitch;
 		}
 		h >>= 1;
-		src = buf + (frame->image.y1 * pitch) + (frame->image.x1 << 1);
+		src = buf + (y * pitch) + (x << 1);
 		for (i = 0; i < h; i += 2) {
 			for (j = 0; j < w; j += 2) {
 				/* Copy U */
@@ -419,7 +430,7 @@ sna_copy_packed_data(struct sna_video *video,
 			src += pitch;
 		}
 		h >>= 1;
-		src = buf + (frame->image.y1 * pitch) + (frame->image.x1 << 1);
+		src = buf + (y * pitch) + (x << 1);
 		for (i = 0; i < h; i += 2) {
 			for (j = 0; j < w; j += 2) {
 				/* Copy U */
commit 8d523fa824dcb1987557164d048711c1745de378
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Dec 18 16:07:26 2012 +0000

    sna/video: Fix up destination offset for copying cropped textured video planes
    
    Oh fun. Textured video expects the source content to be relative to the
    origin, whereas overlay video expects the source at the origin.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
index 76fc3e0..eb38457 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -259,49 +259,64 @@ sna_video_frame_init(struct sna *sna,
 	}
 }
 
-static void sna_memcpy_plane(uint8_t *dst, const uint8_t *src,
-			     int height, int width,
-			     int dstPitch, int srcPitch,
-			     Rotation rotation)
+static void sna_memcpy_plane(struct sna_video *video,
+			     uint8_t *dst, const uint8_t *src,
+			     const struct sna_video_frame *frame, int sub)
 {
+	int dstPitch = frame->pitch[!sub], srcPitch;
 	const uint8_t *s;
 	int i, j = 0;
+	int x, y, w, h;
+
+	x = frame->image.x1;
+	y = frame->image.y1;
+	w = frame->image.x2 - frame->image.x1;
+	h = frame->image.y2 - frame->image.y1;
+	if (sub) {
+		x >>= 1; w >>= 1;
+		y >>= 1; h >>= 1;
+		srcPitch = ALIGN((frame->width >> 1), 4);
+	} else
+		srcPitch = ALIGN(frame->width, 4);
+
+	src += y * srcPitch + x;
+	if (!video->textured)
+		x = y = 0;
 
-	switch (rotation) {
+	switch (video->rotation) {
 	case RR_Rotate_0:
-		/* optimise for the case of no clipping */
-		if (srcPitch == dstPitch && srcPitch == width)
-			memcpy(dst, src, srcPitch * height);
-		else while (height--) {
-			memcpy(dst, src, width);
+		dst += y * dstPitch + x;
+		if (srcPitch == dstPitch && srcPitch == w)
+			memcpy(dst, src, srcPitch * h);
+		else while (h--) {
+			memcpy(dst, src, w);
 			src += srcPitch;
 			dst += dstPitch;
 		}
 		break;
 	case RR_Rotate_90:
-		for (i = 0; i < height; i++) {
+		for (i = 0; i < h; i++) {
 			s = src;
-			for (j = 0; j < width; j++) {
-				dst[(i) + ((width - j - 1) * dstPitch)] = *s++;
-			}
+			for (j = 0; j < w; j++)
+				dst[i + ((x + w - j - 1) * dstPitch)] = *s++;
 			src += srcPitch;
 		}
 		break;
 	case RR_Rotate_180:
-		for (i = 0; i < height; i++) {
+		for (i = 0; i < h; i++) {
 			s = src;
-			for (j = 0; j < width; j++) {
-				dst[(width - j - 1) +
-				    ((height - i - 1) * dstPitch)] = *s++;
+			for (j = 0; j < w; j++) {
+				dst[(x + w - j - 1) +
+				    ((h - i - 1) * dstPitch)] = *s++;
 			}
 			src += srcPitch;
 		}
 		break;
 	case RR_Rotate_270:
-		for (i = 0; i < height; i++) {
+		for (i = 0; i < h; i++) {
 			s = src;
-			for (j = 0; j < width; j++) {
-				dst[(height - i - 1) + (j * dstPitch)] = *s++;
+			for (j = 0; j < w; j++) {
+				dst[(h - i - 1) + (x + j * dstPitch)] = *s++;
 			}
 			src += srcPitch;
 		}
@@ -315,36 +330,22 @@ sna_copy_planar_data(struct sna_video *video,
 		     const uint8_t *src, uint8_t *dst)
 {
 	uint8_t *d;
-	int w = frame->image.x2 - frame->image.x1;
-	int h = frame->image.y2 - frame->image.y1;
-	int pitch;
-
-	pitch = ALIGN(frame->width, 4);
-	sna_memcpy_plane(dst, src + frame->image.y1 * pitch + frame->image.x1,
-			 h, w, frame->pitch[1], pitch, video->rotation);
 
-	src += frame->height * pitch; /* move over Luma plane */
-
-	/* align to beginning of chroma planes */
-	pitch = ALIGN((frame->width >> 1), 0x4);
-	src += (frame->image.y1 >> 1) * pitch + (frame->image.x1 >> 1);
-	w >>= 1;
-	h >>= 1;
+	sna_memcpy_plane(video, dst, src, frame, 0);
+	src += frame->height * ALIGN(frame->width, 4);
 
 	if (frame->id == FOURCC_I420)
 		d = dst + frame->UBufOffset;
 	else
 		d = dst + frame->VBufOffset;
-
-	sna_memcpy_plane(d, src, h, w, frame->pitch[0], pitch, video->rotation);
-	src += (frame->height >> 1) * pitch; /* move over Chroma plane */
+	sna_memcpy_plane(video, d, src, frame, 1);
+	src += (frame->height >> 1) * ALIGN(frame->width >> 1, 4);
 
 	if (frame->id == FOURCC_I420)
 		d = dst + frame->VBufOffset;
 	else
 		d = dst + frame->UBufOffset;
-
-	sna_memcpy_plane(d, src, h, w, frame->pitch[0], pitch, video->rotation);
+	sna_memcpy_plane(video, d, src, frame, 1);
 }
 
 static void
commit 7bb4573fcc2cf1b8b6bff5d885a2fa81200d2fd7
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Dec 18 15:48:21 2012 +0000

    sna/video: Fix up the image size for copying
    
    Yikes, setting image.x2 == image.x1 meant no data was copied whilst the
    video was clipped.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
index 578a759..76fc3e0 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -172,7 +172,7 @@ sna_video_clip_helper(ScrnInfoPtr scrn,
 	frame->src.y2 = (y2 + 0xffff) >> 16;
 
 	frame->image.x1 = frame->src.x1 & ~1;
-	frame->image.x2 = ALIGN(frame->src.x1, 2);
+	frame->image.x2 = ALIGN(frame->src.x2, 2);
 	if (is_planar_fourcc(frame->id)) {
 		frame->image.y1 = frame->src.y1 & ~1;
 		frame->image.y2 = ALIGN(frame->src.y2, 2);
@@ -449,19 +449,14 @@ sna_video_copy_data(struct sna *sna,
 	/* In the common case, we can simply the upload in a single pwrite */
 	if (video->rotation == RR_Rotate_0) {
 		if (is_planar_fourcc(frame->id)) {
-			uint16_t pitch[2] = {
-				ALIGN((frame->width >> 1), 0x4),
-				ALIGN(frame->width, 0x4),
-			};
-			if (pitch[0] == frame->pitch[0] &&
-			    pitch[1] == frame->pitch[1] &&
-			    (frame->image.y1 | frame->image.x1) == 0) {
-				uint32_t len =
-					(uint32_t)pitch[1]*frame->height +
-					(uint32_t)pitch[0]*frame->height;
+			int w = frame->image.x2 - frame->image.x1;
+			int h = frame->image.y2 - frame->image.y1;
+			if (ALIGN(h, 2) == frame->height &&
+			    ALIGN(w >> 1, 4) == frame->pitch[0] &&
+			    ALIGN(w, 4) == frame->pitch[1]) {
 				if (frame->bo) {
 					kgem_bo_write(&sna->kgem, frame->bo,
-						      buf, len);
+						      buf, frame->size);
 				} else {
 					frame->bo = kgem_create_buffer(&sna->kgem, frame->size,
 								       KGEM_BUFFER_WRITE | KGEM_BUFFER_WRITE_INPLACE,
@@ -469,7 +464,7 @@ sna_video_copy_data(struct sna *sna,
 					if (frame->bo == NULL)
 						return false;
 
-					memcpy(dst, buf, len);
+					memcpy(dst, buf, frame->size);
 				}
 				if (frame->id != FOURCC_I420) {
 					uint32_t tmp;
commit 551b400377ddc5eb1e89b8b5827a42e810c8d23d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Dec 18 15:14:00 2012 +0000

    sna/video: Amalgamate the computation of source vs dest offsets
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 3ad8a8a..34dcd04 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3875,10 +3875,8 @@ gen3_render_video(struct sna *sna,
 	struct sna_pixmap *priv = sna_pixmap(pixmap);
 	BoxPtr pbox = REGION_RECTS(dstRegion);
 	int nbox = REGION_NUM_RECTS(dstRegion);
-	int dxo = dstRegion->extents.x1 + dx;
-	int dyo = dstRegion->extents.y1 + dy;
-	int width = dstRegion->extents.x2 - dxo;
-	int height = dstRegion->extents.y2 - dyo;
+	int width = dstRegion->extents.x2 - dstRegion->extents.x1;
+	int height = dstRegion->extents.y2 - dstRegion->extents.y1;
 	float src_scale_x, src_scale_y;
 	int pix_xoff, pix_yoff;
 	struct kgem_bo *dst_bo;
@@ -3904,8 +3902,8 @@ gen3_render_video(struct sna *sna,
 		if (!dst_bo)
 			return false;
 
-		pix_xoff = -dxo;
-		pix_yoff = -dyo;
+		pix_xoff = -dstRegion->extents.x1;
+		pix_yoff = -dstRegion->extents.y1;
 		copy = 1;
 	} else {
 		width = pixmap->drawable.width;
@@ -3930,7 +3928,7 @@ gen3_render_video(struct sna *sna,
 
 	DBG(("%s: src offset=(%d, %d), scale=(%f, %f), dst offset=(%d, %d)\n",
 	     __FUNCTION__,
-	     dxo, dyo, src_scale_x, src_scale_y, pix_xoff, pix_yoff));
+	     dx, dy, src_scale_x, src_scale_y, pix_xoff, pix_yoff));
 
 	gen3_video_get_batch(sna, dst_bo);
 	gen3_emit_video_state(sna, video, frame, pixmap,
@@ -3960,20 +3958,20 @@ gen3_render_video(struct sna *sna,
 			/* bottom right */
 			OUT_BATCH_F(box_x2 + pix_xoff);
 			OUT_BATCH_F(box_y2 + pix_yoff);
-			OUT_BATCH_F((box_x2 - dxo) * src_scale_x);
-			OUT_BATCH_F((box_y2 - dyo) * src_scale_y);
+			OUT_BATCH_F((box_x2 - dx) * src_scale_x);
+			OUT_BATCH_F((box_y2 - dy) * src_scale_y);
 
 			/* bottom left */
 			OUT_BATCH_F(box_x1 + pix_xoff);
 			OUT_BATCH_F(box_y2 + pix_yoff);
-			OUT_BATCH_F((box_x1 - dxo) * src_scale_x);
-			OUT_BATCH_F((box_y2 - dyo) * src_scale_y);
+			OUT_BATCH_F((box_x1 - dx) * src_scale_x);
+			OUT_BATCH_F((box_y2 - dy) * src_scale_y);
 
 			/* top left */
 			OUT_BATCH_F(box_x1 + pix_xoff);
 			OUT_BATCH_F(box_y1 + pix_yoff);
-			OUT_BATCH_F((box_x1 - dxo) * src_scale_x);
-			OUT_BATCH_F((box_y1 - dyo) * src_scale_y);
+			OUT_BATCH_F((box_x1 - dx) * src_scale_x);
+			OUT_BATCH_F((box_y1 - dy) * src_scale_y);
 		}
 	} while (nbox);
 
@@ -3986,7 +3984,7 @@ gen3_render_video(struct sna *sna,
 		pix_yoff = 0;
 #endif
 		sna_blt_copy_boxes(sna, GXcopy,
-				   dst_bo, -dxo, -dyo,
+				   dst_bo, -dstRegion->extents.x1, -dstRegion->extents.y1,
 				   priv->gpu_bo, pix_xoff, pix_yoff,
 				   pixmap->drawable.bitsPerPixel,
 				   REGION_RECTS(dstRegion),
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index b05361d..ee37378 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1671,7 +1671,7 @@ gen4_render_video(struct sna *sna,
 		  PixmapPtr pixmap)
 {
 	struct sna_composite_op tmp;
-	int nbox, dxo, dyo, pix_xoff, pix_yoff;
+	int nbox, pix_xoff, pix_yoff;
 	float src_scale_x, src_scale_y;
 	struct sna_pixmap *priv;
 	BoxPtr box;
@@ -1725,9 +1725,6 @@ gen4_render_video(struct sna *sna,
 	pix_yoff = 0;
 #endif
 
-	dxo = dstRegion->extents.x1 + dx;
-	dyo = dstRegion->extents.y1 + dy;
-
 	/* Use normalized texture coordinates */
 	src_scale_x = ((float)src_w / frame->width) / (float)drw_w;
 	src_scale_y = ((float)src_h / frame->height) / (float)drw_h;
@@ -1745,16 +1742,16 @@ gen4_render_video(struct sna *sna,
 		gen4_get_rectangles(sna, &tmp, 1, gen4_video_bind_surfaces);
 
 		OUT_VERTEX(r.x2, r.y2);
-		OUT_VERTEX_F((box->x2 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x2 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
 
 		OUT_VERTEX(r.x1, r.y2);
-		OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
 
 		OUT_VERTEX(r.x1, r.y1);
-		OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y1 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y1 - dy) * src_scale_y);
 
 		if (!DAMAGE_IS_ALL(priv->gpu_damage)) {
 			sna_damage_add_box(&priv->gpu_damage, &r);
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 7f0e8fb..3a9fd8c 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -1668,7 +1668,7 @@ gen5_render_video(struct sna *sna,
 		  PixmapPtr pixmap)
 {
 	struct sna_composite_op tmp;
-	int nbox, dxo, dyo, pix_xoff, pix_yoff;
+	int nbox, pix_xoff, pix_yoff;
 	float src_scale_x, src_scale_y;
 	struct sna_pixmap *priv;
 	BoxPtr box;
@@ -1722,9 +1722,6 @@ gen5_render_video(struct sna *sna,
 	pix_yoff = 0;
 #endif
 
-	dxo = dstRegion->extents.x1 + dx;
-	dyo = dstRegion->extents.y1 + dy;
-
 	/* Use normalized texture coordinates */
 	src_scale_x = ((float)src_w / frame->width) / (float)drw_w;
 	src_scale_y = ((float)src_h / frame->height) / (float)drw_h;
@@ -1742,16 +1739,16 @@ gen5_render_video(struct sna *sna,
 		gen5_get_rectangles(sna, &tmp, 1, gen5_video_bind_surfaces);
 
 		OUT_VERTEX(r.x2, r.y2);
-		OUT_VERTEX_F((box->x2 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x2 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
 
 		OUT_VERTEX(r.x1, r.y2);
-		OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
 
 		OUT_VERTEX(r.x1, r.y1);
-		OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y1 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y1 - dy) * src_scale_y);
 
 		if (!DAMAGE_IS_ALL(priv->gpu_damage)) {
 			sna_damage_add_box(&priv->gpu_damage, &r);
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 7f17c71..c614363 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1980,7 +1980,7 @@ gen6_render_video(struct sna *sna,
 		  PixmapPtr pixmap)
 {
 	struct sna_composite_op tmp;
-	int nbox, dxo, dyo, pix_xoff, pix_yoff;
+	int nbox, pix_xoff, pix_yoff;
 	float src_scale_x, src_scale_y;
 	struct sna_pixmap *priv;
 	unsigned filter;
@@ -2048,9 +2048,6 @@ gen6_render_video(struct sna *sna,
 	pix_yoff = 0;
 #endif
 
-	dxo = dstRegion->extents.x1 + dx;
-	dyo = dstRegion->extents.y1 + dy;
-
 	/* Use normalized texture coordinates */
 	src_scale_x = ((float)src_w / frame->width) / (float)drw_w;
 	src_scale_y = ((float)src_h / frame->height) / (float)drw_h;
@@ -2068,16 +2065,16 @@ gen6_render_video(struct sna *sna,
 		gen6_get_rectangles(sna, &tmp, 1, gen6_emit_video_state);
 
 		OUT_VERTEX(r.x2, r.y2);
-		OUT_VERTEX_F((box->x2 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x2 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
 
 		OUT_VERTEX(r.x1, r.y2);
-		OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
 
 		OUT_VERTEX(r.x1, r.y1);
-		OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y1 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y1 - dy) * src_scale_y);
 
 		if (!DAMAGE_IS_ALL(priv->gpu_damage)) {
 			sna_damage_add_box(&priv->gpu_damage, &r);
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index aeace74..4c67340 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2092,7 +2092,7 @@ gen7_render_video(struct sna *sna,
 		  PixmapPtr pixmap)
 {
 	struct sna_composite_op tmp;
-	int nbox, dxo, dyo, pix_xoff, pix_yoff;
+	int nbox, pix_xoff, pix_yoff;
 	float src_scale_x, src_scale_y;
 	struct sna_pixmap *priv;
 	unsigned filter;
@@ -2160,9 +2160,6 @@ gen7_render_video(struct sna *sna,
 	pix_yoff = 0;
 #endif
 
-	dxo = dstRegion->extents.x1 + dx;
-	dyo = dstRegion->extents.y1 + dy;
-
 	/* Use normalized texture coordinates */
 	src_scale_x = ((float)src_w / frame->width) / (float)drw_w;
 	src_scale_y = ((float)src_h / frame->height) / (float)drw_h;
@@ -2180,16 +2177,16 @@ gen7_render_video(struct sna *sna,
 		gen7_get_rectangles(sna, &tmp, 1, gen7_emit_video_state);
 
 		OUT_VERTEX(r.x2, r.y2);
-		OUT_VERTEX_F((box->x2 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x2 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
 
 		OUT_VERTEX(r.x1, r.y2);
-		OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
 
 		OUT_VERTEX(r.x1, r.y1);
-		OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
-		OUT_VERTEX_F((box->y1 - dyo) * src_scale_y);
+		OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
+		OUT_VERTEX_F((box->y1 - dy) * src_scale_y);
 
 		if (!DAMAGE_IS_ALL(priv->gpu_damage)) {
 			sna_damage_add_box(&priv->gpu_damage, &r);
diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
index 70ea931..cc35c57 100644
--- a/src/sna/sna_video_textured.c
+++ b/src/sna/sna_video_textured.c
@@ -288,10 +288,8 @@ sna_video_textured_put_image(ScrnInfoPtr scrn,
 
 	ret = Success;
 	if (!sna->render.video(sna, video, &frame, clip,
-			       src_w, src_h,
-			       drw_w, drw_h,
-			       drw_x - clip->extents.x1 - src_x,
-			       drw_y - clip->extents.y1 - src_y,
+			       src_w, src_h, drw_w, drw_h,
+			       drw_x - src_x, drw_y - src_y,
 			       pixmap)) {
 		DBG(("%s: failed to render video\n", __FUNCTION__));
 		ret = BadAlloc;


More information about the xorg-commit mailing list