From 75ed8c9641fcb6c250916511bfa00e5d7ce89336 Mon Sep 17 00:00:00 2001 From: SarahW Date: Tue, 10 May 2016 21:07:13 +0100 Subject: [PATCH] ViRGE fixes : - Create 2D FIFO thread and events on ViRGE 325 as well as DX - fixes crash when blitter first used - Wake 2D FIFO thread when writing to empty/nearly empty FIFO - fixes ViRGE 325 Windows 95 drivers - Read status register on byte access - fixes ViRGE 325 Windows 95 drivers --- src/vid_s3_virge.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/vid_s3_virge.c b/src/vid_s3_virge.c index 05a6ade..bfffb19 100644 --- a/src/vid_s3_virge.c +++ b/src/vid_s3_virge.c @@ -718,10 +718,22 @@ static void s3_virge_wait_fifo_idle(virge_t *virge) static uint8_t s3_virge_mmio_read(uint32_t addr, void *p) { + virge_t *virge = (virge_t *)p; + uint8_t ret; + reg_reads++; // pclog("New MMIO readb %08X\n", addr); switch (addr & 0xffff) { + case 0x8505: + if (virge->s3d_busy || virge->virge_busy || !FIFO_EMPTY) + ret = 0x10; + else + ret = 0x10 | (1 << 5); + if (!virge->virge_busy) + wake_fifo_thread(virge); + return ret; + case 0x83b0: case 0x83b1: case 0x83b2: case 0x83b3: case 0x83b4: case 0x83b5: case 0x83b6: case 0x83b7: case 0x83b8: case 0x83b9: case 0x83ba: case 0x83bb: @@ -1272,6 +1284,8 @@ static void s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t if (FIFO_ENTRIES > 0xe000) wake_fifo_thread(virge); + if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 8) + wake_fifo_thread(virge); } static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *p) @@ -3814,6 +3828,10 @@ static void *s3_virge_init() virge->wake_main_thread = thread_create_event(); virge->not_full_event = thread_create_event(); virge->render_thread = thread_create(render_thread, virge); + + virge->wake_fifo_thread = thread_create_event(); + virge->fifo_not_full_event = thread_create_event(); + virge->fifo_thread = thread_create(fifo_thread, virge); return virge; }