<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 17, 2019 at 12:37 PM <<a href="mailto:jcfaracco@gmail.com">jcfaracco@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Julio Faracco <<a href="mailto:jcfaracco@gmail.com" target="_blank">jcfaracco@gmail.com</a>><br>
<br>
This commit adds resolution element with parameters 'x' and 'y' into video<br>
XML domain group definition. Both, properties were added into an element<br>
called 'resolution' and it was added inside 'model' element. They are set<br>
as optional. This element does not follow QEMU properties 'xres' and<br>
'yres' format. Both HTML documentation and schema were changed too. This<br>
commit includes a simple test case to cover resolution for QEMU video<br>
models. The new XML format for resolution looks like:<br>
<br>
    <model ...><br>
      <resolution x='800' y='600'/><br>
    </model><br></blockquote><div>Please mention that it could fix the bug:</div><div><a href="https://bugzilla.redhat.com/show_bug.cgi?id=1485793">https://bugzilla.redhat.com/show_bug.cgi?id=1485793</a> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Signed-off-by: Julio Faracco <<a href="mailto:jcfaracco@gmail.com" target="_blank">jcfaracco@gmail.com</a>><br>
---<br>
 docs/<a href="http://formatdomain.html.in" rel="noreferrer" target="_blank">formatdomain.html.in</a>                     |  5 +-<br>
 docs/schemas/domaincommon.rng                 | 10 +++<br>
 src/conf/domain_conf.c                        | 63 ++++++++++++++++++-<br>
 src/conf/domain_conf.h                        |  5 ++<br>
 src/conf/virconftypes.h                       |  3 +<br>
 .../video-qxl-resolution.args                 | 32 ++++++++++<br>
 .../qemuxml2argvdata/video-qxl-resolution.xml | 40 ++++++++++++<br>
 tests/qemuxml2argvtest.c                      |  4 ++<br>
 .../video-qxl-resolution.xml                  | 40 ++++++++++++<br>
 tests/qemuxml2xmltest.c                       |  1 +<br>
 10 files changed, 201 insertions(+), 2 deletions(-)<br>
 create mode 100644 tests/qemuxml2argvdata/video-qxl-resolution.args<br>
 create mode 100644 tests/qemuxml2argvdata/video-qxl-resolution.xml<br>
 create mode 100644 tests/qemuxml2xmloutdata/video-qxl-resolution.xml<br>
<br>
diff --git a/docs/<a href="http://formatdomain.html.in" rel="noreferrer" target="_blank">formatdomain.html.in</a> b/docs/<a href="http://formatdomain.html.in" rel="noreferrer" target="_blank">formatdomain.html.in</a><br>
index 500f114f41..962766b792 100644<br>
--- a/docs/<a href="http://formatdomain.html.in" rel="noreferrer" target="_blank">formatdomain.html.in</a><br>
+++ b/docs/<a href="http://formatdomain.html.in" rel="noreferrer" target="_blank">formatdomain.html.in</a><br>
@@ -7077,7 +7077,10 @@ qemu-kvm -net nic,model=? /dev/null<br>
           <code>vgamem</code> (<span class="since">since 1.2.11</span>) to set<br>
           the size of VGA framebuffer for fallback mode of QXL device.<br>
           Attribute <code>vram64</code> (<span class="since">since 1.3.3</span>)<br>
-          extends secondary bar and makes it addressable as 64bit memory.<br>
+          extends secondary bar and makes it addressable as 64bit memory. For<br>
+          resolution settings, there are <code>x</code> and <code>y</code><br>
+          (<span class="since">since 5.9.0</span>) optional attributes to set<br>
+          minimum resolution for model.<br>
         </p><br>
       </dd><br>
<br>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng<br>
index ead5a25068..e06f892da3 100644<br>
--- a/docs/schemas/domaincommon.rng<br>
+++ b/docs/schemas/domaincommon.rng<br>
@@ -3656,6 +3656,16 @@<br>
               </optional><br>
             </element><br>
           </optional><br>
+          <optional><br>
+            <element name="resolution"><br>
+              <attribute name="x"><br>
+                <ref name="unsignedInt"/><br>
+              </attribute><br>
+              <attribute name="y"><br>
+                <ref name="unsignedInt"/><br>
+              </attribute><br>
+            </element><br>
+          </optional><br>
         </element><br>
       </optional><br>
       <optional><br>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c<br>
index 2e6a113de3..88e93f6fb8 100644<br>
--- a/src/conf/domain_conf.c<br>
+++ b/src/conf/domain_conf.c<br>
@@ -15345,6 +15345,52 @@ virDomainVideoAccelDefParseXML(xmlNodePtr node)<br>
     return def;<br>
 }<br>
