From 2b2fafbcfc139d04fb017bd1c162eff86a8c0e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Gr=C3=A9goire?= Date: Mon, 9 Feb 2026 11:30:24 +0100 Subject: [PATCH] Start cleaning TRACY_HW_TIMER checks. Ideally I think we might want to have TRACY_HW_TIMER mean only TSC/CNTVCT, and define TRACY_TIMER_FALLBACK for platforms that don't have them or have a special case such as iOS. But for now, keep the same behaviour. --- public/client/TracyProfiler.hpp | 16 +++++++++++++--- public/client/TracySysTrace.cpp | 8 ++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/public/client/TracyProfiler.hpp b/public/client/TracyProfiler.hpp index 80cbec51..7ddd244a 100644 --- a/public/client/TracyProfiler.hpp +++ b/public/client/TracyProfiler.hpp @@ -28,8 +28,18 @@ # include #endif -#if !defined TRACY_DISALLOW_HW_TIMER && ( (defined _WIN32 && !(defined _M_ARM64 || defined _M_ARM)) || ( defined __i386 || defined _M_IX86 || defined __x86_64__ || defined _M_X64 ) || ( defined TARGET_OS_IOS && TARGET_OS_IOS == 1 ) || ( defined __APPLE__ && defined __MACH__ && TARGET_CPU_ARM64 ) ) -# define TRACY_HW_TIMER +#if ( defined __i386 || defined _M_IX86 || defined __x86_64__ || defined _M_X64 ) +# define TRACY_HAS_RDTSC +#elif defined __APPLE__ && defined __MACH__ && TARGET_CPU_ARM64 // For now only supported on Apple devices +# define TRACY_HAS_CNTVCT +#endif + +#if !defined TRACY_DISALLOW_HW_TIMER +# if ( defined TRACY_HAS_RDTSC || defined TRACY_HAS_CNTVCT ) +# define TRACY_HW_TIMER +# elif defined TARGET_OS_IOS && TARGET_OS_IOS == 1 // For now, !defined(TRACY_HW_TIMER) implies TRACY_TIMER_FALLBACK, so define TRACY_HW_TIMER to use mach_absolute_time() on iOS +# define TRACY_HW_TIMER +# endif #endif #ifdef __linux__ @@ -81,7 +91,7 @@ TRACY_API bool ProfilerAvailable(); TRACY_API bool ProfilerAllocatorAvailable(); TRACY_API int64_t GetFrequencyQpc(); -#if defined TRACY_TIMER_FALLBACK && defined TRACY_HW_TIMER && ( defined __i386 || defined _M_IX86 || defined __x86_64__ || defined _M_X64 ) +#if defined TRACY_TIMER_FALLBACK && defined TRACY_HW_TIMER && defined TRACY_HAS_RDTSC TRACY_API bool HardwareSupportsInvariantTSC(); // check, if we need fallback scenario #else # if defined TRACY_HW_TIMER diff --git a/public/client/TracySysTrace.cpp b/public/client/TracySysTrace.cpp index 27b246c1..79240f02 100644 --- a/public/client/TracySysTrace.cpp +++ b/public/client/TracySysTrace.cpp @@ -597,7 +597,7 @@ bool SysTraceStart( int64_t& samplingPeriod ) TracyDebug( "drm_vblank_event id: %i", vsyncId ); bool useMonotonicClockRaw = !HardwareSupportsInvariantTSC(); -#if !defined TRACY_HW_TIMER || !( defined __i386 || defined _M_IX86 || defined __x86_64__ || defined _M_X64 ) +#if !defined TRACY_HW_TIMER || !defined TRACY_HAS_RDTSC useMonotonicClockRaw = true; #endif if( useMonotonicClockRaw ) @@ -1070,7 +1070,7 @@ void SysTraceWorker( void* ptr ) if( cnt > 0 ) { -#if defined TRACY_HW_TIMER && ( defined __i386 || defined _M_IX86 || defined __x86_64__ || defined _M_X64 ) +#if defined TRACY_HW_TIMER && defined TRACY_HAS_RDTSC t0 = ring.ConvertTimeToTsc( t0 ); #endif auto trace = GetCallstackBlock( cnt, ring, offset ); @@ -1104,7 +1104,7 @@ void SysTraceWorker( void* ptr ) offset += sizeof( uint64_t ); ring.Read( &t0, offset, sizeof( uint64_t ) ); -#if defined TRACY_HW_TIMER && ( defined __i386 || defined _M_IX86 || defined __x86_64__ || defined _M_X64 ) +#if defined TRACY_HW_TIMER && defined TRACY_HAS_RDTSC t0 = ring.ConvertTimeToTsc( t0 ); #endif QueueType type; @@ -1224,7 +1224,7 @@ void SysTraceWorker( void* ptr ) perf_event_header hdr; ring.Read( &hdr, offset, sizeof( perf_event_header ) ); -#if defined TRACY_HW_TIMER && ( defined __i386 || defined _M_IX86 || defined __x86_64__ || defined _M_X64 ) +#if defined TRACY_HW_TIMER && defined TRACY_HAS_RDTSC t0 = ring.ConvertTimeToTsc( t0 ); #endif