summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2020-04-22 17:14:40 +0200
committerFernando Sahmkow <fsahmkow27@gmail.com>2020-04-22 17:36:27 +0200
commit4e37f1b1130b083b42f21029155e5a2e4e9a9eb3 (patch)
tree751ecd6d575de14bb9b7bf5a9bc0e2e28c9fa1e3
parentAsync GPU: Correct flushing behavior to be similar to old async GPU behavior. (diff)
downloadyuzu-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.h15
-rw-r--r--src/video_core/fence_manager.h12
-rw-r--r--src/video_core/texture_cache/texture_cache.h15
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);