blob: 566398f87578fad8b0832894fab506302d131c0f [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 {
101 if (extensionRequestable("GL_ANGLE_texture_multisample_array"))
102 {
103 glRequestExtensionANGLE("GL_ANGLE_texture_multisample_array");
104 }
105
106 if (!extensionEnabled("GL_ANGLE_texture_multisample_array"))
107 {
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;
277 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_RGBA8, GL_SAMPLES, 1,
278 &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{
285 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, mTexture);
286 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;
297 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_RGBA8, GL_SAMPLES, 1,
298 &maxSamplesRGBA8);
Olli Etuahofd162102018-08-27 16:14:57 +0300299 GLint maxSamplesDepth = 0;
300 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_DEPTH_COMPONENT24, GL_SAMPLES,
301 1, &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
324 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, mTexture);
325 ASSERT_GL_NO_ERROR();
326
327 glTexImage3D(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, 0, GL_RGBA8, 1, 1, 1, 0, GL_RGBA,
328 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
337 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, mTexture);
338 ASSERT_GL_NO_ERROR();
339
340 // Invalid target
341 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE, 2, GL_RGBA8, 1, 1, 1, GL_TRUE);
342 EXPECT_GL_ERROR(GL_INVALID_ENUM);
343
344 // Samples 0
345 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, 0, GL_RGBA8, 1, 1, 1,
346 GL_TRUE);
347 EXPECT_GL_ERROR(GL_INVALID_VALUE);
348
349 // Unsized internalformat
350 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, 2, GL_RGBA, 1, 1, 1,
351 GL_TRUE);
352 EXPECT_GL_ERROR(GL_INVALID_ENUM);
353
354 // Width 0
355 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, 2, GL_RGBA8, 0, 1, 1,
356 GL_TRUE);
357 EXPECT_GL_ERROR(GL_INVALID_VALUE);
358
359 // Height 0
360 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, 2, GL_RGBA8, 1, 0, 1,
361 GL_TRUE);
362 EXPECT_GL_ERROR(GL_INVALID_VALUE);
363
364 // Depth 0
365 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, 2, GL_RGBA8, 1, 1, 0,
366 GL_TRUE);
367 EXPECT_GL_ERROR(GL_INVALID_VALUE);
368}
369
370// Tests passing invalid parameters to TexParameteri.
371TEST_P(TextureMultisampleArrayWebGLTest, InvalidTexParameteri)
372{
373 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
374
375 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, mTexture);
376 ASSERT_GL_NO_ERROR();
377
378 // None of the sampler parameters can be set on GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE.
379 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
380 EXPECT_GL_ERROR(GL_INVALID_ENUM);
381 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
382 EXPECT_GL_ERROR(GL_INVALID_ENUM);
383
384 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
385 EXPECT_GL_ERROR(GL_INVALID_ENUM);
386 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
387 EXPECT_GL_ERROR(GL_INVALID_ENUM);
388 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
389 EXPECT_GL_ERROR(GL_INVALID_ENUM);
390
391 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_TEXTURE_MIN_LOD, 0);
392 EXPECT_GL_ERROR(GL_INVALID_ENUM);
393 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_TEXTURE_MAX_LOD, 0);
394 EXPECT_GL_ERROR(GL_INVALID_ENUM);
395
396 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_TEXTURE_COMPARE_MODE, GL_NONE);
397 EXPECT_GL_ERROR(GL_INVALID_ENUM);
398 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_TEXTURE_COMPARE_FUNC, GL_ALWAYS);
399 EXPECT_GL_ERROR(GL_INVALID_ENUM);
400
401 // Only valid base level on GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE is 0.
402 glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_TEXTURE_BASE_LEVEL, 1);
403 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
404}
405
Olli Etuaho0c5a9e22018-08-27 14:36:23 +0300406// Test a valid TexStorage3DMultisample call and check that the queried texture level parameters
407// match. Does not do any drawing.
408TEST_P(TextureMultisampleArrayWebGLTest, TexStorage3DMultisample)
409{
410 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
411
412 GLint maxSamplesRGBA8 = 0;
413 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_RGBA8, GL_SAMPLES, 1,
414 &maxSamplesRGBA8);
415
416 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, mTexture);
417 ASSERT_GL_NO_ERROR();
418
419 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, maxSamplesRGBA8, GL_RGBA8,
420 8, 4, 2, GL_TRUE);
421 ASSERT_GL_NO_ERROR();
422
423 GLint width = 0, height = 0, depth = 0, samples = 0;
424 glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, 0, GL_TEXTURE_WIDTH, &width);
425 glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, 0, GL_TEXTURE_HEIGHT, &height);
426 glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, 0, GL_TEXTURE_DEPTH, &depth);
427 glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, 0, GL_TEXTURE_SAMPLES,
428 &samples);
429 ASSERT_GL_NO_ERROR();
430
431 EXPECT_EQ(8, width);
432 EXPECT_EQ(4, height);
433 EXPECT_EQ(2, depth);
434 EXPECT_EQ(maxSamplesRGBA8, samples);
435}
436
Olli Etuahofd162102018-08-27 16:14:57 +0300437// Test for invalid FramebufferTextureLayer calls with GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE
438// textures.
439TEST_P(TextureMultisampleArrayWebGLTest, InvalidFramebufferTextureLayer)
440{
441 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
442
443 GLint maxSamplesRGBA8 = 0;
444 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, GL_RGBA8, GL_SAMPLES, 1,
445 &maxSamplesRGBA8);
446
447 GLint maxArrayTextureLayers;
448 glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxArrayTextureLayers);
449
450 // Test framebuffer status with just a color texture attached.
451 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, mTexture);
452 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, maxSamplesRGBA8, GL_RGBA8,
453 4, 4, 2, GL_TRUE);
454 ASSERT_GL_NO_ERROR();
455
456 // Test with mip level 1 and -1 (only level 0 is valid for multisample textures).
457 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
458 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 1, 0);
459 EXPECT_GL_ERROR(GL_INVALID_VALUE);
460 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, -1, 0);
461 EXPECT_GL_ERROR(GL_INVALID_VALUE);
462
463 // Test with layer -1 and layer == MAX_ARRAY_TEXTURE_LAYERS
464 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
465 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0, -1);
466 EXPECT_GL_ERROR(GL_INVALID_VALUE);
467 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0,
468 maxArrayTextureLayers);
469 EXPECT_GL_ERROR(GL_INVALID_VALUE);
470}
471
472// Attach layers of TEXTURE_2D_MULTISAMPLE_ARRAY textures to a framebuffer and check for
473// completeness.
474TEST_P(TextureMultisampleArrayWebGLTest, FramebufferCompleteness)
475{
476 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
477
478 std::vector<GLenum> testFormats = {{GL_RGBA8, GL_DEPTH_COMPONENT24, GL_DEPTH24_STENCIL8}};
479 GLint samplesToUse = getSamplesToUse(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, testFormats);
480
481 // Test framebuffer status with just a color texture attached.
482 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, mTexture);
483 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, samplesToUse, GL_RGBA8, 4,
484 4, 2, GL_TRUE);
485 ASSERT_GL_NO_ERROR();
486
487 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
488 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0, 0);
489 ASSERT_GL_NO_ERROR();
490
491 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
492 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
493
494 // Test framebuffer status with both color and depth textures attached.
495 GLTexture depthTexture;
496 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, depthTexture);
497 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, samplesToUse,
498 GL_DEPTH_COMPONENT24, 4, 4, 2, GL_TRUE);
499 ASSERT_GL_NO_ERROR();
500
501 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0, 0);
502 ASSERT_GL_NO_ERROR();
503
504 status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
505 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
506
507 // Test with color and depth/stencil textures attached.
508 GLTexture depthStencilTexture;
509 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, depthStencilTexture);
510 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, samplesToUse,
511 GL_DEPTH24_STENCIL8, 4, 4, 2, GL_TRUE);
512 ASSERT_GL_NO_ERROR();
513
514 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, depthStencilTexture, 0,
515 0);
516 ASSERT_GL_NO_ERROR();
517
518 status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
519 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
520}
521
522// Attach a layer of TEXTURE_2D_MULTISAMPLE_ARRAY texture to a framebuffer, clear it, and resolve by
523// blitting.
524TEST_P(TextureMultisampleArrayWebGLTest, FramebufferColorClearAndBlit)
525{
526 ANGLE_SKIP_TEST_IF(!requestArrayExtension());
527
528 const GLsizei kWidth = 4;
529 const GLsizei kHeight = 4;
530
531 std::vector<GLenum> testFormats = {GL_RGBA8};
532 GLint samplesToUse = getSamplesToUse(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, testFormats);
533
534 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, mTexture);
535 glTexStorage3DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_ANGLE, samplesToUse, GL_RGBA8,
536 kWidth, kHeight, 2, GL_TRUE);
537
538 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
539 glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0, 0);
540
541 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
542 ASSERT_GL_NO_ERROR();
543 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
544
545 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
546 glClear(GL_COLOR_BUFFER_BIT);
547
548 GLFramebuffer resolveFramebuffer;
549 GLTexture resolveTexture;
550 glBindTexture(GL_TEXTURE_2D, resolveTexture);
551 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight);
552 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFramebuffer);
553 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture,
554 0);
555 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
556 GL_NEAREST);
557 ASSERT_GL_NO_ERROR();
558
559 glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFramebuffer);
560 EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
561}
562
JiangYizhoubddc46b2016-12-09 09:50:51 +0800563ANGLE_INSTANTIATE_TEST(TextureMultisampleTest,
JiangYizhou34bc3152017-03-29 14:56:01 +0800564 ES31_D3D11(),
JiangYizhoubddc46b2016-12-09 09:50:51 +0800565 ES3_OPENGL(),
566 ES3_OPENGLES(),
567 ES31_OPENGL(),
568 ES31_OPENGLES());
JiangYizhou34bc3152017-03-29 14:56:01 +0800569ANGLE_INSTANTIATE_TEST(TextureMultisampleTestES31, ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES());
Olli Etuahod310a432018-08-24 15:40:23 +0300570ANGLE_INSTANTIATE_TEST(TextureMultisampleArrayWebGLTest,
571 ES31_D3D11(),
572 ES31_OPENGL(),
573 ES31_OPENGLES());
574
575} // anonymous namespace