diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2019-09-27 01:08:22 +0200 |
---|---|---|
committer | FernandoS27 <fsahmkow27@gmail.com> | 2019-10-05 01:59:53 +0200 |
commit | 3f104464dec13f9ba90eaca5dafca87ee4116a60 (patch) | |
tree | 29d73dec1ba2a661a9930c63689973a65482ce3b /src | |
parent | Nvdrv: Correct Event setup in Nvdrv (diff) | |
download | yuzu-3f104464dec13f9ba90eaca5dafca87ee4116a60.tar yuzu-3f104464dec13f9ba90eaca5dafca87ee4116a60.tar.gz yuzu-3f104464dec13f9ba90eaca5dafca87ee4116a60.tar.bz2 yuzu-3f104464dec13f9ba90eaca5dafca87ee4116a60.tar.lz yuzu-3f104464dec13f9ba90eaca5dafca87ee4116a60.tar.xz yuzu-3f104464dec13f9ba90eaca5dafca87ee4116a60.tar.zst yuzu-3f104464dec13f9ba90eaca5dafca87ee4116a60.zip |
Diffstat (limited to 'src')
-rw-r--r-- | src/core/core.cpp | 2 | ||||
-rw-r--r-- | src/video_core/gpu.h | 3 | ||||
-rw-r--r-- | src/video_core/gpu_asynch.cpp | 4 | ||||
-rw-r--r-- | src/video_core/gpu_asynch.h | 1 | ||||
-rw-r--r-- | src/video_core/gpu_synch.h | 1 | ||||
-rw-r--r-- | src/video_core/gpu_thread.cpp | 5 | ||||
-rw-r--r-- | src/video_core/gpu_thread.h | 3 |
7 files changed, 19 insertions, 0 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index 75a7ffb97..8f68bdbad 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -252,6 +252,8 @@ struct System::Impl { is_powered_on = false; exit_lock = false; + gpu_core->WaitIdle(); + // Shutdown emulation session renderer.reset(); GDBStub::Shutdown(); diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h index e20b0687a..dbca19f35 100644 --- a/src/video_core/gpu.h +++ b/src/video_core/gpu.h @@ -177,6 +177,9 @@ public: /// Returns a reference to the GPU DMA pusher. Tegra::DmaPusher& DmaPusher(); + // Waits for the GPU to finish working + virtual void WaitIdle() const = 0; + /// Allows the CPU/NvFlinger to wait on the GPU before presenting a frame. void WaitFence(u32 syncpoint_id, u32 value) const; diff --git a/src/video_core/gpu_asynch.cpp b/src/video_core/gpu_asynch.cpp index f2a3a390e..04222d060 100644 --- a/src/video_core/gpu_asynch.cpp +++ b/src/video_core/gpu_asynch.cpp @@ -44,4 +44,8 @@ void GPUAsynch::TriggerCpuInterrupt(const u32 syncpoint_id, const u32 value) con interrupt_manager.GPUInterruptSyncpt(syncpoint_id, value); } +void GPUAsynch::WaitIdle() const { + gpu_thread.WaitIdle(); +} + } // namespace VideoCommon diff --git a/src/video_core/gpu_asynch.h b/src/video_core/gpu_asynch.h index a12f9bac4..1241ade1d 100644 --- a/src/video_core/gpu_asynch.h +++ b/src/video_core/gpu_asynch.h @@ -25,6 +25,7 @@ public: void FlushRegion(CacheAddr addr, u64 size) override; void InvalidateRegion(CacheAddr addr, u64 size) override; void FlushAndInvalidateRegion(CacheAddr addr, u64 size) override; + void WaitIdle() const override; protected: void TriggerCpuInterrupt(u32 syncpoint_id, u32 value) const override; diff --git a/src/video_core/gpu_synch.h b/src/video_core/gpu_synch.h index 5eb1c461c..c71baee89 100644 --- a/src/video_core/gpu_synch.h +++ b/src/video_core/gpu_synch.h @@ -24,6 +24,7 @@ public: void FlushRegion(CacheAddr addr, u64 size) override; void InvalidateRegion(CacheAddr addr, u64 size) override; void FlushAndInvalidateRegion(CacheAddr addr, u64 size) override; + void WaitIdle() const override {} protected: void TriggerCpuInterrupt([[maybe_unused]] u32 syncpoint_id, diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index d7048b6ae..4a42634d2 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp @@ -90,6 +90,11 @@ void ThreadManager::FlushAndInvalidateRegion(CacheAddr addr, u64 size) { InvalidateRegion(addr, size); } +void ThreadManager::WaitIdle() const { + while (state.last_fence > state.signaled_fence.load()) { + } +} + u64 ThreadManager::PushCommand(CommandData&& command_data) { const u64 fence{++state.last_fence}; state.queue.Push(CommandDataContainer(std::move(command_data), fence)); diff --git a/src/video_core/gpu_thread.h b/src/video_core/gpu_thread.h index 108f456bd..08dc96bb3 100644 --- a/src/video_core/gpu_thread.h +++ b/src/video_core/gpu_thread.h @@ -116,6 +116,9 @@ public: /// Notify rasterizer that any caches of the specified region should be flushed and invalidated void FlushAndInvalidateRegion(CacheAddr addr, u64 size); + // Wait until the gpu thread is idle. + void WaitIdle() const; + private: /// Pushes a command to be executed by the GPU thread u64 PushCommand(CommandData&& command_data); |