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