aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkraibse <33869366+kraibse@users.noreply.github.com>2026-10-30 12:30:09 +0100
committerkraibse <33869366+kraibse@users.noreply.github.com>2026-10-30 12:36:47 +0100
commit6e7edd7462325ee18a0db6fdc29ff7698ac108cc (patch)
tree9ed8987acc9f34d95afb995d80c60ab7a17610d8 /src
parent9560dec549134cf50a7bcde3f86f87ed7658b25f (diff)
fix: Improve QMD cache management by removing completed entries to prevent stalling and memory leakage
Diffstat (limited to 'src')
-rw-r--r--src/video_core/native_qmd.h8
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) {