diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2018-07-13 15:09:06 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2018-08-27 10:51:44 +0200 |
commit | b1d380372f31672da9318431e84e79bccd8ef3bf (patch) | |
tree | fa250a5b7e2dd57c9a5c8a18e650d5e8344de8cd /util/drm.c | |
parent | 242d01336d6e706a26f5370464902a3f8ceba222 (diff) | |
download | qemu-b1d380372f31672da9318431e84e79bccd8ef3bf.zip qemu-b1d380372f31672da9318431e84e79bccd8ef3bf.tar.gz qemu-b1d380372f31672da9318431e84e79bccd8ef3bf.tar.bz2 |
util: promote qemu_egl_rendernode_open() to libqemuutil
vhost-user-gpu will share the same code to open a DRM node.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20180713130916.4153-20-marcandre.lureau@redhat.com>
[ kraxel: buildfix: util/drm.o must be CONFIG_OPENGL not CONFIG_LINUX ]
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'util/drm.c')
-rw-r--r-- | util/drm.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/util/drm.c b/util/drm.c new file mode 100644 index 0000000..a23ff24 --- /dev/null +++ b/util/drm.c @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2015-2016 Gerd Hoffmann <kraxel@redhat.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ +#include "qemu/osdep.h" +#include "qemu/drm.h" + +#include <glob.h> +#include <dirent.h> + +int qemu_drm_rendernode_open(const char *rendernode) +{ + DIR *dir; + struct dirent *e; + int r, fd; + char *p; + + if (rendernode) { + return open(rendernode, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK); + } + + dir = opendir("/dev/dri"); + if (!dir) { + return -1; + } + + fd = -1; + while ((e = readdir(dir))) { + if (e->d_type != DT_CHR) { + continue; + } + + if (strncmp(e->d_name, "renderD", 7)) { + continue; + } + + p = g_strdup_printf("/dev/dri/%s", e->d_name); + + r = open(p, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK); + if (r < 0) { + g_free(p); + continue; + } + fd = r; + g_free(p); + break; + } + + closedir(dir); + if (fd < 0) { + return -1; + } + return fd; +} |