提交 72862797 编写于 作者: J Julio Faracco 提交者: Cole Robinson

conf: Add 'x' and 'y' resolution into video XML definition

This commit adds resolution element with parameters 'x' and 'y' into video
XML domain group definition. Both, properties were added into an element
called 'resolution' and it was added inside 'model' element. They are set
as optional. This element does not follow QEMU properties 'xres' and
'yres' format. Both HTML documentation and schema were changed too. This
commit includes a simple test case to cover resolution for QEMU video
models. The new XML format for resolution looks like:

    <model ...>
      <resolution x='800' y='600'/>
    </model>
Reviewed-by: NCole Robinson <crobinso@redhat.com>
Signed-off-by: NJulio Faracco <jcfaracco@gmail.com>
上级 fbf7c23c
...@@ -7077,7 +7077,10 @@ qemu-kvm -net nic,model=? /dev/null ...@@ -7077,7 +7077,10 @@ qemu-kvm -net nic,model=? /dev/null
<code>vgamem</code> (<span class="since">since 1.2.11</span>) to set <code>vgamem</code> (<span class="since">since 1.2.11</span>) to set
the size of VGA framebuffer for fallback mode of QXL device. the size of VGA framebuffer for fallback mode of QXL device.
Attribute <code>vram64</code> (<span class="since">since 1.3.3</span>) Attribute <code>vram64</code> (<span class="since">since 1.3.3</span>)
extends secondary bar and makes it addressable as 64bit memory. extends secondary bar and makes it addressable as 64bit memory. For
resolution settings, there are <code>x</code> and <code>y</code>
(<span class="since">since 5.9.0</span>) optional attributes to set
minimum resolution for model.
</p> </p>
</dd> </dd>
......
...@@ -3656,6 +3656,16 @@ ...@@ -3656,6 +3656,16 @@
</optional> </optional>
</element> </element>
</optional> </optional>
<optional>
<element name="resolution">
<attribute name="x">
<ref name="unsignedInt"/>
</attribute>
<attribute name="y">
<ref name="unsignedInt"/>
</attribute>
</element>
</optional>
</element> </element>
</optional> </optional>
<optional> <optional>
......
...@@ -15345,6 +15345,52 @@ virDomainVideoAccelDefParseXML(xmlNodePtr node) ...@@ -15345,6 +15345,52 @@ virDomainVideoAccelDefParseXML(xmlNodePtr node)
return def; return def;
} }
static virDomainVideoResolutionDefPtr
virDomainVideoResolutionDefParseXML(xmlNodePtr node)
{
xmlNodePtr cur;
virDomainVideoResolutionDefPtr def;
g_autofree char *x = NULL;
g_autofree char *y = NULL;
cur = node->children;
while (cur != NULL) {
if (cur->type == XML_ELEMENT_NODE) {
if (!x && !y &&
virXMLNodeNameEqual(cur, "resolution")) {
x = virXMLPropString(cur, "x");
y = virXMLPropString(cur, "y");
}
}
cur = cur->next;
}
if (!x || !y)
return NULL;
if (VIR_ALLOC(def) < 0)
goto cleanup;
if (x) {
if (virStrToLong_uip(x, NULL, 10, &def->x) < 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("cannot parse video x-resolution '%s'"), x);
goto cleanup;
}
}
if (y) {
if (virStrToLong_uip(y, NULL, 10, &def->y) < 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("cannot parse video y-resolution '%s'"), y);
goto cleanup;
}
}
cleanup:
return def;
}
static virDomainVideoDriverDefPtr static virDomainVideoDriverDefPtr
virDomainVideoDriverDefParseXML(xmlNodePtr node) virDomainVideoDriverDefParseXML(xmlNodePtr node)
{ {
...@@ -15424,6 +15470,7 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -15424,6 +15470,7 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt,
} }
def->accel = virDomainVideoAccelDefParseXML(cur); def->accel = virDomainVideoAccelDefParseXML(cur);
def->res = virDomainVideoResolutionDefParseXML(cur);
} }
if (virXMLNodeNameEqual(cur, "driver")) { if (virXMLNodeNameEqual(cur, "driver")) {
if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0) if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
...@@ -26515,6 +26562,18 @@ virDomainVideoAccelDefFormat(virBufferPtr buf, ...@@ -26515,6 +26562,18 @@ virDomainVideoAccelDefFormat(virBufferPtr buf,
virBufferAddLit(buf, "/>\n"); virBufferAddLit(buf, "/>\n");
} }
static void
virDomainVideoResolutionDefFormat(virBufferPtr buf,
virDomainVideoResolutionDefPtr def)
{
virBufferAddLit(buf, "<resolution");
if (def->x && def->y) {
virBufferAsprintf(buf, " x='%u' y='%u'",
def->x, def->y);
}
virBufferAddLit(buf, "/>\n");
}
static int static int
virDomainVideoDefFormat(virBufferPtr buf, virDomainVideoDefFormat(virBufferPtr buf,
virDomainVideoDefPtr def, virDomainVideoDefPtr def,
...@@ -26562,11 +26621,13 @@ virDomainVideoDefFormat(virBufferPtr buf, ...@@ -26562,11 +26621,13 @@ virDomainVideoDefFormat(virBufferPtr buf,
virBufferAsprintf(buf, " heads='%u'", def->heads); virBufferAsprintf(buf, " heads='%u'", def->heads);
if (def->primary) if (def->primary)
virBufferAddLit(buf, " primary='yes'"); virBufferAddLit(buf, " primary='yes'");
if (def->accel) { if (def->accel || def->res) {
virBufferAddLit(buf, ">\n"); virBufferAddLit(buf, ">\n");
virBufferAdjustIndent(buf, 2); virBufferAdjustIndent(buf, 2);
if (def->accel) if (def->accel)
virDomainVideoAccelDefFormat(buf, def->accel); virDomainVideoAccelDefFormat(buf, def->accel);
if (def->res)
virDomainVideoResolutionDefFormat(buf, def->res);
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</model>\n"); virBufferAddLit(buf, "</model>\n");
} else { } else {
......
...@@ -1421,6 +1421,10 @@ struct _virDomainVideoAccelDef { ...@@ -1421,6 +1421,10 @@ struct _virDomainVideoAccelDef {
char *rendernode; char *rendernode;
}; };
struct _virDomainVideoResolutionDef {
unsigned int x;
unsigned int y;
};
struct _virDomainVideoDriverDef { struct _virDomainVideoDriverDef {
virDomainVideoVGAConf vgaconf; virDomainVideoVGAConf vgaconf;
...@@ -1438,6 +1442,7 @@ struct _virDomainVideoDef { ...@@ -1438,6 +1442,7 @@ struct _virDomainVideoDef {
unsigned int heads; unsigned int heads;
bool primary; bool primary;
virDomainVideoAccelDefPtr accel; virDomainVideoAccelDefPtr accel;
virDomainVideoResolutionDefPtr res;
virDomainVideoDriverDefPtr driver; virDomainVideoDriverDefPtr driver;
virDomainDeviceInfo info; virDomainDeviceInfo info;
virDomainVirtioOptionsPtr virtio; virDomainVirtioOptionsPtr virtio;
......
...@@ -324,6 +324,9 @@ typedef virDomainVcpuDef *virDomainVcpuDefPtr; ...@@ -324,6 +324,9 @@ typedef virDomainVcpuDef *virDomainVcpuDefPtr;
typedef struct _virDomainVideoAccelDef virDomainVideoAccelDef; typedef struct _virDomainVideoAccelDef virDomainVideoAccelDef;
typedef virDomainVideoAccelDef *virDomainVideoAccelDefPtr; typedef virDomainVideoAccelDef *virDomainVideoAccelDefPtr;
typedef struct _virDomainVideoResolutionDef virDomainVideoResolutionDef;
typedef virDomainVideoResolutionDef *virDomainVideoResolutionDefPtr;
typedef struct _virDomainVideoDef virDomainVideoDef; typedef struct _virDomainVideoDef virDomainVideoDef;
typedef virDomainVideoDef *virDomainVideoDefPtr; typedef virDomainVideoDef *virDomainVideoDefPtr;
......
LC_ALL=C \
PATH=/bin \
HOME=/tmp/lib/domain--1-QEMUGuest1 \
USER=test \
LOGNAME=test \
XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \
XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \
XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-i686 \
-name QEMUGuest1 \
-S \
-machine pc,accel=tcg,usb=off,dump-guest-core=off \
-m 214 \
-realtime mlock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
-display none \
-no-user-config \
-nodefaults \
-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
server,nowait \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=utc \
-no-shutdown \
-no-acpi \
-usb \
-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
-device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vgamem_mb=8,\
bus=pci.0,addr=0x2 \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
<domain type='qemu'>
<name>QEMUGuest1</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<memory unit='KiB'>219136</memory>
<currentMemory unit='KiB'>219136</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='i686' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-i686</emulator>
<disk type='block' device='disk'>
<driver name='qemu' type='raw'/>
<source dev='/dev/HostVG/QEMUGuest1'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='8192' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</memballoon>
</devices>
</domain>
...@@ -2056,6 +2056,10 @@ mymain(void) ...@@ -2056,6 +2056,10 @@ mymain(void)
QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_DEVICE_VIDEO_PRIMARY,
QEMU_CAPS_DEVICE_QXL, QEMU_CAPS_DEVICE_QXL,
QEMU_CAPS_QXL_MAX_OUTPUTS); QEMU_CAPS_QXL_MAX_OUTPUTS);
DO_TEST("video-qxl-resolution",
QEMU_CAPS_DEVICE_VIDEO_PRIMARY,
QEMU_CAPS_DEVICE_QXL,
QEMU_CAPS_QXL_VGAMEM);
DO_TEST("video-virtio-gpu-device", DO_TEST("video-virtio-gpu-device",
QEMU_CAPS_DEVICE_VIRTIO_GPU, QEMU_CAPS_DEVICE_VIRTIO_GPU,
QEMU_CAPS_DEVICE_VIDEO_PRIMARY); QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
......
<domain type='qemu'>
<name>QEMUGuest1</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<memory unit='KiB'>219136</memory>
<currentMemory unit='KiB'>219136</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='i686' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-i686</emulator>
<disk type='block' device='disk'>
<driver name='qemu' type='raw'/>
<source dev='/dev/HostVG/QEMUGuest1'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='8192' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</memballoon>
</devices>
</domain>
...@@ -1210,6 +1210,7 @@ mymain(void) ...@@ -1210,6 +1210,7 @@ mymain(void)
QEMU_CAPS_DEVICE_QXL); QEMU_CAPS_DEVICE_QXL);
DO_TEST("video-qxl-heads", NONE); DO_TEST("video-qxl-heads", NONE);
DO_TEST("video-qxl-noheads", NONE); DO_TEST("video-qxl-noheads", NONE);
DO_TEST("video-qxl-resolution", NONE);
DO_TEST("video-virtio-gpu-secondary", NONE); DO_TEST("video-virtio-gpu-secondary", NONE);
DO_TEST("video-virtio-gpu-ccw", DO_TEST("video-virtio-gpu-ccw",
QEMU_CAPS_CCW, QEMU_CAPS_CCW,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册