summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rw-r--r--src/intel_driver.c3
-rw-r--r--src/intel_glamor.c74
-rw-r--r--src/intel_uxa.c2
-rw-r--r--uxa/uxa.h10
5 files changed, 49 insertions, 42 deletions
diff --git a/configure.ac b/configure.ac
index e953ae53..785392ac 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 9d1c4e87..d66a8fdb 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 e96daa66..262a06a1 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 f04a2efd..a11846d0 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 66b5f1eb..b8569f04 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
* @{
*/