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