Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 1 | // |
| 2 | // Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. |
| 3 | // Use of this source code is governed by a BSD-style license that can be |
| 4 | // found in the LICENSE file. |
| 5 | // |
| 6 | // LinkProgramPerfTest: |
| 7 | // Performance tests compiling a lot of shaders. |
| 8 | // |
| 9 | |
| 10 | #include "ANGLEPerfTest.h" |
| 11 | |
| 12 | #include <array> |
| 13 | |
Corentin Wallez | 922cbfc | 2016-11-25 16:23:18 -0500 | [diff] [blame] | 14 | #include "common/vector_utils.h" |
Jamie Madill | ba319ba | 2018-12-29 10:29:33 -0500 | [diff] [blame] | 15 | #include "util/shader_utils.h" |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 16 | |
| 17 | using namespace angle; |
| 18 | |
| 19 | namespace |
| 20 | { |
| 21 | |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 22 | enum class TaskOption |
jchen10 | d6781dc | 2018-08-23 10:51:06 +0800 | [diff] [blame] | 23 | { |
| 24 | CompileOnly, |
| 25 | CompileAndLink, |
| 26 | |
| 27 | Unspecified |
| 28 | }; |
| 29 | |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 30 | enum class ThreadOption |
| 31 | { |
| 32 | SingleThread, |
| 33 | MultiThread, |
| 34 | |
| 35 | Unspecified |
| 36 | }; |
| 37 | |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 38 | struct LinkProgramParams final : public RenderTestParams |
| 39 | { |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 40 | LinkProgramParams(TaskOption taskOptionIn, ThreadOption threadOptionIn) |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 41 | { |
Jamie Madill | 3402d52 | 2018-10-30 15:14:52 -0400 | [diff] [blame] | 42 | iterationsPerStep = 1; |
| 43 | |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 44 | majorVersion = 2; |
| 45 | minorVersion = 0; |
| 46 | windowWidth = 256; |
| 47 | windowHeight = 256; |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 48 | taskOption = taskOptionIn; |
| 49 | threadOption = threadOptionIn; |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 50 | } |
| 51 | |
| 52 | std::string suffix() const override |
| 53 | { |
| 54 | std::stringstream strstr; |
| 55 | strstr << RenderTestParams::suffix(); |
| 56 | |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 57 | if (taskOption == TaskOption::CompileOnly) |
jchen10 | d6781dc | 2018-08-23 10:51:06 +0800 | [diff] [blame] | 58 | { |
| 59 | strstr << "_compile_only"; |
| 60 | } |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 61 | else if (taskOption == TaskOption::CompileAndLink) |
| 62 | { |
| 63 | strstr << "_compile_and_link"; |
| 64 | } |
| 65 | |
| 66 | if (threadOption == ThreadOption::SingleThread) |
| 67 | { |
| 68 | strstr << "_single_thread"; |
| 69 | } |
| 70 | else if (threadOption == ThreadOption::MultiThread) |
| 71 | { |
| 72 | strstr << "_multi_thread"; |
| 73 | } |
jchen10 | d6781dc | 2018-08-23 10:51:06 +0800 | [diff] [blame] | 74 | |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 75 | if (eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE) |
| 76 | { |
| 77 | strstr << "_null"; |
| 78 | } |
| 79 | |
| 80 | return strstr.str(); |
| 81 | } |
jchen10 | d6781dc | 2018-08-23 10:51:06 +0800 | [diff] [blame] | 82 | |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 83 | TaskOption taskOption; |
| 84 | ThreadOption threadOption; |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 85 | }; |
| 86 | |
| 87 | std::ostream &operator<<(std::ostream &os, const LinkProgramParams ¶ms) |
| 88 | { |
| 89 | os << params.suffix().substr(1); |
| 90 | return os; |
| 91 | } |
| 92 | |
| 93 | class LinkProgramBenchmark : public ANGLERenderTest, |
| 94 | public ::testing::WithParamInterface<LinkProgramParams> |
| 95 | { |
| 96 | public: |
| 97 | LinkProgramBenchmark(); |
| 98 | |
| 99 | void initializeBenchmark() override; |
| 100 | void destroyBenchmark() override; |
| 101 | void drawBenchmark() override; |
| 102 | |
| 103 | protected: |
| 104 | GLuint mVertexBuffer = 0; |
| 105 | }; |
| 106 | |
Jamie Madill | b980c56 | 2018-11-27 11:34:27 -0500 | [diff] [blame] | 107 | LinkProgramBenchmark::LinkProgramBenchmark() : ANGLERenderTest("LinkProgram", GetParam()) {} |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 108 | |
| 109 | void LinkProgramBenchmark::initializeBenchmark() |
| 110 | { |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 111 | if (GetParam().threadOption == ThreadOption::SingleThread) |
| 112 | { |
| 113 | glMaxShaderCompilerThreadsKHR(0); |
| 114 | } |
| 115 | |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 116 | std::array<Vector3, 6> vertices = {{Vector3(-1.0f, 1.0f, 0.5f), Vector3(-1.0f, -1.0f, 0.5f), |
| 117 | Vector3(1.0f, -1.0f, 0.5f), Vector3(-1.0f, 1.0f, 0.5f), |
| 118 | Vector3(1.0f, -1.0f, 0.5f), Vector3(1.0f, 1.0f, 0.5f)}}; |
| 119 | |
| 120 | glGenBuffers(1, &mVertexBuffer); |
| 121 | glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); |
| 122 | glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vector3), vertices.data(), |
| 123 | GL_STATIC_DRAW); |
| 124 | }; |
| 125 | |
| 126 | void LinkProgramBenchmark::destroyBenchmark() |
| 127 | { |
| 128 | glDeleteBuffers(1, &mVertexBuffer); |
| 129 | } |
| 130 | |
| 131 | void LinkProgramBenchmark::drawBenchmark() |
| 132 | { |
| 133 | static const char *vertexShader = |
| 134 | "attribute vec2 position;\n" |
| 135 | "void main() {\n" |
| 136 | " gl_Position = vec4(position, 0, 1);\n" |
| 137 | "}"; |
| 138 | static const char *fragmentShader = |
| 139 | "precision mediump float;\n" |
| 140 | "void main() {\n" |
| 141 | " gl_FragColor = vec4(1, 0, 0, 1);\n" |
| 142 | "}"; |
jchen10 | d6781dc | 2018-08-23 10:51:06 +0800 | [diff] [blame] | 143 | GLuint vs = CompileShader(GL_VERTEX_SHADER, vertexShader); |
| 144 | GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader); |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 145 | |
jchen10 | d6781dc | 2018-08-23 10:51:06 +0800 | [diff] [blame] | 146 | ASSERT_NE(0u, vs); |
| 147 | ASSERT_NE(0u, fs); |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 148 | if (GetParam().taskOption == TaskOption::CompileOnly) |
jchen10 | d6781dc | 2018-08-23 10:51:06 +0800 | [diff] [blame] | 149 | { |
| 150 | glDeleteShader(vs); |
| 151 | glDeleteShader(fs); |
| 152 | return; |
| 153 | } |
| 154 | |
| 155 | GLuint program = glCreateProgram(); |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 156 | ASSERT_NE(0u, program); |
| 157 | |
jchen10 | d6781dc | 2018-08-23 10:51:06 +0800 | [diff] [blame] | 158 | glAttachShader(program, vs); |
| 159 | glDeleteShader(vs); |
| 160 | glAttachShader(program, fs); |
| 161 | glDeleteShader(fs); |
| 162 | glLinkProgram(program); |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 163 | glUseProgram(program); |
| 164 | |
| 165 | GLint positionLoc = glGetAttribLocation(program, "position"); |
| 166 | glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 8, nullptr); |
| 167 | glEnableVertexAttribArray(positionLoc); |
| 168 | |
| 169 | // Draw with the program to ensure the shader gets compiled and used. |
| 170 | glDrawArrays(GL_TRIANGLES, 0, 6); |
| 171 | |
| 172 | glDeleteProgram(program); |
| 173 | } |
| 174 | |
| 175 | using namespace egl_platform; |
| 176 | |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 177 | LinkProgramParams LinkProgramD3D11Params(TaskOption taskOption, ThreadOption threadOption) |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 178 | { |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 179 | LinkProgramParams params(taskOption, threadOption); |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 180 | params.eglParameters = D3D11(); |
| 181 | return params; |
| 182 | } |
| 183 | |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 184 | LinkProgramParams LinkProgramD3D9Params(TaskOption taskOption, ThreadOption threadOption) |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 185 | { |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 186 | LinkProgramParams params(taskOption, threadOption); |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 187 | params.eglParameters = D3D9(); |
| 188 | return params; |
| 189 | } |
| 190 | |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 191 | LinkProgramParams LinkProgramOpenGLOrGLESParams(TaskOption taskOption, ThreadOption threadOption) |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 192 | { |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 193 | LinkProgramParams params(taskOption, threadOption); |
Yuly Novikov | b8d2664 | 2017-10-27 18:14:14 -0400 | [diff] [blame] | 194 | params.eglParameters = OPENGL_OR_GLES(false); |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 195 | return params; |
| 196 | } |
| 197 | |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 198 | LinkProgramParams LinkProgramVulkanParams(TaskOption taskOption, ThreadOption threadOption) |
Omar El Sheikh | efaa09f | 2018-06-27 15:40:21 -0600 | [diff] [blame] | 199 | { |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 200 | LinkProgramParams params(taskOption, threadOption); |
Omar El Sheikh | efaa09f | 2018-06-27 15:40:21 -0600 | [diff] [blame] | 201 | params.eglParameters = VULKAN(); |
| 202 | return params; |
| 203 | } |
| 204 | |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 205 | TEST_P(LinkProgramBenchmark, Run) |
| 206 | { |
| 207 | run(); |
| 208 | } |
| 209 | |
jchen10 | a100d8f | 2018-12-29 16:39:55 +0800 | [diff] [blame] | 210 | ANGLE_INSTANTIATE_TEST( |
| 211 | LinkProgramBenchmark, |
| 212 | LinkProgramD3D11Params(TaskOption::CompileOnly, ThreadOption::MultiThread), |
| 213 | LinkProgramD3D9Params(TaskOption::CompileOnly, ThreadOption::MultiThread), |
| 214 | LinkProgramOpenGLOrGLESParams(TaskOption::CompileOnly, ThreadOption::MultiThread), |
| 215 | LinkProgramVulkanParams(TaskOption::CompileOnly, ThreadOption::MultiThread), |
| 216 | LinkProgramD3D11Params(TaskOption::CompileAndLink, ThreadOption::MultiThread), |
| 217 | LinkProgramD3D9Params(TaskOption::CompileAndLink, ThreadOption::MultiThread), |
| 218 | LinkProgramOpenGLOrGLESParams(TaskOption::CompileAndLink, ThreadOption::MultiThread), |
| 219 | LinkProgramVulkanParams(TaskOption::CompileAndLink, ThreadOption::MultiThread), |
| 220 | LinkProgramD3D11Params(TaskOption::CompileOnly, ThreadOption::SingleThread), |
| 221 | LinkProgramD3D9Params(TaskOption::CompileOnly, ThreadOption::SingleThread), |
| 222 | LinkProgramOpenGLOrGLESParams(TaskOption::CompileOnly, ThreadOption::SingleThread), |
| 223 | LinkProgramVulkanParams(TaskOption::CompileOnly, ThreadOption::SingleThread), |
| 224 | LinkProgramD3D11Params(TaskOption::CompileAndLink, ThreadOption::SingleThread), |
| 225 | LinkProgramD3D9Params(TaskOption::CompileAndLink, ThreadOption::SingleThread), |
| 226 | LinkProgramOpenGLOrGLESParams(TaskOption::CompileAndLink, ThreadOption::SingleThread), |
| 227 | LinkProgramVulkanParams(TaskOption::CompileAndLink, ThreadOption::SingleThread)); |
Jamie Madill | 457aa6c | 2016-11-22 18:36:31 -0500 | [diff] [blame] | 228 | |
| 229 | } // anonymous namespace |