summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sna/sna_video.h1
-rw-r--r--src/sna/sna_video_overlay.c17
-rw-r--r--src/sna/sna_video_sprite.c11
3 files changed, 28 insertions, 1 deletions
diff --git a/src/sna/sna_video.h b/src/sna/sna_video.h
index f3978f84..875f8cce 100644
--- a/src/sna/sna_video.h
+++ b/src/sna/sna_video.h
@@ -98,6 +98,7 @@ struct sna_video {
bool textured;
Rotation rotation;
int plane;
+ struct kgem_bo *bo;
int SyncToVblank; /* -1: auto, 0: off, 1: on */
int AlwaysOnTop;
diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
index 7a5b5dbf..7dc74b75 100644
--- a/src/sna/sna_video_overlay.c
+++ b/src/sna/sna_video_overlay.c
@@ -138,6 +138,10 @@ static int sna_video_overlay_stop(ClientPtr client,
DRM_IOCTL_I915_OVERLAY_PUT_IMAGE,
&request);
+ if (video->bo)
+ kgem_bo_destroy(&sna->kgem, video->bo);
+ video->bo = NULL;
+
sna_video_free_buffers(video);
sna_window_set_port((WindowPtr)draw, NULL);
return Success;
@@ -445,7 +449,18 @@ sna_video_overlay_show(struct sna *sna,
DBG(("%s: flags=%x\n", __FUNCTION__, request.flags));
- return drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_OVERLAY_PUT_IMAGE, &request) == 0;
+ if (drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_OVERLAY_PUT_IMAGE, &request)) {
+ DBG(("%s: Putimage failed\n", __FUNCTION__));
+ return false;
+ }
+
+ if (video->bo != frame->bo) {
+ if (video->bo)
+ kgem_bo_destroy(&sna->kgem, video->bo);
+ video->bo = kgem_bo_reference(frame->bo);
+ }
+
+ return true;
}
static int
diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
index 1a1883ba..dbcb4709 100644
--- a/src/sna/sna_video_sprite.c
+++ b/src/sna/sna_video_sprite.c
@@ -72,8 +72,13 @@ static int sna_video_sprite_stop(ClientPtr client,
xf86DrvMsg(video->sna->scrn->scrnIndex, X_ERROR,
"failed to disable plane\n");
+ if (video->bo)
+ kgem_bo_destroy(&video->sna->kgem, video->bo);
+ video->bo = NULL;
+
video->plane = 0;
sna_window_set_port((WindowPtr)draw, NULL);
+
return Success;
}
@@ -296,6 +301,12 @@ sna_video_sprite_show(struct sna *sna,
frame->bo->domain = DOMAIN_NONE;
video->plane = s.plane_id;
+
+ if (video->bo != frame->bo) {
+ if (video->bo)
+ kgem_bo_destroy(&sna->kgem, video->bo);
+ video->bo = kgem_bo_reference(frame->bo);
+ }
return true;
}