[PATCH 3/3] Fix crashes in clients when no DRM is present.

Kristian Høgsberg krh at bitplanet.net
Mon Dec 6 07:59:59 PST 2010


On Mon, Nov 29, 2010 at 2:41 PM, Yuval Fledel <yuvalfl at gmail.com> wrote:
> When no DRM present, clients (window.c actually) now either exit orderly,
> or if that check is removed - crash (unsurprisingly).
> This patch relieves this assumption, and allow some clients (terminal,
> image, flower) to run in a non-DRM environment

Thanks, that all looks good.  I applied it with minor changes to fix
conflicts with the recent changes.

Kristian

> ---
>  clients/window.c |  129 ++++++++++++++++++++++++++++++------------------------
>  1 files changed, 72 insertions(+), 57 deletions(-)
>
> diff --git a/clients/window.c b/clients/window.c
> index ae55819..9ee13c7 100644
> --- a/clients/window.c
> +++ b/clients/window.c
> @@ -453,10 +453,11 @@ display_create_surface(struct display *display,
>                       struct rectangle *rectangle)
>  {
>  #ifdef HAVE_CAIRO_GL
> -       return display_create_drm_surface(display, rectangle);
> -#else
> -       return display_create_shm_surface(display, rectangle);
> +       if (display->drm) {
> +               return display_create_drm_surface(display, rectangle);
> +       }
>  #endif
> +       return display_create_shm_surface(display, rectangle);
>  }
>
>  cairo_surface_t *
> @@ -465,10 +466,11 @@ display_create_surface_from_file(struct display *display,
>                                 struct rectangle *rectangle)
>  {
>  #ifdef HAVE_CAIRO_GL
> -       return display_create_drm_surface_from_file(display, filename, rectangle);
> -#else
> -       return display_create_shm_surface_from_file(display, filename, rectangle);
> +       if (display->drm) {
> +               return display_create_drm_surface_from_file(display, filename, rectangle);
> +       }
>  #endif
> +       return display_create_shm_surface_from_file(display, filename, rectangle);
>  }
>
>  static const struct {
> @@ -1231,10 +1233,11 @@ window_create(struct display *display, const
> char *title,
>        window->margin = 16;
>        window->decoration = 1;
>
> -#ifdef HAVE_CAIRO_GL
> -       window->buffer_type = WINDOW_BUFFER_TYPE_DRM;
> -#else
>        window->buffer_type = WINDOW_BUFFER_TYPE_SHM;
> +#ifdef HAVE_CAIRO_GL
> +       if (display->drm) {
> +               window->buffer_type = WINDOW_BUFFER_TYPE_DRM;
> +       }
>  #endif
>
>        wl_surface_set_user_data(window->surface, window);
> @@ -1391,16 +1394,69 @@ init_xkb(struct display *d)
>        }
>  }
>
> +static int
> +display_drm_init(struct display *d)
> +{
> +       EGLint major, minor;
> +       int fd;
> +       drm_magic_t magic;
> +
> +       fd = open(d->device_name, O_RDWR);
> +       if (fd < 0) {
> +               fprintf(stderr, "drm open failed: %m\n");
> +               return FALSE;
> +       }
> +
> +       if (drmGetMagic(fd, &magic)) {
> +               fprintf(stderr, "DRI2: failed to get drm magic");
> +               return FALSE;
> +       }
> +
> +       /* Wait for authenticated event */
> +       wl_drm_authenticate(d->drm, magic);
> +       wl_display_iterate(d->display, WL_DISPLAY_WRITABLE);
> +       while (!d->authenticated)
> +               wl_display_iterate(d->display, WL_DISPLAY_READABLE);
> +
> +       d->dpy = eglGetDRMDisplayMESA(fd);
> +       if (!eglInitialize(d->dpy, &major, &minor)) {
> +               fprintf(stderr, "failed to initialize display\n");
> +               return FALSE;
> +       }
> +
> +       if (!eglBindAPI(EGL_OPENGL_API)) {
> +               fprintf(stderr, "failed to bind api EGL_OPENGL_API\n");
> +               return FALSE;
> +       }
> +
> +       d->ctx = eglCreateContext(d->dpy, NULL, EGL_NO_CONTEXT, NULL);
> +       if (d->ctx == NULL) {
> +               fprintf(stderr, "failed to create context\n");
> +               return FALSE;
> +       }
> +
> +       if (!eglMakeCurrent(d->dpy, NULL, NULL, d->ctx)) {
> +               fprintf(stderr, "faile to make context current\n");
> +               return FALSE;
> +       }
> +
> +#ifdef HAVE_CAIRO_GL
> +       d->device = cairo_egl_device_create(d->dpy, d->ctx);
> +       if (d->device == NULL) {
> +               fprintf(stderr, "failed to get cairo drm device\n");
> +               return FALSE;
> +       }
> +#endif
> +       return TRUE;
> +}
> +
>  struct display *
>  display_create(int *argc, char **argv[], const GOptionEntry *option_entries)
>  {
>        struct display *d;
> -       EGLint major, minor;
> -       int fd;
>        GOptionContext *context;
>        GOptionGroup *xkb_option_group;
>        GError *error;
> -       drm_magic_t magic;
>
>        g_type_init();
>
> @@ -1440,52 +1496,11 @@ display_create(int *argc, char **argv[], const
> GOptionEntry *option_entries)
>        /* Process connection events. */
>        wl_display_iterate(d->display, WL_DISPLAY_READABLE);
>
> -       fd = open(d->device_name, O_RDWR);
> -       if (fd < 0) {
> -               fprintf(stderr, "drm open failed: %m\n");
> -               return NULL;
> -       }
> -
> -       if (drmGetMagic(fd, &magic)) {
> -               fprintf(stderr, "DRI2: failed to get drm magic");
> -               return NULL;
> -       }
> -
> -       /* Wait for authenticated event */
> -       wl_drm_authenticate(d->drm, magic);
> -       wl_display_iterate(d->display, WL_DISPLAY_WRITABLE);
> -       while (!d->authenticated)
> -               wl_display_iterate(d->display, WL_DISPLAY_READABLE);
> -
> -       d->dpy = eglGetDRMDisplayMESA(fd);
> -       if (!eglInitialize(d->dpy, &major, &minor)) {
> -               fprintf(stderr, "failed to initialize display\n");
> -               return NULL;
> -       }
> -
> -       if (!eglBindAPI(EGL_OPENGL_API)) {
> -               fprintf(stderr, "failed to bind api EGL_OPENGL_API\n");
> -               return NULL;
> -       }
> -
> -       d->ctx = eglCreateContext(d->dpy, NULL, EGL_NO_CONTEXT, NULL);
> -       if (d->ctx == NULL) {
> -               fprintf(stderr, "failed to create context\n");
> -               return NULL;
> -       }
> -
> -       if (!eglMakeCurrent(d->dpy, NULL, NULL, d->ctx)) {
> -               fprintf(stderr, "faile to make context current\n");
> -               return NULL;
> -       }
> -
> -#ifdef HAVE_CAIRO_GL
> -       d->device = cairo_egl_device_create(d->dpy, d->ctx);
> -       if (d->device == NULL) {
> -               fprintf(stderr, "failed to get cairo drm device\n");
> -               return NULL;
> +       if (d->device_name) {
> +               if (!display_drm_init(d)) {
> +                       return NULL;
> +               }
>        }
> -#endif
>
>        create_pointer_surfaces(d);
>
> --
> 1.7.1
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>


More information about the wayland-devel mailing list