]> xenbits.xensource.com Git - xenclient/ioemu.git/commitdiff
Using the intel framebuffer as ds->data.
authorStefano Stabellini <sstabellini@kaball-desktop.(none)>
Wed, 3 Dec 2008 17:08:53 +0000 (17:08 +0000)
committerStefano Stabellini <sstabellini@kaball-desktop.(none)>
Wed, 3 Dec 2008 17:08:53 +0000 (17:08 +0000)
intel.c

diff --git a/intel.c b/intel.c
index 41fe8d1fc4f9a02315f1bf376ffd3a43abe065bd..24653981790498ece10ba41f8f6f7ddff2cb6c4b 100644 (file)
--- 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();
     }
 }