qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] cocoa: Fix VBE function Set Display Start
@ 2012-11-21 19:08 Henry Harrington
  2012-11-27  5:03 ` Andreas Färber
  0 siblings, 1 reply; 3+ messages in thread
From: Henry Harrington @ 2012-11-21 19:08 UTC (permalink / raw)
  To: qemu-devel; +Cc: andreas.faerber, Henry Harrington

Register a dpy_gfx_setdata callback so that the Cocoa code
is notified whenever the screen start address changes.

Signed-off-by: Henry Harrington <henry.harrington@gmail.com>
---
 ui/cocoa.m |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index 87d2e44..97010bc 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -265,6 +265,7 @@ static int cocoa_keycode_to_qemu(int keycode)
     BOOL isTabletEnabled;
 }
 - (void) resizeContentToWidth:(int)w height:(int)h displayState:(DisplayState *)ds;
+- (void) updateDataOffset:(DisplayState *)ds;
 - (void) grabMouse;
 - (void) ungrabMouse;
 - (void) toggleFullScreen:(id)sender;
@@ -429,6 +430,17 @@ QemuCocoaView *cocoaView;
     [self setFrame:NSMakeRect(cx, cy, cw, ch)];
 }
 
+- (void) updateDataOffset:(DisplayState *)ds
+{
+    COCOA_DEBUG("QemuCocoaView: UpdateDataOffset\n");
+
+    // update screenBuffer
+    if (dataProviderRef)
+        CGDataProviderRelease(dataProviderRef);
+
+    dataProviderRef = CGDataProviderCreateWithData(NULL, ds_get_data(ds), ds_get_width(ds) * 4 * ds_get_height(ds), NULL);
+}
+
 - (void) toggleFullScreen:(id)sender
 {
     COCOA_DEBUG("QemuCocoaView: toggleFullScreen\n");
@@ -1004,6 +1016,11 @@ static void cocoa_refresh(DisplayState *ds)
     vga_hw_update();
 }
 
+static void cocoa_setdata(DisplayState *ds)
+{
+  [cocoaView updateDataOffset:ds];
+}
+
 static void cocoa_cleanup(void)
 {
     COCOA_DEBUG("qemu_cocoa: cocoa_cleanup\n");
@@ -1020,6 +1037,7 @@ void cocoa_display_init(DisplayState *ds, int full_screen)
     dcl->dpy_gfx_update = cocoa_update;
     dcl->dpy_gfx_resize = cocoa_resize;
     dcl->dpy_refresh = cocoa_refresh;
+    dcl->dpy_gfx_setdata = cocoa_setdata;
 
 	register_displaychangelistener(ds, dcl);
 
-- 
1.7.6.1

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

* Re: [Qemu-devel] [PATCH] cocoa: Fix VBE function Set Display Start
  2012-11-21 19:08 [Qemu-devel] [PATCH] cocoa: Fix VBE function Set Display Start Henry Harrington
@ 2012-11-27  5:03 ` Andreas Färber
  2012-11-27 18:54   ` Henry Harrington
  0 siblings, 1 reply; 3+ messages in thread
From: Andreas Färber @ 2012-11-27  5:03 UTC (permalink / raw)
  To: Henry Harrington; +Cc: Peter Maydell, qemu-devel

Am 21.11.2012 20:08, schrieb Henry Harrington:
> Register a dpy_gfx_setdata callback so that the Cocoa code
> is notified whenever the screen start address changes.
> 
> Signed-off-by: Henry Harrington <henry.harrington@gmail.com>
> ---
>  ui/cocoa.m |   18 ++++++++++++++++++
>  1 files changed, 18 insertions(+), 0 deletions(-)
> 
> diff --git a/ui/cocoa.m b/ui/cocoa.m
> index 87d2e44..97010bc 100644
> --- a/ui/cocoa.m
> +++ b/ui/cocoa.m
> @@ -265,6 +265,7 @@ static int cocoa_keycode_to_qemu(int keycode)
>      BOOL isTabletEnabled;
>  }
>  - (void) resizeContentToWidth:(int)w height:(int)h displayState:(DisplayState *)ds;
> +- (void) updateDataOffset:(DisplayState *)ds;
>  - (void) grabMouse;
>  - (void) ungrabMouse;
>  - (void) toggleFullScreen:(id)sender;
> @@ -429,6 +430,17 @@ QemuCocoaView *cocoaView;
>      [self setFrame:NSMakeRect(cx, cy, cw, ch)];
>  }
>  
> +- (void) updateDataOffset:(DisplayState *)ds
> +{
> +    COCOA_DEBUG("QemuCocoaView: UpdateDataOffset\n");
> +
> +    // update screenBuffer
> +    if (dataProviderRef)
> +        CGDataProviderRelease(dataProviderRef);

Please add braces for if.

> +
> +    dataProviderRef = CGDataProviderCreateWithData(NULL, ds_get_data(ds), ds_get_width(ds) * 4 * ds_get_height(ds), NULL);

This line seems overly long, please keep within 80 chars.

> +}
> +
>  - (void) toggleFullScreen:(id)sender
>  {
>      COCOA_DEBUG("QemuCocoaView: toggleFullScreen\n");
> @@ -1004,6 +1016,11 @@ static void cocoa_refresh(DisplayState *ds)
>      vga_hw_update();
>  }
>  
> +static void cocoa_setdata(DisplayState *ds)
> +{
> +  [cocoaView updateDataOffset:ds];

Please indent using 4 spaces.

> +}
> +
>  static void cocoa_cleanup(void)
>  {
>      COCOA_DEBUG("qemu_cocoa: cocoa_cleanup\n");
> @@ -1020,6 +1037,7 @@ void cocoa_display_init(DisplayState *ds, int full_screen)
>      dcl->dpy_gfx_update = cocoa_update;
>      dcl->dpy_gfx_resize = cocoa_resize;
>      dcl->dpy_refresh = cocoa_refresh;
> +    dcl->dpy_gfx_setdata = cocoa_setdata;
>  
>  	register_displaychangelistener(ds, dcl);
>  

Apart from the style issues above (you can use scripts/checkpatch.pl to
verify) this looks okay. Unfortunately I am not getting pixman built on
OSX so am still unable to test...

Am I understanding correctly that this is an optional hook and not a bug
fix for 1.3? How can it be verified?

Regards,
Andreas

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

* Re: [Qemu-devel] [PATCH] cocoa: Fix VBE function Set Display Start
  2012-11-27  5:03 ` Andreas Färber
