Skip to content

Commit 92d6947

Browse files
committed
Only retain the newer IRQ updating code
1 parent 73576bb commit 92d6947

File tree

1 file changed

+32
-11
lines changed

1 file changed

+32
-11
lines changed

src/video/vid_s3_virge.c

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

340340
atomic_int virge_busy;
341+
atomic_uint irq_pending;
341342

342343
uint8_t subsys_stat;
343344
uint8_t subsys_cntl;
@@ -375,6 +376,8 @@ typedef struct virge_t {
375376

376377
int pci;
377378
int is_agp;
379+
380+
pc_timer_t irq_timer;
378381
} virge_t;
379382

380383
static __inline void
@@ -471,6 +474,19 @@ s3_virge_update_irqs(virge_t *virge)
471474
pci_clear_irq(virge->pci_slot, PCI_INTA, &virge->irq_state);
472475
}
473476

477+
static void
478+
s3_virge_update_irq_timer(void* priv)
479+
{
480+
virge_t *virge = (virge_t *) priv;
481+
482+
if (virge->irq_pending) {
483+
virge->irq_pending--;
484+
s3_virge_update_irqs(virge);
485+
}
486+
487+
timer_on_auto(&virge->irq_timer, 100.);
488+
}
489+
474490
static void
475491
s3_virge_out(uint16_t addr, uint8_t val, void *priv)
476492
{
@@ -1101,6 +1117,8 @@ static void
11011117
s3_virge_vblank_start(svga_t *svga) {
11021118
virge_t *virge = (virge_t *) svga->priv;
11031119

1120+
if (virge->irq_pending)
1121+
virge->irq_pending--;
11041122
virge->subsys_stat |= INT_VSY;
11051123
s3_virge_update_irqs(virge);
11061124
}
@@ -1784,18 +1802,18 @@ fifo_thread(void *param)
17841802
virge->fifo_read_idx++;
17851803
fifo->addr_type = FIFO_INVALID;
17861804

1787-
if (FIFO_ENTRIES > 0xe000)
1788-
thread_set_event(virge->fifo_not_full_event);
1805+
if (FIFO_ENTRIES > 0xe000)
1806+
thread_set_event(virge->fifo_not_full_event);
17891807

1790-
end_time = plat_timer_read();
1791-
virge_time += end_time - start_time;
1792-
}
1793-
virge->virge_busy = 0;
1794-
virge->subsys_stat |= (INT_FIFO_EMP | INT_3DF_EMP);
1795-
if (virge->cmd_dma)
1796-
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);
17971815

1798-
s3_virge_update_irqs(virge);
1816+
virge->irq_pending++;
17991817
}
18001818
}
18011819

@@ -4404,7 +4422,7 @@ render_thread(void *param)
44044422
}
44054423
virge->s3d_busy = 0;
44064424
virge->subsys_stat |= INT_S3D_DONE;
4407-
s3_virge_update_irqs(virge);
4425+
virge->irq_pending++;
44084426
}
44094427
}
44104428

@@ -5062,6 +5080,7 @@ s3_virge_disable_handlers(virge_t *dev)
50625080

50635081
reset_state->svga.timer = dev->svga.timer;
50645082
reset_state->svga.timer8514 = dev->svga.timer8514;
5083+
reset_state->irq_timer = dev->irq_timer;
50655084
}
50665085

50675086
static void
@@ -5333,6 +5352,8 @@ s3_virge_init(const device_t *info)
53335352
virge->fifo_not_full_event = thread_create_event();
53345353
virge->fifo_thread = thread_create(fifo_thread, virge);
53355354

5355+
timer_add(&virge->irq_timer, s3_virge_update_irq_timer, virge, 1);
5356+
53365357
virge->local = info->local;
53375358

53385359
*reset_state = *virge;

0 commit comments

Comments
 (0)