diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index b845a8aa0e..292e032a66 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -3500,7 +3500,11 @@ qemu-kvm -net nic,model=? /dev/null
will add a default video
according to the guest type.
For a guest of type "kvm", the default video
for it is:
type
with value "cirrus", vram
with value
- "9216", and heads
with value "1".
+ "9216", and heads
with value "1". By default, the first
+ video device in domain xml is the primary one, but the optional
+ attribute primary
(since 1.0.2)
+ with value 'yes' can be used to mark the primary in cases of mutiple
+ video device. The non-primary must be type of "qxl".
model
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 14344e2029..cdc511568e 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2259,6 +2259,14 @@
+
+
+
+ yes
+ no
+
+
+
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 12eeb5ee80..19af0584f4 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -7275,6 +7275,7 @@ virDomainVideoDefParseXML(const xmlNodePtr node,
char *type = NULL;
char *heads = NULL;
char *vram = NULL;
+ char *primary = NULL;
if (VIR_ALLOC(def) < 0) {
virReportOOMError();
@@ -7289,6 +7290,11 @@ virDomainVideoDefParseXML(const xmlNodePtr node,
type = virXMLPropString(cur, "type");
vram = virXMLPropString(cur, "vram");
heads = virXMLPropString(cur, "heads");
+
+ if ((primary = virXMLPropString(cur, "primary")) != NULL)
+ if (STREQ(primary, "yes"))
+ def->primary = 1;
+
def->accel = virDomainVideoAccelDefParseXML(cur);
}
}
@@ -8709,6 +8715,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
xmlNodePtr cur;
bool usb_none = false;
bool usb_other = false;
+ bool primaryVideo = false;
if (VIR_ALLOC(def) < 0) {
virReportOOMError();
@@ -9996,12 +10003,28 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
if (n && VIR_ALLOC_N(def->videos, n) < 0)
goto no_memory;
for (i = 0 ; i < n ; i++) {
+ size_t ii = def->nvideos;
virDomainVideoDefPtr video = virDomainVideoDefParseXML(nodes[i],
def,
flags);
if (!video)
goto error;
- def->videos[def->nvideos++] = video;
+
+ if (video->primary) {
+ if (primaryVideo) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Only one primary video device is supported"));
+ goto error;
+ }
+
+ ii = 0;
+ primaryVideo = true;
+ }
+ if (VIR_INSERT_ELEMENT_INPLACE(def->videos,
+ ii,
+ def->nvideos,
+ video) < 0)
+ goto error;
}
VIR_FREE(nodes);
@@ -13151,6 +13174,8 @@ virDomainVideoDefFormat(virBufferPtr buf,
virBufferAsprintf(buf, " vram='%u'", def->vram);
if (def->heads)
virBufferAsprintf(buf, " heads='%u'", def->heads);
+ if (def->primary)
+ virBufferAddLit(buf, " primary='yes'");
if (def->accel) {
virBufferAddLit(buf, ">\n");
virDomainVideoAccelDefFormat(buf, def->accel);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index e6659cd038..bc9ef88864 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1121,6 +1121,7 @@ struct _virDomainVideoDef {
int type;
unsigned int vram;
unsigned int heads;
+ bool primary;
virDomainVideoAccelDefPtr accel;
virDomainDeviceInfo info;
};