mirror of
https://github.com/86Box/86Box.git
synced 2026-02-21 17:15:32 -07:00
Merge pull request #6508 from AITUS95/master
Improve Voodoo1 FIFO/CMDFIFO timing without affecting other 3dfx cards
This commit is contained in:
@@ -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) < 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;
|
||||
|
||||
@@ -60,7 +60,10 @@ voodoo_fifo_log(const char *fmt, ...)
|
||||
# define voodoo_fifo_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
#define WAKE_DELAY (TIMER_USEC * 100)
|
||||
#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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user