1+ #pragma once
2+
3+ #include < string_view>
4+
5+ namespace plugify {
6+ struct ZoneHandle {
7+ uint64_t opaque = 0 ;
8+
9+ explicit operator bool () const { return opaque != 0 ; }
10+ };
11+
12+ struct ZoneDesc {
13+ std::string_view name;
14+ std::string_view function;
15+ std::string_view file;
16+ size_t line;
17+ uint32_t color;
18+
19+ ZoneDesc (std::string_view name,
20+ #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 and __GNUC_MINOR__ >= 8)) || (defined(_MSC_VER) && _MSC_VER > 1925)
21+ std::string_view function = __builtin_FUNCTION(),
22+ std::string_view file = __builtin_FILE(),
23+ size_t line = __builtin_LINE(),
24+ uint32_t color = 0
25+ #else
26+ std::string_view function = " " ,
27+ std::string_view file = " " ,
28+ size_t line = 0 ,
29+ uint32_t color = 0
30+ #endif
31+ )
32+ : name(name), function(function), file(file), line(line), color(color) {}
33+ };
34+
35+ class IProfiler {
36+ public:
37+ virtual ~IProfiler () = default ;
38+
39+ // Frame boundary
40+ // Call once per application frame (or per plugin tick).
41+ virtual void MarkFrame (std::string_view name) = 0;
42+
43+ // CPU zones
44+ // BeginZone / EndZone must be balanced. Prefer the RAII
45+ // ScopedZone helper below — don't call these directly.
46+ virtual ZoneHandle BeginZone (const ZoneDesc& desc) = 0;
47+ virtual void EndZone (ZoneHandle handle) = 0;
48+
49+ // Memory tracking
50+ // virtual void TrackAlloc(void* ptr, size_t size, std::string_view pool = {}) = 0;
51+ // virtual void TrackFree(void* ptr, std::string_view pool = {}) = 0;
52+
53+ // Thread metadata
54+ virtual void SetThreadName (std::string_view name) = 0;
55+
56+ // Capability query
57+ virtual std::string_view GetName () const = 0; // "Tracy", "Optick", …
58+ virtual bool IsActive () const = 0;
59+ };
60+
61+ class ScopedZone {
62+ public:
63+ ScopedZone (IProfiler* profiler, const ZoneDesc& desc) : _profiler(profiler) {
64+ if (_profiler) _handle = _profiler->BeginZone (desc);
65+ }
66+ ~ScopedZone () {
67+ if (_profiler && _handle) _profiler->EndZone (_handle);
68+ }
69+
70+ ScopedZone (const ScopedZone&) = delete ;
71+ ScopedZone& operator =(const ScopedZone&) = delete ;
72+ ScopedZone (ScopedZone&&) = delete ;
73+ ScopedZone& operator =(ScopedZone&&) = delete ;
74+
75+ private:
76+ IProfiler* _profiler = nullptr ;
77+ ZoneHandle _handle = {};
78+ };
79+ }
0 commit comments