Commit bba8daea by Jamie Madill Committed by Commit Bot

Perf Tests: Use timestamp queries for GPU time.

Testing shows that using timestamp queries and deferring the query get calls until after the frame produces little overhead. Also this fixes a missing GPU time reset between iterations. Bug: angleproject:4879 Change-Id: I2a566548add1536aab689cd969594a15f0628da3 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2321573Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarCody Northrop <cnorthrop@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 07cdf421
...@@ -246,6 +246,7 @@ void ANGLEPerfTest::doRunLoop(double maxRunTime) ...@@ -246,6 +246,7 @@ void ANGLEPerfTest::doRunLoop(double maxRunTime)
{ {
mNumStepsPerformed = 0; mNumStepsPerformed = 0;
mRunning = true; mRunning = true;
mGPUTimeNs = 0;
mTimer.start(); mTimer.start();
startTest(); startTest();
...@@ -267,6 +268,7 @@ void ANGLEPerfTest::doRunLoop(double maxRunTime) ...@@ -267,6 +268,7 @@ void ANGLEPerfTest::doRunLoop(double maxRunTime)
} }
finishTest(); finishTest();
mTimer.stop(); mTimer.stop();
computeGPUTime();
} }
void ANGLEPerfTest::SetUp() {} void ANGLEPerfTest::SetUp() {}
...@@ -723,7 +725,8 @@ void ANGLERenderTest::startGpuTimer() ...@@ -723,7 +725,8 @@ void ANGLERenderTest::startGpuTimer()
{ {
if (mTestParams.trackGpuTime && mIsTimestampQueryAvailable) if (mTestParams.trackGpuTime && mIsTimestampQueryAvailable)
{ {
glBeginQueryEXT(GL_TIME_ELAPSED_EXT, mTimestampQuery); glGenQueriesEXT(1, &mCurrentTimestampBeginQuery);
glQueryCounterEXT(mCurrentTimestampBeginQuery, GL_TIMESTAMP_EXT);
} }
} }
...@@ -731,29 +734,36 @@ void ANGLERenderTest::stopGpuTimer() ...@@ -731,29 +734,36 @@ void ANGLERenderTest::stopGpuTimer()
{ {
if (mTestParams.trackGpuTime && mIsTimestampQueryAvailable) if (mTestParams.trackGpuTime && mIsTimestampQueryAvailable)
{ {
glEndQueryEXT(GL_TIME_ELAPSED_EXT); GLuint endQuery = 0;
uint64_t gpuTimeNs = 0; glGenQueriesEXT(1, &endQuery);
glGetQueryObjectui64vEXT(mTimestampQuery, GL_QUERY_RESULT_EXT, &gpuTimeNs); glQueryCounterEXT(endQuery, GL_TIMESTAMP_EXT);
mTimestampQueries.push_back({mCurrentTimestampBeginQuery, endQuery});
mGPUTimeNs += gpuTimeNs;
} }
} }
void ANGLERenderTest::startTest() void ANGLERenderTest::computeGPUTime()
{ {
if (mTestParams.trackGpuTime) if (mTestParams.trackGpuTime && mIsTimestampQueryAvailable)
{ {
glGenQueriesEXT(1, &mTimestampQuery); for (const TimestampSample &sample : mTimestampQueries)
mGPUTimeNs = 0; {
uint64_t beginGLTimeNs = 0;
uint64_t endGLTimeNs = 0;
glGetQueryObjectui64vEXT(sample.beginQuery, GL_QUERY_RESULT_EXT, &beginGLTimeNs);
glGetQueryObjectui64vEXT(sample.endQuery, GL_QUERY_RESULT_EXT, &endGLTimeNs);
glDeleteQueriesEXT(1, &sample.beginQuery);
glDeleteQueriesEXT(1, &sample.endQuery);
mGPUTimeNs += endGLTimeNs - beginGLTimeNs;
}
mTimestampQueries.clear();
} }
} }
void ANGLERenderTest::startTest() {}
void ANGLERenderTest::finishTest() void ANGLERenderTest::finishTest()
{ {
if (mTestParams.trackGpuTime)
{
glDeleteQueriesEXT(1, &mTimestampQuery);
}
if (mTestParams.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE) if (mTestParams.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
{ {
glFinish(); glFinish();
......
...@@ -87,6 +87,7 @@ class ANGLEPerfTest : public testing::Test, angle::NonCopyable ...@@ -87,6 +87,7 @@ class ANGLEPerfTest : public testing::Test, angle::NonCopyable
// Overriden in trace perf tests. // Overriden in trace perf tests.
virtual void saveScreenshot(const std::string &screenshotName) {} virtual void saveScreenshot(const std::string &screenshotName) {}
virtual void computeGPUTime() {}
double printResults(); double printResults();
void calibrateStepsToRun(); void calibrateStepsToRun();
...@@ -155,6 +156,7 @@ class ANGLERenderTest : public ANGLEPerfTest ...@@ -155,6 +156,7 @@ class ANGLERenderTest : public ANGLEPerfTest
void startGpuTimer(); void startGpuTimer();
void stopGpuTimer(); void stopGpuTimer();
void getGpuTimers();
void beginInternalTraceEvent(const char *name); void beginInternalTraceEvent(const char *name);
void endInternalTraceEvent(const char *name); void endInternalTraceEvent(const char *name);
...@@ -172,6 +174,7 @@ class ANGLERenderTest : public ANGLEPerfTest ...@@ -172,6 +174,7 @@ class ANGLERenderTest : public ANGLEPerfTest
void step() override; void step() override;
void startTest() override; void startTest() override;
void finishTest() override; void finishTest() override;
void computeGPUTime() override;
bool areExtensionPrerequisitesFulfilled() const; bool areExtensionPrerequisitesFulfilled() const;
...@@ -182,7 +185,14 @@ class ANGLERenderTest : public ANGLEPerfTest ...@@ -182,7 +185,14 @@ class ANGLERenderTest : public ANGLEPerfTest
ConfigParameters mConfigParams; ConfigParameters mConfigParams;
bool mSwapEnabled; bool mSwapEnabled;
GLuint mTimestampQuery; struct TimestampSample
{
GLuint beginQuery;
GLuint endQuery;
};
GLuint mCurrentTimestampBeginQuery = 0;
std::vector<TimestampSample> mTimestampQueries;
// Trace event record that can be output. // Trace event record that can be output.
std::vector<TraceEvent> mTraceEventBuffer; std::vector<TraceEvent> mTraceEventBuffer;
......
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