xf86-video-intel: 2 commits - configure.ac src/intel_driver.c src/intel_glamor.c src/intel_uxa.c uxa/uxa.h

Chris Wilson ickle at kemper.freedesktop.org
Wed Feb 8 01:10:34 PST 2012


 configure.ac       |    2 -
 src/intel_driver.c |    3 --
 src/intel_glamor.c |   74 +++++++++++++++++++++++++++--------------------------
 src/intel_uxa.c    |    2 -
 uxa/uxa.h          |   10 +++++--
 5 files changed, 49 insertions(+), 42 deletions(-)

New commits:
commit 13c960db9ef876ee99991d97dfc34fef184c0341
Author: Zhigang Gong <zhigang.gong at linux.intel.com>
Date:   Thu Feb 2 11:30:57 2012 +0800

    uxa/glamor: Use a macro to specify module name.
    
    This depends upon glamor commit b5f8d, just after the 0.3.0 tag.
    
    Signed-off-by: Zhigang Gong <zhigang.gong at linux.intel.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_glamor.c b/src/intel_glamor.c
index 262a06a..c468d34 100644
--- a/src/intel_glamor.c
+++ b/src/intel_glamor.c
@@ -68,7 +68,7 @@ intel_glamor_pre_init(ScrnInfoPtr scrn)
 	CARD32 version;
 
 	/* Load glamor module */
-	if ((glamor_module = xf86LoadSubModule(scrn, "glamor_egl"))) {
+	if ((glamor_module = xf86LoadSubModule(scrn, GLAMOR_EGL_MODULE_NAME))) {
 		version = xf86GetModuleVersion(glamor_module);
 		if (version < MODULE_VERSION_NUMERIC(0,3,0)) {
 			xf86DrvMsg(scrn->scrnIndex, X_ERROR,
commit 70092bfbc51ddc5a51c9cae21c6b2852c216a6fc
Author: Zhigang Gong <zhigang.gong at linux.intel.com>
Date:   Wed Feb 1 19:47:28 2012 +0800

    uxa/glamor: Refine CloseScreen and InitScreen process.
    
    The previous version calls glamor_egl_close_screen and
    glamor_egl_free_screen manually which is not align with
    standard process. Now glamor change the way to follow
    standard method:
    
    glamor layer and glamor egl layer both have their internal
    CloseScreens. The correct sequence is after the I830CloseScreen
    is registered, then register glamor_egl_close_screen and
    the last one is glamor_close_screen. So we move out the
    intel_glamor_init from the intel_uxa_init to I830ScreenInit
    and just after the registration of I830CloseScreen.
    
    As the glamor interfaces changed, we need to check the
    glamor version when load the glamor egl module to make
    sure we are loading the right glamor module. If
    failed, it will switch back to UXA path.
    
    This depends upon glamor commit 1bc8bf tagged with version 0.3.0.
    
    Signed-off-by: Zhigang Gong <zhigang.gong at linux.intel.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/configure.ac b/configure.ac
index e953ae5..785392a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -158,7 +158,7 @@ AC_ARG_ENABLE(glamor,
 AC_MSG_RESULT([$GLAMOR])
 AM_CONDITIONAL(GLAMOR, test x$GLAMOR != xno)
 if test "x$GLAMOR" != "xno"; then
-	PKG_CHECK_MODULES(LIBGLAMOR, [glamor])
+	PKG_CHECK_MODULES(LIBGLAMOR, [glamor >= 0.3.0])
 	PKG_CHECK_MODULES(LIBGLAMOR_EGL, [glamor-egl])
 	AC_DEFINE(USE_GLAMOR, 1, [Enable glamor acceleration])
 fi
diff --git a/src/intel_driver.c b/src/intel_driver.c
index 9d1c4e8..d66a8fd 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -1051,6 +1051,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
 	intel->CreateScreenResources = screen->CreateScreenResources;
 	screen->CreateScreenResources = i830CreateScreenResources;
 
+	intel_glamor_init(screen);
 	if (!xf86CrtcScreenInit(screen))
 		return FALSE;
 
@@ -1124,8 +1125,6 @@ static void I830FreeScreen(int scrnIndex, int flags)
 	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
-	intel_glamor_free_screen(scrnIndex, flags);
-
 	if (intel) {
 		intel_mode_fini(intel);
 		intel_close_drm_master(intel);
diff --git a/src/intel_glamor.c b/src/intel_glamor.c
index e96daa6..262a06a 100644
--- a/src/intel_glamor.c
+++ b/src/intel_glamor.c
@@ -51,30 +51,40 @@ intel_glamor_create_screen_resources(ScreenPtr screen)
 
 	if (!glamor_glyphs_init(screen))
 		return FALSE;
+
 	if (!glamor_egl_create_textured_screen(screen,
 					       intel->front_buffer->handle,
 					       intel->front_pitch))
 		return FALSE;
+
 	return TRUE;
 }
 
 Bool
 intel_glamor_pre_init(ScrnInfoPtr scrn)
 {
-	intel_screen_private *intel;
-	intel = intel_get_screen_private(scrn);
+	intel_screen_private *intel = intel_get_screen_private(scrn);
+	pointer glamor_module;
+	CARD32 version;
 
 	/* Load glamor module */
-	if (xf86LoadSubModule(scrn, "glamor_egl") &&
-	    glamor_egl_init(scrn, intel->drmSubFD)) {
-		xf86DrvMsg(scrn->scrnIndex, X_INFO,
-			   "glamor detected, initialising\n");
-		intel->uxa_flags |= UXA_USE_GLAMOR;
-	} else {
+	if ((glamor_module = xf86LoadSubModule(scrn, "glamor_egl"))) {
+		version = xf86GetModuleVersion(glamor_module);
+		if (version < MODULE_VERSION_NUMERIC(0,3,0)) {
+			xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+			"Incompatible glamor version, required >= 0.3.0.\n");
+		} else {
+			if (glamor_egl_init(scrn, intel->drmSubFD)) {
+				xf86DrvMsg(scrn->scrnIndex, X_INFO,
+					   "glamor detected, initialising egl layer.\n");
+				intel->uxa_flags = UXA_GLAMOR_EGL_INITIALIZED;
+			} else
+				xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+					   "glamor detected, failed to initialize egl.\n");
+		}
+	} else
 		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 			   "glamor not available\n");
-		intel->uxa_flags &= ~UXA_USE_GLAMOR;
-	}
 
 	return TRUE;
 }
@@ -83,7 +93,13 @@ PixmapPtr
 intel_glamor_create_pixmap(ScreenPtr screen, int w, int h,
 			   int depth, unsigned int usage)
 {
-	return glamor_create_pixmap(screen, w, h, depth, usage);
+	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+	intel_screen_private *intel = intel_get_screen_private(scrn);
+
+	if (intel->uxa_flags & UXA_USE_GLAMOR)
+		return glamor_create_pixmap(screen, w, h, depth, usage);
+	else
+		return NULL;
 }
 
 Bool
@@ -145,30 +161,29 @@ intel_glamor_finish_access(PixmapPtr pixmap, uxa_access_t access)
 	return;
 }
 
-
 Bool
 intel_glamor_init(ScreenPtr screen)
 {
 	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
-	if ((intel->uxa_flags & UXA_USE_GLAMOR) == 0)
-		return TRUE;
+	if ((intel->uxa_flags & UXA_GLAMOR_EGL_INITIALIZED) == 0)
+		goto fail;
 
-	if (!glamor_init(screen, GLAMOR_INVERTED_Y_AXIS)) {
+	if (!glamor_init(screen, GLAMOR_INVERTED_Y_AXIS | GLAMOR_USE_EGL_SCREEN)) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "Failed to initialize glamor\n");
+			   "Failed to initialize glamor.\n");
 		goto fail;
 	}
 
 	if (!glamor_egl_init_textured_pixmap(screen)) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "Failed to initialize textured pixmap.\n");
