General: Tune the priority of main emulation threads so they have higher priority than less important helper threads.
This commit is contained in:
		| @@ -25,6 +25,52 @@ | ||||
|  | ||||
| namespace Common { | ||||
|  | ||||
| #ifdef _WIN32 | ||||
|  | ||||
| void SetCurrentThreadPriority(ThreadPriority new_priority) { | ||||
|     auto handle = GetCurrentThread(); | ||||
|     int windows_priority = 0; | ||||
|     switch (new_priority) { | ||||
|         case ThreadPriority::Low: | ||||
|             windows_priority = THREAD_PRIORITY_BELOW_NORMAL; | ||||
|             break; | ||||
|         case ThreadPriority::Normal: | ||||
|             windows_priority = THREAD_PRIORITY_NORMAL; | ||||
|             break; | ||||
|         case ThreadPriority::High: | ||||
|             windows_priority = THREAD_PRIORITY_ABOVE_NORMAL; | ||||
|             break; | ||||
|         case ThreadPriority::VeryHigh: | ||||
|             windows_priority = THREAD_PRIORITY_HIGHEST; | ||||
|             break; | ||||
|         default: | ||||
|             windows_priority = THREAD_PRIORITY_NORMAL; | ||||
|             break; | ||||
|     } | ||||
|     SetThreadPriority(handle, windows_priority); | ||||
| } | ||||
|  | ||||
| #else | ||||
|  | ||||
| void SetCurrentThreadPriority(ThreadPriority new_priority) { | ||||
|     pthread_t this_thread = pthread_self(); | ||||
|  | ||||
|     s32 max_prio = sched_get_priority_max(SCHED_OTHER); | ||||
|     s32 min_prio = sched_get_priority_min(SCHED_OTHER); | ||||
|     u32 level = static_cast<u32>(new_priority) + 1; | ||||
|  | ||||
|     struct sched_param params; | ||||
|     if (max_prio > min_prio) { | ||||
|         params.sched_priority = min_prio + ((max_prio - min_prio) * level) / 4; | ||||
|     } else { | ||||
|         params.sched_priority = min_prio - ((min_prio - max_prio) * level) / 4; | ||||
|     } | ||||
|  | ||||
|     pthread_setschedparam(this_thread, SCHED_OTHER, ¶ms); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #ifdef _MSC_VER | ||||
|  | ||||
| // Sets the debugger-visible name of the current thread. | ||||
|   | ||||
| @@ -86,6 +86,15 @@ private: | ||||
|     std::size_t generation = 0; // Incremented once each time the barrier is used | ||||
| }; | ||||
|  | ||||
| enum class ThreadPriority : u32 { | ||||
|     Low = 0, | ||||
|     Normal = 1, | ||||
|     High = 2, | ||||
|     VeryHigh = 3, | ||||
| }; | ||||
|  | ||||
| void SetCurrentThreadPriority(ThreadPriority new_priority); | ||||
|  | ||||
| void SetCurrentThreadName(const char* name); | ||||
|  | ||||
| } // namespace Common | ||||
|   | ||||
| @@ -48,6 +48,7 @@ void CoreTiming::ThreadEntry(CoreTiming& instance) { | ||||
|     std::string name = "yuzu:HostTiming"; | ||||
|     MicroProfileOnThreadCreate(name.c_str()); | ||||
|     Common::SetCurrentThreadName(name.c_str()); | ||||
|     Common::SetCurrentThreadPriority(Common::ThreadPriority::VeryHigh); | ||||
|     instance.on_thread_init(); | ||||
|     instance.ThreadLoop(); | ||||
| } | ||||
|   | ||||
| @@ -337,6 +337,7 @@ void CpuManager::RunThread(std::size_t core) { | ||||
|     } | ||||
|     MicroProfileOnThreadCreate(name.c_str()); | ||||
|     Common::SetCurrentThreadName(name.c_str()); | ||||
|     Common::SetCurrentThreadPriority(Common::ThreadPriority::High); | ||||
|     auto& data = core_data[core]; | ||||
|     data.enter_barrier = std::make_unique<Common::Event>(); | ||||
|     data.exit_barrier = std::make_unique<Common::Event>(); | ||||
|   | ||||
| @@ -22,6 +22,7 @@ static void RunThread(Core::System& system, VideoCore::RendererBase& renderer, | ||||
|     std::string name = "yuzu:GPU"; | ||||
|     MicroProfileOnThreadCreate(name.c_str()); | ||||
|     Common::SetCurrentThreadName(name.c_str()); | ||||
|     Common::SetCurrentThreadPriority(Common::ThreadPriority::High); | ||||
|     system.RegisterHostThread(); | ||||
|  | ||||
|     // Wait for first GPU command before acquiring the window context | ||||
|   | ||||
| @@ -9,6 +9,7 @@ | ||||
| #include <utility> | ||||
|  | ||||
| #include "common/microprofile.h" | ||||
| #include "common/thread.h" | ||||
| #include "video_core/renderer_vulkan/vk_device.h" | ||||
| #include "video_core/renderer_vulkan/vk_query_cache.h" | ||||
| #include "video_core/renderer_vulkan/vk_resource_manager.h" | ||||
| @@ -133,6 +134,7 @@ void VKScheduler::BindGraphicsPipeline(VkPipeline pipeline) { | ||||
| } | ||||
|  | ||||
| void VKScheduler::WorkerThread() { | ||||
|     Common::SetCurrentThreadPriority(Common::ThreadPriority::High); | ||||
|     std::unique_lock lock{mutex}; | ||||
|     do { | ||||
|         cv.wait(lock, [this] { return !chunk_queue.Empty() || quit; }); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user