From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46524) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V1YuU-0004S3-EE for qemu-devel@nongnu.org; Tue, 23 Jul 2013 05:29:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V1YuP-0007K3-BI for qemu-devel@nongnu.org; Tue, 23 Jul 2013 05:29:34 -0400 Received: from lnx3.fantu.it ([94.23.245.208]:47872) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V1YuO-0007Gd-Ks for qemu-devel@nongnu.org; Tue, 23 Jul 2013 05:29:29 -0400 Message-ID: <51EE4CE1.7060402@tiscali.it> Date: Tue, 23 Jul 2013 11:29:05 +0200 From: Fabio Fantoni MIME-Version: 1.0 References: <518C8B16.4060108@suse.de> In-Reply-To: Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="------------ms040307010904030301080805" Subject: Re: [Qemu-devel] [RFC PATCH] vga: Start supporting resolution not multiple of 16 correctly. Reply-To: fantonifabio@tiscali.it List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Frediano Ziglio Cc: Peter Maydell , Anthony Liguori , xen-devel@lists.xensource.com, Stefano Stabellini , qemu-devel , Alon Levy , Gerd Hoffmann , =?UTF-8?B?QW5kcmVhcyBGw6RyYmVy?= Questo è un messaggio firmato digitalmente in formato MIME. --------------ms040307010904030301080805 Content-Type: multipart/alternative; boundary="------------060108000505070101060205" This is a multi-part message in MIME format. --------------060108000505070101060205 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Il 18/06/2013 12:17, Frediano Ziglio ha scritto: > Modern notebook support 1366x768 resolution. The resolution width is > not multiple of 16 causing some problems. > > QEMU VGA emulation requires width resolution to be multiple of 8. > > VNC implementation requires width resolution to be multiple of 16. > > Signed-off-by: Frediano Ziglio > Tested-by: Fabio Fantoni I tested it for a long time with spice on xen (because qxl will be fully = working only after adding SSE support on hvm domUs). It works, I think=20 it is good to add this and the respective vgabios patch on upstream. > --- > hw/display/vga.c | 2 +- > ui/vnc.c | 34 +++++++++++++++++++--------------- > 2 files changed, 20 insertions(+), 16 deletions(-) > > Updates: > - rebased > - fixed style problems > - fixed typos in comment > > Attached patch for last vgabios in order to get some new resolutions. > Still had no time to test deeply. > > diff --git a/hw/display/vga.c b/hw/display/vga.c > index 21a108d..0053b0f 100644 > --- a/hw/display/vga.c > +++ b/hw/display/vga.c > @@ -648,7 +648,7 @@ void vbe_ioport_write_data(void *opaque, uint32_t=20 > addr, uint32_t val) > } > break; > case VBE_DISPI_INDEX_XRES: > - if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 7) =3D=3D 0))= { > + if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 1) =3D=3D 0))= { > s->vbe_regs[s->vbe_index] =3D val; > } > break; > diff --git a/ui/vnc.c b/ui/vnc.c > index dfc7459..2a2bb90 100644 > --- a/ui/vnc.c > +++ b/ui/vnc.c > @@ -911,26 +911,30 @@ static int vnc_update_client(VncState *vs, int=20 > has_dirty) > for (y =3D 0; y < height; y++) { > int x; > int last_x =3D -1; > - for (x =3D 0; x < width / 16; x++) { > - if (test_and_clear_bit(x, vs->dirty[y])) { > + for (x =3D 0; x < width; x +=3D 16) { > + if (test_and_clear_bit(x/16, vs->dirty[y])) { > if (last_x =3D=3D -1) { > last_x =3D x; > } > } else { > if (last_x !=3D -1) { > - int h =3D find_and_clear_dirty_height(vs, y,=20 > last_x, x, > - height); > + int h =3D find_and_clear_dirty_height(vs, y,=20 > last_x/16, > + x/16, height); > > - n +=3D vnc_job_add_rect(job, last_x * 16, y, > - (x - last_x) * 16, h); > + n +=3D vnc_job_add_rect(job, last_x, y, > + (x - last_x), h); > } > last_x =3D -1; > } > } > if (last_x !=3D -1) { > - int h =3D find_and_clear_dirty_height(vs, y, last_x, x= ,=20 > height); > - n +=3D vnc_job_add_rect(job, last_x * 16, y, > - (x - last_x) * 16, h); > + int h =3D find_and_clear_dirty_height(vs, y, last_x/16= ,=20 > x/16, > + height); > + if (x > width) { > + x =3D width; > + } > + n +=3D vnc_job_add_rect(job, last_x, y, > + (x - last_x), h); > } > } > > @@ -1861,7 +1865,7 @@ static void framebuffer_update_request(VncState=20 > *vs, int incremental, > int w, int h) > { > int i; > - const size_t width =3D surface_width(vs->vd->ds) / 16; > + const size_t width =3D (surface_width(vs->vd->ds)+15) / 16; > const size_t height =3D surface_height(vs->vd->ds); > > if (y_position > height) { > @@ -2686,10 +2690,6 @@ static int=20 > vnc_refresh_server_surface(VncDisplay *vd) > * Check and copy modified bits from guest to server surface. > * Update server dirty map. > */ > - cmp_bytes =3D 64; > - if (cmp_bytes > vnc_server_fb_stride(vd)) { > - cmp_bytes =3D vnc_server_fb_stride(vd); > - } > if (vd->guest.format !=3D VNC_SERVER_FB_FORMAT) { > int width =3D pixman_image_get_width(vd->server); > tmpbuf =3D qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, wi= dth); > @@ -2710,8 +2710,12 @@ static int=20 > vnc_refresh_server_surface(VncDisplay *vd) > } > server_ptr =3D server_row; > > - for (x =3D 0; x + 15 < width; > + cmp_bytes =3D 64; > + for (x =3D 0; x < width; > x +=3D 16, guest_ptr +=3D cmp_bytes, server_ptr +=3D= =20 > cmp_bytes) { > + if (width - x < 16) { > + cmp_bytes =3D 4 * (width - x); > + } > if (!test_and_clear_bit((x / 16), vd->guest.dirty[y]))= > continue; > if (memcmp(server_ptr, guest_ptr, cmp_bytes) =3D=3D 0)= > --=20 > 1.7.10.4 > > > > 2013/5/10 Andreas F=C3=A4rber > > > Am 15.03.2013 19:14, schrieb Frediano Ziglio: > > Modern notebook support 136x768 resolution. The resolution width = is > > 1366? > > > not multiple of 16 causing some problems. > > "a multiple"? (me not a native English speaker) > > > > > Qemu VGA emulation require width resolution to be multiple of 8. > > "QEMU" > > > > > VNC implementation require width resolution to be multiple of 16.= > > "requires" or "implementations" > > > > > This patch remove these limits. Was tested with a Windows > machine with > > standard vga and 1366x768 as resolution. I had to update vgabios = as > > version in qemu (pc-bios/vgabios-stdvga.bin) is quite old. I > also had > > to add some patches on top of VGABIOS 0.7a to add some new > > resolutions. > > > > I have some doubt about this patch > > - are other UI (sdl, cocoa, qxl) happy if resolution is not > multiple of 16 ? > > SDL and Gtk+ should be easily testable; if you CC Peter Maydell or > me we > can try to test Cocoa. CC'ing QXL guys. > > > - scanline is computed exactly without any alignment (so 1366 8 > bit is > > 1366 bytes) while getting vesa information from a laptop it seems= to > > use some kind of alignment (if became 0x580 which is 1408 bytes).= > > Perhaps should I change either VGABIOS and Qemu to make this > > alignment? > > Concerns and personal comments are better placed below ---. :) > > > > > Signed-off-by: Frediano Ziglio > > > > > --- > > hw/vga.c | 2 +- > > File has moved to hw/display/. > > > ui/vnc.c | 27 +++++++++++++-------------- > > 2 files changed, 14 insertions(+), 15 deletions(-) > > I don't see VGABIOS being updated here despite being mentioned > above? Is > that done in a different patch? Still needed? > > > diff --git a/hw/vga.c b/hw/vga.c > > index 1caf23d..d229f06 100644 > > --- a/hw/vga.c > > +++ b/hw/vga.c > > @@ -651,7 +651,7 @@ void vbe_ioport_write_data(void *opaque, > uint32_t > > addr, uint32_t val) > > } > > break; > > case VBE_DISPI_INDEX_XRES: > > - if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 7) =3D=3D= 0)) { > > + if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 1) =3D=3D= 0)) { > > s->vbe_regs[s->vbe_index] =3D val; > > } > > break; > > diff --git a/ui/vnc.c b/ui/vnc.c > > index ff4e2ae..328d14d 100644 > > --- a/ui/vnc.c > > +++ b/ui/vnc.c > > @@ -907,26 +907,27 @@ static int vnc_update_client(VncState *vs, > int has_dirty) > > for (y =3D 0; y < height; y++) { > > int x; > > int last_x =3D -1; > > - for (x =3D 0; x < width / 16; x++) { > > - if (test_and_clear_bit(x, vs->dirty[y])) { > > + for (x =3D 0; x < width; x +=3D 16) { > > + if (test_and_clear_bit(x/16, vs->dirty[y])) { > [snip] > > Please check if scripts/checkpatch.pl > complains about missing spaces > around operators. > > Regards, > Andreas > > -- > SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N=C3=BCrnberg, Germa= ny > GF: Jeff Hawn, Jennifer Guild, Felix Imend=C3=B6rffer; HRB 16746 AG= > N=C3=BCrnberg > > > > > Nessun virus nel messaggio. > Controllato da AVG - www.avg.com > Versione: 2013.0.3345 / Database dei virus: 3199/6420 - Data di=20 > rilascio: 18/06/2013 > --------------060108000505070101060205 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Il 18/06/2013 12:17, Frediano Ziglio h= a scritto:
Modern notebook support 1366x768 resolution. The resolution width is
not multiple of 16 causing some problems.

QEMU VGA emulation requires width resolution to be multiple of 8.

VNC implementation requires width resolution to be multiple of 16.

Signed-off-by: Frediano Ziglio <frediano.zig= lio@citrix.com>

Tested-by: Fabio Fantoni <fabio.fantoni@m2r.biz>

I tested it for a long time with spice on xen (because qxl will be fully working only after adding SSE support on hvm domUs). It works, I think it is good to add this and the respective vgabios patch on upstream.

---
=C2=A0hw/display/vga.c |=C2=A0=C2=A0=C2=A0 2 +-
=C2=A0ui/vnc.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 |=C2=A0=C2=A0 34 +++++++++++++++++++---------------
=C2=A02 files changed, 20 insertions(+), 16 deletions(-)<= br>
Updates:
- rebased
- fixed style problems
- fixed typos in comment

Attached patch for last vgabios in order to get some new resolutions.
Still had no time to test deeply.

diff --git a/hw/display/vga.c b/hw/display/vga.c
index 21a108d..0053b0f 100644
--- a/hw/display/vga.c
+++ b/hw/display/vga.c
@@ -648,7 +648,7 @@ void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 break;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 case VBE= _DISPI_INDEX_XRES:
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 7) =3D=3D 0)) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 1) =3D=3D 0)) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 s->vbe_regs[s->vbe_index] =3D= val;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 break;
diff --git a/ui/vnc.c b/ui/vnc.c
index dfc7459..2a2bb90 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -911,26 +911,30 @@ static int vnc_update_client(VncState *vs, int has_dirty)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for (y =3D= 0; y < height; y++) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 int x;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 int last_x =3D -1;
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 for (x =3D 0; x < width / 16; x++) {
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (test_and_clear_bit(x, vs->dirty[y])) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 for (x =3D 0; x < width; x +=3D 16) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (test_and_clear_bit(x/16, vs->dirty[y])) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (last_= x =3D=3D -1) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 last_x =3D x;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } else {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (last_= x !=3D -1) {
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 int h =3D find_and_clear_dirty_height(vs, y, last_x, x,
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 height);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 int h =3D find_and_clear_dirty_height(vs, y, last_x/16,
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 x/16, height);
=C2=A0
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 n +=3D vnc_job_add_rect(job, last_x * 16, y,
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (x - last_x) * 16, h);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 n +=3D vnc_job_add_rect(job, last_x, y,
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (x - last_x), h);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 last_x =3D= -1;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 if (last_x !=3D -1) {
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 int h =3D find_and_clear_dirty_height(v= s, y, last_x, x, height);
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 n +=3D vnc_job_add_rect(job, last_x * 1= 6, y,
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 (x - last_x) * 16, h);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 int h =3D find_and_clear_dirty_height(v= s, y, last_x/16, x/16,
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 height);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (x > width) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 x =3D width; +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 n +=3D vnc_job_add_rect(job, last_x, y,=
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 (x - last_x), h);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0
@@ -1861,7 +1865,7 @@ static void framebuffer_update_request(VncState *vs, int incremental,
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 int w, int h)
=C2=A0{
=C2=A0=C2=A0=C2=A0=C2=A0 int i;
-=C2=A0=C2=A0=C2=A0 const size_t width =3D surface_width(vs->vd->ds) / 16;
+=C2=A0=C2=A0=C2=A0 const size_t width =3D (surface_width(vs->vd->ds)+15) / 16;
=C2=A0=C2=A0=C2=A0=C2=A0 const size_t height =3D surface_height(vs->vd->ds);
=C2=A0
=C2=A0=C2=A0=C2=A0=C2=A0 if (y_position > height) { @@ -2686,10 +2690,6 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 * Check and copy modified = bits from guest to server surface.
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 * Update server dirty map.=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 */
-=C2=A0=C2=A0=C2=A0 cmp_bytes =3D 64;
-=C2=A0=C2=A0=C2=A0 if (cmp_bytes > vnc_server_fb_stri= de(vd)) {
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 cmp_bytes =3D= vnc_server_fb_stride(vd);
-=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0 if (vd->guest.format !=3D VNC= _SERVER_FB_FORMAT) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 int widt= h =3D pixman_image_get_width(vd->server);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 tmpbuf =3D= qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, width);<= br> @@ -2710,8 +2710,12 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 server_ptr =3D server_row;
=C2=A0
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 for (x =3D 0; x + 15 < width;
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 cmp_bytes =3D 64;
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 for (x =3D 0; x < width;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 x +=3D 16= , guest_ptr +=3D cmp_bytes, server_ptr +=3D cmp_bytes) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (width - x < 16) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 cmp_bytes =3D 4= * (width - x);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!test_and_clear_bit((x / 16),= vd->guest.dirty[y]))
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 continue;=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (memcmp(server_ptr, guest_ptr,= cmp_bytes) =3D=3D 0)
--
1.7.10.4



2013/5/10 Andreas F=C3=A4rber <afaerber= @suse.de>
Am 15.03.2013 19:14, schrieb Frediano Ziglio:
> Modern notebook support 136x768 resolution. The resolution width is

1366?

> not multiple of 16 causing some problems.

"a multiple"? (me not a native English speaker)

>
> Qemu VGA emulation require width resolution to be multiple of 8.

"QEMU"

>
> VNC implementation require width resolution to be multiple of 16.

"requires" or "implementations"

>
> This patch remove these limits. Was tested with a Windows machine with
> standard vga and 1366x768 as resolution. I had to update vgabios as
> version in qemu (pc-bios/vgabios-stdvga.bin) is quite old. I also had
> to add some patches on top of VGABIOS 0.7a to add some new
> resolutions.
>
> I have some doubt about this patch
> - are other UI (sdl, cocoa, qxl) happy if resolution is not multiple of 16 ?

SDL and Gtk+ should be easily testable; if you CC Peter Maydell or me we
can try to test Cocoa. CC'ing QXL guys.

> - scanline is computed exactly without any alignment (so 1366 8 bit is
> 1366 bytes) while getting vesa information from a laptop it seems to
> use some kind of alignment (if became 0x580 which is 1408 bytes).
> Perhaps should I change either VGABIOS and Qemu to make this
> alignment?

Concerns and personal comments are better placed below ---. :)

>
> Signed-off-by: Frediano Ziglio <frediano.zigli= o@citrix.com>
>
> ---
> =C2=A0hw/vga.c | =C2=A0 =C2=A02 +-

File has moved to hw/display/.

> =C2=A0ui/vnc.c | =C2=A0 27 +++++++++++++--------------=
> =C2=A02 files changed, 14 insertions(+), 15 deletions(= -)

I don't see VGABIOS being updated here despite being mentioned above? Is
that done in a different patch? Still needed?

> diff --git a/hw/vga.c b/hw/vga.c
> index 1caf23d..d229f06 100644
> --- a/hw/vga.c
> +++ b/hw/vga.c
> @@ -651,7 +651,7 @@ void vbe_ioport_write_data(void *opaque, uint32_t
> addr, uint32_t val)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;=
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case VBE_DISPI_INDEX= _XRES:
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if ((val &l= t;=3D VBE_DISPI_MAX_XRES) && ((val & 7) =3D=3D 0)) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if ((val &l= t;=3D VBE_DISPI_MAX_XRES) && ((val & 1) =3D=3D 0)) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0s->vbe_regs[s->vbe_index] =3D val;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;=
> diff --git a/ui/vnc.c b/ui/vnc.c
> index ff4e2ae..328d14d 100644
> --- a/ui/vnc.c
> +++ b/ui/vnc.c
> @@ -907,26 +907,27 @@ static int vnc_update_client(VncState *vs, int has_dirty)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for (y =3D 0; y <= height; y++) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int x;=
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int la= st_x =3D -1;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for (x =3D = 0; x < width / 16; x++) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0if (test_and_clear_bit(x, vs->dirty[y])) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for (x =3D = 0; x < width; x +=3D 16) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0if (test_and_clear_bit(x/16, vs->dirty[y])) {
[snip]

Please check if scripts/checkpatch.= pl complains about missing spaces
around operators.

Regards,
Andreas

--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N=C3=BCrnb= erg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imend=C3=B6rffer; HR= B 16746 AG N=C3=BCrnberg



Nessu= n virus nel messaggio.
Controllato da AVG - www.avg.com
Versione: 2013.0.3345 / Database dei virus: 3199/6420 - Data di rilascio: 18/06/2013


--------------060108000505070101060205-- --------------ms040307010904030301080805 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: Firma crittografica S/MIME MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIINhjCC BjQwggQcoAMCAQICASAwDQYJKoZIhvcNAQEFBQAwfTELMAkGA1UEBhMCSUwxFjAUBgNVBAoT DVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNp Z25pbmcxKTAnBgNVBAMTIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA3 MTAyNDIxMDI1NVoXDTE3MTAyNDIxMDI1NVowgYwxCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1T dGFydENvbSBMdGQuMSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWdu aW5nMTgwNgYDVQQDEy9TdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIENs aWVudCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMsohUWcASz7GfKrpTOM KqANy9BV7V0igWdGxA8IU77L3aTxErQ+fcxtDYZ36Z6GH0YFn7fq5RADteP0AYzrCA+EQTfi 8q1+kA3m0nwtwXG94M5sIqsvs7lRP1aycBke/s5g9hJHryZ2acScnzczjBCAo7X1v5G3yw8M DP2m2RCye0KfgZ4nODerZJVzhAlOD9YejvAXZqHksw56HzElVIoYSZ3q4+RJuPXXfIoyby+Y 2m1E+YzX5iCZXBx05gk6MKAW1vaw4/v2OOLy6FZH3XHHtOkzUreG//CsFnB9+uaYSlR65cdG zTsmoIK8WH1ygoXhRBm98SD7Hf/r3FELNvUCAwEAAaOCAa0wggGpMA8GA1UdEwEB/wQFMAMB Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSuVYNv7DHKufcd+q9rMfPIHeOsuzAfBgNV HSMEGDAWgBROC+8apEBbpRdphzDKNGhD0EGu8jBmBggrBgEFBQcBAQRaMFgwJwYIKwYBBQUH MAGGG2h0dHA6Ly9vY3NwLnN0YXJ0c3NsLmNvbS9jYTAtBggrBgEFBQcwAoYhaHR0cDovL3d3 dy5zdGFydHNzbC5jb20vc2ZzY2EuY3J0MFsGA1UdHwRUMFIwJ6AloCOGIWh0dHA6Ly93d3cu c3RhcnRzc2wuY29tL3Nmc2NhLmNybDAnoCWgI4YhaHR0cDovL2NybC5zdGFydHNzbC5jb20v c2ZzY2EuY3JsMIGABgNVHSAEeTB3MHUGCysGAQQBgbU3AQIBMGYwLgYIKwYBBQUHAgEWImh0 dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93 d3cuc3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwDQYJKoZIhvcNAQEFBQADggIBADqp Jw3I07QWke9plNBpxUxcffc7nUrIQpJHDci91DFG7fVhHRkMZ1J+BKg5UNUxIFJ2Z9B90Mic c/NXcs7kPBRdn6XGO/vPc87Y6R+cWS9Nc9+fp3Enmsm94OxOwI9wn8qnr/6o3mD4noP9Jphw UPTXwHovjavRnhUQHLfo/i2NG0XXgTHXS2Xm0kVUozXqpYpAdumMiB/vezj1QHQJDmUdPYMc p+reg9901zkyT3fDW/ivJVv6pWtkh6Pw2ytZT7mvg7YhX3V50Nv860cV11mocUVcqBLv0gcT +HBDYtbuvexNftwNQKD5193A7zN4vG7CTYkXxytSjKuXrpEatEiFPxWgb84nVj25SU5q/r1X hwby6mLhkbaXslkVtwEWT3Van49rKjlK4XrUKYYWtnfzq6aSak5u0Vpxd1rY79tWhD3EdCvO hNz/QplNa+VkIsrcp7+8ZhP1l1b2U6MaxIVteuVMD3X0vziIwr7jxYae9FZjbxlpUemqXjcC 0QaFfN7qI0JsQMALL7iGRBg7K0CoOBzECdD3fuZil5kU/LP9cr1BK31U0Uy651bFnAMMMkqh AChIbn0ei72VnbpSsrrSdF0BAGYQ8vyHae5aCg+H75dVCV33K6FuxZrf09yTz+Vx/PkdRUYk XmZz/OTfyJXsUOUXrym6KvI2rYpccSk5MIIHSjCCBjKgAwIBAgICHmMwDQYJKoZIhvcNAQEF BQAwgYwxCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQLEyJT ZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nMTgwNgYDVQQDEy9TdGFydENvbSBD bGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIENsaWVudCBDQTAeFw0xMjAzMTgyMjE0MzBa Fw0xNDAzMjAwODU3MDlaMIGMMRkwFwYDVQQNExBlQjZPRTM3UlJOUHlsNW0yMQswCQYDVQQG EwJJVDEQMA4GA1UECBMHQmVyZ2FtbzEQMA4GA1UEBxMHUm92ZXR0YTEWMBQGA1UEAxMNRmFi aW8gRmFudG9uaTEmMCQGCSqGSIb3DQEJARYXZmFudG9uaWZhYmlvQHRpc2NhbGkuaXQwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1XhckXsX23vgJq76s2f0KT8U8Msov5QgV 10eQBb2wL/TzcmqtZotI7ztKVhio3ehHg+mfu+3EqOkX9Umgut8rP0bPi7AGjkPXbOTT/cSU Xz2Kw31VGOmiOVoUFGvpQitp3weCkhUJLBipI8EpNyBXpjtQ9yCpnIAqfuc77ybfSnCy7tTR MBq1BUkfjH1+GL45riosuS4+F+MSUvlYzLiT4rAduAX1Y2IuORDsf9Bce8GBxa6syP9rCyzl Vk7DIX5k8j2vlnyRATIypn5CQLQxGT6e0f6ac4gvWOHwO2QEBsmZKKs1ZidE4q/9OoNXYX6A jnHtp1H1vcrek/vVcs19AgMBAAGjggOyMIIDrjAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAd BgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwHQYDVR0OBBYEFFan8cbEWWBmSTWFtLk2 YNdAcGUbMB8GA1UdIwQYMBaAFK5Vg2/sMcq59x36r2sx88gd46y7MCIGA1UdEQQbMBmBF2Zh bnRvbmlmYWJpb0B0aXNjYWxpLml0MIICIQYDVR0gBIICGDCCAhQwggIQBgsrBgEEAYG1NwEC AjCCAf8wLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYw NAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYw gfcGCCsGAQUFBwICMIHqMCcWIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MAMC AQEagb5UaGlzIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3JkaW5nIHRvIHRoZSBDbGFz cyAyIFZhbGlkYXRpb24gcmVxdWlyZW1lbnRzIG9mIHRoZSBTdGFydENvbSBDQSBwb2xpY3ks IHJlbGlhbmNlIG9ubHkgZm9yIHRoZSBpbnRlbmRlZCBwdXJwb3NlIGluIGNvbXBsaWFuY2Ug b2YgdGhlIHJlbHlpbmcgcGFydHkgb2JsaWdhdGlvbnMuMIGcBggrBgEFBQcCAjCBjzAnFiBT dGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTADAgECGmRMaWFiaWxpdHkgYW5kIHdh cnJhbnRpZXMgYXJlIGxpbWl0ZWQhIFNlZSBzZWN0aW9uICJMZWdhbCBhbmQgTGltaXRhdGlv bnMiIG9mIHRoZSBTdGFydENvbSBDQSBwb2xpY3kuMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6 Ly9jcmwuc3RhcnRzc2wuY29tL2NydHUyLWNybC5jcmwwgY4GCCsGAQUFBwEBBIGBMH8wOQYI KwYBBQUHMAGGLWh0dHA6Ly9vY3NwLnN0YXJ0c3NsLmNvbS9zdWIvY2xhc3MyL2NsaWVudC9j YTBCBggrBgEFBQcwAoY2aHR0cDovL2FpYS5zdGFydHNzbC5jb20vY2VydHMvc3ViLmNsYXNz Mi5jbGllbnQuY2EuY3J0MCMGA1UdEgQcMBqGGGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tLzAN BgkqhkiG9w0BAQUFAAOCAQEAjzHNqifpDVMkH1TSPFZVIiQ4fh49/V5JMpstgqEZPDaDe5r8 h+fMBZtUa6LLMco03Z9BNEXlqlXKiFk8feVYB8obEjz7YYq1XhO9q7JUmkSs0WGIH4xU0XB1 kPC8T8H+5E//84poYSFHE4pA+Ff68UANP2/EuFJWMjegiefnOr8aM42OAcUkjEWSlautIIX8 oD2GizwQYjWdDDjEonbuMKFP6rY2xGI3PSLI3IVU2opb0/itNhQui3WRxafloJqTlriY8m8+ qSLr2HGftbBlbyzVWB8o//aW0H0LMabjkIvrm7Zmh2vcCxiSxGBwYASuSYXGuQiKAgGptUs1 XJLZuzGCA9owggPWAgEBMIGTMIGMMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20g THRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYG A1UEAxMvU3RhcnRDb20gQ2xhc3MgMiBQcmltYXJ5IEludGVybWVkaWF0ZSBDbGllbnQgQ0EC Ah5jMAkGBSsOAwIaBQCgggIbMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN AQkFMQ8XDTEzMDcyMzA5MjkwNVowIwYJKoZIhvcNAQkEMRYEFM2PAb2kiU3Wlejo24GWDb3i 67xKMGwGCSqGSIb3DQEJDzFfMF0wCwYJYIZIAWUDBAEqMAsGCWCGSAFlAwQBAjAKBggqhkiG 9w0DBzAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcN AwICASgwgaQGCSsGAQQBgjcQBDGBljCBkzCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0 YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25p bmcxODA2BgNVBAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUgQ2xp ZW50IENBAgIeYzCBpgYLKoZIhvcNAQkQAgsxgZaggZMwgYwxCzAJBgNVBAYTAklMMRYwFAYD VQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0 ZSBTaWduaW5nMTgwNgYDVQQDEy9TdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRp YXRlIENsaWVudCBDQQICHmMwDQYJKoZIhvcNAQEBBQAEggEAIhW2Ik3crgG0HioVPGyHstaM JMEwu2sygNgSrl0YdM5i3UBfMzehBf3G7F3H/iHiDjd/vnZtlwxmOTq01mBVfJaJ6sBCzx6L f8r1VrnV0LWhiXYkTaO47NSTvRpk15iB39uP/pPP3XlpKfG7I/ehPlsbCYcIfzGn6UraWLQ2 dZg+FjNtVPbFBPNmY+0KFWNMo2L4tEL8uyuXONTwescGikAsPt7OIIA4vH2HBuX6wmKJuyXL iBXt8hbgApFRqWx4y6D2T5GX6tBdj2Y2w1YxUvS1GRMZaM+Ijy1Pfz7Vwqjx1xKKH628JLPp A92av4vY6lRdBQfxljKmFTpMYIUxSAAAAAAAAA== --------------ms040307010904030301080805-- From mboxrd@z Thu Jan 1 00:00:00 1970 From: Fabio Fantoni Subject: Re: [RFC PATCH] vga: Start supporting resolution not multiple of 16 correctly. Date: Tue, 23 Jul 2013 11:29:05 +0200 Message-ID: <51EE4CE1.7060402@tiscali.it> References: <518C8B16.4060108@suse.de> Reply-To: fantonifabio@tiscali.it Mime-Version: 1.0 Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="------------ms040307010904030301080805" Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org Sender: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org To: Frediano Ziglio Cc: Peter Maydell , Anthony Liguori , xen-devel@lists.xensource.com, Stefano Stabellini , qemu-devel , Alon Levy , Gerd Hoffmann , =?UTF-8?B?QW5kcmVhcyBGw6RyYmVy?= List-Id: xen-devel@lists.xenproject.org Questo è un messaggio firmato digitalmente in formato MIME. --------------ms040307010904030301080805 Content-Type: multipart/alternative; boundary="------------060108000505070101060205" This is a multi-part message in MIME format. --------------060108000505070101060205 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Il 18/06/2013 12:17, Frediano Ziglio ha scritto: > Modern notebook support 1366x768 resolution. The resolution width is > not multiple of 16 causing some problems. > > QEMU VGA emulation requires width resolution to be multiple of 8. > > VNC implementation requires width resolution to be multiple of 16. > > Signed-off-by: Frediano Ziglio > Tested-by: Fabio Fantoni I tested it for a long time with spice on xen (because qxl will be fully = working only after adding SSE support on hvm domUs). It works, I think=20 it is good to add this and the respective vgabios patch on upstream. > --- > hw/display/vga.c | 2 +- > ui/vnc.c | 34 +++++++++++++++++++--------------- > 2 files changed, 20 insertions(+), 16 deletions(-) > > Updates: > - rebased > - fixed style problems > - fixed typos in comment > > Attached patch for last vgabios in order to get some new resolutions. > Still had no time to test deeply. > > diff --git a/hw/display/vga.c b/hw/display/vga.c > index 21a108d..0053b0f 100644 > --- a/hw/display/vga.c > +++ b/hw/display/vga.c > @@ -648,7 +648,7 @@ void vbe_ioport_write_data(void *opaque, uint32_t=20 > addr, uint32_t val) > } > break; > case VBE_DISPI_INDEX_XRES: > - if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 7) =3D=3D 0))= { > + if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 1) =3D=3D 0))= { > s->vbe_regs[s->vbe_index] =3D val; > } > break; > diff --git a/ui/vnc.c b/ui/vnc.c > index dfc7459..2a2bb90 100644 > --- a/ui/vnc.c > +++ b/ui/vnc.c > @@ -911,26 +911,30 @@ static int vnc_update_client(VncState *vs, int=20 > has_dirty) > for (y =3D 0; y < height; y++) { > int x; > int last_x =3D -1; > - for (x =3D 0; x < width / 16; x++) { > - if (test_and_clear_bit(x, vs->dirty[y])) { > + for (x =3D 0; x < width; x +=3D 16) { > + if (test_and_clear_bit(x/16, vs->dirty[y])) { > if (last_x =3D=3D -1) { > last_x =3D x; > } > } else { > if (last_x !=3D -1) { > - int h =3D find_and_clear_dirty_height(vs, y,=20 > last_x, x, > - height); > + int h =3D find_and_clear_dirty_height(vs, y,=20 > last_x/16, > + x/16, height); > > - n +=3D vnc_job_add_rect(job, last_x * 16, y, > - (x - last_x) * 16, h); > + n +=3D vnc_job_add_rect(job, last_x, y, > + (x - last_x), h); > } > last_x =3D -1; > } > } > if (last_x !=3D -1) { > - int h =3D find_and_clear_dirty_height(vs, y, last_x, x= ,=20 > height); > - n +=3D vnc_job_add_rect(job, last_x * 16, y, > - (x - last_x) * 16, h); > + int h =3D find_and_clear_dirty_height(vs, y, last_x/16= ,=20 > x/16, > + height); > + if (x > width) { > + x =3D width; > + } > + n +=3D vnc_job_add_rect(job, last_x, y, > + (x - last_x), h); > } > } > > @@ -1861,7 +1865,7 @@ static void framebuffer_update_request(VncState=20 > *vs, int incremental, > int w, int h) > { > int i; > - const size_t width =3D surface_width(vs->vd->ds) / 16; > + const size_t width =3D (surface_width(vs->vd->ds)+15) / 16; > const size_t height =3D surface_height(vs->vd->ds); > > if (y_position > height) { > @@ -2686,10 +2690,6 @@ static int=20 > vnc_refresh_server_surface(VncDisplay *vd) > * Check and copy modified bits from guest to server surface. > * Update server dirty map. > */ > - cmp_bytes =3D 64; > - if (cmp_bytes > vnc_server_fb_stride(vd)) { > - cmp_bytes =3D vnc_server_fb_stride(vd); > - } > if (vd->guest.format !=3D VNC_SERVER_FB_FORMAT) { > int width =3D pixman_image_get_width(vd->server); > tmpbuf =3D qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, wi= dth); > @@ -2710,8 +2710,12 @@ static int=20 > vnc_refresh_server_surface(VncDisplay *vd) > } > server_ptr =3D server_row; > > - for (x =3D 0; x + 15 < width; > + cmp_bytes =3D 64; > + for (x =3D 0; x < width; > x +=3D 16, guest_ptr +=3D cmp_bytes, server_ptr +=3D= =20 > cmp_bytes) { > + if (width - x < 16) { > + cmp_bytes =3D 4 * (width - x); > + } > if (!test_and_clear_bit((x / 16), vd->guest.dirty[y]))= > continue; > if (memcmp(server_ptr, guest_ptr, cmp_bytes) =3D=3D 0)= > --=20 > 1.7.10.4 > > > > 2013/5/10 Andreas F=C3=A4rber > > > Am 15.03.2013 19:14, schrieb Frediano Ziglio: > > Modern notebook support 136x768 resolution. The resolution width = is > > 1366? > > > not multiple of 16 causing some problems. > > "a multiple"? (me not a native English speaker) > > > > > Qemu VGA emulation require width resolution to be multiple of 8. > > "QEMU" > > > > > VNC implementation require width resolution to be multiple of 16.= > > "requires" or "implementations" > > > > > This patch remove these limits. Was tested with a Windows > machine with > > standard vga and 1366x768 as resolution. I had to update vgabios = as > > version in qemu (pc-bios/vgabios-stdvga.bin) is quite old. I > also had > > to add some patches on top of VGABIOS 0.7a to add some new > > resolutions. > > > > I have some doubt about this patch > > - are other UI (sdl, cocoa, qxl) happy if resolution is not > multiple of 16 ? > > SDL and Gtk+ should be easily testable; if you CC Peter Maydell or > me we > can try to test Cocoa. CC'ing QXL guys. > > > - scanline is computed exactly without any alignment (so 1366 8 > bit is > > 1366 bytes) while getting vesa information from a laptop it seems= to > > use some kind of alignment (if became 0x580 which is 1408 bytes).= > > Perhaps should I change either VGABIOS and Qemu to make this > > alignment? > > Concerns and personal comments are better placed below ---. :) > > > > > Signed-off-by: Frediano Ziglio > > > > > --- > > hw/vga.c | 2 +- > > File has moved to hw/display/. > > > ui/vnc.c | 27 +++++++++++++-------------- > > 2 files changed, 14 insertions(+), 15 deletions(-) > > I don't see VGABIOS being updated here despite being mentioned > above? Is > that done in a different patch? Still needed? > > > diff --git a/hw/vga.c b/hw/vga.c > > index 1caf23d..d229f06 100644 > > --- a/hw/vga.c > > +++ b/hw/vga.c > > @@ -651,7 +651,7 @@ void vbe_ioport_write_data(void *opaque, > uint32_t > > addr, uint32_t val) > > } > > break; > > case VBE_DISPI_INDEX_XRES: > > - if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 7) =3D=3D= 0)) { > > + if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 1) =3D=3D= 0)) { > > s->vbe_regs[s->vbe_index] =3D val; > > } > > break; > > diff --git a/ui/vnc.c b/ui/vnc.c > > index ff4e2ae..328d14d 100644 > > --- a/ui/vnc.c > > +++ b/ui/vnc.c > > @@ -907,26 +907,27 @@ static int vnc_update_client(VncState *vs, > int has_dirty) > > for (y =3D 0; y < height; y++) { > > int x; > > int last_x =3D -1; > > - for (x =3D 0; x < width / 16; x++) { > > - if (test_and_clear_bit(x, vs->dirty[y])) { > > + for (x =3D 0; x < width; x +=3D 16) { > > + if (test_and_clear_bit(x/16, vs->dirty[y])) { > [snip] > > Please check if scripts/checkpatch.pl > complains about missing spaces > around operators. > > Regards, > Andreas > > -- > SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N=C3=BCrnberg, Germa= ny > GF: Jeff Hawn, Jennifer Guild, Felix Imend=C3=B6rffer; HRB 16746 AG= > N=C3=BCrnberg > > > > > Nessun virus nel messaggio. > Controllato da AVG - www.avg.com > Versione: 2013.0.3345 / Database dei virus: 3199/6420 - Data di=20 > rilascio: 18/06/2013 > --------------060108000505070101060205 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Il 18/06/2013 12:17, Frediano Ziglio h= a scritto:
Modern notebook support 1366x768 resolution. The resolution width is
not multiple of 16 causing some problems.

QEMU VGA emulation requires width resolution to be multiple of 8.

VNC implementation requires width resolution to be multiple of 16.

Signed-off-by: Frediano Ziglio <frediano.zig= lio@citrix.com>

Tested-by: Fabio Fantoni <fabio.fantoni@m2r.biz>

I tested it for a long time with spice on xen (because qxl will be fully working only after adding SSE support on hvm domUs). It works, I think it is good to add this and the respective vgabios patch on upstream.

---
=C2=A0hw/display/vga.c |=C2=A0=C2=A0=C2=A0 2 +-
=C2=A0ui/vnc.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 |=C2=A0=C2=A0 34 +++++++++++++++++++---------------
=C2=A02 files changed, 20 insertions(+), 16 deletions(-)<= br>
Updates:
- rebased
- fixed style problems
- fixed typos in comment

Attached patch for last vgabios in order to get some new resolutions.
Still had no time to test deeply.

diff --git a/hw/display/vga.c b/hw/display/vga.c
index 21a108d..0053b0f 100644
--- a/hw/display/vga.c
+++ b/hw/display/vga.c
@@ -648,7 +648,7 @@ void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 break;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 case VBE= _DISPI_INDEX_XRES:
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 7) =3D=3D 0)) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 if ((val <=3D VBE_DISPI_MAX_XRES) && ((val & 1) =3D=3D 0)) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 s->vbe_regs[s->vbe_index] =3D= val;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 break;
diff --git a/ui/vnc.c b/ui/vnc.c
index dfc7459..2a2bb90 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -911,26 +911,30 @@ static int vnc_update_client(VncState *vs, int has_dirty)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for (y =3D= 0; y < height; y++) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 int x;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 int last_x =3D -1;
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 for (x =3D 0; x < width / 16; x++) {
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (test_and_clear_bit(x, vs->dirty[y])) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 for (x =3D 0; x < width; x +=3D 16) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (test_and_clear_bit(x/16, vs->dirty[y])) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (last_= x =3D=3D -1) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 last_x =3D x;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } else {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (last_= x !=3D -1) {
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 int h =3D find_and_clear_dirty_height(vs, y, last_x, x,
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 height);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 int h =3D find_and_clear_dirty_height(vs, y, last_x/16,
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 x/16, height);
=C2=A0
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 n +=3D vnc_job_add_rect(job, last_x * 16, y,
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (x - last_x) * 16, h);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 n +=3D vnc_job_add_rect(job, last_x, y,
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (x - last_x), h);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 last_x =3D= -1;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 if (last_x !=3D -1) {
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 int h =3D find_and_clear_dirty_height(v= s, y, last_x, x, height);
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 n +=3D vnc_job_add_rect(job, last_x * 1= 6, y,
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 (x - last_x) * 16, h);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 int h =3D find_and_clear_dirty_height(v= s, y, last_x/16, x/16,
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 height);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (x > width) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 x =3D width; +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 n +=3D vnc_job_add_rect(job, last_x, y,=
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 (x - last_x), h);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0
@@ -1861,7 +1865,7 @@ static void framebuffer_update_request(VncState *vs, int incremental,
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 int w, int h)
=C2=A0{
=C2=A0=C2=A0=C2=A0=C2=A0 int i;
-=C2=A0=C2=A0=C2=A0 const size_t width =3D surface_width(vs->vd->ds) / 16;
+=C2=A0=C2=A0=C2=A0 const size_t width =3D (surface_width(vs->vd->ds)+15) / 16;
=C2=A0=C2=A0=C2=A0=C2=A0 const size_t height =3D surface_height(vs->vd->ds);
=C2=A0
=C2=A0=C2=A0=C2=A0=C2=A0 if (y_position > height) { @@ -2686,10 +2690,6 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 * Check and copy modified = bits from guest to server surface.
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 * Update server dirty map.=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 */
-=C2=A0=C2=A0=C2=A0 cmp_bytes =3D 64;
-=C2=A0=C2=A0=C2=A0 if (cmp_bytes > vnc_server_fb_stri= de(vd)) {
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 cmp_bytes =3D= vnc_server_fb_stride(vd);
-=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0 if (vd->guest.format !=3D VNC= _SERVER_FB_FORMAT) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 int widt= h =3D pixman_image_get_width(vd->server);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 tmpbuf =3D= qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, width);<= br> @@ -2710,8 +2710,12 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 server_ptr =3D server_row;
=C2=A0
-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 for (x =3D 0; x + 15 < width;
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 cmp_bytes =3D 64;
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 for (x =3D 0; x < width;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 x +=3D 16= , guest_ptr +=3D cmp_bytes, server_ptr +=3D cmp_bytes) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (width - x < 16) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 cmp_bytes =3D 4= * (width - x);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!test_and_clear_bit((x / 16),= vd->guest.dirty[y]))
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 continue;=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (memcmp(server_ptr, guest_ptr,= cmp_bytes) =3D=3D 0)
--
1.7.10.4



2013/5/10 Andreas F=C3=A4rber <afaerber= @suse.de>
Am 15.03.2013 19:14, schrieb Frediano Ziglio:
> Modern notebook support 136x768 resolution. The resolution width is

1366?

> not multiple of 16 causing some problems.

"a multiple"? (me not a native English speaker)

>
> Qemu VGA emulation require width resolution to be multiple of 8.

"QEMU"

>
> VNC implementation require width resolution to be multiple of 16.

"requires" or "implementations"

>
> This patch remove these limits. Was tested with a Windows machine with
> standard vga and 1366x768 as resolution. I had to update vgabios as
> version in qemu (pc-bios/vgabios-stdvga.bin) is quite old. I also had
> to add some patches on top of VGABIOS 0.7a to add some new
> resolutions.
>
> I have some doubt about this patch
> - are other UI (sdl, cocoa, qxl) happy if resolution is not multiple of 16 ?

SDL and Gtk+ should be easily testable; if you CC Peter Maydell or me we
can try to test Cocoa. CC'ing QXL guys.

> - scanline is computed exactly without any alignment (so 1366 8 bit is
> 1366 bytes) while getting vesa information from a laptop it seems to
> use some kind of alignment (if became 0x580 which is 1408 bytes).
> Perhaps should I change either VGABIOS and Qemu to make this
> alignment?

Concerns and personal comments are better placed below ---. :)

>
> Signed-off-by: Frediano Ziglio <frediano.zigli= o@citrix.com>
>
> ---
> =C2=A0hw/vga.c | =C2=A0 =C2=A02 +-

File has moved to hw/display/.

> =C2=A0ui/vnc.c | =C2=A0 27 +++++++++++++--------------=
> =C2=A02 files changed, 14 insertions(+), 15 deletions(= -)

I don't see VGABIOS being updated here despite being mentioned above? Is
that done in a different patch? Still needed?

> diff --git a/hw/vga.c b/hw/vga.c
> index 1caf23d..d229f06 100644
> --- a/hw/vga.c
> +++ b/hw/vga.c
> @@ -651,7 +651,7 @@ void vbe_ioport_write_data(void *opaque, uint32_t
> addr, uint32_t val)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;=
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case VBE_DISPI_INDEX= _XRES:
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if ((val &l= t;=3D VBE_DISPI_MAX_XRES) && ((val & 7) =3D=3D 0)) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if ((val &l= t;=3D VBE_DISPI_MAX_XRES) && ((val & 1) =3D=3D 0)) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0s->vbe_regs[s->vbe_index] =3D val;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;=
> diff --git a/ui/vnc.c b/ui/vnc.c
> index ff4e2ae..328d14d 100644
> --- a/ui/vnc.c
> +++ b/ui/vnc.c
> @@ -907,26 +907,27 @@ static int vnc_update_client(VncState *vs, int has_dirty)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for (y =3D 0; y <= height; y++) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int x;=
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int la= st_x =3D -1;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for (x =3D = 0; x < width / 16; x++) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0if (test_and_clear_bit(x, vs->dirty[y])) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for (x =3D = 0; x < width; x +=3D 16) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0if (test_and_clear_bit(x/16, vs->dirty[y])) {
[snip]

Please check if scripts/checkpatch.= pl complains about missing spaces
around operators.

Regards,
Andreas

--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N=C3=BCrnb= erg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imend=C3=B6rffer; HR= B 16746 AG N=C3=BCrnberg



Nessu= n virus nel messaggio.
Controllato da AVG - www.avg.com
Versione: 2013.0.3345 / Database dei virus: 3199/6420 - Data di rilascio: 18/06/2013


--------------060108000505070101060205-- --------------ms040307010904030301080805 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: Firma crittografica S/MIME MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIINhjCC BjQwggQcoAMCAQICASAwDQYJKoZIhvcNAQEFBQAwfTELMAkGA1UEBhMCSUwxFjAUBgNVBAoT DVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNp Z25pbmcxKTAnBgNVBAMTIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA3 MTAyNDIxMDI1NVoXDTE3MTAyNDIxMDI1NVowgYwxCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1T dGFydENvbSBMdGQuMSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWdu aW5nMTgwNgYDVQQDEy9TdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIENs aWVudCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMsohUWcASz7GfKrpTOM KqANy9BV7V0igWdGxA8IU77L3aTxErQ+fcxtDYZ36Z6GH0YFn7fq5RADteP0AYzrCA+EQTfi 8q1+kA3m0nwtwXG94M5sIqsvs7lRP1aycBke/s5g9hJHryZ2acScnzczjBCAo7X1v5G3yw8M DP2m2RCye0KfgZ4nODerZJVzhAlOD9YejvAXZqHksw56HzElVIoYSZ3q4+RJuPXXfIoyby+Y 2m1E+YzX5iCZXBx05gk6MKAW1vaw4/v2OOLy6FZH3XHHtOkzUreG//CsFnB9+uaYSlR65cdG zTsmoIK8WH1ygoXhRBm98SD7Hf/r3FELNvUCAwEAAaOCAa0wggGpMA8GA1UdEwEB/wQFMAMB Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSuVYNv7DHKufcd+q9rMfPIHeOsuzAfBgNV HSMEGDAWgBROC+8apEBbpRdphzDKNGhD0EGu8jBmBggrBgEFBQcBAQRaMFgwJwYIKwYBBQUH MAGGG2h0dHA6Ly9vY3NwLnN0YXJ0c3NsLmNvbS9jYTAtBggrBgEFBQcwAoYhaHR0cDovL3d3 dy5zdGFydHNzbC5jb20vc2ZzY2EuY3J0MFsGA1UdHwRUMFIwJ6AloCOGIWh0dHA6Ly93d3cu c3RhcnRzc2wuY29tL3Nmc2NhLmNybDAnoCWgI4YhaHR0cDovL2NybC5zdGFydHNzbC5jb20v c2ZzY2EuY3JsMIGABgNVHSAEeTB3MHUGCysGAQQBgbU3AQIBMGYwLgYIKwYBBQUHAgEWImh0 dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93 d3cuc3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwDQYJKoZIhvcNAQEFBQADggIBADqp Jw3I07QWke9plNBpxUxcffc7nUrIQpJHDci91DFG7fVhHRkMZ1J+BKg5UNUxIFJ2Z9B90Mic c/NXcs7kPBRdn6XGO/vPc87Y6R+cWS9Nc9+fp3Enmsm94OxOwI9wn8qnr/6o3mD4noP9Jphw UPTXwHovjavRnhUQHLfo/i2NG0XXgTHXS2Xm0kVUozXqpYpAdumMiB/vezj1QHQJDmUdPYMc p+reg9901zkyT3fDW/ivJVv6pWtkh6Pw2ytZT7mvg7YhX3V50Nv860cV11mocUVcqBLv0gcT +HBDYtbuvexNftwNQKD5193A7zN4vG7CTYkXxytSjKuXrpEatEiFPxWgb84nVj25SU5q/r1X hwby6mLhkbaXslkVtwEWT3Van49rKjlK4XrUKYYWtnfzq6aSak5u0Vpxd1rY79tWhD3EdCvO hNz/QplNa+VkIsrcp7+8ZhP1l1b2U6MaxIVteuVMD3X0vziIwr7jxYae9FZjbxlpUemqXjcC 0QaFfN7qI0JsQMALL7iGRBg7K0CoOBzECdD3fuZil5kU/LP9cr1BK31U0Uy651bFnAMMMkqh AChIbn0ei72VnbpSsrrSdF0BAGYQ8vyHae5aCg+H75dVCV33K6FuxZrf09yTz+Vx/PkdRUYk XmZz/OTfyJXsUOUXrym6KvI2rYpccSk5MIIHSjCCBjKgAwIBAgICHmMwDQYJKoZIhvcNAQEF BQAwgYwxCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQLEyJT ZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nMTgwNgYDVQQDEy9TdGFydENvbSBD bGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIENsaWVudCBDQTAeFw0xMjAzMTgyMjE0MzBa Fw0xNDAzMjAwODU3MDlaMIGMMRkwFwYDVQQNExBlQjZPRTM3UlJOUHlsNW0yMQswCQYDVQQG EwJJVDEQMA4GA1UECBMHQmVyZ2FtbzEQMA4GA1UEBxMHUm92ZXR0YTEWMBQGA1UEAxMNRmFi aW8gRmFudG9uaTEmMCQGCSqGSIb3DQEJARYXZmFudG9uaWZhYmlvQHRpc2NhbGkuaXQwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1XhckXsX23vgJq76s2f0KT8U8Msov5QgV 10eQBb2wL/TzcmqtZotI7ztKVhio3ehHg+mfu+3EqOkX9Umgut8rP0bPi7AGjkPXbOTT/cSU Xz2Kw31VGOmiOVoUFGvpQitp3weCkhUJLBipI8EpNyBXpjtQ9yCpnIAqfuc77ybfSnCy7tTR MBq1BUkfjH1+GL45riosuS4+F+MSUvlYzLiT4rAduAX1Y2IuORDsf9Bce8GBxa6syP9rCyzl Vk7DIX5k8j2vlnyRATIypn5CQLQxGT6e0f6ac4gvWOHwO2QEBsmZKKs1ZidE4q/9OoNXYX6A jnHtp1H1vcrek/vVcs19AgMBAAGjggOyMIIDrjAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAd BgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwHQYDVR0OBBYEFFan8cbEWWBmSTWFtLk2 YNdAcGUbMB8GA1UdIwQYMBaAFK5Vg2/sMcq59x36r2sx88gd46y7MCIGA1UdEQQbMBmBF2Zh bnRvbmlmYWJpb0B0aXNjYWxpLml0MIICIQYDVR0gBIICGDCCAhQwggIQBgsrBgEEAYG1NwEC AjCCAf8wLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYw NAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYw gfcGCCsGAQUFBwICMIHqMCcWIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MAMC AQEagb5UaGlzIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3JkaW5nIHRvIHRoZSBDbGFz cyAyIFZhbGlkYXRpb24gcmVxdWlyZW1lbnRzIG9mIHRoZSBTdGFydENvbSBDQSBwb2xpY3ks IHJlbGlhbmNlIG9ubHkgZm9yIHRoZSBpbnRlbmRlZCBwdXJwb3NlIGluIGNvbXBsaWFuY2Ug b2YgdGhlIHJlbHlpbmcgcGFydHkgb2JsaWdhdGlvbnMuMIGcBggrBgEFBQcCAjCBjzAnFiBT dGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTADAgECGmRMaWFiaWxpdHkgYW5kIHdh cnJhbnRpZXMgYXJlIGxpbWl0ZWQhIFNlZSBzZWN0aW9uICJMZWdhbCBhbmQgTGltaXRhdGlv bnMiIG9mIHRoZSBTdGFydENvbSBDQSBwb2xpY3kuMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6 Ly9jcmwuc3RhcnRzc2wuY29tL2NydHUyLWNybC5jcmwwgY4GCCsGAQUFBwEBBIGBMH8wOQYI KwYBBQUHMAGGLWh0dHA6Ly9vY3NwLnN0YXJ0c3NsLmNvbS9zdWIvY2xhc3MyL2NsaWVudC9j YTBCBggrBgEFBQcwAoY2aHR0cDovL2FpYS5zdGFydHNzbC5jb20vY2VydHMvc3ViLmNsYXNz Mi5jbGllbnQuY2EuY3J0MCMGA1UdEgQcMBqGGGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tLzAN BgkqhkiG9w0BAQUFAAOCAQEAjzHNqifpDVMkH1TSPFZVIiQ4fh49/V5JMpstgqEZPDaDe5r8 h+fMBZtUa6LLMco03Z9BNEXlqlXKiFk8feVYB8obEjz7YYq1XhO9q7JUmkSs0WGIH4xU0XB1 kPC8T8H+5E//84poYSFHE4pA+Ff68UANP2/EuFJWMjegiefnOr8aM42OAcUkjEWSlautIIX8 oD2GizwQYjWdDDjEonbuMKFP6rY2xGI3PSLI3IVU2opb0/itNhQui3WRxafloJqTlriY8m8+ qSLr2HGftbBlbyzVWB8o//aW0H0LMabjkIvrm7Zmh2vcCxiSxGBwYASuSYXGuQiKAgGptUs1 XJLZuzGCA9owggPWAgEBMIGTMIGMMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20g THRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYG A1UEAxMvU3RhcnRDb20gQ2xhc3MgMiBQcmltYXJ5IEludGVybWVkaWF0ZSBDbGllbnQgQ0EC Ah5jMAkGBSsOAwIaBQCgggIbMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN AQkFMQ8XDTEzMDcyMzA5MjkwNVowIwYJKoZIhvcNAQkEMRYEFM2PAb2kiU3Wlejo24GWDb3i 67xKMGwGCSqGSIb3DQEJDzFfMF0wCwYJYIZIAWUDBAEqMAsGCWCGSAFlAwQBAjAKBggqhkiG 9w0DBzAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcN AwICASgwgaQGCSsGAQQBgjcQBDGBljCBkzCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0 YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25p bmcxODA2BgNVBAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUgQ2xp ZW50IENBAgIeYzCBpgYLKoZIhvcNAQkQAgsxgZaggZMwgYwxCzAJBgNVBAYTAklMMRYwFAYD VQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0 ZSBTaWduaW5nMTgwNgYDVQQDEy9TdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRp YXRlIENsaWVudCBDQQICHmMwDQYJKoZIhvcNAQEBBQAEggEAIhW2Ik3crgG0HioVPGyHstaM JMEwu2sygNgSrl0YdM5i3UBfMzehBf3G7F3H/iHiDjd/vnZtlwxmOTq01mBVfJaJ6sBCzx6L f8r1VrnV0LWhiXYkTaO47NSTvRpk15iB39uP/pPP3XlpKfG7I/ehPlsbCYcIfzGn6UraWLQ2 dZg+FjNtVPbFBPNmY+0KFWNMo2L4tEL8uyuXONTwescGikAsPt7OIIA4vH2HBuX6wmKJuyXL iBXt8hbgApFRqWx4y6D2T5GX6tBdj2Y2w1YxUvS1GRMZaM+Ijy1Pfz7Vwqjx1xKKH628JLPp A92av4vY6lRdBQfxljKmFTpMYIUxSAAAAAAAAA== --------------ms040307010904030301080805--