<br>
+static virDomainVideoResolutionDefPtr<br>
+virDomainVideoResolutionDefParseXML(xmlNodePtr node)<br>
+{<br>
+    xmlNodePtr cur;<br>
+    virDomainVideoResolutionDefPtr def;<br>
+    g_autofree char *x = NULL;<br>
+    g_autofree char *y = NULL;<br>
+<br>
+    cur = node->children;<br>
+    while (cur != NULL) {<br>
+        if (cur->type == XML_ELEMENT_NODE) {<br>
+            if (!x && !y &&<br>
+                virXMLNodeNameEqual(cur, "resolution")) {<br>
+                x = virXMLPropString(cur, "x");<br>
+                y = virXMLPropString(cur, "y");<br>
+            }<br>
+        }<br>
+        cur = cur->next;<br>
+    }<br>
+<br>
+    if (!x || !y)<br>
+        return NULL;<br>
+<br>
+    if (VIR_ALLOC(def) < 0)<br>
+        goto cleanup;<br>
+<br>
+    if (x) {<br>
+        if (virStrToLong_uip(x, NULL, 10, &def->x) < 0) {<br>
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
+                           _("cannot parse video x-resolution '%s'"), x);<br>
+            goto cleanup;<br>
+        }<br>
+    }<br>
+<br>
+    if (y) {<br>
+        if (virStrToLong_uip(y, NULL, 10, &def->y) < 0) {<br>
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
+                           _("cannot parse video y-resolution '%s'"), y);<br>
+            goto cleanup;<br>
+        }<br>
+    }<br>
+<br>
+ cleanup:<br>
+    return def;<br>
+}<br>
+<br>
 static virDomainVideoDriverDefPtr<br>
 virDomainVideoDriverDefParseXML(xmlNodePtr node)<br>
 {<br>
@@ -15424,6 +15470,7 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt,<br>
                 }<br>
<br>
                 def->accel = virDomainVideoAccelDefParseXML(cur);<br>
+                def->res = virDomainVideoResolutionDefParseXML(cur);<br>
             }<br>
             if (virXMLNodeNameEqual(cur, "driver")) {<br>
                 if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)<br>
@@ -26515,6 +26562,18 @@ virDomainVideoAccelDefFormat(virBufferPtr buf,<br>
     virBufferAddLit(buf, "/>\n");<br>
 }<br>
