All of lore.kernel.org
 help / color / mirror / Atom feed
* Corrupted display changing screen colour depth in qemu-system-ppc/MacOS
@ 2022-06-16  8:54 Mark Cave-Ayland
  2022-06-16 12:07 ` Gerd Hoffmann
  0 siblings, 1 reply; 9+ messages in thread
From: Mark Cave-Ayland @ 2022-06-16  8:54 UTC (permalink / raw)
  To: qemu-devel, Marc-André Lureau, Gerd Hoffmann; +Cc: Howard Spoelstra

Hi all,

Howard pointed me off-list to a corrupted screen display issue experienced when 
changing the screen colour depth in MacOS under qemu-system-ppc. I was able to 
reproduce it here, and noticed from the output that the issue was likely due to the 
host display not updating its depth accordingly.

After it was confirmed to me that this was working in QEMU 6.2, I was able to 
eventually bisect the problem down to this commit:


cb8962c146b2633a4b04562281de9b2703bba849 is the first bad commit
commit cb8962c146b2633a4b04562281de9b2703bba849
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date:   Tue Feb 15 00:13:37 2022 +0400

     ui: do not create a surface when resizing a GL scanout

     qemu_console_resize() will create a blank surface and replace the
     current scanout with it if called while the current scanout is
     GL (texture or dmabuf).

     This is not only very costly, but also can produce glitches on the
     display/listener side.

     Instead, compare the current console size with the fitting console
     functions, which also works when the scanout is GL.

     Note: there might be still an unnecessary surface creation on calling
     qemu_console_resize() when the size is actually changing, but display
     backends currently rely on DisplaySurface details during
     dpy_gfx_switch() to handle various resize aspects. We would need more
     refactoring to handle resize without DisplaySurface, this is left for a
     future improvement.

     Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
     Message-Id: <20220214201337.1814787-4-marcandre.lureau@redhat.com>
     Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>

  ui/console.c | 7 +++----
  1 file changed, 3 insertions(+), 4 deletions(-)


Some more background: the screen in qemu-system-ppc's MacOS is controlled via a 
custom driver written by Ben which uses the Bochs VBE registers to change the screen 
width/height/depth. The code used to do this can be found at 
https://gitlab.com/qemu-project/QemuMacDrivers/-/blob/master/QemuVGADriver/src/QemuVga.c#L354.

Looking at the changes in cb8962c146 my guess would be that either the updated check 
in qemu_console_resize() should also check to see if the surface depth is unchanged 
before exiting early, or that there is an extra update required in the VGA device 
when changing just the screen colour depth by itself.


ATB,

Mark.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Corrupted display changing screen colour depth in qemu-system-ppc/MacOS
  2022-06-16  8:54 Corrupted display changing screen colour depth in qemu-system-ppc/MacOS Mark Cave-Ayland
@ 2022-06-16 12:07 ` Gerd Hoffmann
  2022-06-16 12:37   ` Mark Cave-Ayland
  0 siblings, 1 reply; 9+ messages in thread
From: Gerd Hoffmann @ 2022-06-16 12:07 UTC (permalink / raw)
  To: Mark Cave-Ayland; +Cc: qemu-devel, Marc-André Lureau, Howard Spoelstra

On Thu, Jun 16, 2022 at 09:54:46AM +0100, Mark Cave-Ayland wrote:
> Hi all,
> 
> Howard pointed me off-list to a corrupted screen display issue experienced
> when changing the screen colour depth in MacOS under qemu-system-ppc. I was
> able to reproduce it here, and noticed from the output that the issue was
> likely due to the host display not updating its depth accordingly.
> 
> After it was confirmed to me that this was working in QEMU 6.2, I was able
> to eventually bisect the problem down to this commit:
> 
> 
> cb8962c146b2633a4b04562281de9b2703bba849 is the first bad commit
> commit cb8962c146b2633a4b04562281de9b2703bba849
> Author: Marc-André Lureau <marcandre.lureau@redhat.com>
> Date:   Tue Feb 15 00:13:37 2022 +0400
> 
>     ui: do not create a surface when resizing a GL scanout
> 
>     qemu_console_resize() will create a blank surface and replace the
>     current scanout with it if called while the current scanout is
>     GL (texture or dmabuf).
> 
>     This is not only very costly, but also can produce glitches on the
>     display/listener side.
> 
>     Instead, compare the current console size with the fitting console
>     functions, which also works when the scanout is GL.
> 
>     Note: there might be still an unnecessary surface creation on calling
>     qemu_console_resize() when the size is actually changing, but display
>     backends currently rely on DisplaySurface details during
>     dpy_gfx_switch() to handle various resize aspects. We would need more
>     refactoring to handle resize without DisplaySurface, this is left for a
>     future improvement.
> 
>     Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>     Message-Id: <20220214201337.1814787-4-marcandre.lureau@redhat.com>
>     Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> 
>  ui/console.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> 
> Some more background: the screen in qemu-system-ppc's MacOS is controlled
> via a custom driver written by Ben which uses the Bochs VBE registers to
> change the screen width/height/depth. The code used to do this can be found
> at https://gitlab.com/qemu-project/QemuMacDrivers/-/blob/master/QemuVGADriver/src/QemuVga.c#L354.
> 
> Looking at the changes in cb8962c146 my guess would be that either the
> updated check in qemu_console_resize() should also check to see if the
> surface depth is unchanged before exiting early, or that there is an extra
> update required in the VGA device when changing just the screen colour depth
> by itself.

Can you try ditch the QEMU_ALLOCATED_FLAG check added by the commit?

Which depth changes triggers this?  Going from direct color to a
paletted mode?

take care,
  Gerd



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Corrupted display changing screen colour depth in qemu-system-ppc/MacOS
  2022-06-16 12:07 ` Gerd Hoffmann
