Files
UnrealEngine/Engine/Source/Developer/TraceInsights/Private/Insights/TaskGraphProfiler/ViewModels/TaskTable.cpp
2025-05-18 13:04:45 +08:00

866 lines
39 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "TaskTable.h"
// TraceServices
#include "TraceServices/Model/TasksProfiler.h"
// TraceInsightsCore
#include "InsightsCore/Common/TimeUtils.h"
#include "InsightsCore/Table/ViewModels/TableCellValue.h"
#include "InsightsCore/Table/ViewModels/TableCellValueFormatter.h"
#include "InsightsCore/Table/ViewModels/TableCellValueGetter.h"
#include "InsightsCore/Table/ViewModels/TableCellValueSorter.h"
#include "InsightsCore/Table/ViewModels/TableColumn.h"
// TraceInsights
#include "Insights/TaskGraphProfiler/ViewModels/TaskNode.h"
#include "Insights/TaskGraphProfiler/ViewModels/TaskTable.h"
#define LOCTEXT_NAMESPACE "UE::Insights::TaskGraphProfiler::FTaskTable"
namespace UE::Insights::TaskGraphProfiler
{
////////////////////////////////////////////////////////////////////////////////////////////////////
// Column identifiers
const FName FTaskTableColumns::DebugNameColumnId(TEXT("DebugName"));
const FName FTaskTableColumns::CreatedTimestampColumnId(TEXT("CreatedTimestamp"));
const FName FTaskTableColumns::CreatedThreadIdColumnId(TEXT("CreatedThreadId"));
const FName FTaskTableColumns::LaunchedTimestampColumnId(TEXT("LaunchedTimestamp"));
const FName FTaskTableColumns::LaunchedThreadIdColumnId(TEXT("LaunchedThreadId"));
const FName FTaskTableColumns::ScheduledTimestampColumnId(TEXT("ScheduledTimestamp"));
const FName FTaskTableColumns::ScheduledThreadIdColumnId(TEXT("ScheduledThreadId"));
const FName FTaskTableColumns::StartedTimestampColumnId(TEXT("StartedTimestamp"));
const FName FTaskTableColumns::StartedThreadIdColumnId(TEXT("StartedThreadId"));
const FName FTaskTableColumns::FinishedTimestampColumnId(TEXT("FinishedTimestamp"));
const FName FTaskTableColumns::CompletedTimestampColumnId(TEXT("CompletedTimestamp"));
const FName FTaskTableColumns::CompletedThreadIdColumnId(TEXT("CompletedThreadId"));
const FName FTaskTableColumns::DestroyedTimestampColumnId(TEXT("DestroyedTimestamp"));
const FName FTaskTableColumns::DestroyedThreadIdColumnId(TEXT("DestroyedThreadId"));
const FName FTaskTableColumns::TaskSizeColumnId(TEXT("TaskSize"));
const FName FTaskTableColumns::NumParentColumnId(TEXT("NumParents"));
const FName FTaskTableColumns::NumNestedColumnId(TEXT("NumNested"));
const FName FTaskTableColumns::NumSubsequentsColumnId(TEXT("NumSubsequents"));
const FName FTaskTableColumns::NumPrerequisitesColumnId(TEXT("NumPrerequisites"));
////////////////////////////////////////////////////////////////////////////////////////////////////
typedef FTableCellValue (*TaskFieldGetter) (const FTableColumn&, const FTaskEntry&);
template<TaskFieldGetter Getter>
class FTaskColumnValueGetter : public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const override
{
if (Node.IsGroup())
{
const FTableTreeNode& NodePtr = static_cast<const FTableTreeNode&>(Node);
if (NodePtr.HasAggregatedValue(Column.GetId()))
{
return NodePtr.GetAggregatedValue(Column.GetId());
}
}
else //if (Node->Is<FTaskNode>())
{
const FTaskNode& TaskNode = static_cast<const FTaskNode&>(Node);
const FTaskEntry* Task = TaskNode.GetTask();
if (Task)
{
return Getter(Column, *Task);
}
}
return TOptional<FTableCellValue>();
}
};
////////////////////////////////////////////////////////////////////////////////////////////////////
double GetRelativeValue(double ValueA, double ValueB)
{
if (ValueA == TraceServices::FTaskInfo::InvalidTimestamp || ValueB == TraceServices::FTaskInfo::InvalidTimestamp)
{
return TraceServices::FTaskInfo::InvalidTimestamp;
}
return ValueA - ValueB;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
struct DefaultTaskFieldGetterFuncts
{
static FTableCellValue GetDebugName(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(Task.GetDebugName()); }
static FTableCellValue GetCreatedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(Task.GetCreatedTimestamp()); }
static FTableCellValue GetCreatedThreadId(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue((int64)Task.GetCreatedThreadId()); }
static FTableCellValue GetLaunchedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(Task.GetLaunchedTimestamp()); }
static FTableCellValue GetLaunchedThreadId(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue((int64)Task.GetLaunchedThreadId()); }
static FTableCellValue GetScheduledTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(Task.GetScheduledTimestamp()); }
static FTableCellValue GetScheduledThreadId(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue((int64)Task.GetScheduledThreadId()); }
static FTableCellValue GetStartedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(Task.GetStartedTimestamp()); }
static FTableCellValue GetStartedThreadId(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue((int64)Task.GetStartedThreadId()); }
static FTableCellValue GetFinishedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(Task.GetFinishedTimestamp()); }
static FTableCellValue GetCompletedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(Task.GetCompletedTimestamp()); }
static FTableCellValue GetCompletedThreadId(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue((int64)Task.GetCompletedThreadId()); }
static FTableCellValue GetDestroyedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(Task.GetDestroyedTimestamp()); }
static FTableCellValue GetDestroyedThreadId(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue((int64)Task.GetDestroyedThreadId()); }
static FTableCellValue GetTaskSize(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue((int64)Task.GetTaskSize()); }
static FTableCellValue GetNumParents(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue((int64)Task.GetNumParents()); }
static FTableCellValue GetNumNested(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue((int64)Task.GetNumNested()); }
static FTableCellValue GetNumSubsequents(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue((int64)Task.GetNumSubsequents()); }
static FTableCellValue GetNumPrerequisites(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue((int64)Task.GetNumPrerequisites()); }
};
////////////////////////////////////////////////////////////////////////////////////////////////////
struct RelativeToPreviousTaskFieldGetterFuncts
{
static FTableCellValue GetCreatedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(Task.GetCreatedTimestamp()); }
static FTableCellValue GetLaunchedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetLaunchedTimestamp(), Task.GetCreatedTimestamp())); }
static FTableCellValue GetScheduledTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetScheduledTimestamp(), Task.GetLaunchedTimestamp())); }
static FTableCellValue GetStartedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetStartedTimestamp(), Task.GetScheduledTimestamp())); }
static FTableCellValue GetFinishedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetFinishedTimestamp(), Task.GetStartedTimestamp())); }
static FTableCellValue GetCompletedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetCompletedTimestamp(), Task.GetFinishedTimestamp())); }
static FTableCellValue GetDestroyedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetDestroyedTimestamp(), Task.GetCompletedTimestamp())); }
};
////////////////////////////////////////////////////////////////////////////////////////////////////
struct RelativeToCreatedTaskFieldGetterFuncts
{
static FTableCellValue GetCreatedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(Task.GetCreatedTimestamp()); }
static FTableCellValue GetLaunchedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetLaunchedTimestamp(), Task.GetCreatedTimestamp())); }
static FTableCellValue GetScheduledTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetScheduledTimestamp(), Task.GetCreatedTimestamp())); }
static FTableCellValue GetStartedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetStartedTimestamp(), Task.GetCreatedTimestamp())); }
static FTableCellValue GetFinishedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetFinishedTimestamp(), Task.GetCreatedTimestamp())); }
static FTableCellValue GetCompletedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetCompletedTimestamp(), Task.GetCreatedTimestamp())); }
static FTableCellValue GetDestroyedTimestamp(const FTableColumn& Column, const FTaskEntry& Task) { return FTableCellValue(GetRelativeValue(Task.GetDestroyedTimestamp(), Task.GetCreatedTimestamp())); }
};
////////////////////////////////////////////////////////////////////////////////////////////////////
class FTaskDoubleValueFormatterAsTimeAuto : public FTableCellValueFormatter
{
public:
virtual FText FormatValue(const TOptional<FTableCellValue>& InValue) const override
{
if (InValue.IsSet())
{
const double Value = InValue.GetValue().Double;
if (Value != TraceServices::FTaskInfo::InvalidTimestamp)
{
return FText::FromString(FormatTimeAuto(Value));
}
}
return FText::FromString(TEXT("N/A"));
}
virtual FText FormatValueForTooltip(const TOptional<FTableCellValue>& InValue) const override
{
if (InValue.IsSet())
{
const double Value = InValue.GetValue().Double;
if (Value == 0.0)
{
return FText::FromString(TEXT("0"));
}
else if (Value != TraceServices::FTaskInfo::InvalidTimestamp)
{
return FText::FromString(FString::Printf(TEXT("%f (%s)"), Value, *FormatTimeAuto(Value)));
}
}
return FText::FromString(TEXT("N/A"));
}
};
////////////////////////////////////////////////////////////////////////////////////////////////////
// FTaskTable
////////////////////////////////////////////////////////////////////////////////////////////////////
FTaskTable::FTaskTable()
{
}
////////////////////////////////////////////////////////////////////////////////////////////////////
FTaskTable::~FTaskTable()
{
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void FTaskTable::Reset()
{
FTable::Reset();
AddDefaultColumns();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void FTaskTable::AddDefaultColumns()
{
using namespace UE::Insights;
//////////////////////////////////////////////////
// Hierarchy Column
{
const int32 HierarchyColumnIndex = -1;
const TCHAR* HierarchyColumnName = nullptr;
AddHierarchyColumn(HierarchyColumnIndex, HierarchyColumnName);
const TSharedRef<FTableColumn>& ColumnRef = GetColumns()[0];
ColumnRef->SetInitialWidth(100.0f);
ColumnRef->SetShortName(LOCTEXT("TaskColumnName", "Hierarchy"));
ColumnRef->SetTitleName(LOCTEXT("TaskColumnTitle", "Task Hierarchy"));
ColumnRef->SetDescription(LOCTEXT("TaskColumnDesc", "Hierarchy of the task's tree"));
}
int32 ColumnIndex = 0;
//////////////////////////////////////////////////
// DebugName Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::DebugNameColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("DebugNameColumnName", "DebugName"));
Column.SetTitleName(LOCTEXT("DebugNameColumnTitle", "DebugName"));
Column.SetDescription(LOCTEXT("DebugNameColumnDesc", "DebugName"));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(200.0f);
Column.SetDataType(ETableCellDataType::CString);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetDebugName>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FCStringValueFormatterAsText>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByCStringValue>(ColumnRef);
Column.SetValueSorter(Sorter);
Column.SetAggregation(ETableColumnAggregation::SameValue);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Created Timestamp Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::CreatedTimestampColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("CreatedTimestampColumnName", "Created"));
Column.SetTitleName(LOCTEXT("CreatedTimestampColumnTitle", "Created"));
Column.SetDescription(LOCTEXT("CreatedTimestampColumnDesc", "The time when the task was created."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Double);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetCreatedTimestamp>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTaskDoubleValueFormatterAsTimeAuto>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
Column.SetValueSorter(Sorter);
Column.SetAggregation(ETableColumnAggregation::Min);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Created Thread Id Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::CreatedThreadIdColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("CreatedThreadIdColumnName", "Created Thread Id"));
Column.SetTitleName(LOCTEXT("CreatedThreadIdColumnTitle", "Created Thread Id"));
Column.SetDescription(LOCTEXT("CreatedThreadIdColumnDesc", "The thread the task was created on."));
Column.SetFlags(ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Int64);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetCreatedThreadId>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Launched Timestamp Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::LaunchedTimestampColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("LaunchedTimestampColumnName", "Launched"));
Column.SetTitleName(LOCTEXT("LaunchedTimestampColumnTitle", "Launched"));
Column.SetDescription(LOCTEXT("LaunchedTimestampColumnDesc", "The time when the task was Launched."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Double);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetLaunchedTimestamp>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTaskDoubleValueFormatterAsTimeAuto>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
Column.SetValueSorter(Sorter);
Column.SetAggregation(ETableColumnAggregation::Min);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Launched Thread Id Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::LaunchedThreadIdColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("LaunchedThreadIdColumnName", "Launched Thread Id"));
Column.SetTitleName(LOCTEXT("LaunchedThreadIdColumnTitle", "Launched Thread Id"));
Column.SetDescription(LOCTEXT("LaunchedThreadIdColumnDesc", "The thread the task was Launched on."));
Column.SetFlags(ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Int64);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetLaunchedThreadId>>();;
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Scheduled Timestamp Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::ScheduledTimestampColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("ScheduledTimestampColumnName", "Scheduled"));
Column.SetTitleName(LOCTEXT("ScheduledTimestampColumnTitle", "Scheduled"));
Column.SetDescription(LOCTEXT("ScheduledTimestampColumnDesc", "The time when the task was Scheduled."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Double);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetScheduledTimestamp>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTaskDoubleValueFormatterAsTimeAuto>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
Column.SetValueSorter(Sorter);
Column.SetAggregation(ETableColumnAggregation::Min);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Scheduled Thread Id Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::ScheduledThreadIdColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("ScheduledThreadIdColumnName", "Scheduled Thread Id"));
Column.SetTitleName(LOCTEXT("ScheduledThreadIdColumnTitle", "Scheduled Thread Id"));
Column.SetDescription(LOCTEXT("ScheduledThreadIdColumnDesc", "The thread the task was Scheduled on."));
Column.SetFlags(ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Int64);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetScheduledThreadId>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Started Timestamp Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::StartedTimestampColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("StartedTimestampColumnName", "Started"));
Column.SetTitleName(LOCTEXT("StartedTimestampColumnTitle", "Started"));
Column.SetDescription(LOCTEXT("StartedTimestampColumnDesc", "The time when the task was Started."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Double);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetStartedTimestamp>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTaskDoubleValueFormatterAsTimeAuto>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
Column.SetValueSorter(Sorter);
Column.SetAggregation(ETableColumnAggregation::Min);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Started Thread Id Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::StartedThreadIdColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("StartedThreadIdColumnName", "Started Thread Id"));
Column.SetTitleName(LOCTEXT("StartedThreadIdColumnTitle", "Started Thread Id"));
Column.SetDescription(LOCTEXT("StartedThreadIdColumnDesc", "The thread the task was Started on."));
Column.SetFlags(ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Int64);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetStartedThreadId>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Finished Timestamp Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::FinishedTimestampColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("FinishedTimestampColumnName", "Finished"));
Column.SetTitleName(LOCTEXT("FinishedTimestampColumnTitle", "Finished"));
Column.SetDescription(LOCTEXT("FinishedTimestampColumnDesc", "The time when the task was Finished."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Double);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetFinishedTimestamp>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTaskDoubleValueFormatterAsTimeAuto>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
Column.SetValueSorter(Sorter);
Column.SetAggregation(ETableColumnAggregation::Min);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Completed Timestamp Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::CompletedTimestampColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("CompletedTimestampColumnName", "Completed"));
Column.SetTitleName(LOCTEXT("CompletedTimestampColumnTitle", "Completed"));
Column.SetDescription(LOCTEXT("CompletedTimestampColumnDesc", "The time when the task was Completed."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Double);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetCompletedTimestamp>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTaskDoubleValueFormatterAsTimeAuto>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
Column.SetValueSorter(Sorter);
Column.SetAggregation(ETableColumnAggregation::Min);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Completed Thread Id Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::CompletedThreadIdColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("CompletedThreadIdColumnName", "Completed Thread Id"));
Column.SetTitleName(LOCTEXT("CompletedThreadIdColumnTitle", "Completed Thread Id"));
Column.SetDescription(LOCTEXT("CompletedThreadIdColumnDesc", "The thread the task was Completed on."));
Column.SetFlags(ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Int64);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetCompletedThreadId>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Destroyed Timestamp Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::DestroyedTimestampColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("DestroyedTimestampColumnName", "Destroyed"));
Column.SetTitleName(LOCTEXT("DestroyedTimestampColumnTitle", "Destroyed"));
Column.SetDescription(LOCTEXT("DestroyedTimestampColumnDesc", "The time when the task was Destroyed."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Double);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetDestroyedTimestamp>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTaskDoubleValueFormatterAsTimeAuto>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
Column.SetValueSorter(Sorter);
Column.SetAggregation(ETableColumnAggregation::Min);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Destroyed Thread Id Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::DestroyedThreadIdColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("DestroyedThreadIdColumnName", "Destroyed Thread Id"));
Column.SetTitleName(LOCTEXT("DestroyedThreadIdColumnTitle", "Destroyed Thread Id"));
Column.SetDescription(LOCTEXT("DestroyedThreadIdColumnDesc", "The thread the task was Destroyed on."));
Column.SetFlags(ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Int64);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetDestroyedThreadId>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Task Size Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::TaskSizeColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("TaskSizeColumnName", "Task Size"));
Column.SetTitleName(LOCTEXT("TaskSizeColumnTitle", "Task Size"));
Column.SetDescription(LOCTEXT("TaskSizeColumnDesc", "The size of the task including user-provided task body."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(60.0f);
Column.SetDataType(ETableCellDataType::Int64);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetTaskSize>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Num Parent Tasks Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::NumParentColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("ParentTasksColumnName", "Parent Tasks"));
Column.SetTitleName(LOCTEXT("ParentTasksColumnTitle", "Parent Tasks"));
Column.SetDescription(LOCTEXT("ParentTasksColumnDesc", "The number of parent tasks."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Int64);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetNumParents>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Num Nested Tasks Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::NumNestedColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("NestedTasksColumnName", "Nested Tasks"));
Column.SetTitleName(LOCTEXT("NestedTasksColumnTitle", "Nested Tasks"));
Column.SetDescription(LOCTEXT("NestedTasksColumnDesc", "The number of nested tasks."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Int64);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetNumNested>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Num Subsequents Tasks Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::NumSubsequentsColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("SubsequentTasksColumnName", "Subsequent Tasks"));
Column.SetTitleName(LOCTEXT("SubsequentTasksColumnTitle", "Subsequent Tasks"));
Column.SetDescription(LOCTEXT("SubsequentTasksColumnDesc", "The number of Subsequent tasks."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Int64);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetNumSubsequents>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
AddColumn(ColumnRef);
}
//////////////////////////////////////////////////
// Num Prerequisites Tasks Column
{
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FTaskTableColumns::NumPrerequisitesColumnId);
FTableColumn& Column = *ColumnRef;
Column.SetIndex(ColumnIndex++);
Column.SetShortName(LOCTEXT("PrerequisiteTasksColumnName", "Prerequisite Tasks"));
Column.SetTitleName(LOCTEXT("PrerequisiteTasksColumnTitle", "Prerequisite Tasks"));
Column.SetDescription(LOCTEXT("PrerequisiteTasksColumnDesc", "The number of Prerequisite tasks."));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeHidden | ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Int64);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetNumPrerequisites>>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
AddColumn(ColumnRef);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void FTaskTable::SwitchToAbsoluteTimestamps()
{
FindColumnChecked(FTaskTableColumns::LaunchedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetLaunchedTimestamp>>());
FindColumnChecked(FTaskTableColumns::ScheduledTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetScheduledTimestamp>>());
FindColumnChecked(FTaskTableColumns::StartedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetStartedTimestamp>>());
FindColumnChecked(FTaskTableColumns::FinishedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetFinishedTimestamp>>());
FindColumnChecked(FTaskTableColumns::CompletedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetCompletedTimestamp>>());
FindColumnChecked(FTaskTableColumns::DestroyedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<DefaultTaskFieldGetterFuncts::GetDestroyedTimestamp>>());
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void FTaskTable::SwitchToRelativeToPreviousTimestamps()
{
FindColumnChecked(FTaskTableColumns::LaunchedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToPreviousTaskFieldGetterFuncts::GetLaunchedTimestamp>>());
FindColumnChecked(FTaskTableColumns::ScheduledTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToPreviousTaskFieldGetterFuncts::GetScheduledTimestamp>>());
FindColumnChecked(FTaskTableColumns::StartedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToPreviousTaskFieldGetterFuncts::GetStartedTimestamp>>());
FindColumnChecked(FTaskTableColumns::FinishedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToPreviousTaskFieldGetterFuncts::GetFinishedTimestamp>>());
FindColumnChecked(FTaskTableColumns::CompletedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToPreviousTaskFieldGetterFuncts::GetCompletedTimestamp>>());
FindColumnChecked(FTaskTableColumns::DestroyedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToPreviousTaskFieldGetterFuncts::GetDestroyedTimestamp>>());
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void FTaskTable::SwitchToRelativeToCreatedTimestamps()
{
FindColumnChecked(FTaskTableColumns::LaunchedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToCreatedTaskFieldGetterFuncts::GetLaunchedTimestamp>>());
FindColumnChecked(FTaskTableColumns::ScheduledTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToCreatedTaskFieldGetterFuncts::GetScheduledTimestamp>>());
FindColumnChecked(FTaskTableColumns::StartedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToCreatedTaskFieldGetterFuncts::GetStartedTimestamp>>());
FindColumnChecked(FTaskTableColumns::FinishedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToCreatedTaskFieldGetterFuncts::GetFinishedTimestamp>>());
FindColumnChecked(FTaskTableColumns::CompletedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToCreatedTaskFieldGetterFuncts::GetCompletedTimestamp>>());
FindColumnChecked(FTaskTableColumns::DestroyedTimestampColumnId)->SetValueGetter(MakeShared<FTaskColumnValueGetter<RelativeToCreatedTaskFieldGetterFuncts::GetDestroyedTimestamp>>());
}
////////////////////////////////////////////////////////////////////////////////////////////////////
} // namespace UE::Insights::TaskGraphProfiler
#undef LOCTEXT_NAMESPACE