diff options
author | Steve Wilkins <steve.wilkins@raymarine.com> | 2013-03-27 14:42:46 +0000 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2013-03-27 20:30:31 -0400 |
commit | 393716cfa834a0f2c613a270f3a62f37cb6cd857 (patch) | |
tree | bff2a96b1226d5fdcb303703370cc57ae47192c2 | |
parent | 9ef2ee29ae909792341878eb39e727a530ee810d (diff) |
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 <steve.wilkins@raymarine.com>
Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r-- | src/drmmode_display.c | 17 |
1 files 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,6 +1364,7 @@ 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); @@ -1368,6 +1372,13 @@ drmmode_page_flip(DrawablePtr pDraw, PixmapPtr back, void *priv) 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; + if (!config->crtc[i]->enabled) continue; |