blob: 59cb0ac68620839a14eb675f1cb3098f480490f8 [file] [log] [blame]
Jamie Madill457aa6c2016-11-22 18:36:31 -05001//
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 Wallez922cbfc2016-11-25 16:23:18 -050014#include "common/vector_utils.h"
Jamie Madillba319ba2018-12-29 10:29:33 -050015#include "util/shader_utils.h"
Jamie Madill457aa6c2016-11-22 18:36:31 -050016
17using namespace angle;
18
19namespace
20{
21
jchen10a100d8f2018-12-29 16:39:55 +080022enum class TaskOption
jchen10d6781dc2018-08-23 10:51:06 +080023{
24 CompileOnly,
25 CompileAndLink,
26
27 Unspecified
28};
29
jchen10a100d8f2018-12-29 16:39:55 +080030enum class ThreadOption
31{
32 SingleThread,
33 MultiThread,
34
35 Unspecified
36};
37
Jamie Madill457aa6c2016-11-22 18:36:31 -050038struct LinkProgramParams final : public RenderTestParams
39{
jchen10a100d8f2018-12-29 16:39:55 +080040 LinkProgramParams(TaskOption taskOptionIn, ThreadOption threadOptionIn)
Jamie Madill457aa6c2016-11-22 18:36:31 -050041 {
Jamie Madill3402d522018-10-30 15:14:52 -040042 iterationsPerStep = 1;
43
Jamie Madill457aa6c2016-11-22 18:36:31 -050044 majorVersion = 2;
45 minorVersion = 0;
46 windowWidth = 256;
47 windowHeight = 256;
jchen10a100d8f2018-12-29 16:39:55 +080048 taskOption = taskOptionIn;
49 threadOption = threadOptionIn;
Jamie Madill457aa6c2016-11-22 18:36:31 -050050 }
51
52 std::string suffix() const override
53 {
54 std::stringstream strstr;
55 strstr << RenderTestParams::suffix();
56
jchen10a100d8f2018-12-29 16:39:55 +080057 if (taskOption == TaskOption::CompileOnly)
jchen10d6781dc2018-08-23 10:51:06 +080058 {
59 strstr << "_compile_only";
60 }
jchen10a100d8f2018-12-29 16:39:55 +080061 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 }
jchen10d6781dc2018-08-23 10:51:06 +080074
Jamie Madill457aa6c2016-11-22 18:36:31 -050075 if (eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
76 {
77 strstr << "_null";
78 }
79
80 return strstr.str();
81 }
jchen10d6781dc2018-08-23 10:51:06 +080082
jchen10a100d8f2018-12-29 16:39:55 +080083 TaskOption taskOption;
84 ThreadOption threadOption;
Jamie Madill457aa6c2016-11-22 18:36:31 -050085};
86
87std::ostream &operator<<(std::ostream &os, const LinkProgramParams &params)
88{
89 os << params.suffix().substr(1);
90 return os;
91}
92
93class 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 Madillb980c562018-11-27 11:34:27 -0500107LinkProgramBenchmark::LinkProgramBenchmark() : ANGLERenderTest("LinkProgram", GetParam()) {}
Jamie Madill457aa6c2016-11-22 18:36:31 -0500108
109void LinkProgramBenchmark::initializeBenchmark()
110{
jchen10a100d8f2018-12-29 16:39:55 +0800111 if (GetParam().threadOption == ThreadOption::SingleThread)
112 {
113 glMaxShaderCompilerThreadsKHR(0);
114 }
115
Jamie Madill457aa6c2016-11-22 18:36:31 -0500116 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
126void LinkProgramBenchmark::destroyBenchmark()
127{
128 glDeleteBuffers(1, &mVertexBuffer);
129}
130
131void 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 "}";
jchen10d6781dc2018-08-23 10:51:06 +0800143 GLuint vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
144 GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500145
jchen10d6781dc2018-08-23 10:51:06 +0800146 ASSERT_NE(0u, vs);
147 ASSERT_NE(0u, fs);
jchen10a100d8f2018-12-29 16:39:55 +0800148 if (GetParam().taskOption == TaskOption::CompileOnly)
jchen10d6781dc2018-08-23 10:51:06 +0800149 {
150 glDeleteShader(vs);
151 glDeleteShader(fs);
152 return;
153 }
154
155 GLuint program = glCreateProgram();
Jamie Madill457aa6c2016-11-22 18:36:31 -0500156 ASSERT_NE(0u, program);
157
jchen10d6781dc2018-08-23 10:51:06 +0800158 glAttachShader(program, vs);
159 glDeleteShader(vs);
160 glAttachShader(program, fs);
161 glDeleteShader(fs);
162 glLinkProgram(program);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500163 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
175using namespace egl_platform;
176
jchen10a100d8f2018-12-29 16:39:55 +0800177LinkProgramParams LinkProgramD3D11Params(TaskOption taskOption, ThreadOption threadOption)
Jamie Madill457aa6c2016-11-22 18:36:31 -0500178{
jchen10a100d8f2018-12-29 16:39:55 +0800179 LinkProgramParams params(taskOption, threadOption);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500180 params.eglParameters = D3D11();
181 return params;
182}
183
jchen10a100d8f2018-12-29 16:39:55 +0800184LinkProgramParams LinkProgramD3D9Params(TaskOption taskOption, ThreadOption threadOption)
Jamie Madill457aa6c2016-11-22 18:36:31 -0500185{
jchen10a100d8f2018-12-29 16:39:55 +0800186 LinkProgramParams params(taskOption, threadOption);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500187 params.eglParameters = D3D9();
188 return params;
189}
190
jchen10a100d8f2018-12-29 16:39:55 +0800191LinkProgramParams LinkProgramOpenGLOrGLESParams(TaskOption taskOption, ThreadOption threadOption)
Jamie Madill457aa6c2016-11-22 18:36:31 -0500192{
jchen10a100d8f2018-12-29 16:39:55 +0800193 LinkProgramParams params(taskOption, threadOption);
Yuly Novikovb8d26642017-10-27 18:14:14 -0400194 params.eglParameters = OPENGL_OR_GLES(false);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500195 return params;
196}
197
jchen10a100d8f2018-12-29 16:39:55 +0800198LinkProgramParams LinkProgramVulkanParams(TaskOption taskOption, ThreadOption threadOption)
Omar El Sheikhefaa09f2018-06-27 15:40:21 -0600199{
jchen10a100d8f2018-12-29 16:39:55 +0800200 LinkProgramParams params(taskOption, threadOption);
Omar El Sheikhefaa09f2018-06-27 15:40:21 -0600201 params.eglParameters = VULKAN();
202 return params;
203}
204
Jamie Madill457aa6c2016-11-22 18:36:31 -0500205TEST_P(LinkProgramBenchmark, Run)
206{
207 run();
208}
209
jchen10a100d8f2018-12-29 16:39:55 +0800210ANGLE_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 Madill457aa6c2016-11-22 18:36:31 -0500228
229} // anonymous namespace