xf86-video-intel: src/sna/sna_video.c src/sna/sna_video.h src/sna/sna_video_overlay.c src/sna/sna_video_sprite.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Jan 7 02:42:45 PST 2015


 src/sna/sna_video.c         |   66 +++++++++++++++++++++++++++++++++++++++++
 src/sna/sna_video.h         |    3 +
 src/sna/sna_video_overlay.c |   70 --------------------------------------------
 src/sna/sna_video_sprite.c  |    9 -----
 4 files changed, 71 insertions(+), 77 deletions(-)

New commits:
commit 7b7f71a7d522f430e09f02d71eca24474408dc55
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jan 7 10:41:26 2015 +0000

    sna/video: Reuse fallback colorkey filler from overlay for 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 ed0e7b3..e2b11c3 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -591,6 +591,72 @@ use_gtt: /* copy data, must use GTT so that we keep the overlay uncached */
 	return true;
 }
 
+void sna_video_fill_colorkey(struct sna_video *video,
+			     const RegionRec *clip)
+{
+	struct sna *sna = video->sna;
+	PixmapPtr front = sna->front;
+	struct kgem_bo *bo = __sna_pixmap_get_bo(front);
+	uint8_t *dst, *tmp;
+	int w, width;
+
+	if (video->AlwaysOnTop || RegionEqual(&video->clip, (RegionPtr)clip))
+		return;
+
+	assert(bo);
+	if (!wedged(sna) &&
+	    sna_blt_fill_boxes(sna, GXcopy, bo,
+			       front->drawable.bitsPerPixel,
+			       video->color_key,
+			       region_rects(clip),
+			       region_num_rects(clip))) {
+		RegionCopy(&video->clip, (RegionPtr)clip);
+		return;
+	}
+
+	dst = kgem_bo_map__gtt(&sna->kgem, bo);
+	if (dst == NULL)
+		return;
+
+	w = front->drawable.bitsPerPixel/8;
+	width = (clip->extents.x2 - clip->extents.x1) * w;
+	tmp = malloc(width);
+	if (tmp == NULL)
+		return;
+
+	memcpy(tmp, &video->color_key, w);
+	while (2 * w < width) {
+		memcpy(tmp + w, tmp, w);
+		w *= 2;
+	}
+	if (w < width)
+		memcpy(tmp + w, tmp, width - w);
+
+	if (sigtrap_get() == 0) {
+		const BoxRec *box = region_rects(clip);
+		int n = region_num_rects(clip);
+
+		w = front->drawable.bitsPerPixel/8;
+		do {
+			int y = box->y1;
+			uint8_t *row = dst + y*bo->pitch + w*box->x1;
+
+			width = (box->x2 - box->x1) * w;
+			while (y < box->y2) {
+				memcpy(row, tmp, width);
+				row += bo->pitch;
+				y++;
+			}
+			box++;
+		} while (--n);
+		sigtrap_put();
+
+		RegionCopy(&video->clip, (RegionPtr)clip);
+	}
+
+	free(tmp);
+}
+
 XvAdaptorPtr sna_xv_adaptor_alloc(struct sna *sna)
 {
 	XvAdaptorPtr new_adaptors;
diff --git a/src/sna/sna_video.h b/src/sna/sna_video.h
index f21605f..dfb8c0c 100644
--- a/src/sna/sna_video.h
+++ b/src/sna/sna_video.h
@@ -193,6 +193,9 @@ bool
 sna_video_copy_data(struct sna_video *video,
 		    struct sna_video_frame *frame,
 		    const uint8_t *buf);
+void
+sna_video_fill_colorkey(struct sna_video *video,
+			const RegionRec *clip);
 
 void sna_video_buffer_fini(struct sna_video *video);
 
diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
index ee986fe..aee6d47 100644
--- a/src/sna/sna_video_overlay.c
+++ b/src/sna/sna_video_overlay.c
@@ -449,70 +449,6 @@ sna_video_overlay_show(struct sna *sna,
 	return true;
 }
 
-static bool fill_colorkey(struct sna_video *video, const RegionRec *clip)
-{
-	struct sna *sna = video->sna;
-	PixmapPtr front = sna->front;
-	struct kgem_bo *bo = __sna_pixmap_get_bo(front);
-	uint8_t *dst, *tmp;
-	int w, width;
-	bool ret;
-
-	assert(bo);
-
-	if (!wedged(sna) &&
-	    sna_blt_fill_boxes(sna, GXcopy, bo,
-			       front->drawable.bitsPerPixel,
-			       video->color_key,
-			       region_rects(clip),
-			       region_num_rects(clip)))
-		return true;
-
-	dst = kgem_bo_map__gtt(&sna->kgem, bo);
-	if (dst == NULL)
-		return false;
-
-	w = front->drawable.bitsPerPixel/8;
-	width = (clip->extents.x2 - clip->extents.x1) * w;
-	tmp = malloc(width);
-	if (tmp == NULL)
-		return false;
-
-	memcpy(tmp, &video->color_key, w);
-	while (2 * w < width) {
-		memcpy(tmp + w, tmp, w);
-		w *= 2;
-	}
-	if (w < width)
-		memcpy(tmp + w, tmp, width - w);
-
-	ret = false;
-	if (sigtrap_get() == 0) {
-		const BoxRec *box = region_rects(clip);
-		int n = region_num_rects(clip);
-
-		w = front->drawable.bitsPerPixel/8;
-		do {
-			int y = box->y1;
-			uint8_t *row = dst + y*bo->pitch + w*box->x1;
-
-			width = (box->x2 - box->x1) * w;
-			while (y < box->y2) {
-				memcpy(row, tmp, width);
-				row += bo->pitch;
-				y++;
-			}
-			box++;
-		} while (--n);
-		sigtrap_put();
-
-		ret = true;
-	}
-
-	free(tmp);
-	return ret;
-}
-
 static int
 sna_video_overlay_put_image(ddPutImage_ARGS)
 {
@@ -615,11 +551,7 @@ sna_video_overlay_put_image(ddPutImage_ARGS)
 	ret = Success;
 	if (sna_video_overlay_show
 	    (sna, video, &frame, crtc, &dstBox, src_w, src_h, drw_w, drw_h)) {
-		//xf86XVFillKeyHelperDrawable(draw, video->color_key, &clip);
-		if (!video->AlwaysOnTop &&
-		    !RegionEqual(&video->clip, &clip) &&
-		    fill_colorkey(video, &clip))
-			RegionCopy(&video->clip, &clip);
+		sna_video_fill_colorkey(video, &clip);
 		sna_window_set_port((WindowPtr)draw, port);
 	} else {
 		DBG(("%s: failed to show video frame\n", __FUNCTION__));
diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
index 92230f9..9ce9879 100644
--- a/src/sna/sna_video_sprite.c
+++ b/src/sna/sna_video_sprite.c
@@ -527,14 +527,7 @@ off:
 			goto err;
 	}
 
-	if (!video->AlwaysOnTop && !RegionEqual(&video->clip, &clip) &&
-	    sna_blt_fill_boxes(sna, GXcopy,
-			       __sna_pixmap_get_bo(sna->front),
-			       sna->front->drawable.bitsPerPixel,
-			       video->color_key,
-			       region_rects(&clip),
-			       region_num_rects(&clip)))
-		RegionCopy(&video->clip, &clip);
+	sna_video_fill_colorkey(video, &clip);
 	sna_window_set_port((WindowPtr)draw, port);
 
 	return Success;


More information about the xorg-commit mailing list