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 ¶ms); 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 ¶ms) : 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