diff options
| author | 2019-06-07 20:41:06 -0400 | |
|---|---|---|
| committer | 2019-07-05 15:49:14 -0400 | |
| commit | 8942047d419f6d2d0c56adad689fbf3bcd4d2961 (patch) | |
| tree | aa2dd5b6aeef25c9fd5543a2a4ef267a7152b052 /src/video_core | |
| parent | nv_services: Implement NvQueryEvent, NvCtrlEventWait, NvEventRegister, NvEven... (diff) | |
| download | yuzu-8942047d419f6d2d0c56adad689fbf3bcd4d2961.tar.gz yuzu-8942047d419f6d2d0c56adad689fbf3bcd4d2961.tar.xz yuzu-8942047d419f6d2d0c56adad689fbf3bcd4d2961.zip | |
Gpu: Implement Hardware Interrupt Manager and manage GPU interrupts
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/gpu.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/gpu.h | 5 | ||||
| -rw-r--r-- | src/video_core/gpu_asynch.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/gpu_asynch.h | 3 | ||||
| -rw-r--r-- | src/video_core/gpu_synch.h | 3 |
5 files changed, 21 insertions, 4 deletions
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 1d12f0493..06eb570ab 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp | |||
| @@ -29,7 +29,8 @@ u32 FramebufferConfig::BytesPerPixel(PixelFormat format) { | |||
| 29 | UNREACHABLE(); | 29 | UNREACHABLE(); |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | GPU::GPU(Core::System& system, VideoCore::RendererBase& renderer) : renderer{renderer} { | 32 | GPU::GPU(Core::System& system, VideoCore::RendererBase& renderer) |
| 33 | : system{system}, renderer{renderer} { | ||
| 33 | auto& rasterizer{renderer.Rasterizer()}; | 34 | auto& rasterizer{renderer.Rasterizer()}; |
| 34 | memory_manager = std::make_unique<Tegra::MemoryManager>(rasterizer); | 35 | memory_manager = std::make_unique<Tegra::MemoryManager>(rasterizer); |
| 35 | dma_pusher = std::make_unique<Tegra::DmaPusher>(*this); | 36 | dma_pusher = std::make_unique<Tegra::DmaPusher>(*this); |
| @@ -87,6 +88,10 @@ u32 GPU::GetSyncpointValue(const u32 syncpoint_id) const { | |||
| 87 | } | 88 | } |
| 88 | 89 | ||
| 89 | void GPU::RegisterEvent(const u32 event_id, const u32 syncpoint_id, const u32 value) { | 90 | void GPU::RegisterEvent(const u32 event_id, const u32 syncpoint_id, const u32 value) { |
| 91 | for (auto& ev : events[syncpoint_id]) { | ||
| 92 | if (ev.event_id == event_id && ev.value == value) | ||
| 93 | return; | ||
| 94 | } | ||
| 90 | events[syncpoint_id].emplace_back(event_id, value); | 95 | events[syncpoint_id].emplace_back(event_id, value); |
| 91 | } | 96 | } |
| 92 | 97 | ||
diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h index 4c97d6c6f..c3e5311fa 100644 --- a/src/video_core/gpu.h +++ b/src/video_core/gpu.h | |||
| @@ -238,9 +238,7 @@ public: | |||
| 238 | virtual void FlushAndInvalidateRegion(CacheAddr addr, u64 size) = 0; | 238 | virtual void FlushAndInvalidateRegion(CacheAddr addr, u64 size) = 0; |
| 239 | 239 | ||
| 240 | protected: | 240 | protected: |
| 241 | virtual void TriggerCpuInterrupt(const u32 event_id) const { | 241 | virtual void TriggerCpuInterrupt(const u32 event_id) const = 0; |
| 242 | // Todo implement this | ||
| 243 | } | ||
| 244 | 242 | ||
| 245 | private: | 243 | private: |
| 246 | void ProcessBindMethod(const MethodCall& method_call); | 244 | void ProcessBindMethod(const MethodCall& method_call); |
| @@ -260,6 +258,7 @@ private: | |||
| 260 | protected: | 258 | protected: |
| 261 | std::unique_ptr<Tegra::DmaPusher> dma_pusher; | 259 | std::unique_ptr<Tegra::DmaPusher> dma_pusher; |
| 262 | VideoCore::RendererBase& renderer; | 260 | VideoCore::RendererBase& renderer; |
| 261 | Core::System& system; | ||
| 263 | 262 | ||
| 264 | private: | 263 | private: |
| 265 | std::unique_ptr<Tegra::MemoryManager> memory_manager; | 264 | std::unique_ptr<Tegra::MemoryManager> memory_manager; |
diff --git a/src/video_core/gpu_asynch.cpp b/src/video_core/gpu_asynch.cpp index d4e2553a9..7060f9a89 100644 --- a/src/video_core/gpu_asynch.cpp +++ b/src/video_core/gpu_asynch.cpp | |||
| @@ -2,6 +2,8 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "core/core.h" | ||
| 6 | #include "core/hardware_interrupt_manager.h" | ||
| 5 | #include "video_core/gpu_asynch.h" | 7 | #include "video_core/gpu_asynch.h" |
| 6 | #include "video_core/gpu_thread.h" | 8 | #include "video_core/gpu_thread.h" |
| 7 | #include "video_core/renderer_base.h" | 9 | #include "video_core/renderer_base.h" |
| @@ -38,4 +40,9 @@ void GPUAsynch::FlushAndInvalidateRegion(CacheAddr addr, u64 size) { | |||
| 38 | gpu_thread.FlushAndInvalidateRegion(addr, size); | 40 | gpu_thread.FlushAndInvalidateRegion(addr, size); |
| 39 | } | 41 | } |
| 40 | 42 | ||
| 43 | void GPUAsynch::TriggerCpuInterrupt(const u32 event_id) const { | ||
| 44 | auto& interrupt_manager = system.InterruptManager(); | ||
| 45 | interrupt_manager.InterruptGPU(event_id); | ||
| 46 | } | ||
| 47 | |||
| 41 | } // namespace VideoCommon | 48 | } // namespace VideoCommon |
diff --git a/src/video_core/gpu_asynch.h b/src/video_core/gpu_asynch.h index 30be74cba..d49e9b96e 100644 --- a/src/video_core/gpu_asynch.h +++ b/src/video_core/gpu_asynch.h | |||
| @@ -27,6 +27,9 @@ public: | |||
| 27 | void InvalidateRegion(CacheAddr addr, u64 size) override; | 27 | void InvalidateRegion(CacheAddr addr, u64 size) override; |
| 28 | void FlushAndInvalidateRegion(CacheAddr addr, u64 size) override; | 28 | void FlushAndInvalidateRegion(CacheAddr addr, u64 size) override; |
| 29 | 29 | ||
| 30 | protected: | ||
| 31 | void TriggerCpuInterrupt(const u32 event_id) const override; | ||
| 32 | |||
| 30 | private: | 33 | private: |
| 31 | GPUThread::ThreadManager gpu_thread; | 34 | GPUThread::ThreadManager gpu_thread; |
| 32 | }; | 35 | }; |
diff --git a/src/video_core/gpu_synch.h b/src/video_core/gpu_synch.h index 3031fcf72..09bda854a 100644 --- a/src/video_core/gpu_synch.h +++ b/src/video_core/gpu_synch.h | |||
| @@ -25,6 +25,9 @@ public: | |||
| 25 | void FlushRegion(CacheAddr addr, u64 size) override; | 25 | void FlushRegion(CacheAddr addr, u64 size) override; |
| 26 | void InvalidateRegion(CacheAddr addr, u64 size) override; | 26 | void InvalidateRegion(CacheAddr addr, u64 size) override; |
| 27 | void FlushAndInvalidateRegion(CacheAddr addr, u64 size) override; | 27 | void FlushAndInvalidateRegion(CacheAddr addr, u64 size) override; |
| 28 | |||
| 29 | protected: | ||
| 30 | void TriggerCpuInterrupt(const u32 event_id) const override {} | ||
| 28 | }; | 31 | }; |
| 29 | 32 | ||
| 30 | } // namespace VideoCommon | 33 | } // namespace VideoCommon |