// // 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 { enum ExtensionName { multiview, multiview2 }; // Creates a simple program that passes through two-dimensional vertices and renders green // fragments. GLuint CreateSimplePassthroughProgram(int numViews, ExtensionName multiviewExtension); // Create a 2D texture array to use for multiview rendering. Texture ids should be // created beforehand. If depthTexture or stencilTexture is 0, it will not be initialized. // If samples is 0, then non-multisampled textures are created. Otherwise multisampled textures are // created with the requested sample count. void CreateMultiviewBackingTextures(int samples, int viewWidth, int height, int numLayers, std::vector colorTextures, GLuint depthTexture, GLuint depthStencilTexture); void CreateMultiviewBackingTextures(int samples, int viewWidth, int height, int numLayers, GLuint colorTexture, GLuint depthTexture, GLuint depthStencilTexture); // Attach multiview textures to the framebuffer denoted by target. If there are multiple color // textures they get attached to different color attachments starting from 0. void AttachMultiviewTextures(GLenum target, int viewWidth, int numViews, int baseViewIndex, std::vector colorTextures, GLuint depthTexture, GLuint depthStencilTexture); void AttachMultiviewTextures(GLenum target, int viewWidth, int numViews, int baseViewIndex, GLuint colorTexture, GLuint depthTexture, GLuint depthStencilTexture); struct MultiviewImplementationParams : public PlatformParameters { MultiviewImplementationParams(GLint majorVersion, GLint minorVersion, const EGLPlatformParameters &eglPlatformParameters, ExtensionName multiviewExtension) : PlatformParameters(majorVersion, minorVersion, eglPlatformParameters), mMultiviewExtension(multiviewExtension) {} ExtensionName mMultiviewExtension; }; std::ostream &operator<<(std::ostream &os, const MultiviewImplementationParams ¶ms); MultiviewImplementationParams VertexShaderOpenGL(GLint majorVersion, GLint minorVersion, ExtensionName multiviewExtension); MultiviewImplementationParams VertexShaderVulkan(GLint majorVersion, GLint minorVersion, ExtensionName multiviewExtension); MultiviewImplementationParams VertexShaderD3D11(GLint majorVersion, GLint minorVersion, ExtensionName multiviewExtension); MultiviewImplementationParams GeomShaderD3D11(GLint majorVersion, GLint minorVersion, ExtensionName multiviewExtension); class MultiviewTestBase : public ANGLETestBase { protected: MultiviewTestBase(const PlatformParameters ¶ms) : ANGLETestBase(params) { setWindowWidth(128); setWindowHeight(128); setWebGLCompatibilityEnabled(true); } virtual ~MultiviewTestBase() {} void MultiviewTestBaseSetUp() { ANGLETestBase::ANGLETestSetUp(); } void MultiviewTestBaseTearDown() { ANGLETestBase::ANGLETestTearDown(); } }; // Base class for multiview tests that don't need specific helper functions. class MultiviewTest : public MultiviewTestBase, public ::testing::TestWithParam { protected: MultiviewTest() : MultiviewTestBase(GetParam()) {} virtual void testSetUp() {} virtual void testTearDown() {} // Requests the OVR_multiview(2) extension and returns true if the operation succeeds. bool requestMultiviewExtension(bool requireMultiviewMultisample) { if (!EnsureGLExtensionEnabled(extensionName())) { std::cout << "Test skipped due to missing " << extensionName() << "." << std::endl; return false; } if (requireMultiviewMultisample) { if (!EnsureGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array")) { std::cout << "Test skipped due to missing GL_ANGLE_multiview_multisample." << std::endl; return false; } if (!EnsureGLExtensionEnabled("GL_ANGLE_multiview_multisample")) { std::cout << "Test skipped due to missing GL_ANGLE_multiview_multisample." << std::endl; return false; } } return true; } bool requestMultiviewExtension() { return requestMultiviewExtension(false); } std::string extensionName() { switch (GetParam().mMultiviewExtension) { case multiview: return "GL_OVR_multiview"; case multiview2: return "GL_OVR_multiview2"; default: // Ignore unknown. return ""; } } private: void SetUp() override { MultiviewTestBase::MultiviewTestBaseSetUp(); testSetUp(); } void TearDown() override { testTearDown(); MultiviewTestBase::MultiviewTestBaseTearDown(); } }; } // namespace angle #endif // ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_