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)
{
mNumStepsPerformed = 0;
mRunning = true;
mGPUTimeNs = 0;
mTimer.start();
startTest();
......@@ -267,6 +268,7 @@ void ANGLEPerfTest::doRunLoop(double maxRunTime)
}
finishTest();
mTimer.stop();
computeGPUTime();
}
void ANGLEPerfTest::SetUp() {}
......@@ -723,7 +725,8 @@ void ANGLERenderTest::startGpuTimer()
{
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()
{
if (mTestParams.trackGpuTime && mIsTimestampQueryAvailable)
{
glEndQueryEXT(GL_TIME_ELAPSED_EXT);
uint64_t gpuTimeNs = 0;
glGetQueryObjectui64vEXT(mTimestampQuery, GL_QUERY_RESULT_EXT, &gpuTimeNs);
mGPUTimeNs += gpuTimeNs;
GLuint endQuery = 0;
glGenQueriesEXT(1, &endQuery);
glQueryCounterEXT(endQuery, GL_TIMESTAMP_EXT);
mTimestampQueries.push_back({mCurrentTimestampBeginQuery, endQuery});
}
}
void ANGLERenderTest::startTest()
void ANGLERenderTest::computeGPUTime()
{
if (mTestParams.trackGpuTime)
if (mTestParams.trackGpuTime && mIsTimestampQueryAvailable)
{
glGenQueriesEXT(1, &mTimestampQuery);
mGPUTimeNs = 0;
for (const TimestampSample &sample : mTimestampQueries)
{
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()
{
if (mTestParams.trackGpuTime)
{
glDeleteQueriesEXT(1, &mTimestampQuery);
}
if (mTestParams.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
{
glFinish();
......
......@@ -87,6 +87,7 @@ class ANGLEPerfTest : public testing::Test, angle::NonCopyable
// Overriden in trace perf tests.
virtual void saveScreenshot(const std::string &screenshotName) {}
virtual void computeGPUTime() {}
double printResults();
void calibrateStepsToRun();
......@@ -155,6 +156,7 @@ class ANGLERenderTest : public ANGLEPerfTest
void startGpuTimer();
void stopGpuTimer();
void getGpuTimers();
void beginInternalTraceEvent(const char *name);
void endInternalTraceEvent(const char *name);
......@@ -172,6 +174,7 @@ class ANGLERenderTest : public ANGLEPerfTest
void step() override;
void startTest() override;
void finishTest() override;
void computeGPUTime() override;
bool areExtensionPrerequisitesFulfilled() const;
......@@ -182,7 +185,14 @@ class ANGLERenderTest : public ANGLEPerfTest
ConfigParameters mConfigParams;
bool mSwapEnabled;
GLuint mTimestampQuery;
struct TimestampSample
{
GLuint beginQuery;
GLuint endQuery;
};
GLuint mCurrentTimestampBeginQuery = 0;
std::vector<TimestampSample> mTimestampQueries;
// Trace event record that can be output.
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