From 961131201e5bce2cfd7d68ae6c4dfa0b68b532b3 Mon Sep 17 00:00:00 2001 From: AITUS95 <48457684+AITUS95@users.noreply.github.com> Date: Wed, 26 Nov 2025 14:04:24 +0100 Subject: [PATCH 1/7] voodoo: reduce FIFO thread wake frequency to avoid performance stalls --- src/video/vid_voodoo_fifo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_voodoo_fifo.c b/src/video/vid_voodoo_fifo.c index 612ca4c18..b7ae77c64 100644 --- a/src/video/vid_voodoo_fifo.c +++ b/src/video/vid_voodoo_fifo.c @@ -60,7 +60,7 @@ voodoo_fifo_log(const char *fmt, ...) # define voodoo_fifo_log(fmt, ...) #endif -#define WAKE_DELAY (TIMER_USEC * 100) +#define WAKE_DELAY (TIMER_USEC * 1000) void voodoo_wake_fifo_thread(voodoo_t *voodoo) { From 460873783165b945476015bbbe4467fe24b546e5 Mon Sep 17 00:00:00 2001 From: AITUS95 <48457684+AITUS95@users.noreply.github.com> Date: Wed, 26 Nov 2025 14:05:24 +0100 Subject: [PATCH 2/7] voodoo: improve CMDFIFO wake logic to reduce excessive FIFO processing --- src/video/vid_voodoo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index fe02b7811..44f3228a4 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -431,7 +431,7 @@ voodoo_writel(uint32_t addr, uint32_t val, void *priv) #endif *(uint32_t *) &voodoo->fb_mem[(voodoo->cmdfifo_base + (addr & 0x3fffc)) & voodoo->fb_mask] = val; voodoo->cmdfifo_depth_wr++; - if ((voodoo->cmdfifo_depth_wr - voodoo->cmdfifo_depth_rd) < 20) + if ((voodoo->cmdfifo_depth_wr - voodoo->cmdfifo_depth_rd) > 200) voodoo_wake_fifo_thread(voodoo); } else switch (addr & 0x3fc) { From 689fd67d63b8862a96ae7cccaf5e5a88f4c67385 Mon Sep 17 00:00:00 2001 From: AITUS95 <48457684+AITUS95@users.noreply.github.com> Date: Wed, 26 Nov 2025 15:01:09 +0100 Subject: [PATCH 3/7] Increase command FIFO depth threshold from 200 to 300 --- src/video/vid_voodoo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index 44f3228a4..04c1c7305 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -431,7 +431,7 @@ voodoo_writel(uint32_t addr, uint32_t val, void *priv) #endif *(uint32_t *) &voodoo->fb_mem[(voodoo->cmdfifo_base + (addr & 0x3fffc)) & voodoo->fb_mask] = val; voodoo->cmdfifo_depth_wr++; - if ((voodoo->cmdfifo_depth_wr - voodoo->cmdfifo_depth_rd) > 200) + if ((voodoo->cmdfifo_depth_wr - voodoo->cmdfifo_depth_rd) > 300) voodoo_wake_fifo_thread(voodoo); } else switch (addr & 0x3fc) { From ee48c1be89a0baa1d62738bcd54783ab2935b813 Mon Sep 17 00:00:00 2001 From: AITUS95 <48457684+AITUS95@users.noreply.github.com> Date: Wed, 26 Nov 2025 15:02:23 +0100 Subject: [PATCH 4/7] Increase WAKE_DELAY from 1000 to 2000 --- src/video/vid_voodoo_fifo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_voodoo_fifo.c b/src/video/vid_voodoo_fifo.c index b7ae77c64..9b273d317 100644 --- a/src/video/vid_voodoo_fifo.c +++ b/src/video/vid_voodoo_fifo.c @@ -60,7 +60,7 @@ voodoo_fifo_log(const char *fmt, ...) # define voodoo_fifo_log(fmt, ...) #endif -#define WAKE_DELAY (TIMER_USEC * 1000) +#define WAKE_DELAY (TIMER_USEC * 2000) void voodoo_wake_fifo_thread(voodoo_t *voodoo) { From 1f45cf2872ac82f3e1035a87f2bf5426ca8574e0 Mon Sep 17 00:00:00 2001 From: AITUS95 <48457684+AITUS95@users.noreply.github.com> Date: Wed, 26 Nov 2025 17:04:54 +0100 Subject: [PATCH 5/7] voodoo1: restrict increased CMDFIFO threshold to VOODOO_1 only --- src/video/vid_voodoo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index 04c1c7305..c17f8bc32 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -431,7 +431,7 @@ voodoo_writel(uint32_t addr, uint32_t val, void *priv) #endif *(uint32_t *) &voodoo->fb_mem[(voodoo->cmdfifo_base + (addr & 0x3fffc)) & voodoo->fb_mask] = val; voodoo->cmdfifo_depth_wr++; - if ((voodoo->cmdfifo_depth_wr - voodoo->cmdfifo_depth_rd) > 300) + if ((voodoo->cmdfifo_depth_wr - voodoo->cmdfifo_depth_rd) > (voodoo->type == VOODOO_1 ? 300 : 20)) voodoo_wake_fifo_thread(voodoo); } else switch (addr & 0x3fc) { From e5e51b3c34af0a460ed217bb35c6ddbaebbecb38 Mon Sep 17 00:00:00 2001 From: AITUS95 <48457684+AITUS95@users.noreply.github.com> Date: Wed, 26 Nov 2025 17:06:15 +0100 Subject: [PATCH 6/7] voodoo1: apply FIFO wake delay only when type == VOODOO_1 Updated the wake delay for the FIFO thread based on the card type. --- src/video/vid_voodoo_fifo.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/video/vid_voodoo_fifo.c b/src/video/vid_voodoo_fifo.c index 9b273d317..4530e6b01 100644 --- a/src/video/vid_voodoo_fifo.c +++ b/src/video/vid_voodoo_fifo.c @@ -60,7 +60,10 @@ voodoo_fifo_log(const char *fmt, ...) # define voodoo_fifo_log(fmt, ...) #endif -#define WAKE_DELAY (TIMER_USEC * 2000) +#define WAKE_DELAY_DEFAULT (TIMER_USEC * 100) + +/* Per-card wake delay: Voodoo1 uses a larger delay to reduce FIFO wake frequency */ +#define WAKE_DELAY_OF(v) ((v)->type == VOODOO_1 ? (TIMER_USEC * 2000) : WAKE_DELAY_DEFAULT) void voodoo_wake_fifo_thread(voodoo_t *voodoo) { @@ -69,7 +72,7 @@ voodoo_wake_fifo_thread(voodoo_t *voodoo) process one word and go back to sleep, requiring it to be woken on almost every write. Instead, wait a short while so that the CPU emulation writes more data so we have more batched-up work.*/ - timer_set_delay_u64(&voodoo->wake_timer, WAKE_DELAY); + timer_set_delay_u64(&voodoo->wake_timer, WAKE_DELAY_OF(voodoo)); } } From eee4ec9f878ff95a675036e317faac1a6c709825 Mon Sep 17 00:00:00 2001 From: AITUS95 <48457684+AITUS95@users.noreply.github.com> Date: Wed, 26 Nov 2025 19:40:51 +0100 Subject: [PATCH 7/7] voodoo1: apply higher CMDFIFO wake threshold only for Voodoo1 --- src/video/vid_voodoo.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index c17f8bc32..47c59a0ff 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -427,18 +427,27 @@ voodoo_writel(uint32_t addr, uint32_t val, void *priv) voodoo_queue_command(voodoo, addr | FIFO_WRITEL_FB, val); } else if ((addr & 0x200000) && (voodoo->fbiInit7 & FBIINIT7_CMDFIFO_ENABLE)) { #if 0 - voodoo_log("Write CMDFIFO %08x(%08x) %08x %08x\n", addr, voodoo->cmdfifo_base + (addr & 0x3fffc), val, (voodoo->cmdfifo_base + (addr & 0x3fffc)) & voodoo->fb_mask); + voodoo_log("Write CMDFIFO %08x(%08x) %08x %08x\n", addr, (voodoo->cmdfifo_base + (addr & 0x3fffc)) & voodoo->fb_mask, val, (voodoo->cmdfifo_base + (addr & 0x3fffc)) & voodoo->fb_mask); #endif *(uint32_t *) &voodoo->fb_mem[(voodoo->cmdfifo_base + (addr & 0x3fffc)) & voodoo->fb_mask] = val; voodoo->cmdfifo_depth_wr++; - if ((voodoo->cmdfifo_depth_wr - voodoo->cmdfifo_depth_rd) > (voodoo->type == VOODOO_1 ? 300 : 20)) - voodoo_wake_fifo_thread(voodoo); + + /* Voodoo1: use higher CMDFIFO threshold to reduce wake frequency */ + if (voodoo->type == VOODOO_1) { + if ((voodoo->cmdfifo_depth_wr - voodoo->cmdfifo_depth_rd) > 300) + voodoo_wake_fifo_thread(voodoo); + } + /* Other cards (Voodoo2, Banshee, Voodoo3, ...) keep the original behavior */ + else { + if ((voodoo->cmdfifo_depth_wr - voodoo->cmdfifo_depth_rd) < 20) + voodoo_wake_fifo_thread(voodoo); + } } else switch (addr & 0x3fc) { case SST_intrCtrl: fatal("intrCtrl write %08x\n", val); break; - + case SST_userIntrCMD: fatal("userIntrCMD write %08x\n", val); break;