ioemu: cleaning DisplayState->dpy_resize interface
PATCH 1/1 ioemu: cleaning DisplayState->dpy_resize interface
Hi all,
I am attaching a patch that brings 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.
Best Regards,
Stefano Stabellini
Signed-off-by Stefano Stabellini <[email protected]>
tools/ioemu/cocoa.m +1 -1
@@ -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;
tools/ioemu/hw/pl110.c +2 -2
@@ -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 */
tools/ioemu/hw/tcx.c +1 -1
@@ -342,7 +342,7 @@ void tcx_init(DisplayState *ds, uint32_tregister_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)
tools/ioemu/hw/vga.c +83 -70
214 lines not on this page · raw message
tools/ioemu/hw/xenfb.c +22 -12
@@ -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(DisplayStatefbfront_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(DisplayStateif (!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 ;
tools/ioemu/sdl.c +25 -10
@@ -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(DisplayStstatic 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 );
tools/ioemu/vl.c +0 -1
@@ -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 ;
tools/ioemu/vl.h +10 -10
@@ -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)
tools/ioemu/vnc.c +12 -6
@@ -277,6 +277,7 @@ static void dequeue_framebuffer_update(Vstatic 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(VncStvnc_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(DisplayStatefor (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-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel