mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-22 21:05:58 +01:00
render/gbm_allocator: duplicate drm fd during creation process
This commit is contained in:
parent
d0c1f0c0b6
commit
2c90e0f521
3 changed files with 9 additions and 7 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
Loading…
Reference in a new issue