summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2013-10-11 17:16:01 -0400
committerAdam Jackson <ajax@redhat.com>2013-10-11 18:01:07 -0400
commit35e089d96eb7db1818e3b63b15a14612ef89ee5e (patch)
treec87aefe691057f4e7aed3dcb73c25a49a92a8b2e
parent1d620a4a9d9b4ed673edd337eb7ab250ed8ef5ea (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.c3
-rw-r--r--glamor/glamor.h10
-rw-r--r--glamor/glamor_egl_gbm.c53
-rw-r--r--hw/kdrive/ephyr/Makefile.am2
-rw-r--r--hw/kdrive/ephyr/ephyr_glamor.c7
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;
}