WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] ioemu: cleaning DisplayState->dpy_resize

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] ioemu: cleaning DisplayState->dpy_resize interface
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 10 Jun 2008 03:40:16 -0700
Delivery-date: Tue, 10 Jun 2008 03:40:24 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1213000755 -3600
# Node ID 638811f870bac2863b5ee7cf347866015593099f
# Parent  1de5d17497fd0518c153ec37123fc3f9cce6332f
ioemu: cleaning DisplayState->dpy_resize interface

Bring the DisplayState dpy_resize interface back to how it is in qemu
mainstream, thus making the code easier to merge.
In order to support sharing the framebuffer, I am adding a new resize
interface called dpy_resize_shared that also has a depth and a pixels
parameters. As a consequence I could remove the dpy_colourdepth
callback and make the code cleaner and easier to read.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
---
 tools/ioemu/cocoa.m    |    2 
 tools/ioemu/hw/pl110.c |    4 -
 tools/ioemu/hw/tcx.c   |    2 
 tools/ioemu/hw/vga.c   |  153 ++++++++++++++++++++++++++-----------------------
 tools/ioemu/hw/xenfb.c |   34 +++++++---
 tools/ioemu/sdl.c      |   35 ++++++++---
 tools/ioemu/vl.c       |    1 
 tools/ioemu/vl.h       |   20 +++---
 tools/ioemu/vnc.c      |   18 +++--
 9 files changed, 156 insertions(+), 113 deletions(-)

