diff options
author | Adam Jackson <ajax@redhat.com> | 2013-10-11 17:16:01 -0400 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2013-10-11 18:01:07 -0400 |
commit | 35e089d96eb7db1818e3b63b15a14612ef89ee5e (patch) | |
tree | c87aefe691057f4e7aed3dcb73c25a49a92a8b2e | |
parent | 1d620a4a9d9b4ed673edd337eb7ab250ed8ef5ea (diff) |
glamor: Rework initialization sequencingatrocious-xephyr-glamor-hacks
Create the backend private data detached, pass it into glamor_init,
which is what's setting up the screen private already
Signed-off-by: Adam Jackson <ajax@redhat.com>
-rw-r--r-- | glamor/glamor.c | 3 | ||||
-rw-r--r-- | glamor/glamor.h | 10 | ||||
-rw-r--r-- | glamor/glamor_egl_gbm.c | 53 | ||||
-rw-r--r-- | hw/kdrive/ephyr/Makefile.am | 2 | ||||
-rw-r--r-- | hw/kdrive/ephyr/ephyr_glamor.c | 7 |
5 files changed, 39 insertions, 36 deletions
diff --git a/glamor/glamor.c b/glamor/glamor.c index 547e5a111..966dc65c1 100644 --- a/glamor/glamor.c +++ b/glamor/glamor.c @@ -262,7 +262,7 @@ int glamor_debug_level; /** Set up glamor for an already-configured GL context. */ Bool -glamor_init(ScreenPtr screen, unsigned int flags) +glamor_init(ScreenPtr screen, void *backend, unsigned int flags) { glamor_screen_private *glamor_priv; int gl_version; @@ -277,6 +277,7 @@ glamor_init(ScreenPtr screen, unsigned int flags) glamor_priv = calloc(1, sizeof(*glamor_priv)); if (glamor_priv == NULL) return FALSE; + glamor_priv->backend = backend; if (flags & GLAMOR_INVERTED_Y_AXIS) { glamor_priv->yInverted = 1; diff --git a/glamor/glamor.h b/glamor/glamor.h index 8b81a0981..5d421d284 100644 --- a/glamor/glamor.h +++ b/glamor/glamor.h @@ -69,8 +69,9 @@ typedef enum glamor_pixmap_type { /* @glamor_init: Initialize glamor internal data structure. * - * @screen: Current screen pointer. - * @flags: Please refer the flags description above. + * @screen: Current screen pointer. + * @backend: Backend private data + * @flags: Please refer the flags description above. * * @GLAMOR_INVERTED_Y_AXIS: * set 1 means the GL env's origin (0,0) is at top-left. @@ -102,7 +103,8 @@ typedef enum glamor_pixmap_type { * be called after the DDX's screen initialization or at the last * step of the DDX's screen initialization. */ -extern _X_EXPORT Bool glamor_init(ScreenPtr screen, unsigned int flags); +extern _X_EXPORT Bool glamor_init(ScreenPtr screen, void *backend, + unsigned int flags); extern _X_EXPORT void glamor_fini(ScreenPtr screen); /* This function is used to free the glamor private screen's @@ -274,7 +276,7 @@ extern _X_EXPORT Bool glamor_poly_lines_nf(DrawablePtr drawable, GCPtr gc, int m DDXPointPtr points); /* XXX doesn't belong here */ -extern _X_EXPORT Bool glamor_egl_gbm_init(ScreenPtr screen, int fd); +extern _X_EXPORT void *glamor_egl_gbm_init(ScreenPtr screen, int fd); #endif /* GLAMOR_H */ diff --git a/glamor/glamor_egl_gbm.c b/glamor/glamor_egl_gbm.c index e2a7f2506..126f6b459 100644 --- a/glamor/glamor_egl_gbm.c +++ b/glamor/glamor_egl_gbm.c @@ -40,9 +40,7 @@ #define EGL_EGLEXT_PROTOTYPES #define EGL_DISPLAY_NO_X_MESA -#ifdef GLAMOR_HAS_GBM #include <gbm.h> -#endif #if GLAMOR_GLES2 #include <GLES2/gl2.h> @@ -69,9 +67,7 @@ struct glamor_egl_screen_private { EGLImageKHR front_image; PixmapPtr *back_pixmap; int cpp; -#ifdef GLAMOR_HAS_GBM struct gbm_device *gbm; -#endif int has_gem; int gl_context_depth; @@ -199,11 +195,10 @@ glamor_egl_has_extension(struct glamor_egl_screen_private *glamor_egl, return FALSE; } -Bool +void * glamor_egl_gbm_init(ScreenPtr screen, int fd) { struct glamor_egl_screen_private *glamor_egl; - glamor_screen_private *glamor; EGLint config_attribs[] = { #ifdef GLAMOR_GLES2 EGL_CONTEXT_CLIENT_VERSION, 2, @@ -211,26 +206,18 @@ glamor_egl_gbm_init(ScreenPtr screen, int fd) EGL_NONE }; - glamor = glamor_get_screen_private(screen); - if (!glamor) - return FALSE; - glamor_egl = calloc(sizeof(*glamor_egl), 1); if (!glamor_egl) - return FALSE; - glamor->backend = glamor_egl; + return NULL; glamor_egl->fd = fd; -#ifdef GLAMOR_HAS_GBM glamor_egl->gbm = gbm_create_device(glamor_egl->fd); if (glamor_egl->gbm == NULL) { ErrorF("couldn't get display device\n"); - return FALSE; + free(glamor_egl); + return NULL; } glamor_egl->display = eglGetDisplay(glamor_egl->gbm); -#else - glamor_egl->display = eglGetDisplay((EGLNativeDisplayType)(uintptr_t)fd); -#endif glamor_egl->has_gem = glamor_egl_check_has_gem(fd); @@ -240,20 +227,24 @@ glamor_egl_gbm_init(ScreenPtr screen, int fd) eglBindAPI(EGL_OPENGL_ES_API); #endif if (!eglInitialize - (glamor_egl->display, &glamor_egl->major, &glamor_egl->minor)) - return FALSE; + (glamor_egl->display, &glamor_egl->major, &glamor_egl->minor)) { + free(glamor_egl); + return NULL; + } #define GLAMOR_CHECK_EGL_EXTENSION(EXT) \ if (!glamor_egl_has_extension(glamor_egl, "EGL_" #EXT)) { \ ErrorF("EGL_" #EXT " required.\n"); \ - return FALSE; \ + free(glamor_egl); \ + return NULL; \ } #define GLAMOR_CHECK_EGL_EXTENSIONS(EXT1, EXT2) \ if (!glamor_egl_has_extension(glamor_egl, "EGL_" #EXT1) && \ !glamor_egl_has_extension(glamor_egl, "EGL_" #EXT2)) { \ ErrorF("EGL_" #EXT1 " or EGL_" #EXT2 " required.\n"); \ - return FALSE; \ + free(glamor_egl); \ + return NULL; \ } GLAMOR_CHECK_EGL_EXTENSION(MESA_drm_image); @@ -275,19 +266,25 @@ glamor_egl_gbm_init(ScreenPtr screen, int fd) eglGetProcAddress("glEGLImageTargetTexture2DOES"); if (!glamor_egl->egl_create_image_khr - || !glamor_egl->egl_image_target_texture2d_oes) - return FALSE; + || !glamor_egl->egl_image_target_texture2d_oes) { + free(glamor_egl); + return NULL; + } glamor_egl->context = eglCreateContext(glamor_egl->display, NULL, EGL_NO_CONTEXT, config_attribs); - if (glamor_egl->context == EGL_NO_CONTEXT) - return FALSE; + if (glamor_egl->context == EGL_NO_CONTEXT) { + free(glamor_egl); + return NULL; + } if (!eglMakeCurrent(glamor_egl->display, EGL_NO_SURFACE, EGL_NO_SURFACE, - glamor_egl->context)) - return FALSE; + glamor_egl->context)) { + free(glamor_egl); + return NULL; + } - return TRUE; + return glamor_egl; } diff --git a/hw/kdrive/ephyr/Makefile.am b/hw/kdrive/ephyr/Makefile.am index a39928659..939ecdec1 100644 --- a/hw/kdrive/ephyr/Makefile.am +++ b/hw/kdrive/ephyr/Makefile.am @@ -68,7 +68,7 @@ Xephyr_LDADD = \ $(top_builddir)/glamor/libglamor.la \ $(top_builddir)/exa/libexa.la \ @KDRIVE_LIBS@ \ - @XEPHYR_LIBS@ -lEGL -lGL + @XEPHYR_LIBS@ -lgbm -lEGL -lGL Xephyr_DEPENDENCIES = @KDRIVE_LOCAL_LIBS@ diff --git a/hw/kdrive/ephyr/ephyr_glamor.c b/hw/kdrive/ephyr/ephyr_glamor.c index d81b65544..adb8f4182 100644 --- a/hw/kdrive/ephyr/ephyr_glamor.c +++ b/hw/kdrive/ephyr/ephyr_glamor.c @@ -47,13 +47,16 @@ static int ephyr_glamor_fd; Bool ephyr_glamor_init(ScreenPtr screen) { + void *backend; ephyr_glamor_fd = open(ephyr_glamor_device, O_RDWR | O_CLOEXEC); if (ephyr_glamor_fd < 0) return FALSE; - glamor_egl_gbm_init(screen, ephyr_glamor_fd); + backend = glamor_egl_gbm_init(screen, ephyr_glamor_fd); + if (!backend) + return FALSE; - glamor_init(screen, GLAMOR_USE_SCREEN | GLAMOR_USE_PICTURE_SCREEN); + glamor_init(screen, backend, GLAMOR_USE_SCREEN | GLAMOR_USE_PICTURE_SCREEN); return TRUE; } |