summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Franzke <[email protected]>2011-06-29 08:49:39 +0200
committerBenjamin Franzke <[email protected]>2011-08-04 14:09:34 +0200
commit32f4cf38085e4056b8e4a9fc78fea28897a1d05f (patch)
tree0b260ead68238802031a32a73ee7e714a3356bfe
parentca6bbfd76960731926c99d0b6257b42344596794 (diff)
egl/gbm: Fix EGL_DEFAULT_DISPLAY
-rw-r--r--src/egl/drivers/dri2/egl_dri2.c7
-rw-r--r--src/egl/drivers/dri2/egl_dri2.h1
-rw-r--r--src/egl/drivers/dri2/platform_drm.c25
-rw-r--r--src/gallium/state_trackers/egl/drm/native_drm.c23
-rw-r--r--src/gallium/state_trackers/egl/drm/native_drm.h4
5 files changed, 53 insertions, 7 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 0aca929e6aa..9a37ea4bbfc 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -592,6 +592,13 @@ dri2_terminate(_EGLDriver *drv, _EGLDisplay *disp)
wl_display_destroy(dri2_dpy->wl_dpy);
break;
#endif
+#ifdef HAVE_DRM_PLATFORM
+ case _EGL_PLATFORM_DRM:
+ if (dri2_dpy->own_gbm_device) {
+ gbm_device_destroy(&dri2_dpy->gbm_dri->base.base);
+ }
+ break;
+#endif
default:
break;
}
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index 3854200bc69..a7297188af2 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -86,6 +86,7 @@ struct dri2_egl_display
#ifdef HAVE_DRM_PLATFORM
struct gbm_dri_device *gbm_dri;
+ int own_gbm_device;
#endif
char *device_name;
diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c
index 579baf9f9d2..04b10e279ec 100644
--- a/src/egl/drivers/dri2/platform_drm.c
+++ b/src/egl/drivers/dri2/platform_drm.c
@@ -30,6 +30,10 @@
#include <string.h>
#include <xf86drm.h>
#include <dlfcn.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
#include "egl_dri2.h"
@@ -90,6 +94,7 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
{
struct dri2_egl_display *dri2_dpy;
struct gbm_device *gbm;
+ int fd = -1;
int i;
dri2_dpy = malloc(sizeof *dri2_dpy);
@@ -100,7 +105,15 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
disp->DriverData = (void *) dri2_dpy;
- gbm = (struct gbm_device *) disp->PlatformDisplay;
+ gbm = disp->PlatformDisplay;
+ if (gbm == NULL) {
+ fd = open("/dev/dri/card0", O_RDWR);
+ dri2_dpy->own_gbm_device = 1;
+ gbm = gbm_create_device(fd);
+ if (gbm == NULL)
+ return EGL_FALSE;
+ }
+
if (strcmp(gbm_device_get_backend_name(gbm), "drm") != 0) {
free(dri2_dpy);
return EGL_FALSE;
@@ -112,7 +125,15 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
return EGL_FALSE;
}
- dri2_dpy->fd = gbm_device_get_fd(gbm);
+ if (fd < 0) {
+ fd = dup(gbm_device_get_fd(gbm));
+ if (fd < 0) {
+ free(dri2_dpy);
+ return EGL_FALSE;
+ }
+ }
+
+ dri2_dpy->fd = fd;
dri2_dpy->device_name = dri2_get_device_name_for_fd(dri2_dpy->fd);
dri2_dpy->driver_name = dri2_dpy->gbm_dri->base.driver_name;
diff --git a/src/gallium/state_trackers/egl/drm/native_drm.c b/src/gallium/state_trackers/egl/drm/native_drm.c
index 47910de8d3c..c013769e57d 100644
--- a/src/gallium/state_trackers/egl/drm/native_drm.c
+++ b/src/gallium/state_trackers/egl/drm/native_drm.c
@@ -134,8 +134,11 @@ drm_display_destroy(struct native_display *ndpy)
if (drmdpy->device_name)
FREE(drmdpy->device_name);
- if (drmdpy->fd >= 0)
- close(drmdpy->fd);
+ if (drmdpy->own_gbm) {
+ gbm_device_destroy(&drmdpy->gbmdrm->base.base);
+ if (drmdpy->fd >= 0)
+ close(drmdpy->fd);
+ }
FREE(drmdpy);
}
@@ -258,7 +261,7 @@ drm_display_init_screen(struct native_display *ndpy)
}
static struct native_display *
-drm_create_display(struct gbm_gallium_drm_device *gbmdrm,
+drm_create_display(struct gbm_gallium_drm_device *gbmdrm, int own_gbm,
const struct native_event_handler *event_handler)
{
struct drm_display *drmdpy;
@@ -267,6 +270,8 @@ drm_create_display(struct gbm_gallium_drm_device *gbmdrm,
if (!drmdpy)
return NULL;
+ drmdpy->gbmdrm = gbmdrm;
+ drmdpy->own_gbm = own_gbm;
drmdpy->fd = gbmdrm->base.base.fd;
drmdpy->device_name = drm_get_device_name(drmdpy->fd);
@@ -302,22 +307,30 @@ native_create_display(void *dpy, boolean use_sw)
{
struct gbm_gallium_drm_device *gbm;
int fd;
+ int own_gbm = 0;
gbm = dpy;
if (gbm == NULL) {
fd = open("/dev/dri/card0", O_RDWR);
+ /* FIXME: Use an internal constructor to create a gbm
+ * device with gallium backend directly, without setenv */
+ setenv("GBM_BACKEND", "gbm_gallium_drm.so", 1);
gbm = gbm_gallium_drm_device(gbm_create_device(fd));
+ own_gbm = 1;
}
if (gbm == NULL)
return NULL;
if (strcmp(gbm_device_get_backend_name(&gbm->base.base), "drm") != 0 ||
- gbm->base.type != GBM_DRM_DRIVER_TYPE_GALLIUM)
+ gbm->base.type != GBM_DRM_DRIVER_TYPE_GALLIUM) {
+ if (own_gbm)
+ gbm_device_destroy(&gbm->base.base);
return NULL;
+ }
- return drm_create_display(gbm, drm_event_handler);
+ return drm_create_display(gbm, own_gbm, drm_event_handler);
}
static const struct native_platform drm_platform = {
diff --git a/src/gallium/state_trackers/egl/drm/native_drm.h b/src/gallium/state_trackers/egl/drm/native_drm.h
index 675a58a1922..18cebf4e276 100644
--- a/src/gallium/state_trackers/egl/drm/native_drm.h
+++ b/src/gallium/state_trackers/egl/drm/native_drm.h
@@ -41,6 +41,8 @@
#include "common/native_wayland_drm_bufmgr_helper.h"
#endif
+#include "gbm_gallium_drmint.h"
+
struct drm_config;
struct drm_crtc;
struct drm_connector;
@@ -52,6 +54,8 @@ struct drm_display {
const struct native_event_handler *event_handler;
+ struct gbm_gallium_drm_device *gbmdrm;
+ int own_gbm;
int fd;
char *device_name;
struct drm_config *config;