Skip to content

Commit 793a314

Browse files
authored
Merge pull request 86Box#5280 from Cacodemon345/virge-fixes
ViRGE: Revert all FIFO changes and keep only IRQ handling
2 parents a9653e5 + 92d6947 commit 793a314

File tree

1 file changed

+25
-49
lines changed

1 file changed

+25
-49
lines changed

src/video/vid_s3_virge.c

Lines changed: 25 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ typedef struct virge_t {
338338
event_t * fifo_not_full_event;
339339

340340
atomic_int virge_busy;
341-
atomic_uint virge_irq_req;
341+
atomic_uint irq_pending;
342342

343343
uint8_t subsys_stat;
344344
uint8_t subsys_cntl;
@@ -374,11 +374,10 @@ typedef struct virge_t {
374374
uint32_t dma_mmio_addr;
375375
uint32_t dma_data_type;
376376

377-
pc_timer_t wake_timer;
378-
pc_timer_t irq_timer;
379-
380377
int pci;
381378
int is_agp;
379+
380+
pc_timer_t irq_timer;
382381
} virge_t;
383382

384383
static __inline void
@@ -387,28 +386,6 @@ wake_fifo_thread(virge_t *virge) {
387386
thread_set_event(virge->wake_fifo_thread);
388387
}
389388

390-
void
391-
s3_virge_wake_fifo_timer(void* priv)
392-
{
393-
virge_t *virge = (virge_t *) priv;
394-
395-
thread_set_event(virge->wake_fifo_thread); /*Wake up FIFO thread if moving from idle*/
396-
}
397-
398-
void
399-
s3_virge_wake_fifo_thread(virge_t *virge)
400-
{
401-
if (!timer_is_enabled(&virge->wake_timer)) {
402-
/*Don't wake FIFO thread immediately - if we do that it will probably
403-
process one word and go back to sleep, requiring it to be woken on
404-
almost every write. Instead, wait a short while so that the CPU
405-
emulation writes more data so we have more batched-up work.*/
406-
timer_on_auto(&virge->wake_timer, 100.0);
407-
}
408-
if (!timer_is_enabled(&virge->irq_timer))
409-
timer_on_auto(&virge->irq_timer, 100.0);
410-
}
411-
412389
static virge_t *reset_state = NULL;
413390

414391
static video_timings_t timing_diamond_stealth3d_2000_pci = { .type = VIDEO_PCI, .write_b = 2, .write_w = 2, .write_l = 3, .read_b = 28, .read_w = 28, .read_l = 45 };
@@ -497,13 +474,13 @@ s3_virge_update_irqs(virge_t *virge)
497474
pci_clear_irq(virge->pci_slot, PCI_INTA, &virge->irq_state);
498475
}
499476

500-
void
477+
static void
501478
s3_virge_update_irq_timer(void* priv)
502479
{
503480
virge_t *virge = (virge_t *) priv;
504481

505-
if (virge->virge_irq_req) {
506-
virge->virge_irq_req--;
482+
if (virge->irq_pending) {
483+
virge->irq_pending--;
507484
s3_virge_update_irqs(virge);
508485
}
509486

@@ -1140,9 +1117,8 @@ static void
11401117
s3_virge_vblank_start(svga_t *svga) {
11411118
virge_t *virge = (virge_t *) svga->priv;
11421119

1143-
if (virge->virge_irq_req)
1144-
virge->virge_irq_req--;
1145-
1120+
if (virge->irq_pending)
1121+
virge->irq_pending--;
11461122
virge->subsys_stat |= INT_VSY;
11471123
s3_virge_update_irqs(virge);
11481124
}
@@ -1826,19 +1802,18 @@ fifo_thread(void *param)
18261802
virge->fifo_read_idx++;
18271803
fifo->addr_type = FIFO_INVALID;
18281804

1829-
if (FIFO_ENTRIES > 0xe000)
1830-
thread_set_event(virge->fifo_not_full_event);
1805+
if (FIFO_ENTRIES > 0xe000)
1806+
thread_set_event(virge->fifo_not_full_event);
18311807

1832-
end_time = plat_timer_read();
1833-
virge_time += end_time - start_time;
1834-
}
1835-
virge->virge_busy = 0;
1836-
virge->subsys_stat |= (INT_FIFO_EMP | INT_3DF_EMP);
1837-
if (virge->cmd_dma)
1838-
virge->subsys_stat |= (INT_HOST_DONE | INT_CMD_DONE);
1808+
end_time = plat_timer_read();
1809+
virge_time += end_time - start_time;
1810+
}
1811+
virge->virge_busy = 0;
1812+
virge->subsys_stat |= (INT_FIFO_EMP | INT_3DF_EMP);
1813+
if (virge->cmd_dma)
1814+
virge->subsys_stat |= (INT_HOST_DONE | INT_CMD_DONE);
18391815

1840-
//s3_virge_update_irqs(virge);
1841-
virge->virge_irq_req++;
1816+
virge->irq_pending++;
18421817
}
18431818
}
18441819

@@ -1878,8 +1853,10 @@ s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type)
18781853

18791854
virge->fifo_write_idx++;
18801855

1881-
if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 16)
1882-
s3_virge_wake_fifo_thread(virge);
1856+
if (FIFO_ENTRIES > 0xe000)
1857+
wake_fifo_thread(virge);
1858+
if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 8)
1859+
wake_fifo_thread(virge);
18831860
}
18841861

18851862
static void
@@ -4445,8 +4422,7 @@ render_thread(void *param)
44454422
}
44464423
virge->s3d_busy = 0;
44474424
virge->subsys_stat |= INT_S3D_DONE;
4448-
//s3_virge_update_irqs(virge);
4449-
virge->virge_irq_req++;
4425+
virge->irq_pending++;
44504426
}
44514427
}
44524428

@@ -5104,6 +5080,7 @@ s3_virge_disable_handlers(virge_t *dev)
51045080

51055081
reset_state->svga.timer = dev->svga.timer;
51065082
reset_state->svga.timer8514 = dev->svga.timer8514;
5083+
reset_state->irq_timer = dev->irq_timer;
51075084
}
51085085

51095086
static void
@@ -5375,8 +5352,7 @@ s3_virge_init(const device_t *info)
53755352
virge->fifo_not_full_event = thread_create_event();
53765353
virge->fifo_thread = thread_create(fifo_thread, virge);
53775354

5378-
timer_add(&virge->wake_timer, s3_virge_wake_fifo_timer, virge, 0);
5379-
timer_add(&virge->irq_timer, s3_virge_update_irq_timer, virge, 0);
5355+
timer_add(&virge->irq_timer, s3_virge_update_irq_timer, virge, 1);
53805356

53815357
virge->local = info->local;
53825358

0 commit comments

Comments
 (0)