summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-01-27 20:28:44 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-01-27 20:34:30 +0000
commit8f4bae01e39392faa8978090db4cbe28fa00b013 (patch)
tree6beaf8a4b6580e77d6c547e638142864383c09d3
parentd02bd80b2f9f8ee3840be5d8d6b8d389192c57f5 (diff)
sna/video: Ensure the video pixmap is on the GPU
The presumption that the pixmap is the scanout and so will always be pinned is false if there is a shadow or under a compositor. In those cases, the pixmap may be idle and so the GPU bo reaped. This was compounded by that the video path did not mark the pixmap as busy. So whilst watching a video under xfce4 with compositing enabled (has to be a non-GL compositor) the video would suddenly stall. Reported-by: Paul Neumann <paul104x@yahoo.de> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=45279 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna.h7
-rw-r--r--src/sna/sna_video_textured.c2
2 files changed, 1 insertions, 8 deletions
diff --git a/src/sna/sna.h b/src/sna/sna.h
index bc149677..5910daf2 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -476,13 +476,6 @@ sna_drawable_move_to_gpu(DrawablePtr drawable, unsigned flags)
return sna_pixmap_move_to_gpu(get_drawable_pixmap(drawable), flags) != NULL;
}
-static inline Bool
-sna_pixmap_is_gpu(PixmapPtr pixmap)
-{
- struct sna_pixmap *priv = pixmap ? sna_pixmap(pixmap) : NULL;
- return priv && priv->gpu_bo;
-}
-
static inline struct kgem_bo *sna_pixmap_get_bo(PixmapPtr pixmap)
{
return sna_pixmap(pixmap)->gpu_bo;
diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
index 6f691351..d99f8847 100644
--- a/src/sna/sna_video_textured.c
+++ b/src/sna/sna_video_textured.c
@@ -240,7 +240,7 @@ sna_video_textured_put_image(ScrnInfoPtr scrn,
return BadAlloc;
}
- if (!sna_pixmap_is_gpu(pixmap)) {
+ if (!sna_pixmap_force_to_gpu(pixmap, MOVE_READ | MOVE_WRITE)) {
DBG(("%s: attempting to render to a non-GPU pixmap\n",
__FUNCTION__));
return BadAlloc;