gpu_thread: Don't spin wait if there are no GPU commands.
This commit is contained in:
		| @@ -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); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei