xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Fabio Fantoni <fantonifabio@tiscali.it>
To: Frediano Ziglio <freddy77@gmail.com>
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
	"Anthony Liguori" <aliguori@us.ibm.com>,
	xen-devel@lists.xensource.com,
	"Stefano Stabellini" <stefano.stabellini@eu.citrix.com>,
	qemu-devel <qemu-devel@nongnu.org>,
	"Alon Levy" <alevy@redhat.com>,
	"Gerd Hoffmann" <kraxel@redhat.com>,
	"Andreas Färber" <afaerber@suse.de>
Subject: Re: [RFC PATCH] vga: Start supporting resolution not multiple of 16 correctly.
Date: Tue, 23 Jul 2013 11:29:05 +0200	[thread overview]
Message-ID: <51EE4CE1.7060402@tiscali.it> (raw)
In-Reply-To: <CAHt6W4duQaPmjK-USDx7GpAk0VuFOY4+W1D0rPgZ52_Lx+Ug5w@mail.gmail.com>


[-- Attachment #1.1: Type: text/plain, Size: 8937 bytes --]

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 <frediano.ziglio@citrix.com 
> <mailto:frediano.ziglio@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.

> ---
>  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 
> addr, uint32_t val)
>              }
>              break;
>          case VBE_DISPI_INDEX_XRES:
> -            if ((val <= VBE_DISPI_MAX_XRES) && ((val & 7) == 0)) {
> +            if ((val <= VBE_DISPI_MAX_XRES) && ((val & 1) == 0)) {
>                  s->vbe_regs[s->vbe_index] = 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 
> has_dirty)
>          for (y = 0; y < height; y++) {
>              int x;
>              int last_x = -1;
> -            for (x = 0; x < width / 16; x++) {
> -                if (test_and_clear_bit(x, vs->dirty[y])) {
> +            for (x = 0; x < width; x += 16) {
> +                if (test_and_clear_bit(x/16, vs->dirty[y])) {
>                      if (last_x == -1) {
>                          last_x = x;
>                      }
>                  } else {
>                      if (last_x != -1) {
> -                        int h = find_and_clear_dirty_height(vs, y, 
> last_x, x,
> - height);
> +                        int h = find_and_clear_dirty_height(vs, y, 
> last_x/16,
> + x/16, height);
>
> -                        n += vnc_job_add_rect(job, last_x * 16, y,
> -                                              (x - last_x) * 16, h);
> +                        n += vnc_job_add_rect(job, last_x, y,
> +                                              (x - last_x), h);
>                      }
>                      last_x = -1;
>                  }
>              }
>              if (last_x != -1) {
> -                int h = find_and_clear_dirty_height(vs, y, last_x, x, 
> height);
> -                n += vnc_job_add_rect(job, last_x * 16, y,
> -                                      (x - last_x) * 16, h);
> +                int h = find_and_clear_dirty_height(vs, y, last_x/16, 
> x/16,
> + height);
> +                if (x > width) {
> +                    x = width;
> +                }
> +                n += vnc_job_add_rect(job, last_x, y,
> +                                      (x - last_x), h);
>              }
>          }
>
> @@ -1861,7 +1865,7 @@ static void framebuffer_update_request(VncState 
> *vs, int incremental,
>                                         int w, int h)
>  {
>      int i;
> -    const size_t width = surface_width(vs->vd->ds) / 16;
> +    const size_t width = (surface_width(vs->vd->ds)+15) / 16;
>      const size_t height = surface_height(vs->vd->ds);
>
>      if (y_position > height) {
> @@ -2686,10 +2690,6 @@ static int 
> vnc_refresh_server_surface(VncDisplay *vd)
>       * Check and copy modified bits from guest to server surface.
>       * Update server dirty map.
>       */
> -    cmp_bytes = 64;
> -    if (cmp_bytes > vnc_server_fb_stride(vd)) {
> -        cmp_bytes = vnc_server_fb_stride(vd);
> -    }
>      if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
>          int width = pixman_image_get_width(vd->server);
>          tmpbuf = qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, width);
> @@ -2710,8 +2710,12 @@ static int 
> vnc_refresh_server_surface(VncDisplay *vd)
>              }
>              server_ptr = server_row;
>
> -            for (x = 0; x + 15 < width;
> +            cmp_bytes = 64;
> +            for (x = 0; x < width;
>                      x += 16, guest_ptr += cmp_bytes, server_ptr += 
> cmp_bytes) {
> +                if (width - x < 16) {
> +                    cmp_bytes = 4 * (width - x);
> +                }
>                  if (!test_and_clear_bit((x / 16), vd->guest.dirty[y]))
>                      continue;
>                  if (memcmp(server_ptr, guest_ptr, cmp_bytes) == 0)
> -- 
> 1.7.10.4
>
>
>
> 2013/5/10 Andreas Färber <afaerber@suse.de <mailto: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.ziglio@citrix.com
>     <mailto:frediano.ziglio@citrix.com>>
>     >
>     > ---
>     >  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 <= VBE_DISPI_MAX_XRES) && ((val & 7) == 0)) {
>     > +            if ((val <= VBE_DISPI_MAX_XRES) && ((val & 1) == 0)) {
>     >                  s->vbe_regs[s->vbe_index] = 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 = 0; y < height; y++) {
>     >              int x;
>     >              int last_x = -1;
>     > -            for (x = 0; x < width / 16; x++) {
>     > -                if (test_and_clear_bit(x, vs->dirty[y])) {
>     > +            for (x = 0; x < width; x += 16) {
>     > +                if (test_and_clear_bit(x/16, vs->dirty[y])) {
>     [snip]
>
>     Please check if scripts/checkpatch.pl <http://checkpatch.pl>
>     complains about missing spaces
>     around operators.
>
>     Regards,
>     Andreas
>
>     --
>     SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
>     GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG
>     Nürnberg
>
>
>
>
> Nessun virus nel messaggio.
> Controllato da AVG - www.avg.com <http://www.avg.com>
> Versione: 2013.0.3345 / Database dei virus: 3199/6420 - Data di 
> rilascio: 18/06/2013
>


[-- Attachment #1.2: Type: text/html, Size: 17146 bytes --]

[-- Attachment #2: Firma crittografica S/MIME --]
[-- Type: application/pkcs7-signature, Size: 4510 bytes --]

  reply	other threads:[~2013-07-23  9:29 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-15 18:14 [RFC PATCH] vga: Start supporting resolution not multiple of 16 correctly Frediano Ziglio
2013-03-19 13:56 ` Stefano Stabellini
2013-05-09 14:20 ` [Xen-devel] " Pasi Kärkkäinen
2013-05-10  5:52 ` Andreas Färber
2013-06-18 10:17   ` Frediano Ziglio
2013-07-23  9:29     ` Fabio Fantoni [this message]
2013-07-23 11:28       ` Gerd Hoffmann
2013-07-28 16:56         ` Frediano Ziglio
2013-09-25 16:12           ` [Xen-devel] " Pasi Kärkkäinen
2013-10-03 12:09             ` Fabio Fantoni

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51EE4CE1.7060402@tiscali.it \
    --to=fantonifabio@tiscali.it \
    --cc=afaerber@suse.de \
    --cc=alevy@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=freddy77@gmail.com \
    --cc=kraxel@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).