* [PATCH] ioemu rendering fixes
@ 2008-04-01 10:35 Stefano Stabellini
2008-04-01 11:39 ` Stefano Stabellini
0 siblings, 1 reply; 2+ messages in thread
From: Stefano Stabellini @ 2008-04-01 10:35 UTC (permalink / raw)
To: xen-devel
[-- Attachment #1: Type: text/plain, Size: 981 bytes --]
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@eu.citrix.com>
[-- Attachment #2: renderingfixes.patch --]
[-- Type: text/x-diff, Size: 7001 bytes --]
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;
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH] ioemu rendering fixes
2008-04-01 10:35 [PATCH] ioemu rendering fixes Stefano Stabellini
@ 2008-04-01 11:39 ` Stefano Stabellini
0 siblings, 0 replies; 2+ messages in thread
From: Stefano Stabellini @ 2008-04-01 11:39 UTC (permalink / raw)
To: xen-devel
[-- Attachment #1: Type: text/plain, Size: 596 bytes --]
Stefano Stabellini wrote:
> 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;
Samuel helped me realize that this callback is useful when switching
back from graphical mode to text mode. In fact the mistake is that in
this case sdl colourdepth doesn't disable buffer sharing.
I am resending the patch fixed.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
[-- Attachment #2: renderingfixes2.patch --]
[-- Type: text/x-diff, Size: 6962 bytes --]
diff -r db943e8d1051 tools/ioemu/hw/vga.c
--- a/tools/ioemu/hw/vga.c Tue Apr 01 10:09:33 2008 +0100
+++ b/tools/ioemu/hw/vga.c Tue Apr 01 12:25:06 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 db943e8d1051 tools/ioemu/hw/vga_int.h
--- a/tools/ioemu/hw/vga_int.h Tue Apr 01 10:09:33 2008 +0100
+++ b/tools/ioemu/hw/vga_int.h Tue Apr 01 12:20:25 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 db943e8d1051 tools/ioemu/sdl.c
--- a/tools/ioemu/sdl.c Tue Apr 01 10:09:33 2008 +0100
+++ b/tools/ioemu/sdl.c Tue Apr 01 12:25:39 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 db943e8d1051 tools/ioemu/vl.h
--- a/tools/ioemu/vl.h Tue Apr 01 10:09:33 2008 +0100
+++ b/tools/ioemu/vl.h Tue Apr 01 12:20:25 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 db943e8d1051 tools/ioemu/vnc.c
--- a/tools/ioemu/vnc.c Tue Apr 01 10:09:33 2008 +0100
+++ b/tools/ioemu/vnc.c Tue Apr 01 12:20:25 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;
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-04-01 11:39 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-01 10:35 [PATCH] ioemu rendering fixes Stefano Stabellini
2008-04-01 11:39 ` Stefano Stabellini
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.