51d9a2
From 11219f42da3b15bd76b9215fda9d23d5435a1d3b Mon Sep 17 00:00:00 2001
51d9a2
Message-Id: <11219f42da3b15bd76b9215fda9d23d5435a1d3b@dist-git>
51d9a2
From: Erik Skultety <eskultet@redhat.com>
51d9a2
Date: Thu, 19 Jul 2018 15:03:58 +0200
51d9a2
Subject: [PATCH] qemu: Introduce a new graphics display type 'headless'
51d9a2
MIME-Version: 1.0
51d9a2
Content-Type: text/plain; charset=UTF-8
51d9a2
Content-Transfer-Encoding: 8bit
51d9a2
51d9a2
Since 2.10 QEMU supports a new display type egl-headless which uses the
51d9a2
drm nodes for OpenGL rendering copying back the rendered bits back to
51d9a2
QEMU into a dma-buf which can be accessed by standard "display" apps
51d9a2
like VNC or SPICE. Although this display type can be used on its own,
51d9a2
for any practical use case it makes sense to pair it with either VNC or
51d9a2
SPICE display. The clear benefit of this display is that VNC gains
51d9a2
OpenGL support, which it natively doesn't have, and SPICE gains remote
51d9a2
OpenGL support (native OpenGL support only works locally through a UNIX
51d9a2
socket, i.e. listen type=socket/none).
51d9a2
51d9a2
Reviewed-by: Ján Tomko <jtomko@redhat.com>
51d9a2
Signed-off-by: Erik Skultety <eskultet@redhat.com>
51d9a2
(cherry picked from commit d8266ebe1615c4b043db6b8d486465722cdd0ef8)
51d9a2
51d9a2
https://bugzilla.redhat.com/show_bug.cgi?id=1475770
51d9a2
Signed-off-by: Erik Skultety <eskultet@redhat.com>
51d9a2
Reviewed-by: Ján Tomko <jtomko@redhat.com>
51d9a2
---
51d9a2
 docs/formatdomain.html.in                     | 33 +++++++++-
51d9a2
 docs/schemas/domaincommon.rng                 |  3 +
51d9a2
 src/conf/domain_conf.c                        |  6 +-
51d9a2
 src/conf/domain_conf.h                        |  1 +
51d9a2
 src/libxl/libxl_conf.c                        |  1 +
51d9a2
 src/qemu/qemu_command.c                       | 14 ++++-
51d9a2
 src/qemu/qemu_domain.c                        | 60 ++++++++++++++++++-
51d9a2
 src/qemu/qemu_driver.c                        |  2 +
51d9a2
 src/qemu/qemu_hotplug.c                       |  1 +
51d9a2
 src/qemu/qemu_process.c                       |  4 ++
51d9a2
 src/vmx/vmx.c                                 |  1 +
51d9a2
 tests/domaincapsschemadata/full.xml           |  1 +
51d9a2
 .../graphics-egl-headless.args                | 26 ++++++++
51d9a2
 .../graphics-egl-headless.xml                 | 31 ++++++++++
51d9a2
 .../graphics-sdl-egl-headless.xml             | 35 +++++++++++
51d9a2
 .../graphics-spice-egl-headless.args          | 31 ++++++++++
51d9a2
 .../graphics-spice-egl-headless.xml           | 36 +++++++++++
51d9a2
 .../graphics-spice-invalid-egl-headless.xml   | 37 ++++++++++++
51d9a2
 .../graphics-vnc-egl-headless.args            | 28 +++++++++
51d9a2
 .../graphics-vnc-egl-headless.xml             | 37 ++++++++++++
51d9a2
 tests/qemuxml2argvtest.c                      | 17 ++++++
51d9a2
 .../graphics-spice-egl-headless.xml           | 44 ++++++++++++++
51d9a2
 .../graphics-vnc-egl-headless.xml             | 42 +++++++++++++
51d9a2
 tests/qemuxml2xmltest.c                       |  2 +
51d9a2
 24 files changed, 488 insertions(+), 5 deletions(-)
51d9a2
 create mode 100644 tests/qemuxml2argvdata/graphics-egl-headless.args
51d9a2
 create mode 100644 tests/qemuxml2argvdata/graphics-egl-headless.xml
51d9a2
 create mode 100644 tests/qemuxml2argvdata/graphics-sdl-egl-headless.xml
51d9a2
 create mode 100644 tests/qemuxml2argvdata/graphics-spice-egl-headless.args
51d9a2
 create mode 100644 tests/qemuxml2argvdata/graphics-spice-egl-headless.xml
51d9a2
 create mode 100644 tests/qemuxml2argvdata/graphics-spice-invalid-egl-headless.xml
51d9a2
 create mode 100644 tests/qemuxml2argvdata/graphics-vnc-egl-headless.args
51d9a2
 create mode 100644 tests/qemuxml2argvdata/graphics-vnc-egl-headless.xml
51d9a2
 create mode 100644 tests/qemuxml2xmloutdata/graphics-spice-egl-headless.xml
51d9a2
 create mode 100644 tests/qemuxml2xmloutdata/graphics-vnc-egl-headless.xml
51d9a2
51d9a2
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
51d9a2
index a3afe137bf..9dd22554ad 100644
51d9a2
--- a/docs/formatdomain.html.in
51d9a2
+++ b/docs/formatdomain.html.in
51d9a2
@@ -6299,7 +6299,8 @@ qemu-kvm -net nic,model=? /dev/null
51d9a2
         

51d9a2
           The graphics element has a mandatory type
51d9a2
           attribute which takes the value sdl, vnc,
51d9a2
-          spice, rdp or desktop:
51d9a2
+          spice, rdp, desktop or
51d9a2
+          egl-headless:
51d9a2
         

51d9a2
         
51d9a2
           
sdl
51d9a2
@@ -6358,6 +6359,11 @@ qemu-kvm -net nic,model=? /dev/null
51d9a2
               auto-allocation and autoport having no effect due to
51d9a2
               security reasons) Since 1.0.6.
51d9a2
             

51d9a2
+            

