render/gbm_allocator: duplicate drm fd during creation process

This commit is contained in:
Simon Zeni 2021-04-29 12:01:28 -04:00 committed by Simon Ser
parent d0c1f0c0b6
commit 2c90e0f521
3 changed files with 9 additions and 7 deletions

View file

@ -26,7 +26,7 @@ struct wlr_gbm_allocator {
/** /**
* Creates a new GBM allocator from a DRM FD. * Creates a new GBM allocator from a DRM FD.
* *
* Takes ownership over the FD. * Does not take ownership over the FD.
*/ */
struct wlr_allocator *wlr_gbm_allocator_create(int drm_fd); struct wlr_allocator *wlr_gbm_allocator_create(int drm_fd);

View file

@ -1,6 +1,5 @@
#define _POSIX_C_SOURCE 200809L #define _POSIX_C_SOURCE 200809L
#include <assert.h> #include <assert.h>
#include <fcntl.h>
#include <stdlib.h> #include <stdlib.h>
#include <wlr/util/log.h> #include <wlr/util/log.h>
#include <xf86drm.h> #include <xf86drm.h>
@ -29,10 +28,7 @@ struct wlr_allocator *allocator_autocreate_with_drm_fd(
if ((backend_caps & gbm_caps) && (renderer_caps & gbm_caps) if ((backend_caps & gbm_caps) && (renderer_caps & gbm_caps)
&& drm_fd != -1) { && drm_fd != -1) {
wlr_log(WLR_DEBUG, "Trying to create gbm allocator"); wlr_log(WLR_DEBUG, "Trying to create gbm allocator");
int fd = fcntl(drm_fd, F_DUPFD_CLOEXEC, 0); if ((alloc = wlr_gbm_allocator_create(drm_fd)) != NULL) {
if (fd < 0) {
wlr_log(WLR_ERROR, "fcntl(F_DUPFD_CLOEXEC) failed");
} else if ((alloc = wlr_gbm_allocator_create(fd)) != NULL) {
return alloc; return alloc;
} }
wlr_log(WLR_DEBUG, "Failed to create gbm allocator"); wlr_log(WLR_DEBUG, "Failed to create gbm allocator");

View file

@ -159,7 +159,13 @@ static struct wlr_gbm_allocator *get_gbm_alloc_from_alloc(
return (struct wlr_gbm_allocator *)alloc; return (struct wlr_gbm_allocator *)alloc;
} }
struct wlr_allocator *wlr_gbm_allocator_create(int fd) { struct wlr_allocator *wlr_gbm_allocator_create(int drm_fd) {
int fd = fcntl(drm_fd, F_DUPFD_CLOEXEC, 0);
if (fd < 0) {
wlr_log(WLR_ERROR, "fcntl(F_DUPFD_CLOEXEC) failed");
return NULL;
}
uint64_t cap; uint64_t cap;
if (drmGetCap(fd, DRM_CAP_PRIME, &cap) || if (drmGetCap(fd, DRM_CAP_PRIME, &cap) ||
!(cap & DRM_PRIME_CAP_EXPORT)) { !(cap & DRM_PRIME_CAP_EXPORT)) {