1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2017 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 // BlitFramebufferPerf:
7*8975f5c5SAndroid Build Coastguard Worker // Performance tests for glBlitFramebuffer in ES3. Includes tests for
8*8975f5c5SAndroid Build Coastguard Worker // color, depth, and stencil blit, as well as the mutlisample versions.
9*8975f5c5SAndroid Build Coastguard Worker // The test works by clearing a framebuffer, then blitting it to a second.
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker #include "util/gles_loader_autogen.h"
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Worker namespace
16*8975f5c5SAndroid Build Coastguard Worker {
17*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kIterationsPerStep = 5;
18*8975f5c5SAndroid Build Coastguard Worker
19*8975f5c5SAndroid Build Coastguard Worker enum class BufferType
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker COLOR,
22*8975f5c5SAndroid Build Coastguard Worker DEPTH,
23*8975f5c5SAndroid Build Coastguard Worker STENCIL,
24*8975f5c5SAndroid Build Coastguard Worker DEPTH_STENCIL
25*8975f5c5SAndroid Build Coastguard Worker };
26*8975f5c5SAndroid Build Coastguard Worker
BufferTypeString(BufferType type)27*8975f5c5SAndroid Build Coastguard Worker const char *BufferTypeString(BufferType type)
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker switch (type)
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker case BufferType::COLOR:
32*8975f5c5SAndroid Build Coastguard Worker return "color";
33*8975f5c5SAndroid Build Coastguard Worker case BufferType::DEPTH:
34*8975f5c5SAndroid Build Coastguard Worker return "depth";
35*8975f5c5SAndroid Build Coastguard Worker case BufferType::STENCIL:
36*8975f5c5SAndroid Build Coastguard Worker return "stencil";
37*8975f5c5SAndroid Build Coastguard Worker case BufferType::DEPTH_STENCIL:
38*8975f5c5SAndroid Build Coastguard Worker return "depth_stencil";
39*8975f5c5SAndroid Build Coastguard Worker default:
40*8975f5c5SAndroid Build Coastguard Worker return "error";
41*8975f5c5SAndroid Build Coastguard Worker }
42*8975f5c5SAndroid Build Coastguard Worker }
43*8975f5c5SAndroid Build Coastguard Worker
BufferTypeMask(BufferType type)44*8975f5c5SAndroid Build Coastguard Worker GLbitfield BufferTypeMask(BufferType type)
45*8975f5c5SAndroid Build Coastguard Worker {
46*8975f5c5SAndroid Build Coastguard Worker switch (type)
47*8975f5c5SAndroid Build Coastguard Worker {
48*8975f5c5SAndroid Build Coastguard Worker case BufferType::COLOR:
49*8975f5c5SAndroid Build Coastguard Worker return GL_COLOR_BUFFER_BIT;
50*8975f5c5SAndroid Build Coastguard Worker case BufferType::DEPTH:
51*8975f5c5SAndroid Build Coastguard Worker return GL_DEPTH_BUFFER_BIT;
52*8975f5c5SAndroid Build Coastguard Worker case BufferType::STENCIL:
53*8975f5c5SAndroid Build Coastguard Worker return GL_STENCIL_BUFFER_BIT;
54*8975f5c5SAndroid Build Coastguard Worker case BufferType::DEPTH_STENCIL:
55*8975f5c5SAndroid Build Coastguard Worker return (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
56*8975f5c5SAndroid Build Coastguard Worker default:
57*8975f5c5SAndroid Build Coastguard Worker return 0;
58*8975f5c5SAndroid Build Coastguard Worker }
59*8975f5c5SAndroid Build Coastguard Worker }
60*8975f5c5SAndroid Build Coastguard Worker
BufferTypeFormat(BufferType type)61*8975f5c5SAndroid Build Coastguard Worker GLenum BufferTypeFormat(BufferType type)
62*8975f5c5SAndroid Build Coastguard Worker {
63*8975f5c5SAndroid Build Coastguard Worker switch (type)
64*8975f5c5SAndroid Build Coastguard Worker {
65*8975f5c5SAndroid Build Coastguard Worker case BufferType::COLOR:
66*8975f5c5SAndroid Build Coastguard Worker return GL_RGBA8;
67*8975f5c5SAndroid Build Coastguard Worker case BufferType::DEPTH:
68*8975f5c5SAndroid Build Coastguard Worker return GL_DEPTH_COMPONENT24;
69*8975f5c5SAndroid Build Coastguard Worker case BufferType::STENCIL:
70*8975f5c5SAndroid Build Coastguard Worker return GL_STENCIL_INDEX8;
71*8975f5c5SAndroid Build Coastguard Worker case BufferType::DEPTH_STENCIL:
72*8975f5c5SAndroid Build Coastguard Worker return GL_DEPTH24_STENCIL8;
73*8975f5c5SAndroid Build Coastguard Worker default:
74*8975f5c5SAndroid Build Coastguard Worker return GL_NONE;
75*8975f5c5SAndroid Build Coastguard Worker }
76*8975f5c5SAndroid Build Coastguard Worker }
77*8975f5c5SAndroid Build Coastguard Worker
BufferTypeAttachment(BufferType type)78*8975f5c5SAndroid Build Coastguard Worker GLenum BufferTypeAttachment(BufferType type)
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker switch (type)
81*8975f5c5SAndroid Build Coastguard Worker {
82*8975f5c5SAndroid Build Coastguard Worker case BufferType::COLOR:
83*8975f5c5SAndroid Build Coastguard Worker return GL_COLOR_ATTACHMENT0;
84*8975f5c5SAndroid Build Coastguard Worker case BufferType::DEPTH:
85*8975f5c5SAndroid Build Coastguard Worker return GL_DEPTH_ATTACHMENT;
86*8975f5c5SAndroid Build Coastguard Worker case BufferType::STENCIL:
87*8975f5c5SAndroid Build Coastguard Worker return GL_STENCIL_ATTACHMENT;
88*8975f5c5SAndroid Build Coastguard Worker case BufferType::DEPTH_STENCIL:
89*8975f5c5SAndroid Build Coastguard Worker return GL_DEPTH_STENCIL_ATTACHMENT;
90*8975f5c5SAndroid Build Coastguard Worker default:
91*8975f5c5SAndroid Build Coastguard Worker return GL_NONE;
92*8975f5c5SAndroid Build Coastguard Worker }
93*8975f5c5SAndroid Build Coastguard Worker }
94*8975f5c5SAndroid Build Coastguard Worker
95*8975f5c5SAndroid Build Coastguard Worker struct BlitFramebufferParams final : public RenderTestParams
96*8975f5c5SAndroid Build Coastguard Worker {
BlitFramebufferParams__anon1971e1b20111::BlitFramebufferParams97*8975f5c5SAndroid Build Coastguard Worker BlitFramebufferParams()
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker iterationsPerStep = kIterationsPerStep;
100*8975f5c5SAndroid Build Coastguard Worker majorVersion = 3;
101*8975f5c5SAndroid Build Coastguard Worker minorVersion = 0;
102*8975f5c5SAndroid Build Coastguard Worker windowWidth = 256;
103*8975f5c5SAndroid Build Coastguard Worker windowHeight = 256;
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker
story__anon1971e1b20111::BlitFramebufferParams106*8975f5c5SAndroid Build Coastguard Worker std::string story() const override
107*8975f5c5SAndroid Build Coastguard Worker {
108*8975f5c5SAndroid Build Coastguard Worker std::stringstream storyStr;
109*8975f5c5SAndroid Build Coastguard Worker storyStr << RenderTestParams::story();
110*8975f5c5SAndroid Build Coastguard Worker storyStr << "_" << BufferTypeString(type);
111*8975f5c5SAndroid Build Coastguard Worker if (samples > 1)
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker storyStr << "_" << samples << "_samples";
114*8975f5c5SAndroid Build Coastguard Worker }
115*8975f5c5SAndroid Build Coastguard Worker return storyStr.str();
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker
118*8975f5c5SAndroid Build Coastguard Worker BufferType type = BufferType::COLOR;
119*8975f5c5SAndroid Build Coastguard Worker unsigned int framebufferSize = 512;
120*8975f5c5SAndroid Build Coastguard Worker unsigned int samples = 0;
121*8975f5c5SAndroid Build Coastguard Worker };
122*8975f5c5SAndroid Build Coastguard Worker
operator <<(std::ostream & os,const BlitFramebufferParams & params)123*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const BlitFramebufferParams ¶ms)
124*8975f5c5SAndroid Build Coastguard Worker {
125*8975f5c5SAndroid Build Coastguard Worker os << params.backendAndStory().substr(1);
126*8975f5c5SAndroid Build Coastguard Worker return os;
127*8975f5c5SAndroid Build Coastguard Worker }
128*8975f5c5SAndroid Build Coastguard Worker
129*8975f5c5SAndroid Build Coastguard Worker class BlitFramebufferPerf : public ANGLERenderTest,
130*8975f5c5SAndroid Build Coastguard Worker public ::testing::WithParamInterface<BlitFramebufferParams>
131*8975f5c5SAndroid Build Coastguard Worker {
132*8975f5c5SAndroid Build Coastguard Worker public:
BlitFramebufferPerf()133*8975f5c5SAndroid Build Coastguard Worker BlitFramebufferPerf() : ANGLERenderTest("BlitFramebufferPerf", GetParam()) {}
134*8975f5c5SAndroid Build Coastguard Worker
135*8975f5c5SAndroid Build Coastguard Worker void initializeBenchmark() override;
136*8975f5c5SAndroid Build Coastguard Worker void destroyBenchmark() override;
137*8975f5c5SAndroid Build Coastguard Worker void drawBenchmark() override;
138*8975f5c5SAndroid Build Coastguard Worker
139*8975f5c5SAndroid Build Coastguard Worker private:
140*8975f5c5SAndroid Build Coastguard Worker GLuint mReadFramebuffer = 0;
141*8975f5c5SAndroid Build Coastguard Worker GLuint mReadRenderbuffer = 0;
142*8975f5c5SAndroid Build Coastguard Worker GLuint mDrawFramebuffer = 0;
143*8975f5c5SAndroid Build Coastguard Worker GLuint mDrawRenderbuffer = 0;
144*8975f5c5SAndroid Build Coastguard Worker };
145*8975f5c5SAndroid Build Coastguard Worker
initializeBenchmark()146*8975f5c5SAndroid Build Coastguard Worker void BlitFramebufferPerf::initializeBenchmark()
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker const auto ¶m = GetParam();
149*8975f5c5SAndroid Build Coastguard Worker
150*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mReadFramebuffer);
151*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mDrawFramebuffer);
152*8975f5c5SAndroid Build Coastguard Worker
153*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, mReadFramebuffer);
154*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mDrawFramebuffer);
155*8975f5c5SAndroid Build Coastguard Worker
156*8975f5c5SAndroid Build Coastguard Worker // Create source and destination Renderbuffers.
157*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &mReadRenderbuffer);
158*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &mDrawRenderbuffer);
159*8975f5c5SAndroid Build Coastguard Worker
160*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
161*8975f5c5SAndroid Build Coastguard Worker
162*8975f5c5SAndroid Build Coastguard Worker GLenum format = BufferTypeFormat(param.type);
163*8975f5c5SAndroid Build Coastguard Worker GLuint size = param.framebufferSize;
164*8975f5c5SAndroid Build Coastguard Worker GLenum attachment = BufferTypeAttachment(param.type);
165*8975f5c5SAndroid Build Coastguard Worker
166*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mReadRenderbuffer);
167*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, param.samples, format, size, size);
168*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, attachment, GL_RENDERBUFFER, mReadRenderbuffer);
169*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_READ_FRAMEBUFFER));
170*8975f5c5SAndroid Build Coastguard Worker
171*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mDrawRenderbuffer);
172*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 0, format, size, size);
173*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, attachment, GL_RENDERBUFFER, mDrawRenderbuffer);
174*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
175*8975f5c5SAndroid Build Coastguard Worker
176*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
177*8975f5c5SAndroid Build Coastguard Worker }
178*8975f5c5SAndroid Build Coastguard Worker
destroyBenchmark()179*8975f5c5SAndroid Build Coastguard Worker void BlitFramebufferPerf::destroyBenchmark()
180*8975f5c5SAndroid Build Coastguard Worker {
181*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mReadFramebuffer);
182*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &mReadRenderbuffer);
183*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mDrawFramebuffer);
184*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &mDrawRenderbuffer);
185*8975f5c5SAndroid Build Coastguard Worker }
186*8975f5c5SAndroid Build Coastguard Worker
drawBenchmark()187*8975f5c5SAndroid Build Coastguard Worker void BlitFramebufferPerf::drawBenchmark()
188*8975f5c5SAndroid Build Coastguard Worker {
189*8975f5c5SAndroid Build Coastguard Worker const auto ¶m = GetParam();
190*8975f5c5SAndroid Build Coastguard Worker auto size = param.framebufferSize;
191*8975f5c5SAndroid Build Coastguard Worker auto mask = BufferTypeMask(param.type);
192*8975f5c5SAndroid Build Coastguard Worker
193*8975f5c5SAndroid Build Coastguard Worker // We don't read from the draw buffer (ie rendering) to simplify the test, but we could.
194*8975f5c5SAndroid Build Coastguard Worker // This might trigger a flush, or we could trigger a flush manually to ensure the blit happens.
195*8975f5c5SAndroid Build Coastguard Worker // TODO(jmadill): Investigate performance on Vulkan, and placement of Clear call.
196*8975f5c5SAndroid Build Coastguard Worker
197*8975f5c5SAndroid Build Coastguard Worker switch (param.type)
198*8975f5c5SAndroid Build Coastguard Worker {
199*8975f5c5SAndroid Build Coastguard Worker case BufferType::COLOR:
200*8975f5c5SAndroid Build Coastguard Worker {
201*8975f5c5SAndroid Build Coastguard Worker GLfloat clearValues[4] = {1.0f, 0.0f, 0.0f, 1.0f};
202*8975f5c5SAndroid Build Coastguard Worker glClearBufferfv(GL_COLOR, 0, clearValues);
203*8975f5c5SAndroid Build Coastguard Worker break;
204*8975f5c5SAndroid Build Coastguard Worker }
205*8975f5c5SAndroid Build Coastguard Worker case BufferType::DEPTH:
206*8975f5c5SAndroid Build Coastguard Worker {
207*8975f5c5SAndroid Build Coastguard Worker GLfloat clearDepthValue = 0.5f;
208*8975f5c5SAndroid Build Coastguard Worker glClearBufferfv(GL_DEPTH, 0, &clearDepthValue);
209*8975f5c5SAndroid Build Coastguard Worker break;
210*8975f5c5SAndroid Build Coastguard Worker }
211*8975f5c5SAndroid Build Coastguard Worker case BufferType::STENCIL:
212*8975f5c5SAndroid Build Coastguard Worker {
213*8975f5c5SAndroid Build Coastguard Worker GLint clearStencilValue = 1;
214*8975f5c5SAndroid Build Coastguard Worker glClearBufferiv(GL_STENCIL, 0, &clearStencilValue);
215*8975f5c5SAndroid Build Coastguard Worker break;
216*8975f5c5SAndroid Build Coastguard Worker }
217*8975f5c5SAndroid Build Coastguard Worker case BufferType::DEPTH_STENCIL:
218*8975f5c5SAndroid Build Coastguard Worker glClearBufferfi(GL_DEPTH_STENCIL, 0, 0.5f, 1);
219*8975f5c5SAndroid Build Coastguard Worker break;
220*8975f5c5SAndroid Build Coastguard Worker }
221*8975f5c5SAndroid Build Coastguard Worker
222*8975f5c5SAndroid Build Coastguard Worker for (unsigned int iteration = 0; iteration < param.iterationsPerStep; ++iteration)
223*8975f5c5SAndroid Build Coastguard Worker {
224*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, size, size, 0, 0, size, size, mask, GL_NEAREST);
225*8975f5c5SAndroid Build Coastguard Worker }
226*8975f5c5SAndroid Build Coastguard Worker }
227*8975f5c5SAndroid Build Coastguard Worker
TEST_P(BlitFramebufferPerf,Run)228*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferPerf, Run)
229*8975f5c5SAndroid Build Coastguard Worker {
230*8975f5c5SAndroid Build Coastguard Worker run();
231*8975f5c5SAndroid Build Coastguard Worker }
232*8975f5c5SAndroid Build Coastguard Worker
Vulkan(BufferType type,unsigned int samples)233*8975f5c5SAndroid Build Coastguard Worker BlitFramebufferParams Vulkan(BufferType type, unsigned int samples)
234*8975f5c5SAndroid Build Coastguard Worker {
235*8975f5c5SAndroid Build Coastguard Worker BlitFramebufferParams params;
236*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = angle::egl_platform::VULKAN();
237*8975f5c5SAndroid Build Coastguard Worker params.type = type;
238*8975f5c5SAndroid Build Coastguard Worker params.samples = samples;
239*8975f5c5SAndroid Build Coastguard Worker return params;
240*8975f5c5SAndroid Build Coastguard Worker }
D3D11(BufferType type,unsigned int samples)241*8975f5c5SAndroid Build Coastguard Worker BlitFramebufferParams D3D11(BufferType type, unsigned int samples)
242*8975f5c5SAndroid Build Coastguard Worker {
243*8975f5c5SAndroid Build Coastguard Worker BlitFramebufferParams params;
244*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = angle::egl_platform::D3D11();
245*8975f5c5SAndroid Build Coastguard Worker params.type = type;
246*8975f5c5SAndroid Build Coastguard Worker params.samples = samples;
247*8975f5c5SAndroid Build Coastguard Worker return params;
248*8975f5c5SAndroid Build Coastguard Worker }
249*8975f5c5SAndroid Build Coastguard Worker } // anonymous namespace
250*8975f5c5SAndroid Build Coastguard Worker
251*8975f5c5SAndroid Build Coastguard Worker // TODO(jmadill): Programatically generate these combinations.
252*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(BlitFramebufferPerf,
253*8975f5c5SAndroid Build Coastguard Worker D3D11(BufferType::COLOR, 0),
254*8975f5c5SAndroid Build Coastguard Worker D3D11(BufferType::DEPTH, 0),
255*8975f5c5SAndroid Build Coastguard Worker D3D11(BufferType::STENCIL, 0),
256*8975f5c5SAndroid Build Coastguard Worker D3D11(BufferType::DEPTH_STENCIL, 0),
257*8975f5c5SAndroid Build Coastguard Worker D3D11(BufferType::COLOR, 2),
258*8975f5c5SAndroid Build Coastguard Worker D3D11(BufferType::DEPTH, 2),
259*8975f5c5SAndroid Build Coastguard Worker D3D11(BufferType::STENCIL, 2),
260*8975f5c5SAndroid Build Coastguard Worker D3D11(BufferType::DEPTH_STENCIL, 2),
261*8975f5c5SAndroid Build Coastguard Worker Vulkan(BufferType::COLOR, 0),
262*8975f5c5SAndroid Build Coastguard Worker Vulkan(BufferType::DEPTH, 0),
263*8975f5c5SAndroid Build Coastguard Worker Vulkan(BufferType::STENCIL, 0),
264*8975f5c5SAndroid Build Coastguard Worker Vulkan(BufferType::DEPTH_STENCIL, 0),
265*8975f5c5SAndroid Build Coastguard Worker Vulkan(BufferType::COLOR, 2),
266*8975f5c5SAndroid Build Coastguard Worker Vulkan(BufferType::DEPTH, 2),
267*8975f5c5SAndroid Build Coastguard Worker Vulkan(BufferType::STENCIL, 2),
268*8975f5c5SAndroid Build Coastguard Worker Vulkan(BufferType::DEPTH_STENCIL, 2));
269*8975f5c5SAndroid Build Coastguard Worker
270*8975f5c5SAndroid Build Coastguard Worker // This test suite is not instantiated on some OSes.
271*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlitFramebufferPerf);
272