]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Stop background render thread if not needed.
authorToni Wilen <twilen@winuae.net>
Sat, 10 Feb 2018 18:06:26 +0000 (20:06 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 10 Feb 2018 18:06:26 +0000 (20:06 +0200)
devices.cpp
od-win32/picasso96_win.cpp
od-win32/picasso96_win.h

index 942cfa0d4135dd8bd6f57b8c7429c1583f7e6656..ef13a385abbc1473a6b9d225b6095cb57ccc2838 100644 (file)
@@ -337,6 +337,7 @@ void do_leave_program (void)
        // must be first
        uae_ppc_free();
 #endif
+       picasso_free();
        free_traps();
        sampler_free ();
        graphics_leave ();
index e73b59c9fee58c25a80add3a74f1fe68d922d088..cb6aa2202d82e919334f82331489f69f5eb1cfc2 100644 (file)
@@ -96,6 +96,7 @@ static int p96syncrate;
 static int p96hsync_counter, full_refresh;
 
 static smp_comm_pipe *render_pipe;
+static volatile int render_thread_state;
 static CRITICAL_SECTION render_cs;
 
 #define PICASSO_STATE_SETDISPLAY 1
@@ -4617,14 +4618,18 @@ static bool picasso_flushpixels (int index, uae_u8 *src, int off)
 
 static void *render_thread(void *v)
 {
+       render_thread_state = 1;
        for (;;) {
                int idx = read_comm_pipe_int_blocking(render_pipe);
                if (idx == -1)
                        break;
-               lockrtg();
-               picasso_flushpixels(idx, gfxmem_banks[idx]->start + natmem_offset, picasso96_state.XYOffset - gfxmem_banks[idx]->start);
-               unlockrtg();
+               if (picasso_on && picasso_requested_on) {
+                       lockrtg();
+                       picasso_flushpixels(idx, gfxmem_banks[idx]->start + natmem_offset, picasso96_state.XYOffset - gfxmem_banks[idx]->start);
+                       unlockrtg();
+               }
        }
+       render_thread_state = -1;
        return 0;
 }
 
@@ -5009,11 +5014,16 @@ static void inituaegfxfuncs(TrapContext *ctx, uaecptr start, uaecptr ABI)
 
 void picasso_reset (void)
 {
-       if (!render_pipe && currprefs.rtg_multithread) {
-               InitializeCriticalSection(&render_cs);
-               render_pipe = xmalloc(smp_comm_pipe, 1);
-               init_comm_pipe(render_pipe, 10, 1);
-               uae_start_thread(_T("rtg"), render_thread, NULL, NULL);
+       if (currprefs.rtg_multithread) {
+               if (!render_pipe) {
+                       InitializeCriticalSection(&render_cs);
+                       render_pipe = xmalloc(smp_comm_pipe, 1);
+                       init_comm_pipe(render_pipe, 10, 1);
+               }
+               if (render_thread_state <= 0) {
+                       render_thread_state = 0;
+                       uae_start_thread(_T("rtg"), render_thread, NULL, NULL);
+               }
        }
 
        rtg_index = -1;
@@ -5199,6 +5209,17 @@ uae_u32 picasso_demux (uae_u32 arg, TrapContext *ctx)
        return 0;
 }
 
+void picasso_free(void)
+{
+       if (currprefs.rtg_multithread && render_thread_state > 0) {
+               write_comm_pipe_int(render_pipe, -1, 0);
+               while (render_thread_state >= 0) {
+                       Sleep(10);
+               }
+               render_thread_state = 0;
+       }
+}
+
 void restore_p96_finish (void)
 {
        init_alloc (NULL, 0);
index a6dca7ce4bdefec417f34b6ff799b250d250eff5..6c13b2c644d7afdb8ad0b7707ac2c33427d6f954 100644 (file)
@@ -563,6 +563,7 @@ extern void picasso_getwritewatch (int index, int offset);
 extern bool picasso_is_vram_dirty (int index, uaecptr addr, int size);
 extern void picasso_statusline (uae_u8 *dst);
 extern void picasso_invalidate (int x, int y, int w, int h);
+extern void picasso_free(void);
 
 /* This structure describes the UAE-side framebuffer for the Picasso
  * screen.  */