summaryrefslogtreecommitdiffstats
path: root/gfx/angle/src/tests/perf_tests/ANGLEPerfTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/src/tests/perf_tests/ANGLEPerfTest.cpp')
-rwxr-xr-xgfx/angle/src/tests/perf_tests/ANGLEPerfTest.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/gfx/angle/src/tests/perf_tests/ANGLEPerfTest.cpp b/gfx/angle/src/tests/perf_tests/ANGLEPerfTest.cpp
new file mode 100755
index 000000000..e7c74370d
--- /dev/null
+++ b/gfx/angle/src/tests/perf_tests/ANGLEPerfTest.cpp
@@ -0,0 +1,194 @@
+//
+// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// ANGLEPerfTests:
+// Base class for google test performance tests
+//
+
+#include "ANGLEPerfTest.h"
+
+#include "third_party/perf/perf_test.h"
+
+#include <cassert>
+#include <cmath>
+#include <iostream>
+
+ANGLEPerfTest::ANGLEPerfTest(const std::string &name, const std::string &suffix)
+ : mName(name),
+ mSuffix(suffix),
+ mTimer(nullptr),
+ mRunTimeSeconds(5.0),
+ mNumStepsPerformed(0),
+ mRunning(true)
+{
+ mTimer = CreateTimer();
+}
+
+ANGLEPerfTest::~ANGLEPerfTest()
+{
+ SafeDelete(mTimer);
+}
+
+void ANGLEPerfTest::run()
+{
+ mTimer->start();
+ while (mRunning)
+ {
+ step();
+ if (mRunning)
+ {
+ ++mNumStepsPerformed;
+ }
+ if (mTimer->getElapsedTime() > mRunTimeSeconds)
+ {
+ mRunning = false;
+ }
+ }
+ finishTest();
+ mTimer->stop();
+}
+
+void ANGLEPerfTest::printResult(const std::string &trace, double value, const std::string &units, bool important) const
+{
+ perf_test::PrintResult(mName, mSuffix, trace, value, units, important);
+}
+
+void ANGLEPerfTest::printResult(const std::string &trace, size_t value, const std::string &units, bool important) const
+{
+ perf_test::PrintResult(mName, mSuffix, trace, value, units, important);
+}
+
+void ANGLEPerfTest::SetUp()
+{
+}
+
+void ANGLEPerfTest::TearDown()
+{
+ double relativeScore = static_cast<double>(mNumStepsPerformed) / mTimer->getElapsedTime();
+ printResult("score", static_cast<size_t>(std::round(relativeScore)), "score", true);
+}
+
+double ANGLEPerfTest::normalizedTime(size_t value) const
+{
+ return static_cast<double>(value) / static_cast<double>(mNumStepsPerformed);
+}
+
+std::string RenderTestParams::suffix() const
+{
+ switch (getRenderer())
+ {
+ case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
+ return "_d3d11";
+ case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE:
+ return "_d3d9";
+ case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE:
+ return "_gl";
+ case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
+ return "_gles";
+ case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
+ return "_default";
+ default:
+ assert(0);
+ return "_unk";
+ }
+}
+
+ANGLERenderTest::ANGLERenderTest(const std::string &name, const RenderTestParams &testParams)
+ : ANGLEPerfTest(name, testParams.suffix()),
+ mTestParams(testParams),
+ mEGLWindow(nullptr),
+ mOSWindow(nullptr)
+{
+}
+
+ANGLERenderTest::~ANGLERenderTest()
+{
+ SafeDelete(mOSWindow);
+ SafeDelete(mEGLWindow);
+}
+
+void ANGLERenderTest::SetUp()
+{
+ mOSWindow = CreateOSWindow();
+ mEGLWindow = new EGLWindow(mTestParams.majorVersion, mTestParams.minorVersion,
+ mTestParams.eglParameters);
+ mEGLWindow->setSwapInterval(0);
+
+ if (!mOSWindow->initialize(mName, mTestParams.windowWidth, mTestParams.windowHeight))
+ {
+ FAIL() << "Failed initializing OSWindow";
+ return;
+ }
+
+ if (!mEGLWindow->initializeGL(mOSWindow))
+ {
+ FAIL() << "Failed initializing EGLWindow";
+ return;
+ }
+
+ initializeBenchmark();
+
+ ANGLEPerfTest::SetUp();
+}
+
+void ANGLERenderTest::TearDown()
+{
+ ANGLEPerfTest::TearDown();
+
+ destroyBenchmark();
+
+ mEGLWindow->destroyGL();
+ mOSWindow->destroy();
+}
+
+void ANGLERenderTest::step()
+{
+ // Clear events that the application did not process from this frame
+ Event event;
+ bool closed = false;
+ while (popEvent(&event))
+ {
+ // If the application did not catch a close event, close now
+ if (event.Type == Event::EVENT_CLOSED)
+ {
+ closed = true;
+ }
+ }
+
+ if (closed)
+ {
+ abortTest();
+ }
+ else
+ {
+ drawBenchmark();
+ // Swap is needed so that the GPU driver will occasionally flush its internal command queue
+ // to the GPU. The null device benchmarks are only testing CPU overhead, so they don't need
+ // to swap.
+ if (mTestParams.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
+ {
+ mEGLWindow->swap();
+ }
+ mOSWindow->messageLoop();
+ }
+}
+
+void ANGLERenderTest::finishTest()
+{
+ if (mTestParams.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
+ {
+ glFinish();
+ }
+}
+
+bool ANGLERenderTest::popEvent(Event *event)
+{
+ return mOSWindow->popEvent(event);
+}
+
+OSWindow *ANGLERenderTest::getWindow()
+{
+ return mOSWindow;
+}