From 393716cfa834a0f2c613a270f3a62f37cb6cd857 Mon Sep 17 00:00:00 2001 From: Steve Wilkins Date: Wed, 27 Mar 2013 14:42:46 +0000 Subject: drmmode: Fix crash with multi-crtc page-flip Fix crash when performing a page flip with multiple crtc's enabled. Signed-off-by: Steve Wilkins Signed-off-by: Rob Clark --- src/drmmode_display.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/drmmode_display.c b/src/drmmode_display.c index c3cf4f8..c8f8144 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -1314,6 +1314,7 @@ drmmode_remove_fb(ScrnInfoPtr pScrn) typedef struct { drmmode_ptr mode; uint32_t old_fb_id; + int flip_count; void *priv; } drmmode_flipdata_rec, *drmmode_flipdata_ptr; @@ -1322,9 +1323,11 @@ page_flip_handler(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data) { drmmode_flipdata_ptr flipdata = user_data; - OMAPDRI2SwapComplete(flipdata->priv); - drmModeRmFB(flipdata->mode->fd, flipdata->old_fb_id); - free(flipdata); + if (--(flipdata->flip_count) <= 0) { + OMAPDRI2SwapComplete(flipdata->priv); + drmModeRmFB(flipdata->mode->fd, flipdata->old_fb_id); + free(flipdata); + } } static drmEventContext event_context = { @@ -1361,10 +1364,18 @@ drmmode_page_flip(DrawablePtr pDraw, PixmapPtr back, void *priv) flipdata->priv = priv; flipdata->mode = mode; flipdata->old_fb_id = old_fb_id; + flipdata->flip_count = 0; DEBUG_MSG("flip: %d -> %d", mode->fb_id, old_fb_id); /* if we can flip, we must be fullscreen.. so flip all CRTC's.. */ + for (i = 0; i < config->num_crtc; i++) { + crtc = config->crtc[i]->driver_private; + + if (config->crtc[i]->enabled) + flipdata->flip_count++; + } + for (i = 0; i < config->num_crtc; i++) { crtc = config->crtc[i]->driver_private; -- cgit v1.2.3