Optimise Voodoo FIFO processing of framebuffer / texture / register
writes. Speeds up games that write large amounts of data to the FIFO, eg menus in Expendable.
This commit is contained in:
parent
4fe71bdbed
commit
3cbcf5f575
1 changed files with 32 additions and 14 deletions
|
|
@ -6190,12 +6190,8 @@ static void voodoo_writew(uint32_t addr, uint16_t val, void *p)
|
||||||
voodoo_t *voodoo = (voodoo_t *)p;
|
voodoo_t *voodoo = (voodoo_t *)p;
|
||||||
voodoo->wr_count++;
|
voodoo->wr_count++;
|
||||||
addr &= 0xffffff;
|
addr &= 0xffffff;
|
||||||
|
|
||||||
if (addr == voodoo->last_write_addr+4)
|
cycles -= voodoo->write_time;
|
||||||
cycles -= voodoo->burst_time;
|
|
||||||
else
|
|
||||||
cycles -= voodoo->write_time;
|
|
||||||
voodoo->last_write_addr = addr;
|
|
||||||
|
|
||||||
if ((addr & 0xc00000) == 0x400000) /*Framebuffer*/
|
if ((addr & 0xc00000) == 0x400000) /*Framebuffer*/
|
||||||
queue_command(voodoo, addr | FIFO_WRITEW_FB, val);
|
queue_command(voodoo, addr | FIFO_WRITEW_FB, val);
|
||||||
|
|
@ -6585,23 +6581,45 @@ static void fifo_thread(void *param)
|
||||||
switch (fifo->addr_type & FIFO_TYPE)
|
switch (fifo->addr_type & FIFO_TYPE)
|
||||||
{
|
{
|
||||||
case FIFO_WRITEL_REG:
|
case FIFO_WRITEL_REG:
|
||||||
voodoo_reg_writel(fifo->addr_type & FIFO_ADDR, fifo->val, voodoo);
|
while ((fifo->addr_type & FIFO_TYPE) == FIFO_WRITEL_REG)
|
||||||
|
{
|
||||||
|
voodoo_reg_writel(fifo->addr_type & FIFO_ADDR, fifo->val, voodoo);
|
||||||
|
fifo->addr_type = FIFO_INVALID;
|
||||||
|
voodoo->fifo_read_idx++;
|
||||||
|
fifo = &voodoo->fifo[voodoo->fifo_read_idx & FIFO_MASK];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case FIFO_WRITEW_FB:
|
case FIFO_WRITEW_FB:
|
||||||
wait_for_render_thread_idle(voodoo);
|
wait_for_render_thread_idle(voodoo);
|
||||||
voodoo_fb_writew(fifo->addr_type & FIFO_ADDR, fifo->val, voodoo);
|
while ((fifo->addr_type & FIFO_TYPE) == FIFO_WRITEW_FB)
|
||||||
|
{
|
||||||
|
voodoo_fb_writew(fifo->addr_type & FIFO_ADDR, fifo->val, voodoo);
|
||||||
|
fifo->addr_type = FIFO_INVALID;
|
||||||
|
voodoo->fifo_read_idx++;
|
||||||
|
fifo = &voodoo->fifo[voodoo->fifo_read_idx & FIFO_MASK];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case FIFO_WRITEL_FB:
|
case FIFO_WRITEL_FB:
|
||||||
wait_for_render_thread_idle(voodoo);
|
wait_for_render_thread_idle(voodoo);
|
||||||
voodoo_fb_writel(fifo->addr_type & FIFO_ADDR, fifo->val, voodoo);
|
while ((fifo->addr_type & FIFO_TYPE) == FIFO_WRITEL_FB)
|
||||||
|
{
|
||||||
|
voodoo_fb_writel(fifo->addr_type & FIFO_ADDR, fifo->val, voodoo);
|
||||||
|
fifo->addr_type = FIFO_INVALID;
|
||||||
|
voodoo->fifo_read_idx++;
|
||||||
|
fifo = &voodoo->fifo[voodoo->fifo_read_idx & FIFO_MASK];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case FIFO_WRITEL_TEX:
|
case FIFO_WRITEL_TEX:
|
||||||
if (!(fifo->addr_type & 0x400000))
|
while ((fifo->addr_type & FIFO_TYPE) == FIFO_WRITEL_TEX)
|
||||||
voodoo_tex_writel(fifo->addr_type & FIFO_ADDR, fifo->val, voodoo);
|
{
|
||||||
|
if (!(fifo->addr_type & 0x400000))
|
||||||
|
voodoo_tex_writel(fifo->addr_type & FIFO_ADDR, fifo->val, voodoo);
|
||||||
|
fifo->addr_type = FIFO_INVALID;
|
||||||
|
voodoo->fifo_read_idx++;
|
||||||
|
fifo = &voodoo->fifo[voodoo->fifo_read_idx & FIFO_MASK];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
voodoo->fifo_read_idx++;
|
|
||||||
fifo->addr_type = FIFO_INVALID;
|
|
||||||
|
|
||||||
if (FIFO_ENTRIES > 0xe000)
|
if (FIFO_ENTRIES > 0xe000)
|
||||||
thread_set_event(voodoo->fifo_not_full_event);
|
thread_set_event(voodoo->fifo_not_full_event);
|
||||||
|
|
@ -6653,7 +6671,7 @@ static void fifo_thread(void *param)
|
||||||
if ((addr & 0x3ff) == SST_triangleCMD || (addr & 0x3ff) == SST_ftriangleCMD ||
|
if ((addr & 0x3ff) == SST_triangleCMD || (addr & 0x3ff) == SST_ftriangleCMD ||
|
||||||
(addr & 0x3ff) == SST_fastfillCMD || (addr & 0x3ff) == SST_nopCMD)
|
(addr & 0x3ff) == SST_fastfillCMD || (addr & 0x3ff) == SST_nopCMD)
|
||||||
voodoo->cmd_written_fifo++;
|
voodoo->cmd_written_fifo++;
|
||||||
|
|
||||||
voodoo_reg_writel(addr, val, voodoo);
|
voodoo_reg_writel(addr, val, voodoo);
|
||||||
|
|
||||||
if (header & (1 << 15))
|
if (header & (1 << 15))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue