From 9ec84fc592ca2dbe345123574ec4664186476aea Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Sat, 23 Nov 2019 15:17:28 -0500
Subject: gpu_thread: Don't spin wait if there are no GPU commands.

---
 src/video_core/gpu_thread.cpp | 32 +++++++++++++++-----------------
 1 file changed, 15 insertions(+), 17 deletions(-)

(limited to 'src/video_core/gpu_thread.cpp')

diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp
index 758a37f14c..3efa3d8d0c 100644
--- a/src/video_core/gpu_thread.cpp
+++ b/src/video_core/gpu_thread.cpp
@@ -31,24 +31,22 @@ static void RunThread(VideoCore::RendererBase& renderer, Tegra::DmaPusher& dma_p
 
     CommandDataContainer next;
     while (state.is_running) {
-        while (!state.queue.Empty()) {
-            state.queue.Pop(next);
-            if (const auto submit_list = std::get_if<SubmitListCommand>(&next.data)) {
-                dma_pusher.Push(std::move(submit_list->entries));
-                dma_pusher.DispatchCalls();
-            } else if (const auto data = std::get_if<SwapBuffersCommand>(&next.data)) {
-                renderer.SwapBuffers(data->framebuffer ? &*data->framebuffer : nullptr);
-            } else if (const auto data = std::get_if<FlushRegionCommand>(&next.data)) {
-                renderer.Rasterizer().FlushRegion(data->addr, data->size);
-            } else if (const auto data = std::get_if<InvalidateRegionCommand>(&next.data)) {
-                renderer.Rasterizer().InvalidateRegion(data->addr, data->size);
-            } else if (std::holds_alternative<EndProcessingCommand>(next.data)) {
-                return;
-            } else {
-                UNREACHABLE();
-            }
-            state.signaled_fence.store(next.fence);
+        next = state.queue.PopWait();
+        if (const auto submit_list = std::get_if<SubmitListCommand>(&next.data)) {
+            dma_pusher.Push(std::move(submit_list->entries));
+            dma_pusher.DispatchCalls();
+        } else if (const auto data = std::get_if<SwapBuffersCommand>(&next.data)) {
+            renderer.SwapBuffers(data->framebuffer ? &*data->framebuffer : nullptr);
+        } else if (const auto data = std::get_if<FlushRegionCommand>(&next.data)) {
+            renderer.Rasterizer().FlushRegion(data->addr, data->size);
+        } else if (const auto data = std::get_if<InvalidateRegionCommand>(&next.data)) {
+            renderer.Rasterizer().InvalidateRegion(data->addr, data->size);
+        } else if (std::holds_alternative<EndProcessingCommand>(next.data)) {
+            return;
+        } else {
+            UNREACHABLE();
         }
+        state.signaled_fence.store(next.fence);
     }
 }
 
-- 
cgit v1.2.3-70-g09d2