#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
uint32_t reg_con;
uint32_t reg_int;
+
+ // for VBLANK emulation
+ QEMUTimer *vblank_timer;
} VIGSState;
#define TYPE_VIGS_DEVICE "vigs"
.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);
}
}
+ // 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);