static struct native_display * 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) { if (own_gbm) gbm_device_destroy(&gbm->base.base); return NULL; } return drm_create_display(gbm, own_gbm, drm_event_handler); }
static struct native_display * 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) { const char *device_name="/dev/dri/card0"; #ifdef O_CLOEXEC fd = open(device_name, O_RDWR | O_CLOEXEC); if (fd == -1 && errno == EINVAL) #endif { fd = open(device_name, O_RDWR); if (fd != -1) fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); } /* 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) { if (own_gbm) gbm_device_destroy(&gbm->base.base); return NULL; } return drm_create_display(gbm, own_gbm, drm_event_handler); }