mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 09:18:04 +02:00
egl/gbm: Fix EGL_DEFAULT_DISPLAY
This commit is contained in:
parent
ca6bbfd769
commit
32f4cf3808
5 changed files with 53 additions and 7 deletions
|
|
@ -591,6 +591,13 @@ dri2_terminate(_EGLDriver *drv, _EGLDisplay *disp)
|
||||||
case _EGL_PLATFORM_WAYLAND:
|
case _EGL_PLATFORM_WAYLAND:
|
||||||
wl_display_destroy(dri2_dpy->wl_dpy);
|
wl_display_destroy(dri2_dpy->wl_dpy);
|
||||||
break;
|
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
|
#endif
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -86,6 +86,7 @@ struct dri2_egl_display
|
||||||
|
|
||||||
#ifdef HAVE_DRM_PLATFORM
|
#ifdef HAVE_DRM_PLATFORM
|
||||||
struct gbm_dri_device *gbm_dri;
|
struct gbm_dri_device *gbm_dri;
|
||||||
|
int own_gbm_device;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char *device_name;
|
char *device_name;
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,10 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <xf86drm.h>
|
#include <xf86drm.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "egl_dri2.h"
|
#include "egl_dri2.h"
|
||||||
|
|
||||||
|
|
@ -90,6 +94,7 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
|
||||||
{
|
{
|
||||||
struct dri2_egl_display *dri2_dpy;
|
struct dri2_egl_display *dri2_dpy;
|
||||||
struct gbm_device *gbm;
|
struct gbm_device *gbm;
|
||||||
|
int fd = -1;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
dri2_dpy = malloc(sizeof *dri2_dpy);
|
dri2_dpy = malloc(sizeof *dri2_dpy);
|
||||||
|
|
@ -100,7 +105,15 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
|
||||||
|
|
||||||
disp->DriverData = (void *) dri2_dpy;
|
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) {
|
if (strcmp(gbm_device_get_backend_name(gbm), "drm") != 0) {
|
||||||
free(dri2_dpy);
|
free(dri2_dpy);
|
||||||
return EGL_FALSE;
|
return EGL_FALSE;
|
||||||
|
|
@ -112,7 +125,15 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
|
||||||
return EGL_FALSE;
|
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->device_name = dri2_get_device_name_for_fd(dri2_dpy->fd);
|
||||||
dri2_dpy->driver_name = dri2_dpy->gbm_dri->base.driver_name;
|
dri2_dpy->driver_name = dri2_dpy->gbm_dri->base.driver_name;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -134,8 +134,11 @@ drm_display_destroy(struct native_display *ndpy)
|
||||||
if (drmdpy->device_name)
|
if (drmdpy->device_name)
|
||||||
FREE(drmdpy->device_name);
|
FREE(drmdpy->device_name);
|
||||||
|
|
||||||
if (drmdpy->fd >= 0)
|
if (drmdpy->own_gbm) {
|
||||||
close(drmdpy->fd);
|
gbm_device_destroy(&drmdpy->gbmdrm->base.base);
|
||||||
|
if (drmdpy->fd >= 0)
|
||||||
|
close(drmdpy->fd);
|
||||||
|
}
|
||||||
|
|
||||||
FREE(drmdpy);
|
FREE(drmdpy);
|
||||||
}
|
}
|
||||||
|
|
@ -258,7 +261,7 @@ drm_display_init_screen(struct native_display *ndpy)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct native_display *
|
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)
|
const struct native_event_handler *event_handler)
|
||||||
{
|
{
|
||||||
struct drm_display *drmdpy;
|
struct drm_display *drmdpy;
|
||||||
|
|
@ -267,6 +270,8 @@ drm_create_display(struct gbm_gallium_drm_device *gbmdrm,
|
||||||
if (!drmdpy)
|
if (!drmdpy)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
drmdpy->gbmdrm = gbmdrm;
|
||||||
|
drmdpy->own_gbm = own_gbm;
|
||||||
drmdpy->fd = gbmdrm->base.base.fd;
|
drmdpy->fd = gbmdrm->base.base.fd;
|
||||||
drmdpy->device_name = drm_get_device_name(drmdpy->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;
|
struct gbm_gallium_drm_device *gbm;
|
||||||
int fd;
|
int fd;
|
||||||
|
int own_gbm = 0;
|
||||||
|
|
||||||
gbm = dpy;
|
gbm = dpy;
|
||||||
|
|
||||||
if (gbm == NULL) {
|
if (gbm == NULL) {
|
||||||
fd = open("/dev/dri/card0", O_RDWR);
|
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));
|
gbm = gbm_gallium_drm_device(gbm_create_device(fd));
|
||||||
|
own_gbm = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gbm == NULL)
|
if (gbm == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (strcmp(gbm_device_get_backend_name(&gbm->base.base), "drm") != 0 ||
|
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 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 = {
|
static const struct native_platform drm_platform = {
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,8 @@
|
||||||
#include "common/native_wayland_drm_bufmgr_helper.h"
|
#include "common/native_wayland_drm_bufmgr_helper.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "gbm_gallium_drmint.h"
|
||||||
|
|
||||||
struct drm_config;
|
struct drm_config;
|
||||||
struct drm_crtc;
|
struct drm_crtc;
|
||||||
struct drm_connector;
|
struct drm_connector;
|
||||||
|
|
@ -52,6 +54,8 @@ struct drm_display {
|
||||||
|
|
||||||
const struct native_event_handler *event_handler;
|
const struct native_event_handler *event_handler;
|
||||||
|
|
||||||
|
struct gbm_gallium_drm_device *gbmdrm;
|
||||||
|
int own_gbm;
|
||||||
int fd;
|
int fd;
|
||||||
char *device_name;
|
char *device_name;
|
||||||
struct drm_config *config;
|
struct drm_config *config;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue