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 @@
+
+
+
+
+