summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h31
-rw-r--r--src/video_core/fence_manager.h6
2 files changed, 27 insertions, 10 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index d72df90ef..06fb931d7 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -82,7 +82,7 @@ public:
if (is_written) {
map->MarkAsModified(true, GetModifiedTicks());
if (Settings::IsGPULevelHigh() && Settings::values.use_asynchronous_gpu_emulation) {
- AsyncFlushMap(map);
+ MarkForAsyncFlush(map);
}
if (!map->IsWritten()) {
map->MarkAsWritten(true);
@@ -198,7 +198,23 @@ public:
}
void CommitAsyncFlushes() {
- commited_flushes.push_back(uncommited_flushes);
+ if (uncommited_flushes) {
+ auto commit_list = std::make_shared<std::list<MapInterval>>();
+ for (auto& map : *uncommited_flushes) {
+ if (map->IsRegistered() && map->IsModified()) {
+ // TODO(Blinkhawk): Implement backend asynchronous flushing
+ // AsyncFlushMap(map)
+ commit_list->push_back(map);
+ }
+ }
+ if (!commit_list->empty()) {
+ commited_flushes.push_back(commit_list);
+ } else {
+ commited_flushes.emplace_back();
+ }
+ } else {
+ commited_flushes.emplace_back();
+ }
uncommited_flushes.reset();
}
@@ -224,6 +240,7 @@ public:
}
for (MapInterval& map : *flush_list) {
if (map->IsRegistered()) {
+ // TODO(Blinkhawk): Replace this for reading the asynchronous flush
FlushMap(map);
}
}
@@ -354,7 +371,7 @@ private:
if (modified_inheritance) {
new_map->MarkAsModified(true, GetModifiedTicks());
if (Settings::IsGPULevelHigh() && Settings::values.use_asynchronous_gpu_emulation) {
- AsyncFlushMap(new_map);
+ MarkForAsyncFlush(new_map);
}
}
Register(new_map, write_inheritance);
@@ -542,11 +559,11 @@ private:
return false;
}
- void AsyncFlushMap(MapInterval& map) {
+ void MarkForAsyncFlush(MapInterval& map) {
if (!uncommited_flushes) {
- uncommited_flushes = std::make_shared<std::list<MapInterval>>();
+ uncommited_flushes = std::make_shared<std::unordered_set<MapInterval>>();
}
- uncommited_flushes->push_back(map);
+ uncommited_flushes->insert(map);
}
VideoCore::RasterizerInterface& rasterizer;
@@ -580,7 +597,7 @@ private:
std::vector<u8> staging_buffer;
std::list<MapInterval> marked_for_unregister;
- std::shared_ptr<std::list<MapInterval>> uncommited_flushes{};
+ std::shared_ptr<std::unordered_set<MapInterval>> uncommited_flushes{};
std::list<std::shared_ptr<std::list<MapInterval>>> commited_flushes;
std::recursive_mutex mutex;
diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h
index c4b190503..72ee50955 100644
--- a/src/video_core/fence_manager.h
+++ b/src/video_core/fence_manager.h
@@ -42,11 +42,11 @@ class FenceManager {
public:
void SignalFence(GPUVAddr addr, u32 value) {
TryReleasePendingFences();
- TFence new_fence = CreateFence(addr, value);
- QueueFence(new_fence);
- fences.push(new_fence);
texture_cache.CommitAsyncFlushes();
buffer_cache.CommitAsyncFlushes();
+ TFence new_fence = CreateFence(addr, value);
+ fences.push(new_fence);
+ QueueFence(new_fence);
rasterizer.FlushCommands();
rasterizer.SyncGuestHost();
}