diff --git a/public/tracy/TracyD3D11.hpp b/public/tracy/TracyD3D11.hpp index 837f28ac..8516b106 100644 --- a/public/tracy/TracyD3D11.hpp +++ b/public/tracy/TracyD3D11.hpp @@ -372,6 +372,9 @@ public: const auto queryId = m_ctx->NextQueryId(); m_ctx->m_immediateDevCtx->End(m_ctx->GetQueryObjectFromId(queryId)); +#ifdef TRACY_ON_DEMAND + if( GetProfiler().ConnectionId() != m_connectionId ) return; +#endif auto* item = Profiler::QueueSerial(); MemWrite( &item->hdr.type, QueueType::GpuZoneEndSerial ); MemWrite( &item->gpuZoneEnd.cpuTime, Profiler::GetTime() ); @@ -385,6 +388,7 @@ private: tracy_force_inline D3D11ZoneScope( D3D11Ctx* ctx, bool active ) #ifdef TRACY_ON_DEMAND : m_active( active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( active ) #endif @@ -409,6 +413,10 @@ private: const bool m_active; +#ifdef TRACY_ON_DEMAND + uint64_t m_connectionId = 0; +#endif + D3D11Ctx* m_ctx; }; diff --git a/public/tracy/TracyD3D12.hpp b/public/tracy/TracyD3D12.hpp index 8dba52ed..d1919370 100644 --- a/public/tracy/TracyD3D12.hpp +++ b/public/tracy/TracyD3D12.hpp @@ -558,6 +558,9 @@ namespace tracy class D3D12ZoneScope { const bool m_active; +#ifdef TRACY_ON_DEMAND + uint64_t m_connectionId = 0; +#endif D3D12QueueCtx* m_ctx = nullptr; ID3D12GraphicsCommandList* m_cmdList = nullptr; uint32_t m_queryId = 0; @@ -612,6 +615,7 @@ namespace tracy tracy_force_inline D3D12ZoneScope(D3D12QueueCtx* ctx, ID3D12GraphicsCommandList* cmdList, bool active) #ifdef TRACY_ON_DEMAND : m_active(active&& GetProfiler().IsConnected()) + , m_connectionId(GetProfiler().ConnectionId()) #else : m_active(active) #endif @@ -656,13 +660,20 @@ namespace tracy const auto queryId = m_queryId + 1; // Our end query slot is immediately after the begin slot. - auto* item = Profiler::QueueSerial(); - MemWrite(&item->hdr.type, QueueType::GpuZoneEndSerial); - MemWrite(&item->gpuZoneEnd.cpuTime, Profiler::GetTime()); - MemWrite(&item->gpuZoneEnd.thread, GetThreadHandle()); - MemWrite(&item->gpuZoneEnd.queryId, static_cast(queryId)); - MemWrite(&item->gpuZoneEnd.context, m_ctx->GetId()); - Profiler::QueueSerialFinish(); +#ifdef TRACY_ON_DEMAND + if (GetProfiler().ConnectionId() == m_connectionId) + { +#endif + auto* item = Profiler::QueueSerial(); + MemWrite(&item->hdr.type, QueueType::GpuZoneEndSerial); + MemWrite(&item->gpuZoneEnd.cpuTime, Profiler::GetTime()); + MemWrite(&item->gpuZoneEnd.thread, GetThreadHandle()); + MemWrite(&item->gpuZoneEnd.queryId, static_cast(queryId)); + MemWrite(&item->gpuZoneEnd.context, m_ctx->GetId()); + Profiler::QueueSerialFinish(); +#ifdef TRACY_ON_DEMAND + } +#endif m_cmdList->EndQuery(m_ctx->m_queryHeap, D3D12_QUERY_TYPE_TIMESTAMP, queryId); // NOTE: can't quite move this ResolveQueryData() call to Collect()... diff --git a/public/tracy/TracyMetal.hmm b/public/tracy/TracyMetal.hmm index a4b4cb52..519423e4 100644 --- a/public/tracy/TracyMetal.hmm +++ b/public/tracy/TracyMetal.hmm @@ -486,6 +486,7 @@ public: tracy_force_inline MetalZoneScope( MetalCtx* ctx, MTLComputePassDescriptor* desc, const SourceLocationData* srcloc, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -506,6 +507,7 @@ public: tracy_force_inline MetalZoneScope( MetalCtx* ctx, MTLBlitPassDescriptor* desc, const SourceLocationData* srcloc, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -526,6 +528,7 @@ public: tracy_force_inline MetalZoneScope( MetalCtx* ctx, MTLRenderPassDescriptor* desc, const SourceLocationData* srcloc, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -549,6 +552,7 @@ public: tracy_force_inline MetalZoneScope( MetalCtx* ctx, id cmdEncoder, const SourceLocationData* srcloc, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -569,6 +573,9 @@ public: { if( !m_active ) return; +#ifdef TRACY_ON_DEMAND + if( GetProfiler().ConnectionId() != m_connectionId ) return; +#endif SubmitZoneEndGpu(m_ctx, m_query.idx + 1); } @@ -577,6 +584,10 @@ public: private: const bool m_active; +#ifdef TRACY_ON_DEMAND + uint64_t m_connectionId = 0; +#endif + MetalCtx* m_ctx; /* TODO: declare it for "command-level" profiling diff --git a/public/tracy/TracyOpenGL.hpp b/public/tracy/TracyOpenGL.hpp index e0538488..b07d17e7 100644 --- a/public/tracy/TracyOpenGL.hpp +++ b/public/tracy/TracyOpenGL.hpp @@ -353,6 +353,7 @@ public: tracy_force_inline GpuCtxScope( const SourceLocationData* srcloc, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -374,6 +375,7 @@ public: tracy_force_inline GpuCtxScope( const SourceLocationData* srcloc, int32_t depth, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -401,6 +403,7 @@ public: tracy_force_inline GpuCtxScope( uint32_t line, const char* source, size_t sourceSz, const char* function, size_t functionSz, const char* name, size_t nameSz, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -423,6 +426,7 @@ public: tracy_force_inline GpuCtxScope( uint32_t line, const char* source, size_t sourceSz, const char* function, size_t functionSz, const char* name, size_t nameSz, int32_t depth, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -455,6 +459,9 @@ public: const auto queryId = GetGpuCtx().ptr->NextQueryId(); glQueryCounter( GetGpuCtx().ptr->TranslateOpenGlQueryId( queryId ), GL_TIMESTAMP ); +#ifdef TRACY_ON_DEMAND + if( GetProfiler().ConnectionId() != m_connectionId ) return; +#endif TracyLfqPrepare( QueueType::GpuZoneEnd ); MemWrite( &item->gpuZoneEnd.cpuTime, Profiler::GetTime() ); memset( &item->gpuZoneEnd.thread, 0, sizeof( item->gpuZoneEnd.thread ) ); @@ -465,6 +472,10 @@ public: private: const bool m_active; + +#ifdef TRACY_ON_DEMAND + uint64_t m_connectionId = 0; +#endif }; } diff --git a/public/tracy/TracyVulkan.hpp b/public/tracy/TracyVulkan.hpp index d7946309..5c17e41a 100644 --- a/public/tracy/TracyVulkan.hpp +++ b/public/tracy/TracyVulkan.hpp @@ -535,6 +535,7 @@ public: tracy_force_inline VkCtxScope( VkCtx* ctx, const SourceLocationData* srcloc, VkCommandBuffer cmdbuf, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -559,6 +560,7 @@ public: tracy_force_inline VkCtxScope( VkCtx* ctx, const SourceLocationData* srcloc, VkCommandBuffer cmdbuf, int32_t depth, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -592,6 +594,7 @@ public: tracy_force_inline VkCtxScope( VkCtx* ctx, uint32_t line, const char* source, size_t sourceSz, const char* function, size_t functionSz, const char* name, size_t nameSz, VkCommandBuffer cmdbuf, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -617,6 +620,7 @@ public: tracy_force_inline VkCtxScope( VkCtx* ctx, uint32_t line, const char* source, size_t sourceSz, const char* function, size_t functionSz, const char* name, size_t nameSz, VkCommandBuffer cmdbuf, int32_t depth, bool is_active ) #ifdef TRACY_ON_DEMAND : m_active( is_active && GetProfiler().IsConnected() ) + , m_connectionId( GetProfiler().ConnectionId() ) #else : m_active( is_active ) #endif @@ -655,6 +659,9 @@ public: const auto queryId = m_ctx->NextQueryId(); CONTEXT_VK_FUNCTION_WRAPPER( vkCmdWriteTimestamp( m_cmdbuf, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, m_ctx->m_query, queryId ) ); +#ifdef TRACY_ON_DEMAND + if( GetProfiler().ConnectionId() != m_connectionId ) return; +#endif auto item = Profiler::QueueSerial(); MemWrite( &item->hdr.type, QueueType::GpuZoneEndSerial ); MemWrite( &item->gpuZoneEnd.cpuTime, Profiler::GetTime() ); @@ -667,6 +674,10 @@ public: private: const bool m_active; +#ifdef TRACY_ON_DEMAND + uint64_t m_connectionId = 0; +#endif + VkCommandBuffer m_cmdbuf; VkCtx* m_ctx; }; diff --git a/public/tracy/TracyWebGPU.hpp b/public/tracy/TracyWebGPU.hpp index 9fca8545..9b25f263 100644 --- a/public/tracy/TracyWebGPU.hpp +++ b/public/tracy/TracyWebGPU.hpp @@ -715,6 +715,9 @@ namespace tracy class WebGPUZoneScope { const bool m_active; +#ifdef TRACY_ON_DEMAND + uint64_t m_connectionId = 0; +#endif WebGPUQueueCtx* m_ctx = nullptr; WGPUCommandEncoder m_encoder = nullptr; uint64_t m_rawTicket = 0; @@ -831,6 +834,7 @@ namespace tracy tracy_force_inline WebGPUZoneScope(WebGPUQueueCtx* ctx, WGPUCommandEncoder encoder, PassDescriptor& passDesc, const SourceLocationData* srcLocation, bool active) #ifdef TRACY_ON_DEMAND : m_active(active && GetProfiler().IsConnected()) + , m_connectionId(GetProfiler().ConnectionId()) #else : m_active(active) #endif @@ -844,6 +848,7 @@ namespace tracy tracy_force_inline WebGPUZoneScope(WebGPUQueueCtx* ctx, WGPUCommandEncoder encoder, PassDescriptor& passDesc, const SourceLocationData* srcLocation, int32_t depth, bool active) #ifdef TRACY_ON_DEMAND : m_active(active && GetProfiler().IsConnected()) + , m_connectionId(GetProfiler().ConnectionId()) #else : m_active(active) #endif @@ -857,6 +862,7 @@ namespace tracy tracy_force_inline WebGPUZoneScope(WebGPUQueueCtx* ctx, uint32_t line, const char* source, size_t sourceSz, const char* function, size_t functionSz, const char* name, size_t nameSz, WGPUCommandEncoder encoder, PassDescriptor& passDesc, bool active) #ifdef TRACY_ON_DEMAND : m_active(active && GetProfiler().IsConnected()) + , m_connectionId(GetProfiler().ConnectionId()) #else : m_active(active) #endif @@ -870,6 +876,7 @@ namespace tracy tracy_force_inline WebGPUZoneScope(WebGPUQueueCtx* ctx, uint32_t line, const char* source, size_t sourceSz, const char* function, size_t functionSz, const char* name, size_t nameSz, WGPUCommandEncoder encoder, PassDescriptor& passDesc, int32_t depth, bool active) #ifdef TRACY_ON_DEMAND : m_active(active && GetProfiler().IsConnected()) + , m_connectionId(GetProfiler().ConnectionId()) #else : m_active(active) #endif @@ -885,13 +892,20 @@ namespace tracy const auto queryId = m_queryId + 1; - auto* item = Profiler::QueueSerial(); - MemWrite(&item->hdr.type, QueueType::GpuZoneEndSerial); - MemWrite(&item->gpuZoneEnd.cpuTime, Profiler::GetTime()); - MemWrite(&item->gpuZoneEnd.thread, GetThreadHandle()); - MemWrite(&item->gpuZoneEnd.queryId, static_cast(queryId)); - MemWrite(&item->gpuZoneEnd.context, m_ctx->GetId()); - Profiler::QueueSerialFinish(); +#ifdef TRACY_ON_DEMAND + if (GetProfiler().ConnectionId() == m_connectionId) + { +#endif + auto* item = Profiler::QueueSerial(); + MemWrite(&item->hdr.type, QueueType::GpuZoneEndSerial); + MemWrite(&item->gpuZoneEnd.cpuTime, Profiler::GetTime()); + MemWrite(&item->gpuZoneEnd.thread, GetThreadHandle()); + MemWrite(&item->gpuZoneEnd.queryId, static_cast(queryId)); + MemWrite(&item->gpuZoneEnd.context, m_ctx->GetId()); + Profiler::QueueSerialFinish(); +#ifdef TRACY_ON_DEMAND + } +#endif if (m_queryId % 32 == 0) ResolveQueryBatch(m_queryId-32);