From: Stefano Stabellini Date: Wed, 3 Dec 2008 17:08:53 +0000 (+0000) Subject: Using the intel framebuffer as ds->data. X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=c97a51a5147c3e28c9d40188716784c752efacba;p=xenclient%2Fioemu.git Using the intel framebuffer as ds->data. --- diff --git a/intel.c b/intel.c index 41fe8d1f..24653981 100644 --- a/intel.c +++ b/intel.c @@ -39,6 +39,11 @@ static int TilePitch = 16; static int TileX = 1280; static int TileY = 1024; static DisplayState *lds = NULL; +static unsigned char *old_data = NULL; + +static void set_data_mappings(void); +static void unset_data_mappings(void); +static void set_data_pointer(void); static inline unsigned int intel_get_reg(unsigned int reg) { @@ -189,9 +194,8 @@ static void intel_force_linear(void) static void intel_update(DisplayState *ds, int x, int y, int w, int h) { if (intel_have_focus) { - if (!is_linear()) - intel_force_linear(); - intel_update_linear(ds, x, y, w, h); + if (!old_data) + intel_update_linear(ds, x, y, w, h); } } @@ -201,7 +205,10 @@ static void intel_resize(DisplayState *ds, int w, int h) ds->height = h; ds->depth = 32; ds->linesize = intel_get_pitch(); - ds->data = realloc(ds->data, h * ds->linesize); + if (!old_data) + ds->data = realloc(ds->data, h * ds->linesize); + else + set_data_pointer(); } static void intel_refresh(DisplayState *ds) @@ -256,6 +263,28 @@ static void intel_init_mapping(void) } } +static void set_data_pointer(void) +{ + lds->data = (unsigned char *)(intel_mem + intel_get_reg(REG_DR_DSPASURF)); + lds->data = lds->data + + lds->linesize * ((1024 - lds->height) / 2) + + 4 * ((1280 - lds->width) / 2); +} + +static void set_data_mappings(void) +{ + old_data = lds->data; + set_data_pointer(); + memcpy(lds->data, old_data, lds->linesize * lds->height); +} + +static void unset_data_mappings(void) +{ + lds->data = old_data; + old_data = NULL; + lds->data = realloc(lds->data, lds->linesize * lds->height); +} + void intel_focus(int focus) { intel_have_focus = focus; @@ -272,7 +301,9 @@ void intel_focus(int focus) } intel_force_linear(); } - intel_update(lds, 0, 0, lds->width, lds->height); + set_data_mappings(); + } else { + unset_data_mappings(); } }