blob: 9c91611ad6833b0ead091f2a44630a5593553e06 [file] [log] [blame]
JiangYizhoubddc46b2016-12-09 09:50:51 +08001//
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
7// TextureMultisampleTest: Tests of multisampled texture
8
9#include "test_utils/ANGLETest.h"
10#include "test_utils/gl_raii.h"
11
12using namespace angle;
13
14namespace
15{
Jiang0e1224c2017-12-26 14:11:15 +080016// Sample positions of d3d standard pattern. Some of the sample positions might not the same as
17// opengl.
18using SamplePositionsArray = std::array<float, 32>;
19static constexpr std::array<SamplePositionsArray, 5> kSamplePositions = {
20 {{{0.5f, 0.5f}},
21 {{0.75f, 0.75f, 0.25f, 0.25f}},
22 {{0.375f, 0.125f, 0.875f, 0.375f, 0.125f, 0.625f, 0.625f, 0.875f}},
23 {{0.5625f, 0.3125f, 0.4375f, 0.6875f, 0.8125f, 0.5625f, 0.3125f, 0.1875f, 0.1875f, 0.8125f,
24 0.0625f, 0.4375f, 0.6875f, 0.9375f, 0.9375f, 0.0625f}},
25 {{0.5625f, 0.5625f, 0.4375f, 0.3125f, 0.3125f, 0.625f, 0.75f, 0.4375f,
26 0.1875f, 0.375f, 0.625f, 0.8125f, 0.8125f, 0.6875f, 0.6875f, 0.1875f,
27 0.375f, 0.875f, 0.5f, 0.0625f, 0.25f, 0.125f, 0.125f, 0.75f,
28 0.0f, 0.5f, 0.9375f, 0.25f, 0.875f, 0.9375f, 0.0625f, 0.0f}}}};
JiangYizhoubddc46b2016-12-09 09:50:51 +080029
30class TextureMultisampleTest : public ANGLETest
31{
32 protected:
33 TextureMultisampleTest()
34 {
35 setWindowWidth(64);
36 setWindowHeight(64);
37 setConfigRedBits(8);
38 setConfigGreenBits(8);
39 setConfigBlueBits(8);
40 setConfigAlphaBits(8);
41 }
42
43 void SetUp() override
44 {
45 ANGLETest::SetUp();
46
47 glGenFramebuffers(1, &mFramebuffer);
48 glGenTextures(1, &mTexture);
49
50 ASSERT_GL_NO_ERROR();
51 }
52
53 void TearDown() override
54 {
55 glDeleteFramebuffers(1, &mFramebuffer);
56 mFramebuffer = 0;
57 glDeleteTextures(1, &mTexture);
58 mTexture = 0;
59
60 ANGLETest::TearDown();
61 }
62
63 GLuint mFramebuffer = 0;
64 GLuint mTexture = 0;
Olli Etuahofd162102018-08-27 16:14:57 +030065
66 // Returns a sample count that can be used with the given texture target for all the given
67 // formats. Assumes that if format A supports a number of samples N and another format B
68 // supports a number of samples M > N then format B also supports number of samples N.
69 GLint getSamplesToUse(GLenum texTarget, const std::vector<GLenum> &formats)
70 {
71 GLint maxSamples = 65536;
72 for (GLenum format : formats)
73 {
74 GLint maxSamplesFormat = 0;
75 glGetInternalformativ(texTarget, format, GL_SAMPLES, 1, &maxSamplesFormat);
76 maxSamples = std::min(maxSamples, maxSamplesFormat);
77 }
78 return maxSamples;
79 }
JiangYizhoubddc46b2016-12-09 09:50:51 +080080};
81
82class TextureMultisampleTestES31 : public TextureMultisampleTest
83{
84 protected:
85 TextureMultisampleTestES31() : TextureMultisampleTest() {}
86};
87
Olli Etuahod310a432018-08-24 15:40:23 +030088class TextureMultisampleArrayWebGLTest : public TextureMultisampleTest
89{
90 protected:
91 TextureMultisampleArrayWebGLTest() : TextureMultisampleTest()
92 {
93 // These tests run in WebGL mode so we can test with both extension off and on.
94 setWebGLCompatibilityEnabled(true);
95 }
96
97 // Requests the ANGLE_texture_multisample_array extension and returns true if the operation
98 // succeeds.
99 bool requestArrayExtension()
100 {
Olli Etuaho064458a2018-08-30 14:02:02 +0300101 if (extensionRequestable("GL_OES_texture_storage_multisample_2d_array"))
Olli Etuahod310a432018-08-24 15:40:23 +0300102 {
Olli Etuaho064458a2018-08-30 14:02:02 +0300103 glRequestExtensionANGLE("GL_OES_texture_storage_multisample_2d_array");
Olli Etuahod310a432018-08-24 15:40:23 +0300104 }
105
Olli Etuaho064458a2018-08-30 14:02:02 +0300106 if (!extensionEnabled("GL_OES_texture_storage_multisample_2d_array"))
Olli Etuahod310a432018-08-24 15:40:23 +0300107 {
108 return false;
109 }
110 return true;
111 }
112};
113
JiangYizhoubddc46b2016-12-09 09:50:51 +0800114// Tests that if es version < 3.1, GL_TEXTURE_2D_MULTISAMPLE is not supported in
Olli Etuahod310a432018-08-24 15:40:23 +0300115// GetInternalformativ. Checks that the number of samples returned is valid in case of ES >= 3.1.
JiangYizhoubddc46b2016-12-09 09:50:51 +0800116TEST_P(TextureMultisampleTest, MultisampleTargetGetInternalFormativBase)
117{
Olli Etuahod310a432018-08-24 15:40:23 +0300118 // This query returns supported sample counts in descending order. If only one sample count is
119 // queried, it should be the maximum one.
120 GLint maxSamplesR8 = 0;
121 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_R8, GL_SAMPLES, 1, &maxSamplesR8);
JiangYizhoubddc46b2016-12-09 09:50:51 +0800122 if (getClientMajorVersion() < 3 || getClientMinorVersion() < 1)
123 {
Olli Etuahod310a432018-08-24 15:40:23 +0300124 ASSERT_GL_ERROR(GL_INVALID_ENUM);
JiangYizhoubddc46b2016-12-09 09:50:51 +0800125 }
126 else
127 {
128 ASSERT_GL_NO_ERROR();
Olli Etuahod310a432018-08-24 15:40:23 +0300129
130 // GLES 3.1 section 19.3.1 specifies the required minimum of how many samples are supported.
131 GLint maxColorTextureSamples;
132 glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &maxColorTextureSamples);
133 GLint maxSamples;
134 glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
135 GLint maxSamplesR8Required = std::min(maxColorTextureSamples, maxSamples);
136
137 EXPECT_GE(maxSamplesR8, maxSamplesR8Required);
JiangYizhoubddc46b2016-12-09 09:50:51 +0800138 }
139}
140
141// Tests that if es version < 3.1, GL_TEXTURE_2D_MULTISAMPLE is not supported in
142// FramebufferTexture2D.
143TEST_P(TextureMultisampleTest, MultisampleTargetFramebufferTexture2D)
144{
145 GLint samples = 1;
146 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
147 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, 64, 64, GL_FALSE);
148 if (getClientMajorVersion() < 3 || getClientMinorVersion() < 1)
149 {
150 ASSERT_GL_ERROR(GL_INVALID_ENUM);
151 }
152 else
153 {
154 ASSERT_GL_NO_ERROR();
155 }
156
157 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
158 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
159 mTexture, 0);
160 if (getClientMajorVersion() < 3 || getClientMinorVersion() < 1)
161 {
162 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
163 }
164 else
165 {
166 ASSERT_GL_NO_ERROR();
167 }
168}
169
170// Tests basic functionality of glTexStorage2DMultisample.
171TEST_P(TextureMultisampleTestES31, ValidateTextureStorageMultisampleParameters)
172{
173 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
174 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 1, 1, GL_FALSE);
JiangYizhou461d9a32017-01-04 16:37:26 +0800175 ASSERT_GL_NO_ERROR();
176
JiangYizhoubddc46b2016-12-09 09:50:51 +0800177 GLint params = 0;
178 glGetTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_IMMUTABLE_FORMAT, &params);
179 EXPECT_EQ(1, params);
180
181 glTexStorage2DMultisample(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1, GL_FALSE);
182 ASSERT_GL_ERROR(GL_INVALID_ENUM);
183
184 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 0, 0, GL_FALSE);
185 ASSERT_GL_ERROR(GL_INVALID_VALUE);
186
187 GLint maxSize = 0;
188 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize);
189 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, maxSize + 1, 1, GL_FALSE);
190 ASSERT_GL_ERROR(GL_INVALID_VALUE);
191
192 GLint maxSamples = 0;
193 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_R8, GL_SAMPLES, 1, &maxSamples);
194 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, maxSamples + 1, GL_RGBA8, 1, 1, GL_FALSE);
195 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
196
197 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_RGBA8, 1, 1, GL_FALSE);
198 ASSERT_GL_ERROR(GL_INVALID_VALUE);
199
200 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA, 0, 0, GL_FALSE);
201 ASSERT_GL_ERROR(GL_INVALID_VALUE);
202
203 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
204 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 1, 1, GL_FALSE);
205 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
206}
207
Shao5116d682017-08-02 12:39:44 +0800208// Tests the value of MAX_INTEGER_SAMPLES is no less than 1.
209// [OpenGL ES 3.1 SPEC Table 20.40]
210TEST_P(TextureMultisampleTestES31, MaxIntegerSamples)
211{
212 GLint maxIntegerSamples;
213 glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &maxIntegerSamples);
214 EXPECT_GE(maxIntegerSamples, 1);
215 EXPECT_NE(std::numeric_limits<GLint>::max(), maxIntegerSamples);
216}
217
218// Tests the value of MAX_COLOR_TEXTURE_SAMPLES is no less than 1.
219// [OpenGL ES 3.1 SPEC Table 20.40]
220TEST_P(TextureMultisampleTestES31, MaxColorTextureSamples)
221{
222 GLint maxColorTextureSamples;
223 glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &maxColorTextureSamples);
224 EXPECT_GE(maxColorTextureSamples, 1);
225 EXPECT_NE(std::numeric_limits<GLint>::max(), maxColorTextureSamples);
226}
227
228// Tests the value of MAX_DEPTH_TEXTURE_SAMPLES is no less than 1.
229// [OpenGL ES 3.1 SPEC Table 20.40]
230TEST_P(TextureMultisampleTestES31, MaxDepthTextureSamples)
231{
232 GLint maxDepthTextureSamples;
233 glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &maxDepthTextureSamples);
234 EXPECT_GE(maxDepthTextureSamples, 1);
235 EXPECT_NE(std::numeric_limits<GLint>::max(), maxDepthTextureSamples);
236}
237
Jiang0e1224c2017-12-26 14:11:15 +0800238// The value of sample position should be equal to standard pattern on D3D.
239TEST_P(TextureMultisampleTestES31, CheckSamplePositions)
240{
241 ANGLE_SKIP_TEST_IF(!IsD3D11());
242
243 GLsizei maxSamples = 0;
244 glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
245
246 GLfloat samplePosition[2];
247
248 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
249
250 for (int sampleCount = 1; sampleCount <= maxSamples; sampleCount++)
251 {
252 GLTexture texture;
253 size_t indexKey = static_cast<size_t>(ceil(log2(sampleCount)));
254 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
255 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, sampleCount, GL_RGBA8, 1, 1, GL_TRUE);
256 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
257 texture, 0);
258 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
259 ASSERT_GL_NO_ERROR();
260
261 for (int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++)
262 {
263 glGetMultisamplefv(GL_SAMPLE_POSITION, sampleIndex, samplePosition);
264 EXPECT_EQ(samplePosition[0], kSamplePositions[indexKey][2 * sampleIndex]);
265 EXPECT_EQ(samplePosition[1], kSamplePositions[indexKey][2 * sampleIndex + 1]);
266 }
267 }
268
269 ASSERT_GL_NO_ERROR();
270}
271
Olli Etuahod310a432018-08-24 15:40:23 +0300272// Tests that GL_TEXTURE_2D_MULTISAMPLE_ARRAY is not supported in GetInternalformativ when the
273// extension is not supported.
274TEST_P(TextureMultisampleArrayWebGLTest, MultisampleArrayTargetGetInternalFormativWithoutExtension)
275{
276 GLint maxSamples = 0;
Olli Etuaho064458a2018-08-30 14:02:02 +0300277 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_RGBA8, GL_SAMPLES, 1,
Olli Etuahod310a432018-08-24 15:40:23 +0300278 &maxSamples);
279 ASSERT_GL_ERROR(GL_INVALID_ENUM);
280}
281
282// Attempt to bind a texture to multisample array binding point when extension is not supported.
283TEST_P(TextureMultisampleArrayWebGLTest, BindMultisampleArrayTextureWithoutExtension)
284{
Olli Etuaho064458a2018-08-30 14:02:02 +0300285 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
Olli Etuahod310a432018-08-24 15:40:23 +0300286 ASSERT_GL_ERROR(GL_INVALID_ENUM);
287}
288
289// Tests that GL_TEXTURE_2D_MULTISAMPLE_ARRAY is supported in GetInternalformativ.
290TEST_P(TextureMultisampleArrayWebGLTest, MultisampleArrayTargetGetInternalFormativ)
291{
292 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
293
294 // This query returns supported sample counts in descending order. If only one sample count is
295 // queried, it should be the maximum one.
296 GLint maxSamplesRGBA8 = 0;
Olli Etuaho064458a2018-08-30 14:02:02 +0300297 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_RGBA8, GL_SAMPLES, 1,
Olli Etuahod310a432018-08-24 15:40:23 +0300298 &maxSamplesRGBA8);
Olli Etuahofd162102018-08-27 16:14:57 +0300299 GLint maxSamplesDepth = 0;
Olli Etuaho064458a2018-08-30 14:02:02 +0300300 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_DEPTH_COMPONENT24, GL_SAMPLES, 1,
301 &maxSamplesDepth);
Olli Etuahod310a432018-08-24 15:40:23 +0300302 ASSERT_GL_NO_ERROR();
303
304 // GLES 3.1 section 19.3.1 specifies the required minimum of how many samples are supported.
305 GLint maxColorTextureSamples;
306 glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &maxColorTextureSamples);
Olli Etuahofd162102018-08-27 16:14:57 +0300307 GLint maxDepthTextureSamples;
308 glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &maxDepthTextureSamples);
Olli Etuahod310a432018-08-24 15:40:23 +0300309 GLint maxSamples;
310 glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
Olli Etuahod310a432018-08-24 15:40:23 +0300311
Olli Etuahofd162102018-08-27 16:14:57 +0300312 GLint maxSamplesRGBA8Required = std::min(maxColorTextureSamples, maxSamples);
Olli Etuahod310a432018-08-24 15:40:23 +0300313 EXPECT_GE(maxSamplesRGBA8, maxSamplesRGBA8Required);
Olli Etuahofd162102018-08-27 16:14:57 +0300314
315 GLint maxSamplesDepthRequired = std::min(maxDepthTextureSamples, maxSamples);
316 EXPECT_GE(maxSamplesDepth, maxSamplesDepthRequired);
Olli Etuahod310a432018-08-24 15:40:23 +0300317}
318
319// Tests that TexImage3D call cannot be used for GL_TEXTURE_2D_MULTISAMPLE_ARRAY.
320TEST_P(TextureMultisampleArrayWebGLTest, MultiSampleArrayTexImage)
321{
322 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
323
Olli Etuaho064458a2018-08-30 14:02:02 +0300324 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
Olli Etuahod310a432018-08-24 15:40:23 +0300325 ASSERT_GL_NO_ERROR();
326
Olli Etuaho064458a2018-08-30 14:02:02 +0300327 glTexImage3D(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_RGBA8, 1, 1, 1, 0, GL_RGBA,
Olli Etuahod310a432018-08-24 15:40:23 +0300328 GL_UNSIGNED_BYTE, nullptr);
329 EXPECT_GL_ERROR(GL_INVALID_ENUM);
330}
331
332// Tests passing invalid parameters to TexStorage3DMultisample.
333TEST_P(TextureMultisampleArrayWebGLTest, InvalidTexStorage3DMultisample)
334{
335 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
336
Olli Etuaho064458a2018-08-30 14:02:02 +0300337 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
Olli Etuahod310a432018-08-24 15:40:23 +0300338 ASSERT_GL_NO_ERROR();
339
340 // Invalid target
Olli Etuaho064458a2018-08-30 14:02:02 +0300341 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE, 2, GL_RGBA8, 1, 1, 1, GL_TRUE);
Olli Etuahod310a432018-08-24 15:40:23 +0300342 EXPECT_GL_ERROR(GL_INVALID_ENUM);
343
344 // Samples 0
Olli Etuaho064458a2018-08-30 14:02:02 +0300345 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_RGBA8, 1, 1, 1,
346 GL_TRUE);
Olli Etuahod310a432018-08-24 15:40:23 +0300347 EXPECT_GL_ERROR(GL_INVALID_VALUE);
348
349 // Unsized internalformat
Olli Etuaho064458a2018-08-30 14:02:02 +0300350 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA, 1, 1, 1, GL_TRUE);
Olli Etuahod310a432018-08-24 15:40:23 +0300351 EXPECT_GL_ERROR(GL_INVALID_ENUM);
352
353 // Width 0
Olli Etuaho064458a2018-08-30 14:02:02 +0300354 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, 0, 1, 1,
355 GL_TRUE);
Olli Etuahod310a432018-08-24 15:40:23 +0300356 EXPECT_GL_ERROR(GL_INVALID_VALUE);
357
358 // Height 0
Olli Etuaho064458a2018-08-30 14:02:02 +0300359 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, 1, 0, 1,
360 GL_TRUE);
Olli Etuahod310a432018-08-24 15:40:23 +0300361 EXPECT_GL_ERROR(GL_INVALID_VALUE);
362
363 // Depth 0
Olli Etuaho064458a2018-08-30 14:02:02 +0300364 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, 1, 1, 0,
365 GL_TRUE);
Olli Etuahod310a432018-08-24 15:40:23 +0300366 EXPECT_GL_ERROR(GL_INVALID_VALUE);
367}
368
369// Tests passing invalid parameters to TexParameteri.
370TEST_P(TextureMultisampleArrayWebGLTest, InvalidTexParameteri)
371{
372 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
373
Olli Etuaho064458a2018-08-30 14:02:02 +0300374 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
Olli Etuahod310a432018-08-24 15:40:23 +0300375 ASSERT_GL_NO_ERROR();
376
Olli Etuaho064458a2018-08-30 14:02:02 +0300377 // None of the sampler parameters can be set on GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES.
378 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
Olli Etuahod310a432018-08-24 15:40:23 +0300379 EXPECT_GL_ERROR(GL_INVALID_ENUM);
Olli Etuaho064458a2018-08-30 14:02:02 +0300380 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
Olli Etuahod310a432018-08-24 15:40:23 +0300381 EXPECT_GL_ERROR(GL_INVALID_ENUM);
382
Olli Etuaho064458a2018-08-30 14:02:02 +0300383 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
Olli Etuahod310a432018-08-24 15:40:23 +0300384 EXPECT_GL_ERROR(GL_INVALID_ENUM);
Olli Etuaho064458a2018-08-30 14:02:02 +0300385 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Olli Etuahod310a432018-08-24 15:40:23 +0300386 EXPECT_GL_ERROR(GL_INVALID_ENUM);
Olli Etuaho064458a2018-08-30 14:02:02 +0300387 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
Olli Etuahod310a432018-08-24 15:40:23 +0300388 EXPECT_GL_ERROR(GL_INVALID_ENUM);
389
Olli Etuaho064458a2018-08-30 14:02:02 +0300390 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_MIN_LOD, 0);
Olli Etuahod310a432018-08-24 15:40:23 +0300391 EXPECT_GL_ERROR(GL_INVALID_ENUM);
Olli Etuaho064458a2018-08-30 14:02:02 +0300392 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_MAX_LOD, 0);
Olli Etuahod310a432018-08-24 15:40:23 +0300393 EXPECT_GL_ERROR(GL_INVALID_ENUM);
394
Olli Etuaho064458a2018-08-30 14:02:02 +0300395 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_COMPARE_MODE, GL_NONE);
Olli Etuahod310a432018-08-24 15:40:23 +0300396 EXPECT_GL_ERROR(GL_INVALID_ENUM);
Olli Etuaho064458a2018-08-30 14:02:02 +0300397 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_COMPARE_FUNC, GL_ALWAYS);
Olli Etuahod310a432018-08-24 15:40:23 +0300398 EXPECT_GL_ERROR(GL_INVALID_ENUM);
399
Olli Etuaho064458a2018-08-30 14:02:02 +0300400 // Only valid base level on GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES is 0.
401 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_BASE_LEVEL, 1);
Olli Etuahod310a432018-08-24 15:40:23 +0300402 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
403}
404
Olli Etuaho0c5a9e22018-08-27 14:36:23 +0300405// Test a valid TexStorage3DMultisample call and check that the queried texture level parameters
406// match. Does not do any drawing.
407TEST_P(TextureMultisampleArrayWebGLTest, TexStorage3DMultisample)
408{
409 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
410
411 GLint maxSamplesRGBA8 = 0;
Olli Etuaho064458a2018-08-30 14:02:02 +0300412 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_RGBA8, GL_SAMPLES, 1,
Olli Etuaho0c5a9e22018-08-27 14:36:23 +0300413 &maxSamplesRGBA8);
414
Olli Etuaho064458a2018-08-30 14:02:02 +0300415 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
Olli Etuaho0c5a9e22018-08-27 14:36:23 +0300416 ASSERT_GL_NO_ERROR();
417
Olli Etuaho064458a2018-08-30 14:02:02 +0300418 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, maxSamplesRGBA8, GL_RGBA8, 8,
419 4, 2, GL_TRUE);
Olli Etuaho0c5a9e22018-08-27 14:36:23 +0300420 ASSERT_GL_NO_ERROR();
421
422 GLint width = 0, height = 0, depth = 0, samples = 0;
Olli Etuaho064458a2018-08-30 14:02:02 +0300423 glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_TEXTURE_WIDTH, &width);
424 glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_TEXTURE_HEIGHT, &height);
425 glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_TEXTURE_DEPTH, &depth);
426 glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_TEXTURE_SAMPLES, &samples);
Olli Etuaho0c5a9e22018-08-27 14:36:23 +0300427 ASSERT_GL_NO_ERROR();
428
429 EXPECT_EQ(8, width);
430 EXPECT_EQ(4, height);
431 EXPECT_EQ(2, depth);
432 EXPECT_EQ(maxSamplesRGBA8, samples);
433}
434
Olli Etuaho064458a2018-08-30 14:02:02 +0300435// Test for invalid FramebufferTextureLayer calls with GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES
Olli Etuahofd162102018-08-27 16:14:57 +0300436// textures.
437TEST_P(TextureMultisampleArrayWebGLTest, InvalidFramebufferTextureLayer)
438{
439 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
440
441 GLint maxSamplesRGBA8 = 0;
Olli Etuaho064458a2018-08-30 14:02:02 +0300442 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_RGBA8, GL_SAMPLES, 1,
Olli Etuahofd162102018-08-27 16:14:57 +0300443 &maxSamplesRGBA8);
444
445 GLint maxArrayTextureLayers;
446 glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxArrayTextureLayers);
447
448 // Test framebuffer status with just a color texture attached.
Olli Etuaho064458a2018-08-30 14:02:02 +0300449 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
450 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, maxSamplesRGBA8, GL_RGBA8, 4,
451 4, 2, GL_TRUE);
Olli Etuahofd162102018-08-27 16:14:57 +0300452 ASSERT_GL_NO_ERROR();
453
454 // Test with mip level 1 and -1 (only level 0 is valid for multisample textures).
455 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
456 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 1, 0);
457 EXPECT_GL_ERROR(GL_INVALID_VALUE);
458 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, -1, 0);
459 EXPECT_GL_ERROR(GL_INVALID_VALUE);
460
461 // Test with layer -1 and layer == MAX_ARRAY_TEXTURE_LAYERS
462 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
463 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0, -1);
464 EXPECT_GL_ERROR(GL_INVALID_VALUE);
465 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0,
466 maxArrayTextureLayers);
467 EXPECT_GL_ERROR(GL_INVALID_VALUE);
468}
469
470// Attach layers of TEXTURE_2D_MULTISAMPLE_ARRAY textures to a framebuffer and check for
471// completeness.
472TEST_P(TextureMultisampleArrayWebGLTest, FramebufferCompleteness)
473{
474 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
475
476 std::vector<GLenum> testFormats = {{GL_RGBA8, GL_DEPTH_COMPONENT24, GL_DEPTH24_STENCIL8}};
Olli Etuaho064458a2018-08-30 14:02:02 +0300477 GLint samplesToUse = getSamplesToUse(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, testFormats);
Olli Etuahofd162102018-08-27 16:14:57 +0300478
479 // Test framebuffer status with just a color texture attached.
Olli Etuaho064458a2018-08-30 14:02:02 +0300480 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
481 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samplesToUse, GL_RGBA8, 4, 4,
482 2, GL_TRUE);
Olli Etuahofd162102018-08-27 16:14:57 +0300483 ASSERT_GL_NO_ERROR();
484
485 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
486 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0, 0);
487 ASSERT_GL_NO_ERROR();
488
489 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
490 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
491
492 // Test framebuffer status with both color and depth textures attached.
493 GLTexture depthTexture;
Olli Etuaho064458a2018-08-30 14:02:02 +0300494 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, depthTexture);
495 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samplesToUse,
496 GL_DEPTH_COMPONENT24, 4, 4, 2, GL_TRUE);
Olli Etuahofd162102018-08-27 16:14:57 +0300497 ASSERT_GL_NO_ERROR();
498
499 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0, 0);
500 ASSERT_GL_NO_ERROR();
501
502 status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
503 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
504
505 // Test with color and depth/stencil textures attached.
506 GLTexture depthStencilTexture;
Olli Etuaho064458a2018-08-30 14:02:02 +0300507 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, depthStencilTexture);
508 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samplesToUse,
509 GL_DEPTH24_STENCIL8, 4, 4, 2, GL_TRUE);
Olli Etuahofd162102018-08-27 16:14:57 +0300510 ASSERT_GL_NO_ERROR();
511
512 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, depthStencilTexture, 0,
513 0);
514 ASSERT_GL_NO_ERROR();
515
516 status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
517 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
518}
519
520// Attach a layer of TEXTURE_2D_MULTISAMPLE_ARRAY texture to a framebuffer, clear it, and resolve by
521// blitting.
522TEST_P(TextureMultisampleArrayWebGLTest, FramebufferColorClearAndBlit)
523{
524 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
525
526 const GLsizei kWidth = 4;
527 const GLsizei kHeight = 4;
528
529 std::vector<GLenum> testFormats = {GL_RGBA8};
Olli Etuaho064458a2018-08-30 14:02:02 +0300530 GLint samplesToUse = getSamplesToUse(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, testFormats);
Olli Etuahofd162102018-08-27 16:14:57 +0300531
Olli Etuaho064458a2018-08-30 14:02:02 +0300532 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
533 glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samplesToUse, GL_RGBA8,
534 kWidth, kHeight, 2, GL_TRUE);
Olli Etuahofd162102018-08-27 16:14:57 +0300535
536 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
537 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0, 0);
538
539 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
540 ASSERT_GL_NO_ERROR();
541 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
542
543 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
544 glClear(GL_COLOR_BUFFER_BIT);
545
546 GLFramebuffer resolveFramebuffer;
547 GLTexture resolveTexture;
548 glBindTexture(GL_TEXTURE_2D, resolveTexture);
549 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight);
550 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFramebuffer);
551 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture,
552 0);
553 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
554 GL_NEAREST);
555 ASSERT_GL_NO_ERROR();
556
557 glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFramebuffer);
558 EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
559}
560
JiangYizhoubddc46b2016-12-09 09:50:51 +0800561ANGLE_INSTANTIATE_TEST(TextureMultisampleTest,
JiangYizhou34bc3152017-03-29 14:56:01 +0800562 ES31_D3D11(),
JiangYizhoubddc46b2016-12-09 09:50:51 +0800563 ES3_OPENGL(),
564 ES3_OPENGLES(),
565 ES31_OPENGL(),
566 ES31_OPENGLES());
JiangYizhou34bc3152017-03-29 14:56:01 +0800567ANGLE_INSTANTIATE_TEST(TextureMultisampleTestES31, ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES());
Olli Etuahod310a432018-08-24 15:40:23 +0300568ANGLE_INSTANTIATE_TEST(TextureMultisampleArrayWebGLTest,
569 ES31_D3D11(),
570 ES31_OPENGL(),
571 ES31_OPENGLES());
572
573} // anonymous namespace