blob: 546bbbfb1fae896c95718374c62a74941bb295a3 [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;
65};
66
67class TextureMultisampleTestES31 : public TextureMultisampleTest
68{
69 protected:
70 TextureMultisampleTestES31() : TextureMultisampleTest() {}
71};
72
73// Tests that if es version < 3.1, GL_TEXTURE_2D_MULTISAMPLE is not supported in
74// GetInternalformativ.
75TEST_P(TextureMultisampleTest, MultisampleTargetGetInternalFormativBase)
76{
77 GLint maxSamples = 0;
78 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_R8, GL_SAMPLES, 1, &maxSamples);
79 if (getClientMajorVersion() < 3 || getClientMinorVersion() < 1)
80 {
81 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
82 }
83 else
84 {
85 ASSERT_GL_NO_ERROR();
86 }
87}
88
89// Tests that if es version < 3.1, GL_TEXTURE_2D_MULTISAMPLE is not supported in
90// FramebufferTexture2D.
91TEST_P(TextureMultisampleTest, MultisampleTargetFramebufferTexture2D)
92{
93 GLint samples = 1;
94 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
95 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, 64, 64, GL_FALSE);
96 if (getClientMajorVersion() < 3 || getClientMinorVersion() < 1)
97 {
98 ASSERT_GL_ERROR(GL_INVALID_ENUM);
99 }
100 else
101 {
102 ASSERT_GL_NO_ERROR();
103 }
104
105 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
106 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
107 mTexture, 0);
108 if (getClientMajorVersion() < 3 || getClientMinorVersion() < 1)
109 {
110 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
111 }
112 else
113 {
114 ASSERT_GL_NO_ERROR();
115 }
116}
117
118// Tests basic functionality of glTexStorage2DMultisample.
119TEST_P(TextureMultisampleTestES31, ValidateTextureStorageMultisampleParameters)
120{
121 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
122 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 1, 1, GL_FALSE);
JiangYizhou461d9a32017-01-04 16:37:26 +0800123 ASSERT_GL_NO_ERROR();
124
JiangYizhoubddc46b2016-12-09 09:50:51 +0800125 GLint params = 0;
126 glGetTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_IMMUTABLE_FORMAT, &params);
127 EXPECT_EQ(1, params);
128
129 glTexStorage2DMultisample(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1, GL_FALSE);
130 ASSERT_GL_ERROR(GL_INVALID_ENUM);
131
132 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 0, 0, GL_FALSE);
133 ASSERT_GL_ERROR(GL_INVALID_VALUE);
134
135 GLint maxSize = 0;
136 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize);
137 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, maxSize + 1, 1, GL_FALSE);
138 ASSERT_GL_ERROR(GL_INVALID_VALUE);
139
140 GLint maxSamples = 0;
141 glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_R8, GL_SAMPLES, 1, &maxSamples);
142 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, maxSamples + 1, GL_RGBA8, 1, 1, GL_FALSE);
143 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
144
145 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_RGBA8, 1, 1, GL_FALSE);
146 ASSERT_GL_ERROR(GL_INVALID_VALUE);
147
148 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA, 0, 0, GL_FALSE);
149 ASSERT_GL_ERROR(GL_INVALID_VALUE);
150
151 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
152 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 1, 1, GL_FALSE);
153 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
154}
155
Shao5116d682017-08-02 12:39:44 +0800156// Tests the value of MAX_INTEGER_SAMPLES is no less than 1.
157// [OpenGL ES 3.1 SPEC Table 20.40]
158TEST_P(TextureMultisampleTestES31, MaxIntegerSamples)
159{
160 GLint maxIntegerSamples;
161 glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &maxIntegerSamples);
162 EXPECT_GE(maxIntegerSamples, 1);
163 EXPECT_NE(std::numeric_limits<GLint>::max(), maxIntegerSamples);
164}
165
166// Tests the value of MAX_COLOR_TEXTURE_SAMPLES is no less than 1.
167// [OpenGL ES 3.1 SPEC Table 20.40]
168TEST_P(TextureMultisampleTestES31, MaxColorTextureSamples)
169{
170 GLint maxColorTextureSamples;
171 glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &maxColorTextureSamples);
172 EXPECT_GE(maxColorTextureSamples, 1);
173 EXPECT_NE(std::numeric_limits<GLint>::max(), maxColorTextureSamples);
174}
175
176// Tests the value of MAX_DEPTH_TEXTURE_SAMPLES is no less than 1.
177// [OpenGL ES 3.1 SPEC Table 20.40]
178TEST_P(TextureMultisampleTestES31, MaxDepthTextureSamples)
179{
180 GLint maxDepthTextureSamples;
181 glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &maxDepthTextureSamples);
182 EXPECT_GE(maxDepthTextureSamples, 1);
183 EXPECT_NE(std::numeric_limits<GLint>::max(), maxDepthTextureSamples);
184}
185
Jiang0e1224c2017-12-26 14:11:15 +0800186// The value of sample position should be equal to standard pattern on D3D.
187TEST_P(TextureMultisampleTestES31, CheckSamplePositions)
188{
189 ANGLE_SKIP_TEST_IF(!IsD3D11());
190
191 GLsizei maxSamples = 0;
192 glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
193
194 GLfloat samplePosition[2];
195
196 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
197
198 for (int sampleCount = 1; sampleCount <= maxSamples; sampleCount++)
199 {
200 GLTexture texture;
201 size_t indexKey = static_cast<size_t>(ceil(log2(sampleCount)));
202 glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
203 glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, sampleCount, GL_RGBA8, 1, 1, GL_TRUE);
204 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
205 texture, 0);
206 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
207 ASSERT_GL_NO_ERROR();
208
209 for (int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++)
210 {
211 glGetMultisamplefv(GL_SAMPLE_POSITION, sampleIndex, samplePosition);
212 EXPECT_EQ(samplePosition[0], kSamplePositions[indexKey][2 * sampleIndex]);
213 EXPECT_EQ(samplePosition[1], kSamplePositions[indexKey][2 * sampleIndex + 1]);
214 }
215 }
216
217 ASSERT_GL_NO_ERROR();
218}
219
JiangYizhoubddc46b2016-12-09 09:50:51 +0800220ANGLE_INSTANTIATE_TEST(TextureMultisampleTest,
JiangYizhou34bc3152017-03-29 14:56:01 +0800221 ES31_D3D11(),
JiangYizhoubddc46b2016-12-09 09:50:51 +0800222 ES3_OPENGL(),
223 ES3_OPENGLES(),
224 ES31_OPENGL(),
225 ES31_OPENGLES());
JiangYizhou34bc3152017-03-29 14:56:01 +0800226ANGLE_INSTANTIATE_TEST(TextureMultisampleTestES31, ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES());
JiangYizhoubddc46b2016-12-09 09:50:51 +0800227}