diff --git a/client/TracyProfiler.cpp b/client/TracyProfiler.cpp index 1ed561aa..9aa5d04a 100644 --- a/client/TracyProfiler.cpp +++ b/client/TracyProfiler.cpp @@ -1316,6 +1316,7 @@ void Profiler::Worker() m_threadCtx = 0; m_refTimeSerial = 0; m_refTimeCtx = 0; + m_refTimeGpu = 0; #ifdef TRACY_ON_DEMAND OnDemandPayloadMessage onDemand; @@ -1802,6 +1803,14 @@ Profiler::DequeueStatus Profiler::Dequeue( moodycamel::ConsumerToken& token ) MemWrite( &item->threadWakeup.time, dt ); break; } + case QueueType::GpuTime: + { + int64_t t = MemRead( &item->gpuTime.gpuTime ); + int64_t dt = t - m_refTimeGpu; + m_refTimeGpu = t; + MemWrite( &item->gpuTime.gpuTime, dt ); + break; + } default: assert( false ); break; @@ -1964,6 +1973,14 @@ Profiler::DequeueStatus Profiler::DequeueSerial() MemWrite( &item->gpuZoneEnd.cpuTime, dt ); break; } + case QueueType::GpuTime: + { + int64_t t = MemRead( &item->gpuTime.gpuTime ); + int64_t dt = t - m_refTimeGpu; + m_refTimeGpu = t; + MemWrite( &item->gpuTime.gpuTime, dt ); + break; + } default: assert( false ); break; diff --git a/client/TracyProfiler.hpp b/client/TracyProfiler.hpp index 4b5620e5..c3ef4eb8 100644 --- a/client/TracyProfiler.hpp +++ b/client/TracyProfiler.hpp @@ -546,6 +546,7 @@ private: int64_t m_refTimeThread; int64_t m_refTimeSerial; int64_t m_refTimeCtx; + int64_t m_refTimeGpu; void* m_stream; // LZ4_stream_t* char* m_buffer; diff --git a/common/TracyProtocol.hpp b/common/TracyProtocol.hpp index fc888313..d2742df9 100644 --- a/common/TracyProtocol.hpp +++ b/common/TracyProtocol.hpp @@ -9,7 +9,7 @@ namespace tracy { -enum : uint32_t { ProtocolVersion = 20 }; +enum : uint32_t { ProtocolVersion = 21 }; enum : uint32_t { BroadcastVersion = 0 }; using lz4sz_t = uint32_t; diff --git a/common/TracyQueue.hpp b/common/TracyQueue.hpp index 119584e1..c8ab0f99 100644 --- a/common/TracyQueue.hpp +++ b/common/TracyQueue.hpp @@ -41,6 +41,7 @@ enum class QueueType : uint8_t PlotData, ContextSwitch, ThreadWakeup, + GpuTime, Terminate, KeepAlive, ThreadContext, @@ -57,7 +58,6 @@ enum class QueueType : uint8_t MessageLiteral, MessageLiteralColor, GpuNewContext, - GpuTime, CallstackFrameSize, CallstackFrame, SysTimeReport, @@ -419,6 +419,7 @@ static const size_t QueueDataSize[] = { sizeof( QueueHeader ) + sizeof( QueuePlotData ), sizeof( QueueHeader ) + sizeof( QueueContextSwitch ), sizeof( QueueHeader ) + sizeof( QueueThreadWakeup ), + sizeof( QueueHeader ) + sizeof( QueueGpuTime ), // above items must be first sizeof( QueueHeader ), // terminate sizeof( QueueHeader ), // keep alive @@ -436,7 +437,6 @@ static const size_t QueueDataSize[] = { sizeof( QueueHeader ) + sizeof( QueueMessage ), // literal sizeof( QueueHeader ) + sizeof( QueueMessageColor ), // literal sizeof( QueueHeader ) + sizeof( QueueGpuNewContext ), - sizeof( QueueHeader ) + sizeof( QueueGpuTime ), sizeof( QueueHeader ) + sizeof( QueueCallstackFrameSize ), sizeof( QueueHeader ) + sizeof( QueueCallstackFrame ), sizeof( QueueHeader ) + sizeof( QueueSysTime ), diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index c35e28d0..4eeadaa1 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -4188,14 +4188,17 @@ void Worker::ProcessGpuTime( const QueueGpuTime& ev ) auto ctx = m_gpuCtxMap[ev.context]; assert( ctx ); + const int64_t t = m_refTimeGpu + ev.gpuTime; + m_refTimeGpu = t; + int64_t gpuTime; if( ctx->period == 1.f ) { - gpuTime = ev.gpuTime; + gpuTime = t; } else { - gpuTime = int64_t( double( ctx->period ) * ev.gpuTime ); // precision loss + gpuTime = int64_t( double( ctx->period ) * t ); // precision loss } auto zone = ctx->query[ev.queryId]; diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index 57efca16..d8350ac5 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -622,6 +622,7 @@ private: int64_t m_refTimeThread = 0; int64_t m_refTimeSerial = 0; int64_t m_refTimeCtx = 0; + int64_t m_refTimeGpu = 0; }; }