Commit 489f2c83 by Jamie Madill Committed by Commit Bot

Perf Tests: Trace multiple threads.

This uses a little helper list to map thread IDs into simple serials that we output as 'tid' in our trace JSON file. We can use this to analyze the behaviour of the command processor thread. Bug: b/172704839 Change-Id: Ic1b5f3ec8427cb310833d1f589503daec4812681 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2524542 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCody Northrop <cnorthrop@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 2e74c452
...@@ -92,8 +92,11 @@ angle::TraceEventHandle AddPerfTraceEvent(angle::PlatformMethods *platform, ...@@ -92,8 +92,11 @@ angle::TraceEventHandle AddPerfTraceEvent(angle::PlatformMethods *platform,
const TraceCategory *category = reinterpret_cast<const TraceCategory *>(categoryEnabledFlag); const TraceCategory *category = reinterpret_cast<const TraceCategory *>(categoryEnabledFlag);
ANGLERenderTest *renderTest = static_cast<ANGLERenderTest *>(platform->context); ANGLERenderTest *renderTest = static_cast<ANGLERenderTest *>(platform->context);
uint32_t tid = renderTest->getCurrentThreadSerial();
std::vector<TraceEvent> &buffer = renderTest->getTraceEventBuffer(); std::vector<TraceEvent> &buffer = renderTest->getTraceEventBuffer();
buffer.emplace_back(phase, category->name, name, timestamp); buffer.emplace_back(phase, category->name, name, timestamp, tid);
return buffer.size(); return buffer.size();
} }
...@@ -173,7 +176,7 @@ void DumpTraceEventsToJSONFile(const std::vector<TraceEvent> &traceEvents, ...@@ -173,7 +176,7 @@ void DumpTraceEventsToJSONFile(const std::vector<TraceEvent> &traceEvents,
value.AddMember("ph", std::string(1, traceEvent.phase), allocator); value.AddMember("ph", std::string(1, traceEvent.phase), allocator);
value.AddMember("ts", microseconds, allocator); value.AddMember("ts", microseconds, allocator);
value.AddMember("pid", pidName, allocator); value.AddMember("pid", pidName, allocator);
value.AddMember("tid", 1, allocator); value.AddMember("tid", traceEvent.tid, allocator);
events.PushBack(value, allocator); events.PushBack(value, allocator);
} }
...@@ -194,8 +197,9 @@ void DumpTraceEventsToJSONFile(const std::vector<TraceEvent> &traceEvents, ...@@ -194,8 +197,9 @@ void DumpTraceEventsToJSONFile(const std::vector<TraceEvent> &traceEvents,
TraceEvent::TraceEvent(char phaseIn, TraceEvent::TraceEvent(char phaseIn,
const char *categoryNameIn, const char *categoryNameIn,
const char *nameIn, const char *nameIn,
double timestampIn) double timestampIn,
: phase(phaseIn), categoryName(categoryNameIn), name{}, timestamp(timestampIn), tid(1) uint32_t tidIn)
: phase(phaseIn), categoryName(categoryNameIn), name{}, timestamp(timestampIn), tid(tidIn)
{ {
ASSERT(strlen(nameIn) < kMaxNameLen); ASSERT(strlen(nameIn) < kMaxNameLen);
strcpy(name, nameIn); strcpy(name, nameIn);
...@@ -745,7 +749,8 @@ void ANGLERenderTest::beginInternalTraceEvent(const char *name) ...@@ -745,7 +749,8 @@ void ANGLERenderTest::beginInternalTraceEvent(const char *name)
if (gEnableTrace) if (gEnableTrace)
{ {
mTraceEventBuffer.emplace_back(TRACE_EVENT_PHASE_BEGIN, gTraceCategories[0].name, name, mTraceEventBuffer.emplace_back(TRACE_EVENT_PHASE_BEGIN, gTraceCategories[0].name, name,
MonotonicallyIncreasingTime(&mPlatformMethods)); MonotonicallyIncreasingTime(&mPlatformMethods),
getCurrentThreadSerial());
} }
} }
...@@ -754,7 +759,8 @@ void ANGLERenderTest::endInternalTraceEvent(const char *name) ...@@ -754,7 +759,8 @@ void ANGLERenderTest::endInternalTraceEvent(const char *name)
if (gEnableTrace) if (gEnableTrace)
{ {
mTraceEventBuffer.emplace_back(TRACE_EVENT_PHASE_END, gTraceCategories[0].name, name, mTraceEventBuffer.emplace_back(TRACE_EVENT_PHASE_END, gTraceCategories[0].name, name,
MonotonicallyIncreasingTime(&mPlatformMethods)); MonotonicallyIncreasingTime(&mPlatformMethods),
getCurrentThreadSerial());
} }
} }
...@@ -763,7 +769,7 @@ void ANGLERenderTest::beginGLTraceEvent(const char *name, double hostTimeSec) ...@@ -763,7 +769,7 @@ void ANGLERenderTest::beginGLTraceEvent(const char *name, double hostTimeSec)
if (gEnableTrace) if (gEnableTrace)
{ {
mTraceEventBuffer.emplace_back(TRACE_EVENT_PHASE_BEGIN, gTraceCategories[1].name, name, mTraceEventBuffer.emplace_back(TRACE_EVENT_PHASE_BEGIN, gTraceCategories[1].name, name,
hostTimeSec); hostTimeSec, getCurrentThreadSerial());
} }
} }
...@@ -772,7 +778,7 @@ void ANGLERenderTest::endGLTraceEvent(const char *name, double hostTimeSec) ...@@ -772,7 +778,7 @@ void ANGLERenderTest::endGLTraceEvent(const char *name, double hostTimeSec)
if (gEnableTrace) if (gEnableTrace)
{ {
mTraceEventBuffer.emplace_back(TRACE_EVENT_PHASE_END, gTraceCategories[1].name, name, mTraceEventBuffer.emplace_back(TRACE_EVENT_PHASE_END, gTraceCategories[1].name, name,
hostTimeSec); hostTimeSec, getCurrentThreadSerial());
} }
} }
...@@ -918,6 +924,22 @@ void ANGLERenderTest::onErrorMessage(const char *errorMessage) ...@@ -918,6 +924,22 @@ void ANGLERenderTest::onErrorMessage(const char *errorMessage)
FAIL() << "Failing test because of unexpected internal ANGLE error:\n" << errorMessage << "\n"; FAIL() << "Failing test because of unexpected internal ANGLE error:\n" << errorMessage << "\n";
} }
uint32_t ANGLERenderTest::getCurrentThreadSerial()
{
std::thread::id id = std::this_thread::get_id();
for (uint32_t serial = 0; serial < static_cast<uint32_t>(mThreadIDs.size()); ++serial)
{
if (mThreadIDs[serial] == id)
{
return serial + 1;
}
}
mThreadIDs.push_back(id);
return static_cast<uint32_t>(mThreadIDs.size());
}
namespace angle namespace angle
{ {
double GetHostTimeSeconds() double GetHostTimeSeconds()
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <string> #include <string>
#include <thread>
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
...@@ -43,7 +44,11 @@ class Event; ...@@ -43,7 +44,11 @@ class Event;
struct TraceEvent final struct TraceEvent final
{ {
TraceEvent() {} TraceEvent() {}
TraceEvent(char phaseIn, const char *categoryNameIn, const char *nameIn, double timestampIn); TraceEvent(char phaseIn,
const char *categoryNameIn,
const char *nameIn,
double timestampIn,
uint32_t tidIn);
static constexpr uint32_t kMaxNameLen = 64; static constexpr uint32_t kMaxNameLen = 64;
...@@ -165,6 +170,8 @@ class ANGLERenderTest : public ANGLEPerfTest ...@@ -165,6 +170,8 @@ class ANGLERenderTest : public ANGLEPerfTest
virtual void overrideWorkaroundsD3D(angle::FeaturesD3D *featuresD3D) {} virtual void overrideWorkaroundsD3D(angle::FeaturesD3D *featuresD3D) {}
void onErrorMessage(const char *errorMessage); void onErrorMessage(const char *errorMessage);
uint32_t getCurrentThreadSerial();
protected: protected:
const RenderTestParams &mTestParams; const RenderTestParams &mTestParams;
...@@ -215,6 +222,8 @@ class ANGLERenderTest : public ANGLEPerfTest ...@@ -215,6 +222,8 @@ class ANGLERenderTest : public ANGLEPerfTest
// Handle to the entry point binding library. // Handle to the entry point binding library.
std::unique_ptr<angle::Library> mEntryPointsLib; std::unique_ptr<angle::Library> mEntryPointsLib;
std::vector<std::thread::id> mThreadIDs;
}; };
// Mixins. // Mixins.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment