From 2d4d40a4b5938249f3c73ed14fe5c5b926c2fefd Mon Sep 17 00:00:00 2001 From: Zhigang Gong Date: Mon, 19 Sep 2011 09:45:32 +0800 Subject: [PATCH] glamor-ddx: Fix the broken switching between VTs. Now we can allocate frame buffer during the screen initialization. And set mode major when enter VT. This is the correct logic. The previous implementation defer the set mode major to create screen resource which will cause the switching between VTs broken. Signed-off-by: Zhigang Gong --- hw/xfree86/glamor/glamor.c | 42 ++++++++++++++++++++++++++------- hw/xfree86/glamor/glamor_crtc.c | 16 +++++++++++-- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/hw/xfree86/glamor/glamor.c b/hw/xfree86/glamor/glamor.c index a51593994..1bb5835db 100644 --- a/hw/xfree86/glamor/glamor.c +++ b/hw/xfree86/glamor/glamor.c @@ -70,11 +70,18 @@ glamor_resize(ScrnInfoPtr scrn, int width, int height) if (glamor->root != EGL_NO_IMAGE_KHR && scrn->virtualX == width && scrn->virtualY == height) return TRUE; + else if (scrn->virtualX != width || scrn->virtualY != height) { - glamor->root_bo = gbm_bo_create(glamor->gbm, width, height, + if (glamor->root != EGL_NO_IMAGE_KHR) { + eglDestroyImageKHR(glamor->display, glamor->root); + gbm_bo_destroy(glamor->root_bo); + glamor->root = EGL_NO_IMAGE_KHR; + } + glamor->root_bo = gbm_bo_create(glamor->gbm, width, height, GBM_BO_FORMAT_ARGB8888, GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING); - + } + if (glamor->root_bo == NULL) return FALSE; @@ -206,10 +213,8 @@ glamor_ddx_enter_vt(int scrnIndex, int flags) "drmSetMaster failed: %s\n", strerror(errno)); return FALSE; } -#if 0 if (!xf86SetDesiredModes(scrn)) return FALSE; -#endif return TRUE; } @@ -227,15 +232,15 @@ glamor_ddx_create_screen_resources(ScreenPtr screen) { ScrnInfoPtr scrn = xf86Screens[screen->myNum]; struct glamor_ddx_screen_private *glamor = glamor_ddx_get_screen_private(scrn); + int width = scrn->virtualX; + int height = scrn->virtualY; screen->CreateScreenResources = glamor->CreateScreenResources; if (!(*screen->CreateScreenResources) (screen)) return FALSE; if (!glamor_glyphs_init(screen)) return FALSE; - - if (!xf86SetDesiredModes(scrn)) - return FALSE; + glamor_resize(scrn, width, height); return TRUE; } @@ -293,7 +298,23 @@ glamor_egl_has_extension(struct glamor_ddx_screen_private *glamor, char *extensi return FALSE; } +static Bool +glamor_ddx_init_front_buffer(ScrnInfoPtr scrn) +{ + struct glamor_ddx_screen_private *glamor = glamor_ddx_get_screen_private(scrn); + int width = scrn->virtualX; + int height = scrn->virtualY; + glamor->root_bo = gbm_bo_create(glamor->gbm, width, height, + GBM_BO_FORMAT_ARGB8888, + GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING); + + if (glamor->root_bo == NULL) + return FALSE; + + /* XXX shall we update displayWidth here ? */ + return TRUE; +} static Bool glamor_ddx_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv) @@ -304,10 +325,10 @@ glamor_ddx_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv) VisualPtr visual; EGLint config_attribs[] = { #ifdef GLAMOR_GLES2 - EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_CONTEXT_CLIENT_VERSION, 2, #endif EGL_NONE - }; + }; /* If serverGeneration != 1 then fd was closed during the last @@ -398,6 +419,9 @@ glamor_ddx_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv) if (!miSetPixmapDepths()) return FALSE; + if (!glamor_ddx_init_front_buffer(scrn)) + return FALSE; + if (!fbScreenInit(screen, NULL, scrn->virtualX, scrn->virtualY, scrn->xDpi, scrn->yDpi, diff --git a/hw/xfree86/glamor/glamor_crtc.c b/hw/xfree86/glamor/glamor_crtc.c index 60af8b544..4cb378058 100644 --- a/hw/xfree86/glamor/glamor_crtc.c +++ b/hw/xfree86/glamor/glamor_crtc.c @@ -372,10 +372,22 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, int ret = TRUE; int i; int fb_id; + uint32_t handle, pitch; drmModeModeInfo kmode; - if (!drmmode_update_fb(scrn, scrn->virtualX, scrn->virtualY)) - return FALSE; + if (drmmode->fb_id == 0) { + + glamor_frontbuffer_handle(scrn, &handle, &pitch); + ret = drmModeAddFB(drmmode->fd, + scrn->virtualX, scrn->virtualY, + scrn->depth, scrn->bitsPerPixel, + pitch, handle, + &drmmode->fb_id); + if (ret < 0) { + ErrorF("failed to add fb\n"); + return FALSE; + } + } saved_mode = crtc->mode; saved_x = crtc->x;