From f543fb0243f90591009c7857c5ea19f6d4033a59 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 29 May 2018 15:11:34 +0300 Subject: [PATCH] vk/gl: Fix flush synchronization to be kinder to weaker CPUs but not harm higher end CPUs --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 11 +---------- rpcs3/Emu/RSX/GL/GLGSRender.h | 14 +++++++++++--- rpcs3/Emu/RSX/VK/VKGSRender.h | 2 +- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 87073d6bab..b63fda60e2 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1557,12 +1557,8 @@ bool GLGSRender::on_access_violation(u32 address, bool is_writing) work_item &task = post_flush_request(address, result); vm::temporary_unlock(); - { - std::unique_lock lock(task.guard_mutex); - task.cv.wait(lock, [&task] { return task.processed; }); - } + task.producer_wait(); - task.received = true; return true; } @@ -1594,13 +1590,8 @@ void GLGSRender::do_local_task(rsx::FIFO_state state) { if (q.processed) continue; - std::unique_lock lock(q.guard_mutex); q.result = m_gl_texture_cache.flush_all(q.section_data); q.processed = true; - - //Notify thread waiting on this - lock.unlock(); - q.cv.notify_one(); } } else if (!in_begin_end && state != rsx::FIFO_state::lock_wait) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index ebef600d4c..b7ed3d235c 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -35,15 +35,23 @@ namespace gl struct work_item { - std::condition_variable cv; - std::mutex guard_mutex; - u32 address_to_flush = 0; gl::texture_cache::thrashed_set section_data; volatile bool processed = false; volatile bool result = false; volatile bool received = false; + + void producer_wait() + { + while (!processed) + { + _mm_lfence(); + std::this_thread::yield(); + } + + received = true; + } }; struct driver_state diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index c690ade806..6564281126 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -241,7 +241,7 @@ struct flush_request_task while (pending_state.load()) { _mm_lfence(); - _mm_pause(); + std::this_thread::yield(); } } };