From 4448744ff4c4549a884bc367b01f749dfe6e6b9e Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Mon, 12 Feb 2018 21:28:18 +0200 Subject: [PATCH] Multithreaded RTG didn't update screen when only hardware sprite moved or changed. --- od-win32/picasso96_win.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/od-win32/picasso96_win.cpp b/od-win32/picasso96_win.cpp index cb6aa220..b5086e2e 100644 --- a/od-win32/picasso96_win.cpp +++ b/od-win32/picasso96_win.cpp @@ -817,10 +817,7 @@ static bool rtg_render (void) } else { bool full = full_refresh > 0; if (uaegfx_active) { - if (currprefs.rtg_multithread) { - write_comm_pipe_int(render_pipe, rtg_index, 0); - flushed = true; - } else { + if (!currprefs.rtg_multithread) { flushed = picasso_flushpixels(rtg_index, gfxmem_banks[rtg_index]->start + natmem_offset, picasso96_state.XYOffset - gfxmem_banks[rtg_index]->start); } } else { @@ -829,7 +826,11 @@ static bool rtg_render (void) if (full_refresh > 0) full_refresh--; } - flushed |= gfxboard_vsync_handler(full); + bool flushed2 = gfxboard_vsync_handler(full); + if (currprefs.rtg_multithread && uaegfx_active) { + write_comm_pipe_int(render_pipe, rtg_index | (flushed2 ? 0x80000000 : 0), 0); + } + flushed |= flushed2; } return flushed; } @@ -4621,11 +4622,15 @@ static void *render_thread(void *v) render_thread_state = 1; for (;;) { int idx = read_comm_pipe_int_blocking(render_pipe); + bool flush = (idx & 0x80000000) != 0; if (idx == -1) break; if (picasso_on && picasso_requested_on) { lockrtg(); - picasso_flushpixels(idx, gfxmem_banks[idx]->start + natmem_offset, picasso96_state.XYOffset - gfxmem_banks[idx]->start); + if (!picasso_flushpixels(idx, gfxmem_banks[idx]->start + natmem_offset, picasso96_state.XYOffset - gfxmem_banks[idx]->start)) { + if (flush) + gfx_unlock_picasso(true); + } unlockrtg(); } } -- 2.47.3