[libvirt] [PATCH v3 2/8] conf: Introduce a new graphics display type 'headless'

Ján Tomko jtomko at redhat.com
Fri Jul 13 12:40:24 UTC 2018


s/conf/qemu/ in the commit summary, since you chose to group the XML
parser and the QEMU driver changes in one commit.

On Wed, Jul 11, 2018 at 03:58:22PM +0200, Erik Skultety wrote:
>Since 2.10 QEMU supports a new display type egl-headless which uses the
>drm nodes for OpenGL rendering copying back the rendered bits back to
>QEMU into a dma-buf which can be accessed by standard "display" apps
>like VNC or SPICE. Although this display type can be used on its own,
>for any practical use case it makes sense to pair it with either VNC or
>SPICE display. The clear benefit of this display is that VNC gains
>OpenGL support, which it natively doesn't have, and SPICE gains remote
>OpenGL support (native OpenGL support only works locally through a UNIX
>socket, i.e. listen type=socket/none)
>
>Signed-off-by: Erik Skultety <eskultet at redhat.com>
>---
> docs/formatdomain.html.in                          | 33 +++++++++++++-
> docs/schemas/domaincommon.rng                      |  3 ++
> src/conf/domain_conf.c                             |  6 ++-
> src/conf/domain_conf.h                             |  1 +
> src/libxl/libxl_conf.c                             |  1 +
> src/qemu/qemu_command.c                            | 35 ++++++++++++++-
> src/qemu/qemu_domain.c                             | 52 +++++++++++++++++++++-
> src/qemu/qemu_driver.c                             |  2 +
> src/qemu/qemu_hotplug.c                            |  1 +
> src/qemu/qemu_process.c                            |  4 ++
> src/vmx/vmx.c                                      |  1 +
> tests/domaincapsschemadata/full.xml                |  1 +
> tests/qemuxml2argvdata/graphics-egl-headless.args  | 26 +++++++++++
> tests/qemuxml2argvdata/graphics-egl-headless.xml   | 31 +++++++++++++
> .../qemuxml2argvdata/graphics-sdl-egl-headless.xml | 35 +++++++++++++++
> .../graphics-spice-egl-headless.args               | 31 +++++++++++++
> .../graphics-spice-egl-headless.xml                | 36 +++++++++++++++
> .../graphics-spice-invalid-egl-headless.xml        | 37 +++++++++++++++
> .../graphics-vnc-egl-headless.args                 | 28 ++++++++++++
> .../qemuxml2argvdata/graphics-vnc-egl-headless.xml | 37 +++++++++++++++
> tests/qemuxml2argvtest.c                           | 17 +++++++
> .../graphics-spice-egl-headless.xml                | 44 ++++++++++++++++++
> .../graphics-vnc-egl-headless.xml                  | 42 +++++++++++++++++
> tests/qemuxml2xmltest.c                            |  2 +
> 24 files changed, 501 insertions(+), 5 deletions(-)
> create mode 100644 tests/qemuxml2argvdata/graphics-egl-headless.args
> create mode 100644 tests/qemuxml2argvdata/graphics-egl-headless.xml
> create mode 100644 tests/qemuxml2argvdata/graphics-sdl-egl-headless.xml
> create mode 100644 tests/qemuxml2argvdata/graphics-spice-egl-headless.args
> create mode 100644 tests/qemuxml2argvdata/graphics-spice-egl-headless.xml
> create mode 100644 tests/qemuxml2argvdata/graphics-spice-invalid-egl-headless.xml
> create mode 100644 tests/qemuxml2argvdata/graphics-vnc-egl-headless.args
> create mode 100644 tests/qemuxml2argvdata/graphics-vnc-egl-headless.xml
> create mode 100644 tests/qemuxml2xmloutdata/graphics-spice-egl-headless.xml
> create mode 100644 tests/qemuxml2xmloutdata/graphics-vnc-egl-headless.xml
>

>diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>index 44ae8dcef7..48e224cabc 100644
>--- a/src/qemu/qemu_command.c
>+++ b/src/qemu/qemu_command.c
>@@ -8213,6 +8213,27 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
>     return -1;
> }
>
>+
>+static int
>+qemuBuildGraphicsHeadlessCommandLine(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED,
>+                                     virCommandPtr cmd,
>+                                     virQEMUCapsPtr qemuCaps,
>+                                     virDomainGraphicsDefPtr def ATTRIBUTE_UNUSED)

These arguments are unused now as well as at the end of the series and
can be dropped.

>+{
>+    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_EGL_HEADLESS)) {
>+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>+                       _("egl-headless display is not supported with this "
>+                         "QEMU binary"));
>+        return -1;
>+    }
>+

This belongs in qemu.*Validate.

>+    virCommandAddArg(cmd, "-display");
>+    virCommandAddArg(cmd, "egl-headless");
>+
>+    return 0;
>+}
>+
>+
> static int
> qemuBuildGraphicsCommandLine(virQEMUDriverConfigPtr cfg,
>                              virCommandPtr cmd,
>diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>index ed76495309..5da8c8bfcc 100644
>--- a/src/qemu/qemu_domain.c
>+++ b/src/qemu/qemu_domain.c
>@@ -5528,6 +5528,53 @@ qemuDomainDeviceDefValidateTPM(virDomainTPMDef *tpm,
> }
>
>
>+static int
>+qemuDomainDeviceDefValidateGraphics(const virDomainGraphicsDef *graphics,
>+                                    const virDomainDef *def)
>+{
>+    bool have_egl_headless = false;
>+    size_t i;
>+
>+    /* are we running with egl-headless? */

The variable name is self-explanatory, no need to explain the for cycle
here.

>+    for (i = 0; i < def->ngraphics; i++) {
>+        graphics = def->graphics[i];
>+
>+        if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS) {
>+            have_egl_headless = true;
>+            break;
>+        }
>+    }
>+
>+    /* Only VNC and SPICE can be paired with egl-headless, the other types
>+     * either don't make sense to pair with egl-headless or aren't even
>+     * supported by QEMU.
>+     */
>+    if (have_egl_headless) {
>+        if (graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS &&
>+            graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
>+            graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
>+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>+                           _("graphics type 'egl-headless' is only supported "
>+                             "with one of: 'vnc', 'spice' graphics types"));
>+            return -1;
>+        }
>+
>+        /* '-spice gl=on' and '-display egl-headless' are mutually
>+         * exclusive
>+         */
>+        if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE &&
>+            graphics->data.spice.gl == VIR_TRISTATE_BOOL_YES) {
>+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>+                           _("multiple OpenGL displays are not supported "
>+                             "by QEMU"));
>+            return -1;
>+        }
>+    }
>+
>+    return 0;
>+}
>+
>+
> static int
> qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev,
>                             const virDomainDef *def,

Reviewed-by: Ján Tomko <jtomko at redhat.com>

Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180713/043d86c6/attachment-0001.sig>


More information about the libvir-list mailing list