video device in domain xml is the primary one, but the optional
attribute <code>primary</code> (<span class="since">since 1.0.2</span>)
with value 'yes' can be used to mark the primary in cases of mutiple
- video device. The non-primary must be type of "qxl".
+ video device. The non-primary must be type of "qxl". The optional
+ attribute <code>ram</code> (<span class="since">since
+ 1.0.2</span>) is allowed for "qxl" type only and specifies
+ the size of the primary bar, while <code>vram</code> specifies the
+ secondary bar size. If "ram" is not supplied a default value is used.
</dd>
<dt><code>model</code></dt>
</define>
<!--
A video adapter description, allowing configuration of device
- model, number of virtual heads, and video ram size
+ model, number of virtual heads, video ram size, and for qxl
+ both ram bar sizes.
-->
<define name="video">
<element name="video">
<optional>
<element name="model">
- <attribute name="type">
- <choice>
- <value>vga</value>
- <value>cirrus</value>
- <value>vmvga</value>
- <value>xen</value>
- <value>vbox</value>
- <value>qxl</value>
- </choice>
- </attribute>
+ <choice>
+ <attribute name="type">
+ <choice>
+ <value>vga</value>
+ <value>cirrus</value>
+ <value>vmvga</value>
+ <value>xen</value>
+ <value>vbox</value>
+ </choice>
+ </attribute>
+ <group>
+ <attribute name="type">
+ <value>qxl</value>
+ </attribute>
+ <optional>
+ <attribute name="ram">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ </group>
+ </choice>
<optional>
<attribute name="vram">
<ref name="unsignedInt"/>
char *type = NULL;
char *heads = NULL;
char *vram = NULL;
+ char *ram = NULL;
char *primary = NULL;
if (VIR_ALLOC(def) < 0) {
cur = node->children;
while (cur != NULL) {
if (cur->type == XML_ELEMENT_NODE) {
- if (!type && !vram && !heads &&
+ if (!type && !vram && !ram && !heads &&
xmlStrEqual(cur->name, BAD_CAST "model")) {
type = virXMLPropString(cur, "type");
+ ram = virXMLPropString(cur, "ram");
vram = virXMLPropString(cur, "vram");
heads = virXMLPropString(cur, "heads");
}
}
+ if (ram) {
+ if (def->type != VIR_DOMAIN_VIDEO_TYPE_QXL) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("ram attribute only supported for type of qxl"));
+ goto error;
+ }
+ if (virStrToLong_ui(ram, NULL, 10, &def->ram) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("cannot parse video ram '%s'"), ram);
+ goto error;
+ }
+ } else if (def->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
+ def->ram = virDomainVideoDefaultRAM(dom, def->type);
+ }
+
if (vram) {
if (virStrToLong_ui(vram, NULL, 10, &def->vram) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
+ virReportError(VIR_ERR_XML_ERROR,
_("cannot parse video ram '%s'"), vram);
goto error;
}
goto error;
VIR_FREE(type);
+ VIR_FREE(ram);
VIR_FREE(vram);
VIR_FREE(heads);
virBufferAddLit(buf, " <video>\n");
virBufferAsprintf(buf, " <model type='%s'",
model);
+ if (def->ram)
+ virBufferAsprintf(buf, " ram='%u'", def->ram);
if (def->vram)
virBufferAsprintf(buf, " vram='%u'", def->vram);
if (def->heads)
/*
* domain_conf.h: domain XML processing
*
- * Copyright (C) 2006-2012 Red Hat, Inc.
+ * Copyright (C) 2006-2013 Red Hat, Inc.
* Copyright (C) 2006-2008 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
struct _virDomainVideoDef {
int type;
- unsigned int vram;
+ unsigned int ram; /* kibibytes (multiples of 1024) */
+ unsigned int vram; /* kibibytes (multiples of 1024) */
unsigned int heads;
bool primary;
virDomainVideoAccelDefPtr accel;
if (video->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
if (video->vram > (UINT_MAX / 1024)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ virReportError(VIR_ERR_OVERFLOW,
_("value for 'vram' must be less than '%u'"),
UINT_MAX / 1024);
goto error;
}
+ if (video->ram > (UINT_MAX / 1024)) {
+ virReportError(VIR_ERR_OVERFLOW,
+ _("value for 'ram' must be less than '%u'"),
+ UINT_MAX / 1024);
+ goto error;
+ }
+
+ /* QEMU accepts bytes for ram_size. */
+ virBufferAsprintf(&buf, ",ram_size=%u", video->ram * 1024);
/* QEMU accepts bytes for vram_size. */
virBufferAsprintf(&buf, ",vram_size=%u", video->vram * 1024);
virCommandAddArgList(cmd, "-vga", vgastr, NULL);
- if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
- if (def->videos[0]->vram &&
- qemuCapsGet(caps, QEMU_CAPS_DEVICE)) {
- if (def->videos[0]->vram > (UINT_MAX / 1024)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("value for 'vram' must be less than '%u'"),
- UINT_MAX / 1024);
- goto error;
- }
+ if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_QXL &&
+ (def->videos[0]->vram || def->videos[0]->ram) &&
+ qemuCapsGet(caps, QEMU_CAPS_DEVICE)) {
+ const char *dev = (qemuCapsGet(caps, QEMU_CAPS_DEVICE_QXL_VGA)
+ ? "qxl-vga" : "qxl");
+ int ram = def->videos[0]->ram;
+ int vram = def->videos[0]->vram;
+
+ if (vram > (UINT_MAX / 1024)) {
+ virReportError(VIR_ERR_OVERFLOW,
+ _("value for 'vram' must be less than '%u'"),
+ UINT_MAX / 1024);
+ goto error;
+ }
+ if (ram > (UINT_MAX / 1024)) {
+ virReportError(VIR_ERR_OVERFLOW,
+ _("value for 'ram' must be less than '%u'"),
+ UINT_MAX / 1024);
+ goto error;
+ }
+ if (ram) {
virCommandAddArg(cmd, "-global");
-
- if (qemuCapsGet(caps, QEMU_CAPS_DEVICE_QXL_VGA))
- virCommandAddArgFormat(cmd, "qxl-vga.vram_size=%u",
- def->videos[0]->vram * 1024);
- else
- virCommandAddArgFormat(cmd, "qxl.vram_size=%u",
- def->videos[0]->vram * 1024);
+ virCommandAddArgFormat(cmd, "%s.ram_size=%u",
+ dev, ram * 1024);
+ }
+ if (vram) {
+ virCommandAddArg(cmd, "-global");
+ virCommandAddArgFormat(cmd, "%s.vram_size=%u",
+ dev, vram * 1024);
}
}
}
else
vid->type = video;
vid->vram = virDomainVideoDefaultRAM(def, vid->type);
+ vid->ram = vid->type == VIR_DOMAIN_VIDEO_TYPE_QXL ?
+ virDomainVideoDefaultRAM(def, vid->type) : 0;
vid->heads = 1;
if (VIR_REALLOC_N(def->videos, def->nvideos+1) < 0) {
unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb -hda \
/dev/HostVG/QEMUGuest1 -spice port=5903,tls-port=5904,addr=127.0.0.1,\
x509-dir=/etc/pki/libvirt-spice,\
-image-compression=auto_glz,jpeg-wan-compression=auto,zlib-glz-wan-compression=auto,\
+image-compression=auto_glz,jpeg-wan-compression=auto,\
+zlib-glz-wan-compression=auto,\
playback-compression=on,streaming-video=filter -vga \
-qxl -global qxl.vram_size=18874368 -device qxl,id=video1,vram_size=33554432,bus=pci.0,addr=0x4 \
+qxl -global qxl.ram_size=67108864 -global qxl.vram_size=18874368 \
+-device qxl,id=video1,ram_size=67108864,vram_size=33554432,bus=pci.0,addr=0x4 \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
<streaming mode='filter'/>
</graphics>
<video>
- <model type='qxl' vram='18432' heads='1'/>
+ <model type='qxl' ram='65536' vram='18432' heads='1'/>
</video>
<video>
- <model type='qxl' vram='32768' heads='1'/>
+ <model type='qxl' ram='65536' vram='32768' heads='1'/>
</video>
<memballoon model='virtio'/>
</devices>
unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb -hda \
/dev/HostVG/QEMUGuest1 -spice port=5903,tls-port=5904,addr=127.0.0.1,\
x509-dir=/etc/pki/libvirt-spice,tls-channel=main,plaintext-channel=inputs -vga \
-qxl -global qxl-vga.vram_size=33554432 -device qxl,id=video1,vram_size=67108864,bus=pci.0,addr=0x4 \
+qxl -global qxl-vga.ram_size=67108864 -global qxl-vga.vram_size=33554432 \
+-device qxl,id=video1,ram_size=67108864,vram_size=67108864,bus=pci.0,addr=0x4 \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
<channel name='inputs' mode='insecure'/>
</graphics>
<video>
- <model type='qxl' vram='32768' heads='1'/>
+ <model type='qxl' ram='65536' vram='32768' heads='1'/>
</video>
<video>
- <model type='qxl' vram='65536' heads='1'/>
+ <model type='qxl' ram='65536' vram='65536' heads='1'/>
</video>
<memballoon model='virtio'/>
</devices>
x509-dir=/etc/pki/libvirt-spice,tls-channel=default,tls-channel=main,plaintext-channel=inputs,\
image-compression=auto_glz,jpeg-wan-compression=auto,zlib-glz-wan-compression=auto,\
playback-compression=on,streaming-video=filter,disable-copy-paste -vga \
-qxl -global qxl.vram_size=18874368 -device qxl,id=video1,vram_size=33554432,bus=pci.0,addr=0x4 \
+qxl -global qxl.ram_size=67108864 -global qxl.vram_size=18874368 \
+-device qxl,id=video1,ram_size=67108864,vram_size=33554432,bus=pci.0,addr=0x4 \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
<clipboard copypaste='no'/>
</graphics>
<video>
- <model type='qxl' vram='18432' heads='1'/>
+ <model type='qxl' ram='65536' vram='18432' heads='1'/>
</video>
<video>
- <model type='qxl' vram='32768' heads='1'/>
+ <model type='qxl' ram='65536' vram='32768' heads='1'/>
</video>
<memballoon model='virtio'/>
</devices>
-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
-usb \
-hda /var/lib/libvirt/images/QEMUGuest1 -vnc 127.0.0.1:-5900 \
--device qxl-vga,id=video0,vram_size=67108864,bus=pci.0,addr=0x3 \
--device qxl,id=video1,vram_size=67108864,bus=pci.0,addr=0x4 \
--device qxl,id=video2,vram_size=67108864,bus=pci.0,addr=0x5 \
+-device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,bus=pci.0,addr=0x3 \
+-device qxl,id=video1,ram_size=67108864,vram_size=67108864,bus=pci.0,addr=0x4 \
+-device qxl,id=video2,ram_size=67108864,vram_size=67108864,bus=pci.0,addr=0x5 \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2