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