Procházet zdrojové kódy

Merge pull request #3155 from bunnei/fix-asynch-gpu-wait

gpu_thread: Don't spin wait if there are no GPU commands.
bunnei před 6 roky
rodič
revize
33a6b45a6c
1 změnil soubory, kde provedl 15 přidání a 17 odebrání
  1. 15 17
      src/video_core/gpu_thread.cpp

+ 15 - 17
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);
     }
 }