summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Wilkins <steve.wilkins@raymarine.com>2013-03-27 14:42:46 +0000
committerRob Clark <robdclark@gmail.com>2013-03-27 20:30:31 -0400
commit393716cfa834a0f2c613a270f3a62f37cb6cd857 (patch)
treebff2a96b1226d5fdcb303703370cc57ae47192c2
parent9ef2ee29ae909792341878eb39e727a530ee810d (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.c17
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;