diff -r 1de5d17497fd -r 638811f870ba tools/ioemu/cocoa.m
--- a/tools/ioemu/cocoa.m       Mon Jun 09 09:37:56 2008 +0100
+++ b/tools/ioemu/cocoa.m       Mon Jun 09 09:39:15 2008 +0100
@@ -96,7 +96,7 @@ static void cocoa_update(DisplayState *d
     cocoa_resize
  ------------------------------------------------------
 */
-static void cocoa_resize(DisplayState *ds, int w, int h, int linesize)
+static void cocoa_resize(DisplayState *ds, int w, int h)
 {
     const int device_bpp = 32;
     static void *screen_pixels;
diff -r 1de5d17497fd -r 638811f870ba tools/ioemu/hw/pl110.c
--- a/tools/ioemu/hw/pl110.c    Mon Jun 09 09:37:56 2008 +0100
+++ b/tools/ioemu/hw/pl110.c    Mon Jun 09 09:39:15 2008 +0100
@@ -262,7 +262,7 @@ static void pl110_resize(pl110_state *s,
 {
     if (width != s->cols || height != s->rows) {
         if (pl110_enabled(s)) {
-            dpy_resize(s->ds, width, height, width * 4);
+            dpy_resize(s->ds, width, height);
         }
     }
     s->cols = width;
@@ -375,7 +375,7 @@ static void pl110_write(void *opaque, ta
         s->cr = val;
         s->bpp = (val >> 1) & 7;
         if (pl110_enabled(s)) {
-            dpy_resize(s->ds, s->cols, s->rows, s->cols * 4);
+            dpy_resize(s->ds, s->cols, s->rows);
         }
         break;
     case 10: /* LCDICR */
diff -r 1de5d17497fd -r 638811f870ba tools/ioemu/hw/tcx.c
--- a/tools/ioemu/hw/tcx.c      Mon Jun 09 09:37:56 2008 +0100
+++ b/tools/ioemu/hw/tcx.c      Mon Jun 09 09:39:15 2008 +0100
@@ -342,7 +342,7 @@ void tcx_init(DisplayState *ds, uint32_t
     register_savevm("tcx", addr, 1, tcx_save, tcx_load, s);
     qemu_register_reset(tcx_reset, s);
     tcx_reset(s);
-    dpy_resize(s->ds, width, height, width * 1);
+    dpy_resize(s->ds, width, height);
 }
 
 static void tcx_screen_dump(void *opaque, const char *filename)
diff -r 1de5d17497fd -r 638811f870ba tools/ioemu/hw/vga.c
--- a/tools/ioemu/hw/vga.c      Mon Jun 09 09:37:56 2008 +0100
+++ b/tools/ioemu/hw/vga.c      Mon Jun 09 09:39:15 2008 +0100
@@ -1065,6 +1065,8 @@ typedef unsigned int rgb_to_pixel_dup_fu
 
 static rgb_to_pixel_dup_func *rgb_to_pixel_dup_table[NB_DEPTHS];
 
+static int old_depth = 0;
+
 /* 
  * Text mode update 
  * Missing:
@@ -1089,40 +1091,6 @@ static void vga_draw_text(VGAState *s, i
     /* Disable dirty bit tracking */
     xc_hvm_track_dirty_vram(xc_handle, domid, 0, 0, NULL);
 
-    if (s->ds->dpy_colourdepth != NULL && s->ds->depth != 0)
-        s->ds->dpy_colourdepth(s->ds, 0);
-    s->rgb_to_pixel = 
-        rgb_to_pixel_dup_table[get_depth_index(s->ds)];
-
-    full_update |= update_palette16(s);
-    palette = s->last_palette;
-    
-    /* compute font data address (in plane 2) */
-    v = s->sr[3];
-    offset = (((v >> 4) & 1) | ((v << 1) & 6)) * 8192 * 4 + 2;
-    if (offset != s->font_offsets[0]) {
-        s->font_offsets[0] = offset;
-        full_update = 1;
-    }
-    font_base[0] = s->vram_ptr + offset;
-
-    offset = (((v >> 5) & 1) | ((v >> 1) & 6)) * 8192 * 4 + 2;
-    font_base[1] = s->vram_ptr + offset;
-    if (offset != s->font_offsets[1]) {
-        s->font_offsets[1] = offset;
-        full_update = 1;
-    }
-    if (s->plane_updated & (1 << 2)) {
-        /* if the plane 2 was modified since the last display, it
-           indicates the font may have been modified */
-        s->plane_updated = 0;
-        full_update = 1;
-    }
-    full_update |= update_basic_params(s);
-
-    line_offset = s->line_offset;
-    s1 = s->vram_ptr + (s->start_addr * 4);
-
     /* total width & height */
     cheight = (s->cr[9] & 0x1f) + 1;
     cw = 8;
@@ -1130,7 +1098,6 @@ static void vga_draw_text(VGAState *s, i
         cw = 9;
     if (s->sr[1] & 0x08)
         cw = 16; /* NOTE: no 18 pixel wide */
-    x_incr = cw * ((s->ds->depth + 7) >> 3);
     width = (s->cr[0x01] + 1);
     if (s->cr[0x06] == 100) {
         /* ugly hack for CGA 160x100x16 - explain me the logic */
@@ -1146,17 +1113,55 @@ static void vga_draw_text(VGAState *s, i
         return;
     }
 
-    if (width != s->last_width || height != s->last_height ||
+    s->last_scr_width = width * cw;
+    s->last_scr_height = height * cheight;
+    if (s->ds->dpy_resize_shared && old_depth) {
+        dpy_resize_shared(s->ds, s->last_scr_width, s->last_scr_height, 0, 
s->last_scr_width * (s->ds->depth / 8), NULL);
+        old_depth = 0;
+        full_update = 1;
+    } else if (width != s->last_width || height != s->last_height ||
         cw != s->last_cw || cheight != s->last_ch) {
-        s->last_scr_width = width * cw;
-        s->last_scr_height = height * cheight;
-        dpy_resize(s->ds, s->last_scr_width, s->last_scr_height, 
s->last_scr_width * (s->ds->depth / 8));
-        s->last_width = width;
-        s->last_height = height;
-        s->last_ch = cheight;
-        s->last_cw = cw;
+        dpy_resize(s->ds, s->last_scr_width, s->last_scr_height);
         full_update = 1;
     }
+    s->last_width = width;
+    s->last_height = height;
+    s->last_ch = cheight;
+    s->last_cw = cw;
+
+    s->rgb_to_pixel = 
+        rgb_to_pixel_dup_table[get_depth_index(s->ds)];
+
+    full_update |= update_palette16(s);
+    palette = s->last_palette;
+    
+    x_incr = cw * ((s->ds->depth + 7) >> 3);
+    /* compute font data address (in plane 2) */
+    v = s->sr[3];
+    offset = (((v >> 4) & 1) | ((v << 1) & 6)) * 8192 * 4 + 2;
+    if (offset != s->font_offsets[0]) {
+        s->font_offsets[0] = offset;
+        full_update = 1;
+    }
+    font_base[0] = s->vram_ptr + offset;
+
+    offset = (((v >> 5) & 1) | ((v >> 1) & 6)) * 8192 * 4 + 2;
+    font_base[1] = s->vram_ptr + offset;
+    if (offset != s->font_offsets[1]) {
+        s->font_offsets[1] = offset;
+        full_update = 1;
+    }
+    if (s->plane_updated & (1 << 2)) {
+        /* if the plane 2 was modified since the last display, it
+           indicates the font may have been modified */
+        s->plane_updated = 0;
+        full_update = 1;
+    }
+    full_update |= update_basic_params(s);
+
+    line_offset = s->line_offset;
+    s1 = s->vram_ptr + (s->start_addr * 4);
+
     cursor_offset = ((s->cr[0x0e] << 8) | s->cr[0x0f]) - s->start_addr;
     if (cursor_offset != s->cursor_offset ||
         s->cr[0xa] != s->cursor_start ||
@@ -1501,16 +1506,6 @@ static void vga_draw_graphic(VGAState *s
     s->get_resolution(s, &width, &height);
     disp_width = width;
 
-    ds_depth = s->ds->depth;
-    depth = s->get_bpp(s);
-    if (s->ds->dpy_colourdepth != NULL && 
-            (ds_depth != depth || !s->ds->shared_buf))
-        s->ds->dpy_colourdepth(s->ds, depth);
-    if (ds_depth != s->ds->depth) full_update = 1;
-
-    s->rgb_to_pixel = 
-        rgb_to_pixel_dup_table[get_depth_index(s->ds)];
-
     shift_control = (s->gr[0x05] >> 5) & 3;
     double_scan = (s->cr[0x09] >> 7);
     if (shift_control != 1) {
@@ -1527,12 +1522,44 @@ static void vga_draw_graphic(VGAState *s
         s->shift_control = shift_control;
         s->double_scan = double_scan;
     }
-    
+    if (shift_control == 1 && (s->sr[0x01] & 8)) {
+        disp_width <<= 1;
+    }
+
+    ds_depth = s->ds->depth;
+    depth = s->get_bpp(s);
+    if (s->ds->dpy_resize_shared) {
+        if (s->line_offset != s->last_line_offset || 
+            disp_width != s->last_width ||
+            height != s->last_height ||
+            old_depth != depth) {
+            dpy_resize_shared(s->ds, disp_width, height, depth, 
s->line_offset, s->vram_ptr + (s->start_addr * 4));
+            s->last_scr_width = disp_width;
+            s->last_scr_height = height;
+            s->last_width = disp_width;
+            s->last_height = height;
+            s->last_line_offset = s->line_offset;
+            old_depth = depth;
+            full_update = 1;
+        } else if (s->ds->shared_buf && (full_update || s->ds->data != 
s->vram_ptr + (s->start_addr * 4)))
+            s->ds->dpy_setdata(s->ds, s->vram_ptr + (s->start_addr * 4));
+    } else if (disp_width != s->last_width ||
+               height != s->last_height) {
+        dpy_resize(s->ds, disp_width, height);
+        s->last_scr_width = disp_width;
+        s->last_scr_height = height;
+        s->last_width = disp_width;
+        s->last_height = height;
+        full_update = 1;
+    }
+
+    s->rgb_to_pixel = 
+        rgb_to_pixel_dup_table[get_depth_index(s->ds)];
+
     if (shift_control == 0) {
         full_update |= update_palette16(s);
         if (s->sr[0x01] & 8) {
             v = VGA_DRAW_LINE4D2;
-            disp_width <<= 1;
         } else {
             v = VGA_DRAW_LINE4;
         }
@@ -1541,7 +1568,6 @@ static void vga_draw_graphic(VGAState *s
         full_update |= update_palette16(s);
         if (s->sr[0x01] & 8) {
             v = VGA_DRAW_LINE2D2;
-            disp_width <<= 1;
         } else {
             v = VGA_DRAW_LINE2;
         }
@@ -1579,19 +1605,6 @@ static void vga_draw_graphic(VGAState *s
     }
 
     vga_draw_line = vga_draw_line_table[v * NB_DEPTHS + 
get_depth_index(s->ds)];
-    if (s->line_offset != s->last_line_offset || 
-        disp_width != s->last_width ||
-        height != s->last_height) {
-        dpy_resize(s->ds, disp_width, height, s->line_offset);
-        s->last_scr_width = disp_width;
-        s->last_scr_height = height;
-        s->last_width = disp_width;
-        s->last_height = height;
-        s->last_line_offset = s->line_offset; 
-        full_update = 1;
-    }
-    if (s->ds->shared_buf && (full_update || s->ds->data != s->vram_ptr + 
(s->start_addr * 4)))
-        s->ds->dpy_setdata(s->ds, s->vram_ptr + (s->start_addr * 4));
     if (!s->ds->shared_buf && s->cursor_invalidate)
         s->cursor_invalidate(s);
     
@@ -2311,7 +2324,7 @@ static void vga_save_dpy_update(DisplayS
 {
 }
 
-static void vga_save_dpy_resize(DisplayState *s, int w, int h, int linesize)
+static void vga_save_dpy_resize(DisplayState *s, int w, int h)
 {
     s->linesize = w * 4;
     s->data = qemu_malloc(h * s->linesize);
diff -r 1de5d17497fd -r 638811f870ba tools/ioemu/hw/xenfb.c
--- a/tools/ioemu/hw/xenfb.c    Mon Jun 09 09:37:56 2008 +0100
+++ b/tools/ioemu/hw/xenfb.c    Mon Jun 09 09:39:15 2008 +0100
@@ -587,10 +587,10 @@ static void xenfb_on_fb_event(struct xen
                                               event->resize.offset,
                                               event->resize.stride) < 0)
                                break;
-                       dpy_colourdepth(xenfb->ds, xenfb->depth);
-                       dpy_resize(xenfb->ds, xenfb->width, xenfb->height, 
xenfb->row_stride);
-                       if (xenfb->ds->shared_buf)
-                               dpy_setdata(xenfb->ds, xenfb->pixels + 
xenfb->offset);
+                       if (xenfb->ds->dpy_resize_shared)
+                           dpy_resize_shared(xenfb->ds, xenfb->width, 
xenfb->height, xenfb->depth, xenfb->row_stride, xenfb->pixels + xenfb->offset);
+                       else
+                           dpy_resize(xenfb->ds, xenfb->width, xenfb->height);
                        xenfb_invalidate(xenfb);
                        break;
                }
@@ -1324,10 +1324,10 @@ static int xenfb_register_console(struct
                             xenfb_invalidate,
                             xenfb_screen_dump,
                             xenfb);
-       dpy_colourdepth(xenfb->ds, xenfb->depth);
-        dpy_resize(xenfb->ds, xenfb->width, xenfb->height, xenfb->row_stride);
-       if (xenfb->ds->shared_buf)
-           dpy_setdata(xenfb->ds, xenfb->pixels);
+        if (xenfb->ds->dpy_resize_shared)
+            dpy_resize_shared(xenfb->ds, xenfb->width, xenfb->height, 
xenfb->depth, xenfb->row_stride, xenfb->pixels + xenfb->offset);
+        else
+            dpy_resize(xenfb->ds, xenfb->width, xenfb->height);
 
        if (qemu_set_fd_handler2(xc_evtchn_fd(xenfb->evt_xch), NULL, 
xenfb_dispatch_channel, NULL, xenfb) < 0)
                return -1;
@@ -1353,6 +1353,8 @@ static char *kbd_path, *fb_path;
 
 static unsigned char linux2scancode[KEY_MAX + 1];
 
+static void xenfb_pv_colourdepth(DisplayState *ds, int depth);
+
 int xenfb_connect_vkbd(const char *path)
 {
     kbd_path = strdup(path);
@@ -1374,11 +1376,13 @@ static void xenfb_pv_update(DisplayState
     fbfront_update(fb_dev, x, y, w, h);
 }
 
-static void xenfb_pv_resize(DisplayState *ds, int w, int h, int linesize)
+static void xenfb_pv_resize_shared(DisplayState *ds, int w, int h, int depth, 
int linesize, void *pixels)
 {
     XenFBState *xs = ds->opaque;
     struct fbfront_dev *fb_dev = xs->fb_dev;
+    int offset;
     fprintf(stderr,"resize to %dx%d, %d required\n", w, h, linesize);
+    xenfb_pv_colourdepth(ds, depth);
     ds->width = w;
     ds->height = h;
     if (!linesize)
@@ -1389,11 +1393,18 @@ static void xenfb_pv_resize(DisplayState
     if (!fb_dev)
         return;
     if (ds->shared_buf) {
-        ds->data = NULL;
+        offset = pixels - xs->vga_vram;
+        ds->data = pixels;
+        fbfront_resize(fb_dev, ds->width, ds->height, ds->linesize, ds->depth, 
offset);
     } else {
         ds->data = xs->nonshared_vram;
         fbfront_resize(fb_dev, w, h, linesize, ds->depth, VGA_RAM_SIZE);
     }
+}
+
+static void xenfb_pv_resize(DisplayState *ds, int w, int h)
+{
+    xenfb_pv_resize_shared(ds, w, h, 0, 0, NULL);
 }
 
 static void xenfb_pv_colourdepth(DisplayState *ds, int depth)
@@ -1418,7 +1429,6 @@ static void xenfb_pv_colourdepth(Display
         ds->data = NULL;
     } else {
         ds->data = xs->nonshared_vram;
-        fbfront_resize(fb_dev, ds->width, ds->height, ds->linesize, ds->depth, 
VGA_RAM_SIZE);
     }
 }
 
@@ -1597,7 +1607,7 @@ int xenfb_pv_display_init(DisplayState *
     ds->linesize = 640 * 4;
     ds->dpy_update = xenfb_pv_update;
     ds->dpy_resize = xenfb_pv_resize;
-    ds->dpy_colourdepth = xenfb_pv_colourdepth;
+    ds->dpy_resize_shared = xenfb_pv_resize_shared;
     ds->dpy_setdata = xenfb_pv_setdata;
     ds->dpy_refresh = xenfb_pv_refresh;
     return 0;
diff -r 1de5d17497fd -r 638811f870ba tools/ioemu/sdl.c
--- a/tools/ioemu/sdl.c Mon Jun 09 09:37:56 2008 +0100
+++ b/tools/ioemu/sdl.c Mon Jun 09 09:39:15 2008 +0100
@@ -50,6 +50,8 @@ static int absolute_enabled = 0;
 static int absolute_enabled = 0;
 static int opengl_enabled;
 
+static void sdl_colourdepth(DisplayState *ds, int depth);
+
 #ifdef CONFIG_OPENGL
 static GLint tex_format;
 static GLint tex_type;
@@ -211,11 +213,13 @@ static void sdl_setdata(DisplayState *ds
     ds->data = pixels;
 }
 
-static void sdl_resize(DisplayState *ds, int w, int h, int linesize)
+static void sdl_resize_shared(DisplayState *ds, int w, int h, int depth, int 
linesize, void *pixels)
 {
     int flags;
 
     //    printf("resizing to %d %d\n", w, h);
+
+    sdl_colourdepth(ds, depth);
 
 #ifdef CONFIG_OPENGL
     if (ds->shared_buf && opengl_enabled)
@@ -245,7 +249,8 @@ static void sdl_resize(DisplayState *ds,
             opengl_enabled = 0;
             ds->dpy_update = sdl_update;
             ds->dpy_setdata = sdl_setdata;
-            sdl_resize(ds, w, h, linesize);
+            ds->dpy_resize_shared = sdl_resize_shared;
+            sdl_resize_shared(ds, w, h, depth, linesize, pixels);
             return;
         }
         exit(1);
@@ -272,6 +277,7 @@ static void sdl_resize(DisplayState *ds,
         } else {
             ds->bgr = 0;
         }
+        shared = NULL;
         ds->data = screen->pixels;
         ds->linesize = screen->pitch;
     } else {
@@ -296,21 +302,26 @@ static void sdl_resize(DisplayState *ds,
         };
 #endif
     }
+    if (ds->shared_buf) ds->dpy_setdata(ds, pixels);
+}
+
+static void sdl_resize(DisplayState *ds, int w, int h)
+{
+    sdl_resize_shared(ds, w, h, 0, w * (ds->depth / 8), NULL);
 }
 
 static void sdl_colourdepth(DisplayState *ds, int depth)
 {
     if (!depth || !ds->depth) {
         ds->shared_buf = 0;
+        ds->dpy_update = sdl_update;
         return;
     }
     ds->shared_buf = 1;
     ds->depth = depth;
-    ds->linesize = width * depth / 8;
 #ifdef CONFIG_OPENGL
     if (opengl_enabled) {
         ds->dpy_update = opengl_update;
-        ds->dpy_setdata = opengl_setdata;
     }
 #endif
 }
@@ -517,8 +528,7 @@ static void toggle_full_screen(DisplaySt
 static void toggle_full_screen(DisplayState *ds)
 {
     gui_fullscreen = !gui_fullscreen;
-    sdl_resize(ds, ds->width, ds->height, ds->linesize);
-    ds->dpy_setdata(ds, ds->data);
+    sdl_resize_shared(ds, ds->width, ds->height, ds->depth, ds->linesize, 
ds->data);
     if (gui_fullscreen) {
         gui_saved_grab = gui_grab;
         sdl_grab_start();
@@ -760,11 +770,16 @@ void sdl_display_init(DisplayState *ds, 
 
     ds->dpy_update = sdl_update;
     ds->dpy_resize = sdl_resize;
+    ds->dpy_resize_shared = sdl_resize_shared;
     ds->dpy_refresh = sdl_refresh;
-    ds->dpy_colourdepth = sdl_colourdepth;
-    ds->dpy_setdata = sdl_setdata;
-
-    sdl_resize(ds, 640, 400, 640 * 4);
+#ifdef CONFIG_OPENGL
+    if (opengl_enabled)
+        ds->dpy_setdata = opengl_setdata;
+    else
+        ds->dpy_setdata = sdl_setdata;
+#endif
+
+    sdl_resize(ds, 640, 400);
     sdl_update_caption();
     SDL_EnableKeyRepeat(250, 50);
     SDL_EnableUNICODE(1);
diff -r 1de5d17497fd -r 638811f870ba tools/ioemu/vl.c
--- a/tools/ioemu/vl.c  Mon Jun 09 09:37:56 2008 +0100
+++ b/tools/ioemu/vl.c  Mon Jun 09 09:39:15 2008 +0100
@@ -4463,7 +4463,6 @@ void dumb_display_init(DisplayState *ds)
     ds->depth = 0;
     ds->dpy_update = dumb_update;
     ds->dpy_resize = dumb_resize;
-    ds->dpy_colourdepth = NULL;
     ds->dpy_refresh = dumb_refresh;
     ds->gui_timer_interval = 500;
     ds->idle = 1;
diff -r 1de5d17497fd -r 638811f870ba tools/ioemu/vl.h
--- a/tools/ioemu/vl.h  Mon Jun 09 09:37:56 2008 +0100
+++ b/tools/ioemu/vl.h  Mon Jun 09 09:39:15 2008 +0100
@@ -945,9 +945,9 @@ struct DisplayState {
     int shared_buf;
     
     void (*dpy_update)(struct DisplayState *s, int x, int y, int w, int h);
-    void (*dpy_resize)(struct DisplayState *s, int w, int h, int linesize);
-    void (*dpy_colourdepth)(struct DisplayState *s, int depth);
+    void (*dpy_resize)(struct DisplayState *s, int w, int h);
     void (*dpy_setdata)(DisplayState *s, void *pixels);
+    void (*dpy_resize_shared)(DisplayState *s, int w, int h, int depth, int 
linesize, void *pixels);
     void (*dpy_refresh)(struct DisplayState *s);
     void (*dpy_copy)(struct DisplayState *s, int src_x, int src_y, int dst_x, 
int dst_y, int w, int h);
 };
@@ -957,14 +957,14 @@ static inline void dpy_update(DisplaySta
     s->dpy_update(s, x, y, w, h);
 }
 
-static inline void dpy_resize(DisplayState *s, int w, int h, int linesize)
-{
-    s->dpy_resize(s, w, h, linesize);
-}
-
-static inline void dpy_colourdepth(struct DisplayState *s, int depth)
-{
-    s->dpy_colourdepth(s, depth);
+static inline void dpy_resize(DisplayState *s, int w, int h)
+{
+    s->dpy_resize(s, w, h);
+}
+
+static inline void dpy_resize_shared(DisplayState *s, int w, int h, int depth, 
int linesize, void *pixels)
+{
+    s->dpy_resize_shared(s, w, h, depth, linesize, pixels);
 }
 
 static inline void dpy_setdata(DisplayState *s, void *pixels)
diff -r 1de5d17497fd -r 638811f870ba tools/ioemu/vnc.c
--- a/tools/ioemu/vnc.c Mon Jun 09 09:37:56 2008 +0100
+++ b/tools/ioemu/vnc.c Mon Jun 09 09:39:15 2008 +0100
@@ -277,6 +277,7 @@ static void dequeue_framebuffer_update(V
 static void dequeue_framebuffer_update(VncState *vs);
 static int is_empty_queue(VncState *vs);
 static void free_queue(VncState *vs);
+static void vnc_colourdepth(DisplayState *ds, int depth);
 
 #if 0
 static inline void vnc_set_bit(uint32_t *d, int k)
@@ -363,13 +364,14 @@ static void vnc_framebuffer_update(VncSt
     vnc_write_s32(vs, encoding);
 }
 
-static void vnc_dpy_resize(DisplayState *ds, int w, int h, int linesize)
+static void vnc_dpy_resize_shared(DisplayState *ds, int w, int h, int depth, 
int linesize, void *pixels)
 {
     static int allocated;
     int size_changed;
     VncState *vs = ds->opaque;
     int o;
 
+    vnc_colourdepth(ds, depth);
     if (!ds->shared_buf) {
         ds->linesize = w * vs->depth;
         if (allocated)
@@ -419,6 +421,12 @@ static void vnc_dpy_resize(DisplayState 
     for (o = DIRTY_PIXEL_BITS; o < ds->width; o *= 2)
        vs->dirty_pixel_shift++;
     framebuffer_set_updated(vs, 0, 0, ds->width, ds->height);
+    if (ds->shared_buf) ds->data = pixels;
+}
+
+static void vnc_dpy_resize(DisplayState *ds, int w, int h)
+{
+    vnc_dpy_resize_shared(ds, w, h, 0, w * (ds->depth / 8), NULL);
 }
 
 /* fastest code */
@@ -1640,7 +1648,7 @@ static void vnc_dpy_setdata(DisplayState
     ds->data = pixels;
 }
 
-static void vnc_dpy_colourdepth(DisplayState *ds, int depth)
+static void vnc_colourdepth(DisplayState *ds, int depth)
 {
     int host_big_endian_flag;
     struct VncState *vs = ds->opaque;
@@ -1742,8 +1750,6 @@ static void vnc_dpy_colourdepth(DisplayS
             vs->write_pixels = vnc_write_pixels_generic;
         }
     }
-
-    vnc_dpy_resize(ds, ds->width, ds->height, ds->linesize);
 }
 
 static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len)
@@ -2502,14 +2508,14 @@ void vnc_display_init(DisplayState *ds)
     vs->ds->data = NULL;
     vs->ds->dpy_update = vnc_dpy_update;
     vs->ds->dpy_resize = vnc_dpy_resize;
-    vs->ds->dpy_colourdepth = vnc_dpy_colourdepth;
     vs->ds->dpy_setdata = vnc_dpy_setdata;
+    vs->ds->dpy_resize_shared = vnc_dpy_resize_shared;
     vs->ds->dpy_refresh = vnc_dpy_refresh;
 
     vs->ds->width = 640;
     vs->ds->height = 400;
     vs->ds->linesize = 640 * 4;
-    vnc_dpy_colourdepth(vs->ds, 24);
+    vnc_dpy_resize_shared(ds, ds->width, ds->height, 24, ds->linesize, NULL);
 }
 
 #if CONFIG_VNC_TLS

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] ioemu: cleaning DisplayState->dpy_resize interface, Xen patchbot-unstable <=