Support OpenGL accelerated rendering when using SDL graphics in the domain config. Add associated test and documentation. Signed-off-by: Maciej Wolny <maciej.wolny@xxxxxxxxxxxxxxx> --- docs/formatdomain.html.in | 6 +++ docs/schemas/domaincommon.rng | 8 ++++ src/conf/domain_conf.c | 44 ++++++++++++++++++++- src/conf/domain_conf.h | 1 + tests/qemuxml2argvdata/video-virtio-gpu-sdl-gl.xml | 38 ++++++++++++++++++ .../qemuxml2xmloutdata/video-virtio-gpu-sdl-gl.xml | 45 ++++++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 7 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 tests/qemuxml2argvdata/video-virtio-gpu-sdl-gl.xml create mode 100644 tests/qemuxml2xmloutdata/video-virtio-gpu-sdl-gl.xml diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index caeb14e2f..a7ef9269f 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -6162,6 +6162,12 @@ qemu-kvm -net nic,model=? /dev/null and an optional <code>fullscreen</code> attribute accepting values <code>yes</code> or <code>no</code>. </p> + + <p> + You can use a <code>gl</code> with the <code>enable="yes"</code> + property to enable OpenGL support in SDL. Likewise you can + explicitly disable OpenGL support with <code>enable="no"</code>. + </p> </dd> <dt><code>vnc</code></dt> <dd> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 0a6b29b2f..c4c500a3c 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3031,6 +3031,14 @@ <ref name="virYesNo"/> </attribute> </optional> + <optional> + <element name="gl"> + <attribute name="enable"> + <ref name="virYesNo"/> + </attribute> + <empty/> + </element> + </optional> </group> <group> <attribute name="type"> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f678e26b2..85bfa800b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13448,11 +13448,18 @@ virDomainGraphicsDefParseXMLVNC(virDomainGraphicsDefPtr def, static int virDomainGraphicsDefParseXMLSDL(virDomainGraphicsDefPtr def, - xmlNodePtr node) + xmlNodePtr node, + xmlXPathContextPtr ctxt) { + xmlNodePtr save = ctxt->node; + char *enable; + int enableVal; + xmlNodePtr glNode; char *fullscreen = virXMLPropString(node, "fullscreen"); int ret = -1; + ctxt->node = node; + if (fullscreen != NULL) { if (STREQ(fullscreen, "yes")) { def->data.sdl.fullscreen = true; @@ -13470,9 +13477,30 @@ virDomainGraphicsDefParseXMLSDL(virDomainGraphicsDefPtr def, def->data.sdl.xauth = virXMLPropString(node, "xauth"); def->data.sdl.display = virXMLPropString(node, "display"); + glNode = virXPathNode("./gl", ctxt); + if (glNode) { + enable = virXMLPropString(glNode, "enable"); + if (!enable) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("sdl gl element missing enable")); + goto cleanup; + } + + enableVal = virTristateBoolTypeFromString(enable); + if (enableVal < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown enable value '%s'"), enable); + VIR_FREE(enable); + goto cleanup; + } + VIR_FREE(enable); + def->data.sdl.gl = enableVal; + } + ret = 0; cleanup: VIR_FREE(fullscreen); + ctxt->node = save; return ret; } @@ -13901,7 +13929,7 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, goto error; break; case VIR_DOMAIN_GRAPHICS_TYPE_SDL: - if (virDomainGraphicsDefParseXMLSDL(def, node) < 0) + if (virDomainGraphicsDefParseXMLSDL(def, node, ctxt) < 0) goto error; break; case VIR_DOMAIN_GRAPHICS_TYPE_RDP: @@ -25654,6 +25682,18 @@ virDomainGraphicsDefFormat(virBufferPtr buf, if (def->data.sdl.fullscreen) virBufferAddLit(buf, " fullscreen='yes'"); + if (!children && def->data.sdl.gl != VIR_TRISTATE_BOOL_ABSENT) { + virBufferAddLit(buf, ">\n"); + virBufferAdjustIndent(buf, 2); + children = true; + } + + if (def->data.sdl.gl != VIR_TRISTATE_BOOL_ABSENT) { + virBufferAsprintf(buf, "<gl enable='%s'", + virTristateBoolTypeToString(def->data.sdl.gl)); + virBufferAddLit(buf, "/>\n"); + } + break; case VIR_DOMAIN_GRAPHICS_TYPE_RDP: diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 15d228ba9..517278989 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1599,6 +1599,7 @@ struct _virDomainGraphicsDef { char *display; char *xauth; bool fullscreen; + virTristateBool gl; } sdl; struct { int port; diff --git a/tests/qemuxml2argvdata/video-virtio-gpu-sdl-gl.xml b/tests/qemuxml2argvdata/video-virtio-gpu-sdl-gl.xml new file mode 100644 index 000000000..9dea73fbe --- /dev/null +++ b/tests/qemuxml2argvdata/video-virtio-gpu-sdl-gl.xml @@ -0,0 +1,38 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i686</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2' cache='none'/> + <source file='/var/lib/libvirt/images/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='sdl'> + <gl enable='yes'/> + </graphics> + <video> + <model type='virtio' heads='1'> + <acceleration accel3d='yes'/> + </model> + </video> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/video-virtio-gpu-sdl-gl.xml b/tests/qemuxml2xmloutdata/video-virtio-gpu-sdl-gl.xml new file mode 100644 index 000000000..da03dd5da --- /dev/null +++ b/tests/qemuxml2xmloutdata/video-virtio-gpu-sdl-gl.xml @@ -0,0 +1,45 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i686</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2' cache='none'/> + <source file='/var/lib/libvirt/images/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='sdl'> + <gl enable='yes'/> + </graphics> + <video> + <model type='virtio' heads='1' primary='yes'> + <acceleration accel3d='yes'/> + </model> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </video> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 53a26a0c3..9c4f8054e 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1096,6 +1096,7 @@ mymain(void) DO_TEST("video-virtio-gpu-device", NONE); DO_TEST("video-virtio-gpu-virgl", NONE); DO_TEST("video-virtio-gpu-spice-gl", NONE); + DO_TEST("video-virtio-gpu-sdl-gl", NONE); DO_TEST("virtio-input", NONE); DO_TEST("virtio-input-passthrough", NONE); -- 2.11.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list