blob: c61c8820bff4d209bda1674bb6df71b87aff3533 [file] [log] [blame]
Martin Radev6a6199b2017-06-05 17:30:55 +03001//
2// Copyright (c) 2017 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// MultiviewPerfTest:
7// Performance tests for multiview rendering.
8// - MultiviewCPUBoundBenchmark issues many draw calls and state changes to stress the CPU.
9// - MultiviewGPUBoundBenchmark draws half a million quads with multiple attributes per vertex in
10// order to stress the GPU's memory system.
11//
12
13#include "ANGLEPerfTest.h"
14#include "common/vector_utils.h"
Martin Radevfca78132017-09-06 13:51:39 +030015#include "platform/WorkaroundsD3D.h"
Martin Radev6a6199b2017-06-05 17:30:55 +030016#include "test_utils/gl_raii.h"
Jamie Madillba319ba2018-12-29 10:29:33 -050017#include "util/shader_utils.h"
Martin Radev6a6199b2017-06-05 17:30:55 +030018
19#include <string.h>
20
21using namespace angle;
22
23namespace
24{
25
26std::string GetShaderExtensionHeader(bool usesMultiview, int numViews, GLenum shaderType)
27{
28 if (!usesMultiview)
29 {
30 return "";
31 }
32
33 if (shaderType == GL_VERTEX_SHADER)
34 {
35 return "#extension GL_OVR_multiview : require\nlayout(num_views = " + ToString(numViews) +
36 ") in;\n";
37 ;
38 }
Martin Radev6a6199b2017-06-05 17:30:55 +030039 return "#extension GL_OVR_multiview : require\n";
40}
41
42struct Vertex
43{
44 Vector4 position;
45 Vector4 colorAttributeData[6];
46};
47
48enum class MultiviewOption
49{
50 NoAcceleration,
Martin Radevfca78132017-09-06 13:51:39 +030051 InstancedMultiviewVertexShader,
52 InstancedMultiviewGeometryShader,
Martin Radev6a6199b2017-06-05 17:30:55 +030053
54 Unspecified
55};
56
Martin Radevfca78132017-09-06 13:51:39 +030057using MultiviewPerfWorkload = std::pair<int, int>;
58
Martin Radev6a6199b2017-06-05 17:30:55 +030059struct MultiviewPerfParams final : public RenderTestParams
60{
Martin Radevfca78132017-09-06 13:51:39 +030061 MultiviewPerfParams(const EGLPlatformParameters &platformParametersIn,
62 const MultiviewPerfWorkload &workloadIn,
63 MultiviewOption multiviewOptionIn)
Martin Radev6a6199b2017-06-05 17:30:55 +030064 {
Jamie Madill3402d522018-10-30 15:14:52 -040065 iterationsPerStep = 1;
Jamie Madillb980c562018-11-27 11:34:27 -050066 majorVersion = 3;
67 minorVersion = 0;
68 eglParameters = platformParametersIn;
69 windowWidth = workloadIn.first;
70 windowHeight = workloadIn.second;
71 multiviewOption = multiviewOptionIn;
72 numViews = 2;
Martin Radev6a6199b2017-06-05 17:30:55 +030073 }
74
75 std::string suffix() const override
76 {
77 std::string name = RenderTestParams::suffix();
78 switch (multiviewOption)
79 {
80 case MultiviewOption::NoAcceleration:
81 name += "_no_acc";
82 break;
Martin Radevfca78132017-09-06 13:51:39 +030083 case MultiviewOption::InstancedMultiviewVertexShader:
84 name += "_instanced_multiview_vertex_shader";
85 break;
86 case MultiviewOption::InstancedMultiviewGeometryShader:
87 name += "_instanced_multiview_geometry_shader";
Martin Radev6a6199b2017-06-05 17:30:55 +030088 break;
89 default:
Jamie Madillba319ba2018-12-29 10:29:33 -050090 name += "_error";
91 break;
Martin Radev6a6199b2017-06-05 17:30:55 +030092 }
93 name += "_" + ToString(numViews) + "_views";
94 return name;
95 }
96
97 MultiviewOption multiviewOption;
98 int numViews;
99};
100
101std::ostream &operator<<(std::ostream &os, const MultiviewPerfParams &params)
102{
103 os << params.suffix().substr(1);
104 return os;
105}
106
107class MultiviewBenchmark : public ANGLERenderTest,
108 public ::testing::WithParamInterface<MultiviewPerfParams>
109{
110 public:
111 MultiviewBenchmark(const std::string &testName)
Jamie Madill0ea96212018-10-30 15:14:51 -0400112 : ANGLERenderTest(testName, GetParam()), mProgram(0)
Martin Radev6a6199b2017-06-05 17:30:55 +0300113 {
Jamie Madill0ea96212018-10-30 15:14:51 -0400114 addExtensionPrerequisite("GL_ANGLE_multiview");
Martin Radev6a6199b2017-06-05 17:30:55 +0300115 }
Jamie Madill0ea96212018-10-30 15:14:51 -0400116
Martin Radev6a6199b2017-06-05 17:30:55 +0300117 virtual ~MultiviewBenchmark()
118 {
119 if (mProgram != 0)
120 {
121 glDeleteProgram(mProgram);
122 }
123 }
124
125 void initializeBenchmark() override;
126 void drawBenchmark() final;
127
Martin Radevfca78132017-09-06 13:51:39 +0300128 void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) override
129 {
130 workarounds->selectViewInGeometryShader =
131 (GetParam().multiviewOption == MultiviewOption::InstancedMultiviewGeometryShader);
132 }
133
Martin Radev6a6199b2017-06-05 17:30:55 +0300134 protected:
135 virtual void renderScene() = 0;
136
Jamie Madill35cd7332018-12-02 12:03:33 -0500137 void createProgram(const char *vs, const char *fs)
Martin Radev6a6199b2017-06-05 17:30:55 +0300138 {
139 mProgram = CompileProgram(vs, fs);
140 if (mProgram == 0)
141 {
142 FAIL() << "shader compilation failed.";
143 }
144 glUseProgram(mProgram);
145 ASSERT_GL_NO_ERROR();
146 }
147
148 GLuint mProgram;
149 GLVertexArray mVAO;
150 GLBuffer mVBO;
151
152 private:
153 GLFramebuffer mFramebuffer;
154 GLTexture mColorTexture;
155 GLTexture mDepthTexture;
156};
157
158class MultiviewCPUBoundBenchmark : public MultiviewBenchmark
159{
160 public:
161 MultiviewCPUBoundBenchmark() : MultiviewBenchmark("MultiviewCPUBoundBenchmark") {}
162
163 void initializeBenchmark() override;
164
165 protected:
166 void renderScene() override;
167};
168
169class MultiviewGPUBoundBenchmark : public MultiviewBenchmark
170{
171 public:
172 MultiviewGPUBoundBenchmark() : MultiviewBenchmark("MultiviewGPUBoundBenchmark") {}
173
174 void initializeBenchmark() override;
175
176 protected:
177 void renderScene() override;
178};
179
180void MultiviewBenchmark::initializeBenchmark()
181{
182 const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
Martin Radev6a6199b2017-06-05 17:30:55 +0300183
184 glBindTexture(GL_TEXTURE_2D, mColorTexture);
185 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, params->windowWidth, params->windowHeight, 0, GL_RGBA,
Luc Ferronadcf0ae2018-01-24 08:27:37 -0500186 GL_UNSIGNED_BYTE, nullptr);
Martin Radev6a6199b2017-06-05 17:30:55 +0300187
188 glBindTexture(GL_TEXTURE_2D, mDepthTexture);
189 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, params->windowWidth, params->windowHeight,
Luc Ferronadcf0ae2018-01-24 08:27:37 -0500190 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
Martin Radev6a6199b2017-06-05 17:30:55 +0300191
192 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
193
194 switch (params->multiviewOption)
195 {
196 case MultiviewOption::NoAcceleration:
197 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
198 mColorTexture, 0);
199 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
200 mDepthTexture, 0);
201 break;
Martin Radevfca78132017-09-06 13:51:39 +0300202 case MultiviewOption::InstancedMultiviewVertexShader:
203 case MultiviewOption::InstancedMultiviewGeometryShader:
Martin Radev6a6199b2017-06-05 17:30:55 +0300204 {
205 const int widthPerView = params->windowWidth / params->numViews;
206 std::vector<GLint> viewportOffsets(2 * params->numViews);
207 for (int i = 0u; i < params->numViews; ++i)
208 {
209 viewportOffsets[i * 2] = i * widthPerView;
210 viewportOffsets[i * 2 + 1] = 0;
211 }
212 glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
213 mColorTexture, 0, params->numViews,
214 viewportOffsets.data());
215 glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
216 mDepthTexture, 0, params->numViews,
217 viewportOffsets.data());
218 break;
219 }
Jamie Madillba319ba2018-12-29 10:29:33 -0500220 case MultiviewOption::Unspecified:
221 // implementation error.
222 break;
Martin Radev6a6199b2017-06-05 17:30:55 +0300223 }
224
225 GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
226 glDrawBuffers(1, DrawBuffers);
227
228 ASSERT_GL_NO_ERROR();
229}
230
231void MultiviewBenchmark::drawBenchmark()
232{
233 const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
234 const int viewWidth = params->windowWidth / params->numViews;
235 const int viewHeight = params->windowHeight;
236
237 switch (params->multiviewOption)
238 {
239 case MultiviewOption::NoAcceleration:
240 glEnable(GL_SCISSOR_TEST);
241 // Iterate over each view and render the scene.
242 for (int i = 0; i < params->numViews; ++i)
243 {
244 glViewport(viewWidth * i, 0, viewWidth, viewHeight);
245 glScissor(viewWidth * i, 0, viewWidth, viewHeight);
246 renderScene();
247 }
248 break;
Martin Radevfca78132017-09-06 13:51:39 +0300249 case MultiviewOption::InstancedMultiviewVertexShader:
250 case MultiviewOption::InstancedMultiviewGeometryShader:
Martin Radev6a6199b2017-06-05 17:30:55 +0300251 glViewport(0, 0, viewWidth, viewHeight);
252 glScissor(0, 0, viewWidth, viewHeight);
253 renderScene();
254 break;
Jamie Madillba319ba2018-12-29 10:29:33 -0500255 case MultiviewOption::Unspecified:
256 // implementation error.
257 break;
Martin Radev6a6199b2017-06-05 17:30:55 +0300258 }
259
260 ASSERT_GL_NO_ERROR();
261}
262
263void MultiviewCPUBoundBenchmark::initializeBenchmark()
264{
265 MultiviewBenchmark::initializeBenchmark();
266
267 const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
268 const bool usesMultiview = (params->multiviewOption != MultiviewOption::NoAcceleration);
269
Jamie Madill35cd7332018-12-02 12:03:33 -0500270 const std::string vs =
Martin Radev6a6199b2017-06-05 17:30:55 +0300271 "#version 300 es\n" +
272 GetShaderExtensionHeader(usesMultiview, params->numViews, GL_VERTEX_SHADER) +
273 "layout(location=0) in vec4 vPosition;\n"
274 "uniform vec2 uOffset;\n"
275 "void main()\n"
276 "{\n"
277 " vec4 v = vPosition;\n"
278 " v.xy += uOffset;\n"
279 " gl_Position = v;\n"
280 "}\n";
281
Jamie Madill35cd7332018-12-02 12:03:33 -0500282 const std::string fs =
Martin Radev6a6199b2017-06-05 17:30:55 +0300283 "#version 300 es\n" +
284 GetShaderExtensionHeader(usesMultiview, params->numViews, GL_FRAGMENT_SHADER) +
285 "precision mediump float;\n"
286 "out vec4 col;\n"
287 "uniform float uColor;\n"
288 "void main()\n"
289 "{\n"
290 " col = vec4(1.);\n"
291 "}\n";
292
Jamie Madill35cd7332018-12-02 12:03:33 -0500293 createProgram(vs.c_str(), fs.c_str());
Martin Radev6a6199b2017-06-05 17:30:55 +0300294
295 const float viewWidth = static_cast<float>(params->windowWidth / params->numViews);
296 const float viewHeight = static_cast<float>(params->windowHeight);
297 const float quadWidth = 2.f / viewWidth;
298 const float quadHeight = 2.f / viewHeight;
299 Vector4 vertices[6] = {Vector4(.0f, .0f, .0f, 1.f),
300 Vector4(quadWidth, .0f, .0f, 1.f),
301 Vector4(quadWidth, quadHeight, 0.f, 1.f),
302 Vector4(.0f, .0f, 0.f, 1.f),
303 Vector4(quadWidth, quadHeight, .0f, 1.f),
304 Vector4(.0f, quadHeight, .0f, 1.f)};
305
306 glBindVertexArray(mVAO);
307
308 glBindBuffer(GL_ARRAY_BUFFER, mVBO);
309 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(Vector4), vertices, GL_STATIC_DRAW);
310
311 const GLint posLoc = glGetAttribLocation(mProgram, "vPosition");
312 glVertexAttribPointer(posLoc, 4, GL_FLOAT, GL_FALSE, 0, 0);
313 glEnableVertexAttribArray(posLoc);
314
315 // Render once to guarantee that the program is compiled and linked.
316 drawBenchmark();
317
318 ASSERT_GL_NO_ERROR();
319}
320
321void MultiviewCPUBoundBenchmark::renderScene()
322{
323 glClearColor(0, 0, 0, 0);
324 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
325 glUseProgram(mProgram);
326
327 glBindVertexArray(mVAO);
328
329 const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
330 const int viewWidth = params->windowWidth / params->numViews;
331 const int viewHeight = params->windowHeight;
332
333 for (int w = 0; w < viewWidth; ++w)
334 {
335 for (int h = 0; h < viewHeight; ++h)
336 {
337 const float wf = static_cast<float>(w) / viewWidth;
338 const float wh = static_cast<float>(h) / viewHeight;
339 glUniform2f(glGetUniformLocation(mProgram, "uOffset"), 2.f * wf - 1.f, 2.f * wh - 1.f);
340 glUniform1f(glGetUniformLocation(mProgram, "uColor"), wf);
341 glDrawArrays(GL_TRIANGLES, 0, 6);
342 }
343 }
344}
345
346void MultiviewGPUBoundBenchmark::initializeBenchmark()
347{
348 MultiviewBenchmark::initializeBenchmark();
349
350 const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
351 const bool usesMultiview = (params->multiviewOption != MultiviewOption::NoAcceleration);
352
353 const std::string &vs =
354 "#version 300 es\n" +
355 GetShaderExtensionHeader(usesMultiview, params->numViews, GL_VERTEX_SHADER) +
356 "layout(location=0) in vec4 vPosition;\n"
357 "layout(location=1) in vec4 vert_Col0;\n"
358 "layout(location=2) in vec4 vert_Col1;\n"
359 "layout(location=3) in vec4 vert_Col2;\n"
360 "layout(location=4) in vec4 vert_Col3;\n"
361 "layout(location=5) in vec4 vert_Col4;\n"
362 "layout(location=6) in vec4 vert_Col5;\n"
363 "out vec4 frag_Col0;\n"
364 "out vec4 frag_Col1;\n"
365 "out vec4 frag_Col2;\n"
366 "out vec4 frag_Col3;\n"
367 "out vec4 frag_Col4;\n"
368 "out vec4 frag_Col5;\n"
369 "void main()\n"
370 "{\n"
371 " frag_Col0 = vert_Col0;\n"
372 " frag_Col1 = vert_Col1;\n"
373 " frag_Col2 = vert_Col2;\n"
374 " frag_Col3 = vert_Col3;\n"
375 " frag_Col4 = vert_Col4;\n"
376 " frag_Col5 = vert_Col5;\n"
377 " gl_Position = vPosition;\n"
378 "}\n";
379
380 const std::string &fs =
381 "#version 300 es\n" +
382 GetShaderExtensionHeader(usesMultiview, params->numViews, GL_FRAGMENT_SHADER) +
383 "precision mediump float;\n"
384 "in vec4 frag_Col0;\n"
385 "in vec4 frag_Col1;\n"
386 "in vec4 frag_Col2;\n"
387 "in vec4 frag_Col3;\n"
388 "in vec4 frag_Col4;\n"
389 "in vec4 frag_Col5;\n"
390 "out vec4 col;\n"
391 "void main()\n"
392 "{\n"
393 " col += frag_Col0;\n"
394 " col += frag_Col1;\n"
395 " col += frag_Col2;\n"
396 " col += frag_Col3;\n"
397 " col += frag_Col4;\n"
398 " col += frag_Col5;\n"
399 "}\n";
400
Jamie Madill35cd7332018-12-02 12:03:33 -0500401 createProgram(vs.c_str(), fs.c_str());
Martin Radev6a6199b2017-06-05 17:30:55 +0300402 ASSERT_GL_NO_ERROR();
403
404 // Generate a vertex buffer of triangulated quads so that we have one quad per pixel.
405 const int viewWidth = params->windowWidth / params->numViews;
406 const int viewHeight = params->windowHeight;
407 const float quadWidth = 2.f / static_cast<float>(viewWidth);
408 const float quadHeight = 2.f / static_cast<float>(viewHeight);
409 const int kNumQuads = viewWidth * viewHeight;
410 const int kNumVerticesPerQuad = 6;
411 std::vector<Vertex> vertexData(kNumQuads * kNumVerticesPerQuad);
412 for (int h = 0; h < viewHeight; ++h)
413 {
414 for (int w = 0; w < viewWidth; ++w)
415 {
416 float wf = static_cast<float>(w) / viewWidth;
417 float hf = static_cast<float>(h) / viewHeight;
418
419 size_t index = static_cast<size_t>(h * viewWidth + w) * 6u;
420
421 auto &v0 = vertexData[index];
422 v0.position = Vector4(2.f * wf - 1.f, 2.f * hf - 1.f, .0f, 1.f);
423 memset(v0.colorAttributeData, 0, sizeof(v0.colorAttributeData));
424
425 auto &v1 = vertexData[index + 1];
426 v1.position = Vector4(v0.position.x() + quadWidth, v0.position.y(), .0f, 1.f);
427 memset(v1.colorAttributeData, 0, sizeof(v1.colorAttributeData));
428
429 auto &v2 = vertexData[index + 2];
430 v2.position = Vector4(v1.position.x(), v1.position.y() + quadHeight, .0f, 1.f);
431 memset(v2.colorAttributeData, 0, sizeof(v2.colorAttributeData));
432
433 auto &v3 = vertexData[index + 3];
434 v3.position = v0.position;
435 memset(v3.colorAttributeData, 0, sizeof(v3.colorAttributeData));
436
437 auto &v4 = vertexData[index + 4];
438 v4.position = v2.position;
439 memset(v4.colorAttributeData, 0, sizeof(v4.colorAttributeData));
440
441 auto &v5 = vertexData[index + 5];
442 v5.position = Vector4(v0.position.x(), v0.position.y() + quadHeight, .0f, 1.f);
443 memset(v5.colorAttributeData, 0, sizeof(v5.colorAttributeData));
444 }
445 }
446
447 glBindVertexArray(mVAO);
448
449 glBindBuffer(GL_ARRAY_BUFFER, mVBO);
450 glBufferData(GL_ARRAY_BUFFER, vertexData.size() * sizeof(Vertex), vertexData.data(),
451 GL_STATIC_DRAW);
452
453 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
454 glEnableVertexAttribArray(0);
455
456 for (unsigned int i = 0u; i < 6u; ++i)
457 {
458 size_t offset = sizeof(Vector4) * (i + 1u);
459 glVertexAttribPointer(i + 1, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),
460 reinterpret_cast<const void *>(offset));
461 glEnableVertexAttribArray(i + 1);
462 }
463
464 // Render once to guarantee that the program is compiled and linked.
465 drawBenchmark();
466}
467
468void MultiviewGPUBoundBenchmark::renderScene()
469{
470 glClearColor(0, 0, 0, 0);
471 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
472 glUseProgram(mProgram);
473
474 glBindVertexArray(mVAO);
475
476 const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
477 const int viewWidth = params->windowWidth / params->numViews;
478 const int viewHeight = params->windowHeight;
479 glDrawArrays(GL_TRIANGLES, 0, viewWidth * viewHeight * 6);
480}
481
Martin Radevfca78132017-09-06 13:51:39 +0300482namespace
Martin Radev6a6199b2017-06-05 17:30:55 +0300483{
Martin Radevfca78132017-09-06 13:51:39 +0300484MultiviewPerfWorkload SmallWorkload()
485{
486 return MultiviewPerfWorkload(64, 64);
Martin Radev6a6199b2017-06-05 17:30:55 +0300487}
488
Martin Radevfca78132017-09-06 13:51:39 +0300489MultiviewPerfWorkload BigWorkload()
Martin Radev6a6199b2017-06-05 17:30:55 +0300490{
Martin Radevfca78132017-09-06 13:51:39 +0300491 return MultiviewPerfWorkload(1024, 768);
Martin Radev6a6199b2017-06-05 17:30:55 +0300492}
493
Martin Radevfca78132017-09-06 13:51:39 +0300494MultiviewPerfParams NoAcceleration(const EGLPlatformParameters &eglParameters,
495 const MultiviewPerfWorkload &workload)
496{
497 return MultiviewPerfParams(eglParameters, workload, MultiviewOption::NoAcceleration);
498}
499
500MultiviewPerfParams SelectViewInGeometryShader(const MultiviewPerfWorkload &workload)
501{
502 return MultiviewPerfParams(egl_platform::D3D11(), workload,
503 MultiviewOption::InstancedMultiviewGeometryShader);
504}
505
506MultiviewPerfParams SelectViewInVertexShader(const EGLPlatformParameters &eglParameters,
507 const MultiviewPerfWorkload &workload)
508{
509 return MultiviewPerfParams(eglParameters, workload,
510 MultiviewOption::InstancedMultiviewVertexShader);
511}
512} // namespace
513
Martin Radev6a6199b2017-06-05 17:30:55 +0300514TEST_P(MultiviewCPUBoundBenchmark, Run)
515{
516 run();
517}
518
519ANGLE_INSTANTIATE_TEST(MultiviewCPUBoundBenchmark,
Yuly Novikovb8d26642017-10-27 18:14:14 -0400520 NoAcceleration(egl_platform::OPENGL_OR_GLES(false), SmallWorkload()),
Martin Radevfca78132017-09-06 13:51:39 +0300521 NoAcceleration(egl_platform::D3D11(), SmallWorkload()),
522 SelectViewInGeometryShader(SmallWorkload()),
Yuly Novikovb8d26642017-10-27 18:14:14 -0400523 SelectViewInVertexShader(egl_platform::OPENGL_OR_GLES(false),
524 SmallWorkload()),
Martin Radevfca78132017-09-06 13:51:39 +0300525 SelectViewInVertexShader(egl_platform::D3D11(), SmallWorkload()));
Martin Radev6a6199b2017-06-05 17:30:55 +0300526
527TEST_P(MultiviewGPUBoundBenchmark, Run)
528{
529 run();
530}
531
532ANGLE_INSTANTIATE_TEST(MultiviewGPUBoundBenchmark,
Yuly Novikovb8d26642017-10-27 18:14:14 -0400533 NoAcceleration(egl_platform::OPENGL_OR_GLES(false), BigWorkload()),
Martin Radevfca78132017-09-06 13:51:39 +0300534 NoAcceleration(egl_platform::D3D11(), BigWorkload()),
535 SelectViewInGeometryShader(BigWorkload()),
Yuly Novikovb8d26642017-10-27 18:14:14 -0400536 SelectViewInVertexShader(egl_platform::OPENGL_OR_GLES(false), BigWorkload()),
Martin Radevfca78132017-09-06 13:51:39 +0300537 SelectViewInVertexShader(egl_platform::D3D11(), BigWorkload()));
Martin Radev6a6199b2017-06-05 17:30:55 +0300538
Yuly Novikovb8d26642017-10-27 18:14:14 -0400539} // anonymous namespace