+			   "Failed to initialize textured pixmap of screen for glamor.\n");
 		goto fail;
 	}
 
 	intel->uxa_driver->flags |= UXA_USE_GLAMOR;
-	intel->uxa_flags = intel->uxa_driver->flags;
+	intel->uxa_flags |= intel->uxa_driver->flags;
 
 	intel->uxa_driver->finish_access = intel_glamor_finish_access;
 
@@ -177,8 +192,8 @@ intel_glamor_init(ScreenPtr screen)
 	return TRUE;
 
   fail:
-	xf86DrvMsg(scrn->scrnIndex, X_WARNING,
-		   "Use standard UXA acceleration.");
+	xf86DrvMsg(scrn->scrnIndex, X_INFO,
+		   "Use standard UXA acceleration.\n");
 	return FALSE;
 }
 
@@ -196,21 +211,10 @@ Bool
 intel_glamor_close_screen(ScreenPtr screen)
 {
 	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
-	intel_screen_private * intel;
-
-	intel = intel_get_screen_private(scrn);
-	if (intel && (intel->uxa_flags & UXA_USE_GLAMOR))
-		return glamor_egl_close_screen(screen);
-	return TRUE;
-}
+	intel_screen_private *intel = intel_get_screen_private(scrn);
 
-void
-intel_glamor_free_screen(int scrnIndex, int flags)
-{
-	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
-	intel_screen_private * intel;
+	if (intel->uxa_flags & UXA_USE_GLAMOR)
+		intel->uxa_flags &= ~UXA_USE_GLAMOR;
 
-	intel = intel_get_screen_private(scrn);
-	if (intel && (intel->uxa_flags & UXA_USE_GLAMOR))
-		glamor_egl_free_screen(scrnIndex, GLAMOR_EGL_EXTERNAL_BUFFER);
+	return TRUE;
 }
diff --git a/src/intel_uxa.c b/src/intel_uxa.c
index f04a2ef..a11846d 100644
--- a/src/intel_uxa.c
+++ b/src/intel_uxa.c
@@ -1391,7 +1391,5 @@ Bool intel_uxa_init(ScreenPtr screen)
 	uxa_set_fallback_debug(screen, intel->fallback_debug);
 	uxa_set_force_fallback(screen, intel->force_fallback);
 
-	intel_glamor_init(screen);
-
 	return TRUE;
 }
diff --git a/uxa/uxa.h b/uxa/uxa.h
index 66b5f1e..b8569f0 100644
--- a/uxa/uxa.h
+++ b/uxa/uxa.h
@@ -548,12 +548,18 @@ typedef struct _UxaDriver {
 /**
  * UXA_USE_GLAMOR indicates to use glamor acceleration to perform rendering.
  * And if glamor fail to accelerate the rendering, then goto fallback to
- * use CPU to do the rendering.
+ * use CPU to do the rendering. This flag will be set only when glamor get
+ * initialized successfully.
+ * Note, in ddx close screen, this bit need to be cleared.
  */
 #define UXA_USE_GLAMOR			(1 << 3)
 
-/** @} */
+/* UXA_GLAMOR_EGL_INITIALIZED indicates glamor egl layer get initialized
+ * successfully. UXA layer does not use this flag, before call to
+ * glamor_init, ddx need to check this flag. */
+#define UXA_GLAMOR_EGL_INITIALIZED	(1 << 4)
 
+/** @} */
 /** @name UXA CreatePixmap hint flags
  * @{
  */


More information about the xorg-commit mailing list