Reworked Voodoo thread synchronisation, helps performance.
This commit is contained in:
parent
ca7bd3740b
commit
75fa159caf
1 changed files with 27 additions and 6 deletions
|
|
@ -3287,6 +3287,11 @@ static void voodoo_tex_writel(uint32_t addr, uint32_t val, void *p)
|
||||||
*(uint32_t *)(&voodoo->tex_mem[addr & voodoo->texture_mask]) = val;
|
*(uint32_t *)(&voodoo->tex_mem[addr & voodoo->texture_mask]) = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void wake_render_thread(voodoo_t *voodoo)
|
||||||
|
{
|
||||||
|
thread_set_event(voodoo->wake_render_thread); /*Wake up render thread if moving from idle*/
|
||||||
|
}
|
||||||
|
|
||||||
static inline void queue_command(voodoo_t *voodoo, uint32_t addr_type, uint32_t val)
|
static inline void queue_command(voodoo_t *voodoo, uint32_t addr_type, uint32_t val)
|
||||||
{
|
{
|
||||||
fifo_entry_t *fifo = &voodoo->fifo[voodoo->fifo_write_idx & FIFO_MASK];
|
fifo_entry_t *fifo = &voodoo->fifo[voodoo->fifo_write_idx & FIFO_MASK];
|
||||||
|
|
@ -3305,7 +3310,9 @@ static inline void queue_command(voodoo_t *voodoo, uint32_t addr_type, uint32_t
|
||||||
fifo->addr_type = addr_type;
|
fifo->addr_type = addr_type;
|
||||||
|
|
||||||
voodoo->fifo_write_idx++;
|
voodoo->fifo_write_idx++;
|
||||||
thread_set_event(voodoo->wake_render_thread); /*Wake up render thread if moving from idle*/
|
|
||||||
|
if (FIFO_ENTRIES > 0xe000)
|
||||||
|
wake_render_thread(voodoo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t voodoo_readw(uint32_t addr, void *p)
|
static uint16_t voodoo_readw(uint32_t addr, void *p)
|
||||||
|
|
@ -3319,8 +3326,8 @@ static uint16_t voodoo_readw(uint32_t addr, void *p)
|
||||||
voodoo->flush = 1;
|
voodoo->flush = 1;
|
||||||
while (!FIFO_EMPTY)
|
while (!FIFO_EMPTY)
|
||||||
{
|
{
|
||||||
thread_wait_event(voodoo->not_full_event, -1);
|
wake_render_thread(voodoo);
|
||||||
thread_set_event(voodoo->wake_render_thread);
|
thread_wait_event(voodoo->not_full_event, 1);
|
||||||
}
|
}
|
||||||
voodoo->flush = 0;
|
voodoo->flush = 0;
|
||||||
|
|
||||||
|
|
@ -3346,8 +3353,8 @@ static uint32_t voodoo_readl(uint32_t addr, void *p)
|
||||||
voodoo->flush = 1;
|
voodoo->flush = 1;
|
||||||
while (!FIFO_EMPTY)
|
while (!FIFO_EMPTY)
|
||||||
{
|
{
|
||||||
thread_wait_event(voodoo->not_full_event, -1);
|
wake_render_thread(voodoo);
|
||||||
thread_set_event(voodoo->wake_render_thread);
|
thread_wait_event(voodoo->not_full_event, 1);
|
||||||
}
|
}
|
||||||
voodoo->flush = 0;
|
voodoo->flush = 0;
|
||||||
|
|
||||||
|
|
@ -3365,6 +3372,8 @@ static uint32_t voodoo_readl(uint32_t addr, void *p)
|
||||||
temp |= (voodoo->swap_count << 28);
|
temp |= (voodoo->swap_count << 28);
|
||||||
if (voodoo->cmd_written - voodoo->cmd_read)
|
if (voodoo->cmd_written - voodoo->cmd_read)
|
||||||
temp |= 0x380; /*Busy*/
|
temp |= 0x380; /*Busy*/
|
||||||
|
if (!voodoo->voodoo_busy)
|
||||||
|
wake_render_thread(voodoo);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SST_lfbMode:
|
case SST_lfbMode:
|
||||||
|
|
@ -3432,22 +3441,32 @@ static void voodoo_writel(uint32_t addr, uint32_t val, void *p)
|
||||||
voodoo->cmd_written++;
|
voodoo->cmd_written++;
|
||||||
voodoo->swap_count++;
|
voodoo->swap_count++;
|
||||||
queue_command(voodoo, addr | FIFO_WRITEL_REG, val);
|
queue_command(voodoo, addr | FIFO_WRITEL_REG, val);
|
||||||
|
if (!voodoo->voodoo_busy)
|
||||||
|
wake_render_thread(voodoo);
|
||||||
break;
|
break;
|
||||||
case SST_triangleCMD:
|
case SST_triangleCMD:
|
||||||
voodoo->cmd_written++;
|
voodoo->cmd_written++;
|
||||||
queue_command(voodoo, addr | FIFO_WRITEL_REG, val);
|
queue_command(voodoo, addr | FIFO_WRITEL_REG, val);
|
||||||
|
if (!voodoo->voodoo_busy)
|
||||||
|
wake_render_thread(voodoo);
|
||||||
break;
|
break;
|
||||||
case SST_ftriangleCMD:
|
case SST_ftriangleCMD:
|
||||||
voodoo->cmd_written++;
|
voodoo->cmd_written++;
|
||||||
queue_command(voodoo, addr | FIFO_WRITEL_REG, val);
|
queue_command(voodoo, addr | FIFO_WRITEL_REG, val);
|
||||||
|
if (!voodoo->voodoo_busy)
|
||||||
|
wake_render_thread(voodoo);
|
||||||
break;
|
break;
|
||||||
case SST_fastfillCMD:
|
case SST_fastfillCMD:
|
||||||
voodoo->cmd_written++;
|
voodoo->cmd_written++;
|
||||||
queue_command(voodoo, addr | FIFO_WRITEL_REG, val);
|
queue_command(voodoo, addr | FIFO_WRITEL_REG, val);
|
||||||
|
if (!voodoo->voodoo_busy)
|
||||||
|
wake_render_thread(voodoo);
|
||||||
break;
|
break;
|
||||||
case SST_nopCMD:
|
case SST_nopCMD:
|
||||||
voodoo->cmd_written++;
|
voodoo->cmd_written++;
|
||||||
queue_command(voodoo, addr | FIFO_WRITEL_REG, val);
|
queue_command(voodoo, addr | FIFO_WRITEL_REG, val);
|
||||||
|
if (!voodoo->voodoo_busy)
|
||||||
|
wake_render_thread(voodoo);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SST_fbiInit4:
|
case SST_fbiInit4:
|
||||||
|
|
@ -3555,7 +3574,9 @@ static void render_thread(void *param)
|
||||||
|
|
||||||
voodoo->fifo_read_idx++;
|
voodoo->fifo_read_idx++;
|
||||||
fifo->addr_type = FIFO_INVALID;
|
fifo->addr_type = FIFO_INVALID;
|
||||||
thread_set_event(voodoo->not_full_event);
|
|
||||||
|
if (FIFO_ENTRIES > 0xe000)
|
||||||
|
thread_set_event(voodoo->not_full_event);
|
||||||
|
|
||||||
end_time = timer_read();
|
end_time = timer_read();
|
||||||
voodoo_time += end_time - start_time;
|
voodoo_time += end_time - start_time;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue