Set close on exec flag FD_CLOEXEC
[mesa.git] / src / egl / drivers / dri2 / platform_wayland.c
index 7a70d8d59053a1b0c30a8e08b728fc222f9943b1..0f439c7110764a2e5335b910f760651031f917d1 100644 (file)
@@ -41,9 +41,8 @@
 #include "wayland-drm-client-protocol.h"
 
 enum wl_drm_format_flags {
-   HAS_ARGB32 = 1,
-   HAS_PREMUL_ARGB32 = 2,
-   HAS_XRGB32 = 4
+   HAS_ARGB8888 = 1,
+   HAS_XRGB8888 = 2
 };
 
 static void
@@ -108,11 +107,9 @@ dri2_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
    dri2_surf->block_swap_buffers = EGL_FALSE;
 
    if (conf->AlphaSize == 0)
-      dri2_surf->format = WL_DRM_FORMAT_XRGB32;
-   else if (dri2_surf->base.VGAlphaFormat == EGL_VG_ALPHA_FORMAT_PRE)
-      dri2_surf->format = WL_DRM_FORMAT_PREMULTIPLIED_ARGB32;
+      dri2_surf->format = WL_DRM_FORMAT_XRGB8888;
    else
-      dri2_surf->format = WL_DRM_FORMAT_ARGB32;
+      dri2_surf->format = WL_DRM_FORMAT_ARGB8888;
 
    switch (type) {
    case EGL_WINDOW_BIT:
@@ -671,7 +668,7 @@ dri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
                           wl_egl_pixmap->width,
                           wl_egl_pixmap->height,
                           dri2_buf->dri_buffer->pitch,
-                          WL_DRM_FORMAT_PREMULTIPLIED_ARGB32);
+                          WL_DRM_FORMAT_ARGB8888);
 
    wl_attr_list[1] = wl_egl_pixmap->width;
    wl_attr_list[3] = wl_egl_pixmap->height;
@@ -731,6 +728,10 @@ dri2_terminate(_EGLDriver *drv, _EGLDisplay *disp)
    close(dri2_dpy->fd);
    dlclose(dri2_dpy->driver);
    free(dri2_dpy->driver_name);
+   free(dri2_dpy->device_name);
+   wl_drm_destroy(dri2_dpy->wl_drm);
+   if (dri2_dpy->own_device)
+      wl_display_disconnect(dri2_dpy->wl_dpy);
    free(dri2_dpy);
    disp->DriverData = NULL;
 
@@ -747,7 +748,16 @@ drm_handle_device(void *data, struct wl_drm *drm, const char *device)
    if (!dri2_dpy->device_name)
       return;
 
-   dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR);
+#ifdef O_CLOEXEC
+   dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR | O_CLOEXEC);
+   if (dri2_dpy->fd == -1 && errno == EINVAL)
+#endif
+   {
+      dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR);
+      if (dri2_dpy->fd != -1)
+         fcntl(dri2_dpy->fd, F_SETFD, fcntl(dri2_dpy->fd, F_GETFD) |
+            FD_CLOEXEC);
+   }
    if (dri2_dpy->fd == -1) {
       _eglLog(_EGL_WARNING, "wayland-egl: could not open %s (%s)",
              dri2_dpy->device_name, strerror(errno));
@@ -764,14 +774,11 @@ drm_handle_format(void *data, struct wl_drm *drm, uint32_t format)
    struct dri2_egl_display *dri2_dpy = data;
 
    switch (format) {
-   case WL_DRM_FORMAT_ARGB32:
-      dri2_dpy->formats |= HAS_ARGB32;
-      break;
-   case WL_DRM_FORMAT_PREMULTIPLIED_ARGB32:
-      dri2_dpy->formats |= HAS_PREMUL_ARGB32;
+   case WL_DRM_FORMAT_ARGB8888:
+      dri2_dpy->formats |= HAS_ARGB8888;
       break;
-   case WL_DRM_FORMAT_XRGB32:
-      dri2_dpy->formats |= HAS_XRGB32;
+   case WL_DRM_FORMAT_XRGB8888:
+      dri2_dpy->formats |= HAS_XRGB8888;
       break;
    }
 }
@@ -819,6 +826,7 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
       dri2_dpy->wl_dpy = wl_display_connect(NULL);
       if (dri2_dpy->wl_dpy == NULL)
          goto cleanup_dpy;
+      dri2_dpy->own_device = 1;
    } else {
       dri2_dpy->wl_dpy = disp->PlatformDisplay;
    }
@@ -866,14 +874,11 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
       goto cleanup_driver;
 
    types = EGL_WINDOW_BIT | EGL_PIXMAP_BIT;
-   if (dri2_dpy->formats & HAS_PREMUL_ARGB32)
-      types |= EGL_VG_ALPHA_FORMAT_PRE_BIT;
-
    for (i = 0; dri2_dpy->driver_configs[i]; i++) {
       config = dri2_dpy->driver_configs[i];
-      if (dri2_dpy->formats & HAS_XRGB32)
+      if (dri2_dpy->formats & HAS_XRGB8888)
         dri2_add_config(disp, config, i + 1, 0, types, NULL, rgb_masks);
-      if (dri2_dpy->formats & (HAS_ARGB32 | HAS_PREMUL_ARGB32))
+      if (dri2_dpy->formats & HAS_ARGB8888)
         dri2_add_config(disp, config, i + 1, 0, types, NULL, argb_masks);
    }