diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-04-22 17:14:40 +0200 |
---|---|---|
committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-04-22 17:36:27 +0200 |
commit | 4e37f1b1130b083b42f21029155e5a2e4e9a9eb3 (patch) | |
tree | 751ecd6d575de14bb9b7bf5a9bc0e2e28c9fa1e3 | |
parent | Async GPU: Correct flushing behavior to be similar to old async GPU behavior. (diff) | |
download | yuzu-4e37f1b1130b083b42f21029155e5a2e4e9a9eb3.tar yuzu-4e37f1b1130b083b42f21029155e5a2e4e9a9eb3.tar.gz yuzu-4e37f1b1130b083b42f21029155e5a2e4e9a9eb3.tar.bz2 yuzu-4e37f1b1130b083b42f21029155e5a2e4e9a9eb3.tar.lz yuzu-4e37f1b1130b083b42f21029155e5a2e4e9a9eb3.tar.xz yuzu-4e37f1b1130b083b42f21029155e5a2e4e9a9eb3.tar.zst yuzu-4e37f1b1130b083b42f21029155e5a2e4e9a9eb3.zip |
-rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 15 | ||||
-rw-r--r-- | src/video_core/fence_manager.h | 12 | ||||
-rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 15 |
3 files changed, 18 insertions, 24 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index f3aa35295..510f11089 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -153,8 +153,8 @@ public: bool MustFlushRegion(VAddr addr, std::size_t size) { std::lock_guard lock{mutex}; - std::vector<MapInterval> objects = GetMapsInRange(addr, size); - return std::any_of(objects.begin(), objects.end(), [](const MapInterval& map) { + const std::vector<MapInterval> objects = GetMapsInRange(addr, size); + return std::any_of(objects.cbegin(), objects.cend(), [](const MapInterval& map) { return map->IsModified() && map->IsRegistered(); }); } @@ -176,7 +176,7 @@ public: for (const auto& object : GetMapsInRange(addr, size)) { if (object->IsMemoryMarked() && object->IsRegistered()) { - Unmark(object); + UnmarkMemory(object); object->SetSyncPending(true); marked_for_unregister.emplace_back(object); } @@ -217,10 +217,7 @@ public: } bool ShouldWaitAsyncFlushes() const { - if (committed_flushes.empty()) { - return false; - } - return committed_flushes.front() != nullptr; + return !committed_flushes.empty() && committed_flushes.front() != nullptr; } bool HasUncommittedFlushes() const { @@ -294,7 +291,7 @@ protected: } } - void Unmark(const MapInterval& map) { + void UnmarkMemory(const MapInterval& map) { if (!map->IsMemoryMarked()) { return; } @@ -305,7 +302,7 @@ protected: /// Unregisters an object from the cache void Unregister(const MapInterval& map) { - Unmark(map); + UnmarkMemory(map); map->MarkAsRegistered(false); if (map->IsSyncPending()) { marked_for_unregister.remove(map); diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index 9fe9c1bf2..dabd1588c 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h @@ -54,7 +54,7 @@ class FenceManager { public: void SignalSemaphore(GPUVAddr addr, u32 value) { TryReleasePendingFences(); - bool should_flush = ShouldFlush(); + const bool should_flush = ShouldFlush(); CommitAsyncFlushes(); TFence new_fence = CreateFence(addr, value, !should_flush); fences.push(new_fence); @@ -67,7 +67,7 @@ public: void SignalSyncPoint(u32 value) { TryReleasePendingFences(); - bool should_flush = ShouldFlush(); + const bool should_flush = ShouldFlush(); CommitAsyncFlushes(); TFence new_fence = CreateFence(value, !should_flush); fences.push(new_fence); @@ -79,15 +79,15 @@ public: } void WaitPendingFences() { + auto& gpu{system.GPU()}; + auto& memory_manager{gpu.MemoryManager()}; while (!fences.empty()) { TFence& current_fence = fences.front(); if (ShouldWait()) { WaitFence(current_fence); } PopAsyncFlushes(); - auto& gpu{system.GPU()}; if (current_fence->IsSemaphore()) { - auto& memory_manager{gpu.MemoryManager()}; memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); } else { gpu.IncrementSyncPoint(current_fence->GetPayload()); @@ -125,15 +125,15 @@ protected: private: void TryReleasePendingFences() { + auto& gpu{system.GPU()}; + auto& memory_manager{gpu.MemoryManager()}; while (!fences.empty()) { TFence& current_fence = fences.front(); if (ShouldWait() && !IsFenceSignaled(current_fence)) { return; } PopAsyncFlushes(); - auto& gpu{system.GPU()}; if (current_fence->IsSemaphore()) { - auto& memory_manager{gpu.MemoryManager()}; memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); } else { gpu.IncrementSyncPoint(current_fence->GetPayload()); diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 1148c3a34..cf6bd005a 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -68,7 +68,7 @@ public: for (const auto& surface : GetSurfacesInRegion(addr, size)) { if (surface->IsMemoryMarked()) { - Unmark(surface); + UnmarkMemory(surface); surface->SetSyncPending(true); marked_for_unregister.emplace_back(surface); } @@ -119,8 +119,8 @@ public: bool MustFlushRegion(VAddr addr, std::size_t size) { std::lock_guard lock{mutex}; - auto surfaces = GetSurfacesInRegion(addr, size); - return std::any_of(surfaces.begin(), surfaces.end(), + const auto surfaces = GetSurfacesInRegion(addr, size); + return std::any_of(surfaces.cbegin(), surfaces.cend(), [](const TSurface& surface) { return surface->IsModified(); }); } @@ -335,10 +335,7 @@ public: } bool ShouldWaitAsyncFlushes() const { - if (committed_flushes.empty()) { - return false; - } - return committed_flushes.front() != nullptr; + return !committed_flushes.empty() && committed_flushes.front() != nullptr; } void PopAsyncFlushes() { @@ -421,7 +418,7 @@ protected: rasterizer.UpdatePagesCachedCount(*cpu_addr, size, 1); } - void Unmark(TSurface surface) { + void UnmarkMemory(TSurface surface) { if (!surface->IsMemoryMarked()) { return; } @@ -438,7 +435,7 @@ protected: if (!guard_render_targets && surface->IsRenderTarget()) { ManageRenderTargetUnregister(surface); } - Unmark(surface); + UnmarkMemory(surface); if (surface->IsSyncPending()) { marked_for_unregister.remove(surface); surface->SetSyncPending(false); |