|
|
|
@ -21,7 +21,7 @@ static void RunThread(VideoCore::RendererBase& renderer, Tegra::DmaPusher& dma_p |
|
|
|
MicroProfileOnThreadCreate("GpuThread"); |
|
|
|
|
|
|
|
// Wait for first GPU command before acquiring the window context
|
|
|
|
state.WaitForCommands(); |
|
|
|
while (state.queue.Empty()); |
|
|
|
|
|
|
|
// If emulation was stopped during disk shader loading, abort before trying to acquire context
|
|
|
|
if (!state.is_running) { |
|
|
|
@ -32,7 +32,6 @@ static void RunThread(VideoCore::RendererBase& renderer, Tegra::DmaPusher& dma_p |
|
|
|
|
|
|
|
CommandDataContainer next; |
|
|
|
while (state.is_running) { |
|
|
|
state.WaitForCommands(); |
|
|
|
while (!state.queue.Empty()) { |
|
|
|
state.queue.Pop(next); |
|
|
|
if (const auto submit_list = std::get_if<SubmitListCommand>(&next.data)) { |
|
|
|
@ -49,8 +48,7 @@ static void RunThread(VideoCore::RendererBase& renderer, Tegra::DmaPusher& dma_p |
|
|
|
} else { |
|
|
|
UNREACHABLE(); |
|
|
|
} |
|
|
|
state.signaled_fence = next.fence; |
|
|
|
state.TrySynchronize(); |
|
|
|
state.signaled_fence.store(next.fence); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -100,22 +98,12 @@ void ThreadManager::FlushAndInvalidateRegion(CacheAddr addr, u64 size) { |
|
|
|
u64 ThreadManager::PushCommand(CommandData&& command_data) { |
|
|
|
const u64 fence{++state.last_fence}; |
|
|
|
state.queue.Push(CommandDataContainer(std::move(command_data), fence)); |
|
|
|
state.SignalCommands(); |
|
|
|
return fence; |
|
|
|
} |
|
|
|
|
|
|
|
MICROPROFILE_DEFINE(GPU_wait, "GPU", "Wait for the GPU", MP_RGB(128, 128, 192)); |
|
|
|
void SynchState::WaitForSynchronization(u64 fence) { |
|
|
|
if (signaled_fence >= fence) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// Wait for the GPU to be idle (all commands to be executed)
|
|
|
|
{ |
|
|
|
MICROPROFILE_SCOPE(GPU_wait); |
|
|
|
std::unique_lock lock{synchronization_mutex}; |
|
|
|
synchronization_condition.wait(lock, [this, fence] { return signaled_fence >= fence; }); |
|
|
|
} |
|
|
|
while (signaled_fence.load() < fence); |
|
|
|
} |
|
|
|
|
|
|
|
} // namespace VideoCommon::GPUThread
|