Rewrite the framebuffer update display function.
authorYargil <yargil@free.fr>
Sun, 25 Sep 2011 10:30:24 +0000 (25 12:30 +0200)
committerMichel Pollet <buserror@gmail.com>
Wed, 12 Oct 2011 10:50:02 +0000 (12 11:50 +0100)
Signed-off-by: Fabrice Jouhaud <yargil@free.fr>
Signed-off-by: Michel Pollet <buserror@gmail.com>
hw/s3c24xx_lcd.c
hw/s3c24xx_template.h

index 3acb7f4..70cee54 100644 (file)
 #include "s3c.h"
 #include "hw.h"
 #include "console.h"
+#include "framebuffer.h"
 
-typedef void (*s3c_drawfn_t)(uint32_t *, uint8_t *, const uint8_t *, int, int);
 
 struct s3c_lcd_state_s {
     target_phys_addr_t base;
     void *irq;
     DisplayState *ds;
-    s3c_drawfn_t *line_fn;
+    drawfn *line_fn;
 
     uint32_t con[5];
     uint32_t saddr[3];
@@ -40,13 +40,12 @@ struct s3c_lcd_state_s {
     int enable;
     int msb;
     int frm565;
-    void *fb;
     uint32_t palette[0x100];
     int invalidate;
     int invalidatep;
     int src_width;
     int dest_width;
-    s3c_drawfn_t fn;
+    drawfn fn;
 };
 
 static void s3c_lcd_update(struct s3c_lcd_state_s *s)
@@ -186,10 +185,6 @@ static void s3c_lcd_write(void *opaque, target_phys_addr_t addr,
         break;
     case S3C_LCDSADDR1:
         s->saddr[0] = value;
-/*        s->fb = phys_ram_base +
-                (((s->saddr[0] << 1) & 0x7ffffffe) - S3C_RAM_BASE); */
-        s->fb = qemu_get_ram_ptr(
-                (((s->saddr[0] << 1) & 0x7ffffffe) - S3C_RAM_BASE));
         s->invalidate = 1;
         break;
     case S3C_LCDSADDR2:
@@ -399,11 +394,9 @@ static void s3c_lcd_palette_load(struct s3c_lcd_state_s *s)
 static void s3c_update_display(void *opaque)
 {
     struct s3c_lcd_state_s *s = (struct s3c_lcd_state_s *) opaque;
-    int y, src_width, dest_width, dirty[2], miny, maxy;
-    ram_addr_t x, addr, new_addr, start, end;
-    uint8_t *src, *dest;
-    if (!s->enable || !s->dest_width)
-        return;
+    int src_width, dest_width;
+    ram_addr_t  addr;
+    int first, last;
 
     s3c_lcd_resize(s);
 
@@ -412,47 +405,25 @@ static void s3c_update_display(void *opaque)
         s->invalidatep = 0;
     }
 
-    src = s->fb;
-    src_width = s->src_width;
+    addr = s->saddr[0]<<1;
 
-    dest = ds_get_data(s->ds);
+    src_width = s->src_width;
     dest_width = s->width * s->dest_width;
 
-/*    addr = (ram_addr_t) (s->fb - (void *) phys_ram_base); */
-    addr = qemu_ram_addr_from_host(s->fb);
-    start = addr + s->height * src_width;
-    end = addr;
-    dirty[0] = dirty[1] = cpu_physical_memory_get_dirty(start, VGA_DIRTY_FLAG);
-    miny = s->height;
-    maxy = 0;
-    for (y = 0; y < s->height; y ++) {
-        new_addr = addr + src_width;
-        for (x = addr + TARGET_PAGE_SIZE; x < new_addr;
-                        x += TARGET_PAGE_SIZE) {
-            dirty[1] = cpu_physical_memory_get_dirty(x, VGA_DIRTY_FLAG);
-            dirty[0] |= dirty[1];
-        }
-        if (dirty[0] || s->invalidate) {
-            s->fn(s->palette, dest, src, s->width, s->dest_width);
-            maxy = y;
-            end = new_addr;
-            if (y < miny) {
-                miny = y;
-                start = addr;
-            }
-        }
-        addr = new_addr;
-        dirty[0] = dirty[1];
-        src += src_width;
-        dest += dest_width;
-    }
+    first = 0;
+    framebuffer_update_display(s->ds,
+                               addr, s->width, s->height,
+                               src_width, dest_width, s->dest_width,
+                               s->invalidate,
+                               s->fn, s->palette,
+                               &first, &last);
 
-    s->invalidate = 0;
-    if (end > start)
-        cpu_physical_memory_reset_dirty(start, end, VGA_DIRTY_FLAG);
     s->srcpnd |= (1 << 1);                     /* INT_FrSyn */
     s3c_lcd_update(s);
-    dpy_update(s->ds, 0, miny, s->width, maxy);
+    if (first >= 0) {
+        dpy_update(s->ds, 0, first, s->width, last - first + 1);
+    }
+    s->invalidate = 0;
 }
 
 static void s3c_invalidate_display(void *opaque)
@@ -524,8 +495,6 @@ static int s3c_lcd_load(QEMUFile *f, void *opaque, int version_id)
     s->enable = s->con[0] & 1;
     s->msb = (s->con[4] >> 12) & 1;
     s->frm565 = (s->con[4] >> 11) & 1;
-/*    s->fb = phys_ram_base + (((s->saddr[0] << 1) & 0x7ffffffe) - S3C_RAM_BASE); */
-    s->fb = qemu_get_ram_ptr((((s->saddr[0] << 1) & 0x7ffffffe) - S3C_RAM_BASE));
 
     for (i = 0; i < 0x100; i ++)
         qemu_get_be16s(f, &s->raw_pal[i]);
index 9bd369c..b171c03 100644 (file)
 #define FN_4(x)                FN_2(x + 2) FN_2(x)
 #define FN_8(x)                FN_4(x + 4) FN_4(x)
 
-static void glue(s3c_draw_line1_, BITS)(uint32_t *palette,
+static void glue(s3c_draw_line1_, BITS)(void *opaque,
                 uint8_t *dest, const uint8_t *src, int width, int deststep)
 {
+    uint32_t *palette = opaque;
     uint32_t data;
     while (width > 0) {
         data = *(uint32_t *) src;
@@ -55,9 +56,10 @@ static void glue(s3c_draw_line1_, BITS)(uint32_t *palette,
     }
 }
 
-static void glue(s3c_draw_line2_, BITS)(uint32_t *palette,
+static void glue(s3c_draw_line2_, BITS)(void *opaque,
                 uint8_t *dest, const uint8_t *src, int width, int deststep)
 {
+    uint32_t *palette = opaque;
     uint32_t data;
     while (width > 0) {
         data = *(uint32_t *) src;
@@ -79,9 +81,10 @@ static void glue(s3c_draw_line2_, BITS)(uint32_t *palette,
     }
 }
 
-static void glue(s3c_draw_line4_, BITS)(uint32_t *palette,
+static void glue(s3c_draw_line4_, BITS)(void *opaque,
                 uint8_t *dest, const uint8_t *src, int width, int deststep)
 {
+    uint32_t *palette = opaque;
     uint32_t data;
     while (width > 0) {
         data = *(uint32_t *) src;
@@ -103,9 +106,10 @@ static void glue(s3c_draw_line4_, BITS)(uint32_t *palette,
     }
 }
 
-static void glue(s3c_draw_line8_, BITS)(uint32_t *palette,
+static void glue(s3c_draw_line8_, BITS)(void *opaque,
                 uint8_t *dest, const uint8_t *src, int width, int deststep)
 {
+    uint32_t *palette = opaque;
     uint32_t data;
     while (width > 0) {
         data = *(uint32_t *) src;
@@ -127,7 +131,7 @@ static void glue(s3c_draw_line8_, BITS)(uint32_t *palette,
     }
 }
 
-static void glue(s3c_draw_line16a_, BITS)(uint32_t *palette,
+static void glue(s3c_draw_line16a_, BITS)(void *opaque,
                 uint8_t *dest, const uint8_t *src, int width, int deststep)
 {
     uint32_t data;
@@ -155,7 +159,7 @@ static void glue(s3c_draw_line16a_, BITS)(uint32_t *palette,
     }
 }
 
-static void glue(s3c_draw_line16b_, BITS)(uint32_t *palette,
+static void glue(s3c_draw_line16b_, BITS)(void *opaque,
                 uint8_t *dest, const uint8_t *src, int width, int deststep)
 {
     uint32_t data;
@@ -183,7 +187,7 @@ static void glue(s3c_draw_line16b_, BITS)(uint32_t *palette,
     }
 }
 
-static void glue(s3c_draw_line12_, BITS)(uint32_t *palette,
+static void glue(s3c_draw_line12_, BITS)(void *opaque,
                 uint8_t *dest, const uint8_t *src, int width, int deststep)
 {
     uint32_t data;
@@ -220,7 +224,7 @@ static void glue(s3c_draw_line12_, BITS)(uint32_t *palette,
     }
 }
 
-static void glue(s3c_draw_line24_, BITS)(uint32_t *palette,
+static void glue(s3c_draw_line24_, BITS)(void *opaque,
                 uint8_t *dest, const uint8_t *src, int width, int deststep)
 {
     uint32_t data;
@@ -241,7 +245,7 @@ static void glue(s3c_draw_line24_, BITS)(uint32_t *palette,
     }
 }
 
-static s3c_drawfn_t glue(s3c_draw_fn_, BITS)[] =
+static drawfn glue(s3c_draw_fn_, BITS)[] =
 {
     glue(s3c_draw_line1_, BITS),
     glue(s3c_draw_line2_, BITS),