diff options
| author | OatmealDome <OatmealDome@users.noreply.github.com> | 2023-04-18 22:15:50 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-18 22:15:50 +0200 |
| commit | 8aae296d4e4bafdac297af1518459c0e14edeb57 (patch) | |
| tree | 706c77d4bab1a8f29746b941f35bc58ff24e2360 /Source | |
| parent | 2e7f0d002e1a57b9a2477e6f907e85538efb07b2 (diff) | |
| parent | 09c80513cd82c05948620a5ade1668ca419ce0fc (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.h | 1 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/Metal/MTLStateTracker.mm | 22 |
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(); + } } } |
