diff options
| author | 2022-02-06 01:16:11 +0100 | |
|---|---|---|
| committer | 2022-10-06 21:00:52 +0200 | |
| commit | bc8b3d225eda388f0603830cbff8357893abb0f9 (patch) | |
| tree | 479b41b73913feceeeb0c9c6f3147d6491c0fa04 /src/video_core/renderer_vulkan | |
| parent | MemoryManager: initial multi paging system implementation. (diff) | |
| download | yuzu-bc8b3d225eda388f0603830cbff8357893abb0f9.tar.gz yuzu-bc8b3d225eda388f0603830cbff8357893abb0f9.tar.xz yuzu-bc8b3d225eda388f0603830cbff8357893abb0f9.zip | |
VideoCore: Refactor fencing system.
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_fence_manager.cpp | 15 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_fence_manager.h | 6 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 21 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 5 |
4 files changed, 16 insertions, 31 deletions
diff --git a/src/video_core/renderer_vulkan/vk_fence_manager.cpp b/src/video_core/renderer_vulkan/vk_fence_manager.cpp index 301cbbabe..0214b103a 100644 --- a/src/video_core/renderer_vulkan/vk_fence_manager.cpp +++ b/src/video_core/renderer_vulkan/vk_fence_manager.cpp | |||
| @@ -11,11 +11,8 @@ | |||
| 11 | 11 | ||
| 12 | namespace Vulkan { | 12 | namespace Vulkan { |
| 13 | 13 | ||
| 14 | InnerFence::InnerFence(Scheduler& scheduler_, u32 payload_, bool is_stubbed_) | 14 | InnerFence::InnerFence(Scheduler& scheduler_, bool is_stubbed_) |
| 15 | : FenceBase{payload_, is_stubbed_}, scheduler{scheduler_} {} | 15 | : FenceBase{is_stubbed_}, scheduler{scheduler_} {} |
| 16 | |||
| 17 | InnerFence::InnerFence(Scheduler& scheduler_, u8* address_, u32 payload_, bool is_stubbed_) | ||
| 18 | : FenceBase{address_, payload_, is_stubbed_}, scheduler{scheduler_} {} | ||
| 19 | 16 | ||
| 20 | InnerFence::~InnerFence() = default; | 17 | InnerFence::~InnerFence() = default; |
| 21 | 18 | ||
| @@ -48,12 +45,8 @@ FenceManager::FenceManager(VideoCore::RasterizerInterface& rasterizer_, Tegra::G | |||
| 48 | : GenericFenceManager{rasterizer_, gpu_, texture_cache_, buffer_cache_, query_cache_}, | 45 | : GenericFenceManager{rasterizer_, gpu_, texture_cache_, buffer_cache_, query_cache_}, |
| 49 | scheduler{scheduler_} {} | 46 | scheduler{scheduler_} {} |
| 50 | 47 | ||
| 51 | Fence FenceManager::CreateFence(u32 value, bool is_stubbed) { | 48 | Fence FenceManager::CreateFence(bool is_stubbed) { |
| 52 | return std::make_shared<InnerFence>(scheduler, value, is_stubbed); | 49 | return std::make_shared<InnerFence>(scheduler, is_stubbed); |
| 53 | } | ||
| 54 | |||
| 55 | Fence FenceManager::CreateFence(u8* addr, u32 value, bool is_stubbed) { | ||
| 56 | return std::make_shared<InnerFence>(scheduler, addr, value, is_stubbed); | ||
| 57 | } | 50 | } |
| 58 | 51 | ||
| 59 | void FenceManager::QueueFence(Fence& fence) { | 52 | void FenceManager::QueueFence(Fence& fence) { |
diff --git a/src/video_core/renderer_vulkan/vk_fence_manager.h b/src/video_core/renderer_vulkan/vk_fence_manager.h index ea9e88052..7fe2afcd9 100644 --- a/src/video_core/renderer_vulkan/vk_fence_manager.h +++ b/src/video_core/renderer_vulkan/vk_fence_manager.h | |||
| @@ -25,8 +25,7 @@ class Scheduler; | |||
| 25 | 25 | ||
| 26 | class InnerFence : public VideoCommon::FenceBase { | 26 | class InnerFence : public VideoCommon::FenceBase { |
| 27 | public: | 27 | public: |
| 28 | explicit InnerFence(Scheduler& scheduler_, u32 payload_, bool is_stubbed_); | 28 | explicit InnerFence(Scheduler& scheduler_, bool is_stubbed_); |
| 29 | explicit InnerFence(Scheduler& scheduler_, u8* address_, u32 payload_, bool is_stubbed_); | ||
| 30 | ~InnerFence(); | 29 | ~InnerFence(); |
| 31 | 30 | ||
| 32 | void Queue(); | 31 | void Queue(); |
| @@ -50,8 +49,7 @@ public: | |||
| 50 | QueryCache& query_cache, const Device& device, Scheduler& scheduler); | 49 | QueryCache& query_cache, const Device& device, Scheduler& scheduler); |
| 51 | 50 | ||
| 52 | protected: | 51 | protected: |
| 53 | Fence CreateFence(u32 value, bool is_stubbed) override; | 52 | Fence CreateFence(bool is_stubbed) override; |
| 54 | Fence CreateFence(u8* addr, u32 value, bool is_stubbed) override; | ||
| 55 | void QueueFence(Fence& fence) override; | 53 | void QueueFence(Fence& fence) override; |
| 56 | bool IsFenceSignaled(Fence& fence) const override; | 54 | bool IsFenceSignaled(Fence& fence) const override; |
| 57 | void WaitFence(Fence& fence) override; | 55 | void WaitFence(Fence& fence) override; |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index d7b57e0f3..a35e41199 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -428,7 +428,7 @@ void RasterizerVulkan::OnCPUWrite(VAddr addr, u64 size) { | |||
| 428 | } | 428 | } |
| 429 | } | 429 | } |
| 430 | 430 | ||
| 431 | void RasterizerVulkan::SyncGuestHost() { | 431 | void RasterizerVulkan::InvalidateGPUCache() { |
| 432 | pipeline_cache.SyncGuestHost(); | 432 | pipeline_cache.SyncGuestHost(); |
| 433 | { | 433 | { |
| 434 | std::scoped_lock lock{buffer_cache.mutex}; | 434 | std::scoped_lock lock{buffer_cache.mutex}; |
| @@ -455,13 +455,12 @@ void RasterizerVulkan::ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) { | |||
| 455 | } | 455 | } |
| 456 | } | 456 | } |
| 457 | 457 | ||
| 458 | void RasterizerVulkan::SignalSemaphore(GPUVAddr addr, u32 value) { | 458 | void RasterizerVulkan::SignalFence(std::function<void()>&& func) { |
| 459 | if (!gpu.IsAsync()) { | 459 | fence_manager.SignalFence(std::move(func)); |
| 460 | gpu_memory->Write<u32>(addr, value); | 460 | } |
| 461 | return; | 461 | |
| 462 | } | 462 | void RasterizerVulkan::SyncOperation(std::function<void()>&& func) { |
| 463 | auto paddr = gpu_memory->GetPointer(addr); | 463 | fence_manager.SyncOperation(std::move(func)); |
| 464 | fence_manager.SignalSemaphore(paddr, value); | ||
| 465 | } | 464 | } |
| 466 | 465 | ||
| 467 | void RasterizerVulkan::SignalSyncPoint(u32 value) { | 466 | void RasterizerVulkan::SignalSyncPoint(u32 value) { |
| @@ -469,16 +468,10 @@ void RasterizerVulkan::SignalSyncPoint(u32 value) { | |||
| 469 | } | 468 | } |
| 470 | 469 | ||
| 471 | void RasterizerVulkan::SignalReference() { | 470 | void RasterizerVulkan::SignalReference() { |
| 472 | if (!gpu.IsAsync()) { | ||
| 473 | return; | ||
| 474 | } | ||
| 475 | fence_manager.SignalOrdering(); | 471 | fence_manager.SignalOrdering(); |
| 476 | } | 472 | } |
| 477 | 473 | ||
| 478 | void RasterizerVulkan::ReleaseFences() { | 474 | void RasterizerVulkan::ReleaseFences() { |
| 479 | if (!gpu.IsAsync()) { | ||
| 480 | return; | ||
| 481 | } | ||
| 482 | fence_manager.WaitPendingFences(); | 475 | fence_manager.WaitPendingFences(); |
| 483 | } | 476 | } |
| 484 | 477 | ||
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index c836158b8..fb9e83e8f 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -76,10 +76,11 @@ public: | |||
| 76 | bool MustFlushRegion(VAddr addr, u64 size) override; | 76 | bool MustFlushRegion(VAddr addr, u64 size) override; |
| 77 | void InvalidateRegion(VAddr addr, u64 size) override; | 77 | void InvalidateRegion(VAddr addr, u64 size) override; |
| 78 | void OnCPUWrite(VAddr addr, u64 size) override; | 78 | void OnCPUWrite(VAddr addr, u64 size) override; |
| 79 | void SyncGuestHost() override; | 79 | void InvalidateGPUCache() override; |
| 80 | void UnmapMemory(VAddr addr, u64 size) override; | 80 | void UnmapMemory(VAddr addr, u64 size) override; |
| 81 | void ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) override; | 81 | void ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) override; |
| 82 | void SignalSemaphore(GPUVAddr addr, u32 value) override; | 82 | void SignalFence(std::function<void()>&& func) override; |
| 83 | void SyncOperation(std::function<void()>&& func) override; | ||
| 83 | void SignalSyncPoint(u32 value) override; | 84 | void SignalSyncPoint(u32 value) override; |
| 84 | void SignalReference() override; | 85 | void SignalReference() override; |
| 85 | void ReleaseFences() override; | 86 | void ReleaseFences() override; |