vigs: add vblank emulation for headless emulator
authorSeokYeon Hwang <syeon.hwang@samsung.com>
Fri, 8 Jul 2016 11:36:33 +0000 (20:36 +0900)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Mon, 11 Jul 2016 06:59:04 +0000 (15:59 +0900)
Change-Id: Iac85fa67399b51890bfb54c37698f56f2ef40468
Signed-off-by: SeokYeon Hwang <syeon.hwang@samsung.com>
hw/vigs/vigs_device.c

index e266190..d802319 100644 (file)
@@ -42,6 +42,7 @@
 #include "ui/console.h"
 #include "qemu/main-loop.h"
 #include "qemu/error-report.h"
+#include "sysemu/sysemu.h"
 
 #define PCI_VENDOR_ID_VIGS 0x19B2
 #define PCI_DEVICE_ID_VIGS 0x1011
@@ -81,6 +82,9 @@ typedef struct VIGSState
 
     uint32_t reg_con;
     uint32_t reg_int;
+
+    // for VBLANK emulation
+    QEMUTimer *vblank_timer;
 } VIGSState;
 
 #define TYPE_VIGS_DEVICE "vigs"
@@ -341,6 +345,24 @@ static struct vigs_capture_ops capture_ops =
     .process_captured = vigs_process_captured,
 };
 
+static void vblank_update(void *opaque) {
+    VIGSState *s = opaque;
+    uint64_t last_update;
+
+    if (s->reg_con & VIGS_REG_CON_VBLANK_ENABLE) {
+        s->reg_int |= VIGS_REG_INT_VBLANK_PENDING;
+        vigs_update_irq(s);
+    }
+
+    last_update = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
+    timer_mod(s->vblank_timer, last_update + GUI_REFRESH_INTERVAL_DEFAULT);
+}
+
+static void vigs_vblank_timer_init(VIGSState *s) {
+        s->vblank_timer = timer_new_ms(QEMU_CLOCK_REALTIME, vblank_update, s);
+        timer_mod(s->vblank_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME));
+}
+
 static int vigs_device_init(PCIDevice *dev)
 {
     VIGSState *s = DO_UPCAST(VIGSState, dev, dev);
@@ -502,6 +524,12 @@ static int vigs_device_init(PCIDevice *dev)
         }
     }
 
+    // XXX: VBLANK emulation
+    if (display_type == DT_NONE || display_type == DT_NOGRAPHIC) {
+        VIGS_LOG_INFO("VIGS vblank emulation enabled");
+        vigs_vblank_timer_init(s);
+    }
+
     VIGS_LOG_INFO("VIGS initialized");
 
     VIGS_LOG_DEBUG("vram_size = %u", s->vram_size);