xref: /aosp_15_r20/external/angle/src/tests/perf_tests/MultiviewPerf.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 // MultiviewPerfTest:
7*8975f5c5SAndroid Build Coastguard Worker //   Performance tests for multiview rendering.
8*8975f5c5SAndroid Build Coastguard Worker //   - MultiviewCPUBoundBenchmark issues many draw calls and state changes to stress the CPU.
9*8975f5c5SAndroid Build Coastguard Worker //   - MultiviewGPUBoundBenchmark draws half a million quads with multiple attributes per vertex in
10*8975f5c5SAndroid Build Coastguard Worker //   order to stress the GPU's memory system.
11*8975f5c5SAndroid Build Coastguard Worker //
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "common/vector_utils.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "platform/autogen/FeaturesD3D_autogen.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/MultiviewTest.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker #include <string.h>
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker namespace
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker 
GetShaderExtensionHeader(bool usesMultiview,int numViews,GLenum shaderType,ExtensionName multiviewExtension)27*8975f5c5SAndroid Build Coastguard Worker std::string GetShaderExtensionHeader(bool usesMultiview,
28*8975f5c5SAndroid Build Coastguard Worker                                      int numViews,
29*8975f5c5SAndroid Build Coastguard Worker                                      GLenum shaderType,
30*8975f5c5SAndroid Build Coastguard Worker                                      ExtensionName multiviewExtension)
31*8975f5c5SAndroid Build Coastguard Worker {
32*8975f5c5SAndroid Build Coastguard Worker     if (!usesMultiview)
33*8975f5c5SAndroid Build Coastguard Worker     {
34*8975f5c5SAndroid Build Coastguard Worker         return "";
35*8975f5c5SAndroid Build Coastguard Worker     }
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker     std::string ext;
38*8975f5c5SAndroid Build Coastguard Worker     switch (multiviewExtension)
39*8975f5c5SAndroid Build Coastguard Worker     {
40*8975f5c5SAndroid Build Coastguard Worker         case multiview:
41*8975f5c5SAndroid Build Coastguard Worker             ext = "GL_OVR_multiview";
42*8975f5c5SAndroid Build Coastguard Worker             break;
43*8975f5c5SAndroid Build Coastguard Worker         case multiview2:
44*8975f5c5SAndroid Build Coastguard Worker             ext = "GL_OVR_multiview2";
45*8975f5c5SAndroid Build Coastguard Worker             break;
46*8975f5c5SAndroid Build Coastguard Worker         default:
47*8975f5c5SAndroid Build Coastguard Worker             ext = "extension_error";
48*8975f5c5SAndroid Build Coastguard Worker     }
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker     if (shaderType == GL_VERTEX_SHADER)
51*8975f5c5SAndroid Build Coastguard Worker     {
52*8975f5c5SAndroid Build Coastguard Worker         return "#extension " + ext + " : require\nlayout(num_views = " + ToString(numViews) +
53*8975f5c5SAndroid Build Coastguard Worker                ") in;\n";
54*8975f5c5SAndroid Build Coastguard Worker     }
55*8975f5c5SAndroid Build Coastguard Worker     return "#extension " + ext + " : require\n";
56*8975f5c5SAndroid Build Coastguard Worker }
57*8975f5c5SAndroid Build Coastguard Worker 
58*8975f5c5SAndroid Build Coastguard Worker struct Vertex
59*8975f5c5SAndroid Build Coastguard Worker {
60*8975f5c5SAndroid Build Coastguard Worker     Vector4 position;
61*8975f5c5SAndroid Build Coastguard Worker     Vector4 colorAttributeData[6];
62*8975f5c5SAndroid Build Coastguard Worker };
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker enum class MultiviewOption
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker     NoAcceleration,
67*8975f5c5SAndroid Build Coastguard Worker     InstancedMultiviewVertexShader,
68*8975f5c5SAndroid Build Coastguard Worker     InstancedMultiviewGeometryShader,
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker     Unspecified
71*8975f5c5SAndroid Build Coastguard Worker };
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker using MultiviewPerfWorkload = std::pair<int, int>;
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker struct MultiviewPerfParams final : public RenderTestParams
76*8975f5c5SAndroid Build Coastguard Worker {
MultiviewPerfParams__anona6d097080111::MultiviewPerfParams77*8975f5c5SAndroid Build Coastguard Worker     MultiviewPerfParams(const EGLPlatformParameters &platformParametersIn,
78*8975f5c5SAndroid Build Coastguard Worker                         const MultiviewPerfWorkload &workloadIn,
79*8975f5c5SAndroid Build Coastguard Worker                         MultiviewOption multiviewOptionIn,
80*8975f5c5SAndroid Build Coastguard Worker                         ExtensionName multiviewExtensionIn)
81*8975f5c5SAndroid Build Coastguard Worker     {
82*8975f5c5SAndroid Build Coastguard Worker         iterationsPerStep  = 1;
83*8975f5c5SAndroid Build Coastguard Worker         majorVersion       = 3;
84*8975f5c5SAndroid Build Coastguard Worker         minorVersion       = 0;
85*8975f5c5SAndroid Build Coastguard Worker         eglParameters      = platformParametersIn;
86*8975f5c5SAndroid Build Coastguard Worker         windowWidth        = workloadIn.first;
87*8975f5c5SAndroid Build Coastguard Worker         windowHeight       = workloadIn.second;
88*8975f5c5SAndroid Build Coastguard Worker         multiviewOption    = multiviewOptionIn;
89*8975f5c5SAndroid Build Coastguard Worker         numViews           = 2;
90*8975f5c5SAndroid Build Coastguard Worker         multiviewExtension = multiviewExtensionIn;
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker         if (multiviewOption == MultiviewOption::InstancedMultiviewGeometryShader)
93*8975f5c5SAndroid Build Coastguard Worker         {
94*8975f5c5SAndroid Build Coastguard Worker             eglParameters.enable(Feature::SelectViewInGeometryShader);
95*8975f5c5SAndroid Build Coastguard Worker         }
96*8975f5c5SAndroid Build Coastguard Worker     }
97*8975f5c5SAndroid Build Coastguard Worker 
story__anona6d097080111::MultiviewPerfParams98*8975f5c5SAndroid Build Coastguard Worker     std::string story() const override
99*8975f5c5SAndroid Build Coastguard Worker     {
100*8975f5c5SAndroid Build Coastguard Worker         std::string name = RenderTestParams::story();
101*8975f5c5SAndroid Build Coastguard Worker         switch (multiviewOption)
102*8975f5c5SAndroid Build Coastguard Worker         {
103*8975f5c5SAndroid Build Coastguard Worker             case MultiviewOption::NoAcceleration:
104*8975f5c5SAndroid Build Coastguard Worker                 name += "_no_acc";
105*8975f5c5SAndroid Build Coastguard Worker                 break;
106*8975f5c5SAndroid Build Coastguard Worker             case MultiviewOption::InstancedMultiviewVertexShader:
107*8975f5c5SAndroid Build Coastguard Worker                 name += "_instanced_multiview_vertex_shader";
108*8975f5c5SAndroid Build Coastguard Worker                 break;
109*8975f5c5SAndroid Build Coastguard Worker             case MultiviewOption::InstancedMultiviewGeometryShader:
110*8975f5c5SAndroid Build Coastguard Worker                 name += "_instanced_multiview_geometry_shader";
111*8975f5c5SAndroid Build Coastguard Worker                 break;
112*8975f5c5SAndroid Build Coastguard Worker             default:
113*8975f5c5SAndroid Build Coastguard Worker                 name += "_error";
114*8975f5c5SAndroid Build Coastguard Worker                 break;
115*8975f5c5SAndroid Build Coastguard Worker         }
116*8975f5c5SAndroid Build Coastguard Worker         std::string ext;
117*8975f5c5SAndroid Build Coastguard Worker         switch (multiviewExtension)
118*8975f5c5SAndroid Build Coastguard Worker         {
119*8975f5c5SAndroid Build Coastguard Worker             case multiview:
120*8975f5c5SAndroid Build Coastguard Worker                 ext = "GL_OVR_multiview";
121*8975f5c5SAndroid Build Coastguard Worker                 break;
122*8975f5c5SAndroid Build Coastguard Worker             case multiview2:
123*8975f5c5SAndroid Build Coastguard Worker                 ext = "GL_OVR_multiview2";
124*8975f5c5SAndroid Build Coastguard Worker                 break;
125*8975f5c5SAndroid Build Coastguard Worker             default:
126*8975f5c5SAndroid Build Coastguard Worker                 ext = "extension_error";
127*8975f5c5SAndroid Build Coastguard Worker                 break;
128*8975f5c5SAndroid Build Coastguard Worker         }
129*8975f5c5SAndroid Build Coastguard Worker         name += "_" + ext;
130*8975f5c5SAndroid Build Coastguard Worker         name += "_" + ToString(numViews) + "_views";
131*8975f5c5SAndroid Build Coastguard Worker         return name;
132*8975f5c5SAndroid Build Coastguard Worker     }
133*8975f5c5SAndroid Build Coastguard Worker 
134*8975f5c5SAndroid Build Coastguard Worker     MultiviewOption multiviewOption;
135*8975f5c5SAndroid Build Coastguard Worker     int numViews;
136*8975f5c5SAndroid Build Coastguard Worker     angle::ExtensionName multiviewExtension;
137*8975f5c5SAndroid Build Coastguard Worker };
138*8975f5c5SAndroid Build Coastguard Worker 
operator <<(std::ostream & os,const MultiviewPerfParams & params)139*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const MultiviewPerfParams &params)
140*8975f5c5SAndroid Build Coastguard Worker {
141*8975f5c5SAndroid Build Coastguard Worker     os << params.backendAndStory().substr(1);
142*8975f5c5SAndroid Build Coastguard Worker     return os;
143*8975f5c5SAndroid Build Coastguard Worker }
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker class MultiviewBenchmark : public ANGLERenderTest,
146*8975f5c5SAndroid Build Coastguard Worker                            public ::testing::WithParamInterface<MultiviewPerfParams>
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker   public:
MultiviewBenchmark(const std::string & testName)149*8975f5c5SAndroid Build Coastguard Worker     MultiviewBenchmark(const std::string &testName)
150*8975f5c5SAndroid Build Coastguard Worker         : ANGLERenderTest(testName, GetParam()), mProgram(0)
151*8975f5c5SAndroid Build Coastguard Worker     {
152*8975f5c5SAndroid Build Coastguard Worker         switch (GetParam().multiviewExtension)
153*8975f5c5SAndroid Build Coastguard Worker         {
154*8975f5c5SAndroid Build Coastguard Worker             case multiview:
155*8975f5c5SAndroid Build Coastguard Worker                 addExtensionPrerequisite("GL_OVR_multiview");
156*8975f5c5SAndroid Build Coastguard Worker                 break;
157*8975f5c5SAndroid Build Coastguard Worker             case multiview2:
158*8975f5c5SAndroid Build Coastguard Worker                 addExtensionPrerequisite("GL_OVR_multiview2");
159*8975f5c5SAndroid Build Coastguard Worker                 break;
160*8975f5c5SAndroid Build Coastguard Worker             default:
161*8975f5c5SAndroid Build Coastguard Worker                 // Unknown extension.
162*8975f5c5SAndroid Build Coastguard Worker                 break;
163*8975f5c5SAndroid Build Coastguard Worker         }
164*8975f5c5SAndroid Build Coastguard Worker     }
165*8975f5c5SAndroid Build Coastguard Worker 
~MultiviewBenchmark()166*8975f5c5SAndroid Build Coastguard Worker     virtual ~MultiviewBenchmark()
167*8975f5c5SAndroid Build Coastguard Worker     {
168*8975f5c5SAndroid Build Coastguard Worker         if (mProgram != 0)
169*8975f5c5SAndroid Build Coastguard Worker         {
170*8975f5c5SAndroid Build Coastguard Worker             glDeleteProgram(mProgram);
171*8975f5c5SAndroid Build Coastguard Worker         }
172*8975f5c5SAndroid Build Coastguard Worker     }
173*8975f5c5SAndroid Build Coastguard Worker 
174*8975f5c5SAndroid Build Coastguard Worker     void initializeBenchmark() override;
175*8975f5c5SAndroid Build Coastguard Worker     void drawBenchmark() final;
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker   protected:
178*8975f5c5SAndroid Build Coastguard Worker     virtual void renderScene() = 0;
179*8975f5c5SAndroid Build Coastguard Worker 
createProgram(const char * vs,const char * fs)180*8975f5c5SAndroid Build Coastguard Worker     void createProgram(const char *vs, const char *fs)
181*8975f5c5SAndroid Build Coastguard Worker     {
182*8975f5c5SAndroid Build Coastguard Worker         mProgram = CompileProgram(vs, fs);
183*8975f5c5SAndroid Build Coastguard Worker         if (mProgram == 0)
184*8975f5c5SAndroid Build Coastguard Worker         {
185*8975f5c5SAndroid Build Coastguard Worker             FAIL() << "shader compilation failed.";
186*8975f5c5SAndroid Build Coastguard Worker         }
187*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
188*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
189*8975f5c5SAndroid Build Coastguard Worker     }
190*8975f5c5SAndroid Build Coastguard Worker 
191*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram;
192*8975f5c5SAndroid Build Coastguard Worker     GLVertexArray mVAO;
193*8975f5c5SAndroid Build Coastguard Worker     GLBuffer mVBO;
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker   private:
196*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFramebuffer;
197*8975f5c5SAndroid Build Coastguard Worker     GLTexture mColorTexture;
198*8975f5c5SAndroid Build Coastguard Worker     GLTexture mDepthTexture;
199*8975f5c5SAndroid Build Coastguard Worker };
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker class MultiviewCPUBoundBenchmark : public MultiviewBenchmark
202*8975f5c5SAndroid Build Coastguard Worker {
203*8975f5c5SAndroid Build Coastguard Worker   public:
MultiviewCPUBoundBenchmark()204*8975f5c5SAndroid Build Coastguard Worker     MultiviewCPUBoundBenchmark() : MultiviewBenchmark("MultiviewCPUBoundBenchmark") {}
205*8975f5c5SAndroid Build Coastguard Worker 
206*8975f5c5SAndroid Build Coastguard Worker     void initializeBenchmark() override;
207*8975f5c5SAndroid Build Coastguard Worker 
208*8975f5c5SAndroid Build Coastguard Worker   protected:
209*8975f5c5SAndroid Build Coastguard Worker     void renderScene() override;
210*8975f5c5SAndroid Build Coastguard Worker };
211*8975f5c5SAndroid Build Coastguard Worker 
212*8975f5c5SAndroid Build Coastguard Worker class MultiviewGPUBoundBenchmark : public MultiviewBenchmark
213*8975f5c5SAndroid Build Coastguard Worker {
214*8975f5c5SAndroid Build Coastguard Worker   public:
MultiviewGPUBoundBenchmark()215*8975f5c5SAndroid Build Coastguard Worker     MultiviewGPUBoundBenchmark() : MultiviewBenchmark("MultiviewGPUBoundBenchmark") {}
216*8975f5c5SAndroid Build Coastguard Worker 
217*8975f5c5SAndroid Build Coastguard Worker     void initializeBenchmark() override;
218*8975f5c5SAndroid Build Coastguard Worker 
219*8975f5c5SAndroid Build Coastguard Worker   protected:
220*8975f5c5SAndroid Build Coastguard Worker     void renderScene() override;
221*8975f5c5SAndroid Build Coastguard Worker };
222*8975f5c5SAndroid Build Coastguard Worker 
initializeBenchmark()223*8975f5c5SAndroid Build Coastguard Worker void MultiviewBenchmark::initializeBenchmark()
224*8975f5c5SAndroid Build Coastguard Worker {
225*8975f5c5SAndroid Build Coastguard Worker     const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
226*8975f5c5SAndroid Build Coastguard Worker 
227*8975f5c5SAndroid Build Coastguard Worker     switch (params->multiviewOption)
228*8975f5c5SAndroid Build Coastguard Worker     {
229*8975f5c5SAndroid Build Coastguard Worker         case MultiviewOption::NoAcceleration:
230*8975f5c5SAndroid Build Coastguard Worker             // No acceleration texture arrays
231*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, mColorTexture);
232*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, params->windowWidth, params->windowHeight, 0,
233*8975f5c5SAndroid Build Coastguard Worker                          GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
234*8975f5c5SAndroid Build Coastguard Worker 
235*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, mDepthTexture);
236*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, params->windowWidth,
237*8975f5c5SAndroid Build Coastguard Worker                          params->windowHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
238*8975f5c5SAndroid Build Coastguard Worker 
239*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
240*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
241*8975f5c5SAndroid Build Coastguard Worker                                    mColorTexture, 0);
242*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
243*8975f5c5SAndroid Build Coastguard Worker                                    mDepthTexture, 0);
244*8975f5c5SAndroid Build Coastguard Worker             break;
245*8975f5c5SAndroid Build Coastguard Worker         case MultiviewOption::InstancedMultiviewVertexShader:
246*8975f5c5SAndroid Build Coastguard Worker         case MultiviewOption::InstancedMultiviewGeometryShader:
247*8975f5c5SAndroid Build Coastguard Worker         {
248*8975f5c5SAndroid Build Coastguard Worker             // Multiview texture arrays
249*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D_ARRAY, mColorTexture);
250*8975f5c5SAndroid Build Coastguard Worker             glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, params->windowWidth,
251*8975f5c5SAndroid Build Coastguard Worker                          params->windowHeight, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
252*8975f5c5SAndroid Build Coastguard Worker 
253*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D_ARRAY, mDepthTexture);
254*8975f5c5SAndroid Build Coastguard Worker             glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_DEPTH_COMPONENT32F, params->windowWidth,
255*8975f5c5SAndroid Build Coastguard Worker                          params->windowHeight, 2, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
256*8975f5c5SAndroid Build Coastguard Worker 
257*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
258*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mColorTexture, 0,
259*8975f5c5SAndroid Build Coastguard Worker                                              0, params->numViews);
260*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, mDepthTexture, 0,
261*8975f5c5SAndroid Build Coastguard Worker                                              0, params->numViews);
262*8975f5c5SAndroid Build Coastguard Worker             break;
263*8975f5c5SAndroid Build Coastguard Worker         }
264*8975f5c5SAndroid Build Coastguard Worker         case MultiviewOption::Unspecified:
265*8975f5c5SAndroid Build Coastguard Worker             // implementation error.
266*8975f5c5SAndroid Build Coastguard Worker             break;
267*8975f5c5SAndroid Build Coastguard Worker     }
268*8975f5c5SAndroid Build Coastguard Worker 
269*8975f5c5SAndroid Build Coastguard Worker     GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
270*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(1, DrawBuffers);
271*8975f5c5SAndroid Build Coastguard Worker 
272*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
273*8975f5c5SAndroid Build Coastguard Worker }
274*8975f5c5SAndroid Build Coastguard Worker 
drawBenchmark()275*8975f5c5SAndroid Build Coastguard Worker void MultiviewBenchmark::drawBenchmark()
276*8975f5c5SAndroid Build Coastguard Worker {
277*8975f5c5SAndroid Build Coastguard Worker     const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
278*8975f5c5SAndroid Build Coastguard Worker     const int viewWidth               = params->windowWidth / params->numViews;
279*8975f5c5SAndroid Build Coastguard Worker     const int viewHeight              = params->windowHeight;
280*8975f5c5SAndroid Build Coastguard Worker 
281*8975f5c5SAndroid Build Coastguard Worker     switch (params->multiviewOption)
282*8975f5c5SAndroid Build Coastguard Worker     {
283*8975f5c5SAndroid Build Coastguard Worker         case MultiviewOption::NoAcceleration:
284*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_SCISSOR_TEST);
285*8975f5c5SAndroid Build Coastguard Worker             // Iterate over each view and render the scene.
286*8975f5c5SAndroid Build Coastguard Worker             for (int i = 0; i < params->numViews; ++i)
287*8975f5c5SAndroid Build Coastguard Worker             {
288*8975f5c5SAndroid Build Coastguard Worker                 glViewport(viewWidth * i, 0, viewWidth, viewHeight);
289*8975f5c5SAndroid Build Coastguard Worker                 glScissor(viewWidth * i, 0, viewWidth, viewHeight);
290*8975f5c5SAndroid Build Coastguard Worker                 renderScene();
291*8975f5c5SAndroid Build Coastguard Worker             }
292*8975f5c5SAndroid Build Coastguard Worker             break;
293*8975f5c5SAndroid Build Coastguard Worker         case MultiviewOption::InstancedMultiviewVertexShader:
294*8975f5c5SAndroid Build Coastguard Worker         case MultiviewOption::InstancedMultiviewGeometryShader:
295*8975f5c5SAndroid Build Coastguard Worker             glViewport(0, 0, viewWidth, viewHeight);
296*8975f5c5SAndroid Build Coastguard Worker             glScissor(0, 0, viewWidth, viewHeight);
297*8975f5c5SAndroid Build Coastguard Worker             renderScene();
298*8975f5c5SAndroid Build Coastguard Worker             break;
299*8975f5c5SAndroid Build Coastguard Worker         case MultiviewOption::Unspecified:
300*8975f5c5SAndroid Build Coastguard Worker             // implementation error.
301*8975f5c5SAndroid Build Coastguard Worker             break;
302*8975f5c5SAndroid Build Coastguard Worker     }
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
305*8975f5c5SAndroid Build Coastguard Worker }
306*8975f5c5SAndroid Build Coastguard Worker 
initializeBenchmark()307*8975f5c5SAndroid Build Coastguard Worker void MultiviewCPUBoundBenchmark::initializeBenchmark()
308*8975f5c5SAndroid Build Coastguard Worker {
309*8975f5c5SAndroid Build Coastguard Worker     MultiviewBenchmark::initializeBenchmark();
310*8975f5c5SAndroid Build Coastguard Worker 
311*8975f5c5SAndroid Build Coastguard Worker     const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
312*8975f5c5SAndroid Build Coastguard Worker     const bool usesMultiview = (params->multiviewOption != MultiviewOption::NoAcceleration);
313*8975f5c5SAndroid Build Coastguard Worker 
314*8975f5c5SAndroid Build Coastguard Worker     const std::string vs = "#version 300 es\n" +
315*8975f5c5SAndroid Build Coastguard Worker                            GetShaderExtensionHeader(usesMultiview, params->numViews,
316*8975f5c5SAndroid Build Coastguard Worker                                                     GL_VERTEX_SHADER, params->multiviewExtension) +
317*8975f5c5SAndroid Build Coastguard Worker                            "layout(location=0) in vec4 vPosition;\n"
318*8975f5c5SAndroid Build Coastguard Worker                            "uniform vec2 uOffset;\n"
319*8975f5c5SAndroid Build Coastguard Worker                            "void main()\n"
320*8975f5c5SAndroid Build Coastguard Worker                            "{\n"
321*8975f5c5SAndroid Build Coastguard Worker                            "   vec4 v = vPosition;\n"
322*8975f5c5SAndroid Build Coastguard Worker                            "   v.xy += uOffset;\n"
323*8975f5c5SAndroid Build Coastguard Worker                            "    gl_Position = v;\n"
324*8975f5c5SAndroid Build Coastguard Worker                            "}\n";
325*8975f5c5SAndroid Build Coastguard Worker 
326*8975f5c5SAndroid Build Coastguard Worker     const std::string fs =
327*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n" +
328*8975f5c5SAndroid Build Coastguard Worker         GetShaderExtensionHeader(usesMultiview, params->numViews, GL_FRAGMENT_SHADER,
329*8975f5c5SAndroid Build Coastguard Worker                                  params->multiviewExtension) +
330*8975f5c5SAndroid Build Coastguard Worker         "precision mediump float;\n"
331*8975f5c5SAndroid Build Coastguard Worker         "out vec4 col;\n"
332*8975f5c5SAndroid Build Coastguard Worker         "uniform float uColor;\n"
333*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
334*8975f5c5SAndroid Build Coastguard Worker         "{\n"
335*8975f5c5SAndroid Build Coastguard Worker         "    col = vec4(1.);\n"
336*8975f5c5SAndroid Build Coastguard Worker         "}\n";
337*8975f5c5SAndroid Build Coastguard Worker 
338*8975f5c5SAndroid Build Coastguard Worker     createProgram(vs.c_str(), fs.c_str());
339*8975f5c5SAndroid Build Coastguard Worker 
340*8975f5c5SAndroid Build Coastguard Worker     const float viewWidth  = static_cast<float>(params->windowWidth / params->numViews);
341*8975f5c5SAndroid Build Coastguard Worker     const float viewHeight = static_cast<float>(params->windowHeight);
342*8975f5c5SAndroid Build Coastguard Worker     const float quadWidth  = 2.f / viewWidth;
343*8975f5c5SAndroid Build Coastguard Worker     const float quadHeight = 2.f / viewHeight;
344*8975f5c5SAndroid Build Coastguard Worker     Vector4 vertices[6]    = {Vector4(.0f, .0f, .0f, 1.f),
345*8975f5c5SAndroid Build Coastguard Worker                               Vector4(quadWidth, .0f, .0f, 1.f),
346*8975f5c5SAndroid Build Coastguard Worker                               Vector4(quadWidth, quadHeight, 0.f, 1.f),
347*8975f5c5SAndroid Build Coastguard Worker                               Vector4(.0f, .0f, 0.f, 1.f),
348*8975f5c5SAndroid Build Coastguard Worker                               Vector4(quadWidth, quadHeight, .0f, 1.f),
349*8975f5c5SAndroid Build Coastguard Worker                               Vector4(.0f, quadHeight, .0f, 1.f)};
350*8975f5c5SAndroid Build Coastguard Worker 
351*8975f5c5SAndroid Build Coastguard Worker     glBindVertexArray(mVAO);
352*8975f5c5SAndroid Build Coastguard Worker 
353*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mVBO);
354*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(Vector4), vertices, GL_STATIC_DRAW);
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker     const GLint posLoc = glGetAttribLocation(mProgram, "vPosition");
357*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(posLoc, 4, GL_FLOAT, GL_FALSE, 0, 0);
358*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(posLoc);
359*8975f5c5SAndroid Build Coastguard Worker 
360*8975f5c5SAndroid Build Coastguard Worker     // Render once to guarantee that the program is compiled and linked.
361*8975f5c5SAndroid Build Coastguard Worker     drawBenchmark();
362*8975f5c5SAndroid Build Coastguard Worker 
363*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
364*8975f5c5SAndroid Build Coastguard Worker }
365*8975f5c5SAndroid Build Coastguard Worker 
renderScene()366*8975f5c5SAndroid Build Coastguard Worker void MultiviewCPUBoundBenchmark::renderScene()
367*8975f5c5SAndroid Build Coastguard Worker {
368*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 0);
369*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
370*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
371*8975f5c5SAndroid Build Coastguard Worker 
372*8975f5c5SAndroid Build Coastguard Worker     glBindVertexArray(mVAO);
373*8975f5c5SAndroid Build Coastguard Worker 
374*8975f5c5SAndroid Build Coastguard Worker     const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
375*8975f5c5SAndroid Build Coastguard Worker     const int viewWidth               = params->windowWidth / params->numViews;
376*8975f5c5SAndroid Build Coastguard Worker     const int viewHeight              = params->windowHeight;
377*8975f5c5SAndroid Build Coastguard Worker 
378*8975f5c5SAndroid Build Coastguard Worker     for (int w = 0; w < viewWidth; ++w)
379*8975f5c5SAndroid Build Coastguard Worker     {
380*8975f5c5SAndroid Build Coastguard Worker         for (int h = 0; h < viewHeight; ++h)
381*8975f5c5SAndroid Build Coastguard Worker         {
382*8975f5c5SAndroid Build Coastguard Worker             const float wf = static_cast<float>(w) / viewWidth;
383*8975f5c5SAndroid Build Coastguard Worker             const float wh = static_cast<float>(h) / viewHeight;
384*8975f5c5SAndroid Build Coastguard Worker             glUniform2f(glGetUniformLocation(mProgram, "uOffset"), 2.f * wf - 1.f, 2.f * wh - 1.f);
385*8975f5c5SAndroid Build Coastguard Worker             glUniform1f(glGetUniformLocation(mProgram, "uColor"), wf);
386*8975f5c5SAndroid Build Coastguard Worker             glDrawArrays(GL_TRIANGLES, 0, 6);
387*8975f5c5SAndroid Build Coastguard Worker         }
388*8975f5c5SAndroid Build Coastguard Worker     }
389*8975f5c5SAndroid Build Coastguard Worker }
390*8975f5c5SAndroid Build Coastguard Worker 
initializeBenchmark()391*8975f5c5SAndroid Build Coastguard Worker void MultiviewGPUBoundBenchmark::initializeBenchmark()
392*8975f5c5SAndroid Build Coastguard Worker {
393*8975f5c5SAndroid Build Coastguard Worker     MultiviewBenchmark::initializeBenchmark();
394*8975f5c5SAndroid Build Coastguard Worker 
395*8975f5c5SAndroid Build Coastguard Worker     const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
396*8975f5c5SAndroid Build Coastguard Worker     const bool usesMultiview = (params->multiviewOption != MultiviewOption::NoAcceleration);
397*8975f5c5SAndroid Build Coastguard Worker 
398*8975f5c5SAndroid Build Coastguard Worker     const std::string &vs = "#version 300 es\n" +
399*8975f5c5SAndroid Build Coastguard Worker                             GetShaderExtensionHeader(usesMultiview, params->numViews,
400*8975f5c5SAndroid Build Coastguard Worker                                                      GL_VERTEX_SHADER, params->multiviewExtension) +
401*8975f5c5SAndroid Build Coastguard Worker                             "layout(location=0) in vec4 vPosition;\n"
402*8975f5c5SAndroid Build Coastguard Worker                             "layout(location=1) in vec4 vert_Col0;\n"
403*8975f5c5SAndroid Build Coastguard Worker                             "layout(location=2) in vec4 vert_Col1;\n"
404*8975f5c5SAndroid Build Coastguard Worker                             "layout(location=3) in vec4 vert_Col2;\n"
405*8975f5c5SAndroid Build Coastguard Worker                             "layout(location=4) in vec4 vert_Col3;\n"
406*8975f5c5SAndroid Build Coastguard Worker                             "layout(location=5) in vec4 vert_Col4;\n"
407*8975f5c5SAndroid Build Coastguard Worker                             "layout(location=6) in vec4 vert_Col5;\n"
408*8975f5c5SAndroid Build Coastguard Worker                             "out vec4 frag_Col0;\n"
409*8975f5c5SAndroid Build Coastguard Worker                             "out vec4 frag_Col1;\n"
410*8975f5c5SAndroid Build Coastguard Worker                             "out vec4 frag_Col2;\n"
411*8975f5c5SAndroid Build Coastguard Worker                             "out vec4 frag_Col3;\n"
412*8975f5c5SAndroid Build Coastguard Worker                             "out vec4 frag_Col4;\n"
413*8975f5c5SAndroid Build Coastguard Worker                             "out vec4 frag_Col5;\n"
414*8975f5c5SAndroid Build Coastguard Worker                             "void main()\n"
415*8975f5c5SAndroid Build Coastguard Worker                             "{\n"
416*8975f5c5SAndroid Build Coastguard Worker                             "   frag_Col0 = vert_Col0;\n"
417*8975f5c5SAndroid Build Coastguard Worker                             "   frag_Col1 = vert_Col1;\n"
418*8975f5c5SAndroid Build Coastguard Worker                             "   frag_Col2 = vert_Col2;\n"
419*8975f5c5SAndroid Build Coastguard Worker                             "   frag_Col3 = vert_Col3;\n"
420*8975f5c5SAndroid Build Coastguard Worker                             "   frag_Col4 = vert_Col4;\n"
421*8975f5c5SAndroid Build Coastguard Worker                             "   frag_Col5 = vert_Col5;\n"
422*8975f5c5SAndroid Build Coastguard Worker                             "   gl_Position = vPosition;\n"
423*8975f5c5SAndroid Build Coastguard Worker                             "}\n";
424*8975f5c5SAndroid Build Coastguard Worker 
425*8975f5c5SAndroid Build Coastguard Worker     const std::string &fs =
426*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n" +
427*8975f5c5SAndroid Build Coastguard Worker         GetShaderExtensionHeader(usesMultiview, params->numViews, GL_FRAGMENT_SHADER,
428*8975f5c5SAndroid Build Coastguard Worker                                  params->multiviewExtension) +
429*8975f5c5SAndroid Build Coastguard Worker         "precision mediump float;\n"
430*8975f5c5SAndroid Build Coastguard Worker         "in vec4 frag_Col0;\n"
431*8975f5c5SAndroid Build Coastguard Worker         "in vec4 frag_Col1;\n"
432*8975f5c5SAndroid Build Coastguard Worker         "in vec4 frag_Col2;\n"
433*8975f5c5SAndroid Build Coastguard Worker         "in vec4 frag_Col3;\n"
434*8975f5c5SAndroid Build Coastguard Worker         "in vec4 frag_Col4;\n"
435*8975f5c5SAndroid Build Coastguard Worker         "in vec4 frag_Col5;\n"
436*8975f5c5SAndroid Build Coastguard Worker         "out vec4 col;\n"
437*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
438*8975f5c5SAndroid Build Coastguard Worker         "{\n"
439*8975f5c5SAndroid Build Coastguard Worker         "    col += frag_Col0;\n"
440*8975f5c5SAndroid Build Coastguard Worker         "    col += frag_Col1;\n"
441*8975f5c5SAndroid Build Coastguard Worker         "    col += frag_Col2;\n"
442*8975f5c5SAndroid Build Coastguard Worker         "    col += frag_Col3;\n"
443*8975f5c5SAndroid Build Coastguard Worker         "    col += frag_Col4;\n"
444*8975f5c5SAndroid Build Coastguard Worker         "    col += frag_Col5;\n"
445*8975f5c5SAndroid Build Coastguard Worker         "}\n";
446*8975f5c5SAndroid Build Coastguard Worker 
447*8975f5c5SAndroid Build Coastguard Worker     createProgram(vs.c_str(), fs.c_str());
448*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
449*8975f5c5SAndroid Build Coastguard Worker 
450*8975f5c5SAndroid Build Coastguard Worker     // Generate a vertex buffer of triangulated quads so that we have one quad per pixel.
451*8975f5c5SAndroid Build Coastguard Worker     const int viewWidth           = params->windowWidth / params->numViews;
452*8975f5c5SAndroid Build Coastguard Worker     const int viewHeight          = params->windowHeight;
453*8975f5c5SAndroid Build Coastguard Worker     const float quadWidth         = 2.f / static_cast<float>(viewWidth);
454*8975f5c5SAndroid Build Coastguard Worker     const float quadHeight        = 2.f / static_cast<float>(viewHeight);
455*8975f5c5SAndroid Build Coastguard Worker     const int kNumQuads           = viewWidth * viewHeight;
456*8975f5c5SAndroid Build Coastguard Worker     const int kNumVerticesPerQuad = 6;
457*8975f5c5SAndroid Build Coastguard Worker     std::vector<Vertex> vertexData(kNumQuads * kNumVerticesPerQuad);
458*8975f5c5SAndroid Build Coastguard Worker     for (int h = 0; h < viewHeight; ++h)
459*8975f5c5SAndroid Build Coastguard Worker     {
460*8975f5c5SAndroid Build Coastguard Worker         for (int w = 0; w < viewWidth; ++w)
461*8975f5c5SAndroid Build Coastguard Worker         {
462*8975f5c5SAndroid Build Coastguard Worker             float wf = static_cast<float>(w) / viewWidth;
463*8975f5c5SAndroid Build Coastguard Worker             float hf = static_cast<float>(h) / viewHeight;
464*8975f5c5SAndroid Build Coastguard Worker 
465*8975f5c5SAndroid Build Coastguard Worker             size_t index = static_cast<size_t>(h * viewWidth + w) * 6u;
466*8975f5c5SAndroid Build Coastguard Worker 
467*8975f5c5SAndroid Build Coastguard Worker             auto &v0    = vertexData[index];
468*8975f5c5SAndroid Build Coastguard Worker             v0.position = Vector4(2.f * wf - 1.f, 2.f * hf - 1.f, .0f, 1.f);
469*8975f5c5SAndroid Build Coastguard Worker             memset(v0.colorAttributeData, 0, sizeof(v0.colorAttributeData));
470*8975f5c5SAndroid Build Coastguard Worker 
471*8975f5c5SAndroid Build Coastguard Worker             auto &v1    = vertexData[index + 1];
472*8975f5c5SAndroid Build Coastguard Worker             v1.position = Vector4(v0.position.x() + quadWidth, v0.position.y(), .0f, 1.f);
473*8975f5c5SAndroid Build Coastguard Worker             memset(v1.colorAttributeData, 0, sizeof(v1.colorAttributeData));
474*8975f5c5SAndroid Build Coastguard Worker 
475*8975f5c5SAndroid Build Coastguard Worker             auto &v2    = vertexData[index + 2];
476*8975f5c5SAndroid Build Coastguard Worker             v2.position = Vector4(v1.position.x(), v1.position.y() + quadHeight, .0f, 1.f);
477*8975f5c5SAndroid Build Coastguard Worker             memset(v2.colorAttributeData, 0, sizeof(v2.colorAttributeData));
478*8975f5c5SAndroid Build Coastguard Worker 
479*8975f5c5SAndroid Build Coastguard Worker             auto &v3    = vertexData[index + 3];
480*8975f5c5SAndroid Build Coastguard Worker             v3.position = v0.position;
481*8975f5c5SAndroid Build Coastguard Worker             memset(v3.colorAttributeData, 0, sizeof(v3.colorAttributeData));
482*8975f5c5SAndroid Build Coastguard Worker 
483*8975f5c5SAndroid Build Coastguard Worker             auto &v4    = vertexData[index + 4];
484*8975f5c5SAndroid Build Coastguard Worker             v4.position = v2.position;
485*8975f5c5SAndroid Build Coastguard Worker             memset(v4.colorAttributeData, 0, sizeof(v4.colorAttributeData));
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker             auto &v5    = vertexData[index + 5];
488*8975f5c5SAndroid Build Coastguard Worker             v5.position = Vector4(v0.position.x(), v0.position.y() + quadHeight, .0f, 1.f);
489*8975f5c5SAndroid Build Coastguard Worker             memset(v5.colorAttributeData, 0, sizeof(v5.colorAttributeData));
490*8975f5c5SAndroid Build Coastguard Worker         }
491*8975f5c5SAndroid Build Coastguard Worker     }
492*8975f5c5SAndroid Build Coastguard Worker 
493*8975f5c5SAndroid Build Coastguard Worker     glBindVertexArray(mVAO);
494*8975f5c5SAndroid Build Coastguard Worker 
495*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mVBO);
496*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, vertexData.size() * sizeof(Vertex), vertexData.data(),
497*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
498*8975f5c5SAndroid Build Coastguard Worker 
499*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
500*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(0);
501*8975f5c5SAndroid Build Coastguard Worker 
502*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int i = 0u; i < 6u; ++i)
503*8975f5c5SAndroid Build Coastguard Worker     {
504*8975f5c5SAndroid Build Coastguard Worker         size_t offset = sizeof(Vector4) * (i + 1u);
505*8975f5c5SAndroid Build Coastguard Worker         glVertexAttribPointer(i + 1, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),
506*8975f5c5SAndroid Build Coastguard Worker                               reinterpret_cast<const void *>(offset));
507*8975f5c5SAndroid Build Coastguard Worker         glEnableVertexAttribArray(i + 1);
508*8975f5c5SAndroid Build Coastguard Worker     }
509*8975f5c5SAndroid Build Coastguard Worker 
510*8975f5c5SAndroid Build Coastguard Worker     // Render once to guarantee that the program is compiled and linked.
511*8975f5c5SAndroid Build Coastguard Worker     drawBenchmark();
512*8975f5c5SAndroid Build Coastguard Worker }
513*8975f5c5SAndroid Build Coastguard Worker 
renderScene()514*8975f5c5SAndroid Build Coastguard Worker void MultiviewGPUBoundBenchmark::renderScene()
515*8975f5c5SAndroid Build Coastguard Worker {
516*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 0);
517*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
518*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
519*8975f5c5SAndroid Build Coastguard Worker 
520*8975f5c5SAndroid Build Coastguard Worker     glBindVertexArray(mVAO);
521*8975f5c5SAndroid Build Coastguard Worker 
522*8975f5c5SAndroid Build Coastguard Worker     const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
523*8975f5c5SAndroid Build Coastguard Worker     const int viewWidth               = params->windowWidth / params->numViews;
524*8975f5c5SAndroid Build Coastguard Worker     const int viewHeight              = params->windowHeight;
525*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, viewWidth * viewHeight * 6);
526*8975f5c5SAndroid Build Coastguard Worker }
527*8975f5c5SAndroid Build Coastguard Worker 
528*8975f5c5SAndroid Build Coastguard Worker namespace
529*8975f5c5SAndroid Build Coastguard Worker {
SmallWorkload()530*8975f5c5SAndroid Build Coastguard Worker MultiviewPerfWorkload SmallWorkload()
531*8975f5c5SAndroid Build Coastguard Worker {
532*8975f5c5SAndroid Build Coastguard Worker     return MultiviewPerfWorkload(64, 64);
533*8975f5c5SAndroid Build Coastguard Worker }
534*8975f5c5SAndroid Build Coastguard Worker 
BigWorkload()535*8975f5c5SAndroid Build Coastguard Worker MultiviewPerfWorkload BigWorkload()
536*8975f5c5SAndroid Build Coastguard Worker {
537*8975f5c5SAndroid Build Coastguard Worker     return MultiviewPerfWorkload(1024, 768);
538*8975f5c5SAndroid Build Coastguard Worker }
539*8975f5c5SAndroid Build Coastguard Worker 
NoAcceleration(const EGLPlatformParameters & eglParameters,const MultiviewPerfWorkload & workload,ExtensionName multiviewExtensionIn)540*8975f5c5SAndroid Build Coastguard Worker MultiviewPerfParams NoAcceleration(const EGLPlatformParameters &eglParameters,
541*8975f5c5SAndroid Build Coastguard Worker                                    const MultiviewPerfWorkload &workload,
542*8975f5c5SAndroid Build Coastguard Worker                                    ExtensionName multiviewExtensionIn)
543*8975f5c5SAndroid Build Coastguard Worker {
544*8975f5c5SAndroid Build Coastguard Worker     return MultiviewPerfParams(eglParameters, workload, MultiviewOption::NoAcceleration,
545*8975f5c5SAndroid Build Coastguard Worker                                multiviewExtensionIn);
546*8975f5c5SAndroid Build Coastguard Worker }
547*8975f5c5SAndroid Build Coastguard Worker 
SelectViewInGeometryShader(const MultiviewPerfWorkload & workload,ExtensionName multiviewExtensionIn)548*8975f5c5SAndroid Build Coastguard Worker MultiviewPerfParams SelectViewInGeometryShader(const MultiviewPerfWorkload &workload,
549*8975f5c5SAndroid Build Coastguard Worker                                                ExtensionName multiviewExtensionIn)
550*8975f5c5SAndroid Build Coastguard Worker {
551*8975f5c5SAndroid Build Coastguard Worker     return MultiviewPerfParams(egl_platform::D3D11(), workload,
552*8975f5c5SAndroid Build Coastguard Worker                                MultiviewOption::InstancedMultiviewGeometryShader,
553*8975f5c5SAndroid Build Coastguard Worker                                multiviewExtensionIn);
554*8975f5c5SAndroid Build Coastguard Worker }
555*8975f5c5SAndroid Build Coastguard Worker 
SelectViewInVertexShader(const EGLPlatformParameters & eglParameters,const MultiviewPerfWorkload & workload,ExtensionName multiviewExtensionIn)556*8975f5c5SAndroid Build Coastguard Worker MultiviewPerfParams SelectViewInVertexShader(const EGLPlatformParameters &eglParameters,
557*8975f5c5SAndroid Build Coastguard Worker                                              const MultiviewPerfWorkload &workload,
558*8975f5c5SAndroid Build Coastguard Worker                                              ExtensionName multiviewExtensionIn)
559*8975f5c5SAndroid Build Coastguard Worker {
560*8975f5c5SAndroid Build Coastguard Worker     return MultiviewPerfParams(eglParameters, workload,
561*8975f5c5SAndroid Build Coastguard Worker                                MultiviewOption::InstancedMultiviewVertexShader,
562*8975f5c5SAndroid Build Coastguard Worker                                multiviewExtensionIn);
563*8975f5c5SAndroid Build Coastguard Worker }
564*8975f5c5SAndroid Build Coastguard Worker }  // namespace
565*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(MultiviewCPUBoundBenchmark,Run)566*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultiviewCPUBoundBenchmark, Run)
567*8975f5c5SAndroid Build Coastguard Worker {
568*8975f5c5SAndroid Build Coastguard Worker     run();
569*8975f5c5SAndroid Build Coastguard Worker }
570*8975f5c5SAndroid Build Coastguard Worker 
571*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(
572*8975f5c5SAndroid Build Coastguard Worker     MultiviewCPUBoundBenchmark,
573*8975f5c5SAndroid Build Coastguard Worker     NoAcceleration(egl_platform::OPENGL_OR_GLES(), SmallWorkload(), ExtensionName::multiview),
574*8975f5c5SAndroid Build Coastguard Worker     NoAcceleration(egl_platform::D3D11(), SmallWorkload(), ExtensionName::multiview),
575*8975f5c5SAndroid Build Coastguard Worker     SelectViewInGeometryShader(SmallWorkload(), ExtensionName::multiview),
576*8975f5c5SAndroid Build Coastguard Worker     SelectViewInVertexShader(egl_platform::OPENGL_OR_GLES(),
577*8975f5c5SAndroid Build Coastguard Worker                              SmallWorkload(),
578*8975f5c5SAndroid Build Coastguard Worker                              ExtensionName::multiview),
579*8975f5c5SAndroid Build Coastguard Worker     SelectViewInVertexShader(egl_platform::D3D11(), SmallWorkload(), ExtensionName::multiview),
580*8975f5c5SAndroid Build Coastguard Worker     NoAcceleration(egl_platform::OPENGL_OR_GLES(), SmallWorkload(), ExtensionName::multiview2),
581*8975f5c5SAndroid Build Coastguard Worker     NoAcceleration(egl_platform::D3D11(), SmallWorkload(), ExtensionName::multiview2),
582*8975f5c5SAndroid Build Coastguard Worker     SelectViewInGeometryShader(SmallWorkload(), ExtensionName::multiview2),
583*8975f5c5SAndroid Build Coastguard Worker     SelectViewInVertexShader(egl_platform::OPENGL_OR_GLES(),
584*8975f5c5SAndroid Build Coastguard Worker                              SmallWorkload(),
585*8975f5c5SAndroid Build Coastguard Worker                              ExtensionName::multiview2),
586*8975f5c5SAndroid Build Coastguard Worker     SelectViewInVertexShader(egl_platform::D3D11(), SmallWorkload(), ExtensionName::multiview2));
587*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(MultiviewGPUBoundBenchmark,Run)588*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultiviewGPUBoundBenchmark, Run)
589*8975f5c5SAndroid Build Coastguard Worker {
590*8975f5c5SAndroid Build Coastguard Worker     run();
591*8975f5c5SAndroid Build Coastguard Worker }
592*8975f5c5SAndroid Build Coastguard Worker 
593*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(
594*8975f5c5SAndroid Build Coastguard Worker     MultiviewGPUBoundBenchmark,
595*8975f5c5SAndroid Build Coastguard Worker     NoAcceleration(egl_platform::OPENGL_OR_GLES(), BigWorkload(), ExtensionName::multiview),
596*8975f5c5SAndroid Build Coastguard Worker     NoAcceleration(egl_platform::D3D11(), BigWorkload(), ExtensionName::multiview),
597*8975f5c5SAndroid Build Coastguard Worker     SelectViewInGeometryShader(BigWorkload(), ExtensionName::multiview),
598*8975f5c5SAndroid Build Coastguard Worker     SelectViewInVertexShader(egl_platform::OPENGL_OR_GLES(),
599*8975f5c5SAndroid Build Coastguard Worker                              BigWorkload(),
600*8975f5c5SAndroid Build Coastguard Worker                              ExtensionName::multiview),
601*8975f5c5SAndroid Build Coastguard Worker     SelectViewInVertexShader(egl_platform::D3D11(), BigWorkload(), ExtensionName::multiview),
602*8975f5c5SAndroid Build Coastguard Worker     NoAcceleration(egl_platform::OPENGL_OR_GLES(), BigWorkload(), ExtensionName::multiview2),
603*8975f5c5SAndroid Build Coastguard Worker     NoAcceleration(egl_platform::D3D11(), BigWorkload(), ExtensionName::multiview2),
604*8975f5c5SAndroid Build Coastguard Worker     SelectViewInGeometryShader(BigWorkload(), ExtensionName::multiview2),
605*8975f5c5SAndroid Build Coastguard Worker     SelectViewInVertexShader(egl_platform::OPENGL_OR_GLES(),
606*8975f5c5SAndroid Build Coastguard Worker                              BigWorkload(),
607*8975f5c5SAndroid Build Coastguard Worker                              ExtensionName::multiview2),
608*8975f5c5SAndroid Build Coastguard Worker     SelectViewInVertexShader(egl_platform::D3D11(), BigWorkload(), ExtensionName::multiview2));
609*8975f5c5SAndroid Build Coastguard Worker 
610*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
611