Add some shared utilities for multiview tests
This prepares for fixing multiview test resource init/teardown order.
BUG=angleproject:2765
TEST=angle_end2end_tests
Change-Id: I841327416fa76ac682310ef1b2309f5bb4e9fbac
Reviewed-on: https://chromium-review.googlesource.com/1179155
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/tests/test_utils/MultiviewTest.h b/src/tests/test_utils/MultiviewTest.h
new file mode 100644
index 0000000..840cb97
--- /dev/null
+++ b/src/tests/test_utils/MultiviewTest.h
@@ -0,0 +1,94 @@
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// MultiviewTest:
+// Implementation of helpers for multiview testing.
+//
+
+#ifndef ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_
+#define ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_
+
+#include "test_utils/ANGLETest.h"
+
+namespace angle
+{
+
+// Creates a simple program that passes through two-dimensional vertices and renders green
+// fragments.
+GLuint CreateSimplePassthroughProgram(int numViews);
+
+struct MultiviewImplementationParams : public PlatformParameters
+{
+ MultiviewImplementationParams(GLint majorVersion,
+ GLint minorVersion,
+ bool forceUseGeometryShaderOnD3D,
+ const EGLPlatformParameters &eglPlatformParameters)
+ : PlatformParameters(majorVersion, minorVersion, eglPlatformParameters),
+ mForceUseGeometryShaderOnD3D(forceUseGeometryShaderOnD3D)
+ {
+ }
+ bool mForceUseGeometryShaderOnD3D;
+};
+std::ostream &operator<<(std::ostream &os, const MultiviewImplementationParams ¶ms);
+
+MultiviewImplementationParams VertexShaderOpenGL(GLint majorVersion, GLint minorVersion);
+MultiviewImplementationParams VertexShaderD3D11(GLint majorVersion, GLint minorVersion);
+MultiviewImplementationParams GeomShaderD3D11(GLint majorVersion, GLint minorVersion);
+
+class MultiviewTestBase : public ANGLETestBase
+{
+ protected:
+ MultiviewTestBase(const PlatformParameters ¶ms) : ANGLETestBase(params)
+ {
+ setWindowWidth(128);
+ setWindowHeight(128);
+ setWebGLCompatibilityEnabled(true);
+ }
+ virtual ~MultiviewTestBase() {}
+
+ void MultiviewTestBaseSetUp()
+ {
+ ANGLETestBase::ANGLETestSetUp();
+
+ glRequestExtensionANGLE = reinterpret_cast<PFNGLREQUESTEXTENSIONANGLEPROC>(
+ eglGetProcAddress("glRequestExtensionANGLE"));
+ }
+
+ void MultiviewTestBaseTearDown() { ANGLETestBase::ANGLETestTearDown(); }
+
+ // Requests the ANGLE_multiview extension and returns true if the operation succeeds.
+ bool requestMultiviewExtension()
+ {
+ if (extensionRequestable("GL_ANGLE_multiview"))
+ {
+ glRequestExtensionANGLE("GL_ANGLE_multiview");
+ }
+
+ if (!extensionEnabled("GL_ANGLE_multiview"))
+ {
+ std::cout << "Test skipped due to missing GL_ANGLE_multiview." << std::endl;
+ return false;
+ }
+ return true;
+ }
+
+ PFNGLREQUESTEXTENSIONANGLEPROC glRequestExtensionANGLE = nullptr;
+};
+
+// Base class for multiview tests that don't need specific helper functions.
+class MultiviewTest : public MultiviewTestBase,
+ public ::testing::TestWithParam<MultiviewImplementationParams>
+{
+ protected:
+ MultiviewTest() : MultiviewTestBase(GetParam()) {}
+ void SetUp() override { MultiviewTestBase::MultiviewTestBaseSetUp(); }
+ void TearDown() override { MultiviewTestBase::MultiviewTestBaseTearDown(); }
+
+ void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) final;
+};
+
+} // namespace angle
+
+#endif // ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_