Patchwork vga: do not resize the screen on hw_invalidate

login
register
mail settings
Submitter Stefano Stabellini
Date Aug. 3, 2009, 3:14 p.m.
Message ID <alpine.DEB.2.00.0908031610480.12699@kaball-desktop>
Download mbox | patch
Permalink /patch/30610/
State Superseded
Headers show

Comments

Stefano Stabellini - Aug. 3, 2009, 3:14 p.m.
Hi all,
currently vga always resizes the screen when vga_hw_invalidate is called
while this is not required and all the other graphic emulators don't.
This patch fixes it, making vga invalidate behaviour consistent with the
other emulated devices.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

---
 hw/vga.c     |    6 +++---
 hw/vga_int.h |    1 +
 2 files changed, 4 insertions(+), 3 deletions(-)
Stefan Weil - Nov. 18, 2009, 7:53 p.m.
Stefano Stabellini schrieb:
> Hi all,
> currently vga always resizes the screen when vga_hw_invalidate is called
> while this is not required and all the other graphic emulators don't.
> This patch fixes it, making vga invalidate behaviour consistent with the
> other emulated devices.
>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

This rather old patch breaks switching to and from full screen mode
using SDL and alt-ctrl-f key.

Please revert or fix it. The patch is also part of stable-0.11, so I
expect the same problem there (but did not test it).

Found by git bisect, tested on several linux installations.

>
> ---
> hw/vga.c | 6 +++---
> hw/vga_int.h | 1 +
> 2 files changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/hw/vga.c b/hw/vga.c
> index 4d74ffe..53b5ff6 100644
> --- a/hw/vga.c
> +++ b/hw/vga.c
> @@ -1837,7 +1837,8 @@ static void vga_update_display(void *opaque)
> if (ds_get_bits_per_pixel(s->ds) == 0) {
> /* nothing to do */
> } else {
> - full_update = 0;
> + full_update = s->full_update;
> + s->full_update = 0;
> if (!(s->ar_index & 0x20)) {
> graphic_mode = GMODE_BLANK;
> } else {
> @@ -1867,8 +1868,7 @@ static void vga_invalidate_display(void *opaque)
> {
> VGAState *s = (VGAState *)opaque;
>
> - s->last_width = -1;
> - s->last_height = -1;
> + s->full_update = 1;
> }
>
> void vga_reset(void *opaque)
> diff --git a/hw/vga_int.h b/hw/vga_int.h
> index 631b1b0..8fdf51d 100644
> --- a/hw/vga_int.h
> +++ b/hw/vga_int.h
> @@ -158,6 +158,7 @@ typedef struct VGACommonState {
> uint32_t last_width, last_height; /* in chars or pixels */
> uint32_t last_scr_width, last_scr_height; /* in pixels */
> uint32_t last_depth; /* in bits */
> + uint8_t full_update;
> uint8_t cursor_start, cursor_end;
> uint32_t cursor_offset;
> unsigned int (*rgb_to_pixel)(unsigned int r,
Stefan Weil - Nov. 19, 2009, 7:57 a.m.
Stefan Weil schrieb:
> Stefano Stabellini schrieb:
>> Hi all,
>> currently vga always resizes the screen when vga_hw_invalidate is called
>> while this is not required and all the other graphic emulators don't.
>> This patch fixes it, making vga invalidate behaviour consistent with the
>> other emulated devices.
>>
>> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>
> This rather old patch breaks switching to and from full screen mode
> using SDL and alt-ctrl-f key.
>
> Please revert or fix it. The patch is also part of stable-0.11, so I
> expect the same problem there (but did not test it).
>
> Found by git bisect, tested on several linux installations.
>

Debian qemu 0.11.0-5 is suffering from this bug, too.

So 0bd8246bfec1dfb2eb959f52db535572c0260f4c
should be reverted or fixed not only for master but
also for stable-0.11.

Regards,
Stefan
Aurelien Jarno - Nov. 19, 2009, 1:08 p.m.
Stefan Weil a écrit :
> Stefan Weil schrieb:
>> Stefano Stabellini schrieb:
>>> Hi all,
>>> currently vga always resizes the screen when vga_hw_invalidate is called
>>> while this is not required and all the other graphic emulators don't.
>>> This patch fixes it, making vga invalidate behaviour consistent with the
>>> other emulated devices.
>>>
>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>> This rather old patch breaks switching to and from full screen mode
>> using SDL and alt-ctrl-f key.
>>
>> Please revert or fix it. The patch is also part of stable-0.11, so I
>> expect the same problem there (but did not test it).
>>
>> Found by git bisect, tested on several linux installations.
>>
> 
> Debian qemu 0.11.0-5 is suffering from this bug, too.
> 
> So 0bd8246bfec1dfb2eb959f52db535572c0260f4c
> should be reverted or fixed not only for master but
> also for stable-0.11.
> 

Before reverting that into stable-0.11, we should take time to
understand the problem and have a correct fix (which might be a revert).

Patch

diff --git a/hw/vga.c b/hw/vga.c
index 4d74ffe..53b5ff6 100644
--- a/hw/vga.c
+++ b/hw/vga.c
@@ -1837,7 +1837,8 @@  static void vga_update_display(void *opaque)
     if (ds_get_bits_per_pixel(s->ds) == 0) {
         /* nothing to do */
     } else {
-        full_update = 0;
+        full_update = s->full_update;
+        s->full_update = 0;
         if (!(s->ar_index & 0x20)) {
             graphic_mode = GMODE_BLANK;
         } else {
@@ -1867,8 +1868,7 @@  static void vga_invalidate_display(void *opaque)
 {
     VGAState *s = (VGAState *)opaque;
 
-    s->last_width = -1;
-    s->last_height = -1;
+    s->full_update = 1;
 }
 
 void vga_reset(void *opaque)
diff --git a/hw/vga_int.h b/hw/vga_int.h
index 631b1b0..8fdf51d 100644
--- a/hw/vga_int.h
+++ b/hw/vga_int.h
@@ -158,6 +158,7 @@  typedef struct VGACommonState {
     uint32_t last_width, last_height; /* in chars or pixels */
     uint32_t last_scr_width, last_scr_height; /* in pixels */
     uint32_t last_depth; /* in bits */
+    uint8_t full_update;
     uint8_t cursor_start, cursor_end;
     uint32_t cursor_offset;
     unsigned int (*rgb_to_pixel)(unsigned int r,