Files
2025-05-18 13:04:45 +08:00

123 lines
4.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreTypes.h"
// TraceServices
#include "TraceServices/Model/TimingProfiler.h"
// TraceInsights
#include "Insights/TimingProfiler/Tracks/ThreadTimingTrack.h"
#include "Insights/ViewModels/TimingEventSearch.h" // for TTimingEventSearchCache
#include "Insights/ViewModels/TimingEventsTrack.h"
class FThreadTrackEvent;
class FTimingEventSearchParameters;
namespace UE::Insights { class FFilterConfigurator; }
namespace UE::Insights::TimingProfiler
{
class FThreadTimingSharedState;
////////////////////////////////////////////////////////////////////////////////////////////////////
class FThreadTimingTrackImpl : public FThreadTimingTrack
{
INSIGHTS_DECLARE_RTTI(FThreadTimingTrackImpl, FThreadTimingTrack)
public:
typedef typename TraceServices::ITimeline<TraceServices::FTimingProfilerEvent>::FTimelineEventInfo TimelineEventInfo;
explicit FThreadTimingTrackImpl(FThreadTimingSharedState& InSharedState, const FString& InName, const TCHAR* InGroupName, uint32 InTimelineIndex, uint32 InThreadId)
: FThreadTimingTrack(InName)
, SharedState(InSharedState)
, GroupName(InGroupName)
, TimelineIndex(InTimelineIndex)
, ThreadId(InThreadId)
{
}
virtual ~FThreadTimingTrackImpl() override {}
const TCHAR* GetGroupName() const { return GroupName; };
uint32 GetTimelineIndex() const { return TimelineIndex; }
//////////////////////////////////////////////////
// FThreadTimingTrack
virtual uint32 GetThreadId() const override { return ThreadId; }
virtual int32 GetDepthAt(double Time) const override;
//////////////////////////////////////////////////
// FBaseTimingTrack
virtual void PostDraw(const ITimingTrackDrawContext& Context) const override;
virtual void InitTooltip(FTooltipDrawState& InOutTooltip, const ITimingEvent& InTooltipEvent) const override;
virtual const TSharedPtr<const ITimingEvent> GetEvent(float InPosX, float InPosY, const FTimingTrackViewport& Viewport) const override;
virtual const TSharedPtr<const ITimingEvent> SearchEvent(const FTimingEventSearchParameters& InSearchParameters) const override;
virtual void UpdateEventStats(ITimingEvent& InOutEvent) const override;
virtual void OnEventSelected(const ITimingEvent& InSelectedEvent) const override;
virtual void OnClipboardCopyEvent(const ITimingEvent& InSelectedEvent) const override;
virtual void BuildContextMenu(FMenuBuilder& MenuBuilder) override;
virtual void SetFilterConfigurator(TSharedPtr<FFilterConfigurator> InFilterConfigurator) override;
//////////////////////////////////////////////////
// FTimingEventsTrack
virtual void BuildDrawState(ITimingEventsTrackDrawStateBuilder& Builder, const ITimingTrackUpdateContext& Context) override;
virtual void BuildFilteredDrawState(ITimingEventsTrackDrawStateBuilder& Builder, const ITimingTrackUpdateContext& Context) override;
//////////////////////////////////////////////////
TSharedPtr<const ITimingEvent> FindMaxEventInstance(uint32 TimerId, double StartTime, double EndTime) const;
TSharedPtr<const ITimingEvent> FindMinEventInstance(uint32 TimerId, double StartTime, double EndTime) const;
protected:
FThreadTimingSharedState& GetSharedState() const { return SharedState; }
//////////////////////////////////////////////////
// FTimingEventsTrack
virtual bool HasCustomFilter() const override;
//////////////////////////////////////////////////
virtual void PostInitTooltip(FTooltipDrawState& InOutTooltip, const FThreadTrackEvent& TooltipEvent, const TraceServices::IAnalysisSession& Session, const TCHAR* TimerName) const {}
private:
bool FindTimingProfilerEvent(const FThreadTrackEvent& InTimingEvent, TFunctionRef<void(double, double, uint32, const TraceServices::FTimingProfilerEvent&)> InFoundPredicate) const;
bool FindTimingProfilerEvent(const FTimingEventSearchParameters& InParameters, TFunctionRef<void(double, double, uint32, const TraceServices::FTimingProfilerEvent&)> InFoundPredicate) const;
void GetParentAndRoot(const FThreadTrackEvent& TimingEvent,
TSharedPtr<FThreadTrackEvent>& OutParentTimingEvent,
TSharedPtr<FThreadTrackEvent>& OutRootTimingEvent) const;
static void CreateFThreadTrackEventFromInfo(const TimelineEventInfo& InEventInfo, const TSharedRef<const FBaseTimingTrack> InTrack, int32 InDepth, TSharedPtr<FThreadTrackEvent> &OutTimingEvent);
static bool TimerIndexToTimerId(uint32 InTimerIndex, uint32 & OutTimerId);
private:
FThreadTimingSharedState& SharedState;
TSharedPtr<FFilterConfigurator> FilterConfigurator;
const TCHAR* GroupName = nullptr;
uint32 TimelineIndex = 0;
uint32 ThreadId = 0;
// Search cache
mutable TTimingEventSearchCache<TraceServices::FTimingProfilerEvent> SearchCache;
};
////////////////////////////////////////////////////////////////////////////////////////////////////
} // namespace UE::Insights::TimingProfiler