@ 2012-11-27 18:54   ` Henry Harrington
  0 siblings, 0 replies; 3+ messages in thread
From: Henry Harrington @ 2012-11-27 18:54 UTC (permalink / raw)
  To: Andreas Färber; +Cc: Peter Maydell, qemu-devel

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

On Tue, Nov 27, 2012 at 5:03 AM, Andreas Färber <andreas.faerber@web.de> wrote:
> Am 21.11.2012 20:08, schrieb Henry Harrington:
> Apart from the style issues above (you can use scripts/checkpatch.pl to
> verify) this looks okay. Unfortunately I am not getting pixman built on
> OSX so am still unable to test...

Thanks, I'll fix the style issues and submit a new patch.

> Am I understanding correctly that this is an optional hook and not a bug
> fix for 1.3? How can it be verified?
>
> Regards,
> Andreas

The setdata callback is required, even though the Cocoa UI works reasonably
well without it. I've attached a simple testcase, which rapidly switches
between two virtual screens using VBE (one is blue/green, and the other
is green/red). Without the fix Qemu does not switch between screens.

There was a similar bug in the VNC UI which was fixed in commit 1d3323d.

Henry

[-- Attachment #2: display-test.asm --]
[-- Type: application/octet-stream, Size: 4519 bytes --]

[ORG 0x7c00]
[BITS 16]
        jmp 0:entry
entry:
        mov ax, 0
        mov ds, ax
        mov es, ax
        ;; stack goes just below the boot sector.
        mov ss, ax
        mov sp, 0x7c00

        ;; Get info for mode 111 (640x480x2)
        mov ax, 0x4f01
        mov cx, 0x0111
        mov di, mode_info
        int 0x10
        ;; Switch to mode 111, with linear framebuffer.
        mov ax, 0x4f02
        mov bx, 0x4111
        int 0x10

        ;; Enter unreal mode so memory above 1MB can be accessed.
        cli
        push es
        push ds
        lgdt [gdtinfo]
        mov eax, cr0
        or al, 1
        mov cr0, eax
        mov bx, 0x8
        mov ds, bx
        mov es, bx
        and al, 0xfe
        mov cr0, eax
        pop ds
        pop es
        sti

        ;; Fill a 640x960 area with equal parts blue, green and red.
        ;; This is twice as large as the visible screen, so only the
        ;; blue area and part of the green area will be displayed initially.
        cld
        mov edi, [PhysBasePtr]
        mov eax, 0x1f           ; blue
        mov ecx, 640*320
        rep a32 stosw
        mov eax, 0x7e0          ; green
        mov ecx, 640*320
        rep a32 stosw
        mov eax, 0xf800         ; red
        mov ecx, 640*320
        rep a32 stosw

again:
        ;; Use VBE function 7 Set Display Start to flip between
        ;; the blue/green and green/red regions.
        mov ax, 0x4f07
        mov bx, 0x0
        mov cx, 0x0
        mov dx, [offset1]
        int 0x10
        mov dx, [offset1]
        mov ax, [offset2]
        mov [offset1], ax
        mov [offset2], dx
        jmp again

offset1:        dw 0
offset2:        dw 480

gdtinfo:
   dw gdt_end - gdt - 1   ;last byte in table
   dd gdt                 ;start of table

gdt         dd 0,0        ; entry 0 is always unused
flatdesc    db 0xff, 0xff, 0, 0, 0, 10010010b, 11001111b, 0
gdt_end:

; Make the file 512 bytes long
TIMES 510-($-$$) DB 0

; Add the boot signature
dw 0AA55h

        [section .bss]
mode_info:
             ; Mandatory information for all VBE revisions
ModeAttributes          resw 1         ; mode attributes
WinAAttributes          resb 1         ; window A attributes
WinBAttributes          resb 1         ; window B attributes
WinGranularity          resw 1         ; window granularity
WinSize                 resw 1         ; window size
WinASegment             resw 1         ; window A start segment
WinBSegment             resw 1         ; window B start segment
WinFuncPtr              resd 1         ; pointer to window function
BytesPerScanLine        resw 1         ; bytes per scan line

        ; Mandatory information for VBE 1.2 and above
XResolution             resw 1         ; horizontal resolution in pixels or characters3
YResolution             resw 1         ; vertical resolution in pixels or characters
XCharSize               resb 1         ; character cell width in pixels
YCharSize               resb 1         ; character cell height in pixels
NumberOfPlanes          resb 1         ; number of memory planes
BitsPerPixel            resb 1         ; bits per pixel
NumberOfBanks           resb 1         ; number of banks
MemoryModel             resb 1         ; memory model type
BankSize                resb 1         ; bank size in KB
NumberOfImagePages      resb 1         ; number of images
Reserved                resb 1         ; reserved for page function

        ; Direct Color fields (required for direct/6 and YUV/7 memory models)
RedMaskSize             resb 1         ; size of direct color red mask in bits
RedFieldPosition        resb 1         ; bit position of lsb of red mask
GreenMaskSize           resb 1         ; size of direct color green mask in bits
GreenFieldPosition      resb 1         ; bit position of lsb of green mask
BlueMaskSize            resb 1         ; size of direct color blue mask in bits
BlueFieldPosition       resb 1         ; bit position of lsb of blue mask
RsvdMaskSize            resb 1         ; size of direct color reserved mask in bits
RsvdFieldPosition       resb 1         ; bit position of lsb of reserved mask
DirectColorModeInfo     resb 1         ; direct color mode attributes
        ; Mandatory information for VBE 2.0 and above
PhysBasePtr             resd 1         ; physical address for flat memory frame buffer
OffScreenMemOffset      resd 1         ; pointer to start of off screen memory
OffScreenMemSize        resw 1         ; amount of off screen memory in 1k units

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

end of thread, other threads:[~2012-11-27 18:54 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-21 19:08 [Qemu-devel] [PATCH] cocoa: Fix VBE function Set Display Start Henry Harrington
2012-11-27  5:03 ` Andreas Färber
2012-11-27 18:54   ` Henry Harrington

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).