blob: 3671e1ea3689bd26c74843331dd6b99694b854a7 [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 "shader_utils.h"
17#include "test_utils/gl_raii.h"
18#include "tests/test_utils/ANGLETest.h"
19
20#include <string.h>
21
22using namespace angle;
23
24namespace
25{
26
27std::string GetShaderExtensionHeader(bool usesMultiview, int numViews, GLenum shaderType)
28{
29 if (!usesMultiview)
30 {
31 return "";
32 }
33
34 if (shaderType == GL_VERTEX_SHADER)
35 {
36 return "#extension GL_OVR_multiview : require\nlayout(num_views = " + ToString(numViews) +
37 ") in;\n";
38 ;
39 }
40 ASSERT(shaderType == GL_FRAGMENT_SHADER);
41 return "#extension GL_OVR_multiview : require\n";
42}
43
44struct Vertex
45{
46 Vector4 position;
47 Vector4 colorAttributeData[6];
48};
49
50enum class MultiviewOption
51{
52 NoAcceleration,
Martin Radevfca78132017-09-06 13:51:39 +030053 InstancedMultiviewVertexShader,
54 InstancedMultiviewGeometryShader,
Martin Radev6a6199b2017-06-05 17:30:55 +030055
56 Unspecified
57};
58
Martin Radevfca78132017-09-06 13:51:39 +030059using MultiviewPerfWorkload = std::pair<int, int>;
60
Martin Radev6a6199b2017-06-05 17:30:55 +030061struct MultiviewPerfParams final : public RenderTestParams
62{
Martin Radevfca78132017-09-06 13:51:39 +030063 MultiviewPerfParams(const EGLPlatformParameters &platformParametersIn,
64 const MultiviewPerfWorkload &workloadIn,
65 MultiviewOption multiviewOptionIn)
Martin Radev6a6199b2017-06-05 17:30:55 +030066 {
Jamie Madill3402d522018-10-30 15:14:52 -040067 iterationsPerStep = 1;
Jamie Madillb980c562018-11-27 11:34:27 -050068 majorVersion = 3;
69 minorVersion = 0;
70 eglParameters = platformParametersIn;
71 windowWidth = workloadIn.first;
72 windowHeight = workloadIn.second;
73 multiviewOption = multiviewOptionIn;
74 numViews = 2;
Martin Radev6a6199b2017-06-05 17:30:55 +030075 }
76
77 std::string suffix() const override
78 {
79 std::string name = RenderTestParams::suffix();
80 switch (multiviewOption)
81 {
82 case MultiviewOption::NoAcceleration:
83 name += "_no_acc";
84 break;
Martin Radevfca78132017-09-06 13:51:39 +030085 case MultiviewOption::InstancedMultiviewVertexShader:
86 name += "_instanced_multiview_vertex_shader";
87 break;
88 case MultiviewOption::InstancedMultiviewGeometryShader:
89 name += "_instanced_multiview_geometry_shader";
Martin Radev6a6199b2017-06-05 17:30:55 +030090 break;
91 default:
92 UNREACHABLE();
93 }
94 name += "_" + ToString(numViews) + "_views";
95 return name;
96 }
97
98 MultiviewOption multiviewOption;
99 int numViews;
100};
101
102std::ostream &operator<<(std::ostream &os, const MultiviewPerfParams &params)
103{
104 os << params.suffix().substr(1);
105 return os;
106}
107
108class MultiviewBenchmark : public ANGLERenderTest,
109 public ::testing::WithParamInterface<MultiviewPerfParams>
110{
111 public:
112 MultiviewBenchmark(const std::string &testName)
Jamie Madill0ea96212018-10-30 15:14:51 -0400113 : ANGLERenderTest(testName, GetParam()), mProgram(0)
Martin Radev6a6199b2017-06-05 17:30:55 +0300114 {
Jamie Madill0ea96212018-10-30 15:14:51 -0400115 addExtensionPrerequisite("GL_ANGLE_multiview");
Martin Radev6a6199b2017-06-05 17:30:55 +0300116 }
Jamie Madill0ea96212018-10-30 15:14:51 -0400117
Martin Radev6a6199b2017-06-05 17:30:55 +0300118 virtual ~MultiviewBenchmark()
119 {
120 if (mProgram != 0)
121 {
122 glDeleteProgram(mProgram);
123 }
124 }
125
126 void initializeBenchmark() override;
127 void drawBenchmark() final;
128
Martin Radevfca78132017-09-06 13:51:39 +0300129 void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) override
130 {
131 workarounds->selectViewInGeometryShader =
132 (GetParam().multiviewOption == MultiviewOption::InstancedMultiviewGeometryShader);
133 }
134
Martin Radev6a6199b2017-06-05 17:30:55 +0300135 protected:
136 virtual void renderScene() = 0;
137
Jamie Madill35cd7332018-12-02 12:03:33 -0500138 void createProgram(const char *vs, const char *fs)
Martin Radev6a6199b2017-06-05 17:30:55 +0300139 {
140 mProgram = CompileProgram(vs, fs);
141 if (mProgram == 0)
142 {
143 FAIL() << "shader compilation failed.";
144 }
145 glUseProgram(mProgram);
146 ASSERT_GL_NO_ERROR();
147 }
148
149 GLuint mProgram;
150 GLVertexArray mVAO;
151 GLBuffer mVBO;
152
153 private:
154 GLFramebuffer mFramebuffer;
155 GLTexture mColorTexture;
156 GLTexture mDepthTexture;
157};
158
159class MultiviewCPUBoundBenchmark : public MultiviewBenchmark
160{
161 public:
162 MultiviewCPUBoundBenchmark() : MultiviewBenchmark("MultiviewCPUBoundBenchmark") {}
163
164 void initializeBenchmark() override;
165
166 protected:
167 void renderScene() override;
168};
169
170class MultiviewGPUBoundBenchmark : public MultiviewBenchmark
171{
172 public:
173 MultiviewGPUBoundBenchmark() : MultiviewBenchmark("MultiviewGPUBoundBenchmark") {}
174
175 void initializeBenchmark() override;
176
177 protected:
178 void renderScene() override;
179};
180
181void MultiviewBenchmark::initializeBenchmark()
182{
183 const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
184 ASSERT(params->windowWidth % params->numViews == 0);
185
186 glBindTexture(GL_TEXTURE_2D, mColorTexture);
187 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, params->windowWidth, params->windowHeight, 0, GL_RGBA,
Luc Ferronadcf0ae2018-01-24 08:27:37 -0500188 GL_UNSIGNED_BYTE, nullptr);
Martin Radev6a6199b2017-06-05 17:30:55 +0300189
190 glBindTexture(GL_TEXTURE_2D, mDepthTexture);
191 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, params->windowWidth, params->windowHeight,
Luc Ferronadcf0ae2018-01-24 08:27:37 -0500192 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
Martin Radev6a6199b2017-06-05 17:30:55 +0300193
194 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
195
196 switch (params->multiviewOption)
197 {
198 case MultiviewOption::NoAcceleration:
199 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
200 mColorTexture, 0);
201 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
202 mDepthTexture, 0);
203 break;
Martin Radevfca78132017-09-06 13:51:39 +0300204 case MultiviewOption::InstancedMultiviewVertexShader:
205 case MultiviewOption::InstancedMultiviewGeometryShader:
Martin Radev6a6199b2017-06-05 17:30:55 +0300206 {
207 const int widthPerView = params->windowWidth / params->numViews;
208 std::vector<GLint> viewportOffsets(2 * params->numViews);
209 for (int i = 0u; i < params->numViews; ++i)
210 {
211 viewportOffsets[i * 2] = i * widthPerView;
212 viewportOffsets[i * 2 + 1] = 0;
213 }
214 glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
215 mColorTexture, 0, params->numViews,
216 viewportOffsets.data());
217 glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
218 mDepthTexture, 0, params->numViews,
219 viewportOffsets.data());
220 break;
221 }
222 default:
223 UNREACHABLE();
224 }
225
226 GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
227 glDrawBuffers(1, DrawBuffers);
228
229 ASSERT_GL_NO_ERROR();
230}
231
232void MultiviewBenchmark::drawBenchmark()
233{
234 const MultiviewPerfParams *params = static_cast<const MultiviewPerfParams *>(&mTestParams);
235 const int viewWidth = params->windowWidth / params->numViews;
236 const int viewHeight = params->windowHeight;
237
238 switch (params->multiviewOption)
239 {
240 case MultiviewOption::NoAcceleration:
241 glEnable(GL_SCISSOR_TEST);
242 // Iterate over each view and render the scene.
243 for (int i = 0; i < params->numViews; ++i)
244 {
245 glViewport(viewWidth * i, 0, viewWidth, viewHeight);
246 glScissor(viewWidth * i, 0, viewWidth, viewHeight);
247 renderScene();
248 }
249 break;
Martin Radevfca78132017-09-06 13:51:39 +0300250 case MultiviewOption::InstancedMultiviewVertexShader:
251 case MultiviewOption::InstancedMultiviewGeometryShader:
Martin Radev6a6199b2017-06-05 17:30:55 +0300252 glViewport(0, 0, viewWidth, viewHeight);
253 glScissor(0, 0, viewWidth, viewHeight);
254 renderScene();
255 break;
256 default:
257 UNREACHABLE();
258 }
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