summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2012-03-28 22:53:49 -0400
committerKristian Høgsberg <krh@bitplanet.net>2012-03-28 22:53:49 -0400
commitb5ef591faca088e041e5b174145f8a3c2888e5ff (patch)
treefeb4cec306456c91ab27ff153cda24b72d0a9395
parentcbcd04794cd8248f2f71a135733777b1a893508e (diff)
compositor: Stop using EGL_KHR_surfaceless_gles2
The remaining use case was making our context current before we had any output surfaces. We can do that now using a dummy surface, so let's stop relying on surfaceless.
-rw-r--r--src/compositor-drm.c31
-rw-r--r--src/compositor-wayland.c23
-rw-r--r--src/compositor-x11.c23
3 files changed, 52 insertions, 25 deletions
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index fa4fec5..91f4bcd 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -60,6 +60,9 @@ struct drm_compositor {
uint32_t connector_allocator;
struct tty *tty;
+ struct gbm_surface *dummy_surface;
+ EGLSurface dummy_egl_surface;
+
struct wl_list sprite_list;
int sprites_are_broken;
@@ -770,7 +773,7 @@ static int
init_egl(struct drm_compositor *ec, struct udev_device *device)
{
EGLint major, minor, n;
- const char *extensions, *filename, *sysnum;
+ const char *filename, *sysnum;
int fd;
static const EGLint context_attribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
@@ -817,12 +820,6 @@ init_egl(struct drm_compositor *ec, struct udev_device *device)
return -1;
}
- extensions = eglQueryString(ec->base.display, EGL_EXTENSIONS);
- if (!strstr(extensions, "EGL_KHR_surfaceless_gles2")) {
- fprintf(stderr, "EGL_KHR_surfaceless_gles2 not available\n");
- return -1;
- }
-
if (!eglBindAPI(EGL_OPENGL_ES_API)) {
fprintf(stderr, "failed to bind api EGL_OPENGL_ES_API\n");
return -1;
@@ -841,8 +838,24 @@ init_egl(struct drm_compositor *ec, struct udev_device *device)
return -1;
}
- if (!eglMakeCurrent(ec->base.display, EGL_NO_SURFACE,
- EGL_NO_SURFACE, ec->base.context)) {
+ ec->dummy_surface = gbm_surface_create(ec->gbm, 10, 10,
+ GBM_FORMAT_XRGB8888,
+ GBM_BO_USE_RENDERING);
+ if (!ec->dummy_surface) {
+ fprintf(stderr, "failed to create dummy gbm surface\n");
+ return -1;
+ }
+
+ ec->dummy_egl_surface =
+ eglCreateWindowSurface(ec->base.display, ec->base.config,
+ ec->dummy_surface, NULL);
+ if (ec->dummy_egl_surface == EGL_NO_SURFACE) {
+ fprintf(stderr, "failed to create egl surface\n");
+ return -1;
+ }
+
+ if (!eglMakeCurrent(ec->base.display, ec->dummy_egl_surface,
+ ec->dummy_egl_surface, ec->base.context)) {
fprintf(stderr, "failed to make context current\n");
return -1;
}
diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
index 0f4d4ad..593e272 100644
--- a/src/compositor-wayland.c
+++ b/src/compositor-wayland.c
@@ -45,6 +45,9 @@
struct wayland_compositor {
struct weston_compositor base;
+ struct wl_egl_pixmap *dummy_pixmap;
+ EGLSurface dummy_egl_surface;;
+
struct {
struct wl_display *display;
struct wl_compositor *compositor;
@@ -260,7 +263,6 @@ wayland_compositor_init_egl(struct wayland_compositor *c)
{
EGLint major, minor;
EGLint n;
- const char *extensions;
EGLint config_attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RED_SIZE, 1,
@@ -286,12 +288,6 @@ wayland_compositor_init_egl(struct wayland_compositor *c)
return -1;
}
- extensions = eglQueryString(c->base.display, EGL_EXTENSIONS);
- if (!strstr(extensions, "EGL_KHR_surfaceless_gles2")) {
- fprintf(stderr, "EGL_KHR_surfaceless_gles2 not available\n");
- return -1;
- }
-
if (!eglBindAPI(EGL_OPENGL_ES_API)) {
fprintf(stderr, "failed to bind EGL_OPENGL_ES_API\n");
return -1;
@@ -309,8 +305,17 @@ wayland_compositor_init_egl(struct wayland_compositor *c)
return -1;
}
- if (!eglMakeCurrent(c->base.display, EGL_NO_SURFACE,
- EGL_NO_SURFACE, c->base.context)) {
+ c->dummy_pixmap = wl_egl_pixmap_create(10, 10, 0);
+ if (!c->dummy_pixmap) {
+ fprintf(stderr, "failure to create dummy_pixmap\n");
+ return -1;
+ }
+
+ c->dummy_egl_surface =
+ eglCreatePixmapSurface(c->base.display, c->base.config,
+ c->dummy_pixmap, NULL);
+ if (!eglMakeCurrent(c->base.display, c->dummy_egl_surface,
+ c->dummy_egl_surface, c->base.context)) {
fprintf(stderr, "failed to make context current\n");
return -1;
}
diff --git a/src/compositor-x11.c b/src/compositor-x11.c
index 119c456..e28fc94 100644
--- a/src/compositor-x11.c
+++ b/src/compositor-x11.c
@@ -48,6 +48,8 @@
struct x11_compositor {
struct weston_compositor base;
+ EGLSurface dummy_pbuffer;
+
Display *dpy;
xcb_connection_t *conn;
xcb_screen_t *screen;
@@ -117,7 +119,6 @@ x11_compositor_init_egl(struct x11_compositor *c)
{
EGLint major, minor;
EGLint n;
- const char *extensions;
EGLint config_attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RED_SIZE, 1,
@@ -131,6 +132,12 @@ x11_compositor_init_egl(struct x11_compositor *c)
EGL_NONE
};
+ static const EGLint pbuffer_attribs[] = {
+ EGL_WIDTH, 10,
+ EGL_HEIGHT, 10,
+ EGL_NONE
+ };
+
c->base.display = eglGetDisplay(c->dpy);
if (c->base.display == NULL) {
fprintf(stderr, "failed to create display\n");
@@ -142,12 +149,6 @@ x11_compositor_init_egl(struct x11_compositor *c)
return -1;
}
- extensions = eglQueryString(c->base.display, EGL_EXTENSIONS);
- if (!strstr(extensions, "EGL_KHR_surfaceless_gles2")) {
- fprintf(stderr, "EGL_KHR_surfaceless_gles2 not available\n");
- return -1;
- }
-
if (!eglBindAPI(EGL_OPENGL_ES_API)) {
fprintf(stderr, "failed to bind EGL_OPENGL_ES_API\n");
return -1;
@@ -165,6 +166,14 @@ x11_compositor_init_egl(struct x11_compositor *c)
return -1;
}
+ c->dummy_pbuffer = eglCreatePbufferSurface(c->base.display,
+ c->base.config,
+ pbuffer_attribs);
+ if (c->base.context == NULL) {
+ fprintf(stderr, "failed to create dummy pbuffer\n");
+ return -1;
+ }
+
if (!eglMakeCurrent(c->base.display, EGL_NO_SURFACE,
EGL_NO_SURFACE, c->base.context)) {
fprintf(stderr, "failed to make context current\n");