@ 2022-06-16 12:37   ` Mark Cave-Ayland
  2022-06-17  9:55     ` Gerd Hoffmann
  0 siblings, 1 reply; 9+ messages in thread
From: Mark Cave-Ayland @ 2022-06-16 12:37 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: qemu-devel, Marc-André Lureau, Howard Spoelstra

On 16/06/2022 13:07, Gerd Hoffmann wrote:

> On Thu, Jun 16, 2022 at 09:54:46AM +0100, Mark Cave-Ayland wrote:
>> Hi all,
>>
>> Howard pointed me off-list to a corrupted screen display issue experienced
>> when changing the screen colour depth in MacOS under qemu-system-ppc. I was
>> able to reproduce it here, and noticed from the output that the issue was
>> likely due to the host display not updating its depth accordingly.
>>
>> After it was confirmed to me that this was working in QEMU 6.2, I was able
>> to eventually bisect the problem down to this commit:
>>
>>
>> cb8962c146b2633a4b04562281de9b2703bba849 is the first bad commit
>> commit cb8962c146b2633a4b04562281de9b2703bba849
>> Author: Marc-André Lureau <marcandre.lureau@redhat.com>
>> Date:   Tue Feb 15 00:13:37 2022 +0400
>>
>>      ui: do not create a surface when resizing a GL scanout
>>
>>      qemu_console_resize() will create a blank surface and replace the
>>      current scanout with it if called while the current scanout is
>>      GL (texture or dmabuf).
>>
>>      This is not only very costly, but also can produce glitches on the
>>      display/listener side.
>>
>>      Instead, compare the current console size with the fitting console
>>      functions, which also works when the scanout is GL.
>>
>>      Note: there might be still an unnecessary surface creation on calling
>>      qemu_console_resize() when the size is actually changing, but display
>>      backends currently rely on DisplaySurface details during
>>      dpy_gfx_switch() to handle various resize aspects. We would need more
>>      refactoring to handle resize without DisplaySurface, this is left for a
>>      future improvement.
>>
>>      Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>>      Message-Id: <20220214201337.1814787-4-marcandre.lureau@redhat.com>
>>      Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
>>
>>   ui/console.c | 7 +++----
>>   1 file changed, 3 insertions(+), 4 deletions(-)
>>
>>
>> Some more background: the screen in qemu-system-ppc's MacOS is controlled
>> via a custom driver written by Ben which uses the Bochs VBE registers to
>> change the screen width/height/depth. The code used to do this can be found
>> at https://gitlab.com/qemu-project/QemuMacDrivers/-/blob/master/QemuVGADriver/src/QemuVga.c#L354.
>>
>> Looking at the changes in cb8962c146 my guess would be that either the
>> updated check in qemu_console_resize() should also check to see if the
>> surface depth is unchanged before exiting early, or that there is an extra
>> update required in the VGA device when changing just the screen colour depth
>> by itself.
> 
> Can you try ditch the QEMU_ALLOCATED_FLAG check added by the commit?

Commit cb8962c146 drops the QEMU_ALLOCATED_FLAG check: if I add it back in with the 
following diff on top then everything works again:

