blob: 121f98a418c29bc43e9a5a3837dbb0bcf135a2e1 [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 Madill457aa6c2016-11-22 18:36:31 -050015#include "shader_utils.h"
16
17using namespace angle;
18
19namespace
20{
21
jchen10d6781dc2018-08-23 10:51:06 +080022enum class LinkProgramOption
23{
24 CompileOnly,
25 CompileAndLink,
26
27 Unspecified
28};
29
Jamie Madill457aa6c2016-11-22 18:36:31 -050030struct LinkProgramParams final : public RenderTestParams
31{
jchen10d6781dc2018-08-23 10:51:06 +080032 LinkProgramParams(LinkProgramOption optionIn)
Jamie Madill457aa6c2016-11-22 18:36:31 -050033 {
Jamie Madill3402d522018-10-30 15:14:52 -040034 iterationsPerStep = 1;
35
Jamie Madill457aa6c2016-11-22 18:36:31 -050036 majorVersion = 2;
37 minorVersion = 0;
38 windowWidth = 256;
39 windowHeight = 256;
jchen10d6781dc2018-08-23 10:51:06 +080040 option = optionIn;
Jamie Madill457aa6c2016-11-22 18:36:31 -050041 }
42
43 std::string suffix() const override
44 {
45 std::stringstream strstr;
46 strstr << RenderTestParams::suffix();
47
jchen10d6781dc2018-08-23 10:51:06 +080048 if (option == LinkProgramOption::CompileOnly)
49 {
50 strstr << "_compile_only";
51 }
52
Jamie Madill457aa6c2016-11-22 18:36:31 -050053 if (eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
54 {
55 strstr << "_null";
56 }
57
58 return strstr.str();
59 }
jchen10d6781dc2018-08-23 10:51:06 +080060
61 LinkProgramOption option;
Jamie Madill457aa6c2016-11-22 18:36:31 -050062};
63
64std::ostream &operator<<(std::ostream &os, const LinkProgramParams &params)
65{
66 os << params.suffix().substr(1);
67 return os;
68}
69
70class LinkProgramBenchmark : public ANGLERenderTest,
71 public ::testing::WithParamInterface<LinkProgramParams>
72{
73 public:
74 LinkProgramBenchmark();
75
76 void initializeBenchmark() override;
77 void destroyBenchmark() override;
78 void drawBenchmark() override;
79
80 protected:
81 GLuint mVertexBuffer = 0;
82};
83
84LinkProgramBenchmark::LinkProgramBenchmark() : ANGLERenderTest("LinkProgram", GetParam())
85{
86}
87
88void LinkProgramBenchmark::initializeBenchmark()
89{
90 std::array<Vector3, 6> vertices = {{Vector3(-1.0f, 1.0f, 0.5f), Vector3(-1.0f, -1.0f, 0.5f),
91 Vector3(1.0f, -1.0f, 0.5f), Vector3(-1.0f, 1.0f, 0.5f),
92 Vector3(1.0f, -1.0f, 0.5f), Vector3(1.0f, 1.0f, 0.5f)}};
93
94 glGenBuffers(1, &mVertexBuffer);
95 glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
96 glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vector3), vertices.data(),
97 GL_STATIC_DRAW);
98};
99
100void LinkProgramBenchmark::destroyBenchmark()
101{
102 glDeleteBuffers(1, &mVertexBuffer);
103}
104
105void LinkProgramBenchmark::drawBenchmark()
106{
107 static const char *vertexShader =
108 "attribute vec2 position;\n"
109 "void main() {\n"
110 " gl_Position = vec4(position, 0, 1);\n"
111 "}";
112 static const char *fragmentShader =
113 "precision mediump float;\n"
114 "void main() {\n"
115 " gl_FragColor = vec4(1, 0, 0, 1);\n"
116 "}";
jchen10d6781dc2018-08-23 10:51:06 +0800117 GLuint vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
118 GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500119
jchen10d6781dc2018-08-23 10:51:06 +0800120 ASSERT_NE(0u, vs);
121 ASSERT_NE(0u, fs);
122 if (GetParam().option == LinkProgramOption::CompileOnly)
123 {
124 glDeleteShader(vs);
125 glDeleteShader(fs);
126 return;
127 }
128
129 GLuint program = glCreateProgram();
Jamie Madill457aa6c2016-11-22 18:36:31 -0500130 ASSERT_NE(0u, program);
131
jchen10d6781dc2018-08-23 10:51:06 +0800132 glAttachShader(program, vs);
133 glDeleteShader(vs);
134 glAttachShader(program, fs);
135 glDeleteShader(fs);
136 glLinkProgram(program);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500137 glUseProgram(program);
138
139 GLint positionLoc = glGetAttribLocation(program, "position");
140 glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 8, nullptr);
141 glEnableVertexAttribArray(positionLoc);
142
143 // Draw with the program to ensure the shader gets compiled and used.
144 glDrawArrays(GL_TRIANGLES, 0, 6);
145
146 glDeleteProgram(program);
147}
148
149using namespace egl_platform;
150
jchen10d6781dc2018-08-23 10:51:06 +0800151LinkProgramParams LinkProgramD3D11Params(LinkProgramOption option)
Jamie Madill457aa6c2016-11-22 18:36:31 -0500152{
jchen10d6781dc2018-08-23 10:51:06 +0800153 LinkProgramParams params(option);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500154 params.eglParameters = D3D11();
155 return params;
156}
157
jchen10d6781dc2018-08-23 10:51:06 +0800158LinkProgramParams LinkProgramD3D9Params(LinkProgramOption option)
Jamie Madill457aa6c2016-11-22 18:36:31 -0500159{
jchen10d6781dc2018-08-23 10:51:06 +0800160 LinkProgramParams params(option);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500161 params.eglParameters = D3D9();
162 return params;
163}
164
jchen10d6781dc2018-08-23 10:51:06 +0800165LinkProgramParams LinkProgramOpenGLOrGLESParams(LinkProgramOption option)
Jamie Madill457aa6c2016-11-22 18:36:31 -0500166{
jchen10d6781dc2018-08-23 10:51:06 +0800167 LinkProgramParams params(option);
Yuly Novikovb8d26642017-10-27 18:14:14 -0400168 params.eglParameters = OPENGL_OR_GLES(false);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500169 return params;
170}
171
jchen10d6781dc2018-08-23 10:51:06 +0800172LinkProgramParams LinkProgramVulkanParams(LinkProgramOption option)
Omar El Sheikhefaa09f2018-06-27 15:40:21 -0600173{
jchen10d6781dc2018-08-23 10:51:06 +0800174 LinkProgramParams params(option);
Omar El Sheikhefaa09f2018-06-27 15:40:21 -0600175 params.eglParameters = VULKAN();
176 return params;
177}
178
Jamie Madill457aa6c2016-11-22 18:36:31 -0500179TEST_P(LinkProgramBenchmark, Run)
180{
181 run();
182}
183
184ANGLE_INSTANTIATE_TEST(LinkProgramBenchmark,
jchen10d6781dc2018-08-23 10:51:06 +0800185 LinkProgramD3D11Params(LinkProgramOption::CompileOnly),
186 LinkProgramD3D9Params(LinkProgramOption::CompileOnly),
187 LinkProgramOpenGLOrGLESParams(LinkProgramOption::CompileOnly),
188 LinkProgramVulkanParams(LinkProgramOption::CompileOnly),
189 LinkProgramD3D11Params(LinkProgramOption::CompileAndLink),
190 LinkProgramD3D9Params(LinkProgramOption::CompileAndLink),
191 LinkProgramOpenGLOrGLESParams(LinkProgramOption::CompileAndLink),
192 LinkProgramVulkanParams(LinkProgramOption::CompileAndLink));
Jamie Madill457aa6c2016-11-22 18:36:31 -0500193
194} // anonymous namespace