[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] ioemu rendering fixes



Hi all,
I am attaching a patch that fixes some issues regarding ioemu rendering.
If you prefer smaller patches, I can split it.
The changes are the following:

- no need to call the colourdepth callback in text mode: the buffer
cannot be shared anyway;

- line size changes are currently undetected: since we added a linesize
parameter to the resize callback, we also need to detect line size
changes and call dpy_resize accordingly;

- 8 bit colour depth with the shared framebuffer is broken: in order to
fix it I disabled the shared buffer in vnc for the 8bit colour depth
case (it has to be done in software anyway..) and implemented paletted
colours in both opengl and sdl;

- opengl rendering is broken when there is padding in the framebuffer lines: removing unnecessary GL_UNPACK_ALIGNMENT settings so that the GL_UNPACK_ROW_LENGTH parameter can work properly.

Best Regards,

Stefano Stabellini



Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>



diff -r b5fea3aeb04b tools/ioemu/hw/vga.c
--- a/tools/ioemu/hw/vga.c      Fri Mar 28 14:12:33 2008 +0000
+++ b/tools/ioemu/hw/vga.c      Tue Apr 01 10:23:17 2008 +0100
@@ -1086,9 +1086,6 @@ static void vga_draw_text(VGAState *s, i
     vga_draw_glyph8_func *vga_draw_glyph8;
     vga_draw_glyph9_func *vga_draw_glyph9;
 
-    depth = s->get_bpp(s);
-    if (s->ds->dpy_colourdepth != NULL && s->ds->depth != depth)
-        s->ds->dpy_colourdepth(s->ds, depth);
     s->rgb_to_pixel = 
         rgb_to_pixel_dup_table[get_depth_index(s->ds)];
 
@@ -1486,7 +1483,7 @@ static void vga_draw_graphic(VGAState *s
 static void vga_draw_graphic(VGAState *s, int full_update)
 {
     int y1, y, update, linesize, y_start, double_scan, mask, depth;
-    int width, height, shift_control, line_offset, bwidth, changed_flag;
+    int width, height, shift_control, line_offset, bwidth, ds_depth;
     ram_addr_t page0, page1;
     int disp_width, multi_scan, multi_run;
     uint8_t *d;
@@ -1499,13 +1496,13 @@ static void vga_draw_graphic(VGAState *s
     s->get_resolution(s, &width, &height);
     disp_width = width;
 
-    changed_flag = 0;
+    ds_depth = s->ds->depth;
     depth = s->get_bpp(s);
     if (s->ds->dpy_colourdepth != NULL && 
-            (s->ds->depth != depth || !s->ds->shared_buf)) {
+            (ds_depth != depth || !s->ds->shared_buf))
         s->ds->dpy_colourdepth(s->ds, depth);
-        changed_flag = 1;
-    }
+    if (ds_depth != s->ds->depth) full_update = 1;
+
     s->rgb_to_pixel = 
         rgb_to_pixel_dup_table[get_depth_index(s->ds)];
 
@@ -1569,17 +1566,18 @@ static void vga_draw_graphic(VGAState *s
     }
 
     vga_draw_line = vga_draw_line_table[v * NB_DEPTHS + 
get_depth_index(s->ds)];
-    if (disp_width != s->last_width ||
+    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;
-        changed_flag = 1;
-    }
-    if (s->ds->shared_buf && (changed_flag || s->ds->data != s->vram_ptr + 
(s->start_addr * 4)))
+    }
+    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);
@@ -2072,6 +2070,7 @@ void vga_common_init(VGAState *s, Displa
     s->vram_offset = vga_ram_offset;
     s->vram_size = vga_ram_size;
     s->ds = ds;
+    ds->palette = s->last_palette;
     s->get_bpp = vga_get_bpp;
     s->get_offsets = vga_get_offsets;
     s->get_resolution = vga_get_resolution;
diff -r b5fea3aeb04b tools/ioemu/hw/vga_int.h
--- a/tools/ioemu/hw/vga_int.h  Fri Mar 28 14:12:33 2008 +0000
+++ b/tools/ioemu/hw/vga_int.h  Mon Mar 31 16:15:24 2008 +0100
@@ -129,6 +129,7 @@
     uint32_t line_compare;                                              \
     uint32_t start_addr;                                                \
     uint32_t plane_updated;                                             \
+    uint32_t last_line_offset;                                          \
     uint8_t last_cw, last_ch;                                           \
     uint32_t last_width, last_height; /* in chars or pixels */          \
     uint32_t last_scr_width, last_scr_height; /* in pixels */           \
diff -r b5fea3aeb04b tools/ioemu/sdl.c
--- a/tools/ioemu/sdl.c Fri Mar 28 14:12:33 2008 +0000
+++ b/tools/ioemu/sdl.c Mon Mar 31 18:27:41 2008 +0100
@@ -85,19 +85,33 @@ static void opengl_setdata(DisplayState 
     glPixelStorei(GL_UNPACK_LSB_FIRST, 1);
     switch (ds->depth) {
         case 8:
-            tex_format = GL_RGB;
-            tex_type = GL_UNSIGNED_BYTE_3_3_2;
-            glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+            if (ds->palette == NULL) {
+                tex_format = GL_RGB;
+                tex_type = GL_UNSIGNED_BYTE_3_3_2;
+            } else {
+                int i;
+                GLushort paletter[256], paletteg[256], paletteb[256];
+                for (i = 0; i < 256; i++) {
+                    uint8_t rgb = ds->palette[i] >> 16;
+                    paletter[i] = ((rgb & 0xe0) >> 5) * 65535 / 7;
+                    paletteg[i] = ((rgb & 0x1c) >> 2) * 65535 / 7;
+                    paletteb[i] = (rgb & 0x3) * 65535 / 3;
+                }
+                glPixelMapusv(GL_PIXEL_MAP_I_TO_R, 256, paletter);
+                glPixelMapusv(GL_PIXEL_MAP_I_TO_G, 256, paletteg);
+                glPixelMapusv(GL_PIXEL_MAP_I_TO_B, 256, paletteb);
+
+                tex_format = GL_COLOR_INDEX;
+                tex_type = GL_UNSIGNED_BYTE;
+            }
             break;
         case 16:
             tex_format = GL_RGB;
             tex_type = GL_UNSIGNED_SHORT_5_6_5;
-            glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
             break;
         case 24:
             tex_format = GL_BGR;
             tex_type = GL_UNSIGNED_BYTE;
-            glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
             break;
         case 32:
             if (!ds->bgr) {
@@ -107,7 +121,6 @@ static void opengl_setdata(DisplayState 
                 tex_format = GL_RGBA;
                 tex_type = GL_UNSIGNED_BYTE;                
             }
-            glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
             break;
     }   
     glPixelStorei(GL_UNPACK_ROW_LENGTH, (ds->linesize * 8) / ds->depth);
@@ -184,6 +197,17 @@ static void sdl_setdata(DisplayState *ds
             return;
     }
     shared = SDL_CreateRGBSurfaceFrom(pixels, width, height, ds->depth, 
ds->linesize, rmask , gmask, bmask, amask);
+    if (ds->depth == 8 && ds->palette != NULL) {
+        SDL_Color palette[256];
+        int i;
+        for (i = 0; i < 256; i++) {
+            uint8_t rgb = ds->palette[i] >> 16;
+            palette[i].r = ((rgb & 0xe0) >> 5) * 255 / 7;
+            palette[i].g = ((rgb & 0x1c) >> 2) * 255 / 7;
+            palette[i].b = (rgb & 0x3) * 255 / 3;
+        }
+        SDL_SetColors(shared, palette, 0, 256);
+    }
     ds->data = pixels;
 }
 
diff -r b5fea3aeb04b tools/ioemu/vl.h
--- a/tools/ioemu/vl.h  Fri Mar 28 14:12:33 2008 +0000
+++ b/tools/ioemu/vl.h  Mon Mar 31 16:15:24 2008 +0100
@@ -937,6 +937,7 @@ struct DisplayState {
     int width;
     int height;
     void *opaque;
+    uint32_t *palette;
     uint64_t gui_timer_interval;
 
     int switchbpp;
diff -r b5fea3aeb04b tools/ioemu/vnc.c
--- a/tools/ioemu/vnc.c Fri Mar 28 14:12:33 2008 +0000
+++ b/tools/ioemu/vnc.c Mon Mar 31 16:15:24 2008 +0100
@@ -1640,6 +1640,7 @@ static void vnc_dpy_colourdepth(DisplayS
             if (ds->depth == 32) return;
             depth = 32;
             break;
+        case 8:
         case 0:
             ds->shared_buf = 0;
             return;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.