1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // ClearPerf:
7*8975f5c5SAndroid Build Coastguard Worker // Performance test for clearing framebuffers.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker #include <iostream>
13*8975f5c5SAndroid Build Coastguard Worker #include <random>
14*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "util/random_utils.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
20*8975f5c5SAndroid Build Coastguard Worker
21*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
22*8975f5c5SAndroid Build Coastguard Worker
23*8975f5c5SAndroid Build Coastguard Worker namespace
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kIterationsPerStep = 256;
26*8975f5c5SAndroid Build Coastguard Worker
27*8975f5c5SAndroid Build Coastguard Worker struct ClearParams final : public RenderTestParams
28*8975f5c5SAndroid Build Coastguard Worker {
ClearParams__anon23f243090111::ClearParams29*8975f5c5SAndroid Build Coastguard Worker ClearParams()
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker iterationsPerStep = kIterationsPerStep;
32*8975f5c5SAndroid Build Coastguard Worker trackGpuTime = true;
33*8975f5c5SAndroid Build Coastguard Worker
34*8975f5c5SAndroid Build Coastguard Worker fboSize = 2048;
35*8975f5c5SAndroid Build Coastguard Worker
36*8975f5c5SAndroid Build Coastguard Worker internalFormat = GL_RGBA8;
37*8975f5c5SAndroid Build Coastguard Worker
38*8975f5c5SAndroid Build Coastguard Worker scissoredClear = false;
39*8975f5c5SAndroid Build Coastguard Worker }
40*8975f5c5SAndroid Build Coastguard Worker
41*8975f5c5SAndroid Build Coastguard Worker std::string story() const override;
42*8975f5c5SAndroid Build Coastguard Worker
43*8975f5c5SAndroid Build Coastguard Worker GLsizei fboSize;
44*8975f5c5SAndroid Build Coastguard Worker GLsizei textureSize;
45*8975f5c5SAndroid Build Coastguard Worker
46*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat;
47*8975f5c5SAndroid Build Coastguard Worker
48*8975f5c5SAndroid Build Coastguard Worker bool scissoredClear;
49*8975f5c5SAndroid Build Coastguard Worker };
50*8975f5c5SAndroid Build Coastguard Worker
operator <<(std::ostream & os,const ClearParams & params)51*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const ClearParams ¶ms)
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker os << params.backendAndStory().substr(1);
54*8975f5c5SAndroid Build Coastguard Worker return os;
55*8975f5c5SAndroid Build Coastguard Worker }
56*8975f5c5SAndroid Build Coastguard Worker
story() const57*8975f5c5SAndroid Build Coastguard Worker std::string ClearParams::story() const
58*8975f5c5SAndroid Build Coastguard Worker {
59*8975f5c5SAndroid Build Coastguard Worker std::stringstream strstr;
60*8975f5c5SAndroid Build Coastguard Worker
61*8975f5c5SAndroid Build Coastguard Worker strstr << RenderTestParams::story();
62*8975f5c5SAndroid Build Coastguard Worker
63*8975f5c5SAndroid Build Coastguard Worker if (internalFormat == GL_RGB8)
64*8975f5c5SAndroid Build Coastguard Worker {
65*8975f5c5SAndroid Build Coastguard Worker strstr << "_rgb";
66*8975f5c5SAndroid Build Coastguard Worker }
67*8975f5c5SAndroid Build Coastguard Worker
68*8975f5c5SAndroid Build Coastguard Worker if (scissoredClear)
69*8975f5c5SAndroid Build Coastguard Worker {
70*8975f5c5SAndroid Build Coastguard Worker strstr << "_scissoredClear";
71*8975f5c5SAndroid Build Coastguard Worker }
72*8975f5c5SAndroid Build Coastguard Worker
73*8975f5c5SAndroid Build Coastguard Worker return strstr.str();
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker
76*8975f5c5SAndroid Build Coastguard Worker class ClearBenchmark : public ANGLERenderTest, public ::testing::WithParamInterface<ClearParams>
77*8975f5c5SAndroid Build Coastguard Worker {
78*8975f5c5SAndroid Build Coastguard Worker public:
79*8975f5c5SAndroid Build Coastguard Worker ClearBenchmark();
80*8975f5c5SAndroid Build Coastguard Worker
81*8975f5c5SAndroid Build Coastguard Worker void initializeBenchmark() override;
82*8975f5c5SAndroid Build Coastguard Worker void destroyBenchmark() override;
83*8975f5c5SAndroid Build Coastguard Worker void drawBenchmark() override;
84*8975f5c5SAndroid Build Coastguard Worker
85*8975f5c5SAndroid Build Coastguard Worker private:
86*8975f5c5SAndroid Build Coastguard Worker void initShaders();
87*8975f5c5SAndroid Build Coastguard Worker
88*8975f5c5SAndroid Build Coastguard Worker std::vector<GLuint> mTextures;
89*8975f5c5SAndroid Build Coastguard Worker
90*8975f5c5SAndroid Build Coastguard Worker GLuint mProgram;
91*8975f5c5SAndroid Build Coastguard Worker };
92*8975f5c5SAndroid Build Coastguard Worker
ClearBenchmark()93*8975f5c5SAndroid Build Coastguard Worker ClearBenchmark::ClearBenchmark() : ANGLERenderTest("Clear", GetParam()), mProgram(0u)
94*8975f5c5SAndroid Build Coastguard Worker {
95*8975f5c5SAndroid Build Coastguard Worker if (GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker skipTest("http://crbug.com/945415 Crashes on nvidia+d3d11");
98*8975f5c5SAndroid Build Coastguard Worker }
99*8975f5c5SAndroid Build Coastguard Worker }
100*8975f5c5SAndroid Build Coastguard Worker
initializeBenchmark()101*8975f5c5SAndroid Build Coastguard Worker void ClearBenchmark::initializeBenchmark()
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker initShaders();
104*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker
initShaders()109*8975f5c5SAndroid Build Coastguard Worker void ClearBenchmark::initShaders()
110*8975f5c5SAndroid Build Coastguard Worker {
111*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(void main()
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(0, 0, 0, 1);
114*8975f5c5SAndroid Build Coastguard Worker })";
115*8975f5c5SAndroid Build Coastguard Worker
116*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision mediump float;
117*8975f5c5SAndroid Build Coastguard Worker void main()
118*8975f5c5SAndroid Build Coastguard Worker {
119*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(0);
120*8975f5c5SAndroid Build Coastguard Worker })";
121*8975f5c5SAndroid Build Coastguard Worker
122*8975f5c5SAndroid Build Coastguard Worker mProgram = CompileProgram(kVS, kFS);
123*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(0u, mProgram);
124*8975f5c5SAndroid Build Coastguard Worker
125*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
126*8975f5c5SAndroid Build Coastguard Worker
127*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
128*8975f5c5SAndroid Build Coastguard Worker
129*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
130*8975f5c5SAndroid Build Coastguard Worker }
131*8975f5c5SAndroid Build Coastguard Worker
destroyBenchmark()132*8975f5c5SAndroid Build Coastguard Worker void ClearBenchmark::destroyBenchmark()
133*8975f5c5SAndroid Build Coastguard Worker {
134*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mProgram);
135*8975f5c5SAndroid Build Coastguard Worker }
136*8975f5c5SAndroid Build Coastguard Worker
drawBenchmark()137*8975f5c5SAndroid Build Coastguard Worker void ClearBenchmark::drawBenchmark()
138*8975f5c5SAndroid Build Coastguard Worker {
139*8975f5c5SAndroid Build Coastguard Worker const auto ¶ms = GetParam();
140*8975f5c5SAndroid Build Coastguard Worker
141*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer colorRbo;
142*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, colorRbo);
143*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, params.internalFormat, params.fboSize, params.fboSize);
144*8975f5c5SAndroid Build Coastguard Worker
145*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthRbo;
146*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthRbo);
147*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, params.fboSize, params.fboSize);
148*8975f5c5SAndroid Build Coastguard Worker
149*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
150*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
151*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRbo);
152*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRbo);
153*8975f5c5SAndroid Build Coastguard Worker
154*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, params.fboSize, params.fboSize);
155*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
156*8975f5c5SAndroid Build Coastguard Worker
157*8975f5c5SAndroid Build Coastguard Worker startGpuTimer();
158*8975f5c5SAndroid Build Coastguard Worker
159*8975f5c5SAndroid Build Coastguard Worker if (params.scissoredClear)
160*8975f5c5SAndroid Build Coastguard Worker {
161*8975f5c5SAndroid Build Coastguard Worker angle::RNG rng;
162*8975f5c5SAndroid Build Coastguard Worker const GLuint width = params.fboSize;
163*8975f5c5SAndroid Build Coastguard Worker const GLuint height = params.fboSize;
164*8975f5c5SAndroid Build Coastguard Worker for (GLuint index = 0; index < (width - 1) / 2; index++)
165*8975f5c5SAndroid Build Coastguard Worker {
166*8975f5c5SAndroid Build Coastguard Worker // Do the first clear without the scissor.
167*8975f5c5SAndroid Build Coastguard Worker if (index > 0)
168*8975f5c5SAndroid Build Coastguard Worker {
169*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
170*8975f5c5SAndroid Build Coastguard Worker glScissor(index, index, width - (index * 2), height - (index * 2));
171*8975f5c5SAndroid Build Coastguard Worker }
172*8975f5c5SAndroid Build Coastguard Worker
173*8975f5c5SAndroid Build Coastguard Worker GLColor color = RandomColor(&rng);
174*8975f5c5SAndroid Build Coastguard Worker Vector4 floatColor = color.toNormalizedVector();
175*8975f5c5SAndroid Build Coastguard Worker glClearColor(floatColor[0], floatColor[1], floatColor[2], floatColor[3]);
176*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
177*8975f5c5SAndroid Build Coastguard Worker }
178*8975f5c5SAndroid Build Coastguard Worker }
179*8975f5c5SAndroid Build Coastguard Worker else
180*8975f5c5SAndroid Build Coastguard Worker {
181*8975f5c5SAndroid Build Coastguard Worker for (size_t it = 0; it < params.iterationsPerStep; ++it)
182*8975f5c5SAndroid Build Coastguard Worker {
183*8975f5c5SAndroid Build Coastguard Worker float clearValue = (it % 2) * 0.5f + 0.2f;
184*8975f5c5SAndroid Build Coastguard Worker glClearColor(clearValue, clearValue, clearValue, clearValue);
185*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
186*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
187*8975f5c5SAndroid Build Coastguard Worker }
188*8975f5c5SAndroid Build Coastguard Worker }
189*8975f5c5SAndroid Build Coastguard Worker
190*8975f5c5SAndroid Build Coastguard Worker stopGpuTimer();
191*8975f5c5SAndroid Build Coastguard Worker
192*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
193*8975f5c5SAndroid Build Coastguard Worker }
194*8975f5c5SAndroid Build Coastguard Worker
D3D11Params()195*8975f5c5SAndroid Build Coastguard Worker ClearParams D3D11Params()
196*8975f5c5SAndroid Build Coastguard Worker {
197*8975f5c5SAndroid Build Coastguard Worker ClearParams params;
198*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = egl_platform::D3D11();
199*8975f5c5SAndroid Build Coastguard Worker return params;
200*8975f5c5SAndroid Build Coastguard Worker }
201*8975f5c5SAndroid Build Coastguard Worker
MetalParams()202*8975f5c5SAndroid Build Coastguard Worker ClearParams MetalParams()
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker ClearParams params;
205*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = egl_platform::METAL();
206*8975f5c5SAndroid Build Coastguard Worker return params;
207*8975f5c5SAndroid Build Coastguard Worker }
208*8975f5c5SAndroid Build Coastguard Worker
OpenGLOrGLESParams()209*8975f5c5SAndroid Build Coastguard Worker ClearParams OpenGLOrGLESParams()
210*8975f5c5SAndroid Build Coastguard Worker {
211*8975f5c5SAndroid Build Coastguard Worker ClearParams params;
212*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = egl_platform::OPENGL_OR_GLES();
213*8975f5c5SAndroid Build Coastguard Worker return params;
214*8975f5c5SAndroid Build Coastguard Worker }
215*8975f5c5SAndroid Build Coastguard Worker
VulkanParams(bool emulatedFormat,bool scissoredClear)216*8975f5c5SAndroid Build Coastguard Worker ClearParams VulkanParams(bool emulatedFormat, bool scissoredClear)
217*8975f5c5SAndroid Build Coastguard Worker {
218*8975f5c5SAndroid Build Coastguard Worker ClearParams params;
219*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = egl_platform::VULKAN();
220*8975f5c5SAndroid Build Coastguard Worker if (emulatedFormat)
221*8975f5c5SAndroid Build Coastguard Worker {
222*8975f5c5SAndroid Build Coastguard Worker params.internalFormat = GL_RGB8;
223*8975f5c5SAndroid Build Coastguard Worker }
224*8975f5c5SAndroid Build Coastguard Worker params.scissoredClear = scissoredClear;
225*8975f5c5SAndroid Build Coastguard Worker return params;
226*8975f5c5SAndroid Build Coastguard Worker }
227*8975f5c5SAndroid Build Coastguard Worker
228*8975f5c5SAndroid Build Coastguard Worker } // anonymous namespace
229*8975f5c5SAndroid Build Coastguard Worker
TEST_P(ClearBenchmark,Run)230*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearBenchmark, Run)
231*8975f5c5SAndroid Build Coastguard Worker {
232*8975f5c5SAndroid Build Coastguard Worker run();
233*8975f5c5SAndroid Build Coastguard Worker }
234*8975f5c5SAndroid Build Coastguard Worker
235*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(ClearBenchmark,
236*8975f5c5SAndroid Build Coastguard Worker D3D11Params(),
237*8975f5c5SAndroid Build Coastguard Worker MetalParams(),
238*8975f5c5SAndroid Build Coastguard Worker OpenGLOrGLESParams(),
239*8975f5c5SAndroid Build Coastguard Worker VulkanParams(false, false),
240*8975f5c5SAndroid Build Coastguard Worker VulkanParams(true, false),
241*8975f5c5SAndroid Build Coastguard Worker VulkanParams(false, true));
242