diff options
| author | kraibse <33869366+kraibse@users.noreply.github.com> | 2026-10-30 12:30:09 +0100 |
|---|---|---|
| committer | kraibse <33869366+kraibse@users.noreply.github.com> | 2026-10-30 12:36:47 +0100 |
| commit | 6e7edd7462325ee18a0db6fdc29ff7698ac108cc (patch) | |
| tree | 9ed8987acc9f34d95afb995d80c60ab7a17610d8 /src/video_core | |
| parent | 9560dec549134cf50a7bcde3f86f87ed7658b25f (diff) | |
fix: Improve QMD cache management by removing completed entries to prevent stalling and memory leakage
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/native_qmd.h | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/video_core/native_qmd.h b/src/video_core/native_qmd.h index 15c59cb7c6..924267e406 100644 --- a/src/video_core/native_qmd.h +++ b/src/video_core/native_qmd.h @@ -32,7 +32,13 @@ public: pending[0] = {address, argument & 15, ((argument >> 14) & 0x3ff) + 1}; for (std::size_t i = 0; i < count; ++i) { const auto request = pending[i]; - if (states.size() >= 4096 && !states.contains(request.address)) return "QMD cache limit"; + if (states.size() >= 4096 && !states.contains(request.address)) { + // Finished QMDs with nothing deferred are only history, drop them instead of stalling. + std::erase_if(states, [](const auto& entry) { + return entry.second.completed && entry.second.deferred == 0; + }); + if (states.size() >= 4096) return "QMD cache limit"; + } auto& state = states[request.address]; if (request.action == 3 || request.action == 2) { if (request.action == 3 || !state.loaded) { |