51d9a2
+              Although VNC doesn't support OpenGL natively, it can be paired
51d9a2
+              with graphics type egl-headless (see below) which
51d9a2
+              will instruct QEMU to open and use drm nodes for OpenGL rendering.
51d9a2
+            

51d9a2
           
51d9a2
           
spice Since 0.8.6
51d9a2
           
51d9a2
@@ -6463,6 +6469,12 @@ qemu-kvm -net nic,model=? /dev/null
51d9a2
               You can enable or disable OpenGL support explicitly with
51d9a2
               the gl element, by setting the enable
51d9a2
               property. (QEMU only, since 1.3.3).
51d9a2
+              Note that this only works locally, since this requires usage of
51d9a2
+              UNIX sockets, i.e. using listen types 'socket' or
51d9a2
+              'none'. For accelerated OpenGL with remote support, consider
51d9a2
+              pairing this element with type egl-headless
51d9a2
+              (see below). However, this will deliver weaker performance
51d9a2
+              compared to native Spice OpenGL support.
51d9a2
             

51d9a2
             

51d9a2
               By default, QEMU will pick the first available GPU DRM render node.
51d9a2
@@ -6498,6 +6510,25 @@ qemu-kvm -net nic,model=? /dev/null
51d9a2
               fullscreen.
51d9a2
             

51d9a2
           
51d9a2
+          
egl-headlessSince 4.6.0
51d9a2
+          
51d9a2
+            

51d9a2
+              This display type provides support for an OpenGL accelerated
51d9a2
+              display accessible both locally and remotely (for comparison,
51d9a2
+              Spice's native OpenGL support only works locally using UNIX
51d9a2
+              sockets at the moment, but has better performance). Since this
51d9a2
+              display type doesn't provide any window or graphical console like
51d9a2
+              the other types, for practical reasons it should be paired with
51d9a2
+              either vnc or spice graphics types.
51d9a2
+              This display type is only supported by QEMU domains
51d9a2
+              (needs QEMU 2.10 or newer) and doesn't
51d9a2
+              accept any attributes.
51d9a2
+            

51d9a2
+            
51d9a2
+<graphics type='spice' autoport='yes'/>
51d9a2
+<graphics type='egl-headless'/>
51d9a2
+            
51d9a2
+          
51d9a2
         
51d9a2
       
51d9a2
     
51d9a2
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
51d9a2
index f24a56392a..157726752c 100644
51d9a2
--- a/docs/schemas/domaincommon.rng
51d9a2
+++ b/docs/schemas/domaincommon.rng
51d9a2
@@ -3366,6 +3366,9 @@
51d9a2
             </attribute>
51d9a2
           </optional>
51d9a2
         </group>
51d9a2
+        <attribute name="type">
51d9a2
+          <value>egl-headless</value>
51d9a2
+        </attribute>
51d9a2
       </choice>
51d9a2
     </element>
51d9a2
   </define>
51d9a2
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
51d9a2
index db8e17dac4..fa4dfafcff 100644
51d9a2
--- a/src/conf/domain_conf.c
51d9a2
+++ b/src/conf/domain_conf.c
51d9a2
@@ -615,7 +615,8 @@ VIR_ENUM_IMPL(virDomainGraphics, VIR_DOMAIN_GRAPHICS_TYPE_LAST,
51d9a2
               "vnc",
51d9a2
               "rdp",
51d9a2
               "desktop",
51d9a2
-              "spice")
51d9a2
+              "spice",
51d9a2
+              "egl-headless")
51d9a2
 
51d9a2
 VIR_ENUM_IMPL(virDomainGraphicsListen, VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST,
51d9a2
               "none",
51d9a2
@@ -1426,6 +1427,7 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
51d9a2
         virDomainGraphicsAuthDefClear(&def->data.spice.auth);
51d9a2
         break;
51d9a2
 
51d9a2
+    case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
51d9a2
         break;
51d9a2
     }
51d9a2
@@ -14172,6 +14174,7 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
51d9a2
         if (virDomainGraphicsDefParseXMLSpice(def, node, ctxt, flags) < 0)
51d9a2
             goto error;
51d9a2
         break;
51d9a2
+    case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
51d9a2
         break;
51d9a2
     }
51d9a2
@@ -26404,6 +26407,7 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
51d9a2
         virDomainGraphicsAuthDefFormatAttr(buf, &def->data.spice.auth, flags);
51d9a2
         break;
51d9a2
 
51d9a2
+    case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
51d9a2
         break;
51d9a2
     }
51d9a2
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
51d9a2
index 0f10e242fd..26f75b15d0 100644
51d9a2
--- a/src/conf/domain_conf.h
51d9a2
+++ b/src/conf/domain_conf.h
51d9a2
@@ -1473,6 +1473,7 @@ typedef enum {
51d9a2
     VIR_DOMAIN_GRAPHICS_TYPE_RDP,
51d9a2
     VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP,
51d9a2
     VIR_DOMAIN_GRAPHICS_TYPE_SPICE,
51d9a2
+    VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS,
51d9a2
 
51d9a2
     VIR_DOMAIN_GRAPHICS_TYPE_LAST
51d9a2
 } virDomainGraphicsType;
51d9a2
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
51d9a2
index 452a77f3b8..cda4eb9d31 100644
51d9a2
--- a/src/libxl/libxl_conf.c
51d9a2
+++ b/src/libxl/libxl_conf.c
51d9a2
@@ -1441,6 +1441,7 @@ libxlMakeVfb(virPortAllocatorRangePtr graphicsports,
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
51d9a2
+        case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
51d9a2
             break;
51d9a2
     }
51d9a2
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
51d9a2
index fed4f8faf9..8915040c6a 100644
51d9a2
--- a/src/qemu/qemu_command.c
51d9a2
+++ b/src/qemu/qemu_command.c
51d9a2
@@ -8212,6 +8212,7 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
51d9a2
     return -1;
51d9a2
 }
51d9a2
 
51d9a2
+
51d9a2
 static int
51d9a2
 qemuBuildGraphicsCommandLine(virQEMUDriverConfigPtr cfg,
51d9a2
                              virCommandPtr cmd,
51d9a2
@@ -8241,6 +8242,11 @@ qemuBuildGraphicsCommandLine(virQEMUDriverConfigPtr cfg,
51d9a2
                                                   qemuCaps, graphics) < 0)