diff --git a/ui/console.c b/ui/console.c
index 365a2c14b8..decae4287f 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -2400,11 +2400,12 @@ static void vc_chr_open(Chardev *chr,

  void qemu_console_resize(QemuConsole *s, int width, int height)
  {
-    DisplaySurface *surface;
+    DisplaySurface *surface = qemu_console_surface(s);

      assert(s->console_type == GRAPHIC_CONSOLE);

-    if (qemu_console_get_width(s, -1) == width &&
+    if (surface && (surface->flags & QEMU_ALLOCATED_FLAG) &&
+        qemu_console_get_width(s, -1) == width &&
          qemu_console_get_height(s, -1) == height) {
          return;
      }

> Which depth changes triggers this?  Going from direct color to a
> paletted mode?

A quick test suggests anything that isn't 32-bit colour is affected. With logging 
enabled I see the following when selecting from the 3 available colour depths in the 
Monitors Control Panel:

- 256 colours (8-bit color), corrupted

vga_vbe_write index 0x4, val 0x0
vga_vbe_write index 0x3, val 0x8
vga_vbe_write index 0x1, val 0x280
vga_vbe_write index 0x2, val 0x1e0
vga_vbe_write index 0x5, val 0x0
vga_vbe_write index 0x6, val 0x280
vga_vbe_write index 0x7, val 0x3c0
vga_vbe_write index 0x8, val 0x0
vga_vbe_write index 0x9, val 0x0
vga_vbe_write index 0x4, val 0x61
vga_std_write_io addr 0x3c8, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x1
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x2
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x3
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x4
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x5
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x6
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x7
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x8
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x9
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0xa
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0xb
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0xd
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0xe
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0xf
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x10
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x11
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x12
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x13
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x14
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x15
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x16
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x17
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x18
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x19
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x1a
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x1b
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x1c
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x1d
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x1e
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x1f
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x20
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x21
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x22
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x23
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x24
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x25
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x26
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x27
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x28
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x29
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x2a
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x2b
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x2c
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x2d
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x2e
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x2f
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x30
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x31
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x32
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x34
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x35
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x36
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x37
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x38
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x39
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x3a
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x3b
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x3c
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x3d
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x3e
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x3f
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x40
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x41
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x42
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x43
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x44
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x45
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x46
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x47
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x48
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x49
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x4a
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x4b
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x4c
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x4d
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x4e
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x4f
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x50
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x51
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x52
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x53
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x54
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x55
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x56
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x57
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x58
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x59
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x5a
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x5b
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x5c
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x5d
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x5e
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x5f
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x60
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x61
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x62
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x63
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x64
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x65
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x67
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x68
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x69
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x6a
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x6b
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x6c
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x6d
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x6e
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x6f
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x70
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x71
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x72
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x73
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x74
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x75
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x76
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x77
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x78
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x79
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x7a
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x7b
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x7c
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x7d
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x7e
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x7f
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x80
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x81
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x82
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x83
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x84
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x85
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x86
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x87
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x88
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x89
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x8a
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x8b
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x8c
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x8d
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x8e
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x8f
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x90
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x91
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x92
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x93
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x94
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x95
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x96
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x97
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x98
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0x9a
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0x9b
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0x9c
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0x9d
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0x9e
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0x9f
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0xa0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0xa1
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xa2
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0xa3
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0xa4
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0xa5
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0xa6
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0xa7
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xa8
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0xa9
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0xaa
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0xab
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0xac
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0xad
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xae
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0xaf
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0xb0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0xb1
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0xb2
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0xb3
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xb4
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0xb5
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0xb6
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0xb7
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0xb8
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0xb9
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xba
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0xbb
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0xbc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0xbd
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0xbe
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0xbf
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xc0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0xc1
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0xc2
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0xc3
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0xc4
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0xc5
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xc6
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0xc7
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0xc8
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0xc9
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0xca
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0xcb
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xcc
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0xcd
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0xce
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0xcf
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0xd0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0xd1
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xd2
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xff
vga_std_write_io addr 0x3c8, val 0xd3
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xcc
vga_std_write_io addr 0x3c8, val 0xd4
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x99
vga_std_write_io addr 0x3c8, val 0xd5
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x66
vga_std_write_io addr 0x3c8, val 0xd6
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x33
vga_std_write_io addr 0x3c8, val 0xd7
vga_std_write_io addr 0x3c9, val 0xee
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xd8
vga_std_write_io addr 0x3c9, val 0xdd
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xd9
vga_std_write_io addr 0x3c9, val 0xbb
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xda
vga_std_write_io addr 0x3c9, val 0xaa
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xdb
vga_std_write_io addr 0x3c9, val 0x88
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xdc
vga_std_write_io addr 0x3c9, val 0x77
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xdd
vga_std_write_io addr 0x3c9, val 0x55
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xde
vga_std_write_io addr 0x3c9, val 0x44
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xdf
vga_std_write_io addr 0x3c9, val 0x22
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xe0
vga_std_write_io addr 0x3c9, val 0x11
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xe1
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xee
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xe2
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xdd
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xe3
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xbb
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xe4
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xaa
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xe5
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x88
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xe6
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x77
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xe7
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x55
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xe8
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x44
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xe9
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x22
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xea
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x11
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c8, val 0xeb
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xee
vga_std_write_io addr 0x3c8, val 0xec
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xdd
vga_std_write_io addr 0x3c8, val 0xed
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xbb
vga_std_write_io addr 0x3c8, val 0xee
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0xaa
vga_std_write_io addr 0x3c8, val 0xef
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x88
vga_std_write_io addr 0x3c8, val 0xf0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x77
vga_std_write_io addr 0x3c8, val 0xf1
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x55
vga_std_write_io addr 0x3c8, val 0xf2
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x44
vga_std_write_io addr 0x3c8, val 0xf3
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x22
vga_std_write_io addr 0x3c8, val 0xf4
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x11
vga_std_write_io addr 0x3c8, val 0xf5
vga_std_write_io addr 0x3c9, val 0xee
vga_std_write_io addr 0x3c9, val 0xee
vga_std_write_io addr 0x3c9, val 0xee
vga_std_write_io addr 0x3c8, val 0xf6
vga_std_write_io addr 0x3c9, val 0xdd
vga_std_write_io addr 0x3c9, val 0xdd
vga_std_write_io addr 0x3c9, val 0xdd
vga_std_write_io addr 0x3c8, val 0xf7
vga_std_write_io addr 0x3c9, val 0xbb
vga_std_write_io addr 0x3c9, val 0xbb
vga_std_write_io addr 0x3c9, val 0xbb
vga_std_write_io addr 0x3c8, val 0xf8
vga_std_write_io addr 0x3c9, val 0xaa
vga_std_write_io addr 0x3c9, val 0xaa
vga_std_write_io addr 0x3c9, val 0xaa
vga_std_write_io addr 0x3c8, val 0xf9
vga_std_write_io addr 0x3c9, val 0x88
vga_std_write_io addr 0x3c9, val 0x88
vga_std_write_io addr 0x3c9, val 0x88
vga_std_write_io addr 0x3c8, val 0xfa
vga_std_write_io addr 0x3c9, val 0x77
vga_std_write_io addr 0x3c9, val 0x77
vga_std_write_io addr 0x3c9, val 0x77
vga_std_write_io addr 0x3c8, val 0xfb
vga_std_write_io addr 0x3c9, val 0x55
vga_std_write_io addr 0x3c9, val 0x55
vga_std_write_io addr 0x3c9, val 0x55
vga_std_write_io addr 0x3c8, val 0xfc
vga_std_write_io addr 0x3c9, val 0x44
vga_std_write_io addr 0x3c9, val 0x44
vga_std_write_io addr 0x3c9, val 0x44
vga_std_write_io addr 0x3c8, val 0xfd
vga_std_write_io addr 0x3c9, val 0x22
vga_std_write_io addr 0x3c9, val 0x22
vga_std_write_io addr 0x3c9, val 0x22
vga_std_write_io addr 0x3c8, val 0xfe
vga_std_write_io addr 0x3c9, val 0x11
vga_std_write_io addr 0x3c9, val 0x11
vga_std_write_io addr 0x3c9, val 0x11
vga_std_write_io addr 0x3c8, val 0xff
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0
vga_std_write_io addr 0x3c9, val 0x0

- Thousands of colours (15-bit color), corrupted

vga_vbe_write index 0x4, val 0x0
vga_vbe_write index 0x3, val 0xf
vga_vbe_write index 0x1, val 0x280
vga_vbe_write index 0x2, val 0x1e0
vga_vbe_write index 0x5, val 0x0
vga_vbe_write index 0x6, val 0x280
vga_vbe_write index 0x7, val 0x3c0
vga_vbe_write index 0x8, val 0x0
vga_vbe_write index 0x9, val 0x0
vga_vbe_write index 0x4, val 0x61

- Millions of colours (32-bit color), works

vga_vbe_write index 0x4, val 0x0
vga_vbe_write index 0x3, val 0x20
vga_vbe_write index 0x1, val 0x280
vga_vbe_write index 0x2, val 0x1e0
vga_vbe_write index 0x5, val 0x0
vga_vbe_write index 0x6, val 0x280
vga_vbe_write index 0x7, val 0x3c0
vga_vbe_write index 0x8, val 0x0
vga_vbe_write index 0x9, val 0x0
vga_vbe_write index 0x4, val 0x61


ATB,

Mark.


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: Corrupted display changing screen colour depth in qemu-system-ppc/MacOS
  2022-06-16 12:37   ` Mark Cave-Ayland
@ 2022-06-17  9:55     ` Gerd Hoffmann
  2022-06-17 12:37       ` Marc-André Lureau
  0 siblings, 1 reply; 9+ messages in thread
From: Gerd Hoffmann @ 2022-06-17  9:55 UTC (permalink / raw)
  To: Mark Cave-Ayland; +Cc: qemu-devel, Marc-André Lureau, Howard Spoelstra

  Hi,

> > Can you try ditch the QEMU_ALLOCATED_FLAG check added by the commit?
> 
> Commit cb8962c146 drops the QEMU_ALLOCATED_FLAG check: if I add it back in
> with the following diff on top then everything works again:

Ah, the other way around.

> diff --git a/ui/console.c b/ui/console.c
> index 365a2c14b8..decae4287f 100644
> --- a/ui/console.c
> +++ b/ui/console.c
> @@ -2400,11 +2400,12 @@ static void vc_chr_open(Chardev *chr,
> 
>  void qemu_console_resize(QemuConsole *s, int width, int height)
>  {
> -    DisplaySurface *surface;
> +    DisplaySurface *surface = qemu_console_surface(s);
> 
>      assert(s->console_type == GRAPHIC_CONSOLE);
> 
> -    if (qemu_console_get_width(s, -1) == width &&
> +    if (surface && (surface->flags & QEMU_ALLOCATED_FLAG) &&
> +        qemu_console_get_width(s, -1) == width &&
>          qemu_console_get_height(s, -1) == height) {
>          return;
>      }
> 
> > Which depth changes triggers this?  Going from direct color to a
> > paletted mode?
> 
> A quick test suggests anything that isn't 32-bit colour is affected.

Hmm, I think the commit should simply be reverted.

Short-cutting the qemu_console_resize() call is only valid in case the
current surface was created by qemu_console_resize() too.  When it is
something else -- typically a surface backed by vga vram -- it's not.
Looking at the QEMU_ALLOCATED_FLAG checks exactly that ...

take care,
  Gerd



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Corrupted display changing screen colour depth in qemu-system-ppc/MacOS
  2022-06-17  9:55     ` Gerd Hoffmann
@ 2022-06-17 12:37       ` Marc-André Lureau
  2022-07-22 12:28         ` Howard Spoelstra
  0 siblings, 1 reply; 9+ messages in thread
From: Marc-André Lureau @ 2022-06-17 12:37 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Mark Cave-Ayland, qemu-devel, Howard Spoelstra

Hi

On Fri, Jun 17, 2022 at 1:56 PM Gerd Hoffmann <kraxel@redhat.com> wrote:
>
>   Hi,
>
> > > Can you try ditch the QEMU_ALLOCATED_FLAG check added by the commit?
> >
> > Commit cb8962c146 drops the QEMU_ALLOCATED_FLAG check: if I add it back in
> > with the following diff on top then everything works again:
>
> Ah, the other way around.
>
> > diff --git a/ui/console.c b/ui/console.c
> > index 365a2c14b8..decae4287f 100644
> > --- a/ui/console.c
> > +++ b/ui/console.c
> > @@ -2400,11 +2400,12 @@ static void vc_chr_open(Chardev *chr,
> >
> >  void qemu_console_resize(QemuConsole *s, int width, int height)
> >  {
> > -    DisplaySurface *surface;
> > +    DisplaySurface *surface = qemu_console_surface(s);
> >
> >      assert(s->console_type == GRAPHIC_CONSOLE);
> >
> > -    if (qemu_console_get_width(s, -1) == width &&
> > +    if (surface && (surface->flags & QEMU_ALLOCATED_FLAG) &&
> > +        qemu_console_get_width(s, -1) == width &&
> >          qemu_console_get_height(s, -1) == height) {
> >          return;
> >      }
> >
> > > Which depth changes triggers this?  Going from direct color to a
> > > paletted mode?
> >
> > A quick test suggests anything that isn't 32-bit colour is affected.
>
> Hmm, I think the commit should simply be reverted.
>
> Short-cutting the qemu_console_resize() call is only valid in case the
> current surface was created by qemu_console_resize() too.  When it is
> something else -- typically a surface backed by vga vram -- it's not.
> Looking at the QEMU_ALLOCATED_FLAG checks exactly that ...

Oh ok, it might be worth adding a comment to clarify that. By
reverting, we are going back to the situation where
qemu_console_resize() will create a needless surface when rendering
with GL. As I tried to explain in the commit message, it will need
more changes to prevent that. I can take a look later.



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Corrupted display changing screen colour depth in qemu-system-ppc/MacOS
  2022-06-17 12:37       ` Marc-André Lureau
@ 2022-07-22 12:28         ` Howard Spoelstra
  2022-07-22 13:44           ` Marc-André Lureau
  0 siblings, 1 reply; 9+ messages in thread
From: Howard Spoelstra @ 2022-07-22 12:28 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: Gerd Hoffmann, Mark Cave-Ayland, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 2196 bytes --]

On Fri, Jun 17, 2022 at 2:38 PM Marc-André Lureau <
marcandre.lureau@redhat.com> wrote:

> Hi
>
> On Fri, Jun 17, 2022 at 1:56 PM Gerd Hoffmann <kraxel@redhat.com> wrote:
> >
> >   Hi,
> >
> > > > Can you try ditch the QEMU_ALLOCATED_FLAG check added by the commit?
> > >
> > > Commit cb8962c146 drops the QEMU_ALLOCATED_FLAG check: if I add it
> back in
> > > with the following diff on top then everything works again:
> >
> > Ah, the other way around.
> >
> > > diff --git a/ui/console.c b/ui/console.c
> > > index 365a2c14b8..decae4287f 100644
> > > --- a/ui/console.c
> > > +++ b/ui/console.c
> > > @@ -2400,11 +2400,12 @@ static void vc_chr_open(Chardev *chr,
> > >
> > >  void qemu_console_resize(QemuConsole *s, int width, int height)
> > >  {
> > > -    DisplaySurface *surface;
> > > +    DisplaySurface *surface = qemu_console_surface(s);
> > >
> > >      assert(s->console_type == GRAPHIC_CONSOLE);
> > >
> > > -    if (qemu_console_get_width(s, -1) == width &&
> > > +    if (surface && (surface->flags & QEMU_ALLOCATED_FLAG) &&
> > > +        qemu_console_get_width(s, -1) == width &&
> > >          qemu_console_get_height(s, -1) == height) {
> > >          return;
> > >      }
> > >
> > > > Which depth changes triggers this?  Going from direct color to a
> > > > paletted mode?
> > >
> > > A quick test suggests anything that isn't 32-bit colour is affected.
> >
> > Hmm, I think the commit should simply be reverted.
> >
> > Short-cutting the qemu_console_resize() call is only valid in case the
> > current surface was created by qemu_console_resize() too.  When it is
> > something else -- typically a surface backed by vga vram -- it's not.
> > Looking at the QEMU_ALLOCATED_FLAG checks exactly that ...
>
> Oh ok, it might be worth adding a comment to clarify that. By
> reverting, we are going back to the situation where
> qemu_console_resize() will create a needless surface when rendering
> with GL. As I tried to explain in the commit message, it will need
> more changes to prevent that. I can take a look later.
>
>
Hi Marc-André,

I wondered whether you've had a chance to look at this?

Best,
Howard

[-- Attachment #2: Type: text/html, Size: 3081 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Corrupted display changing screen colour depth in qemu-system-ppc/MacOS
  2022-07-22 12:28         ` Howard Spoelstra
@ 2022-07-22 13:44           ` Marc-André Lureau
  2022-07-22 16:40             ` Mark Cave-Ayland
  0 siblings, 1 reply; 9+ messages in thread
From: Marc-André Lureau @ 2022-07-22 13:44 UTC (permalink / raw)
  To: Howard Spoelstra; +Cc: Gerd Hoffmann, Mark Cave-Ayland, qemu-devel

Hi

On Fri, Jul 22, 2022 at 4:28 PM Howard Spoelstra <hsp.cat7@gmail.com> wrote:
>
>
>
> On Fri, Jun 17, 2022 at 2:38 PM Marc-André Lureau <marcandre.lureau@redhat.com> wrote:
>>
>> Hi
>>
>> On Fri, Jun 17, 2022 at 1:56 PM Gerd Hoffmann <kraxel@redhat.com> wrote:
>> >
>> >   Hi,
>> >
>> > > > Can you try ditch the QEMU_ALLOCATED_FLAG check added by the commit?
>> > >
>> > > Commit cb8962c146 drops the QEMU_ALLOCATED_FLAG check: if I add it back in
>> > > with the following diff on top then everything works again:
>> >
>> > Ah, the other way around.
>> >
>> > > diff --git a/ui/console.c b/ui/console.c
>> > > index 365a2c14b8..decae4287f 100644
>> > > --- a/ui/console.c
>> > > +++ b/ui/console.c
>> > > @@ -2400,11 +2400,12 @@ static void vc_chr_open(Chardev *chr,
>> > >
>> > >  void qemu_console_resize(QemuConsole *s, int width, int height)
>> > >  {
>> > > -    DisplaySurface *surface;
>> > > +    DisplaySurface *surface = qemu_console_surface(s);
>> > >
>> > >      assert(s->console_type == GRAPHIC_CONSOLE);
>> > >
>> > > -    if (qemu_console_get_width(s, -1) == width &&
>> > > +    if (surface && (surface->flags & QEMU_ALLOCATED_FLAG) &&
>> > > +        qemu_console_get_width(s, -1) == width &&
>> > >          qemu_console_get_height(s, -1) == height) {
>> > >          return;
>> > >      }
>> > >
>> > > > Which depth changes triggers this?  Going from direct color to a
>> > > > paletted mode?
>> > >
>> > > A quick test suggests anything that isn't 32-bit colour is affected.
>> >
>> > Hmm, I think the commit should simply be reverted.
>> >
>> > Short-cutting the qemu_console_resize() call is only valid in case the
>> > current surface was created by qemu_console_resize() too.  When it is
>> > something else -- typically a surface backed by vga vram -- it's not.
>> > Looking at the QEMU_ALLOCATED_FLAG checks exactly that ...
>>
>> Oh ok, it might be worth adding a comment to clarify that. By
>> reverting, we are going back to the situation where
>> qemu_console_resize() will create a needless surface when rendering
>> with GL. As I tried to explain in the commit message, it will need
>> more changes to prevent that. I can take a look later.
>>
>
> Hi Marc-André,
>
> I wondered whether you've had a chance to look at this?
>

No, it's not clear to me how to reproduce it. Someone that can
actually test it should send a patch with some comments to explain it.

thanks



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Corrupted display changing screen colour depth in qemu-system-ppc/MacOS
  2022-07-22 13:44           ` Marc-André Lureau
@ 2022-07-22 16:40             ` Mark Cave-Ayland
  2022-07-23  8:59               ` Mark Cave-Ayland
  0 siblings, 1 reply; 9+ messages in thread
From: Mark Cave-Ayland @ 2022-07-22 16:40 UTC (permalink / raw)
  To: Marc-André Lureau, Howard Spoelstra; +Cc: Gerd Hoffmann, qemu-devel

On 22/07/2022 14:44, Marc-André Lureau wrote:

> Hi
> 
> On Fri, Jul 22, 2022 at 4:28 PM Howard Spoelstra <hsp.cat7@gmail.com> wrote:
>>
>>
>>
>> On Fri, Jun 17, 2022 at 2:38 PM Marc-André Lureau <marcandre.lureau@redhat.com> wrote:
>>>
>>> Hi
>>>
>>> On Fri, Jun 17, 2022 at 1:56 PM Gerd Hoffmann <kraxel@redhat.com> wrote:
>>>>
>>>>    Hi,
>>>>
>>>>>> Can you try ditch the QEMU_ALLOCATED_FLAG check added by the commit?
>>>>>
>>>>> Commit cb8962c146 drops the QEMU_ALLOCATED_FLAG check: if I add it back in
>>>>> with the following diff on top then everything works again:
>>>>
>>>> Ah, the other way around.
>>>>
>>>>> diff --git a/ui/console.c b/ui/console.c
>>>>> index 365a2c14b8..decae4287f 100644
>>>>> --- a/ui/console.c
>>>>> +++ b/ui/console.c
>>>>> @@ -2400,11 +2400,12 @@ static void vc_chr_open(Chardev *chr,
>>>>>
>>>>>   void qemu_console_resize(QemuConsole *s, int width, int height)
>>>>>   {
>>>>> -    DisplaySurface *surface;
>>>>> +    DisplaySurface *surface = qemu_console_surface(s);
>>>>>
>>>>>       assert(s->console_type == GRAPHIC_CONSOLE);
>>>>>
>>>>> -    if (qemu_console_get_width(s, -1) == width &&
>>>>> +    if (surface && (surface->flags & QEMU_ALLOCATED_FLAG) &&
>>>>> +        qemu_console_get_width(s, -1) == width &&
>>>>>           qemu_console_get_height(s, -1) == height) {
>>>>>           return;
>>>>>       }
>>>>>
>>>>>> Which depth changes triggers this?  Going from direct color to a
>>>>>> paletted mode?
>>>>>
>>>>> A quick test suggests anything that isn't 32-bit colour is affected.
>>>>
>>>> Hmm, I think the commit should simply be reverted.
>>>>
>>>> Short-cutting the qemu_console_resize() call is only valid in case the
>>>> current surface was created by qemu_console_resize() too.  When it is
>>>> something else -- typically a surface backed by vga vram -- it's not.
>>>> Looking at the QEMU_ALLOCATED_FLAG checks exactly that ...
>>>
>>> Oh ok, it might be worth adding a comment to clarify that. By
>>> reverting, we are going back to the situation where
>>> qemu_console_resize() will create a needless surface when rendering
>>> with GL. As I tried to explain in the commit message, it will need
>>> more changes to prevent that. I can take a look later.
>>>
>>
>> Hi Marc-André,
>>
>> I wondered whether you've had a chance to look at this?
>>
> 
> No, it's not clear to me how to reproduce it. Someone that can
> actually test it should send a patch with some comments to explain it.

Unfortunately I don't know anything about the host display code, but I think I should 
be able to come up with some Forth to run from the command line that will reproduce 
the issue with qemu-system-ppc. Let me see if I can come up with something...


ATB,

Mark.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Corrupted display changing screen colour depth in qemu-system-ppc/MacOS
  2022-07-22 16:40             ` Mark Cave-Ayland
@ 2022-07-23  8:59               ` Mark Cave-Ayland
  0 siblings, 0 replies; 9+ messages in thread
From: Mark Cave-Ayland @ 2022-07-23  8:59 UTC (permalink / raw)
  To: Marc-André Lureau, Howard Spoelstra; +Cc: Gerd Hoffmann, qemu-devel

On 22/07/2022 17:40, Mark Cave-Ayland wrote:

> On 22/07/2022 14:44, Marc-André Lureau wrote:
> 
>> Hi
>>
>> On Fri, Jul 22, 2022 at 4:28 PM Howard Spoelstra <hsp.cat7@gmail.com> wrote:
>>>
>>>
>>>
>>> On Fri, Jun 17, 2022 at 2:38 PM Marc-André Lureau <marcandre.lureau@redhat.com> 
>>> wrote:
>>>>
>>>> Hi
>>>>
>>>> On Fri, Jun 17, 2022 at 1:56 PM Gerd Hoffmann <kraxel@redhat.com> wrote:
>>>>>
>>>>>    Hi,
>>>>>
>>>>>>> Can you try ditch the QEMU_ALLOCATED_FLAG check added by the commit?
>>>>>>
>>>>>> Commit cb8962c146 drops the QEMU_ALLOCATED_FLAG check: if I add it back in
>>>>>> with the following diff on top then everything works again:
>>>>>
>>>>> Ah, the other way around.
>>>>>
>>>>>> diff --git a/ui/console.c b/ui/console.c
>>>>>> index 365a2c14b8..decae4287f 100644
>>>>>> --- a/ui/console.c
>>>>>> +++ b/ui/console.c
>>>>>> @@ -2400,11 +2400,12 @@ static void vc_chr_open(Chardev *chr,
>>>>>>
>>>>>>   void qemu_console_resize(QemuConsole *s, int width, int height)
>>>>>>   {
>>>>>> -    DisplaySurface *surface;
>>>>>> +    DisplaySurface *surface = qemu_console_surface(s);
>>>>>>
>>>>>>       assert(s->console_type == GRAPHIC_CONSOLE);
>>>>>>
>>>>>> -    if (qemu_console_get_width(s, -1) == width &&
>>>>>> +    if (surface && (surface->flags & QEMU_ALLOCATED_FLAG) &&
>>>>>> +        qemu_console_get_width(s, -1) == width &&
>>>>>>           qemu_console_get_height(s, -1) == height) {
>>>>>>           return;
>>>>>>       }
>>>>>>
>>>>>>> Which depth changes triggers this?  Going from direct color to a
>>>>>>> paletted mode?
>>>>>>
>>>>>> A quick test suggests anything that isn't 32-bit colour is affected.
>>>>>
>>>>> Hmm, I think the commit should simply be reverted.
>>>>>
>>>>> Short-cutting the qemu_console_resize() call is only valid in case the
>>>>> current surface was created by qemu_console_resize() too.  When it is
>>>>> something else -- typically a surface backed by vga vram -- it's not.
>>>>> Looking at the QEMU_ALLOCATED_FLAG checks exactly that ...
>>>>
>>>> Oh ok, it might be worth adding a comment to clarify that. By
>>>> reverting, we are going back to the situation where
>>>> qemu_console_resize() will create a needless surface when rendering
>>>> with GL. As I tried to explain in the commit message, it will need
>>>> more changes to prevent that. I can take a look later.
>>>>
>>>
>>> Hi Marc-André,
>>>
>>> I wondered whether you've had a chance to look at this?
>>>
>>
>> No, it's not clear to me how to reproduce it. Someone that can
>> actually test it should send a patch with some comments to explain it.
> 
> Unfortunately I don't know anything about the host display code, but I think I should 
> be able to come up with some Forth to run from the command line that will reproduce 
> the issue with qemu-system-ppc. Let me see if I can come up with something...

Okay here's the command line reproducer for qemu-system-ppc:

./build/qemu-system-ppc -M mac99 -prom-env 'use-nvramrc?=true' -prom-env nvramrc=': 
vbe-w! f20001ce le-w! f20001d0 le-w! ; : set-res 0 4 vbe-w! 20 3 vbe-w! 320 1 vbe-w! 
258 2 vbe-w! 61 4 vbe-w! 0 4 vbe-w! 8 3 vbe-w! 320 1 vbe-w! 258 2 vbe-w! 61 4 vbe-w! 
320 to openbios-video-width 258 to openbios-video-height 320 to line-bytes 8 to 
depth-bits ;' -prom-env 'boot-command=cd /chosen set-res show-devs' -trace '*vbe*'

I've also uploaded the full command line to 
https://www.ilande.co.uk/tmp/qemu/ppc-vbe-repro.txt just in case the spacing gets 
mangled by my mail client.

What this command does is to set the screen resolution to 800x600 32bpp followed by 
800x600 8bpp using the Bochs VBE registers, and then dump out the device tree to the 
framebuffer.

If you run this command on current QEMU git then you end up with the same problem 
exhibited by the QEMU MacOS VGA driver which is that the individual planes become 
visible on the display as per https://www.ilande.co.uk/tmp/qemu/ppc-vbe-repro-bad.png.

Reverting the effect of cb8962c146 using the patch above restores the previous 
working behaviour where you end up with black text on a grey background as per 
https://www.ilande.co.uk/tmp/qemu/ppc-vbe-repro-good.png.


ATB,

Mark.


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-07-23  9:18 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-16  8:54 Corrupted display changing screen colour depth in qemu-system-ppc/MacOS Mark Cave-Ayland
2022-06-16 12:07 ` Gerd Hoffmann
2022-06-16 12:37   ` Mark Cave-Ayland
2022-06-17  9:55     ` Gerd Hoffmann
2022-06-17 12:37       ` Marc-André Lureau
2022-07-22 12:28         ` Howard Spoelstra
2022-07-22 13:44           ` Marc-André Lureau
2022-07-22 16:40             ` Mark Cave-Ayland
2022-07-23  8:59               ` Mark Cave-Ayland

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.