]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Make sure RTG render thread does not have rtg lock at reset.
authorToni Wilen <twilen@winuae.net>
Wed, 11 Jul 2018 17:43:05 +0000 (20:43 +0300)
committerToni Wilen <twilen@winuae.net>
Wed, 11 Jul 2018 17:43:05 +0000 (20:43 +0300)
include/xwin.h
od-win32/picasso96_win.cpp

index b03f07676aeb5f94cba1d643d7335703daa45829..e1d631c1fade114d6c323e81f29896a2a94ccd7f 100644 (file)
@@ -165,7 +165,7 @@ struct vidbuf_description
 
 struct amigadisplay
 {
-       bool picasso_requested_on;
+       volatile bool picasso_requested_on;
        bool picasso_requested_forced_on;
        bool picasso_on;
        int picasso_redraw_necessary;
index d0b1c97e6e37b5281f57961a7e4ce46c770400a1..0f3223cd2669cd63187f16002c9a9a4b0e9249ee 100644 (file)
@@ -4686,9 +4686,11 @@ static void *render_thread(void *v)
                struct amigadisplay *ad = &adisplays[monid];
                if (ad->picasso_on && ad->picasso_requested_on) {
                        lockrtg();
-                       struct picasso96_state_struct *state = &picasso96_state[monid];
-                       picasso_flushpixels(idx, gfxmem_banks[idx]->start + natmem_offset, state->XYOffset - gfxmem_banks[idx]->start, false);
-                       ad->pending_render = true;
+                       if (ad->picasso_requested_on) {
+                               struct picasso96_state_struct *state = &picasso96_state[monid];
+                               picasso_flushpixels(idx, gfxmem_banks[idx]->start + natmem_offset, state->XYOffset - gfxmem_banks[idx]->start, false);
+                               ad->pending_render = true;
+                       }
                        unlockrtg();
                }
        }
@@ -5091,6 +5093,8 @@ void picasso_reset(int monid)
                }
        }
 
+       lockrtg();
+
        rtg_index = -1;
        if (savestate_state != STATE_RESTORE) {
                uaegfx_base = 0;
@@ -5101,9 +5105,17 @@ void picasso_reset(int monid)
                resetpalette(state);
                InitPicasso96(monid);
        }
+
        if (is_uaegfx_active() && currprefs.rtgboards[0].monitor_id > 0) {
                close_rtg(currprefs.rtgboards[0].monitor_id);
        }
+
+       for (int i = 0; i < MAX_AMIGADISPLAYS; i++) {
+               struct amigadisplay *ad = &adisplays[i];
+               ad->picasso_requested_on = false;
+       }
+
+       unlockrtg();
 }
 
 void uaegfx_install_code (uaecptr start)