BufferCache: Refactor async managing.

This commit is contained in:
Fernando Sahmkow 2020-02-19 10:49:07 -04:00
parent b10db7e4a5
commit 96bb961a64
2 changed files with 27 additions and 10 deletions

View File

@ -82,7 +82,7 @@ public:
if (is_written) { if (is_written) {
map->MarkAsModified(true, GetModifiedTicks()); map->MarkAsModified(true, GetModifiedTicks());
if (Settings::IsGPULevelHigh() && Settings::values.use_asynchronous_gpu_emulation) { if (Settings::IsGPULevelHigh() && Settings::values.use_asynchronous_gpu_emulation) {
AsyncFlushMap(map); MarkForAsyncFlush(map);
} }
if (!map->IsWritten()) { if (!map->IsWritten()) {
map->MarkAsWritten(true); map->MarkAsWritten(true);
@ -198,7 +198,23 @@ public:
} }
void CommitAsyncFlushes() { 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(); uncommited_flushes.reset();
} }
@ -224,6 +240,7 @@ public:
} }
for (MapInterval& map : *flush_list) { for (MapInterval& map : *flush_list) {
if (map->IsRegistered()) { if (map->IsRegistered()) {
// TODO(Blinkhawk): Replace this for reading the asynchronous flush
FlushMap(map); FlushMap(map);
} }
} }
@ -354,7 +371,7 @@ private:
if (modified_inheritance) { if (modified_inheritance) {
new_map->MarkAsModified(true, GetModifiedTicks()); new_map->MarkAsModified(true, GetModifiedTicks());
if (Settings::IsGPULevelHigh() && Settings::values.use_asynchronous_gpu_emulation) { if (Settings::IsGPULevelHigh() && Settings::values.use_asynchronous_gpu_emulation) {
AsyncFlushMap(new_map); MarkForAsyncFlush(new_map);
} }
} }
Register(new_map, write_inheritance); Register(new_map, write_inheritance);
@ -542,11 +559,11 @@ private:
return false; return false;
} }
void AsyncFlushMap(MapInterval& map) { void MarkForAsyncFlush(MapInterval& map) {
if (!uncommited_flushes) { 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; VideoCore::RasterizerInterface& rasterizer;
@ -580,7 +597,7 @@ private:
std::vector<u8> staging_buffer; std::vector<u8> staging_buffer;
std::list<MapInterval> marked_for_unregister; 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::list<std::shared_ptr<std::list<MapInterval>>> commited_flushes;
std::recursive_mutex mutex; std::recursive_mutex mutex;

View File

@ -42,11 +42,11 @@ class FenceManager {
public: public:
void SignalFence(GPUVAddr addr, u32 value) { void SignalFence(GPUVAddr addr, u32 value) {
TryReleasePendingFences(); TryReleasePendingFences();
TFence new_fence = CreateFence(addr, value);
QueueFence(new_fence);
fences.push(new_fence);
texture_cache.CommitAsyncFlushes(); texture_cache.CommitAsyncFlushes();
buffer_cache.CommitAsyncFlushes(); buffer_cache.CommitAsyncFlushes();
TFence new_fence = CreateFence(addr, value);
fences.push(new_fence);
QueueFence(new_fence);
rasterizer.FlushCommands(); rasterizer.FlushCommands();
rasterizer.SyncGuestHost(); rasterizer.SyncGuestHost();
} }