1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2024 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 // MultisampleResolvePerf:
7*8975f5c5SAndroid Build Coastguard Worker // Performance tests for glBlitFramebuffer and glInvalidateFramebuffer where the framebuffer is
8*8975f5c5SAndroid Build Coastguard Worker // multisampled.
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker namespace
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kIterationsPerStep = 1;
17*8975f5c5SAndroid Build Coastguard Worker
18*8975f5c5SAndroid Build Coastguard Worker enum class Multisample
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker Yes,
21*8975f5c5SAndroid Build Coastguard Worker No,
22*8975f5c5SAndroid Build Coastguard Worker };
23*8975f5c5SAndroid Build Coastguard Worker
24*8975f5c5SAndroid Build Coastguard Worker enum class WithDepthStencil
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker Yes,
27*8975f5c5SAndroid Build Coastguard Worker No,
28*8975f5c5SAndroid Build Coastguard Worker };
29*8975f5c5SAndroid Build Coastguard Worker
30*8975f5c5SAndroid Build Coastguard Worker struct MultisampleResolveParams final : public RenderTestParams
31*8975f5c5SAndroid Build Coastguard Worker {
MultisampleResolveParams__anonb4b2056f0111::MultisampleResolveParams32*8975f5c5SAndroid Build Coastguard Worker MultisampleResolveParams(Multisample multisample, WithDepthStencil depthStencil)
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker iterationsPerStep = kIterationsPerStep;
35*8975f5c5SAndroid Build Coastguard Worker majorVersion = 3;
36*8975f5c5SAndroid Build Coastguard Worker minorVersion = 0;
37*8975f5c5SAndroid Build Coastguard Worker windowWidth = 256;
38*8975f5c5SAndroid Build Coastguard Worker windowHeight = 256;
39*8975f5c5SAndroid Build Coastguard Worker
40*8975f5c5SAndroid Build Coastguard Worker if (multisample == Multisample::No)
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker samples = 0;
43*8975f5c5SAndroid Build Coastguard Worker }
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Worker withDepthStencil = depthStencil == WithDepthStencil::Yes;
46*8975f5c5SAndroid Build Coastguard Worker }
47*8975f5c5SAndroid Build Coastguard Worker
story__anonb4b2056f0111::MultisampleResolveParams48*8975f5c5SAndroid Build Coastguard Worker std::string story() const override
49*8975f5c5SAndroid Build Coastguard Worker {
50*8975f5c5SAndroid Build Coastguard Worker std::stringstream storyStr;
51*8975f5c5SAndroid Build Coastguard Worker storyStr << RenderTestParams::story();
52*8975f5c5SAndroid Build Coastguard Worker if (withDepthStencil)
53*8975f5c5SAndroid Build Coastguard Worker {
54*8975f5c5SAndroid Build Coastguard Worker storyStr << "_ds";
55*8975f5c5SAndroid Build Coastguard Worker }
56*8975f5c5SAndroid Build Coastguard Worker if (samples == 0)
57*8975f5c5SAndroid Build Coastguard Worker {
58*8975f5c5SAndroid Build Coastguard Worker storyStr << "_singlesampled_reference";
59*8975f5c5SAndroid Build Coastguard Worker }
60*8975f5c5SAndroid Build Coastguard Worker return storyStr.str();
61*8975f5c5SAndroid Build Coastguard Worker }
62*8975f5c5SAndroid Build Coastguard Worker
63*8975f5c5SAndroid Build Coastguard Worker unsigned int framebufferSize = 1024;
64*8975f5c5SAndroid Build Coastguard Worker unsigned int samples = 4;
65*8975f5c5SAndroid Build Coastguard Worker bool withDepthStencil = false;
66*8975f5c5SAndroid Build Coastguard Worker };
67*8975f5c5SAndroid Build Coastguard Worker
operator <<(std::ostream & os,const MultisampleResolveParams & params)68*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const MultisampleResolveParams ¶ms)
69*8975f5c5SAndroid Build Coastguard Worker {
70*8975f5c5SAndroid Build Coastguard Worker os << params.backendAndStory().substr(1);
71*8975f5c5SAndroid Build Coastguard Worker return os;
72*8975f5c5SAndroid Build Coastguard Worker }
73*8975f5c5SAndroid Build Coastguard Worker
74*8975f5c5SAndroid Build Coastguard Worker class MultisampleResolvePerf : public ANGLERenderTest,
75*8975f5c5SAndroid Build Coastguard Worker public ::testing::WithParamInterface<MultisampleResolveParams>
76*8975f5c5SAndroid Build Coastguard Worker {
77*8975f5c5SAndroid Build Coastguard Worker public:
MultisampleResolvePerf()78*8975f5c5SAndroid Build Coastguard Worker MultisampleResolvePerf() : ANGLERenderTest("MultisampleResolvePerf", GetParam()) {}
79*8975f5c5SAndroid Build Coastguard Worker
80*8975f5c5SAndroid Build Coastguard Worker void initializeBenchmark() override;
81*8975f5c5SAndroid Build Coastguard Worker void destroyBenchmark() override;
82*8975f5c5SAndroid Build Coastguard Worker void drawBenchmark() override;
83*8975f5c5SAndroid Build Coastguard Worker
84*8975f5c5SAndroid Build Coastguard Worker private:
85*8975f5c5SAndroid Build Coastguard Worker GLuint mMSAAFramebuffer = 0;
86*8975f5c5SAndroid Build Coastguard Worker GLuint mMSAAColor[2] = {};
87*8975f5c5SAndroid Build Coastguard Worker GLuint mMSAADepthStencil = 0;
88*8975f5c5SAndroid Build Coastguard Worker GLuint mResolveFramebuffer[2] = {};
89*8975f5c5SAndroid Build Coastguard Worker GLuint mResolveColor[2] = {};
90*8975f5c5SAndroid Build Coastguard Worker GLuint mResolveDepthStencil = 0;
91*8975f5c5SAndroid Build Coastguard Worker GLuint mReferenceFramebuffer = 0;
92*8975f5c5SAndroid Build Coastguard Worker GLuint mProgram = 0;
93*8975f5c5SAndroid Build Coastguard Worker };
94*8975f5c5SAndroid Build Coastguard Worker
initializeBenchmark()95*8975f5c5SAndroid Build Coastguard Worker void MultisampleResolvePerf::initializeBenchmark()
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker const MultisampleResolveParams ¶m = GetParam();
98*8975f5c5SAndroid Build Coastguard Worker
99*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mMSAAFramebuffer);
100*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(2, mResolveFramebuffer);
101*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mReferenceFramebuffer);
102*8975f5c5SAndroid Build Coastguard Worker
103*8975f5c5SAndroid Build Coastguard Worker // Create source and destination Renderbuffers.
104*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(2, mMSAAColor);
105*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &mMSAADepthStencil);
106*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(2, mResolveColor);
107*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &mResolveDepthStencil);
108*8975f5c5SAndroid Build Coastguard Worker
109*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
110*8975f5c5SAndroid Build Coastguard Worker
111*8975f5c5SAndroid Build Coastguard Worker const GLuint size = param.framebufferSize;
112*8975f5c5SAndroid Build Coastguard Worker
113*8975f5c5SAndroid Build Coastguard Worker for (uint32_t i = 0; i < 2; ++i)
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mResolveColor[i]);
116*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, size, size);
117*8975f5c5SAndroid Build Coastguard Worker
118*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mResolveFramebuffer[i]);
119*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
120*8975f5c5SAndroid Build Coastguard Worker mResolveColor[i]);
121*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
122*8975f5c5SAndroid Build Coastguard Worker }
123*8975f5c5SAndroid Build Coastguard Worker
124*8975f5c5SAndroid Build Coastguard Worker if (param.withDepthStencil)
125*8975f5c5SAndroid Build Coastguard Worker {
126*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mResolveDepthStencil);
127*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, size, size);
128*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
129*8975f5c5SAndroid Build Coastguard Worker mResolveDepthStencil);
130*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
131*8975f5c5SAndroid Build Coastguard Worker }
132*8975f5c5SAndroid Build Coastguard Worker
133*8975f5c5SAndroid Build Coastguard Worker if (param.samples > 0)
134*8975f5c5SAndroid Build Coastguard Worker {
135*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mMSAAColor[0]);
136*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, param.samples, GL_RGBA8, size, size);
137*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mMSAAColor[1]);
138*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, param.samples, GL_RGBA8, size, size);
139*8975f5c5SAndroid Build Coastguard Worker
140*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMSAAFramebuffer);
141*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
142*8975f5c5SAndroid Build Coastguard Worker mMSAAColor[0]);
143*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_RENDERBUFFER,
144*8975f5c5SAndroid Build Coastguard Worker mMSAAColor[1]);
145*8975f5c5SAndroid Build Coastguard Worker
146*8975f5c5SAndroid Build Coastguard Worker if (param.withDepthStencil)
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mMSAADepthStencil);
149*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, param.samples, GL_DEPTH24_STENCIL8,
150*8975f5c5SAndroid Build Coastguard Worker size, size);
151*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
152*8975f5c5SAndroid Build Coastguard Worker mMSAADepthStencil);
153*8975f5c5SAndroid Build Coastguard Worker }
154*8975f5c5SAndroid Build Coastguard Worker
155*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
156*8975f5c5SAndroid Build Coastguard Worker }
157*8975f5c5SAndroid Build Coastguard Worker else
158*8975f5c5SAndroid Build Coastguard Worker {
159*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mReferenceFramebuffer);
160*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
161*8975f5c5SAndroid Build Coastguard Worker mResolveColor[0]);
162*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_RENDERBUFFER,
163*8975f5c5SAndroid Build Coastguard Worker mResolveColor[1]);
164*8975f5c5SAndroid Build Coastguard Worker
165*8975f5c5SAndroid Build Coastguard Worker if (param.withDepthStencil)
166*8975f5c5SAndroid Build Coastguard Worker {
167*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
168*8975f5c5SAndroid Build Coastguard Worker mResolveDepthStencil);
169*8975f5c5SAndroid Build Coastguard Worker }
170*8975f5c5SAndroid Build Coastguard Worker
171*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
172*8975f5c5SAndroid Build Coastguard Worker }
173*8975f5c5SAndroid Build Coastguard Worker
174*8975f5c5SAndroid Build Coastguard Worker GLenum bufs[3] = {GL_COLOR_ATTACHMENT0, GL_NONE, GL_COLOR_ATTACHMENT2};
175*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(3, bufs);
176*8975f5c5SAndroid Build Coastguard Worker
177*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
178*8975f5c5SAndroid Build Coastguard Worker
179*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
180*8975f5c5SAndroid Build Coastguard Worker precision highp float;
181*8975f5c5SAndroid Build Coastguard Worker void main()
182*8975f5c5SAndroid Build Coastguard Worker {
183*8975f5c5SAndroid Build Coastguard Worker // gl_VertexID x y
184*8975f5c5SAndroid Build Coastguard Worker // 0 -1 -1
185*8975f5c5SAndroid Build Coastguard Worker // 1 1 -1
186*8975f5c5SAndroid Build Coastguard Worker // 2 -1 1
187*8975f5c5SAndroid Build Coastguard Worker // 3 1 1
188*8975f5c5SAndroid Build Coastguard Worker int bit0 = gl_VertexID & 1;
189*8975f5c5SAndroid Build Coastguard Worker int bit1 = gl_VertexID >> 1;
190*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, gl_VertexID % 2 == 0 ? -1 : 1, 1);
191*8975f5c5SAndroid Build Coastguard Worker })";
192*8975f5c5SAndroid Build Coastguard Worker
193*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
194*8975f5c5SAndroid Build Coastguard Worker precision highp float;
195*8975f5c5SAndroid Build Coastguard Worker
196*8975f5c5SAndroid Build Coastguard Worker uniform vec4 value0;
197*8975f5c5SAndroid Build Coastguard Worker uniform vec4 value2;
198*8975f5c5SAndroid Build Coastguard Worker
199*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 color0;
200*8975f5c5SAndroid Build Coastguard Worker layout(location = 2) out vec4 color2;
201*8975f5c5SAndroid Build Coastguard Worker
202*8975f5c5SAndroid Build Coastguard Worker void main()
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker color0 = value0;
205*8975f5c5SAndroid Build Coastguard Worker color2 = value2;
206*8975f5c5SAndroid Build Coastguard Worker })";
207*8975f5c5SAndroid Build Coastguard Worker
208*8975f5c5SAndroid Build Coastguard Worker mProgram = CompileProgram(kVS, kFS);
209*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(0u, mProgram);
210*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
211*8975f5c5SAndroid Build Coastguard Worker
212*8975f5c5SAndroid Build Coastguard Worker const GLint color0Loc = glGetUniformLocation(mProgram, "value0");
213*8975f5c5SAndroid Build Coastguard Worker const GLint color1Loc = glGetUniformLocation(mProgram, "value2");
214*8975f5c5SAndroid Build Coastguard Worker
215*8975f5c5SAndroid Build Coastguard Worker glUniform4f(color0Loc, 1, 0, 0, 1);
216*8975f5c5SAndroid Build Coastguard Worker glUniform4f(color1Loc, 0, 1, 0, 1);
217*8975f5c5SAndroid Build Coastguard Worker }
218*8975f5c5SAndroid Build Coastguard Worker
destroyBenchmark()219*8975f5c5SAndroid Build Coastguard Worker void MultisampleResolvePerf::destroyBenchmark()
220*8975f5c5SAndroid Build Coastguard Worker {
221*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mMSAAFramebuffer);
222*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(2, mResolveFramebuffer);
223*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mReferenceFramebuffer);
224*8975f5c5SAndroid Build Coastguard Worker
225*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(2, mMSAAColor);
226*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &mMSAADepthStencil);
227*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(2, mResolveColor);
228*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &mResolveDepthStencil);
229*8975f5c5SAndroid Build Coastguard Worker
230*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mProgram);
231*8975f5c5SAndroid Build Coastguard Worker }
232*8975f5c5SAndroid Build Coastguard Worker
drawBenchmark()233*8975f5c5SAndroid Build Coastguard Worker void MultisampleResolvePerf::drawBenchmark()
234*8975f5c5SAndroid Build Coastguard Worker {
235*8975f5c5SAndroid Build Coastguard Worker const MultisampleResolveParams ¶m = GetParam();
236*8975f5c5SAndroid Build Coastguard Worker const int size = param.framebufferSize;
237*8975f5c5SAndroid Build Coastguard Worker const bool singleSampled = param.samples == 0;
238*8975f5c5SAndroid Build Coastguard Worker
239*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, size, size);
240*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
241*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
242*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
243*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x55, 0xFF);
244*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
245*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
246*8975f5c5SAndroid Build Coastguard Worker
247*8975f5c5SAndroid Build Coastguard Worker for (unsigned int iteration = 0; iteration < param.iterationsPerStep; ++iteration)
248*8975f5c5SAndroid Build Coastguard Worker {
249*8975f5c5SAndroid Build Coastguard Worker const GLenum discards[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT2,
250*8975f5c5SAndroid Build Coastguard Worker GL_DEPTH_STENCIL_ATTACHMENT};
251*8975f5c5SAndroid Build Coastguard Worker
252*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, singleSampled ? mReferenceFramebuffer : mMSAAFramebuffer);
253*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, param.withDepthStencil ? 3 : 2, discards);
254*8975f5c5SAndroid Build Coastguard Worker
255*8975f5c5SAndroid Build Coastguard Worker // Start a render pass, then resolve each attachment + invalidate them. Every render pass
256*8975f5c5SAndroid Build Coastguard Worker // should thus start with LOAD_OP_DONT_CARE and end in STORE_OP_DONT_CARE (for the
257*8975f5c5SAndroid Build Coastguard Worker // attachments) and STORE_OP_STORE (for the resolve attachments).
258*8975f5c5SAndroid Build Coastguard Worker //
259*8975f5c5SAndroid Build Coastguard Worker // In single-sampled mode, just draw. This is used to compare the performance of
260*8975f5c5SAndroid Build Coastguard Worker // multisampled with single sampled rendering.
261*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
262*8975f5c5SAndroid Build Coastguard Worker
263*8975f5c5SAndroid Build Coastguard Worker if (!singleSampled)
264*8975f5c5SAndroid Build Coastguard Worker {
265*8975f5c5SAndroid Build Coastguard Worker for (uint32_t i = 0; i < 2; ++i)
266*8975f5c5SAndroid Build Coastguard Worker {
267*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mResolveFramebuffer[i]);
268*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(discards[i]);
269*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, size, size, 0, 0, size, size, GL_COLOR_BUFFER_BIT,
270*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
271*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
272*8975f5c5SAndroid Build Coastguard Worker
273*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, &discards[i]);
274*8975f5c5SAndroid Build Coastguard Worker }
275*8975f5c5SAndroid Build Coastguard Worker
276*8975f5c5SAndroid Build Coastguard Worker if (param.withDepthStencil)
277*8975f5c5SAndroid Build Coastguard Worker {
278*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, size, size, 0, 0, size, size,
279*8975f5c5SAndroid Build Coastguard Worker GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
280*8975f5c5SAndroid Build Coastguard Worker
281*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, &discards[2]);
282*8975f5c5SAndroid Build Coastguard Worker }
283*8975f5c5SAndroid Build Coastguard Worker
284*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
285*8975f5c5SAndroid Build Coastguard Worker }
286*8975f5c5SAndroid Build Coastguard Worker }
287*8975f5c5SAndroid Build Coastguard Worker
288*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
289*8975f5c5SAndroid Build Coastguard Worker }
290*8975f5c5SAndroid Build Coastguard Worker
291*8975f5c5SAndroid Build Coastguard Worker // Test that multisample resolve + invalidate is as efficient as single sampling on tilers.
TEST_P(MultisampleResolvePerf,Run)292*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampleResolvePerf, Run)
293*8975f5c5SAndroid Build Coastguard Worker {
294*8975f5c5SAndroid Build Coastguard Worker run();
295*8975f5c5SAndroid Build Coastguard Worker }
296*8975f5c5SAndroid Build Coastguard Worker
Vulkan(Multisample multisample,WithDepthStencil depthStencil)297*8975f5c5SAndroid Build Coastguard Worker MultisampleResolveParams Vulkan(Multisample multisample, WithDepthStencil depthStencil)
298*8975f5c5SAndroid Build Coastguard Worker {
299*8975f5c5SAndroid Build Coastguard Worker MultisampleResolveParams params(multisample, depthStencil);
300*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = angle::egl_platform::VULKAN();
301*8975f5c5SAndroid Build Coastguard Worker return params;
302*8975f5c5SAndroid Build Coastguard Worker }
303*8975f5c5SAndroid Build Coastguard Worker } // anonymous namespace
304*8975f5c5SAndroid Build Coastguard Worker
305*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(MultisampleResolvePerf,
306*8975f5c5SAndroid Build Coastguard Worker Vulkan(Multisample::No, WithDepthStencil::No),
307*8975f5c5SAndroid Build Coastguard Worker Vulkan(Multisample::Yes, WithDepthStencil::No),
308*8975f5c5SAndroid Build Coastguard Worker Vulkan(Multisample::No, WithDepthStencil::Yes),
309*8975f5c5SAndroid Build Coastguard Worker Vulkan(Multisample::Yes, WithDepthStencil::Yes));
310*8975f5c5SAndroid Build Coastguard Worker
311*8975f5c5SAndroid Build Coastguard Worker // This test suite is not instantiated on some OSes.
312*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MultisampleResolvePerf);
313