summaryrefslogtreecommitdiff
path: root/present/present.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-11-06 23:56:26 -0800
committerKeith Packard <keithp@keithp.com>2013-11-11 15:16:15 -0800
commit20bb49ae9ba11d3dccfba191483cd682d9c9d96c (patch)
tree6429bf01357eb3112b4f3244a3f4f40fe706b9aa /present/present.c
parent41da295eb50fa08eaacd0ecde99f43a716fcb41a (diff)
Present: Check for window/fence destroyed when idling pixmaps
A client destroying objects in the middle of an unflip can end up having the screen flip window or fence set to NULL in the unflip notify path. Check for these and don't try to use those objects. Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Adam Jackson <ajax@redhat.com>
Diffstat (limited to 'present/present.c')
-rw-r--r--present/present.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/present/present.c b/present/present.c
index 4c97ce40c..fab105d0d 100644
--- a/present/present.c
+++ b/present/present.c
@@ -184,8 +184,10 @@ present_vblank_notify(present_vblank_ptr vblank, CARD8 kind, CARD8 mode, uint64_
static void
present_pixmap_idle(PixmapPtr pixmap, WindowPtr window, CARD32 serial, struct present_fence *present_fence)
{
- present_fence_set_triggered(present_fence);
- present_send_idle_notify(window, serial, pixmap, present_fence);
+ if (present_fence)
+ present_fence_set_triggered(present_fence);
+ if (window)
+ present_send_idle_notify(window, serial, pixmap, present_fence);
}
RRCrtcPtr
@@ -297,7 +299,8 @@ present_flip_idle(ScreenPtr screen)
if (screen_priv->flip_pixmap) {
present_pixmap_idle(screen_priv->flip_pixmap, screen_priv->flip_window,
screen_priv->flip_serial, screen_priv->flip_idle_fence);
- present_fence_destroy(screen_priv->flip_idle_fence);
+ if (screen_priv->flip_idle_fence)
+ present_fence_destroy(screen_priv->flip_idle_fence);
dixDestroyPixmap(screen_priv->flip_pixmap, screen_priv->flip_pixmap->drawable.id);
screen_priv->flip_crtc = NULL;
screen_priv->flip_window = NULL;