diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 3b87b7322f..1f0e8c1e77 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2256,6 +2256,23 @@ namespace rsx void thread::recover_fifo() { + const u64 current_time = get_system_time(); + + if (recovered_fifo_cmds_history.size() == 20u) + { + const auto cmd_info = recovered_fifo_cmds_history.front(); + + // Check timestamp of last tracked cmd + if (current_time - cmd_info.timestamp < 1'500'000u) + { + // Probably hopeless + fmt::throw_exception("Dead FIFO commands queue state has been detected!\nTry increasing \"Driver Wake-Up Delay\" setting in Advanced settings." HERE); + } + + // Erase the last command from history, keep the size of the queue the same + recovered_fifo_cmds_history.pop(); + } + // Error. Should reset the queue fifo_ctrl->set_get(restore_point); fifo_ret_addr = saved_fifo_ret; @@ -2267,6 +2284,8 @@ namespace rsx execute_nop_draw(); rsx::thread::end(); } + + recovered_fifo_cmds_history.push({fifo_ctrl->last_cmd(), current_time}); } void thread::fifo_wake_delay(u64 div) diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index bef680aa83..c3aa1b24e9 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -726,6 +727,14 @@ namespace rsx bool sync_point_request = false; bool in_begin_end = false; + struct desync_fifo_cmd_info + { + u32 cmd; + u64 timestamp; + }; + + std::queue recovered_fifo_cmds_history; + atomic_t async_tasks_pending{ 0 }; bool zcull_stats_enabled = false;