blob: 4126b4334c4506be9bafdf312a34e63ec425f019 [file] [log] [blame]
Olli Etuahof26b27e2018-08-17 11:01:19 +03001//
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
15namespace angle
16{
17
18// Creates a simple program that passes through two-dimensional vertices and renders green
19// fragments.
20GLuint CreateSimplePassthroughProgram(int numViews);
21
Olli Etuahoa7b35c32018-08-21 16:32:24 +030022// Create a set of textures to use for multiview rendering. If multiviewLayout is
23// GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, then 2D textures are created. If multiviewLayout is
24// GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE, then 2D texture arrays are created. Texture ids should be
25// created beforehand. If depthTexture or stencilTexture is 0, it will not be initialized.
Olli Etuaho2c8f0842018-09-12 14:44:55 +030026// If samples is 0, then non-multisampled textures are created. Otherwise multisampled textures are
27// created with the requested sample count.
Olli Etuahoa7b35c32018-08-21 16:32:24 +030028void CreateMultiviewBackingTextures(GLenum multiviewLayout,
Olli Etuaho2c8f0842018-09-12 14:44:55 +030029 int samples,
Olli Etuahoa7b35c32018-08-21 16:32:24 +030030 int viewWidth,
31 int height,
32 int numLayers,
33 std::vector<GLuint> colorTextures,
34 GLuint depthTexture,
35 GLuint depthStencilTexture);
36void CreateMultiviewBackingTextures(GLenum multiviewLayout,
Olli Etuaho2c8f0842018-09-12 14:44:55 +030037 int samples,
Olli Etuahoa7b35c32018-08-21 16:32:24 +030038 int viewWidth,
39 int height,
40 int numLayers,
41 GLuint colorTexture,
42 GLuint depthTexture,
43 GLuint depthStencilTexture);
44
45// Attach multiview textures to the framebuffer denoted by target. If there are multiple color
46// textures they get attached to different color attachments starting from 0. If multiviewLayout is
47// GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, then the viewport offsets are set so that the views
48// are tightly packed inside the attachments.
49void AttachMultiviewTextures(GLenum target,
50 GLenum multiviewLayout,
51 int viewWidth,
52 int numViews,
53 int baseViewIndex,
54 std::vector<GLuint> colorTextures,
55 GLuint depthTexture,
56 GLuint depthStencilTexture);
57void AttachMultiviewTextures(GLenum target,
58 GLenum multiviewLayout,
59 int viewWidth,
60 int numViews,
61 int baseViewIndex,
62 GLuint colorTexture,
63 GLuint depthTexture,
64 GLuint depthStencilTexture);
65
Olli Etuahof26b27e2018-08-17 11:01:19 +030066struct MultiviewImplementationParams : public PlatformParameters
67{
68 MultiviewImplementationParams(GLint majorVersion,
69 GLint minorVersion,
70 bool forceUseGeometryShaderOnD3D,
71 const EGLPlatformParameters &eglPlatformParameters)
72 : PlatformParameters(majorVersion, minorVersion, eglPlatformParameters),
73 mForceUseGeometryShaderOnD3D(forceUseGeometryShaderOnD3D)
74 {
75 }
76 bool mForceUseGeometryShaderOnD3D;
77};
78std::ostream &operator<<(std::ostream &os, const MultiviewImplementationParams &params);
79
80MultiviewImplementationParams VertexShaderOpenGL(GLint majorVersion, GLint minorVersion);
81MultiviewImplementationParams VertexShaderD3D11(GLint majorVersion, GLint minorVersion);
82MultiviewImplementationParams GeomShaderD3D11(GLint majorVersion, GLint minorVersion);
83
84class MultiviewTestBase : public ANGLETestBase
85{
86 protected:
87 MultiviewTestBase(const PlatformParameters &params) : ANGLETestBase(params)
88 {
89 setWindowWidth(128);
90 setWindowHeight(128);
91 setWebGLCompatibilityEnabled(true);
92 }
93 virtual ~MultiviewTestBase() {}
94
95 void MultiviewTestBaseSetUp()
96 {
97 ANGLETestBase::ANGLETestSetUp();
98
99 glRequestExtensionANGLE = reinterpret_cast<PFNGLREQUESTEXTENSIONANGLEPROC>(
100 eglGetProcAddress("glRequestExtensionANGLE"));
101 }
102
103 void MultiviewTestBaseTearDown() { ANGLETestBase::ANGLETestTearDown(); }
104
105 // Requests the ANGLE_multiview extension and returns true if the operation succeeds.
Olli Etuaho2c8f0842018-09-12 14:44:55 +0300106 bool requestMultiviewExtension(bool requireMultiviewMultisample)
Olli Etuahof26b27e2018-08-17 11:01:19 +0300107 {
108 if (extensionRequestable("GL_ANGLE_multiview"))
109 {
110 glRequestExtensionANGLE("GL_ANGLE_multiview");
111 }
112
113 if (!extensionEnabled("GL_ANGLE_multiview"))
114 {
115 std::cout << "Test skipped due to missing GL_ANGLE_multiview." << std::endl;
116 return false;
117 }
Olli Etuaho2c8f0842018-09-12 14:44:55 +0300118
119 if (requireMultiviewMultisample)
120 {
121 if (extensionRequestable("GL_OES_texture_storage_multisample_2d_array"))
122 {
123 glRequestExtensionANGLE("GL_OES_texture_storage_multisample_2d_array");
124 }
125 if (extensionRequestable("GL_ANGLE_multiview_multisample"))
126 {
127 glRequestExtensionANGLE("GL_ANGLE_multiview_multisample");
128 }
129
130 if (!extensionEnabled("GL_ANGLE_multiview_multisample"))
131 {
132 std::cout << "Test skipped due to missing GL_ANGLE_multiview_multisample."
133 << std::endl;
134 return false;
135 }
136 }
Olli Etuahof26b27e2018-08-17 11:01:19 +0300137 return true;
138 }
139
Olli Etuaho2c8f0842018-09-12 14:44:55 +0300140 bool requestMultiviewExtension() { return requestMultiviewExtension(false); }
141
Olli Etuahof26b27e2018-08-17 11:01:19 +0300142 PFNGLREQUESTEXTENSIONANGLEPROC glRequestExtensionANGLE = nullptr;
143};
144
145// Base class for multiview tests that don't need specific helper functions.
146class MultiviewTest : public MultiviewTestBase,
147 public ::testing::TestWithParam<MultiviewImplementationParams>
148{
149 protected:
150 MultiviewTest() : MultiviewTestBase(GetParam()) {}
151 void SetUp() override { MultiviewTestBase::MultiviewTestBaseSetUp(); }
152 void TearDown() override { MultiviewTestBase::MultiviewTestBaseTearDown(); }
153
154 void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) final;
155};
156
157} // namespace angle
158
159#endif // ANGLE_TESTS_TESTUTILS_MULTIVIEWTEST_H_