summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorOatmealDome <OatmealDome@users.noreply.github.com>2023-04-18 22:15:50 +0200
committerGitHub <noreply@github.com>2023-04-18 22:15:50 +0200
commit8aae296d4e4bafdac297af1518459c0e14edeb57 (patch)
tree706c77d4bab1a8f29746b941f35bc58ff24e2360 /Source
parent2e7f0d002e1a57b9a2477e6f907e85538efb07b2 (diff)
parent09c80513cd82c05948620a5ade1668ca419ce0fc (diff)
Merge pull request #11759 from TellowKrinkle/MTLPerfQueryFixes
VideoBackends:Metal: Fix perf queries
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/VideoBackends/Metal/MTLStateTracker.h1
-rw-r--r--Source/Core/VideoBackends/Metal/MTLStateTracker.mm22
2 files changed, 19 insertions, 4 deletions
diff --git a/Source/Core/VideoBackends/Metal/MTLStateTracker.h b/Source/Core/VideoBackends/Metal/MTLStateTracker.h
index 2357322e4c..54e16cac7e 100644
--- a/Source/Core/VideoBackends/Metal/MTLStateTracker.h
+++ b/Source/Core/VideoBackends/Metal/MTLStateTracker.h
@@ -270,6 +270,7 @@ private:
u32 texel_buffer_offset0;
u32 texel_buffer_offset1;
PerfQueryGroup perf_query_group = static_cast<PerfQueryGroup>(-1);
+ u32 perf_query_id;
} m_state;
u32 m_perf_query_tracker_counter = 0;
diff --git a/Source/Core/VideoBackends/Metal/MTLStateTracker.mm b/Source/Core/VideoBackends/Metal/MTLStateTracker.mm
index 2769910d88..f699657ade 100644
--- a/Source/Core/VideoBackends/Metal/MTLStateTracker.mm
+++ b/Source/Core/VideoBackends/Metal/MTLStateTracker.mm
@@ -674,6 +674,7 @@ std::shared_ptr<Metal::StateTracker::PerfQueryTracker> Metal::StateTracker::NewP
m_perf_query_tracker_counter++]];
tracker->buffer = MRCTransfer(buffer);
tracker->contents = static_cast<const u64*>([buffer contents]);
+ tracker->query_id = m_state.perf_query_id;
return tracker;
}
}
@@ -682,6 +683,8 @@ std::shared_ptr<Metal::StateTracker::PerfQueryTracker> Metal::StateTracker::NewP
// Reuse an old one
std::shared_ptr<PerfQueryTracker> tracker = std::move(m_perf_query_tracker_cache.back());
m_perf_query_tracker_cache.pop_back();
+ tracker->groups.clear();
+ tracker->query_id = m_state.perf_query_id;
return tracker;
}
}
@@ -689,15 +692,26 @@ std::shared_ptr<Metal::StateTracker::PerfQueryTracker> Metal::StateTracker::NewP
void Metal::StateTracker::EnablePerfQuery(PerfQueryGroup group, u32 query_id)
{
m_state.perf_query_group = group;
+ m_state.perf_query_id = query_id;
if (!m_current_perf_query || m_current_perf_query->query_id != query_id ||
m_current_perf_query->groups.size() == PERF_QUERY_BUFFER_SIZE)
{
if (m_current_render_encoder)
EndRenderPass();
- if (!m_current_perf_query)
- m_current_perf_query = NewPerfQueryTracker();
- m_current_perf_query->groups.clear();
- m_current_perf_query->query_id = query_id;
+ if (m_current_perf_query)
+ {
+ [m_current_render_cmdbuf
+ addCompletedHandler:[backref = m_backref, q = std::move(m_current_perf_query)](id) {
+ std::lock_guard<std::mutex> guard(backref->mtx);
+ if (StateTracker* tracker = backref->state_tracker)
+ {
+ if (PerfQuery* query = static_cast<PerfQuery*>(g_perf_query.get()))
+ query->ReturnResults(q->contents, q->groups.data(), q->groups.size(), q->query_id);
+ tracker->m_perf_query_tracker_cache.emplace_back(std::move(q));
+ }
+ }];
+ m_current_perf_query.reset();
+ }
}
}