540 lines
12 KiB
C++
540 lines
12 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "API.h"
|
|
#include "AutoRTFMTesting.h"
|
|
#include "Catch2Includes.h"
|
|
#include "CoreTypes.h"
|
|
#include "ProfilingDebugging/CpuProfilerTrace.h"
|
|
#include "Trace/Trace.h"
|
|
#include "Trace/Trace.inl"
|
|
|
|
UE_TRACE_CHANNEL_DEFINE(AutoRTFMInsightsChannel)
|
|
|
|
struct AutoRTFMInsightsDeferer final
|
|
{
|
|
explicit AutoRTFMInsightsDeferer(UE::Trace::FChannel& InChannel) : Channel(InChannel), bWasEnabled(InChannel)
|
|
{
|
|
Channel.Toggle(true);
|
|
}
|
|
|
|
~AutoRTFMInsightsDeferer()
|
|
{
|
|
Channel.Toggle(bWasEnabled);
|
|
}
|
|
|
|
private:
|
|
UE::Trace::FChannel& Channel;
|
|
const bool bWasEnabled;
|
|
};
|
|
|
|
UE_TRACE_EVENT_BEGIN(Cpu, SomeTraceEvent)
|
|
UE_TRACE_EVENT_FIELD(int32, Foo)
|
|
UE_TRACE_EVENT_END()
|
|
|
|
UE_TRACE_EVENT_BEGIN(Cpu, SomeNoSyncTraceEvent, NoSync)
|
|
UE_TRACE_EVENT_FIELD(int32, Foo)
|
|
UE_TRACE_EVENT_END()
|
|
|
|
UE_TRACE_EVENT_BEGIN(Cpu, SomeImportantTraceEvent, NoSync | Important)
|
|
UE_TRACE_EVENT_FIELD(int32, Foo)
|
|
UE_TRACE_EVENT_END()
|
|
|
|
TEST_CASE("Insights")
|
|
{
|
|
#if CPUPROFILERTRACE_ENABLED
|
|
AutoRTFMInsightsDeferer Cpu(CpuChannel);
|
|
REQUIRE(UE_TRACE_CHANNELEXPR_IS_ENABLED(CpuChannel));
|
|
#endif
|
|
|
|
AutoRTFMInsightsDeferer AutoRTFMInsights(AutoRTFMInsightsChannel);
|
|
REQUIRE(UE_TRACE_CHANNELEXPR_IS_ENABLED(AutoRTFMInsightsChannel));
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_DECLARE")
|
|
{
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_DECLARE(SomeEvent);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_DECLARE(SomeEvent);
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_USE")
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_DECLARE(SomeEvent);
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_USE(SomeEvent, ANSI_TO_TCHAR("Wowwee"), _, false);
|
|
});
|
|
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_USE(SomeEvent, ANSI_TO_TCHAR("Wowwee"), _, true);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_USE(SomeEvent, ANSI_TO_TCHAR("Wowwee"), _, true);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_USE(SomeEvent, ANSI_TO_TCHAR("Wowwee"), _, true);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_USE")
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_DECLARE(SomeEvent);
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_USE_ON_CHANNEL(SomeEvent, ANSI_TO_TCHAR("Wowwee"), _, AutoRTFMInsightsChannel, false);
|
|
});
|
|
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_USE_ON_CHANNEL(SomeEvent, ANSI_TO_TCHAR("Wowwee"), _, AutoRTFMInsightsChannel, true);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_USE_ON_CHANNEL(SomeEvent, ANSI_TO_TCHAR("Wowwee"), _, AutoRTFMInsightsChannel, true);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_USE_ON_CHANNEL(SomeEvent, ANSI_TO_TCHAR("Wowwee"), _, AutoRTFMInsightsChannel, true);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_STR")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_STR(ANSI_TO_TCHAR("Wowwee"));
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_STR(ANSI_TO_TCHAR("Wowwee"));
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_STR(ANSI_TO_TCHAR("Wowwee"));
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_STR_CONDITIONAL")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_STR_CONDITIONAL(ANSI_TO_TCHAR("Wowwee"), false);
|
|
});
|
|
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_STR_CONDITIONAL(ANSI_TO_TCHAR("Wowwee"), true);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_STR_CONDITIONAL(ANSI_TO_TCHAR("Wowwee"), true);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_STR_CONDITIONAL(ANSI_TO_TCHAR("Wowwee"), true);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_STR")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_STR(ANSI_TO_TCHAR("Wowwee"), AutoRTFMInsightsChannel);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_STR(ANSI_TO_TCHAR("Wowwee"), AutoRTFMInsightsChannel);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_STR(ANSI_TO_TCHAR("Wowwee"), AutoRTFMInsightsChannel);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_STR_CONDITIONAL")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_STR_CONDITIONAL(ANSI_TO_TCHAR("Wowwee"), AutoRTFMInsightsChannel, false);
|
|
});
|
|
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_STR_CONDITIONAL(ANSI_TO_TCHAR("Wowwee"), AutoRTFMInsightsChannel, true);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_STR_CONDITIONAL(ANSI_TO_TCHAR("Wowwee"), AutoRTFMInsightsChannel, true);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_STR_CONDITIONAL(ANSI_TO_TCHAR("Wowwee"), AutoRTFMInsightsChannel, true);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE(Wowwee);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE(Wowwee);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE(Wowwee);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_CONDITIONAL")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_CONDITIONAL(Wowwee, false);
|
|
});
|
|
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_CONDITIONAL(Wowwee, true);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_CONDITIONAL(Wowwee, true);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_CONDITIONAL(Wowwee, true);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL(Wowwee, AutoRTFMInsightsChannel);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL(Wowwee, AutoRTFMInsightsChannel);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL(Wowwee, AutoRTFMInsightsChannel);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_CONDITIONAL")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_CONDITIONAL(Wowwee, AutoRTFMInsightsChannel, false);
|
|
});
|
|
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_CONDITIONAL(Wowwee, AutoRTFMInsightsChannel, true);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_CONDITIONAL(Wowwee, AutoRTFMInsightsChannel, true);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_CONDITIONAL(Wowwee, AutoRTFMInsightsChannel, true);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_TEXT")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
FString Name("Wowwee");
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_TEXT(*Name);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
FString Name("Wowwee");
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_TEXT(*Name);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
FString Name("Wowwee");
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_TEXT(*Name);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_TEXT_ON_CHANNEL")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
FString Name("Wowwee");
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_TEXT_ON_CHANNEL(*Name, AutoRTFMInsightsChannel);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
FString Name("Wowwee");
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_TEXT_ON_CHANNEL(*Name, AutoRTFMInsightsChannel);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
FString Name("Wowwee");
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_TEXT_ON_CHANNEL(*Name, AutoRTFMInsightsChannel);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_SCOPE_TEXT_ON_CHANNEL_CONDITIONAL")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
FString Name("Wowwee");
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_TEXT_ON_CHANNEL_CONDITIONAL(*Name, AutoRTFMInsightsChannel, false);
|
|
});
|
|
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
FString Name("Wowwee");
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_TEXT_ON_CHANNEL_CONDITIONAL(*Name, AutoRTFMInsightsChannel, true);
|
|
});
|
|
|
|
SECTION("In a child transaction")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
FString Name("Wowwee");
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_TEXT_ON_CHANNEL_CONDITIONAL(*Name, AutoRTFMInsightsChannel, true);
|
|
});
|
|
});
|
|
}
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
FString Name("Wowwee");
|
|
TRACE_CPUPROFILER_EVENT_SCOPE_TEXT_ON_CHANNEL_CONDITIONAL(*Name, AutoRTFMInsightsChannel, true);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_FLUSH")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_FLUSH();
|
|
});
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_FLUSH();
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_MANUAL_IS_ENABLED")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_MANUAL_IS_ENABLED();
|
|
});
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_MANUAL_IS_ENABLED();
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
SECTION("TRACE_CPUPROFILER_EVENT_MANUAL_START + TRACE_CPUPROFILER_EVENT_MANUAL_END")
|
|
{
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_MANUAL_START(TEXT("Wowwee"));
|
|
TRACE_CPUPROFILER_EVENT_MANUAL_END();
|
|
});
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_MANUAL_START(TEXT("Wowwee"));
|
|
TRACE_CPUPROFILER_EVENT_MANUAL_END();
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
TRACE_CPUPROFILER_EVENT_MANUAL_START(TEXT("Wowwee"));
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
}
|
|
|
|
#if CPUPROFILERTRACE_ENABLED
|
|
// Some number over 10000 to force allocations.
|
|
constexpr unsigned Iterations = 16384;
|
|
SECTION("UE_TRACE_LOG_SCOPED_T")
|
|
{
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
UE_TRACE_LOG_SCOPED_T(Cpu, SomeTraceEvent, CpuChannel) << SomeTraceEvent.Foo(42);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
for (int Index = 0; Index < Iterations; Index++)
|
|
{
|
|
UE_TRACE_LOG_SCOPED_T(Cpu, SomeTraceEvent, CpuChannel) << SomeTraceEvent.Foo(42);
|
|
}
|
|
});
|
|
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
UE_TRACE_LOG_SCOPED_T(Cpu, SomeNoSyncTraceEvent, CpuChannel) << SomeNoSyncTraceEvent.Foo(42);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
for (int Index = 0; Index < Iterations; Index++)
|
|
{
|
|
UE_TRACE_LOG_SCOPED_T(Cpu, SomeNoSyncTraceEvent, CpuChannel) << SomeNoSyncTraceEvent.Foo(42);
|
|
}
|
|
});
|
|
}
|
|
|
|
SECTION("UE_TRACE_LOG")
|
|
{
|
|
AutoRTFM::Testing::Abort([&]
|
|
{
|
|
UE_TRACE_LOG(Cpu, SomeImportantTraceEvent, CpuChannel) << SomeImportantTraceEvent.Foo(42);
|
|
AutoRTFM::AbortTransaction();
|
|
});
|
|
|
|
AutoRTFM::Testing::Commit([&]
|
|
{
|
|
for (int Index = 0; Index < Iterations; Index++)
|
|
{
|
|
UE_TRACE_LOG(Cpu, SomeImportantTraceEvent, CpuChannel) << SomeImportantTraceEvent.Foo(42);
|
|
}
|
|
});
|
|
}
|
|
#endif
|
|
}
|