diff options
author | Rob Clark <robdclark@gmail.com> | 2014-04-26 09:45:05 -0400 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2014-04-26 10:07:03 -0400 |
commit | 7b0db1a28f3fe0e6189be602481ed697644f1920 (patch) | |
tree | 6d5dfeaffcc53df874338655db281c48f30ba24f | |
parent | f71bfa9311a0d3c053159a5106ddde2582db88d0 (diff) |
kms: fix crash on startup with no display
We need to have *some* scanout buffer, even if it will be re-allocated
when a display is actually attached.
Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r-- | src/drmmode_display.c | 23 | ||||
-rw-r--r-- | src/msm-driver.c | 5 | ||||
-rw-r--r-- | src/msm.h | 2 |
3 files changed, 26 insertions, 4 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 28c824f..a3a89ff 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -1079,7 +1079,7 @@ drmmode_xf86crtc_resize(ScrnInfoPtr pScrn, int width, int height) if ((pScrn->virtualX == width) && (pScrn->virtualY == height) && - pMsm->scanout) + pMsm->scanout && drmmode->fb_id) return TRUE; old_width = pScrn->virtualX; @@ -1467,11 +1467,28 @@ drmmode_wait_for_event(ScrnInfoPtr pScrn) drmHandleEvent(drmmode->fd, &drmmode->event_context); } -void +Bool drmmode_screen_init(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); drmmode_ptr drmmode = drmmode_from_scrn(pScrn); + MSMPtr pMsm = MSMPTR(pScrn); + int pitch, size; + + /* NOTE: we need an initial scanout buffer, in case no attached + * display: + */ + pitch = MSMAlignedStride(pScrn->virtualX, pScrn->bitsPerPixel); + size = pitch * pScrn->virtualY; + DEBUG_MSG("initial scanout buffer: %dx%d@%d (size=%d, pitch=%d)", + pScrn->virtualX, pScrn->virtualY, pScrn->bitsPerPixel, + size, pitch); + pMsm->scanout = fd_bo_new(pMsm->dev, size, + DRM_FREEDRENO_GEM_TYPE_KMEM); + if (!pMsm->scanout) { + ERROR_MSG("Error allocating scanout buffer"); + return FALSE; + } drmmode_uevent_init(pScrn); @@ -1484,6 +1501,8 @@ drmmode_screen_init(ScreenPtr pScreen) /* Register a wakeup handler to get informed on DRM events */ RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA, drmmode_wakeup_handler, pScrn); + + return TRUE; } void diff --git a/src/msm-driver.c b/src/msm-driver.c index be2b9e3..440da52 100644 --- a/src/msm-driver.c +++ b/src/msm-driver.c @@ -468,7 +468,10 @@ MSMScreenInit(SCREEN_INIT_ARGS_DECL) return FALSE; } } else { - drmmode_screen_init(pScreen); + if (!drmmode_screen_init(pScreen)) { + ERROR_MSG("drmmode_screen_init failed"); + return FALSE; + } } return TRUE; @@ -141,7 +141,7 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, int fd, int cpp); int drmmode_cursor_init(ScreenPtr pScreen); Bool drmmode_page_flip(DrawablePtr draw, PixmapPtr back, void *priv); void drmmode_wait_for_event(ScrnInfoPtr pScrn); -void drmmode_screen_init(ScreenPtr pScreen); +Bool drmmode_screen_init(ScreenPtr pScreen); void drmmode_screen_fini(ScreenPtr pScreen); Bool fbmode_pre_init(ScrnInfoPtr pScrn); |