diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/intel_driver.c | 3 | ||||
-rw-r--r-- | src/intel_glamor.c | 74 | ||||
-rw-r--r-- | src/intel_uxa.c | 2 | ||||
-rw-r--r-- | uxa/uxa.h | 10 |
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; } @@ -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 * @{ */ |