| // |
| // Copyright 2018 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // MultiviewTest: |
| // Implementation of helpers for multiview testing. |
| // |
| |
| #ifndef ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_ |
| #define ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_ |
| |
| #include "test_utils/ANGLETest.h" |
| |
| namespace angle |
| { |
| |
| // Creates a simple program that passes through two-dimensional vertices and renders green |
| // fragments. |
| GLuint CreateSimplePassthroughProgram(int numViews); |
| |
| // Create a set of textures to use for multiview rendering. If multiviewLayout is |
| // GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, then 2D textures are created. If multiviewLayout is |
| // GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE, then 2D texture arrays are created. Texture ids should be |
| // created beforehand. If depthTexture or stencilTexture is 0, it will not be initialized. |
| void CreateMultiviewBackingTextures(GLenum multiviewLayout, |
| int viewWidth, |
| int height, |
| int numLayers, |
| std::vector<GLuint> colorTextures, |
| GLuint depthTexture, |
| GLuint depthStencilTexture); |
| void CreateMultiviewBackingTextures(GLenum multiviewLayout, |
| int viewWidth, |
| int height, |
| int numLayers, |
| GLuint colorTexture, |
| GLuint depthTexture, |
| GLuint depthStencilTexture); |
| |
| // Attach multiview textures to the framebuffer denoted by target. If there are multiple color |
| // textures they get attached to different color attachments starting from 0. If multiviewLayout is |
| // GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, then the viewport offsets are set so that the views |
| // are tightly packed inside the attachments. |
| void AttachMultiviewTextures(GLenum target, |
| GLenum multiviewLayout, |
| int viewWidth, |
| int numViews, |
| int baseViewIndex, |
| std::vector<GLuint> colorTextures, |
| GLuint depthTexture, |
| GLuint depthStencilTexture); |
| void AttachMultiviewTextures(GLenum target, |
| GLenum multiviewLayout, |
| int viewWidth, |
| int numViews, |
| int baseViewIndex, |
| GLuint colorTexture, |
| GLuint depthTexture, |
| GLuint depthStencilTexture); |
| |
| struct MultiviewImplementationParams : public PlatformParameters |
| { |
| MultiviewImplementationParams(GLint majorVersion, |
| GLint minorVersion, |
| bool forceUseGeometryShaderOnD3D, |
| const EGLPlatformParameters &eglPlatformParameters) |
| : PlatformParameters(majorVersion, minorVersion, eglPlatformParameters), |
| mForceUseGeometryShaderOnD3D(forceUseGeometryShaderOnD3D) |
| { |
| } |
| bool mForceUseGeometryShaderOnD3D; |
| }; |
| std::ostream &operator<<(std::ostream &os, const MultiviewImplementationParams ¶ms); |
| |
| MultiviewImplementationParams VertexShaderOpenGL(GLint majorVersion, GLint minorVersion); |
| MultiviewImplementationParams VertexShaderD3D11(GLint majorVersion, GLint minorVersion); |
| MultiviewImplementationParams GeomShaderD3D11(GLint majorVersion, GLint minorVersion); |
| |
| class MultiviewTestBase : public ANGLETestBase |
| { |
| protected: |
| MultiviewTestBase(const PlatformParameters ¶ms) : ANGLETestBase(params) |
| { |
| setWindowWidth(128); |
| setWindowHeight(128); |
| setWebGLCompatibilityEnabled(true); |
| } |
| virtual ~MultiviewTestBase() {} |
| |
| void MultiviewTestBaseSetUp() |
| { |
| ANGLETestBase::ANGLETestSetUp(); |
| |
| glRequestExtensionANGLE = reinterpret_cast<PFNGLREQUESTEXTENSIONANGLEPROC>( |
| eglGetProcAddress("glRequestExtensionANGLE")); |
| } |
| |
| void MultiviewTestBaseTearDown() { ANGLETestBase::ANGLETestTearDown(); } |
| |
| // Requests the ANGLE_multiview extension and returns true if the operation succeeds. |
| bool requestMultiviewExtension() |
| { |
| if (extensionRequestable("GL_ANGLE_multiview")) |
| { |
| glRequestExtensionANGLE("GL_ANGLE_multiview"); |
| } |
| |
| if (!extensionEnabled("GL_ANGLE_multiview")) |
| { |
| std::cout << "Test skipped due to missing GL_ANGLE_multiview." << std::endl; |
| return false; |
| } |
| return true; |
| } |
| |
| PFNGLREQUESTEXTENSIONANGLEPROC glRequestExtensionANGLE = nullptr; |
| }; |
| |
| // Base class for multiview tests that don't need specific helper functions. |
| class MultiviewTest : public MultiviewTestBase, |
| public ::testing::TestWithParam<MultiviewImplementationParams> |
| { |
| protected: |
| MultiviewTest() : MultiviewTestBase(GetParam()) {} |
| void SetUp() override { MultiviewTestBase::MultiviewTestBaseSetUp(); } |
| void TearDown() override { MultiviewTestBase::MultiviewTestBaseTearDown(); } |
| |
| void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) final; |
| }; |
| |
| } // namespace angle |
| |
| #endif // ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_ |