• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &params);
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 &params) : 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