blob: 4a4ce9afa8ce9bb7119a5176ea93a0c462efa484 [file] [log] [blame]
Martin Radeve5285d22017-07-14 16:23:53 +03001//
2// Copyright 2017 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// Framebuffer multiview tests:
7// The tests modify and examine the multiview state.
8//
9
10#include "test_utils/ANGLETest.h"
11
12using namespace angle;
13
14class FramebufferMultiviewTest : public ANGLETest
15{
16 protected:
Martin Radev137032d2017-07-13 10:11:12 +030017 FramebufferMultiviewTest() : mFramebuffer(0), mTexture2D(0), mTexture2DArray(0)
Martin Radeve5285d22017-07-14 16:23:53 +030018 {
19 setWindowWidth(128);
20 setWindowHeight(128);
21 setWebGLCompatibilityEnabled(true);
22 }
23
24 void SetUp() override
25 {
26 ANGLETest::SetUp();
27
28 glGenFramebuffers(1, &mFramebuffer);
29 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
30
Martin Radeve5285d22017-07-14 16:23:53 +030031 glRequestExtensionANGLE = reinterpret_cast<PFNGLREQUESTEXTENSIONANGLEPROC>(
32 eglGetProcAddress("glRequestExtensionANGLE"));
33 }
34
35 void TearDown() override
36 {
Martin Radev137032d2017-07-13 10:11:12 +030037 if (mTexture2D != 0)
Martin Radeve5285d22017-07-14 16:23:53 +030038 {
Martin Radev137032d2017-07-13 10:11:12 +030039 glDeleteTextures(1, &mTexture2D);
40 mTexture2D = 0;
41 }
42
43 if (mTexture2DArray != 0)
44 {
45 glDeleteTextures(1, &mTexture2DArray);
46 mTexture2DArray = 0;
Martin Radeve5285d22017-07-14 16:23:53 +030047 }
48
49 if (mFramebuffer != 0)
50 {
51 glDeleteFramebuffers(1, &mFramebuffer);
52 mFramebuffer = 0;
53 }
54
55 ANGLETest::TearDown();
56 }
57
Martin Radev137032d2017-07-13 10:11:12 +030058 void createTexture2D()
59 {
60 glGenTextures(1, &mTexture2D);
61 glBindTexture(GL_TEXTURE_2D, mTexture2D);
62 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA16F, 1, 1);
63 ASSERT_GL_NO_ERROR();
64 }
65
66 void createTexture2DArray()
67 {
68 glGenTextures(1, &mTexture2DArray);
69 glBindTexture(GL_TEXTURE_2D_ARRAY, mTexture2DArray);
70 glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA16F, 1, 1, 2);
71 ASSERT_GL_NO_ERROR();
72 }
73
74 // Requests the ANGLE_multiview extension and returns true if the operation succeeds.
75 bool requestMultiviewExtension()
76 {
77 if (extensionRequestable("GL_ANGLE_multiview"))
78 {
79 glRequestExtensionANGLE("GL_ANGLE_multiview");
80 }
81
82 if (!extensionEnabled("GL_ANGLE_multiview"))
83 {
84 std::cout << "Test skipped due to missing GL_ANGLE_multiview." << std::endl;
85 return false;
86 }
87 return true;
88 }
89
Martin Radeve5285d22017-07-14 16:23:53 +030090 GLuint mFramebuffer;
Martin Radev137032d2017-07-13 10:11:12 +030091 GLuint mTexture2D;
92 GLuint mTexture2DArray;
Martin Radeve5285d22017-07-14 16:23:53 +030093 PFNGLREQUESTEXTENSIONANGLEPROC glRequestExtensionANGLE = nullptr;
94};
95
96// Test that the framebuffer tokens introduced by ANGLE_multiview can be used query the framebuffer
97// state and that their corresponding default values are correctly set.
98TEST_P(FramebufferMultiviewTest, DefaultState)
99{
Martin Radev137032d2017-07-13 10:11:12 +0300100 if (!requestMultiviewExtension())
Martin Radeve5285d22017-07-14 16:23:53 +0300101 {
Martin Radeve5285d22017-07-14 16:23:53 +0300102 return;
103 }
104
Martin Radev137032d2017-07-13 10:11:12 +0300105 createTexture2D();
106 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture2D, 0);
107
Martin Radeve5285d22017-07-14 16:23:53 +0300108 GLint numViews = -1;
109 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
110 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE,
111 &numViews);
112 EXPECT_GL_NO_ERROR();
113 EXPECT_EQ(1, numViews);
114
115 GLint baseViewIndex = -1;
116 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
117 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE,
118 &baseViewIndex);
119 EXPECT_GL_NO_ERROR();
120 EXPECT_EQ(0, baseViewIndex);
121
122 GLint multiviewLayout = GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE;
123 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
124 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE,
125 &multiviewLayout);
126 EXPECT_GL_NO_ERROR();
127 EXPECT_EQ(GL_NONE, multiviewLayout);
128
129 GLint viewportOffsets[2] = {-1, -1};
130 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
131 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE,
132 &viewportOffsets[0]);
133 EXPECT_GL_NO_ERROR();
134 EXPECT_EQ(0, viewportOffsets[0]);
135 EXPECT_EQ(0, viewportOffsets[1]);
136}
137
138// Test that without having the ANGLE_multiview extension, querying for the framebuffer state using
139// the ANGLE_multiview tokens results in an INVALID_ENUM error.
140TEST_P(FramebufferMultiviewTest, NegativeFramebufferStateQueries)
141{
Martin Radev137032d2017-07-13 10:11:12 +0300142 createTexture2D();
143 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture2D, 0);
144
Martin Radeve5285d22017-07-14 16:23:53 +0300145 GLint numViews = -1;
146 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
147 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE,
148 &numViews);
149 EXPECT_GL_ERROR(GL_INVALID_ENUM);
150
151 GLint baseViewIndex = -1;
152 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
153 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE,
154 &baseViewIndex);
155 EXPECT_GL_ERROR(GL_INVALID_ENUM);
156
157 GLint multiviewLayout = GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE;
158 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
159 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE,
160 &multiviewLayout);
161 EXPECT_GL_ERROR(GL_INVALID_ENUM);
162
163 GLint viewportOffsets[2] = {-1, -1};
164 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
165 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE,
166 &viewportOffsets[0]);
167 EXPECT_GL_ERROR(GL_INVALID_ENUM);
168}
169
Martin Radev137032d2017-07-13 10:11:12 +0300170// Test that the correct errors are generated whenever glFramebufferTextureMultiviewSideBySideANGLE
171// is called with invalid arguments.
172TEST_P(FramebufferMultiviewTest, InvalidMultiviewSideBySideArguments)
173{
174 if (!requestMultiviewExtension())
175 {
176 return;
177 }
178
179 createTexture2D();
180 // Negative offsets.
181 int viewportOffsets[2] = {-1};
182 glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture2D,
183 0, 1, &viewportOffsets[0]);
184 EXPECT_GL_ERROR(GL_INVALID_VALUE);
185
186 // Negative number of views.
187 viewportOffsets[0] = 0;
188 viewportOffsets[1] = 0;
189 glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture2D,
190 0, -1, &viewportOffsets[0]);
191 EXPECT_GL_ERROR(GL_INVALID_VALUE);
192}
193
194// Test that the correct errors are generated whenever glFramebufferTextureMultiviewLayeredANGLE is
195// called with invalid arguments.
196TEST_P(FramebufferMultiviewTest, InvalidMultiviewLayeredArguments)
197{
198 if (!requestMultiviewExtension())
199 {
200 return;
201 }
202
203 createTexture2DArray();
204 // Negative base view index.
205 glFramebufferTextureMultiviewLayeredANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture2DArray,
206 0, -1, 1);
207 EXPECT_GL_ERROR(GL_INVALID_VALUE);
208
209 // baseViewIndex + numViews is greater than MAX_TEXTURE_LAYERS.
210 GLint maxTextureLayers = 0;
211 glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxTextureLayers);
212 ASSERT_GL_NO_ERROR();
213 glFramebufferTextureMultiviewLayeredANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture2DArray,
214 0, maxTextureLayers, 1);
215 EXPECT_GL_ERROR(GL_INVALID_VALUE);
216}
217
218// Test that an INVALID_OPERATION error is generated whenever the ANGLE_multiview extension is not
219// available.
220TEST_P(FramebufferMultiviewTest, ExtensionNotAvailableCheck)
221{
222 createTexture2D();
223 int viewportOffsets[2] = {0};
224 glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture2D,
225 0, 1, &viewportOffsets[0]);
226 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
227}
228
Martin Radeve5285d22017-07-14 16:23:53 +0300229ANGLE_INSTANTIATE_TEST(FramebufferMultiviewTest, ES3_OPENGL());