51d9a2
                 return -1;
51d9a2
 
51d9a2
+            break;
51d9a2
+        case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
+            virCommandAddArg(cmd, "-display");
51d9a2
+            virCommandAddArg(cmd, "egl-headless");
51d9a2
+
51d9a2
             break;
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
51d9a2
@@ -10068,6 +10074,7 @@ qemuBuildCommandLineValidate(virQEMUDriverPtr driver,
51d9a2
     int sdl = 0;
51d9a2
     int vnc = 0;
51d9a2
     int spice = 0;
51d9a2
+    int egl_headless = 0;
51d9a2
 
51d9a2
     if (!virQEMUDriverIsPrivileged(driver)) {
51d9a2
         /* If we have no cgroups then we can have no tunings that
51d9a2
@@ -10109,6 +10116,9 @@ qemuBuildCommandLineValidate(virQEMUDriverPtr driver,
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
51d9a2
             ++spice;
51d9a2
             break;
51d9a2
+        case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
+            ++egl_headless;
51d9a2
+            break;
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
51d9a2
@@ -10116,10 +10126,10 @@ qemuBuildCommandLineValidate(virQEMUDriverPtr driver,
51d9a2
         }
51d9a2
     }
51d9a2
 
51d9a2
-    if (sdl > 1 || vnc > 1 || spice > 1) {
51d9a2
+    if (sdl > 1 || vnc > 1 || spice > 1 || egl_headless > 1) {
51d9a2
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
51d9a2
                        _("only 1 graphics device of each type "
51d9a2
-                         "(sdl, vnc, spice) is supported"));
51d9a2
+                         "(sdl, vnc, spice, headless) is supported"));
51d9a2
         return -1;
51d9a2
     }
51d9a2
 
51d9a2
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
51d9a2
index a42a6df91b..9498594857 100644
51d9a2
--- a/src/qemu/qemu_domain.c
51d9a2
+++ b/src/qemu/qemu_domain.c
51d9a2
@@ -5502,6 +5502,60 @@ qemuDomainDeviceDefValidateTPM(virDomainTPMDef *tpm,
51d9a2
 }
51d9a2
 
51d9a2
 
51d9a2
+static int
51d9a2
+qemuDomainDeviceDefValidateGraphics(const virDomainGraphicsDef *graphics,
51d9a2
+                                    const virDomainDef *def,
51d9a2
+                                    virQEMUCapsPtr qemuCaps)
51d9a2
+{
51d9a2
+    bool have_egl_headless = false;
51d9a2
+    size_t i;
51d9a2
+
51d9a2
+    for (i = 0; i < def->ngraphics; i++) {
51d9a2
+        graphics = def->graphics[i];
51d9a2
+
51d9a2
+        if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS) {
51d9a2
+            have_egl_headless = true;
51d9a2
+            break;
51d9a2
+        }
51d9a2
+    }
51d9a2
+
51d9a2
+    /* Only VNC and SPICE can be paired with egl-headless, the other types
51d9a2
+     * either don't make sense to pair with egl-headless or aren't even
51d9a2
+     * supported by QEMU.
51d9a2
+     */
51d9a2
+    if (have_egl_headless) {
51d9a2
+        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_EGL_HEADLESS)) {
51d9a2
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
51d9a2
+                           _("egl-headless display is not supported with this "
51d9a2
+                             "QEMU binary"));
51d9a2
+            return -1;
51d9a2
+        }
51d9a2
+
51d9a2
+        if (graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS &&
51d9a2
+            graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
51d9a2
+            graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
51d9a2
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
51d9a2
+                           _("graphics type 'egl-headless' is only supported "
51d9a2
+                             "with one of: 'vnc', 'spice' graphics types"));
51d9a2
+            return -1;
51d9a2
+        }
51d9a2
+
51d9a2
+        /* '-spice gl=on' and '-display egl-headless' are mutually
51d9a2
+         * exclusive
51d9a2
+         */
51d9a2
+        if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE &&
51d9a2
+            graphics->data.spice.gl == VIR_TRISTATE_BOOL_YES) {
51d9a2
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
51d9a2
+                           _("multiple OpenGL displays are not supported "
51d9a2
+                             "by QEMU"));
51d9a2
+            return -1;
51d9a2
+        }
51d9a2
+    }
51d9a2
+
51d9a2
+    return 0;
51d9a2
+}
51d9a2
+
51d9a2
+
51d9a2
 static int
51d9a2
 qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev,
51d9a2
                             const virDomainDef *def,
51d9a2
@@ -5569,11 +5623,15 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev,
51d9a2
         ret = qemuDomainDeviceDefValidateTPM(dev->data.tpm, def);
51d9a2
         break;
51d9a2
 
51d9a2
+    case VIR_DOMAIN_DEVICE_GRAPHICS:
51d9a2
+        ret = qemuDomainDeviceDefValidateGraphics(dev->data.graphics, def,
51d9a2
+                                                  qemuCaps);
51d9a2
+        break;
51d9a2
+
51d9a2
     case VIR_DOMAIN_DEVICE_LEASE:
51d9a2
     case VIR_DOMAIN_DEVICE_FS:
51d9a2
     case VIR_DOMAIN_DEVICE_INPUT:
51d9a2
     case VIR_DOMAIN_DEVICE_SOUND:
51d9a2
-    case VIR_DOMAIN_DEVICE_GRAPHICS:
51d9a2
     case VIR_DOMAIN_DEVICE_HUB:
51d9a2
     case VIR_DOMAIN_DEVICE_MEMBALLOON:
51d9a2
     case VIR_DOMAIN_DEVICE_NVRAM:
51d9a2
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
51d9a2
index 7094c80498..62deae4b98 100644
51d9a2
--- a/src/qemu/qemu_driver.c
51d9a2
+++ b/src/qemu/qemu_driver.c
51d9a2
@@ -18116,6 +18116,7 @@ qemuDomainOpenGraphics(virDomainPtr dom,
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
51d9a2
+    case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
51d9a2
                        _("Can only open VNC or SPICE graphics backends, not %s"),
51d9a2
                        virDomainGraphicsTypeToString(vm->def->graphics[idx]->type));
