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 rendering fixes

# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1207066972 -3600
# Node ID baff5b3aaf13ada58fa8fb736940323edfedf6cb
# Parent  69c951243105e9490c10bd9faeacc4725bf6b65f
ioemu rendering fixes

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

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
---
 tools/ioemu/hw/vga.c     |   20 +++++++++++---------
 tools/ioemu/hw/vga_int.h |    1 +
 tools/ioemu/sdl.c        |   41 ++++++++++++++++++++++++++++++++++-------
 tools/ioemu/vl.h         |    1 +
 tools/ioemu/vnc.c        |    1 +
 5 files changed, 48 insertions(+), 16 deletions(-)

diff -r 69c951243105 -r baff5b3aaf13 tools/ioemu/hw/vga.c
--- a/tools/ioemu/hw/vga.c      Tue Apr 01 17:21:05 2008 +0100
+++ b/tools/ioemu/hw/vga.c      Tue Apr 01 17:22:52 2008 +0100
@@ -1486,7 +1486,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 +1499,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 +1569,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 +2073,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 69c951243105 -r baff5b3aaf13 tools/ioemu/hw/vga_int.h
--- a/tools/ioemu/hw/vga_int.h  Tue Apr 01 17:21:05 2008 +0100
+++ b/tools/ioemu/hw/vga_int.h  Tue Apr 01 17:22:52 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 69c951243105 -r baff5b3aaf13 tools/ioemu/sdl.c
--- a/tools/ioemu/sdl.c Tue Apr 01 17:21:05 2008 +0100
+++ b/tools/ioemu/sdl.c Tue Apr 01 17:22:52 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;
 }
 
@@ -273,7 +297,10 @@ static void sdl_resize(DisplayState *ds,
 
 static void sdl_colourdepth(DisplayState *ds, int depth)
 {
-    if (!depth || !ds->depth) return;
+    if (!depth || !ds->depth) {
+        ds->shared_buf = 0;
+        return;
+    }
     ds->shared_buf = 1;
     ds->depth = depth;
     ds->linesize = width * depth / 8;
diff -r 69c951243105 -r baff5b3aaf13 tools/ioemu/vl.h
--- a/tools/ioemu/vl.h  Tue Apr 01 17:21:05 2008 +0100
+++ b/tools/ioemu/vl.h  Tue Apr 01 17:22:52 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 69c951243105 -r baff5b3aaf13 tools/ioemu/vnc.c
--- a/tools/ioemu/vnc.c Tue Apr 01 17:21:05 2008 +0100
+++ b/tools/ioemu/vnc.c Tue Apr 01 17:22:52 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-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 rendering fixes, Xen patchbot-unstable <=