From bbba85628b927ab35f74d3ce82c9c5d9c9d96bf8 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Wed, 11 Jul 2018 20:43:05 +0300 Subject: [PATCH] Make sure RTG render thread does not have rtg lock at reset. --- include/xwin.h | 2 +- od-win32/picasso96_win.cpp | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/include/xwin.h b/include/xwin.h index b03f0767..e1d631c1 100644 --- a/include/xwin.h +++ b/include/xwin.h @@ -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; diff --git a/od-win32/picasso96_win.cpp b/od-win32/picasso96_win.cpp index d0b1c97e..0f3223cd 100644 --- a/od-win32/picasso96_win.cpp +++ b/od-win32/picasso96_win.cpp @@ -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) -- 2.47.3