BufferCache: Refactor async managing.
This commit is contained in:
parent
b10db7e4a5
commit
96bb961a64
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue