[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1] tools: make "opengl" generic
Hello, Le 28/07/2025 à 06:45, Penny Zheng a écrit : > Display option, like vnc, sdl, etc, will be checked against in latest QEMU > whether it is compatile with opengl context. And vnc is incompatible with GL > context. > Now, when running hvm domain with gl context on, such as > "device_model_args_hvm = ["-display", "sdl,gl=on"]", we will fail with > the error of "qemu-system-i386: -vnc 127.0.0.1:0,to=99: Display vnc is > incompatible with the GL context", as vnc is set enabled on default > for HVM domain. > > We shall move "opengl" option out of specifc sdl display, to make it > generic. Then when users explicitly set "opengl = 1", default values for > vnc shall be changed to disabled and libxl__dm_vnc() needs to return NULL > indicating vnc being disabled. > > If users select both vnc and opengl in xl configuration, creation > will fail and error out incompatible info. > To keep consistency, we also make "opengl" generic for vfb[] options > > Signed-off-by: Penny Zheng <Penny.Zheng@xxxxxxx> There is a way to make vnc work with opengl by using the egl-headless display (-display egl-headless,gl=on), which can coexist along vnc. So that we could avoid having "opengl" as a sdl-specific option. > --- > tools/libs/light/libxl_console.c | 4 ++-- > tools/libs/light/libxl_create.c | 10 ++++++---- > tools/libs/light/libxl_dm.c | 7 ++++++- > tools/libs/light/libxl_types.idl | 3 ++- > tools/xl/xl_parse.c | 17 +++++++++-------- > tools/xl/xl_sxp.c | 6 +++--- > 6 files changed, 28 insertions(+), 19 deletions(-) > > diff --git a/tools/libs/light/libxl_console.c > b/tools/libs/light/libxl_console.c > index 044ca64676..fc3dfddc4d 100644 > --- a/tools/libs/light/libxl_console.c > +++ b/tools/libs/light/libxl_console.c > @@ -694,7 +694,7 @@ static int libxl__device_vfb_setdefault(libxl__gc *gc, > uint32_t domid, > } > > libxl_defbool_setdefault(&vfb->sdl.enable, false); > - libxl_defbool_setdefault(&vfb->sdl.opengl, false); > + libxl_defbool_setdefault(&vfb->opengl, false); > > rc = libxl__resolve_domid(gc, vfb->backend_domname, > &vfb->backend_domid); > return rc; > @@ -733,7 +733,7 @@ static int libxl__set_xenstore_vfb(libxl__gc *gc, > uint32_t domid, > flexarray_append_pair(back, "sdl", > libxl_defbool_val(vfb->sdl.enable) ? "1" : "0"); > flexarray_append_pair(back, "opengl", > - libxl_defbool_val(vfb->sdl.opengl) ? "1" : "0"); > + libxl_defbool_val(vfb->opengl) ? "1" : "0"); > if (vfb->sdl.xauthority) { > flexarray_append_pair(back, "xauthority", vfb->sdl.xauthority); > } > diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c > index 4301f17f90..7bbd1ff9b4 100644 > --- a/tools/libs/light/libxl_create.c > +++ b/tools/libs/light/libxl_create.c > @@ -339,7 +339,12 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, > if (!b_info->u.hvm.boot) > b_info->u.hvm.boot = libxl__strdup(NOGC, "cda"); > > - libxl_defbool_setdefault(&b_info->u.hvm.vnc.enable, true); > + libxl_defbool_setdefault(&b_info->u.hvm.opengl, false); > + > + if (libxl_defbool_val(b_info->u.hvm.opengl)) > + libxl_defbool_setdefault(&b_info->u.hvm.vnc.enable, false); > + else > + libxl_defbool_setdefault(&b_info->u.hvm.vnc.enable, true); > if (libxl_defbool_val(b_info->u.hvm.vnc.enable)) { > libxl_defbool_setdefault(&b_info->u.hvm.vnc.findunused, true); > if (!b_info->u.hvm.vnc.listen) > @@ -347,9 +352,6 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, > } > > libxl_defbool_setdefault(&b_info->u.hvm.sdl.enable, false); > - if (libxl_defbool_val(b_info->u.hvm.sdl.enable)) { > - libxl_defbool_setdefault(&b_info->u.hvm.sdl.opengl, false); > - } > > if (libxl_defbool_val(b_info->u.hvm.spice.enable)) { > libxl_defbool_setdefault(&b_info->u.hvm.spice.disable_ticketing, > diff --git a/tools/libs/light/libxl_dm.c b/tools/libs/light/libxl_dm.c > index 511ec76a65..7adf473c81 100644 > --- a/tools/libs/light/libxl_dm.c > +++ b/tools/libs/light/libxl_dm.c > @@ -672,6 +672,10 @@ int libxl__domain_device_construct_rdm(libxl__gc *gc, > const libxl_vnc_info *libxl__dm_vnc(const libxl_domain_config *guest_config) > { > const libxl_vnc_info *vnc = NULL; > + > + if (libxl_defbool_val(guest_config->b_info.u.hvm.opengl)) > + return NULL; > + > if (guest_config->b_info.type == LIBXL_DOMAIN_TYPE_HVM) { > vnc = &guest_config->b_info.u.hvm.vnc; > } else if (guest_config->num_vfbs > 0) { > @@ -955,6 +959,7 @@ static int libxl__build_device_model_args_new(libxl__gc > *gc, > const char *path, *chardev; > bool is_stubdom = libxl_defbool_val(b_info->device_model_stubdomain); > int rc; > + bool has_opengl = libxl_defbool_val(b_info->u.hvm.opengl); > > dm_args = flexarray_make(gc, 16, 1); > dm_envs = flexarray_make(gc, 16, 1); > @@ -1084,7 +1089,7 @@ static int libxl__build_device_model_args_new(libxl__gc > *gc, > } > > flexarray_append(dm_args, vncarg); > - } else if (!is_stubdom) { > + } else if (!is_stubdom && !has_opengl) { > /* > * Ensure that by default no vnc server is created. > */ > diff --git a/tools/libs/light/libxl_types.idl > b/tools/libs/light/libxl_types.idl > index fe251649f3..ab768381ce 100644 > --- a/tools/libs/light/libxl_types.idl > +++ b/tools/libs/light/libxl_types.idl > @@ -349,7 +349,6 @@ libxl_spice_info = Struct("spice_info", [ > > libxl_sdl_info = Struct("sdl_info", [ > ("enable", libxl_defbool), > - ("opengl", libxl_defbool), > ("display", string), > ("xauthority", string), > ]) > @@ -670,6 +669,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ > ("acpi_firmware", string), > ("hdtype", libxl_hdtype), > ("nographic", libxl_defbool), > + ("opengl", libxl_defbool), > ("vga", > libxl_vga_interface_info), > ("vnc", libxl_vnc_info), > # keyboard layout, default is en-us > keyboard > @@ -748,6 +748,7 @@ libxl_device_vfb = Struct("device_vfb", [ > ("backend_domid", libxl_domid), > ("backend_domname",string), > ("devid", libxl_devid), > + ("opengl", libxl_defbool), > ("vnc", libxl_vnc_info), > ("sdl", libxl_sdl_info), > # set keyboard layout, default is en-us keyboard > diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c > index 28cdbf07c2..9e9adcec77 100644 > --- a/tools/xl/xl_parse.c > +++ b/tools/xl/xl_parse.c > @@ -272,7 +272,6 @@ static void parse_top_level_sdl_options(XLU_Config > *config, > libxl_sdl_info *sdl) > { > xlu_cfg_get_defbool(config, "sdl", &sdl->enable, 0); > - xlu_cfg_get_defbool(config, "opengl", &sdl->opengl, 0); > xlu_cfg_replace_string (config, "display", &sdl->display, 0); > xlu_cfg_replace_string (config, "xauthority", &sdl->xauthority, 0); > } > @@ -1291,7 +1290,7 @@ void parse_config_data(const char *config_source, > { > libxl_physinfo physinfo; > const char *buf; > - long l, vcpus = 0; > + long l, vcpus = 0, vnc_enabled = 0; > XLU_Config *config; > XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids, *vtpms, > *usbctrls, *usbdevs, *p9devs, *vdispls, *pvcallsifs_devs; > @@ -2572,7 +2571,7 @@ skip_nic: > } else if (!strcmp(p, "sdl")) { > libxl_defbool_set(&vfb->sdl.enable, atoi(p2 + 1)); > } else if (!strcmp(p, "opengl")) { > - libxl_defbool_set(&vfb->sdl.opengl, atoi(p2 + 1)); > + libxl_defbool_set(&vfb->opengl, atoi(p2 + 1)); > } else if (!strcmp(p, "display")) { > free(vfb->sdl.display); > vfb->sdl.display = strdup(p2 + 1); > @@ -2791,14 +2790,16 @@ skip_usbdev: > > #undef parse_extra_args > > + if (!xlu_cfg_get_long (config, "vnc", &l, 0)) > + vnc_enabled = l; > + xlu_cfg_get_defbool(config, "opengl", &b_info->u.hvm.opengl, 0); > + if (vnc_enabled && libxl_defbool_val(b_info->u.hvm.opengl)) { > + fprintf(stderr, "vnc is incompatible with opengl\n"); > + exit(1); > + } > /* If we've already got vfb=[] for PV guest then ignore top level > * VNC config. */ > if (c_info->type == LIBXL_DOMAIN_TYPE_PV && !d_config->num_vfbs) { > - long vnc_enabled = 0; > - > - if (!xlu_cfg_get_long (config, "vnc", &l, 0)) > - vnc_enabled = l; > - > if (vnc_enabled) { > libxl_device_vfb *vfb; > libxl_device_vkb *vkb; > diff --git a/tools/xl/xl_sxp.c b/tools/xl/xl_sxp.c > index 4383ad177a..62a1d012c6 100644 > --- a/tools/xl/xl_sxp.c > +++ b/tools/xl/xl_sxp.c > @@ -120,7 +120,7 @@ void printf_info_sexp(int domid, libxl_domain_config > *d_config, FILE *fh) > fprintf(fh, "\t\t\t(sdl %s)\n", > libxl_defbool_to_string(b_info->u.hvm.sdl.enable)); > fprintf(fh, "\t\t\t(opengl %s)\n", > - libxl_defbool_to_string(b_info->u.hvm.sdl.opengl)); > + libxl_defbool_to_string(b_info->u.hvm.opengl)); > fprintf(fh, "\t\t\t(nographic %s)\n", > libxl_defbool_to_string(b_info->u.hvm.nographic)); > fprintf(fh, "\t\t\t(spice %s)\n", > @@ -219,10 +219,10 @@ void printf_info_sexp(int domid, libxl_domain_config > *d_config, FILE *fh) > fprintf(fh, "\t\t\t(vncunused %s)\n", > libxl_defbool_to_string(d_config->vfbs[i].vnc.findunused)); > fprintf(fh, "\t\t\t(keymap %s)\n", d_config->vfbs[i].keymap); > + fprintf(fh, "\t\t\t(opengl %s)\n", > + libxl_defbool_to_string(d_config->vfbs[i].opengl)); > fprintf(fh, "\t\t\t(sdl %s)\n", > libxl_defbool_to_string(d_config->vfbs[i].sdl.enable)); > - fprintf(fh, "\t\t\t(opengl %s)\n", > - libxl_defbool_to_string(d_config->vfbs[i].sdl.opengl)); > fprintf(fh, "\t\t\t(display %s)\n", d_config->vfbs[i].sdl.display); > fprintf(fh, "\t\t\t(xauthority %s)\n", > d_config->vfbs[i].sdl.xauthority); > fprintf(fh, "\t\t)\n"); Teddy Astie | Vates XCP-ng Developer XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |