diff options
author | bunnei <bunneidev@gmail.com> | 2019-02-09 17:37:11 +0100 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2019-03-07 03:48:57 +0100 |
commit | 84ad81ee6798ece6c66016c4581b5fe57ce7b20e (patch) | |
tree | a3b4940e25c43a743237e99afa75edc3d3633f67 | |
parent | gpu_thread: (HACK) Ignore flush on FlushAndInvalidateRegion. (diff) | |
download | yuzu-84ad81ee6798ece6c66016c4581b5fe57ce7b20e.tar yuzu-84ad81ee6798ece6c66016c4581b5fe57ce7b20e.tar.gz yuzu-84ad81ee6798ece6c66016c4581b5fe57ce7b20e.tar.bz2 yuzu-84ad81ee6798ece6c66016c4581b5fe57ce7b20e.tar.lz yuzu-84ad81ee6798ece6c66016c4581b5fe57ce7b20e.tar.xz yuzu-84ad81ee6798ece6c66016c4581b5fe57ce7b20e.tar.zst yuzu-84ad81ee6798ece6c66016c4581b5fe57ce7b20e.zip |
-rw-r--r-- | src/video_core/gpu_thread.cpp | 11 | ||||
-rw-r--r-- | src/video_core/gpu_thread.h | 7 |
2 files changed, 11 insertions, 7 deletions
diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index 4c25380eb..c5bdd2a17 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp @@ -40,7 +40,7 @@ static void RunThread(VideoCore::RendererBase& renderer, Tegra::DmaPusher& dma_p auto WaitForWakeup = [&]() { std::unique_lock<std::mutex> lock{state.signal_mutex}; - state.signal_condition.wait(lock, [&] { return !state.IsIdle() || !state.is_running; }); + state.signal_condition.wait(lock, [&] { return !state.is_idle || !state.is_running; }); }; // Wait for first GPU command before acquiring the window context @@ -70,8 +70,10 @@ static void RunThread(VideoCore::RendererBase& renderer, Tegra::DmaPusher& dma_p state.pop_queue->pop(); } + state.UpdateIdleState(); + // Signal that the GPU thread has finished processing commands - if (state.IsIdle()) { + if (state.is_idle) { state.idle_condition.notify_one(); } @@ -126,13 +128,14 @@ void ThreadManager::PushCommand(CommandData&& command_data, bool wait_for_idle, { std::lock_guard<std::mutex> lock{state.signal_mutex}; - if ((allow_on_cpu && state.IsIdle()) || IsGpuThread()) { + if ((allow_on_cpu && state.is_idle) || IsGpuThread()) { // Execute the command synchronously on the current thread ExecuteCommand(&command_data, renderer, dma_pusher); return; } // Push the command to the GPU thread + state.UpdateIdleState(); state.push_queue->emplace(command_data); } @@ -142,7 +145,7 @@ void ThreadManager::PushCommand(CommandData&& command_data, bool wait_for_idle, if (wait_for_idle) { // Wait for the GPU to be idle (all commands to be executed) std::unique_lock<std::mutex> lock{state.idle_mutex}; - state.idle_condition.wait(lock, [this] { return state.IsIdle(); }); + state.idle_condition.wait(lock, [this] { return static_cast<bool>(state.is_idle); }); } } diff --git a/src/video_core/gpu_thread.h b/src/video_core/gpu_thread.h index ad9f9462b..2ad8214cc 100644 --- a/src/video_core/gpu_thread.h +++ b/src/video_core/gpu_thread.h @@ -70,6 +70,7 @@ using CommandData = std::variant<SubmitListCommand, SwapBuffersCommand, FlushReg /// Struct used to synchronize the GPU thread struct SynchState final { std::atomic<bool> is_running{true}; + std::atomic<bool> is_idle{true}; std::condition_variable signal_condition; std::mutex signal_mutex; std::condition_variable idle_condition; @@ -84,9 +85,9 @@ struct SynchState final { CommandQueue* push_queue{&command_queues[0]}; CommandQueue* pop_queue{&command_queues[1]}; - /// Returns true if the GPU thread should be idle, meaning there are no commands to process - bool IsIdle() const { - return command_queues[0].empty() && command_queues[1].empty(); + void UpdateIdleState() { + std::lock_guard<std::mutex> lock{idle_mutex}; + is_idle = command_queues[0].empty() && command_queues[1].empty(); } }; |