<br>
+static void<br>
+virDomainVideoResolutionDefFormat(virBufferPtr buf,<br>
+                                  virDomainVideoResolutionDefPtr def)<br>
+{<br>
+    virBufferAddLit(buf, "<resolution");<br>
+    if (def->x && def->y) {<br>
+        virBufferAsprintf(buf, " x='%u' y='%u'",<br>
+                          def->x, def->y);<br>
+    }<br>
+    virBufferAddLit(buf, "/>\n");<br>
+}<br>
+<br>
 static int<br>
 virDomainVideoDefFormat(virBufferPtr buf,<br>
                         virDomainVideoDefPtr def,<br>
@@ -26562,11 +26621,13 @@ virDomainVideoDefFormat(virBufferPtr buf,<br>
         virBufferAsprintf(buf, " heads='%u'", def->heads);<br>
     if (def->primary)<br>
         virBufferAddLit(buf, " primary='yes'");<br>
-    if (def->accel) {<br>
+    if (def->accel || def->res) {<br>
         virBufferAddLit(buf, ">\n");<br>
         virBufferAdjustIndent(buf, 2);<br>
         if (def->accel)<br>
             virDomainVideoAccelDefFormat(buf, def->accel);<br>
+        if (def->res)<br>
+            virDomainVideoResolutionDefFormat(buf, def->res);<br>
         virBufferAdjustIndent(buf, -2);<br>
         virBufferAddLit(buf, "</model>\n");<br>
     } else {<br>
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h<br>
index edac6250e4..b33e5334f4 100644<br>
--- a/src/conf/domain_conf.h<br>
+++ b/src/conf/domain_conf.h<br>
@@ -1421,6 +1421,10 @@ struct _virDomainVideoAccelDef {<br>
     char *rendernode;<br>
 };<br>
<br>
+struct _virDomainVideoResolutionDef {<br>
+    unsigned int x;<br>
+    unsigned int y;<br>
+};<br>
<br>
 struct _virDomainVideoDriverDef {<br>
    virDomainVideoVGAConf vgaconf;<br>
@@ -1438,6 +1442,7 @@ struct _virDomainVideoDef {<br>
     unsigned int heads;<br>
     bool primary;<br>
     virDomainVideoAccelDefPtr accel;<br>
+    virDomainVideoResolutionDefPtr res;<br>
     virDomainVideoDriverDefPtr driver;<br>
     virDomainDeviceInfo info;<br>
     virDomainVirtioOptionsPtr virtio;<br>
diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h<br>
index a15cfb5f9e..462842f324 100644<br>
--- a/src/conf/virconftypes.h<br>
+++ b/src/conf/virconftypes.h<br>
@@ -324,6 +324,9 @@ typedef virDomainVcpuDef *virDomainVcpuDefPtr;<br>
 typedef struct _virDomainVideoAccelDef virDomainVideoAccelDef;<br>
 typedef virDomainVideoAccelDef *virDomainVideoAccelDefPtr;<br>
<br>
+typedef struct _virDomainVideoResolutionDef virDomainVideoResolutionDef;<br>
+typedef virDomainVideoResolutionDef *virDomainVideoResolutionDefPtr;<br>
+<br>
 typedef struct _virDomainVideoDef virDomainVideoDef;<br>
 typedef virDomainVideoDef *virDomainVideoDefPtr;<br>
<br>
diff --git a/tests/qemuxml2argvdata/video-qxl-resolution.args b/tests/qemuxml2argvdata/video-qxl-resolution.args<br>
new file mode 100644<br>
index 0000000000..1dbcd660f1<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/video-qxl-resolution.args<br>
@@ -0,0 +1,32 @@<br>
+LC_ALL=C \<br>
+PATH=/bin \<br>
+HOME=/tmp/lib/domain--1-QEMUGuest1 \<br>
+USER=test \<br>
+LOGNAME=test \<br>
+XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \<br>
+XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \<br>
+XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \<br>
+QEMU_AUDIO_DRV=none \<br>
+/usr/bin/qemu-system-i686 \<br>
+-name QEMUGuest1 \<br>
+-S \<br>
+-machine pc,accel=tcg,usb=off,dump-guest-core=off \<br>
+-m 214 \<br>
+-realtime mlock=off \<br>
+-smp 1,sockets=1,cores=1,threads=1 \<br>
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \<br>
+-display none \<br>
+-no-user-config \<br>
+-nodefaults \<br>
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\<br>
+server,nowait \<br>
+-mon chardev=charmonitor,id=monitor,mode=control \<br>
+-rtc base=utc \<br>
+-no-shutdown \<br>
+-no-acpi \<br>
+-usb \<br>
+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \<br>
+-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \<br>
+-device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vgamem_mb=8,\<br>
+bus=pci.0,addr=0x2 \<br>
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3<br>
diff --git a/tests/qemuxml2argvdata/video-qxl-resolution.xml b/tests/qemuxml2argvdata/video-qxl-resolution.xml<br>
new file mode 100644<br>
index 0000000000..6ba2817002<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/video-qxl-resolution.xml<br>
@@ -0,0 +1,40 @@<br>
+<domain type='qemu'><br>
+  <name>QEMUGuest1</name><br>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid><br>
+  <memory unit='KiB'>219136</memory><br>
+  <currentMemory unit='KiB'>219136</currentMemory><br>
+  <vcpu placement='static'>1</vcpu><br>
+  <os><br>
+    <type arch='i686' machine='pc'>hvm</type><br>
+    <boot dev='hd'/><br>
+  </os><br>
+  <clock offset='utc'/><br>
+  <on_poweroff>destroy</on_poweroff><br>
+  <on_reboot>restart</on_reboot><br>
+  <on_crash>destroy</on_crash><br>
+  <devices><br>
+    <emulator>/usr/bin/qemu-system-i686</emulator><br>
+    <disk type='block' device='disk'><br>
+      <driver name='qemu' type='raw'/><br>
+      <source dev='/dev/HostVG/QEMUGuest1'/><br>
+      <target dev='hda' bus='ide'/><br>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/><br>
+    </disk><br>
+    <controller type='usb' index='0'><br>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/><br>
+    </controller><br>
+    <controller type='ide' index='0'><br>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/><br>
+    </controller><br>
+    <controller type='pci' index='0' model='pci-root'/><br>
+    <input type='mouse' bus='ps2'/><br>
+    <input type='keyboard' bus='ps2'/><br>
+    <video><br>
+      <model type='qxl' ram='65536' vram='65536' vgamem='8192' heads='1' primary='yes'/><br>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/><br>
+    </video><br>
+    <memballoon model='virtio'><br>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/><br>
+    </memballoon><br>
+  </devices><br>
+</domain><br>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c<br>
index 5212ce50bd..90edd7a844 100644<br>
--- a/tests/qemuxml2argvtest.c<br>
+++ b/tests/qemuxml2argvtest.c<br>
@@ -2056,6 +2056,10 @@ mymain(void)<br>
             QEMU_CAPS_DEVICE_VIDEO_PRIMARY,<br>
             QEMU_CAPS_DEVICE_QXL,<br>
             QEMU_CAPS_QXL_MAX_OUTPUTS);<br>
+    DO_TEST("video-qxl-resolution",<br>
+            QEMU_CAPS_DEVICE_VIDEO_PRIMARY,<br>
+            QEMU_CAPS_DEVICE_QXL,<br>
+            QEMU_CAPS_QXL_VGAMEM);<br>
     DO_TEST("video-virtio-gpu-device",<br>
             QEMU_CAPS_DEVICE_VIRTIO_GPU,<br>
             QEMU_CAPS_DEVICE_VIDEO_PRIMARY);<br>
diff --git a/tests/qemuxml2xmloutdata/video-qxl-resolution.xml b/tests/qemuxml2xmloutdata/video-qxl-resolution.xml<br>
new file mode 100644<br>
index 0000000000..6ba2817002<br>
--- /dev/null<br>
+++ b/tests/qemuxml2xmloutdata/video-qxl-resolution.xml<br>
@@ -0,0 +1,40 @@<br>
+<domain type='qemu'><br>
+  <name>QEMUGuest1</name><br>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid><br>
+  <memory unit='KiB'>219136</memory><br>
+  <currentMemory unit='KiB'>219136</currentMemory><br>
+  <vcpu placement='static'>1</vcpu><br>
+  <os><br>
+    <type arch='i686' machine='pc'>hvm</type><br>
+    <boot dev='hd'/><br>
+  </os><br>
+  <clock offset='utc'/><br>
+  <on_poweroff>destroy</on_poweroff><br>
+  <on_reboot>restart</on_reboot><br>
+  <on_crash>destroy</on_crash><br>
+  <devices><br>
+    <emulator>/usr/bin/qemu-system-i686</emulator><br>
+    <disk type='block' device='disk'><br>
+      <driver name='qemu' type='raw'/><br>
+      <source dev='/dev/HostVG/QEMUGuest1'/><br>
+      <target dev='hda' bus='ide'/><br>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/><br>
+    </disk><br>
+    <controller type='usb' index='0'><br>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/><br>
+    </controller><br>
+    <controller type='ide' index='0'><br>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/><br>
+    </controller><br>
+    <controller type='pci' index='0' model='pci-root'/><br>
+    <input type='mouse' bus='ps2'/><br>
+    <input type='keyboard' bus='ps2'/><br>
+    <video><br>
+      <model type='qxl' ram='65536' vram='65536' vgamem='8192' heads='1' primary='yes'/><br>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/><br>
+    </video><br>
+    <memballoon model='virtio'><br>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/><br>
+    </memballoon><br>
+  </devices><br>
+</domain><br>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c<br>
index b9364f942f..4c7ba98367 100644<br>
--- a/tests/qemuxml2xmltest.c<br>
+++ b/tests/qemuxml2xmltest.c<br>
@@ -1210,6 +1210,7 @@ mymain(void)<br>
             QEMU_CAPS_DEVICE_QXL);<br>
     DO_TEST("video-qxl-heads", NONE);<br>
     DO_TEST("video-qxl-noheads", NONE);<br>
+    DO_TEST("video-qxl-resolution", NONE);<br>
     DO_TEST("video-virtio-gpu-secondary", NONE);<br>
     DO_TEST("video-virtio-gpu-ccw",<br>
             QEMU_CAPS_CCW,<br>
-- <br>
2.20.1<br>
<br>
--<br>
libvir-list mailing list<br>
<a href="mailto:libvir-list@redhat.com" target="_blank">libvir-list@redhat.com</a><br>
<a href="https://www.redhat.com/mailman/listinfo/libvir-list" rel="noreferrer" target="_blank">https://www.redhat.com/mailman/listinfo/libvir-list</a><br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr">Best regards,</div><div dir="ltr">-----------------------------------<br></div><div dir="ltr">Han Han<br>Quality Engineer<br>Redhat.<br><br>Email: <a href="mailto:hhan@redhat.com" target="_blank">hhan@redhat.com</a><br>Phone: +861065339333<br></div></div></div></div></div></div></div>