diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 1 | ||||
| -rw-r--r-- | src/video_core/gpu_thread.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/rasterizer_interface.h | 6 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 25 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 2 |
5 files changed, 35 insertions, 4 deletions
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index cff90bc1d..a7e951433 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp | |||
| @@ -410,7 +410,6 @@ void Maxwell3D::ProcessQueryGet() { | |||
| 410 | StampQueryResult(regs.query.query_sequence, regs.query.query_get.short_query == 0); | 410 | StampQueryResult(regs.query.query_sequence, regs.query.query_get.short_query == 0); |
| 411 | } | 411 | } |
| 412 | break; | 412 | break; |
| 413 | } | ||
| 414 | case Regs::QueryOperation::Acquire: | 413 | case Regs::QueryOperation::Acquire: |
| 415 | // TODO(Blinkhawk): Under this operation, the GPU waits for the CPU to write a value that | 414 | // TODO(Blinkhawk): Under this operation, the GPU waits for the CPU to write a value that |
| 416 | // matches the current payload. | 415 | // matches the current payload. |
diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index 672f8d2fa..1c3ab2145 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp | |||
| @@ -81,9 +81,12 @@ void ThreadManager::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) { | |||
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | void ThreadManager::FlushRegion(VAddr addr, u64 size) { | 83 | void ThreadManager::FlushRegion(VAddr addr, u64 size) { |
| 84 | if (!Settings::IsGPULevelExtreme()) { | ||
| 85 | return; | ||
| 86 | } | ||
| 84 | if (system.Renderer().Rasterizer().MustFlushRegion(addr, size)) { | 87 | if (system.Renderer().Rasterizer().MustFlushRegion(addr, size)) { |
| 85 | u64 fence = PushCommand(FlushRegionCommand(addr, size)); | 88 | u64 fence = PushCommand(FlushRegionCommand(addr, size)); |
| 86 | while (fence < state.signaled_fence.load(std::memory_order_relaxed)) { | 89 | while (fence > state.signaled_fence.load(std::memory_order_relaxed)) { |
| 87 | } | 90 | } |
| 88 | } | 91 | } |
| 89 | } | 92 | } |
diff --git a/src/video_core/rasterizer_interface.h b/src/video_core/rasterizer_interface.h index 228752131..b49f15df2 100644 --- a/src/video_core/rasterizer_interface.h +++ b/src/video_core/rasterizer_interface.h | |||
| @@ -49,9 +49,11 @@ public: | |||
| 49 | /// Records a GPU query and caches it | 49 | /// Records a GPU query and caches it |
| 50 | virtual void Query(GPUVAddr gpu_addr, QueryType type, std::optional<u64> timestamp) = 0; | 50 | virtual void Query(GPUVAddr gpu_addr, QueryType type, std::optional<u64> timestamp) = 0; |
| 51 | 51 | ||
| 52 | virtual void SignalFence(GPUVAddr addr, u32 value) {} | 52 | /// Signal a GPU based fence |
| 53 | virtual void SignalFence(GPUVAddr addr, u32 value) = 0; | ||
| 53 | 54 | ||
| 54 | virtual void ReleaseFences() {} | 55 | /// Release all pending fences. |
| 56 | virtual void ReleaseFences() = 0; | ||
| 55 | 57 | ||
| 56 | /// Notify rasterizer that all caches should be flushed to Switch memory | 58 | /// Notify rasterizer that all caches should be flushed to Switch memory |
| 57 | virtual void FlushAll() = 0; | 59 | virtual void FlushAll() = 0; |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 9437a4aa1..1d75a4766 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -535,6 +535,7 @@ void RasterizerVulkan::OnCPUWrite(VAddr addr, u64 size) { | |||
| 535 | texture_cache.OnCPUWrite(addr, size); | 535 | texture_cache.OnCPUWrite(addr, size); |
| 536 | pipeline_cache.InvalidateRegion(addr, size); | 536 | pipeline_cache.InvalidateRegion(addr, size); |
| 537 | buffer_cache.OnCPUWrite(addr, size); | 537 | buffer_cache.OnCPUWrite(addr, size); |
| 538 | query_cache.InvalidateRegion(addr, size); | ||
| 538 | } | 539 | } |
| 539 | 540 | ||
| 540 | void RasterizerVulkan::SyncGuestHost() { | 541 | void RasterizerVulkan::SyncGuestHost() { |
| @@ -542,6 +543,30 @@ void RasterizerVulkan::SyncGuestHost() { | |||
| 542 | buffer_cache.SyncGuestHost(); | 543 | buffer_cache.SyncGuestHost(); |
| 543 | } | 544 | } |
| 544 | 545 | ||
| 546 | void RasterizerVulkan::SignalFence(GPUVAddr addr, u32 value) { | ||
| 547 | auto& gpu{system.GPU()}; | ||
| 548 | auto& memory_manager{gpu.MemoryManager()}; | ||
| 549 | memory_manager.Write<u32>(addr, value); | ||
| 550 | /* | ||
| 551 | if (!gpu.IsAsync()) { | ||
| 552 | auto& memory_manager{gpu.MemoryManager()}; | ||
| 553 | memory_manager.Write<u32>(addr, value); | ||
| 554 | return; | ||
| 555 | } | ||
| 556 | fence_manager.SignalFence(addr, value); | ||
| 557 | */ | ||
| 558 | } | ||
| 559 | |||
| 560 | void RasterizerVulkan::ReleaseFences() { | ||
| 561 | /* | ||
| 562 | auto& gpu{system.GPU()}; | ||
| 563 | if (!gpu.IsAsync()) { | ||
| 564 | return; | ||
| 565 | } | ||
| 566 | fence_manager.WaitPendingFences(); | ||
| 567 | */ | ||
| 568 | } | ||
| 569 | |||
| 545 | void RasterizerVulkan::FlushAndInvalidateRegion(VAddr addr, u64 size) { | 570 | void RasterizerVulkan::FlushAndInvalidateRegion(VAddr addr, u64 size) { |
| 546 | FlushRegion(addr, size); | 571 | FlushRegion(addr, size); |
| 547 | InvalidateRegion(addr, size); | 572 | InvalidateRegion(addr, size); |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 7002a4fa3..08a9af401 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -122,6 +122,8 @@ public: | |||
| 122 | void InvalidateRegion(VAddr addr, u64 size) override; | 122 | void InvalidateRegion(VAddr addr, u64 size) override; |
| 123 | void OnCPUWrite(VAddr addr, u64 size) override; | 123 | void OnCPUWrite(VAddr addr, u64 size) override; |
| 124 | void SyncGuestHost() override; | 124 | void SyncGuestHost() override; |
| 125 | void SignalFence(GPUVAddr addr, u32 value) override; | ||
| 126 | void ReleaseFences() override; | ||
| 125 | void FlushAndInvalidateRegion(VAddr addr, u64 size) override; | 127 | void FlushAndInvalidateRegion(VAddr addr, u64 size) override; |
| 126 | void FlushCommands() override; | 128 | void FlushCommands() override; |
| 127 | void TickFrame() override; | 129 | void TickFrame() override; |