51d9a2
@@ -18184,6 +18185,7 @@ qemuDomainOpenGraphicsFD(virDomainPtr dom,
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
51d9a2
+    case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
51d9a2
                        _("Can only open VNC or SPICE graphics backends, not %s"),
51d9a2
                        virDomainGraphicsTypeToString(vm->def->graphics[idx]->type));
51d9a2
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
51d9a2
index 91a751a2fe..053ddb14ec 100644
51d9a2
--- a/src/qemu/qemu_hotplug.c
51d9a2
+++ b/src/qemu/qemu_hotplug.c
51d9a2
@@ -3699,6 +3699,7 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver,
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
51d9a2
+    case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
         virReportError(VIR_ERR_INTERNAL_ERROR,
51d9a2
                        _("unable to change config on '%s' graphics type"), type);
51d9a2
         break;
51d9a2
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
51d9a2
index c903a8e5c8..a4b1f97df5 100644
51d9a2
--- a/src/qemu/qemu_process.c
51d9a2
+++ b/src/qemu/qemu_process.c
51d9a2
@@ -4467,6 +4467,7 @@ qemuProcessGraphicsReservePorts(virDomainGraphicsDefPtr graphics,
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
51d9a2
+    case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
51d9a2
         break;
51d9a2
     }
51d9a2
@@ -4505,6 +4506,7 @@ qemuProcessGraphicsAllocatePorts(virQEMUDriverPtr driver,
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
51d9a2
+    case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
51d9a2
         break;
51d9a2
     }
51d9a2
@@ -4657,6 +4659,7 @@ qemuProcessGraphicsSetupListen(virQEMUDriverPtr driver,
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
51d9a2
+    case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
     case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
51d9a2
         break;
51d9a2
     }
51d9a2
@@ -4944,6 +4947,7 @@ qemuProcessStartValidateGraphics(virDomainObjPtr vm)
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
51d9a2
+        case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
         case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
51d9a2
             break;
51d9a2
         }
51d9a2
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
51d9a2
index fe24b060d7..937bf0c96b 100644
51d9a2
--- a/src/vmx/vmx.c
51d9a2
+++ b/src/vmx/vmx.c
51d9a2
@@ -3282,6 +3282,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe
51d9a2
           case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
51d9a2
           case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
51d9a2
           case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
51d9a2
+          case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
51d9a2
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
51d9a2
                            _("Unsupported graphics type '%s'"),
51d9a2
                            virDomainGraphicsTypeToString(def->graphics[i]->type));
51d9a2
diff --git a/tests/domaincapsschemadata/full.xml b/tests/domaincapsschemadata/full.xml
51d9a2
index d3faf38da0..154c4a6fe9 100644
51d9a2
--- a/tests/domaincapsschemadata/full.xml
51d9a2
+++ b/tests/domaincapsschemadata/full.xml
51d9a2
@@ -59,6 +59,7 @@
51d9a2
         <value>rdp</value>
51d9a2
         <value>desktop</value>
51d9a2
         <value>spice</value>
51d9a2
+        <value>egl-headless</value>
51d9a2
       </enum>
51d9a2
     </graphics>
51d9a2
     <video supported='yes'>
