summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/engines/maxwell_3d.cpp1
-rw-r--r--src/video_core/gpu_thread.cpp5
-rw-r--r--src/video_core/rasterizer_interface.h6
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp25
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h2
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
83void ThreadManager::FlushRegion(VAddr addr, u64 size) { 83void 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
540void RasterizerVulkan::SyncGuestHost() { 541void RasterizerVulkan::SyncGuestHost() {
@@ -542,6 +543,30 @@ void RasterizerVulkan::SyncGuestHost() {
542 buffer_cache.SyncGuestHost(); 543 buffer_cache.SyncGuestHost();
543} 544}
544 545
546void 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
560void RasterizerVulkan::ReleaseFences() {
561 /*
562 auto& gpu{system.GPU()};
563 if (!gpu.IsAsync()) {
564 return;
565 }
566 fence_manager.WaitPendingFences();
567 */
568}
569
545void RasterizerVulkan::FlushAndInvalidateRegion(VAddr addr, u64 size) { 570void 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;