1 // 2 // Copyright 2018 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 // MultiviewTest: 7 // Implementation of helpers for multiview testing. 8 // 9 10 #ifndef ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_ 11 #define ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_ 12 13 #include "test_utils/ANGLETest.h" 14 15 namespace angle 16 { 17 enum ExtensionName 18 { 19 multiview, 20 multiview2 21 }; 22 23 // Creates a simple program that passes through two-dimensional vertices and renders green 24 // fragments. 25 GLuint CreateSimplePassthroughProgram(int numViews, ExtensionName multiviewExtension); 26 27 // Create a 2D texture array to use for multiview rendering. Texture ids should be 28 // created beforehand. If depthTexture or stencilTexture is 0, it will not be initialized. 29 // If samples is 0, then non-multisampled textures are created. Otherwise multisampled textures are 30 // created with the requested sample count. 31 void CreateMultiviewBackingTextures(int samples, 32 int viewWidth, 33 int height, 34 int numLayers, 35 std::vector<GLuint> colorTextures, 36 GLuint depthTexture, 37 GLuint depthStencilTexture); 38 void CreateMultiviewBackingTextures(int samples, 39 int viewWidth, 40 int height, 41 int numLayers, 42 GLuint colorTexture, 43 GLuint depthTexture, 44 GLuint depthStencilTexture); 45 46 // Attach multiview textures to the framebuffer denoted by target. If there are multiple color 47 // textures they get attached to different color attachments starting from 0. 48 void AttachMultiviewTextures(GLenum target, 49 int viewWidth, 50 int numViews, 51 int baseViewIndex, 52 std::vector<GLuint> colorTextures, 53 GLuint depthTexture, 54 GLuint depthStencilTexture); 55 void AttachMultiviewTextures(GLenum target, 56 int viewWidth, 57 int numViews, 58 int baseViewIndex, 59 GLuint colorTexture, 60 GLuint depthTexture, 61 GLuint depthStencilTexture); 62 63 struct MultiviewImplementationParams : public PlatformParameters 64 { MultiviewImplementationParamsMultiviewImplementationParams65 MultiviewImplementationParams(GLint majorVersion, 66 GLint minorVersion, 67 68 const EGLPlatformParameters &eglPlatformParameters, 69 ExtensionName multiviewExtension) 70 : PlatformParameters(majorVersion, 71 minorVersion, 72 73 eglPlatformParameters), 74 mMultiviewExtension(multiviewExtension) 75 {} 76 ExtensionName mMultiviewExtension; 77 }; 78 std::ostream &operator<<(std::ostream &os, const MultiviewImplementationParams ¶ms); 79 80 MultiviewImplementationParams VertexShaderOpenGL(GLint majorVersion, 81 GLint minorVersion, 82 83 ExtensionName multiviewExtension); 84 MultiviewImplementationParams VertexShaderVulkan(GLint majorVersion, 85 GLint minorVersion, 86 ExtensionName multiviewExtension); 87 MultiviewImplementationParams VertexShaderD3D11(GLint majorVersion, 88 GLint minorVersion, 89 ExtensionName multiviewExtension); 90 MultiviewImplementationParams GeomShaderD3D11(GLint majorVersion, 91 GLint minorVersion, 92 ExtensionName multiviewExtension); 93 94 class MultiviewTestBase : public ANGLETestBase 95 { 96 protected: MultiviewTestBase(const PlatformParameters & params)97 MultiviewTestBase(const PlatformParameters ¶ms) : ANGLETestBase(params) 98 { 99 setWindowWidth(128); 100 setWindowHeight(128); 101 setWebGLCompatibilityEnabled(true); 102 } ~MultiviewTestBase()103 virtual ~MultiviewTestBase() {} 104 MultiviewTestBaseSetUp()105 void MultiviewTestBaseSetUp() { ANGLETestBase::ANGLETestSetUp(); } 106 MultiviewTestBaseTearDown()107 void MultiviewTestBaseTearDown() { ANGLETestBase::ANGLETestTearDown(); } 108 }; 109 110 // Base class for multiview tests that don't need specific helper functions. 111 class MultiviewTest : public MultiviewTestBase, 112 public ::testing::TestWithParam<MultiviewImplementationParams> 113 { 114 protected: MultiviewTest()115 MultiviewTest() : MultiviewTestBase(GetParam()) {} 116 testSetUp()117 virtual void testSetUp() {} testTearDown()118 virtual void testTearDown() {} 119 120 // Requests the OVR_multiview(2) extension and returns true if the operation succeeds. requestMultiviewExtension(bool requireMultiviewMultisample)121 bool requestMultiviewExtension(bool requireMultiviewMultisample) 122 { 123 if (!EnsureGLExtensionEnabled(extensionName())) 124 { 125 std::cout << "Test skipped due to missing " << extensionName() << "." << std::endl; 126 return false; 127 } 128 129 if (requireMultiviewMultisample) 130 { 131 if (!EnsureGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array")) 132 { 133 std::cout << "Test skipped due to missing GL_ANGLE_multiview_multisample." 134 << std::endl; 135 return false; 136 } 137 138 if (!EnsureGLExtensionEnabled("GL_ANGLE_multiview_multisample")) 139 { 140 std::cout << "Test skipped due to missing GL_ANGLE_multiview_multisample." 141 << std::endl; 142 return false; 143 } 144 } 145 return true; 146 } 147 requestMultiviewExtension()148 bool requestMultiviewExtension() { return requestMultiviewExtension(false); } 149 extensionName()150 std::string extensionName() 151 { 152 switch (GetParam().mMultiviewExtension) 153 { 154 case multiview: 155 return "GL_OVR_multiview"; 156 case multiview2: 157 return "GL_OVR_multiview2"; 158 default: 159 // Ignore unknown. 160 return ""; 161 } 162 } 163 164 private: SetUp()165 void SetUp() override 166 { 167 MultiviewTestBase::MultiviewTestBaseSetUp(); 168 testSetUp(); 169 } TearDown()170 void TearDown() override 171 { 172 testTearDown(); 173 MultiviewTestBase::MultiviewTestBaseTearDown(); 174 } 175 }; 176 177 } // namespace angle 178 179 #endif // ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_ 180