blob: a33d73460ce2604135578105fbe5b2516e28dc40 [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 {
34 majorVersion = 2;
35 minorVersion = 0;
36 windowWidth = 256;
37 windowHeight = 256;
jchen10d6781dc2018-08-23 10:51:06 +080038 option = optionIn;
Jamie Madill457aa6c2016-11-22 18:36:31 -050039 }
40
41 std::string suffix() const override
42 {
43 std::stringstream strstr;
44 strstr << RenderTestParams::suffix();
45
jchen10d6781dc2018-08-23 10:51:06 +080046 if (option == LinkProgramOption::CompileOnly)
47 {
48 strstr << "_compile_only";
49 }
50
Jamie Madill457aa6c2016-11-22 18:36:31 -050051 if (eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
52 {
53 strstr << "_null";
54 }
55
56 return strstr.str();
57 }
jchen10d6781dc2018-08-23 10:51:06 +080058
59 LinkProgramOption option;
Jamie Madill457aa6c2016-11-22 18:36:31 -050060};
61
62std::ostream &operator<<(std::ostream &os, const LinkProgramParams &params)
63{
64 os << params.suffix().substr(1);
65 return os;
66}
67
68class LinkProgramBenchmark : public ANGLERenderTest,
69 public ::testing::WithParamInterface<LinkProgramParams>
70{
71 public:
72 LinkProgramBenchmark();
73
74 void initializeBenchmark() override;
75 void destroyBenchmark() override;
76 void drawBenchmark() override;
77
78 protected:
79 GLuint mVertexBuffer = 0;
80};
81
82LinkProgramBenchmark::LinkProgramBenchmark() : ANGLERenderTest("LinkProgram", GetParam())
83{
84}
85
86void LinkProgramBenchmark::initializeBenchmark()
87{
88 std::array<Vector3, 6> vertices = {{Vector3(-1.0f, 1.0f, 0.5f), Vector3(-1.0f, -1.0f, 0.5f),
89 Vector3(1.0f, -1.0f, 0.5f), Vector3(-1.0f, 1.0f, 0.5f),
90 Vector3(1.0f, -1.0f, 0.5f), Vector3(1.0f, 1.0f, 0.5f)}};
91
92 glGenBuffers(1, &mVertexBuffer);
93 glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
94 glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vector3), vertices.data(),
95 GL_STATIC_DRAW);
96};
97
98void LinkProgramBenchmark::destroyBenchmark()
99{
100 glDeleteBuffers(1, &mVertexBuffer);
101}
102
103void LinkProgramBenchmark::drawBenchmark()
104{
105 static const char *vertexShader =
106 "attribute vec2 position;\n"
107 "void main() {\n"
108 " gl_Position = vec4(position, 0, 1);\n"
109 "}";
110 static const char *fragmentShader =
111 "precision mediump float;\n"
112 "void main() {\n"
113 " gl_FragColor = vec4(1, 0, 0, 1);\n"
114 "}";
jchen10d6781dc2018-08-23 10:51:06 +0800115 GLuint vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
116 GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500117
jchen10d6781dc2018-08-23 10:51:06 +0800118 ASSERT_NE(0u, vs);
119 ASSERT_NE(0u, fs);
120 if (GetParam().option == LinkProgramOption::CompileOnly)
121 {
122 glDeleteShader(vs);
123 glDeleteShader(fs);
124 return;
125 }
126
127 GLuint program = glCreateProgram();
Jamie Madill457aa6c2016-11-22 18:36:31 -0500128 ASSERT_NE(0u, program);
129
jchen10d6781dc2018-08-23 10:51:06 +0800130 glAttachShader(program, vs);
131 glDeleteShader(vs);
132 glAttachShader(program, fs);
133 glDeleteShader(fs);
134 glLinkProgram(program);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500135 glUseProgram(program);
136
137 GLint positionLoc = glGetAttribLocation(program, "position");
138 glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 8, nullptr);
139 glEnableVertexAttribArray(positionLoc);
140
141 // Draw with the program to ensure the shader gets compiled and used.
142 glDrawArrays(GL_TRIANGLES, 0, 6);
143
144 glDeleteProgram(program);
145}
146
147using namespace egl_platform;
148
jchen10d6781dc2018-08-23 10:51:06 +0800149LinkProgramParams LinkProgramD3D11Params(LinkProgramOption option)
Jamie Madill457aa6c2016-11-22 18:36:31 -0500150{
jchen10d6781dc2018-08-23 10:51:06 +0800151 LinkProgramParams params(option);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500152 params.eglParameters = D3D11();
153 return params;
154}
155
jchen10d6781dc2018-08-23 10:51:06 +0800156LinkProgramParams LinkProgramD3D9Params(LinkProgramOption option)
Jamie Madill457aa6c2016-11-22 18:36:31 -0500157{
jchen10d6781dc2018-08-23 10:51:06 +0800158 LinkProgramParams params(option);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500159 params.eglParameters = D3D9();
160 return params;
161}
162
jchen10d6781dc2018-08-23 10:51:06 +0800163LinkProgramParams LinkProgramOpenGLOrGLESParams(LinkProgramOption option)
Jamie Madill457aa6c2016-11-22 18:36:31 -0500164{
jchen10d6781dc2018-08-23 10:51:06 +0800165 LinkProgramParams params(option);
Yuly Novikovb8d26642017-10-27 18:14:14 -0400166 params.eglParameters = OPENGL_OR_GLES(false);
Jamie Madill457aa6c2016-11-22 18:36:31 -0500167 return params;
168}
169
jchen10d6781dc2018-08-23 10:51:06 +0800170LinkProgramParams LinkProgramVulkanParams(LinkProgramOption option)
Omar El Sheikhefaa09f2018-06-27 15:40:21 -0600171{
jchen10d6781dc2018-08-23 10:51:06 +0800172 LinkProgramParams params(option);
Omar El Sheikhefaa09f2018-06-27 15:40:21 -0600173 params.eglParameters = VULKAN();
174 return params;
175}
176
Jamie Madill457aa6c2016-11-22 18:36:31 -0500177TEST_P(LinkProgramBenchmark, Run)
178{
179 run();
180}
181
182ANGLE_INSTANTIATE_TEST(LinkProgramBenchmark,
jchen10d6781dc2018-08-23 10:51:06 +0800183 LinkProgramD3D11Params(LinkProgramOption::CompileOnly),
184 LinkProgramD3D9Params(LinkProgramOption::CompileOnly),
185 LinkProgramOpenGLOrGLESParams(LinkProgramOption::CompileOnly),
186 LinkProgramVulkanParams(LinkProgramOption::CompileOnly),
187 LinkProgramD3D11Params(LinkProgramOption::CompileAndLink),
188 LinkProgramD3D9Params(LinkProgramOption::CompileAndLink),
189 LinkProgramOpenGLOrGLESParams(LinkProgramOption::CompileAndLink),
190 LinkProgramVulkanParams(LinkProgramOption::CompileAndLink));
Jamie Madill457aa6c2016-11-22 18:36:31 -0500191
192} // anonymous namespace