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 ¶ms)
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