compositor: Create outputs before initializing GLES2 state

This way we can just use the first weston_output EGLSurface to make a
context current.
Kristian Høgsberg 12 years ago
parent fa1be023a2
commit 2bc5e8eaf8
  1. 37
      src/compositor-drm.c
  2. 24
      src/compositor-wayland.c
  3. 28
      src/compositor-x11.c
  4. 12
      src/gles2-renderer.c

@ -88,9 +88,6 @@ struct drm_compositor {
uint32_t connector_allocator;
struct tty *tty;
struct gbm_surface *dummy_surface;
EGLSurface dummy_egl_surface;
/* we need these parameters in order to not fail drmModeAddFB2()
* due to out of bounds dimensions, and then mistakenly set
* sprites_are_broken:
@ -1112,30 +1109,6 @@ init_egl(struct drm_compositor *ec, struct udev_device *device)
return -1;
}
ec->dummy_surface = gbm_surface_create(ec->gbm, 10, 10,
GBM_FORMAT_XRGB8888,
GBM_BO_USE_RENDERING);
if (!ec->dummy_surface) {
weston_log("failed to create dummy gbm surface\n");
return -1;
}
ec->dummy_egl_surface =
eglCreateWindowSurface(ec->base.egl_display,
ec->base.egl_config,
ec->dummy_surface,
NULL);
if (ec->dummy_egl_surface == EGL_NO_SURFACE) {
weston_log("failed to create egl surface\n");
return -1;
}
if (!eglMakeCurrent(ec->base.egl_display, ec->dummy_egl_surface,
ec->dummy_egl_surface, ec->base.egl_context)) {
weston_log("failed to make context current\n");
return -1;
}
return 0;
}
@ -2265,9 +2238,6 @@ drm_compositor_create(struct wl_display *display,
ec->prev_state = WESTON_COMPOSITOR_ACTIVE;
if (gles2_renderer_init(&ec->base) < 0)
goto err_egl;
for (key = KEY_F1; key < KEY_F9; key++)
weston_compositor_add_key_binding(&ec->base, key,
MODIFIER_CTRL | MODIFIER_ALT,
@ -2281,6 +2251,9 @@ drm_compositor_create(struct wl_display *display,
goto err_sprite;
}
if (gles2_renderer_init(&ec->base) < 0)
goto err_egl;
path = NULL;
evdev_input_create(&ec->base, ec->udev, seat);
@ -2319,14 +2292,14 @@ err_drm_source:
wl_event_source_remove(ec->drm_source);
wl_list_for_each_safe(weston_seat, next, &ec->base.seat_list, link)
evdev_input_destroy(weston_seat);
err_sprite:
destroy_sprites(ec);
err_egl:
eglMakeCurrent(ec->base.egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE,
EGL_NO_CONTEXT);
eglTerminate(ec->base.egl_display);
eglReleaseThread();
gbm_device_destroy(ec->gbm);
err_sprite:
destroy_sprites(ec);
err_udev_dev:
udev_device_unref(drm_device);
err_udev_enum:

@ -46,9 +46,6 @@
struct wayland_compositor {
struct weston_compositor base;
struct wl_egl_pixmap *dummy_pixmap;
EGLSurface dummy_egl_surface;
struct {
struct wl_display *wl_display;
struct wl_compositor *compositor;
@ -296,21 +293,6 @@ wayland_compositor_init_egl(struct wayland_compositor *c)
return -1;
}
c->dummy_pixmap = wl_egl_pixmap_create(10, 10, 0);
if (!c->dummy_pixmap) {
weston_log("failure to create dummy_pixmap\n");
return -1;
}
c->dummy_egl_surface =
eglCreatePixmapSurface(c->base.egl_display, c->base.egl_config,
c->dummy_pixmap, NULL);
if (!eglMakeCurrent(c->base.egl_display, c->dummy_egl_surface,
c->dummy_egl_surface, c->base.egl_context)) {
weston_log("failed to make context current\n");
return -1;
}
return 0;
}
@ -884,13 +866,13 @@ wayland_compositor_create(struct wl_display *display,
c->base.destroy = wayland_destroy;
c->base.restore = wayland_restore;
if (gles2_renderer_init(&c->base) < 0)
goto err_display;
create_border(c);
if (wayland_compositor_create_output(c, width, height) < 0)
goto err_display;
if (gles2_renderer_init(&c->base) < 0)
goto err_display;
loop = wl_display_get_event_loop(c->base.wl_display);
fd = wl_display_get_fd(c->parent.wl_display, update_event_mask, c);

@ -68,8 +68,6 @@ struct x11_configured_output {
struct x11_compositor {
struct weston_compositor base;
EGLSurface dummy_pbuffer;
Display *dpy;
xcb_connection_t *conn;
xcb_screen_t *screen;
@ -256,12 +254,6 @@ 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.egl_display = eglGetDisplay(c->dpy);
if (c->base.egl_display == NULL) {
weston_log("failed to create display\n");
@ -291,20 +283,6 @@ x11_compositor_init_egl(struct x11_compositor *c)
return -1;
}
c->dummy_pbuffer = eglCreatePbufferSurface(c->base.egl_display,
c->base.egl_config,
pbuffer_attribs);
if (c->dummy_pbuffer == NULL) {
weston_log("failed to create dummy pbuffer\n");
return -1;
}
if (!eglMakeCurrent(c->base.egl_display, c->dummy_pbuffer,
c->dummy_pbuffer, c->base.egl_context)) {
weston_log("failed to make context current\n");
return -1;
}
return 0;
}
@ -1175,9 +1153,6 @@ x11_compositor_create(struct wl_display *display,
c->base.destroy = x11_destroy;
c->base.restore = x11_restore;
if (gles2_renderer_init(&c->base) < 0)
goto err_egl;
if (x11_input_create(c, no_input) < 0)
goto err_egl;
@ -1212,6 +1187,9 @@ x11_compositor_create(struct wl_display *display,
x = pixman_region32_extents(&output->base.region)->x2;
}
if (gles2_renderer_init(&c->base) < 0)
goto err_egl;
c->xcb_source =
wl_event_loop_add_fd(c->base.input_loop,
xcb_get_file_descriptor(c->conn),

@ -1045,11 +1045,23 @@ gles2_renderer_init(struct weston_compositor *ec)
struct gles2_renderer *renderer;
const char *extensions;
int has_egl_image_external = 0;
struct weston_output *output;
EGLBoolean ret;
renderer = malloc(sizeof *renderer);
if (renderer == NULL)
return -1;
output = container_of(ec->output_list.next,
struct weston_output, link);
ret = eglMakeCurrent(ec->egl_display, output->egl_surface,
output->egl_surface, ec->egl_context);
if (ret == EGL_FALSE) {
weston_log("Failed to make EGL context current.\n");
print_egl_error_state();
return -1;
}
log_egl_gl_info(ec->egl_display);
ec->image_target_texture_2d =

Loading…
Cancel
Save