From: Kirill Shchetiniuk <kshcheti(a)redhat.com>
Introduce GTK display support with OpenGL for the QEMU driver.
- Add new XML options for GTK display type.
- Include capability flags for the QEMU driver.
Note: The `QEMU_CAPS_GTK_GL` flag cannot yet be checked, so device
definition validation is incomplete. A placeholder is left for
future implementation, when the GTK along with OpenGL capability
check would be available in QEMU.
Resolves:
https://gitlab.com/libvirt/libvirt/-/issues/570
Signed-off-by: Kirill Shchetiniuk <kshcheti(a)redhat.com>
---
src/conf/domain_conf.c | 79 ++++++++++++++++++-
src/conf/domain_conf.h | 8 ++
src/conf/schemas/domaincommon.rng | 28 +++++++
src/qemu/qemu_capabilities.c | 5 ++
src/qemu/qemu_capabilities.h | 2 +
src/qemu/qemu_command.c | 39 ++++++++-
src/qemu/qemu_domain.c | 1 +
src/qemu/qemu_driver.c | 2 +
src/qemu/qemu_extdevice.c | 2 +
src/qemu/qemu_hotplug.c | 1 +
src/qemu/qemu_process.c | 8 ++
src/qemu/qemu_validate.c | 16 ++++
src/security/virt-aa-helper.c | 6 ++
src/vmx/vmx.c | 1 +
tests/domaincapsdata/qemu_10.0.0.s390x.xml | 1 +
tests/domaincapsdata/qemu_7.0.0.ppc64.xml | 1 +
tests/domaincapsdata/qemu_7.1.0.ppc64.xml | 1 +
tests/domaincapsdata/qemu_7.2.0.ppc.xml | 1 +
.../qemu_8.2.0-tcg-virt.loongarch64.xml | 1 +
.../qemu_8.2.0-virt.aarch64.xml | 1 +
.../qemu_8.2.0-virt.loongarch64.xml | 1 +
tests/domaincapsdata/qemu_8.2.0.aarch64.xml | 1 +
tests/domaincapsdata/qemu_8.2.0.armv7l.xml | 1 +
tests/domaincapsdata/qemu_9.0.0.sparc.xml | 1 +
tests/domaincapsdata/qemu_9.1.0.s390x.xml | 1 +
tests/domaincapsdata/qemu_9.2.0.s390x.xml | 1 +
.../caps_10.0.0_s390x.xml | 1 +
.../qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 +
.../qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 +
tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 +
.../caps_8.2.0_aarch64.xml | 1 +
.../caps_8.2.0_armv7l.xml | 1 +
.../caps_8.2.0_loongarch64.xml | 1 +
.../qemucapabilitiesdata/caps_9.0.0_sparc.xml | 1 +
.../qemucapabilitiesdata/caps_9.1.0_s390x.xml | 1 +
.../qemucapabilitiesdata/caps_9.2.0_s390x.xml | 1 +
36 files changed, 218 insertions(+), 2 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 542d6ade91..73550f7fcf 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -960,6 +960,7 @@ VIR_ENUM_IMPL(virDomainGraphics,
"spice",
"egl-headless",
"dbus",
+ "gtk",
);
VIR_ENUM_IMPL(virDomainGraphicsListen,
@@ -2054,6 +2055,12 @@ void virDomainGraphicsDefFree(virDomainGraphicsDef *def)
g_free(def->data.dbus.rendernode);
break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
+ g_free(def->data.gtk.display);
+ g_free(def->data.gtk.xauth);
+ g_free(def->data.gtk.rendernode);
+ break;
+
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -12199,6 +12206,39 @@ virDomainGraphicsDefParseXMLDBus(virDomainGraphicsDef *def,
}
+static int
+virDomainGraphicsDefParseXMLGTK(virDomainGraphicsDef *def,
+ xmlNodePtr node,
+ xmlXPathContextPtr ctxt)
+{
+ VIR_XPATH_NODE_AUTORESTORE(ctxt)
+ xmlNodePtr glNode;
+ virTristateBool fullscreen;
+
+ ctxt->node = node;
+
+ if (virXMLPropTristateBool(node, "fullscreen", VIR_XML_PROP_NONE,
+ &fullscreen) < 0)
+ return -1;
+
+ virTristateBoolToBool(fullscreen, &def->data.gtk.fullscreen);
+ def->data.gtk.xauth = virXMLPropString(node, "xauth");
+ def->data.gtk.display = virXMLPropString(node, "display");
+
+ if ((glNode = virXPathNode("./gl", ctxt))) {
+ def->data.gtk.rendernode = virXMLPropString(glNode,
+ "rendernode");
+
+ if (virXMLPropTristateBool(glNode, "enable",
+ VIR_XML_PROP_REQUIRED,
+ &def->data.gtk.gl) < 0)
+ return -1;
+ }
+
+ return 0;
+}
+
+
virDomainGraphicsDef *
virDomainGraphicsDefNew(virDomainXMLOption *xmlopt)
{
@@ -12275,6 +12315,10 @@ virDomainGraphicsDefParseXML(virDomainXMLOption *xmlopt,
if (virDomainGraphicsDefParseXMLDBus(def, node, ctxt) < 0)
goto error;
break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
+ if (virDomainGraphicsDefParseXMLGTK(def, node, ctxt) < 0)
+ goto error;
+ break;
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -27118,6 +27162,23 @@ virDomainGraphicsDefFormatDBus(virBuffer *attrBuf,
virDomainGraphicsDefFormatAudio(childBuf, def->data.dbus.audioId);
}
+static void
+virDomainGraphicsDefFormatGTK(virBuffer *attrBuf,
+ virBuffer *childBuf,
+ virDomainGraphicsDef *def)
+{
+ virBufferEscapeString(attrBuf, " display='%s'",
def->data.gtk.display);
+
+ virBufferEscapeString(attrBuf, " xauth='%s'",
def->data.gtk.xauth);
+
+ if (def->data.gtk.fullscreen)
+ virBufferAddLit(attrBuf, " fullscreen='yes'");
+
+ virDomainGraphicsDefFormatGL(childBuf, def->data.gtk.gl,
+ def->data.gtk.rendernode);
+}
+
+
static int
virDomainGraphicsDefFormat(virBuffer *buf,
virDomainGraphicsDef *def,
@@ -27166,6 +27227,10 @@ virDomainGraphicsDefFormat(virBuffer *buf,
virDomainGraphicsDefFormatDBus(&attrBuf, &childBuf, def);
break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
+ virDomainGraphicsDefFormatGTK(&attrBuf, &childBuf, def);
+ break;
+
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -31949,6 +32014,11 @@ virDomainGraphicsDefHasOpenGL(const virDomainDef *def)
if (graphics->data.dbus.gl == VIR_TRISTATE_BOOL_YES)
return true;
+ continue;
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
+ if (graphics->data.gtk.gl == VIR_TRISTATE_BOOL_YES)
+ return true;
+
continue;
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
@@ -31966,7 +32036,8 @@ virDomainGraphicsSupportsRenderNode(const virDomainGraphicsDef
*graphics)
if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE ||
graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS ||
- graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_DBUS)
+ graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_DBUS ||
+ graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_GTK)
ret = true;
return ret;
@@ -31988,6 +32059,9 @@ virDomainGraphicsGetRenderNode(const virDomainGraphicsDef
*graphics)
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
ret = graphics->data.dbus.rendernode;
break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
+ ret = graphics->data.gtk.rendernode;
+ break;
case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
@@ -32012,6 +32086,9 @@ virDomainGraphicsNeedsAutoRenderNode(const virDomainGraphicsDef
*graphics)
if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_DBUS &&
graphics->data.dbus.gl != VIR_TRISTATE_BOOL_YES)
return false;
+ if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_GTK &&
+ graphics->data.gtk.gl != VIR_TRISTATE_BOOL_YES)
+ return false;
if (virDomainGraphicsGetRenderNode(graphics))
return false;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 58b97a2b54..f4f06db8a8 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1896,6 +1896,7 @@ typedef enum {
VIR_DOMAIN_GRAPHICS_TYPE_SPICE,
VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS,
VIR_DOMAIN_GRAPHICS_TYPE_DBUS,
+ VIR_DOMAIN_GRAPHICS_TYPE_GTK,
VIR_DOMAIN_GRAPHICS_TYPE_LAST
} virDomainGraphicsType;
@@ -2083,6 +2084,13 @@ struct _virDomainGraphicsDef {
unsigned int audioId;
bool fromConfig; /* true if the @address is config file originated */
} dbus;
+ struct {
+ char *display;
+ char *xauth;
+ bool fullscreen;
+ char *rendernode;
+ virTristateBool gl;
+ } gtk;
} data;
/* nListens, listens, and *port are only useful if type is vnc,
* rdp, or spice. They've been extracted from the union only to
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index 5597d5a66b..61c1d3ad97 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -4593,6 +4593,34 @@
</element>
</optional>
</group>
+ <group>
+ <attribute name="type">
+ <value>gtk</value>
+ </attribute>
+ <optional>
+ <attribute name="display">
+ <text/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="xauth">
+ <text/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="fullscreen">
+ <ref name="virYesNo"/>
+ </attribute>
+ </optional>
+ <optional>
+ <element name="gl">
+ <attribute name="enable">
+ <ref name="virYesNo"/>
+ </attribute>
+ <empty/>
+ </element>
+ </optional>
+ </group>
</choice>
</element>
</define>
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index a804335c85..de7ce95499 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -732,6 +732,8 @@ VIR_ENUM_IMPL(virQEMUCaps,
/* 475 */
"virtio-scsi.iothread-mapping", /*
QEMU_CAPS_VIRTIO_SCSI_IOTHREAD_MAPPING */
+ "gtk", /* QEMU_CAPS_GTK */
+ "gtk-gl", /* QEMU_CAPS_GTK_GL */
);
@@ -1602,6 +1604,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] =
{
{ "set-numa-node/arg-type/+hmat-lb", QEMU_CAPS_NUMA_HMAT },
{ "query-cpu-model-expansion/ret-type/deprecated-props",
QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS },
{ "migrate-incoming/arg-type/exit-on-error",
QEMU_CAPS_MIGRATE_INCOMING_EXIT_ON_ERROR },
+ { "query-display-options/ret-type/type/^gtk", QEMU_CAPS_GTK },
};
typedef struct _virQEMUCapsObjectTypeProps virQEMUCapsObjectTypeProps;
@@ -6499,6 +6502,8 @@ virQEMUCapsFillDomainDeviceGraphicsCaps(virQEMUDriverConfig *cfg,
VIR_DOMAIN_GRAPHICS_TYPE_RDP);
}
}
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_GTK))
+ VIR_DOMAIN_CAPS_ENUM_SET(dev->type, VIR_DOMAIN_GRAPHICS_TYPE_GTK);
}
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index ea7c14daa9..f4ab1a821f 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -713,6 +713,8 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check
*/
/* 475 */
QEMU_CAPS_VIRTIO_SCSI_IOTHREAD_MAPPING, /* virtio-scsi supports per-virtqueue
iothread mapping */
+ QEMU_CAPS_GTK, /* support for GTK graphics is compiled into qemu */
+ QEMU_CAPS_GTK_GL, /* support OpenGL for gtk graphics */
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index e6d308534f..e97992ff56 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -8483,6 +8483,34 @@ qemuBuildGraphicsDBusCommandLine(virDomainDef *def,
}
+static int
+qemuBuildGraphicsGTKCommandLine(virQEMUDriverConfig *cfg G_GNUC_UNUSED,
+ virCommand *cmd,
+ virDomainGraphicsDef *graphics)
+{
+ g_auto(virBuffer) opt = VIR_BUFFER_INITIALIZER;
+
+ if (graphics->data.gtk.xauth)
+ virCommandAddEnvPair(cmd, "XAUTHORITY", graphics->data.gtk.xauth);
+ if (graphics->data.gtk.display)
+ virCommandAddEnvPair(cmd, "DISPLAY", graphics->data.gtk.display);
+ if (graphics->data.gtk.fullscreen)
+ virCommandAddArg(cmd, "-full-screen");
+
+ virCommandAddArg(cmd, "-display");
+ virBufferAddLit(&opt, "gtk");
+
+ if (graphics->data.gtk.gl != VIR_TRISTATE_BOOL_ABSENT)
+ virBufferAsprintf(&opt, ",gl=%s",
+ virTristateSwitchTypeToString(graphics->data.gtk.gl));
+
+ virCommandAddArgBuffer(cmd, &opt);
+
+ return 0;
+}
+
+
+
static int
qemuBuildGraphicsCommandLine(virQEMUDriverConfig *cfg,
virCommand *cmd,
@@ -8523,6 +8551,11 @@ qemuBuildGraphicsCommandLine(virQEMUDriverConfig *cfg,
if (qemuBuildGraphicsDBusCommandLine(def, cmd, graphics) < 0)
return -1;
+ break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
+ if (qemuBuildGraphicsGTKCommandLine(cfg, cmd, graphics) < 0)
+ return -1;
+
break;
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
break;
@@ -10076,6 +10109,7 @@ qemuBuildCommandLineValidate(virQEMUDriver *driver,
int egl_headless = 0;
int dbus = 0;
int rdp = 0;
+ int gtk = 0;
if (!driver->privileged) {
/* If we have no cgroups then we can have no tunings that
@@ -10126,13 +10160,16 @@ qemuBuildCommandLineValidate(virQEMUDriver *driver,
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
++rdp;
break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
+ ++gtk;
+ break;
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
}
- if (sdl > 1 || vnc > 1 || spice > 1 || egl_headless > 1 || dbus > 1 ||
rdp > 1) {
+ if (sdl > 1 || vnc > 1 || spice > 1 || egl_headless > 1 || dbus > 1 ||
rdp > 1 || gtk > 1) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("only 1 graphics device of each type (sdl, vnc, spice,
headless, dbus, rdp) is supported"));
return -1;
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 52da234343..f96c926424 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -4104,6 +4104,7 @@ qemuDomainDefSuggestDefaultAudioBackend(virQEMUDriver *driver,
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
break;
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
default:
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index a34d6f1437..da22681053 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -14837,6 +14837,7 @@ qemuDomainOpenGraphics(virDomainPtr dom,
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Can only open VNC, SPICE or D-Bus p2p graphics backends,
not %1$s"),
virDomainGraphicsTypeToString(vm->def->graphics[idx]->type));
@@ -14908,6 +14909,7 @@ qemuDomainOpenGraphicsFD(virDomainPtr dom,
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Can only open VNC, SPICE or D-Bus p2p graphics backends,
not %1$s"),
virDomainGraphicsTypeToString(vm->def->graphics[idx]->type));
diff --git a/src/qemu/qemu_extdevice.c b/src/qemu/qemu_extdevice.c
index 31c7a14156..f6888acf2f 100644
--- a/src/qemu/qemu_extdevice.c
+++ b/src/qemu/qemu_extdevice.c
@@ -256,6 +256,7 @@ qemuExtDevicesStart(virQEMUDriver *driver,
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
default:
continue;
@@ -339,6 +340,7 @@ qemuExtDevicesStop(virQEMUDriver *driver,
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
default:
continue;
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 5326aba281..d67c407309 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -4688,6 +4688,7 @@ qemuDomainChangeGraphics(virQEMUDriver *driver,
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unable to change config on '%1$s' graphics
type"), type);
break;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 1af91c5909..b61240b653 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3005,6 +3005,7 @@ qemuProcessInitPasswords(virQEMUDriver *driver,
cfg->rdpUsername, cfg->rdpPassword, asyncJob);
break;
case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
@@ -5065,6 +5066,7 @@ qemuProcessGraphicsReservePorts(virDomainGraphicsDef *graphics,
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -5109,6 +5111,7 @@ qemuProcessGraphicsAllocatePorts(virQEMUDriver *driver,
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -5280,6 +5283,7 @@ qemuProcessGraphicsSetupListen(virQEMUDriver *driver,
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -5359,6 +5363,9 @@ qemuProcessGraphicsSetupRenderNode(virDomainGraphicsDef *graphics,
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
rendernode = &graphics->data.dbus.rendernode;
break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
+ rendernode = &graphics->data.gtk.rendernode;
+ break;
case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
@@ -5571,6 +5578,7 @@ qemuProcessStartValidateGraphics(virDomainObj *vm)
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index b2c3c9e2f6..be92785d71 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -4523,6 +4523,17 @@ qemuValidateDomainDeviceDefRDPGraphics(const virDomainGraphicsDef
*graphics)
}
+static int
+qemuValidateDomainDeviceDefGTKGraphics(const virDomainGraphicsDef *graphics
G_GNUC_UNUSED,
+ virQEMUCaps *qemuCaps G_GNUC_UNUSED)
+{
+ /* TODO: OpenGL check */
+ /* For now it's not possible to check if gtk-gl capability is available in QEMU
*/
+ /* Add cappability check later when will be possible to gather the capability from
QEMU */
+ return 0;
+}
+
+
static int
qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef *graphics,
const virDomainDef *def,
@@ -4600,6 +4611,11 @@ qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef
*graphics,
return -1;
break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
+ if (qemuValidateDomainDeviceDefGTKGraphics(graphics, qemuCaps) < 0)
+ return -1;
+
+ break;
case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c
index e3802c18be..d3de4ea4d1 100644
--- a/src/security/virt-aa-helper.c
+++ b/src/security/virt-aa-helper.c
@@ -1037,6 +1037,12 @@ get_files(vahControl * ctl)
"r") != 0)
goto cleanup;
+ if (ctl->def->ngraphics == 1 &&
+ ctl->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_GTK)
+ if (vah_add_file(&buf, ctl->def->graphics[0]->data.gtk.xauth,
+ "r") != 0)
+ goto cleanup;
+
for (i = 0; i < ctl->def->nhostdevs; i++)
if (ctl->def->hostdevs[i]) {
virDomainHostdevDef *dev = ctl->def->hostdevs[i];
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index 0dd03c1a88..74d90ec77a 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -3527,6 +3527,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOption *xmlopt,
virDomainDef
case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Unsupported graphics type '%1$s'"),
virDomainGraphicsTypeToString(def->graphics[i]->type));
diff --git a/tests/domaincapsdata/qemu_10.0.0.s390x.xml
b/tests/domaincapsdata/qemu_10.0.0.s390x.xml
index d66240307e..a81db8e950 100644
--- a/tests/domaincapsdata/qemu_10.0.0.s390x.xml
+++ b/tests/domaincapsdata/qemu_10.0.0.s390x.xml
@@ -256,6 +256,7 @@
<value>rdp</value>
<value>egl-headless</value>
<value>dbus</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/domaincapsdata/qemu_7.0.0.ppc64.xml
b/tests/domaincapsdata/qemu_7.0.0.ppc64.xml
index 52c73d10a4..e840a0e488 100644
--- a/tests/domaincapsdata/qemu_7.0.0.ppc64.xml
+++ b/tests/domaincapsdata/qemu_7.0.0.ppc64.xml
@@ -77,6 +77,7 @@
<value>sdl</value>
<value>vnc</value>
<value>egl-headless</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/domaincapsdata/qemu_7.1.0.ppc64.xml
b/tests/domaincapsdata/qemu_7.1.0.ppc64.xml
index ca0bc6f0b5..235e851e86 100644
--- a/tests/domaincapsdata/qemu_7.1.0.ppc64.xml
+++ b/tests/domaincapsdata/qemu_7.1.0.ppc64.xml
@@ -70,6 +70,7 @@
<graphics supported='yes'>
<enum name='type'>
<value>vnc</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/domaincapsdata/qemu_7.2.0.ppc.xml
b/tests/domaincapsdata/qemu_7.2.0.ppc.xml
index 21dbe730c5..ae379b863e 100644
--- a/tests/domaincapsdata/qemu_7.2.0.ppc.xml
+++ b/tests/domaincapsdata/qemu_7.2.0.ppc.xml
@@ -69,6 +69,7 @@
<value>spice</value>
<value>egl-headless</value>
<value>dbus</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml
b/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml
index 18979cf280..3ac273e119 100644
--- a/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml
+++ b/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml
@@ -75,6 +75,7 @@
<value>rdp</value>
<value>spice</value>
<value>dbus</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml
b/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml
index ce17865e24..98346d23d3 100644
--- a/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml
+++ b/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml
@@ -123,6 +123,7 @@
<value>rdp</value>
<value>egl-headless</value>
<value>dbus</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml
b/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml
index 8f4ebbc107..b6d0f4d455 100644
--- a/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml
+++ b/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml
@@ -79,6 +79,7 @@
<value>rdp</value>
<value>spice</value>
<value>dbus</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/domaincapsdata/qemu_8.2.0.aarch64.xml
b/tests/domaincapsdata/qemu_8.2.0.aarch64.xml
index ce17865e24..98346d23d3 100644
--- a/tests/domaincapsdata/qemu_8.2.0.aarch64.xml
+++ b/tests/domaincapsdata/qemu_8.2.0.aarch64.xml
@@ -123,6 +123,7 @@
<value>rdp</value>
<value>egl-headless</value>
<value>dbus</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/domaincapsdata/qemu_8.2.0.armv7l.xml
b/tests/domaincapsdata/qemu_8.2.0.armv7l.xml
index ee653c0c49..77d90635cd 100644
--- a/tests/domaincapsdata/qemu_8.2.0.armv7l.xml
+++ b/tests/domaincapsdata/qemu_8.2.0.armv7l.xml
@@ -73,6 +73,7 @@
<value>spice</value>
<value>egl-headless</value>
<value>dbus</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/domaincapsdata/qemu_9.0.0.sparc.xml
b/tests/domaincapsdata/qemu_9.0.0.sparc.xml
index c7862f5842..396b40e221 100644
--- a/tests/domaincapsdata/qemu_9.0.0.sparc.xml
+++ b/tests/domaincapsdata/qemu_9.0.0.sparc.xml
@@ -64,6 +64,7 @@
<value>spice</value>
<value>egl-headless</value>
<value>dbus</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/domaincapsdata/qemu_9.1.0.s390x.xml
b/tests/domaincapsdata/qemu_9.1.0.s390x.xml
index b73e0d0688..e6345ebffb 100644
--- a/tests/domaincapsdata/qemu_9.1.0.s390x.xml
+++ b/tests/domaincapsdata/qemu_9.1.0.s390x.xml
@@ -208,6 +208,7 @@
<value>rdp</value>
<value>egl-headless</value>
<value>dbus</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/domaincapsdata/qemu_9.2.0.s390x.xml
b/tests/domaincapsdata/qemu_9.2.0.s390x.xml
index 605a3af5c7..3dac7c0462 100644
--- a/tests/domaincapsdata/qemu_9.2.0.s390x.xml
+++ b/tests/domaincapsdata/qemu_9.2.0.s390x.xml
@@ -208,6 +208,7 @@
<value>rdp</value>
<value>egl-headless</value>
<value>dbus</value>
+ <value>gtk</value>
</enum>
</graphics>
<video supported='yes'>
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
index be2e91ed92..078f5cea12 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
@@ -133,6 +133,7 @@
<flag name='migrate-incoming.exit-on-error'/>
<flag name='virtio-mem-ccw'/>
<flag name='shim'/>
+ <flag name='gtk'/>
<version>9002050</version>
<microcodeVersion>39100285</microcodeVersion>
<package>v9.2.0-1203-gd6430c17d7</package>
diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml
b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml
index d78c239372..6dc012bcff 100644
--- a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml
+++ b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml
@@ -149,6 +149,7 @@
<flag name='usb-mtp'/>
<flag name='netdev.user'/>
<flag name='acpi-erst'/>
+ <flag name='gtk'/>
<version>7000000</version>
<microcodeVersion>42900243</microcodeVersion>
<package>v7.0.0</package>
diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml
b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml
index d6edb65e96..97728e0141 100644
--- a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml
+++ b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml
@@ -150,6 +150,7 @@
<flag name='usb-mtp'/>
<flag name='netdev.user'/>
<flag name='acpi-erst'/>
+ <flag name='gtk'/>
<version>7001000</version>
<microcodeVersion>42900244</microcodeVersion>
<package>v7.1.0</package>
diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml
b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml
index fe318e0a52..bf9a38e123 100644
--- a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml
+++ b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml
@@ -145,6 +145,7 @@
<flag name='usb-mtp'/>
<flag name='netdev.user'/>
<flag name='acpi-erst'/>
+ <flag name='gtk'/>
<version>7002000</version>
<microcodeVersion>0</microcodeVersion>
<package>qemu-7.2.0-6.fc37</package>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
index 837502c336..d21b2cfddb 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
@@ -160,6 +160,7 @@
<flag name='virtio-sound'/>
<flag name='netdev.user'/>
<flag name='acpi-erst'/>
+ <flag name='gtk'/>
<version>8002000</version>
<microcodeVersion>61700246</microcodeVersion>
<package>v8.2.0</package>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
index f062f31abc..14013d1c1e 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
@@ -167,6 +167,7 @@
<flag name='virtio-sound'/>
<flag name='netdev.user'/>
<flag name='acpi-erst'/>
+ <flag name='gtk'/>
<version>8002000</version>
<microcodeVersion>0</microcodeVersion>
<package>qemu-8.2.0-7.fc39</package>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml
b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml
index 2a37631381..37e8dbe371 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml
@@ -150,6 +150,7 @@
<flag name='virtio-sound'/>
<flag name='netdev.user'/>
<flag name='acpi-erst'/>
+ <flag name='gtk'/>
<version>8002000</version>
<microcodeVersion>106300246</microcodeVersion>
<package>v8.2.0</package>
diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
index 38835ba0cb..703ec9a5a8 100644
--- a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
+++ b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
@@ -70,6 +70,7 @@
<flag name='blockjob.backing-mask-protocol'/>
<flag name='display-reload'/>
<flag name='netdev.user'/>
+ <flag name='gtk'/>
<version>9000000</version>
<microcodeVersion>0</microcodeVersion>
<package>qemu-9.0.0-1.fc40</package>
diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
index 0d566d13d5..d046779f9a 100644
--- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
@@ -125,6 +125,7 @@
<flag name='netdev.user'/>
<flag name='query-cpu-model-expansion.deprecated-props'/>
<flag name='migrate-incoming.exit-on-error'/>
+ <flag name='gtk'/>
<version>9001000</version>
<microcodeVersion>39100246</microcodeVersion>
<package>v9.1.0</package>
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
index e1323f9b72..9b201aca19 100644
--- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
@@ -128,6 +128,7 @@
<flag name='netdev-stream-reconnect-miliseconds'/>
<flag name='query-cpu-model-expansion.deprecated-props'/>
<flag name='migrate-incoming.exit-on-error'/>
+ <flag name='gtk'/>
<version>9002000</version>
<microcodeVersion>39100247</microcodeVersion>
<package>v9.2.0</package>
--
2.49.0