Path: blob/main_old/src/tests/test_utils/MultiviewTest.h
1693 views
//1// Copyright 2018 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// MultiviewTest:6// Implementation of helpers for multiview testing.7//89#ifndef ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_10#define ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_1112#include "test_utils/ANGLETest.h"1314namespace angle15{16enum ExtensionName17{18multiview,19multiview220};2122// Creates a simple program that passes through two-dimensional vertices and renders green23// fragments.24GLuint CreateSimplePassthroughProgram(int numViews, ExtensionName multiviewExtension);2526// Create a 2D texture array to use for multiview rendering. Texture ids should be27// created beforehand. If depthTexture or stencilTexture is 0, it will not be initialized.28// If samples is 0, then non-multisampled textures are created. Otherwise multisampled textures are29// created with the requested sample count.30void CreateMultiviewBackingTextures(int samples,31int viewWidth,32int height,33int numLayers,34std::vector<GLuint> colorTextures,35GLuint depthTexture,36GLuint depthStencilTexture);37void CreateMultiviewBackingTextures(int samples,38int viewWidth,39int height,40int numLayers,41GLuint colorTexture,42GLuint depthTexture,43GLuint depthStencilTexture);4445// Attach multiview textures to the framebuffer denoted by target. If there are multiple color46// textures they get attached to different color attachments starting from 0.47void AttachMultiviewTextures(GLenum target,48int viewWidth,49int numViews,50int baseViewIndex,51std::vector<GLuint> colorTextures,52GLuint depthTexture,53GLuint depthStencilTexture);54void AttachMultiviewTextures(GLenum target,55int viewWidth,56int numViews,57int baseViewIndex,58GLuint colorTexture,59GLuint depthTexture,60GLuint depthStencilTexture);6162struct MultiviewImplementationParams : public PlatformParameters63{64MultiviewImplementationParams(GLint majorVersion,65GLint minorVersion,66bool forceUseGeometryShaderOnD3D,67const EGLPlatformParameters &eglPlatformParameters,68ExtensionName multiviewExtension)69: PlatformParameters(majorVersion, minorVersion, eglPlatformParameters),70mForceUseGeometryShaderOnD3D(forceUseGeometryShaderOnD3D),71mMultiviewExtension(multiviewExtension)72{}73bool mForceUseGeometryShaderOnD3D;74ExtensionName mMultiviewExtension;75};76std::ostream &operator<<(std::ostream &os, const MultiviewImplementationParams ¶ms);7778MultiviewImplementationParams VertexShaderOpenGL(GLint majorVersion,79GLint minorVersion,80ExtensionName multiviewExtension);81MultiviewImplementationParams VertexShaderVulkan(GLint majorVersion,82GLint minorVersion,83ExtensionName multiviewExtension);84MultiviewImplementationParams VertexShaderD3D11(GLint majorVersion,85GLint minorVersion,86ExtensionName multiviewExtension);87MultiviewImplementationParams GeomShaderD3D11(GLint majorVersion,88GLint minorVersion,89ExtensionName multiviewExtension);9091class MultiviewTestBase : public ANGLETestBase92{93protected:94MultiviewTestBase(const PlatformParameters ¶ms) : ANGLETestBase(params)95{96setWindowWidth(128);97setWindowHeight(128);98setWebGLCompatibilityEnabled(true);99}100virtual ~MultiviewTestBase() {}101102void MultiviewTestBaseSetUp() { ANGLETestBase::ANGLETestSetUp(); }103104void MultiviewTestBaseTearDown() { ANGLETestBase::ANGLETestTearDown(); }105};106107// Base class for multiview tests that don't need specific helper functions.108class MultiviewTest : public MultiviewTestBase,109public ::testing::TestWithParam<MultiviewImplementationParams>110{111protected:112MultiviewTest() : MultiviewTestBase(GetParam()) {}113114void overrideWorkaroundsD3D(FeaturesD3D *features) final;115116virtual void testSetUp() {}117virtual void testTearDown() {}118119// Requests the OVR_multiview(2) extension and returns true if the operation succeeds.120bool requestMultiviewExtension(bool requireMultiviewMultisample)121{122if (!EnsureGLExtensionEnabled(extensionName()))123{124std::cout << "Test skipped due to missing " << extensionName() << "." << std::endl;125return false;126}127128if (requireMultiviewMultisample)129{130if (!EnsureGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array"))131{132std::cout << "Test skipped due to missing GL_ANGLE_multiview_multisample."133<< std::endl;134return false;135}136137if (!EnsureGLExtensionEnabled("GL_ANGLE_multiview_multisample"))138{139std::cout << "Test skipped due to missing GL_ANGLE_multiview_multisample."140<< std::endl;141return false;142}143}144return true;145}146147bool requestMultiviewExtension() { return requestMultiviewExtension(false); }148149std::string extensionName()150{151switch (GetParam().mMultiviewExtension)152{153case multiview:154return "GL_OVR_multiview";155case multiview2:156return "GL_OVR_multiview2";157default:158// Ignore unknown.159return "";160}161}162163private:164void SetUp() override165{166MultiviewTestBase::MultiviewTestBaseSetUp();167testSetUp();168}169void TearDown() override170{171testTearDown();172MultiviewTestBase::MultiviewTestBaseTearDown();173}174};175176} // namespace angle177178#endif // ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_179180181