From f4fe56edb280dbd1518166b23ae96ba1ea52f6a1 Mon Sep 17 00:00:00 2001 From: SarahW Date: Thu, 19 Oct 2017 21:01:11 +0100 Subject: [PATCH] Reworked TGUI code to avoid altering memory mappings outside of main thread. --- src/vid_tgui9440.c | 46 ++++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/vid_tgui9440.c b/src/vid_tgui9440.c index 06c6d4e..426f116 100644 --- a/src/vid_tgui9440.c +++ b/src/vid_tgui9440.c @@ -94,6 +94,8 @@ typedef struct tgui_t int blitter_busy; uint64_t blitter_time; uint64_t status_time; + + volatile int write_blitter; } tgui_t; void tgui_recalcmapping(tgui_t *tgui); @@ -108,7 +110,8 @@ void tgui_accel_write(uint32_t addr, uint8_t val, void *priv); void tgui_accel_write_w(uint32_t addr, uint16_t val, void *priv); void tgui_accel_write_l(uint32_t addr, uint32_t val, void *priv); - +void tgui_accel_write_fb_b(uint32_t addr, uint8_t val, void *priv); +void tgui_accel_write_fb_w(uint32_t addr, uint16_t val, void *priv); void tgui_accel_write_fb_l(uint32_t addr, uint32_t val, void *priv); void tgui_out(uint16_t addr, uint8_t val, void *p) @@ -525,7 +528,7 @@ void *tgui9440_init() tgui_hwcursor_draw, NULL); - mem_mapping_add(&tgui->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, NULL, 0, &tgui->svga); + mem_mapping_add(&tgui->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, tgui_accel_write_fb_b, tgui_accel_write_fb_w, tgui_accel_write_fb_l, NULL, 0, &tgui->svga); mem_mapping_add(&tgui->accel_mapping, 0xbc000, 0x4000, tgui_accel_read, tgui_accel_read_w, tgui_accel_read_l, tgui_accel_write, tgui_accel_write_w, tgui_accel_write_l, NULL, 0, tgui); mem_mapping_disable(&tgui->accel_mapping); @@ -616,9 +619,6 @@ enum svga->changedvram[((addr) & 0xfffff) >> 11] = changeframecount; \ } -void tgui_accel_write_fb_b(uint32_t addr, uint8_t val, void *priv); -void tgui_accel_write_fb_w(uint32_t addr, uint16_t val, void *priv); - void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) { svga_t *svga = &tgui->svga; @@ -714,8 +714,9 @@ void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) { // pclog("Blit start TGUI_SRCCPU\n"); if (svga->crtc[0x21] & 0x20) - mem_mapping_set_handler(&tgui->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, tgui_accel_write_fb_b, tgui_accel_write_fb_w, tgui_accel_write_fb_l); - + { + tgui->write_blitter = 1; + } if (tgui->accel.use_src) return; } @@ -767,8 +768,7 @@ void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) { if (svga->crtc[0x21] & 0x20) { -// pclog("Blit end\n"); - mem_mapping_set_handler(&tgui->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear); + tgui->write_blitter = 0; } return; } @@ -784,7 +784,9 @@ void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) { // pclog("Blit start TGUI_SRCMONO | TGUI_SRCCPU\n"); if (svga->crtc[0x21] & 0x20) - mem_mapping_set_handler(&tgui->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, tgui_accel_write_fb_b, tgui_accel_write_fb_w, tgui_accel_write_fb_l); + { + tgui->write_blitter = 1; + } // pclog(" %i\n", tgui->accel.command); if (tgui->accel.use_src) @@ -828,8 +830,7 @@ void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) { if (svga->crtc[0x21] & 0x20) { -// pclog("Blit end\n"); - mem_mapping_set_handler(&tgui->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear); + tgui->write_blitter = 0; } return; } @@ -1245,24 +1246,33 @@ void tgui_accel_write_fb_b(uint32_t addr, uint8_t val, void *p) { svga_t *svga = (svga_t *)p; tgui_t *tgui = (tgui_t *)svga->p; -// pclog("tgui_accel_write_fb_b %08X %02X\n", addr, val); - tgui_queue(tgui, addr, val, FIFO_WRITE_FB_BYTE); + + if (tgui->write_blitter) + tgui_queue(tgui, addr, val, FIFO_WRITE_FB_BYTE); + else + svga_write_linear(addr, val, svga); } void tgui_accel_write_fb_w(uint32_t addr, uint16_t val, void *p) { svga_t *svga = (svga_t *)p; tgui_t *tgui = (tgui_t *)svga->p; -// pclog("tgui_accel_write_fb_w %08X %04X\n", addr, val); - tgui_queue(tgui, addr, val, FIFO_WRITE_FB_WORD); + + if (tgui->write_blitter) + tgui_queue(tgui, addr, val, FIFO_WRITE_FB_WORD); + else + svga_writew_linear(addr, val, svga); } void tgui_accel_write_fb_l(uint32_t addr, uint32_t val, void *p) { svga_t *svga = (svga_t *)p; tgui_t *tgui = (tgui_t *)svga->p; -// pclog("tgui_accel_write_fb_l %08X %08X\n", addr, val); - tgui_queue(tgui, addr, val, FIFO_WRITE_FB_LONG); + + if (tgui->write_blitter) + tgui_queue(tgui, addr, val, FIFO_WRITE_FB_LONG); + else + svga_writel_linear(addr, val, svga); } void tgui_add_status_info(char *s, int max_len, void *p)