xref: /aosp_15_r20/external/angle/src/tests/perf_tests/ClearPerf.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 &params)
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 &params = 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