diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index c4077c6868..da059f9aac 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -6437,6 +6437,13 @@ A video device. :since:`since 1.3.3` ) extends secondary bar and makes it addressable as 64bit memory. + :since:`Since 9.2.0` (QEMU driver only), devices with type "virtio" have an + optional ``blob`` attribute that can be set to "on" or "off". Setting + ``blob`` to "on" will enable the use of blob resources in the device. This + can accelerate the display path by reducing or eliminating copying of pixel + data between the guest and host. Note that blob resource support requires + QEMU version 6.1 or newer. + :since:`Since 5.9.0` , the ``model`` element may also have an optional ``resolution`` sub-element. The ``resolution`` element has attributes ``x`` and ``y`` to set the minimum resolution for the video device. This diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8dbab41db8..be1ce1cc53 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -12904,6 +12904,9 @@ virDomainVideoModelDefParseXML(virDomainVideoDef *def, if (virXMLPropUIntDefault(node, "heads", 10, VIR_XML_PROP_NONE, &def->heads, 1) < 0) return -1; + if (virXMLPropTristateSwitch(node, "blob", VIR_XML_PROP_NONE, &def->blob) < 0) + return -1; + return 0; } @@ -25280,6 +25283,8 @@ virDomainVideoDefFormat(virBuffer *buf, virBufferAsprintf(buf, " heads='%u'", def->heads); if (def->primary) virBufferAddLit(buf, " primary='yes'"); + if (def->blob != VIR_TRISTATE_SWITCH_ABSENT) + virBufferAsprintf(buf, " blob='%s'", virTristateSwitchTypeToString(def->blob)); if (def->accel || def->res) { virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index f5624a0162..5a2c70f012 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1824,6 +1824,7 @@ struct _virDomainVideoDef { bool primary; virDomainVideoAccelDef *accel; virDomainVideoResolutionDef *res; + virTristateSwitch blob; virDomainVideoDriverDef *driver; virDomainDeviceInfo info; virDomainVirtioOptions *virtio; diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index db13e56107..5fb2d4971c 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -225,9 +225,16 @@ virDomainVideoDefValidate(const virDomainVideoDef *video, } } - if (video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO && - (virDomainCheckVirtioOptionsAreAbsent(video->virtio) < 0)) - return -1; + if (video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO) { + if (virDomainCheckVirtioOptionsAreAbsent(video->virtio) < 0) + return -1; + if (video->blob != VIR_TRISTATE_SWITCH_ABSENT) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("video type '%s' does not support blob resources"), + virDomainVideoTypeToString(video->type)); + return -1; + } + } return 0; } diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index 790bba0f7f..d9373977a8 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -4499,6 +4499,11 @@ + + + + +