Merge pull request #3155 from bunnei/fix-asynch-gpu-wait
gpu_thread: Don't spin wait if there are no GPU commands.
This commit is contained in:
		
						commit
						33a6b45a6c
					
				@ -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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user