]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Multithreaded RTG didn't update screen when only hardware sprite moved or changed.
authorToni Wilen <twilen@winuae.net>
Mon, 12 Feb 2018 19:28:18 +0000 (21:28 +0200)
committerToni Wilen <twilen@winuae.net>
Mon, 12 Feb 2018 19:28:18 +0000 (21:28 +0200)
od-win32/picasso96_win.cpp

index cb6aa2202d82e919334f82331489f69f5eb1cfc2..b5086e2e9f1a1f5af88c3dca8bdebcd2aeb069a6 100644 (file)
@@ -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();
                }
        }