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(EGLenum clientType, 66 GLint majorVersion, 67 GLint minorVersion, 68 EGLint profileMask, 69 const EGLPlatformParameters &eglPlatformParameters, 70 ExtensionName multiviewExtension) 71 : PlatformParameters(clientType, 72 majorVersion, 73 minorVersion, 74 profileMask, 75 eglPlatformParameters), 76 mMultiviewExtension(multiviewExtension) 77 {} 78 ExtensionName mMultiviewExtension; 79 }; 80 std::ostream &operator<<(std::ostream &os, const MultiviewImplementationParams ¶ms); 81 82 MultiviewImplementationParams VertexShaderOpenGL(EGLenum clientType, 83 GLint majorVersion, 84 GLint minorVersion, 85 EGLint profileMask, 86 ExtensionName multiviewExtension); 87 MultiviewImplementationParams VertexShaderVulkan(EGLenum clientType, 88 GLint majorVersion, 89 GLint minorVersion, 90 EGLint profileMask, 91 ExtensionName multiviewExtension); 92 MultiviewImplementationParams VertexShaderD3D11(EGLenum clientType, 93 GLint majorVersion, 94 GLint minorVersion, 95 EGLint profileMask, 96 ExtensionName multiviewExtension); 97 MultiviewImplementationParams GeomShaderD3D11(EGLenum clientType, 98 GLint majorVersion, 99 GLint minorVersion, 100 EGLint profileMask, 101 ExtensionName multiviewExtension); 102 103 class MultiviewTestBase : public ANGLETestBase 104 { 105 protected: MultiviewTestBase(const PlatformParameters & params)106 MultiviewTestBase(const PlatformParameters ¶ms) : ANGLETestBase(params) 107 { 108 setWindowWidth(128); 109 setWindowHeight(128); 110 setWebGLCompatibilityEnabled(true); 111 } ~MultiviewTestBase()112 virtual ~MultiviewTestBase() {} 113 MultiviewTestBaseSetUp()114 void MultiviewTestBaseSetUp() { ANGLETestBase::ANGLETestSetUp(); } 115 MultiviewTestBaseTearDown()116 void MultiviewTestBaseTearDown() { ANGLETestBase::ANGLETestTearDown(); } 117 }; 118 119 // Base class for multiview tests that don't need specific helper functions. 120 class MultiviewTest : public MultiviewTestBase, 121 public ::testing::TestWithParam<MultiviewImplementationParams> 122 { 123 protected: MultiviewTest()124 MultiviewTest() : MultiviewTestBase(GetParam()) {} 125 testSetUp()126 virtual void testSetUp() {} testTearDown()127 virtual void testTearDown() {} 128 129 // Requests the OVR_multiview(2) extension and returns true if the operation succeeds. requestMultiviewExtension(bool requireMultiviewMultisample)130 bool requestMultiviewExtension(bool requireMultiviewMultisample) 131 { 132 if (!EnsureGLExtensionEnabled(extensionName())) 133 { 134 std::cout << "Test skipped due to missing " << extensionName() << "." << std::endl; 135 return false; 136 } 137 138 if (requireMultiviewMultisample) 139 { 140 if (!EnsureGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array")) 141 { 142 std::cout << "Test skipped due to missing GL_ANGLE_multiview_multisample." 143 << std::endl; 144 return false; 145 } 146 147 if (!EnsureGLExtensionEnabled("GL_ANGLE_multiview_multisample")) 148 { 149 std::cout << "Test skipped due to missing GL_ANGLE_multiview_multisample." 150 << std::endl; 151 return false; 152 } 153 } 154 return true; 155 } 156 requestMultiviewExtension()157 bool requestMultiviewExtension() { return requestMultiviewExtension(false); } 158 extensionName()159 std::string extensionName() 160 { 161 switch (GetParam().mMultiviewExtension) 162 { 163 case multiview: 164 return "GL_OVR_multiview"; 165 case multiview2: 166 return "GL_OVR_multiview2"; 167 default: 168 // Ignore unknown. 169 return ""; 170 } 171 } 172 173 private: SetUp()174 void SetUp() override 175 { 176 MultiviewTestBase::MultiviewTestBaseSetUp(); 177 testSetUp(); 178 } TearDown()179 void TearDown() override 180 { 181 testTearDown(); 182 MultiviewTestBase::MultiviewTestBaseTearDown(); 183 } 184 }; 185 186 } // namespace angle 187 188 #endif // ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_ 189