mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-26 06:35:58 +01:00
render/egl: add support for EGL_EXT_device_drm_render_node
This EGL extension has been added in [1]. The upsides are: - We directly get a render node, instead of having to convert the primary node name to a render node name. - If EGL_DRM_RENDER_NODE_FILE_EXT returns NULL, that means there is no render node being used by the driver. [1]: https://github.com/KhronosGroup/EGL-Registry/pull/127
This commit is contained in:
parent
ace2eda073
commit
3cf2535c23
2 changed files with 30 additions and 11 deletions
|
@ -43,6 +43,7 @@ struct wlr_egl {
|
||||||
|
|
||||||
// Device extensions
|
// Device extensions
|
||||||
bool EXT_device_drm;
|
bool EXT_device_drm;
|
||||||
|
bool EXT_device_drm_render_node;
|
||||||
} exts;
|
} exts;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
|
22
render/egl.c
22
render/egl.c
|
@ -289,6 +289,8 @@ struct wlr_egl *wlr_egl_create_with_drm_fd(int drm_fd) {
|
||||||
|
|
||||||
egl->exts.EXT_device_drm =
|
egl->exts.EXT_device_drm =
|
||||||
check_egl_ext(device_exts_str, "EGL_EXT_device_drm");
|
check_egl_ext(device_exts_str, "EGL_EXT_device_drm");
|
||||||
|
egl->exts.EXT_device_drm_render_node =
|
||||||
|
check_egl_ext(device_exts_str, "EGL_EXT_device_drm_render_node");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!check_egl_ext(display_exts_str, "EGL_KHR_no_config_context") &&
|
if (!check_egl_ext(display_exts_str, "EGL_KHR_no_config_context") &&
|
||||||
|
@ -712,10 +714,25 @@ static char *get_render_name(const char *name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int wlr_egl_dup_drm_fd(struct wlr_egl *egl) {
|
int wlr_egl_dup_drm_fd(struct wlr_egl *egl) {
|
||||||
if (egl->device == EGL_NO_DEVICE_EXT || !egl->exts.EXT_device_drm) {
|
if (egl->device == EGL_NO_DEVICE_EXT || (!egl->exts.EXT_device_drm &&
|
||||||
|
!egl->exts.EXT_device_drm_render_node)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *render_name = NULL;
|
||||||
|
#ifdef EGL_EXT_device_drm_render_node
|
||||||
|
if (egl->exts.device_drm_render_node_ext) {
|
||||||
|
const char *name = egl->procs.eglQueryDeviceStringEXT(egl->device,
|
||||||
|
EGL_DRM_RENDER_NODE_FILE_EXT);
|
||||||
|
if (name == NULL) {
|
||||||
|
wlr_log(WLR_DEBUG, "EGL device has no render node");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
render_name = strdup(name);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (render_name == NULL) {
|
||||||
const char *primary_name = egl->procs.eglQueryDeviceStringEXT(egl->device,
|
const char *primary_name = egl->procs.eglQueryDeviceStringEXT(egl->device,
|
||||||
EGL_DRM_DEVICE_FILE_EXT);
|
EGL_DRM_DEVICE_FILE_EXT);
|
||||||
if (primary_name == NULL) {
|
if (primary_name == NULL) {
|
||||||
|
@ -724,12 +741,13 @@ int wlr_egl_dup_drm_fd(struct wlr_egl *egl) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *render_name = get_render_name(primary_name);
|
render_name = get_render_name(primary_name);
|
||||||
if (render_name == NULL) {
|
if (render_name == NULL) {
|
||||||
wlr_log(WLR_ERROR, "Can't find render node name for device %s",
|
wlr_log(WLR_ERROR, "Can't find render node name for device %s",
|
||||||
primary_name);
|
primary_name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int render_fd = open(render_name, O_RDWR | O_NONBLOCK | O_CLOEXEC);
|
int render_fd = open(render_name, O_RDWR | O_NONBLOCK | O_CLOEXEC);
|
||||||
if (render_fd < 0) {
|
if (render_fd < 0) {
|
||||||
|
|
Loading…
Reference in a new issue