spice: allow to specify drm rendernode
When multiple GPU are available, picking the first one isn't always the best choice. Learn to specify a device rendernode. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-id: 20170212112118.16044-1-marcandre.lureau@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
ad584d37f2
commit
7b5255083b
@ -14,8 +14,7 @@ extern int qemu_egl_rn_fd;
|
|||||||
extern struct gbm_device *qemu_egl_rn_gbm_dev;
|
extern struct gbm_device *qemu_egl_rn_gbm_dev;
|
||||||
extern EGLContext qemu_egl_rn_ctx;
|
extern EGLContext qemu_egl_rn_ctx;
|
||||||
|
|
||||||
int qemu_egl_rendernode_open(void);
|
int egl_rendernode_init(const char *rendernode);
|
||||||
int egl_rendernode_init(void);
|
|
||||||
int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc);
|
int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1066,7 +1066,7 @@ DEF("spice", HAS_ARG, QEMU_OPTION_spice,
|
|||||||
" [,streaming-video=[off|all|filter]][,disable-copy-paste]\n"
|
" [,streaming-video=[off|all|filter]][,disable-copy-paste]\n"
|
||||||
" [,disable-agent-file-xfer][,agent-mouse=[on|off]]\n"
|
" [,disable-agent-file-xfer][,agent-mouse=[on|off]]\n"
|
||||||
" [,playback-compression=[on|off]][,seamless-migration=[on|off]]\n"
|
" [,playback-compression=[on|off]][,seamless-migration=[on|off]]\n"
|
||||||
" [,gl=[on|off]]\n"
|
" [,gl=[on|off]][,rendernode=<file>]\n"
|
||||||
" enable spice\n"
|
" enable spice\n"
|
||||||
" at least one of {port, tls-port} is mandatory\n",
|
" at least one of {port, tls-port} is mandatory\n",
|
||||||
QEMU_ARCH_ALL)
|
QEMU_ARCH_ALL)
|
||||||
@ -1161,6 +1161,10 @@ Enable/disable spice seamless migration. Default is off.
|
|||||||
@item gl=[on|off]
|
@item gl=[on|off]
|
||||||
Enable/disable OpenGL context. Default is off.
|
Enable/disable OpenGL context. Default is off.
|
||||||
|
|
||||||
|
@item rendernode=<file>
|
||||||
|
DRM render node for OpenGL rendering. If not specified, it will pick
|
||||||
|
the first available. (Since 2.9)
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
|
@ -44,13 +44,17 @@ int qemu_egl_rn_fd;
|
|||||||
struct gbm_device *qemu_egl_rn_gbm_dev;
|
struct gbm_device *qemu_egl_rn_gbm_dev;
|
||||||
EGLContext qemu_egl_rn_ctx;
|
EGLContext qemu_egl_rn_ctx;
|
||||||
|
|
||||||
int qemu_egl_rendernode_open(void)
|
static int qemu_egl_rendernode_open(const char *rendernode)
|
||||||
{
|
{
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
struct dirent *e;
|
struct dirent *e;
|
||||||
int r, fd;
|
int r, fd;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
|
if (rendernode) {
|
||||||
|
return open(rendernode, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK);
|
||||||
|
}
|
||||||
|
|
||||||
dir = opendir("/dev/dri");
|
dir = opendir("/dev/dri");
|
||||||
if (!dir) {
|
if (!dir) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -85,11 +89,11 @@ int qemu_egl_rendernode_open(void)
|
|||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int egl_rendernode_init(void)
|
int egl_rendernode_init(const char *rendernode)
|
||||||
{
|
{
|
||||||
qemu_egl_rn_fd = -1;
|
qemu_egl_rn_fd = -1;
|
||||||
|
|
||||||
qemu_egl_rn_fd = qemu_egl_rendernode_open();
|
qemu_egl_rn_fd = qemu_egl_rendernode_open(rendernode);
|
||||||
if (qemu_egl_rn_fd == -1) {
|
if (qemu_egl_rn_fd == -1) {
|
||||||
error_report("egl: no drm render node available");
|
error_report("egl: no drm render node available");
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -501,6 +501,9 @@ static QemuOptsList qemu_spice_opts = {
|
|||||||
},{
|
},{
|
||||||
.name = "gl",
|
.name = "gl",
|
||||||
.type = QEMU_OPT_BOOL,
|
.type = QEMU_OPT_BOOL,
|
||||||
|
},{
|
||||||
|
.name = "rendernode",
|
||||||
|
.type = QEMU_OPT_STRING,
|
||||||
#endif
|
#endif
|
||||||
},
|
},
|
||||||
{ /* end of list */ }
|
{ /* end of list */ }
|
||||||
@ -833,7 +836,7 @@ void qemu_spice_init(void)
|
|||||||
"incompatible with -spice port/tls-port");
|
"incompatible with -spice port/tls-port");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (egl_rendernode_init() != 0) {
|
if (egl_rendernode_init(qemu_opt_get(opts, "rendernode")) != 0) {
|
||||||
error_report("Failed to initialize EGL render node for SPICE GL");
|
error_report("Failed to initialize EGL render node for SPICE GL");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user