From patchwork Thu Jul 24 23:18:28 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keith Packard X-Patchwork-Id: 4620471 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id D107D9F433 for ; Thu, 24 Jul 2014 23:18:52 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E2321201DD for ; Thu, 24 Jul 2014 23:18:51 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 05CBB20179 for ; Thu, 24 Jul 2014 23:18:51 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6B02D6E77E; Thu, 24 Jul 2014 16:18:50 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from keithp.com (home.keithp.com [63.227.221.253]) by gabe.freedesktop.org (Postfix) with ESMTP id D127C6E77B; Thu, 24 Jul 2014 16:18:47 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by keithp.com (Postfix) with ESMTP id 83DC5760131; Thu, 24 Jul 2014 16:18:47 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at keithp.com Received: from keithp.com ([127.0.0.1]) by localhost (keithp.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id koXedLW3Nkmn; Thu, 24 Jul 2014 16:18:43 -0700 (PDT) Received: by keithp.com (Postfix, from userid 1033) id 9888076013C; Thu, 24 Jul 2014 16:18:34 -0700 (PDT) Received: from hiro.keithp.com (localhost [127.0.0.1]) by keithp.com (Postfix) with ESMTP id 82DBD760133; Thu, 24 Jul 2014 16:18:34 -0700 (PDT) Received: by hiro.keithp.com (Postfix, from userid 1001) id 8A3BE74A6B9; Thu, 24 Jul 2014 16:18:32 -0700 (PDT) From: Keith Packard To: xorg-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org Date: Thu, 24 Jul 2014 16:18:28 -0700 Message-Id: <1406243908-1123-13-git-send-email-keithp@keithp.com> X-Mailer: git-send-email 2.0.1 In-Reply-To: <1406243908-1123-1-git-send-email-keithp@keithp.com> References: <1406243908-1123-1-git-send-email-keithp@keithp.com> Subject: [Intel-gfx] [PATCH 12/12] Delay initial modeset until root window contents are prepared X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Wait until the root window has been painted for the first time before doing the modeset. This avoids flashing black while the root window gets set up. Signed-off-by: Keith Packard --- src/uxa/intel.h | 2 ++ src/uxa/intel_display.c | 39 ++++++++++++++++++--------------------- src/uxa/intel_driver.c | 40 +++++++++++++++++++++++++++++++++++----- 3 files changed, 55 insertions(+), 26 deletions(-) diff --git a/src/uxa/intel.h b/src/uxa/intel.h index ae33938..fa2aa64 100644 --- a/src/uxa/intel.h +++ b/src/uxa/intel.h @@ -194,6 +194,8 @@ typedef struct intel_screen_private { void (*batch_flush) (struct intel_screen_private *intel); void (*batch_commit_notify) (struct intel_screen_private *intel); + Bool need_entervt; + #if USE_UXA struct _UxaDriver *uxa_driver; int uxa_flags; diff --git a/src/uxa/intel_display.c b/src/uxa/intel_display.c index 1d4ba3c..758f01f 100644 --- a/src/uxa/intel_display.c +++ b/src/uxa/intel_display.c @@ -2319,7 +2319,7 @@ void intel_copy_fb(ScrnInfoPtr scrn) ScreenPtr pScreen = xf86ScrnToScreen(scrn); intel_screen_private *intel = intel_get_screen_private(scrn); PixmapPtr src, dst; - unsigned int pitch = scrn->displayWidth * intel->cpp; + GCPtr gc; struct intel_crtc *intel_crtc; int i, fbcon_id; @@ -2339,30 +2339,27 @@ void intel_copy_fb(ScrnInfoPtr scrn) if (src == NULL) return; - /* We dont have a screen Pixmap yet */ - dst = intel_create_pixmap_for_bo(pScreen, intel->front_buffer, - scrn->virtualX, scrn->virtualY, - scrn->depth, scrn->bitsPerPixel, - pitch); + dst = (*pScreen->GetScreenPixmap)(pScreen); + if (dst == NullPixmap) goto cleanup_src; - if (!intel->uxa_driver->prepare_copy(src, dst, - -1, -1, - GXcopy, FB_ALLONES)) - goto cleanup_dst; - - intel->uxa_driver->copy(dst, - 0, 0, - 0, 0, - scrn->virtualX, scrn->virtualY); - intel->uxa_driver->done_copy(dst); -#if ABI_VIDEODRV_VERSION >= SET_ABI_VERSION(10, 0) - pScreen->canDoBGNoneRoot = TRUE; -#endif + gc = GetScratchGC(scrn->depth, pScreen); + + if (!gc) + goto cleanup_src; + + ValidateGC(&dst->drawable, gc); + + (*gc->ops->CopyArea)(&src->drawable, + &dst->drawable, + gc, + 0, 0, + scrn->virtualX, scrn->virtualY, + 0, 0); + + FreeScratchGC(gc); -cleanup_dst: - (*pScreen->DestroyPixmap)(dst); cleanup_src: (*pScreen->DestroyPixmap)(src); } diff --git a/src/uxa/intel_driver.c b/src/uxa/intel_driver.c index 316de64..0475a17 100644 --- a/src/uxa/intel_driver.c +++ b/src/uxa/intel_driver.c @@ -170,13 +170,19 @@ static Bool i830CreateScreenResources(ScreenPtr screen) case ACCEL_GLAMOR: if (!intel_glamor_create_screen_resources(screen)) return FALSE; +#if ABI_VIDEODRV_VERSION >= SET_ABI_VERSION(10, 0) + screen->canDoBGNoneRoot = TRUE; +#endif break; #endif #if USE_UXA case ACCEL_UXA: if (!intel_uxa_create_screen_resources(screen)) return FALSE; - intel_copy_fb(scrn); +#if ABI_VIDEODRV_VERSION >= SET_ABI_VERSION(10, 0) + screen->canDoBGNoneRoot = TRUE; +#endif + break; #endif case ACCEL_NONE: if (!intel_none_create_screen_resources(screen)) @@ -830,6 +836,29 @@ I830BlockHandler(BLOCKHANDLER_ARGS_DECL) screen->BlockHandler = intel->BlockHandler; + /* At server init time, get the root window bits from fbcon if + * available and then update the protocol-level information + * for both RandR and XINERAMA + */ + if (intel->need_entervt) { + intel->need_entervt = FALSE; + + if (screen->root->backgroundState == None) + intel_copy_fb(scrn); + + /* Must force it before EnterVT, so we are in control of VT and + * later memory should be bound when allocating, e.g rotate_mem */ + scrn->vtSema = TRUE; + + if (!I830EnterVT(VT_FUNC_ARGS(0))) { + xf86DrvMsg(scrn->scrnIndex, X_ERROR, + "Failed to perform initial modeset.\n"); + FatalError("Mode set failed\n"); + } + + xf86RandR12CreateScreenResources(screen); + } + (*screen->BlockHandler) (BLOCKHANDLER_ARGS); intel->BlockHandler = screen->BlockHandler; @@ -1211,11 +1240,12 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL) I830UeventInit(scrn); #endif - /* Must force it before EnterVT, so we are in control of VT and - * later memory should be bound when allocating, e.g rotate_mem */ - scrn->vtSema = TRUE; + /* Delay the call to I830EnterVT until + * the server is all ready to accept protocol requests. + */ + intel->need_entervt = TRUE; - return I830EnterVT(VT_FUNC_ARGS(0)); + return TRUE; } static void i830AdjustFrame(ADJUST_FRAME_ARGS_DECL)