From: Samuel Thibault <samuel.thibault@eu.citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>, xen-devel@lists.xensource.com
Subject: [PATCH2] ioemu: improve colordepth negociation
Date: Tue, 4 Mar 2008 11:48:34 +0000 [thread overview]
Message-ID: <20080304114834.GD5038@implementation.uk.xensource.com> (raw)
In-Reply-To: <20080304114410.GC5038@implementation.uk.xensource.com>
Samuel Thibault, le Tue 04 Mar 2008 11:44:10 +0000, a écrit :
> Ian Jackson, le Tue 04 Mar 2008 11:38:44 +0000, a écrit :
> > Samuel Thibault writes ("[Xen-devel] [PATCH] ioemu: improve colordepth negociation"):
> > > +static vga_draw_line_func *vga_draw_line_table[NB_DEPTHS * VGA_DRAW_LINE_NB] = {
> > > + vga_draw_line2_8,
> > > + vga_draw_line2_16,
> > > + vga_draw_line2_16,
> > > + vga_draw_line2_32,
> > > + vga_draw_line2_32,
> > ...
> > > -static vga_draw_line_func *vga_draw_line_table[NB_DEPTHS * VGA_DRAW_LINE_NB] = {
> > > - vga_draw_line2_8,
> > > - vga_draw_line2_16,
> > > - vga_draw_line2_16,
> > > - vga_draw_line2_32,
> > > - vga_draw_line2_32,
> >
> > Could I suggest that it would be a good idea to avoid enormous code
> > rearrangements like this in ioemu ?
>
> I was wondering about it indeed. I'll provide another patch.
Here it is:
ioemu: improve colordepth negociation
By moving the colourdepth callback a bit earlier, we can let the display
decide the actual depth to be used before the draw and whether sharing
is possible or not.
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
diff -r a9b63386b636 tools/ioemu/hw/vga.c
--- a/tools/ioemu/hw/vga.c Mon Mar 03 17:24:25 2008 +0000
+++ b/tools/ioemu/hw/vga.c Tue Mar 04 11:47:11 2008 +0000
@@ -1061,6 +1061,10 @@ static const uint8_t cursor_glyph[32 * 4
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
};
+typedef unsigned int rgb_to_pixel_dup_func(unsigned int r, unsigned int g, unsigned b);
+
+static rgb_to_pixel_dup_func *rgb_to_pixel_dup_table[NB_DEPTHS];
+
/*
* Text mode update
* Missing:
@@ -1081,6 +1085,12 @@ static void vga_draw_text(VGAState *s, i
uint32_t *ch_attr_ptr;
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)];
full_update |= update_palette16(s);
palette = s->last_palette;
@@ -1134,9 +1144,6 @@ static void vga_draw_text(VGAState *s, i
return;
}
- depth = s->get_bpp(s);
- if (s->ds->dpy_colourdepth != NULL && s->ds->depth != depth)
- s->ds->dpy_colourdepth(s->ds, depth);
if (width != s->last_width || height != s->last_height ||
cw != s->last_cw || cheight != s->last_ch) {
s->last_scr_width = width * cw;
@@ -1318,8 +1325,6 @@ static vga_draw_line_func *vga_draw_line
vga_draw_line32_32,
vga_draw_line32_32bgr,
};
-
-typedef unsigned int rgb_to_pixel_dup_func(unsigned int r, unsigned int g, unsigned b);
static rgb_to_pixel_dup_func *rgb_to_pixel_dup_table[NB_DEPTHS] = {
rgb_to_pixel8_dup,
@@ -1494,6 +1499,16 @@ static void vga_draw_graphic(VGAState *s
s->get_resolution(s, &width, &height);
disp_width = width;
+ changed_flag = 0;
+ depth = s->get_bpp(s);
+ if (s->ds->dpy_colourdepth != NULL &&
+ (s->ds->depth != depth || !s->ds->shared_buf)) {
+ s->ds->dpy_colourdepth(s->ds, depth);
+ changed_flag = 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) {
@@ -1552,15 +1567,8 @@ static void vga_draw_graphic(VGAState *s
break;
}
}
+
vga_draw_line = vga_draw_line_table[v * NB_DEPTHS + get_depth_index(s->ds)];
-
- changed_flag = 0;
- depth = s->get_bpp(s);
- if (s->ds->dpy_colourdepth != NULL &&
- (s->ds->depth != depth || !s->ds->shared_buf)) {
- s->ds->dpy_colourdepth(s->ds, depth);
- changed_flag = 1;
- }
if (disp_width != s->last_width ||
height != s->last_height) {
dpy_resize(s->ds, disp_width, height, disp_width * (depth / 8));
@@ -1674,6 +1682,8 @@ static void vga_draw_blank(VGAState *s,
return;
if (s->last_scr_width <= 0 || s->last_scr_height <= 0)
return;
+ s->rgb_to_pixel =
+ rgb_to_pixel_dup_table[get_depth_index(s->ds)];
if (s->ds->depth == 8)
val = s->rgb_to_pixel(0, 0, 0);
else
@@ -1700,9 +1710,6 @@ static void vga_update_display(void *opa
if (s->ds->depth == 0) {
/* nothing to do */
} else {
- s->rgb_to_pixel =
- rgb_to_pixel_dup_table[get_depth_index(s->ds)];
-
full_update = 0;
if (!(s->ar_index & 0x20)) {
graphic_mode = GMODE_BLANK;
diff -r a9b63386b636 tools/ioemu/hw/xenfb.c
--- a/tools/ioemu/hw/xenfb.c Mon Mar 03 17:24:25 2008 +0000
+++ b/tools/ioemu/hw/xenfb.c Tue Mar 04 11:47:11 2008 +0000
@@ -1238,10 +1238,16 @@ static void xenfb_pv_resize(DisplayState
fbfront_update(fb_dev, 0, 0, WIDTH, HEIGHT);
}
-static void xenfb_pv_colourdepth(DisplayState *s, int depth)
+static void xenfb_pv_colourdepth(DisplayState *ds, int depth)
{
/* TODO: send redepth event if supported */
- fprintf(stderr,"redepth to %d required\n", depth);
+ static int lastdepth = -1;
+ if (depth != lastdepth) {
+ fprintf(stderr,"redepth to %d required\n", depth);
+ lastdepth = depth;
+ }
+ /* We can't redepth for now */
+ ds->depth = DEPTH;
}
static void xenfb_kbd_handler(void *opaque)
@@ -1334,6 +1340,8 @@ static void xenfb_kbd_handler(void *opaq
static void xenfb_pv_refresh(DisplayState *ds)
{
+ /* always request negociation */
+ ds->depth = -1;
vga_hw_update();
}
@@ -1387,7 +1395,7 @@ int xenfb_pv_display_init(DisplayState *
ds->height = HEIGHT;
ds->dpy_update = xenfb_pv_update;
ds->dpy_resize = xenfb_pv_resize;
- ds->dpy_colourdepth = NULL; //xenfb_pv_colourdepth;
+ ds->dpy_colourdepth = xenfb_pv_colourdepth;
ds->dpy_refresh = xenfb_pv_refresh;
ds->opaque = fb_dev;
return 0;
prev parent reply other threads:[~2008-03-04 11:48 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-03 17:35 [PATCH] ioemu: improve colordepth negociation Samuel Thibault
2008-03-04 11:38 ` Ian Jackson
2008-03-04 11:44 ` Samuel Thibault
2008-03-04 11:46 ` Ian Jackson
2008-03-04 11:48 ` Samuel Thibault [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080304114834.GD5038@implementation.uk.xensource.com \
--to=samuel.thibault@eu.citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.