| // |
| // 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. |
| // |
| // DrawCallPerf: |
| // Performance tests for ANGLE draw call overhead. |
| // |
| |
| #include "ANGLEPerfTest.h" |
| #include "DrawCallPerfParams.h" |
| #include "test_utils/draw_call_perf_utils.h" |
| |
| namespace |
| { |
| |
| class DrawCallPerfBenchmark : public ANGLERenderTest, |
| public ::testing::WithParamInterface<DrawCallPerfParams> |
| { |
| public: |
| DrawCallPerfBenchmark(); |
| |
| void initializeBenchmark() override; |
| void destroyBenchmark() override; |
| void drawBenchmark() override; |
| |
| private: |
| GLuint mProgram = 0; |
| GLuint mBuffer = 0; |
| GLuint mFBO = 0; |
| GLuint mTexture = 0; |
| int mNumTris = GetParam().numTris; |
| }; |
| |
| DrawCallPerfBenchmark::DrawCallPerfBenchmark() : ANGLERenderTest("DrawCallPerf", GetParam()) |
| { |
| mRunTimeSeconds = GetParam().runTimeSeconds; |
| } |
| |
| void DrawCallPerfBenchmark::initializeBenchmark() |
| { |
| const auto ¶ms = GetParam(); |
| |
| ASSERT_LT(0u, params.iterations); |
| |
| mProgram = SetupSimpleDrawProgram(); |
| ASSERT_NE(0u, mProgram); |
| |
| glClearColor(0.0f, 0.0f, 0.0f, 0.0f); |
| |
| mBuffer = Create2DTriangleBuffer(mNumTris, GL_STATIC_DRAW); |
| |
| glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); |
| glEnableVertexAttribArray(0); |
| |
| // Set the viewport |
| glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); |
| |
| if (params.useFBO) |
| { |
| CreateColorFBO(getWindow()->getWidth(), getWindow()->getHeight(), &mTexture, &mFBO); |
| } |
| |
| ASSERT_GL_NO_ERROR(); |
| } |
| |
| void DrawCallPerfBenchmark::destroyBenchmark() |
| { |
| glDeleteProgram(mProgram); |
| glDeleteBuffers(1, &mBuffer); |
| glDeleteTextures(1, &mTexture); |
| glDeleteFramebuffers(1, &mFBO); |
| } |
| |
| void DrawCallPerfBenchmark::drawBenchmark() |
| { |
| // This workaround fixes a huge queue of graphics commands accumulating on the GL |
| // back-end. The GL back-end doesn't have a proper NULL device at the moment. |
| // TODO(jmadill): Remove this when/if we ever get a proper OpenGL NULL device. |
| const auto &eglParams = GetParam().eglParameters; |
| if (eglParams.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE || |
| (eglParams.renderer != EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE && |
| eglParams.renderer != EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)) |
| { |
| glClear(GL_COLOR_BUFFER_BIT); |
| } |
| |
| const auto ¶ms = GetParam(); |
| |
| for (unsigned int it = 0; it < params.iterations; it++) |
| { |
| glDrawArrays(GL_TRIANGLES, 0, static_cast<GLsizei>(3 * mNumTris)); |
| } |
| |
| ASSERT_GL_NO_ERROR(); |
| } |
| |
| TEST_P(DrawCallPerfBenchmark, Run) |
| { |
| run(); |
| } |
| |
| ANGLE_INSTANTIATE_TEST(DrawCallPerfBenchmark, |
| DrawCallPerfD3D9Params(false, false), |
| DrawCallPerfD3D9Params(true, false), |
| DrawCallPerfD3D11Params(false, false), |
| DrawCallPerfD3D11Params(true, false), |
| DrawCallPerfD3D11Params(true, true), |
| DrawCallPerfOpenGLParams(false, false), |
| DrawCallPerfOpenGLParams(true, false), |
| DrawCallPerfOpenGLParams(true, true), |
| DrawCallPerfValidationOnly(), |
| DrawCallPerfVulkanParams(false)); |
| |
| } // namespace |