51d9a2
diff --git a/tests/qemuxml2argvdata/graphics-egl-headless.args b/tests/qemuxml2argvdata/graphics-egl-headless.args
51d9a2
new file mode 100644
51d9a2
index 0000000000..fdf540ddfc
51d9a2
--- /dev/null
51d9a2
+++ b/tests/qemuxml2argvdata/graphics-egl-headless.args
51d9a2
@@ -0,0 +1,26 @@
51d9a2
+LC_ALL=C \
51d9a2
+PATH=/bin \
51d9a2
+HOME=/home/test \
51d9a2
+USER=test \
51d9a2
+LOGNAME=test \
51d9a2
+/usr/bin/qemu-system-i686 \
51d9a2
+-name QEMUGuest1 \
51d9a2
+-S \
51d9a2
+-machine pc,accel=tcg,usb=off,dump-guest-core=off \
51d9a2
+-m 214 \
51d9a2
+-smp 1,sockets=1,cores=1,threads=1 \
51d9a2
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
51d9a2
+-no-user-config \
51d9a2
+-nodefaults \
51d9a2
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
51d9a2
+server,nowait \
51d9a2
+-mon chardev=charmonitor,id=monitor,mode=control \
51d9a2
+-rtc base=utc \
51d9a2
+-no-shutdown \
51d9a2
+-no-acpi \
51d9a2
+-boot c \
51d9a2
+-usb \
51d9a2
+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
51d9a2
+-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
51d9a2
+-display egl-headless \
51d9a2
+-vga cirrus
51d9a2
diff --git a/tests/qemuxml2argvdata/graphics-egl-headless.xml b/tests/qemuxml2argvdata/graphics-egl-headless.xml
51d9a2
new file mode 100644
51d9a2
index 0000000000..7b001cd2eb
51d9a2
--- /dev/null
51d9a2
+++ b/tests/qemuxml2argvdata/graphics-egl-headless.xml
51d9a2
@@ -0,0 +1,31 @@
51d9a2
+<domain type='qemu'>
51d9a2
+  <name>QEMUGuest1</name>
51d9a2
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
51d9a2
+  <memory unit='KiB'>219100</memory>
51d9a2
+  <currentMemory unit='KiB'>219100</currentMemory>
51d9a2
+  <vcpu placement='static'>1</vcpu>
51d9a2
+  <os>
51d9a2
+    <type arch='i686' machine='pc'>hvm</type>
51d9a2
+    <boot dev='hd'/>
51d9a2
+  </os>
51d9a2
+  <clock offset='utc'/>
51d9a2
+  <on_poweroff>destroy</on_poweroff>
51d9a2
+  <on_reboot>restart</on_reboot>
51d9a2
+  <on_crash>destroy</on_crash>
51d9a2
+  <devices>
51d9a2
+    <emulator>/usr/bin/qemu-system-i686</emulator>
51d9a2
+    <disk type='block' device='disk'>
51d9a2
+      <driver name='qemu' type='raw'/>
51d9a2
+      <source dev='/dev/HostVG/QEMUGuest1'/>
51d9a2
+      <target dev='hda' bus='ide'/>
51d9a2
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
51d9a2
+    </disk>
51d9a2
+    <controller type='usb' index='0'/>
51d9a2
+    <controller type='ide' index='0'/>
51d9a2
+    <controller type='pci' index='0' model='pci-root'/>
51d9a2
+    <input type='mouse' bus='ps2'/>
51d9a2
+    <input type='keyboard' bus='ps2'/>
51d9a2
+    <graphics type='egl-headless'/>
51d9a2
+    <memballoon model='none'/>
51d9a2
+  </devices>
51d9a2
+</domain>
51d9a2
diff --git a/tests/qemuxml2argvdata/graphics-sdl-egl-headless.xml b/tests/qemuxml2argvdata/graphics-sdl-egl-headless.xml
51d9a2
new file mode 100644
51d9a2
index 0000000000..955dfeb3c2
51d9a2
--- /dev/null
51d9a2
+++ b/tests/qemuxml2argvdata/graphics-sdl-egl-headless.xml
51d9a2
@@ -0,0 +1,35 @@
51d9a2
+<domain type='qemu'>
51d9a2
+  <name>QEMUGuest1</name>
51d9a2
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
51d9a2
+  <memory unit='KiB'>219136</memory>
51d9a2
+  <currentMemory unit='KiB'>219136</currentMemory>
51d9a2
+  <vcpu placement='static'>1</vcpu>
51d9a2
+  <os>
51d9a2
+    <type arch='i686' machine='pc'>hvm</type>
51d9a2
+    <boot dev='hd'/>
51d9a2
+  </os>
51d9a2
+  <clock offset='utc'/>
51d9a2
+  <on_poweroff>destroy</on_poweroff>
51d9a2
+  <on_reboot>restart</on_reboot>
51d9a2
+  <on_crash>destroy</on_crash>
51d9a2
+  <devices>
51d9a2
+    <emulator>/usr/bin/qemu-system-i686</emulator>
51d9a2
+    <disk type='block' device='disk'>
51d9a2
+      <driver name='qemu' type='raw'/>
51d9a2
+      <source dev='/dev/HostVG/QEMUGuest1'/>
51d9a2
+      <target dev='hda' bus='ide'/>
51d9a2
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
51d9a2
+    </disk>
51d9a2
+    <controller type='usb' index='0'/>
51d9a2
+    <controller type='ide' index='0'/>
51d9a2
+    <controller type='pci' index='0' model='pci-root'/>
51d9a2
+    <input type='mouse' bus='ps2'/>
51d9a2
+    <input type='keyboard' bus='ps2'/>
51d9a2
+    <graphics type='sdl' display=':0.1' xauth='/root/.Xauthority'/>
51d9a2
+    <graphics type='egl-headless'/>
51d9a2
+    <video>
51d9a2
+      <model type='vga' vram='16384' heads='1'/>
51d9a2
+    </video>
51d9a2
+    <memballoon model='none'/>
51d9a2
+  </devices>
51d9a2
+</domain>
51d9a2
diff --git a/tests/qemuxml2argvdata/graphics-spice-egl-headless.args b/tests/qemuxml2argvdata/graphics-spice-egl-headless.args
51d9a2
new file mode 100644
51d9a2
index 0000000000..4886ee05f6
51d9a2
--- /dev/null
51d9a2
+++ b/tests/qemuxml2argvdata/graphics-spice-egl-headless.args
51d9a2
@@ -0,0 +1,31 @@
51d9a2
+LC_ALL=C \
51d9a2
+PATH=/bin \
51d9a2
+HOME=/home/test \
51d9a2
+USER=test \
51d9a2
+LOGNAME=test \
51d9a2
+QEMU_AUDIO_DRV=spice \
51d9a2
+/usr/bin/qemu-system-i686 \
51d9a2
+-name QEMUGuest1 \
51d9a2
+-S \
51d9a2
+-machine pc,accel=tcg,usb=off,dump-guest-core=off \
51d9a2
+-m 214 \
51d9a2
+-smp 1,sockets=1,cores=1,threads=1 \
51d9a2
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
51d9a2
+-no-user-config \
51d9a2
+-nodefaults \
51d9a2
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
51d9a2
+server,nowait \
51d9a2
+-mon chardev=charmonitor,id=monitor,mode=control \
51d9a2
+-rtc base=utc \
51d9a2
+-no-shutdown \
51d9a2
+-no-acpi \
51d9a2
+-boot c \
51d9a2
+-usb \
51d9a2
+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
51d9a2
+-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
51d9a2
+-spice port=5903,addr=127.0.0.1 \
51d9a2
+-display egl-headless \
51d9a2
+-vga qxl \
51d9a2
+-global qxl-vga.ram_size=67108864 \
51d9a2
+-global qxl-vga.vram_size=33554432 \
51d9a2
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
51d9a2
diff --git a/tests/qemuxml2argvdata/graphics-spice-egl-headless.xml b/tests/qemuxml2argvdata/graphics-spice-egl-headless.xml
51d9a2
new file mode 100644
51d9a2
index 0000000000..fafae13a0f
51d9a2
--- /dev/null
51d9a2
+++ b/tests/qemuxml2argvdata/graphics-spice-egl-headless.xml
51d9a2
@@ -0,0 +1,36 @@
51d9a2
+<domain type='qemu'>
51d9a2
+  <name>QEMUGuest1</name>
51d9a2
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
51d9a2
+  <memory unit='KiB'>219136</memory>
51d9a2
+  <currentMemory unit='KiB'>219136</currentMemory>
51d9a2
+  <vcpu placement='static'>1</vcpu>
51d9a2
+  <os>
51d9a2
+    <type arch='i686' machine='pc'>hvm</type>
51d9a2
+    <boot dev='hd'/>
51d9a2
+  </os>
51d9a2
+  <clock offset='utc'/>
51d9a2
+  <on_poweroff>destroy</on_poweroff>
51d9a2
+  <on_reboot>restart</on_reboot>
51d9a2
+  <on_crash>destroy</on_crash>
51d9a2
+  <devices>
51d9a2
+    <emulator>/usr/bin/qemu-system-i686</emulator>
51d9a2
+    <disk type='block' device='disk'>
51d9a2
+      <source dev='/dev/HostVG/QEMUGuest1'/>
51d9a2
+      <target dev='hda' bus='ide'/>
51d9a2
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
51d9a2
+    </disk>
51d9a2
+    <controller type='usb' index='0'/>
51d9a2
+    <controller type='ide' index='0'/>
51d9a2
+    <controller type='pci' index='0' model='pci-root'/>
51d9a2
+    <input type='mouse' bus='ps2'/>
51d9a2
+    <input type='keyboard' bus='ps2'/>
51d9a2
+    <graphics type='spice' port='5903' autoport='no' listen='127.0.0.1'>
51d9a2
+      <listen type='address' address='127.0.0.1'/>
51d9a2
+    </graphics>
51d9a2
+    <graphics type='egl-headless'/>
51d9a2
+    <video>
51d9a2
+      <model type='qxl' ram='65536' vram='32768' vgamem='8192' heads='1'/>
51d9a2
+    </video>
51d9a2
+    <memballoon model='virtio'/>
51d9a2
+  </devices>
51d9a2
+</domain>
51d9a2
diff --git a/tests/qemuxml2argvdata/graphics-spice-invalid-egl-headless.xml b/tests/qemuxml2argvdata/graphics-spice-invalid-egl-headless.xml
51d9a2
new file mode 100644
51d9a2
index 0000000000..25ae61cef6
51d9a2
--- /dev/null
51d9a2
+++ b/tests/qemuxml2argvdata/graphics-spice-invalid-egl-headless.xml
51d9a2
@@ -0,0 +1,37 @@
51d9a2
+<domain type='qemu'>
51d9a2
+  <name>QEMUGuest1</name>
51d9a2
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
51d9a2
+  <memory unit='KiB'>219136</memory>
51d9a2
+  <currentMemory unit='KiB'>219136</currentMemory>
51d9a2
+  <vcpu placement='static'>1</vcpu>
51d9a2
+  <os>
51d9a2
+    <type arch='i686' machine='pc'>hvm</type>
51d9a2
+    <boot dev='hd'/>
51d9a2
+  </os>
51d9a2
+  <clock offset='utc'/>
51d9a2
+  <on_poweroff>destroy</on_poweroff>
51d9a2
+  <on_reboot>restart</on_reboot>
51d9a2
+  <on_crash>destroy</on_crash>
51d9a2
+  <devices>
51d9a2
+    <emulator>/usr/bin/qemu-system-i686</emulator>
51d9a2
+    <disk type='block' device='disk'>
51d9a2
+      <source dev='/dev/HostVG/QEMUGuest1'/>
51d9a2
+      <target dev='hda' bus='ide'/>
51d9a2
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
51d9a2
+    </disk>
51d9a2
+    <controller type='usb' index='0'/>
51d9a2
+    <controller type='ide' index='0'/>
51d9a2
+    <controller type='pci' index='0' model='pci-root'/>
51d9a2
+    <input type='mouse' bus='ps2'/>
51d9a2
+    <input type='keyboard' bus='ps2'/>
51d9a2
+    <graphics type='spice'>
51d9a2
+      <listen type='none'/>
51d9a2
+      <gl enable='yes'/>
51d9a2
+    </graphics>
51d9a2
+    <graphics type='egl-headless'/>
51d9a2
+    <video>
51d9a2
+      <model type='qxl' ram='65536' vram='32768' vgamem='8192' heads='1'/>
51d9a2
+    </video>
51d9a2
+    <memballoon model='virtio'/>
51d9a2
+  </devices>
51d9a2
+</domain>
51d9a2
diff --git a/tests/qemuxml2argvdata/graphics-vnc-egl-headless.args b/tests/qemuxml2argvdata/graphics-vnc-egl-headless.args
51d9a2
new file mode 100644
51d9a2
index 0000000000..2d2b3cf0fb
51d9a2
--- /dev/null
51d9a2
+++ b/tests/qemuxml2argvdata/graphics-vnc-egl-headless.args
51d9a2
@@ -0,0 +1,28 @@
51d9a2
+LC_ALL=C \
51d9a2
+PATH=/bin \
51d9a2
+HOME=/home/test \
51d9a2
+USER=test \
51d9a2
+LOGNAME=test \
51d9a2
+QEMU_AUDIO_DRV=none \
51d9a2
+/usr/bin/qemu-system-i686 \
51d9a2
+-name QEMUGuest1 \
51d9a2
+-S \
51d9a2
+-machine pc,accel=tcg,usb=off,dump-guest-core=off \
51d9a2
+-m 214 \
51d9a2
+-smp 1,sockets=1,cores=1,threads=1 \
51d9a2
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
51d9a2
+-no-user-config \
51d9a2
+-nodefaults \
51d9a2
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
51d9a2
+server,nowait \
51d9a2
+-mon chardev=charmonitor,id=monitor,mode=control \
51d9a2
+-rtc base=utc \
51d9a2
+-no-shutdown \
51d9a2
+-no-acpi \
51d9a2
+-boot c \
51d9a2
+-usb \
51d9a2
+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
51d9a2
+-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
51d9a2
+-vnc '[2001:1:2:3:4:5:1234:1234]:3' \
51d9a2
+-display egl-headless \
51d9a2
+-vga cirrus
51d9a2
diff --git a/tests/qemuxml2argvdata/graphics-vnc-egl-headless.xml b/tests/qemuxml2argvdata/graphics-vnc-egl-headless.xml
51d9a2
new file mode 100644
51d9a2
index 0000000000..570cf2e50f
51d9a2
--- /dev/null
51d9a2
+++ b/tests/qemuxml2argvdata/graphics-vnc-egl-headless.xml
51d9a2
@@ -0,0 +1,37 @@
51d9a2
+<domain type='qemu'>
51d9a2
+  <name>QEMUGuest1</name>
51d9a2
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
51d9a2
+  <memory unit='KiB'>219100</memory>
51d9a2
+  <currentMemory unit='KiB'>219100</currentMemory>
51d9a2
+  <vcpu placement='static'>1</vcpu>
51d9a2
+  <os>
51d9a2
+    <type arch='i686' machine='pc'>hvm</type>
51d9a2
+    <boot dev='hd'/>
51d9a2
+  </os>
51d9a2
+  <clock offset='utc'/>
51d9a2
+  <on_poweroff>destroy</on_poweroff>
51d9a2
+  <on_reboot>restart</on_reboot>
51d9a2
+  <on_crash>destroy</on_crash>
51d9a2
+  <devices>
51d9a2
+    <emulator>/usr/bin/qemu-system-i686</emulator>
51d9a2
+    <disk type='block' device='disk'>
51d9a2
+      <driver name='qemu' type='raw'/>
51d9a2
+      <source dev='/dev/HostVG/QEMUGuest1'/>
51d9a2
+      <target dev='hda' bus='ide'/>
51d9a2
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
51d9a2
+    </disk>
51d9a2
+    <controller type='usb' index='0'/>
51d9a2
+    <controller type='ide' index='0'/>
51d9a2
+    <controller type='pci' index='0' model='pci-root'/>
51d9a2
+    <input type='mouse' bus='ps2'/>
51d9a2
+    <input type='keyboard' bus='ps2'/>
51d9a2
+    <graphics type='vnc' port='5903' autoport='no' listen='2001:1:2:3:4:5:1234:1234'>
51d9a2
+      <listen type='address' address='2001:1:2:3:4:5:1234:1234'/>
51d9a2
+    </graphics>
51d9a2
+    <graphics type='egl-headless'/>
51d9a2
+    <video>
51d9a2
+      <model type='cirrus' vram='16384' heads='1'/>
51d9a2
+    </video>
51d9a2
+    <memballoon model='none'/>
51d9a2
+  </devices>
51d9a2
+</domain>
51d9a2
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
51d9a2
index 3be5af03aa..848e40440a 100644
51d9a2
--- a/tests/qemuxml2argvtest.c
51d9a2
+++ b/tests/qemuxml2argvtest.c
51d9a2
@@ -1167,6 +1167,10 @@ mymain(void)
51d9a2
     DO_TEST_PARSE_ERROR("disk-scsi-incompatible-address",
51d9a2
                         QEMU_CAPS_VIRTIO_SCSI);
