From 74c8a44d847a8a1f99f46437da02daf455c17676 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 26 Jul 2020 08:47:50 +0100 Subject: [PATCH] rsx: Fix cache skipping shaders on load+compile (#8633) When on single worker mode (OpenGL or an hypothetical scenario of a single core PC with Vulkan), load and compile would skip 10% of the shaders on queue each stage. Co-authored-by: kd-11 --- rpcs3/Emu/RSX/rsx_cache.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rpcs3/Emu/RSX/rsx_cache.h b/rpcs3/Emu/RSX/rsx_cache.h index 6ebfdcf118..446315d60c 100644 --- a/rpcs3/Emu/RSX/rsx_cache.h +++ b/rpcs3/Emu/RSX/rsx_cache.h @@ -439,6 +439,7 @@ namespace rsx std::function shader_load_worker = [&](u32 stop_at) { u32 pos; + // Processed is incremented before work starts in order to avoid two workers working on the same shader while (((pos = processed++) < stop_at) && !Emu.IsStopped()) { fs::dir_entry tmp = entries[pos]; @@ -459,6 +460,8 @@ namespace rsx unpacked[unpacked.push_begin()] = entry; } + // Do not account for an extra shader that was never processed + processed--; }; await_workers(nb_workers, 0, shader_load_worker, processed, entry_count, dlg); @@ -472,11 +475,14 @@ namespace rsx std::function shader_comp_worker = [&](u32 stop_at) { u32 pos; + // Processed is incremented before work starts in order to avoid two workers working on the same shader while (((pos = processed++) < stop_at) && !Emu.IsStopped()) { auto& entry = unpacked[pos]; m_storage.add_pipeline_entry(std::get<1>(entry), std::get<2>(entry), std::get<0>(entry), std::forward(args)...); } + // Do not account for an extra shader that was never processed + processed--; }; await_workers(nb_workers, 1, shader_comp_worker, processed, entry_count, dlg); @@ -535,6 +541,8 @@ namespace rsx } } } + + verify(HERE), processed == entry_count; } public: