diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index a2f0d58828..0c27accec7 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2604,6 +2604,12 @@ namespace rsx void thread::handle_emu_flip(u32 buffer) { + if (m_queued_flip.in_progress) + { + // Rescursion not allowed! + return; + } + if (m_queued_flip.buffer == ~0u) { // Frame was not queued before flipping @@ -2653,13 +2659,16 @@ namespace rsx int_flip_index++; verify(HERE), m_queued_flip.buffer == buffer; + current_display_buffer = buffer; m_queued_flip.emu_flip = true; + m_queued_flip.in_progress = true; flip(m_queued_flip); last_flip_time = get_system_time() - 1000000; flip_status = CELL_GCM_DISPLAY_FLIP_STATUS_DONE; m_queued_flip.buffer = ~0u; + m_queued_flip.in_progress = false; if (flip_handler) { diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 502f5553d3..5e1621fedc 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -428,6 +428,7 @@ namespace rsx u32 buffer; bool skip_frame; bool emu_flip; + bool in_progress; frame_statistics_t stats; };