51d9a2
 
51d9a2
+    DO_TEST("graphics-egl-headless",
51d9a2
+            QEMU_CAPS_EGL_HEADLESS,
51d9a2
+            QEMU_CAPS_DEVICE_CIRRUS_VGA);
51d9a2
+
51d9a2
     DO_TEST("graphics-vnc", QEMU_CAPS_VNC, QEMU_CAPS_DEVICE_CIRRUS_VGA);
51d9a2
     DO_TEST("graphics-vnc-socket", QEMU_CAPS_VNC, QEMU_CAPS_DEVICE_CIRRUS_VGA);
51d9a2
     DO_TEST("graphics-vnc-websocket", QEMU_CAPS_VNC, QEMU_CAPS_VNC_WEBSOCKET,
51d9a2
@@ -1198,9 +1202,14 @@ mymain(void)
51d9a2
     driver.config->vncSASL = driver.config->vncTLSx509verify = driver.config->vncTLS = 0;
51d9a2
     VIR_FREE(driver.config->vncSASLdir);
51d9a2
     VIR_FREE(driver.config->vncTLSx509certdir);
51d9a2
+    DO_TEST("graphics-vnc-egl-headless",
51d9a2
+            QEMU_CAPS_VNC,
51d9a2
+            QEMU_CAPS_EGL_HEADLESS,
51d9a2
+            QEMU_CAPS_DEVICE_CIRRUS_VGA);
51d9a2
 
51d9a2
     DO_TEST("graphics-sdl",
51d9a2
             QEMU_CAPS_DEVICE_VGA);
51d9a2
+    DO_TEST_FAILURE("graphics-sdl-egl-headless", NONE);
51d9a2
     DO_TEST("graphics-sdl-fullscreen",
51d9a2
             QEMU_CAPS_DEVICE_CIRRUS_VGA);
51d9a2
     DO_TEST("graphics-spice",
51d9a2
@@ -1255,6 +1264,14 @@ mymain(void)
51d9a2
             QEMU_CAPS_SPICE_UNIX,
51d9a2
             QEMU_CAPS_DEVICE_CIRRUS_VGA);
51d9a2
     driver.config->spiceAutoUnixSocket = false;
51d9a2
+    DO_TEST("graphics-spice-egl-headless",
51d9a2
+            QEMU_CAPS_SPICE,
51d9a2
+            QEMU_CAPS_EGL_HEADLESS,
51d9a2
+            QEMU_CAPS_DEVICE_QXL);
51d9a2
+    DO_TEST_FAILURE("graphics-spice-invalid-egl-headless",
51d9a2
+                    QEMU_CAPS_SPICE,
51d9a2
+                    QEMU_CAPS_EGL_HEADLESS,
51d9a2
+                    QEMU_CAPS_DEVICE_QXL);
51d9a2
 
51d9a2
     DO_TEST("input-usbmouse", NONE);
51d9a2
     DO_TEST("input-usbtablet", NONE);
51d9a2
diff --git a/tests/qemuxml2xmloutdata/graphics-spice-egl-headless.xml b/tests/qemuxml2xmloutdata/graphics-spice-egl-headless.xml
51d9a2
new file mode 100644
51d9a2
index 0000000000..6d96264914
51d9a2
--- /dev/null
51d9a2
+++ b/tests/qemuxml2xmloutdata/graphics-spice-egl-headless.xml
51d9a2
@@ -0,0 +1,44 @@
51d9a2
+<domain type='qemu'>
51d9a2
+  <name>QEMUGuest1</name>
51d9a2
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
51d9a2
+  <memory unit='KiB'>219136</memory>
51d9a2
+  <currentMemory unit='KiB'>219136</currentMemory>
51d9a2
+  <vcpu placement='static'>1</vcpu>
51d9a2
+  <os>
51d9a2
+    <type arch='i686' machine='pc'>hvm</type>
51d9a2
+    <boot dev='hd'/>
51d9a2
+  </os>
51d9a2
+  <clock offset='utc'/>
51d9a2
+  <on_poweroff>destroy</on_poweroff>
51d9a2
+  <on_reboot>restart</on_reboot>
51d9a2
+  <on_crash>destroy</on_crash>
51d9a2
+  <devices>
51d9a2
+    <emulator>/usr/bin/qemu-system-i686</emulator>
51d9a2
+    <disk type='block' device='disk'>
51d9a2
+      <driver name='qemu' type='raw'/>
51d9a2
+      <source dev='/dev/HostVG/QEMUGuest1'/>
51d9a2
+      <target dev='hda' bus='ide'/>
51d9a2
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
51d9a2
+    </disk>
51d9a2
+    <controller type='usb' index='0'>
51d9a2
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
51d9a2
+    </controller>
51d9a2
+    <controller type='ide' index='0'>
51d9a2
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
51d9a2
+    </controller>
51d9a2
+    <controller type='pci' index='0' model='pci-root'/>
51d9a2
+    <input type='mouse' bus='ps2'/>
51d9a2
+    <input type='keyboard' bus='ps2'/>
51d9a2
+    <graphics type='spice' port='5903' autoport='no' listen='127.0.0.1'>
51d9a2
+      <listen type='address' address='127.0.0.1'/>
51d9a2
+    </graphics>
51d9a2
+    <graphics type='egl-headless'/>
51d9a2
+    <video>
51d9a2
+      <model type='qxl' ram='65536' vram='32768' vgamem='8192' heads='1' primary='yes'/>
51d9a2
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
51d9a2
+    </video>
51d9a2
+    <memballoon model='virtio'>
51d9a2
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
51d9a2
+    </memballoon>
51d9a2
+  </devices>
51d9a2
+</domain>
51d9a2
diff --git a/tests/qemuxml2xmloutdata/graphics-vnc-egl-headless.xml b/tests/qemuxml2xmloutdata/graphics-vnc-egl-headless.xml
51d9a2
new file mode 100644
51d9a2
index 0000000000..4155c10397
51d9a2
--- /dev/null
51d9a2
+++ b/tests/qemuxml2xmloutdata/graphics-vnc-egl-headless.xml
51d9a2
@@ -0,0 +1,42 @@
51d9a2
+<domain type='qemu'>
51d9a2
+  <name>QEMUGuest1</name>
51d9a2
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
51d9a2
+  <memory unit='KiB'>219100</memory>
51d9a2
+  <currentMemory unit='KiB'>219100</currentMemory>
51d9a2
+  <vcpu placement='static'>1</vcpu>
51d9a2
+  <os>
51d9a2
+    <type arch='i686' machine='pc'>hvm</type>
51d9a2
+    <boot dev='hd'/>
51d9a2
+  </os>
51d9a2
+  <clock offset='utc'/>
51d9a2
+  <on_poweroff>destroy</on_poweroff>
51d9a2
+  <on_reboot>restart</on_reboot>
51d9a2
+  <on_crash>destroy</on_crash>
51d9a2
+  <devices>
51d9a2
+    <emulator>/usr/bin/qemu-system-i686</emulator>
51d9a2
+    <disk type='block' device='disk'>
51d9a2
+      <driver name='qemu' type='raw'/>
51d9a2
+      <source dev='/dev/HostVG/QEMUGuest1'/>
51d9a2
+      <target dev='hda' bus='ide'/>
51d9a2
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
51d9a2
+    </disk>
51d9a2
+    <controller type='usb' index='0'>
51d9a2
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
51d9a2
+    </controller>
51d9a2
+    <controller type='ide' index='0'>
51d9a2
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
51d9a2
+    </controller>
51d9a2
+    <controller type='pci' index='0' model='pci-root'/>
51d9a2
+    <input type='mouse' bus='ps2'/>
51d9a2
+    <input type='keyboard' bus='ps2'/>
51d9a2
+    <graphics type='vnc' port='5903' autoport='no' listen='2001:1:2:3:4:5:1234:1234'>
51d9a2
+      <listen type='address' address='2001:1:2:3:4:5:1234:1234'/>
51d9a2
+    </graphics>
51d9a2
+    <graphics type='egl-headless'/>
51d9a2
+    <video>
51d9a2
+      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
51d9a2
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
51d9a2
+    </video>
51d9a2
+    <memballoon model='none'/>
51d9a2
+  </devices>
51d9a2
+</domain>
51d9a2
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
51d9a2
index bbb995656e..fa57221d62 100644
51d9a2
--- a/tests/qemuxml2xmltest.c
51d9a2
+++ b/tests/qemuxml2xmltest.c
51d9a2
@@ -417,6 +417,7 @@ mymain(void)
51d9a2
     cfg->vncAutoUnixSocket = false;
51d9a2
     DO_TEST("graphics-vnc-socket", NONE);
51d9a2
     DO_TEST("graphics-vnc-auto-socket", NONE);
51d9a2
+    DO_TEST("graphics-vnc-egl-headless", NONE);
51d9a2
 
51d9a2
     DO_TEST("graphics-sdl", NONE);
51d9a2
     DO_TEST("graphics-sdl-fullscreen", NONE);
51d9a2
@@ -428,6 +429,7 @@ mymain(void)
51d9a2
     cfg->spiceAutoUnixSocket = true;
51d9a2
     DO_TEST("graphics-spice-auto-socket-cfg", NONE);
51d9a2
     cfg->spiceAutoUnixSocket = false;
51d9a2
+    DO_TEST("graphics-spice-egl-headless", NONE);
51d9a2
 
51d9a2
     DO_TEST("input-usbmouse", NONE);
51d9a2
     DO_TEST("input-usbtablet", NONE);
51d9a2
-- 
51d9a2
2.18.0
51d9a2