Fix invalid tracy events from C# profiling api when profiler gets connected mid-event

This commit is contained in:
Wojtek Figat
2023-12-06 00:24:30 +01:00
parent 2285116bae
commit 38a0718b70
3 changed files with 14 additions and 5 deletions

View File

@@ -108,6 +108,7 @@ namespace
}; };
ChunkedArray<Location, 256> ManagedSourceLocations; ChunkedArray<Location, 256> ManagedSourceLocations;
uint32 ManagedEventsCount[PLATFORM_THREADS_LIMIT] = { 0 };
#endif #endif
#endif #endif
} }
@@ -145,7 +146,9 @@ DEFINE_INTERNAL_CALL(void) ProfilerInternal_BeginEvent(MString* nameObj)
srcLoc->color = 0; srcLoc->color = 0;
} }
//static constexpr tracy::SourceLocationData tracySrcLoc{ nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; //static constexpr tracy::SourceLocationData tracySrcLoc{ nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 };
tracy::ScopedZone::Begin(srcLoc); const bool tracyActive = tracy::ScopedZone::Begin(srcLoc);
if (tracyActive)
ManagedEventsCount[Platform::GetCurrentThreadID()]++;
#endif #endif
#endif #endif
#endif #endif
@@ -155,7 +158,12 @@ DEFINE_INTERNAL_CALL(void) ProfilerInternal_EndEvent()
{ {
#if COMPILE_WITH_PROFILER #if COMPILE_WITH_PROFILER
#if TRACY_ENABLE #if TRACY_ENABLE
tracy::ScopedZone::End(); auto& tracyActive = ManagedEventsCount[Platform::GetCurrentThreadID()];
if (tracyActive > 0)
{
tracyActive--;
tracy::ScopedZone::End();
}
#endif #endif
ProfilerCPU::EndEvent(); ProfilerCPU::EndEvent();
#endif #endif

View File

@@ -12,15 +12,16 @@
namespace tracy namespace tracy
{ {
void ScopedZone::Begin(const SourceLocationData* srcloc) bool ScopedZone::Begin(const SourceLocationData* srcloc)
{ {
#ifdef TRACY_ON_DEMAND #ifdef TRACY_ON_DEMAND
if (!GetProfiler().IsConnected()) return; if (!GetProfiler().IsConnected()) return false;
#endif #endif
TracyLfqPrepare( QueueType::ZoneBegin ); TracyLfqPrepare( QueueType::ZoneBegin );
MemWrite( &item->zoneBegin.time, Profiler::GetTime() ); MemWrite( &item->zoneBegin.time, Profiler::GetTime() );
MemWrite( &item->zoneBegin.srcloc, (uint64_t)srcloc ); MemWrite( &item->zoneBegin.srcloc, (uint64_t)srcloc );
TracyQueueCommit( zoneBeginThread ); TracyQueueCommit( zoneBeginThread );
return true;
} }
void ScopedZone::End() void ScopedZone::End()

View File

@@ -39,7 +39,7 @@ struct TRACY_API SourceLocationData
class TRACY_API ScopedZone class TRACY_API ScopedZone
{ {
public: public:
static void Begin( const SourceLocationData* srcloc ); static bool Begin( const SourceLocationData* srcloc );
static void End(); static void End();
ScopedZone( const ScopedZone& ) = delete; ScopedZone( const ScopedZone& ) = delete;