// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "TraceServices/Model/TimingProfiler.h" #include "Common/SlabAllocator.h" #include "Model/MonotonicTimeline.h" #include "Model/Tables.h" namespace TraceServices { class FAnalysisSessionLock; class FStringStore; struct FGpuQueueData { TArray SignalFenceArray; TArray WaitFenceArray; }; class FTimingProfilerProvider : public ITimingProfilerProvider , public ITimingProfilerTimerReader , public IEditableTimingProfilerProvider { public: typedef TMonotonicTimeline TimelineInternal; explicit FTimingProfilerProvider(IAnalysisSession& InSession); virtual ~FTimingProfilerProvider(); TimelineInternal& EditGpuTimeline(); TimelineInternal& EditGpu2Timeline(); // ITimingProfilerProvider virtual bool GetCpuThreadTimelineIndex(uint32 ThreadId, uint32& OutTimelineIndex) const override; virtual bool GetGpuTimelineIndex(uint32& OutTimelineIndex) const override; virtual bool GetGpu2TimelineIndex(uint32& OutTimelineIndex) const override; virtual void EnumerateGpuQueues(TFunctionRef Callback) const override; virtual bool GetGpuQueueTimelineIndex(uint32 QueueId, uint32& OutTimelineIndex) const override; virtual bool GetVerseTimelineIndex(uint32& OutTimelineIndex) const override; virtual void EnumerateGpuSignalFences(uint32 QueueId, double StartTime, double EndTime, EnumerateGpuSignalFencesCallback Callback) const override; virtual void EnumerateGpuWaitFences(uint32 QueueId, double StartTime, double EndTime, EnumerateGpuWaitFencesCallback Callback) const override; virtual void EnumerateGpuFences(uint32 QueueId, double StartTime, double EndTime, EnumerateGpuFencesCallback Callback) const override; virtual void EnumerateResolvedGpuFences(uint32 QueueId, double StartTime, double EndTime, EnumerateResolvedGpuFencesCallback Callback) const override; virtual bool ReadTimeline(uint32 Index, TFunctionRef Callback) const override; virtual uint32 GetTimelineCount() const override { return Timelines.Num(); } virtual void EnumerateTimelines(TFunctionRef Callback) const override; virtual void ReadTimers(TFunctionRef Callback) const override; virtual uint32 GetOriginalTimerIdFromMetadata(uint32 MetadataTimerId) const override; virtual TArrayView GetMetadata(uint32 MetadataTimerId) const override; virtual const FMetadataSpec* GetMetadataSpec(uint32 MetadataSpecId) const; virtual ITable* CreateAggregation(const FCreateAggregationParams& Params) const override; virtual ITimingProfilerButterfly* CreateButterfly(const FCreateButterflyParams& Params) const override; // ITimingProfilerTimerReader virtual const FTimingProfilerTimer* GetTimer(uint32 TimerId) const override; virtual uint32 GetTimerCount() const override; //virtual uint32 GetOriginalTimerIdFromMetadata(uint32 MetadataTimerId) const override; //virtual TArrayView GetMetadata(uint32 MetadataTimerId) const override; // IEditableTimingProfilerProvider virtual uint32 AddCpuTimer(FStringView Name, const TCHAR* File = nullptr, uint32 Line = 0) override; virtual uint32 AddGpuTimer(FStringView Name, const TCHAR* File = nullptr, uint32 Line = 0) override; virtual uint32 AddVerseTimer(FStringView Name, const TCHAR* File = nullptr, uint32 Line = 0) override; virtual void SetTimerName(uint32 TimerId, FStringView Name) override; virtual void SetTimerNameAndLocation(uint32 TimerId, FStringView Name, const TCHAR* File, uint32 Line) override; virtual uint32 AddMetadata(uint32 OriginalTimerId, TArray&& Metadata) override; virtual void SetMetadata(uint32 MetadataTimerId, TArray&& Metadata) override; virtual void SetMetadata(uint32 MetadataTimerId, TArray&& Metadata, uint32 NewTimerId) override; virtual TArrayView GetEditableMetadata(uint32 MetadataTimerId) override; virtual uint32 AddMetadataSpec(FMetadataSpec&& Metadata) override; virtual void SetMetadataSpec(uint32 TimerId, uint32 MetadataSpecId) override; virtual void AddGpuQueue(uint32 QueueId, uint8 GPU, uint8 Index, uint8 Type, const TCHAR* Name) override; virtual void AddGpuSignalFence(uint32 QueueId, const FGpuSignalFence& SignalFence) override; virtual void AddGpuWaitFence(uint32 QueueId, const FGpuWaitFence& WaitFence) override; virtual IEditableTimeline& GetCpuThreadEditableTimeline(uint32 ThreadId) override; virtual IEditableTimeline* GetGpuQueueEditableTimeline(uint32 QueueId) override; virtual IEditableTimeline* GetGpuQueueWorkEditableTimeline(uint32 QueueId) override; virtual IEditableTimeline* GetVerseEditableTimeline() override; virtual const ITimingProfilerProvider* GetReadProvider() const override { return this; } private: enum class ETimingProfilerTimerType : uint32 { Cpu, Gpu, Verse }; FTimingProfilerTimer& AddTimerInternal(FStringView Name, const TCHAR* File, uint32 Line, ETimingProfilerTimerType TimerType); struct FMetadata { TArray Payload; uint32 TimerId; }; IAnalysisSession& Session; TArray Metadatas; TArray MetadataSpecs; TArray Timers; TArray> Timelines; TMap CpuThreadTimelineIndexMap; // CPU Thread Id --> timeline index, in Timelines static const uint32 GpuTimelineIndex = 0; static const uint32 Gpu2TimelineIndex = 1; static const uint32 VerseTimelineIndex = 2; TArray GpuQueues; TArray GpuQueueData; TMap GpuQueueIdToQueueIndexMap; // GPU Queue Id --> queue index, in GpuQueues TTableLayout AggregatedStatsTableLayout; }; } // namespace TraceServices