egl/dri2: Consolidate eglTerminate
authorChad Versace <chad.versace@linux.intel.com>
Wed, 29 Jan 2014 02:53:56 +0000 (18:53 -0800)
committerChad Versace <chad.versace@linux.intel.com>
Mon, 17 Mar 2014 22:39:22 +0000 (15:39 -0700)
egl_dri2.c:dri2_terminate() handled terminating X11 and DRM displays.
The Wayland platform implemented its own dri2_wl_terminate(), which was
nearly a copy of the common one.

To implement the EGL platform extensions, we either need to dispatch
eglTerminate per display or define a common implementation for all
platforms. This patch chooses consolidation.  It removes
dri2_wl_terminate() by folding it into the common dri2_terminate().

It was necessary to invert the `if (disp->PlatformDisplay == NULL)` and
the switch statement because, unlike DRM and X11, Wayland's terminator
performed action even when EGL didn't own the native display. In the
inversion, I replaced `disp->PlatformDisplay == NULL` with
`dri2_dpy->own_device` because the two expressions are synonymous, but
the latter's meaning is clearer.

Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
src/egl/drivers/dri2/egl_dri2.c
src/egl/drivers/dri2/platform_wayland.c

index 9074a81f90b56b3bef3dc8230f8fad49facfbc13..9e5b956bc82de32082cf678294607efece60abb7 100644 (file)
@@ -25,6 +25,8 @@
  *    Kristian Høgsberg <krh@bitplanet.net>
  */
 
+#define WL_HIDE_DEPRECATED
+
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 
-#include "egl_dri2.h"
-
 #ifdef HAVE_WAYLAND_PLATFORM
 #include "wayland-drm.h"
+#include "wayland-drm-client-protocol.h"
 #endif
 
+#include "egl_dri2.h"
+
 const __DRIuseInvalidateExtension use_invalidate = {
    { __DRI_USE_INVALIDATE, 1 }
 };
@@ -672,23 +675,31 @@ dri2_terminate(_EGLDriver *drv, _EGLDisplay *disp)
       dlclose(dri2_dpy->driver);
    free(dri2_dpy->device_name);
 
-   if (disp->PlatformDisplay == NULL) {
-      switch (disp->Platform) {
+   switch (disp->Platform) {
 #ifdef HAVE_X11_PLATFORM
-      case _EGL_PLATFORM_X11:
+   case _EGL_PLATFORM_X11:
+      if (dri2_dpy->own_device) {
          xcb_disconnect(dri2_dpy->conn);
-         break;
+      }
+      break;
 #endif
 #ifdef HAVE_DRM_PLATFORM
-      case _EGL_PLATFORM_DRM:
-         if (dri2_dpy->own_device) {
-            gbm_device_destroy(&dri2_dpy->gbm_dri->base.base);
-         }
-         break;
+   case _EGL_PLATFORM_DRM:
+      if (dri2_dpy->own_device) {
+         gbm_device_destroy(&dri2_dpy->gbm_dri->base.base);
+      }
+      break;
 #endif
-      default:
-         break;
+#ifdef HAVE_WAYLAND_PLATFORM
+   case _EGL_PLATFORM_WAYLAND:
+      wl_drm_destroy(dri2_dpy->wl_drm);
+      if (dri2_dpy->own_device) {
+         wl_display_disconnect(dri2_dpy->wl_dpy);
       }
+      break;
+#endif
+   default:
+      break;
    }
 
    free(dri2_dpy);
index 9110750ae9507f2a9d649e7442bae831cc9b64d7..c6031f0fd1b1ee70929a2acf23ee2ee8234785aa 100644 (file)
@@ -781,31 +781,6 @@ dri2_wl_authenticate(_EGLDisplay *disp, uint32_t id)
    return ret;
 }
 
-/**
- * Called via eglTerminate(), drv->API.Terminate().
- */
-static EGLBoolean
-dri2_wl_terminate(_EGLDriver *drv, _EGLDisplay *disp)
-{
-   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-
-   _eglReleaseDisplayResources(drv, disp);
-   _eglCleanupDisplay(disp);
-
-   dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
-   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;
-
-   return EGL_TRUE;
-}
-
 static void
 drm_handle_device(void *data, struct wl_drm *drm, const char *device)
 {
@@ -986,8 +961,6 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
 
    loader_set_logger(_eglLog);
 
-   drv->API.Terminate = dri2_wl_terminate;
-
    drv->API.CreateWaylandBufferFromImageWL =
       dri2_wl_create_wayland_buffer_from_image_wl;