diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index d42512b2a2..55d6211c49 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -942,6 +942,8 @@ void GLGSRender::do_local_task() { std::lock_guard lock(queue_guard); + work_queue.remove_if([](work_item &q) { return q.received; }); + for (work_item& q: work_queue) { std::unique_lock lock(q.guard_mutex); @@ -954,8 +956,6 @@ void GLGSRender::do_local_task() lock.unlock(); q.cv.notify_one(); } - - work_queue.clear(); } work_item& GLGSRender::post_flush_request(u32 address) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index c47eb815d1..4b05862475 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -17,9 +17,10 @@ struct work_item std::condition_variable cv; std::mutex guard_mutex; - u32 address_to_flush; - bool processed; - bool result; + u32 address_to_flush = 0; + bool processed = false; + bool result = false; + bool received = false; }; struct gcm_buffer_info diff --git a/rpcs3/Emu/RSX/GL/GLHelpers.h b/rpcs3/Emu/RSX/GL/GLHelpers.h index 2baac4a05c..06749ec877 100644 --- a/rpcs3/Emu/RSX/GL/GLHelpers.h +++ b/rpcs3/Emu/RSX/GL/GLHelpers.h @@ -80,6 +80,7 @@ namespace gl void create() { m_value = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + flags = GL_SYNC_FLUSH_COMMANDS_BIT; } void destroy() @@ -132,7 +133,7 @@ namespace gl { if (flags) { - err = glClientWaitSync(m_value, flags, 1000); + err = glClientWaitSync(m_value, flags, 0); flags = 0; switch (err) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp index 39ec892e08..f91088864f 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp @@ -54,7 +54,7 @@ namespace gl task.cv.wait(lock, [&task] { return task.processed; }); } - verify(HERE), task.result == true; + task.received = true; return task.result; }