xref: /aosp_15_r20/external/angle/src/tests/gl_tests/TextureMultisampleTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2017 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // TextureMultisampleTest: Tests of multisampled texture
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker // Sample positions of d3d standard pattern. Some of the sample positions might not the same as
19*8975f5c5SAndroid Build Coastguard Worker // opengl.
20*8975f5c5SAndroid Build Coastguard Worker using SamplePositionsArray                                            = std::array<float, 32>;
21*8975f5c5SAndroid Build Coastguard Worker static constexpr std::array<SamplePositionsArray, 5> kSamplePositions = {
22*8975f5c5SAndroid Build Coastguard Worker     {{{0.5f, 0.5f}},
23*8975f5c5SAndroid Build Coastguard Worker      {{0.75f, 0.75f, 0.25f, 0.25f}},
24*8975f5c5SAndroid Build Coastguard Worker      {{0.375f, 0.125f, 0.875f, 0.375f, 0.125f, 0.625f, 0.625f, 0.875f}},
25*8975f5c5SAndroid Build Coastguard Worker      {{0.5625f, 0.3125f, 0.4375f, 0.6875f, 0.8125f, 0.5625f, 0.3125f, 0.1875f, 0.1875f, 0.8125f,
26*8975f5c5SAndroid Build Coastguard Worker        0.0625f, 0.4375f, 0.6875f, 0.9375f, 0.9375f, 0.0625f}},
27*8975f5c5SAndroid Build Coastguard Worker      {{0.5625f, 0.5625f, 0.4375f, 0.3125f, 0.3125f, 0.625f,  0.75f,   0.4375f,
28*8975f5c5SAndroid Build Coastguard Worker        0.1875f, 0.375f,  0.625f,  0.8125f, 0.8125f, 0.6875f, 0.6875f, 0.1875f,
29*8975f5c5SAndroid Build Coastguard Worker        0.375f,  0.875f,  0.5f,    0.0625f, 0.25f,   0.125f,  0.125f,  0.75f,
30*8975f5c5SAndroid Build Coastguard Worker        0.0f,    0.5f,    0.9375f, 0.25f,   0.875f,  0.9375f, 0.0625f, 0.0f}}}};
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker class TextureMultisampleTest : public ANGLETest<>
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureMultisampleTest()35*8975f5c5SAndroid Build Coastguard Worker     TextureMultisampleTest()
36*8975f5c5SAndroid Build Coastguard Worker     {
37*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(64);
38*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(64);
39*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
40*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
41*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
42*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
43*8975f5c5SAndroid Build Coastguard Worker     }
44*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()45*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
46*8975f5c5SAndroid Build Coastguard Worker     {
47*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFramebuffer);
48*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture);
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
51*8975f5c5SAndroid Build Coastguard Worker     }
52*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()53*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
54*8975f5c5SAndroid Build Coastguard Worker     {
55*8975f5c5SAndroid Build Coastguard Worker         glDeleteFramebuffers(1, &mFramebuffer);
56*8975f5c5SAndroid Build Coastguard Worker         mFramebuffer = 0;
57*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &mTexture);
58*8975f5c5SAndroid Build Coastguard Worker         mTexture = 0;
59*8975f5c5SAndroid Build Coastguard Worker     }
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker     void texStorageMultisample(GLenum target,
62*8975f5c5SAndroid Build Coastguard Worker                                GLint samples,
63*8975f5c5SAndroid Build Coastguard Worker                                GLenum format,
64*8975f5c5SAndroid Build Coastguard Worker                                GLsizei width,
65*8975f5c5SAndroid Build Coastguard Worker                                GLsizei height,
66*8975f5c5SAndroid Build Coastguard Worker                                GLboolean fixedsamplelocations);
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker     void getMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
69*8975f5c5SAndroid Build Coastguard Worker     void sampleMaski(GLuint maskNumber, GLbitfield mask);
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     GLuint mFramebuffer = 0;
72*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture     = 0;
73*8975f5c5SAndroid Build Coastguard Worker 
74*8975f5c5SAndroid Build Coastguard Worker     // Returns a sample count that can be used with the given texture target for all the given
75*8975f5c5SAndroid Build Coastguard Worker     // formats. Assumes that if format A supports a number of samples N and another format B
76*8975f5c5SAndroid Build Coastguard Worker     // supports a number of samples M > N then format B also supports number of samples N.
getSamplesToUse(GLenum texTarget,const std::vector<GLenum> & formats)77*8975f5c5SAndroid Build Coastguard Worker     GLint getSamplesToUse(GLenum texTarget, const std::vector<GLenum> &formats)
78*8975f5c5SAndroid Build Coastguard Worker     {
79*8975f5c5SAndroid Build Coastguard Worker         GLint maxSamples = 65536;
80*8975f5c5SAndroid Build Coastguard Worker         for (GLenum format : formats)
81*8975f5c5SAndroid Build Coastguard Worker         {
82*8975f5c5SAndroid Build Coastguard Worker             GLint maxSamplesFormat = 0;
83*8975f5c5SAndroid Build Coastguard Worker             glGetInternalformativ(texTarget, format, GL_SAMPLES, 1, &maxSamplesFormat);
84*8975f5c5SAndroid Build Coastguard Worker             maxSamples = std::min(maxSamples, maxSamplesFormat);
85*8975f5c5SAndroid Build Coastguard Worker         }
86*8975f5c5SAndroid Build Coastguard Worker         return maxSamples;
87*8975f5c5SAndroid Build Coastguard Worker     }
88*8975f5c5SAndroid Build Coastguard Worker 
lessThanES31MultisampleExtNotSupported()89*8975f5c5SAndroid Build Coastguard Worker     bool lessThanES31MultisampleExtNotSupported()
90*8975f5c5SAndroid Build Coastguard Worker     {
91*8975f5c5SAndroid Build Coastguard Worker         return getClientMajorVersion() <= 3 && getClientMinorVersion() < 1 &&
92*8975f5c5SAndroid Build Coastguard Worker                !EnsureGLExtensionEnabled("GL_ANGLE_texture_multisample");
93*8975f5c5SAndroid Build Coastguard Worker     }
94*8975f5c5SAndroid Build Coastguard Worker 
multisampleTextureFragmentShader()95*8975f5c5SAndroid Build Coastguard Worker     const char *multisampleTextureFragmentShader()
96*8975f5c5SAndroid Build Coastguard Worker     {
97*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
98*8975f5c5SAndroid Build Coastguard Worker #extension GL_ANGLE_texture_multisample : require
99*8975f5c5SAndroid Build Coastguard Worker precision highp float;
100*8975f5c5SAndroid Build Coastguard Worker precision highp int;
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2DMS tex;
103*8975f5c5SAndroid Build Coastguard Worker uniform int sampleNum;
104*8975f5c5SAndroid Build Coastguard Worker 
105*8975f5c5SAndroid Build Coastguard Worker in vec4 v_position;
106*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker void main() {
109*8975f5c5SAndroid Build Coastguard Worker     ivec2 texSize = textureSize(tex);
110*8975f5c5SAndroid Build Coastguard Worker     ivec2 sampleCoords = ivec2((v_position.xy * 0.5 + 0.5) * vec2(texSize.xy - 1));
111*8975f5c5SAndroid Build Coastguard Worker     my_FragColor = texelFetch(tex, sampleCoords, sampleNum);
112*8975f5c5SAndroid Build Coastguard Worker }
113*8975f5c5SAndroid Build Coastguard Worker )";
114*8975f5c5SAndroid Build Coastguard Worker     }
115*8975f5c5SAndroid Build Coastguard Worker 
blitArrayTextureLayerFragmentShader()116*8975f5c5SAndroid Build Coastguard Worker     const char *blitArrayTextureLayerFragmentShader()
117*8975f5c5SAndroid Build Coastguard Worker     {
118*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 310 es
119*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_texture_storage_multisample_2d_array : require
120*8975f5c5SAndroid Build Coastguard Worker precision highp float;
121*8975f5c5SAndroid Build Coastguard Worker precision highp int;
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2DMSArray tex;
124*8975f5c5SAndroid Build Coastguard Worker uniform int layer;
125*8975f5c5SAndroid Build Coastguard Worker uniform int sampleNum;
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker in vec4 v_position;
128*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker void main() {
131*8975f5c5SAndroid Build Coastguard Worker     ivec3 texSize = textureSize(tex);
132*8975f5c5SAndroid Build Coastguard Worker     ivec2 sampleCoords = ivec2((v_position.xy * 0.5 + 0.5) * vec2(texSize.xy - 1));
133*8975f5c5SAndroid Build Coastguard Worker     my_FragColor = texelFetch(tex, ivec3(sampleCoords, layer), sampleNum);
134*8975f5c5SAndroid Build Coastguard Worker }
135*8975f5c5SAndroid Build Coastguard Worker )";
136*8975f5c5SAndroid Build Coastguard Worker     }
137*8975f5c5SAndroid Build Coastguard Worker 
blitIntArrayTextureLayerFragmentShader()138*8975f5c5SAndroid Build Coastguard Worker     const char *blitIntArrayTextureLayerFragmentShader()
139*8975f5c5SAndroid Build Coastguard Worker     {
140*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 310 es
141*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_texture_storage_multisample_2d_array : require
142*8975f5c5SAndroid Build Coastguard Worker precision highp float;
143*8975f5c5SAndroid Build Coastguard Worker precision highp int;
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker uniform highp isampler2DMSArray tex;
146*8975f5c5SAndroid Build Coastguard Worker uniform int layer;
147*8975f5c5SAndroid Build Coastguard Worker uniform int sampleNum;
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker in vec4 v_position;
150*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker void main() {
153*8975f5c5SAndroid Build Coastguard Worker     ivec3 texSize = textureSize(tex);
154*8975f5c5SAndroid Build Coastguard Worker     ivec2 sampleCoords = ivec2((v_position.xy * 0.5 + 0.5) * vec2(texSize.xy - 1));
155*8975f5c5SAndroid Build Coastguard Worker     my_FragColor = vec4(texelFetch(tex, ivec3(sampleCoords, layer), sampleNum));
156*8975f5c5SAndroid Build Coastguard Worker }
157*8975f5c5SAndroid Build Coastguard Worker )";
158*8975f5c5SAndroid Build Coastguard Worker     }
159*8975f5c5SAndroid Build Coastguard Worker };
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker class NegativeTextureMultisampleTest : public TextureMultisampleTest
162*8975f5c5SAndroid Build Coastguard Worker {
163*8975f5c5SAndroid Build Coastguard Worker   protected:
NegativeTextureMultisampleTest()164*8975f5c5SAndroid Build Coastguard Worker     NegativeTextureMultisampleTest() : TextureMultisampleTest() { setExtensionsEnabled(false); }
165*8975f5c5SAndroid Build Coastguard Worker };
166*8975f5c5SAndroid Build Coastguard Worker 
167*8975f5c5SAndroid Build Coastguard Worker class TextureMultisampleArrayTest : public TextureMultisampleTest
168*8975f5c5SAndroid Build Coastguard Worker {
169*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureMultisampleArrayTest()170*8975f5c5SAndroid Build Coastguard Worker     TextureMultisampleArrayTest() : TextureMultisampleTest() { setExtensionsEnabled(false); }
171*8975f5c5SAndroid Build Coastguard Worker 
areMultisampleArraysAlwaysAvailable()172*8975f5c5SAndroid Build Coastguard Worker     bool areMultisampleArraysAlwaysAvailable()
173*8975f5c5SAndroid Build Coastguard Worker     {
174*8975f5c5SAndroid Build Coastguard Worker         return getClientMajorVersion() == 3 && getClientMinorVersion() >= 2;
175*8975f5c5SAndroid Build Coastguard Worker     }
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker     // Requests the GL_OES_texture_storage_multisample_2d_array extension and returns true if the
178*8975f5c5SAndroid Build Coastguard Worker     // operation succeeds.
requestArrayExtension()179*8975f5c5SAndroid Build Coastguard Worker     bool requestArrayExtension()
180*8975f5c5SAndroid Build Coastguard Worker     {
181*8975f5c5SAndroid Build Coastguard Worker         return EnsureGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array");
182*8975f5c5SAndroid Build Coastguard Worker     }
183*8975f5c5SAndroid Build Coastguard Worker 
texStorage3DMultisample(GLenum target,GLint samples,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth,GLboolean fixedsamplelocations)184*8975f5c5SAndroid Build Coastguard Worker     void texStorage3DMultisample(GLenum target,
185*8975f5c5SAndroid Build Coastguard Worker                                  GLint samples,
186*8975f5c5SAndroid Build Coastguard Worker                                  GLenum internalformat,
187*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei width,
188*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei height,
189*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei depth,
190*8975f5c5SAndroid Build Coastguard Worker                                  GLboolean fixedsamplelocations)
191*8975f5c5SAndroid Build Coastguard Worker     {
192*8975f5c5SAndroid Build Coastguard Worker         if (getClientMajorVersion() == 3 && getClientMinorVersion() >= 2)
193*8975f5c5SAndroid Build Coastguard Worker         {
194*8975f5c5SAndroid Build Coastguard Worker             glTexStorage3DMultisample(target, samples, internalformat, width, height, depth,
195*8975f5c5SAndroid Build Coastguard Worker                                       fixedsamplelocations);
196*8975f5c5SAndroid Build Coastguard Worker         }
197*8975f5c5SAndroid Build Coastguard Worker         else
198*8975f5c5SAndroid Build Coastguard Worker         {
199*8975f5c5SAndroid Build Coastguard Worker             glTexStorage3DMultisampleOES(target, samples, internalformat, width, height, depth,
200*8975f5c5SAndroid Build Coastguard Worker                                          fixedsamplelocations);
201*8975f5c5SAndroid Build Coastguard Worker         }
202*8975f5c5SAndroid Build Coastguard Worker     }
203*8975f5c5SAndroid Build Coastguard Worker };
204*8975f5c5SAndroid Build Coastguard Worker 
texStorageMultisample(GLenum target,GLint samples,GLenum internalformat,GLsizei width,GLsizei height,GLboolean fixedsamplelocations)205*8975f5c5SAndroid Build Coastguard Worker void TextureMultisampleTest::texStorageMultisample(GLenum target,
206*8975f5c5SAndroid Build Coastguard Worker                                                    GLint samples,
207*8975f5c5SAndroid Build Coastguard Worker                                                    GLenum internalformat,
208*8975f5c5SAndroid Build Coastguard Worker                                                    GLsizei width,
209*8975f5c5SAndroid Build Coastguard Worker                                                    GLsizei height,
210*8975f5c5SAndroid Build Coastguard Worker                                                    GLboolean fixedsamplelocations)
211*8975f5c5SAndroid Build Coastguard Worker {
212*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() <= 3 && getClientMinorVersion() < 1 &&
213*8975f5c5SAndroid Build Coastguard Worker         EnsureGLExtensionEnabled("GL_ANGLE_texture_multisample"))
214*8975f5c5SAndroid Build Coastguard Worker     {
215*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2DMultisampleANGLE(target, samples, internalformat, width, height,
216*8975f5c5SAndroid Build Coastguard Worker                                        fixedsamplelocations);
217*8975f5c5SAndroid Build Coastguard Worker     }
218*8975f5c5SAndroid Build Coastguard Worker     else
219*8975f5c5SAndroid Build Coastguard Worker     {
220*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2DMultisample(target, samples, internalformat, width, height,
221*8975f5c5SAndroid Build Coastguard Worker                                   fixedsamplelocations);
222*8975f5c5SAndroid Build Coastguard Worker     }
223*8975f5c5SAndroid Build Coastguard Worker }
224*8975f5c5SAndroid Build Coastguard Worker 
getMultisamplefv(GLenum pname,GLuint index,GLfloat * val)225*8975f5c5SAndroid Build Coastguard Worker void TextureMultisampleTest::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
226*8975f5c5SAndroid Build Coastguard Worker {
227*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() <= 3 && getClientMinorVersion() < 1 &&
228*8975f5c5SAndroid Build Coastguard Worker         EnsureGLExtensionEnabled("GL_ANGLE_texture_multisample"))
229*8975f5c5SAndroid Build Coastguard Worker     {
230*8975f5c5SAndroid Build Coastguard Worker         glGetMultisamplefvANGLE(pname, index, val);
231*8975f5c5SAndroid Build Coastguard Worker     }
232*8975f5c5SAndroid Build Coastguard Worker     else
233*8975f5c5SAndroid Build Coastguard Worker     {
234*8975f5c5SAndroid Build Coastguard Worker         glGetMultisamplefv(pname, index, val);
235*8975f5c5SAndroid Build Coastguard Worker     }
236*8975f5c5SAndroid Build Coastguard Worker }
237*8975f5c5SAndroid Build Coastguard Worker 
sampleMaski(GLuint maskNumber,GLbitfield mask)238*8975f5c5SAndroid Build Coastguard Worker void TextureMultisampleTest::sampleMaski(GLuint maskNumber, GLbitfield mask)
239*8975f5c5SAndroid Build Coastguard Worker {
240*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() <= 3 && getClientMinorVersion() < 1 &&
241*8975f5c5SAndroid Build Coastguard Worker         EnsureGLExtensionEnabled("GL_ANGLE_texture_multisample"))
242*8975f5c5SAndroid Build Coastguard Worker     {
243*8975f5c5SAndroid Build Coastguard Worker         glSampleMaskiANGLE(maskNumber, mask);
244*8975f5c5SAndroid Build Coastguard Worker     }
245*8975f5c5SAndroid Build Coastguard Worker     else
246*8975f5c5SAndroid Build Coastguard Worker     {
247*8975f5c5SAndroid Build Coastguard Worker         glSampleMaski(maskNumber, mask);
248*8975f5c5SAndroid Build Coastguard Worker     }
249*8975f5c5SAndroid Build Coastguard Worker }
250*8975f5c5SAndroid Build Coastguard Worker 
251*8975f5c5SAndroid Build Coastguard Worker // Tests that if es version < 3.1, GL_TEXTURE_2D_MULTISAMPLE is not supported in
252*8975f5c5SAndroid Build Coastguard Worker // GetInternalformativ. Checks that the number of samples returned is valid in case of ES >= 3.1.
TEST_P(TextureMultisampleTest,MultisampleTargetGetInternalFormativBase)253*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, MultisampleTargetGetInternalFormativBase)
254*8975f5c5SAndroid Build Coastguard Worker {
255*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
256*8975f5c5SAndroid Build Coastguard Worker 
257*8975f5c5SAndroid Build Coastguard Worker     // This query returns supported sample counts in descending order. If only one sample count is
258*8975f5c5SAndroid Build Coastguard Worker     // queried, it should be the maximum one.
259*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamplesR8 = 0;
260*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_R8, GL_SAMPLES, 1, &maxSamplesR8);
261*8975f5c5SAndroid Build Coastguard Worker 
262*8975f5c5SAndroid Build Coastguard Worker     // GLES 3.1 section 19.3.1 specifies the required minimum of how many samples are supported.
263*8975f5c5SAndroid Build Coastguard Worker     GLint maxColorTextureSamples;
264*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &maxColorTextureSamples);
265*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamples;
266*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
267*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamplesR8Required = std::min(maxColorTextureSamples, maxSamples);
268*8975f5c5SAndroid Build Coastguard Worker 
269*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GE(maxSamplesR8, maxSamplesR8Required);
270*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
271*8975f5c5SAndroid Build Coastguard Worker }
272*8975f5c5SAndroid Build Coastguard Worker 
273*8975f5c5SAndroid Build Coastguard Worker // Tests that if es version < 3.1 and multisample extension is unsupported,
274*8975f5c5SAndroid Build Coastguard Worker // GL_TEXTURE_2D_MULTISAMPLE_ANGLE is not supported in FramebufferTexture2D.
TEST_P(TextureMultisampleTest,MultisampleTargetFramebufferTexture2D)275*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, MultisampleTargetFramebufferTexture2D)
276*8975f5c5SAndroid Build Coastguard Worker {
277*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
278*8975f5c5SAndroid Build Coastguard Worker     GLint samples = 1;
279*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
280*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, 64, 64, GL_FALSE);
281*8975f5c5SAndroid Build Coastguard Worker 
282*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
283*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
284*8975f5c5SAndroid Build Coastguard Worker                            mTexture, 0);
285*8975f5c5SAndroid Build Coastguard Worker 
286*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
287*8975f5c5SAndroid Build Coastguard Worker }
288*8975f5c5SAndroid Build Coastguard Worker 
289*8975f5c5SAndroid Build Coastguard Worker // Tests basic functionality of glTexStorage2DMultisample.
TEST_P(TextureMultisampleTest,ValidateTextureStorageMultisampleParameters)290*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, ValidateTextureStorageMultisampleParameters)
291*8975f5c5SAndroid Build Coastguard Worker {
292*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
295*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 1, 1, GL_FALSE);
296*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
297*8975f5c5SAndroid Build Coastguard Worker 
298*8975f5c5SAndroid Build Coastguard Worker     GLint params = 0;
299*8975f5c5SAndroid Build Coastguard Worker     glGetTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_IMMUTABLE_FORMAT, &params);
300*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(1, params);
301*8975f5c5SAndroid Build Coastguard Worker 
302*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1, GL_FALSE);
303*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_ENUM);
304*8975f5c5SAndroid Build Coastguard Worker 
305*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 0, 0, GL_FALSE);
306*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_VALUE);
307*8975f5c5SAndroid Build Coastguard Worker 
308*8975f5c5SAndroid Build Coastguard Worker     GLint maxSize = 0;
309*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize);
310*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, maxSize + 1, 1, GL_FALSE);
311*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_VALUE);
312*8975f5c5SAndroid Build Coastguard Worker 
313*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamples = 0;
314*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_R8, GL_SAMPLES, 1, &maxSamples);
315*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, maxSamples + 1, GL_RGBA8, 1, 1, GL_FALSE);
316*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_OPERATION);
317*8975f5c5SAndroid Build Coastguard Worker 
318*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_RGBA8, 1, 1, GL_FALSE);
319*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_VALUE);
320*8975f5c5SAndroid Build Coastguard Worker 
321*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA, 0, 0, GL_FALSE);
322*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_VALUE);
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
325*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 1, 1, GL_FALSE);
326*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_OPERATION);
327*8975f5c5SAndroid Build Coastguard Worker }
328*8975f5c5SAndroid Build Coastguard Worker 
329*8975f5c5SAndroid Build Coastguard Worker // Tests the value of MAX_INTEGER_SAMPLES is no less than 1.
330*8975f5c5SAndroid Build Coastguard Worker // [OpenGL ES 3.1 SPEC Table 20.40]
TEST_P(TextureMultisampleTest,MaxIntegerSamples)331*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, MaxIntegerSamples)
332*8975f5c5SAndroid Build Coastguard Worker {
333*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
334*8975f5c5SAndroid Build Coastguard Worker 
335*8975f5c5SAndroid Build Coastguard Worker     // Fixed in recent mesa.  http://crbug.com/1071142
336*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsVulkan() && IsLinux() && (IsIntel() || IsAMD()));
337*8975f5c5SAndroid Build Coastguard Worker 
338*8975f5c5SAndroid Build Coastguard Worker     GLint maxIntegerSamples;
339*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &maxIntegerSamples);
340*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GE(maxIntegerSamples, 1);
341*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(std::numeric_limits<GLint>::max(), maxIntegerSamples);
342*8975f5c5SAndroid Build Coastguard Worker }
343*8975f5c5SAndroid Build Coastguard Worker 
344*8975f5c5SAndroid Build Coastguard Worker // Tests the value of MAX_COLOR_TEXTURE_SAMPLES is no less than 1.
345*8975f5c5SAndroid Build Coastguard Worker // [OpenGL ES 3.1 SPEC Table 20.40]
TEST_P(TextureMultisampleTest,MaxColorTextureSamples)346*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, MaxColorTextureSamples)
347*8975f5c5SAndroid Build Coastguard Worker {
348*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
349*8975f5c5SAndroid Build Coastguard Worker     GLint maxColorTextureSamples;
350*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &maxColorTextureSamples);
351*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GE(maxColorTextureSamples, 1);
352*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(std::numeric_limits<GLint>::max(), maxColorTextureSamples);
353*8975f5c5SAndroid Build Coastguard Worker }
354*8975f5c5SAndroid Build Coastguard Worker 
355*8975f5c5SAndroid Build Coastguard Worker // Tests the value of MAX_DEPTH_TEXTURE_SAMPLES is no less than 1.
356*8975f5c5SAndroid Build Coastguard Worker // [OpenGL ES 3.1 SPEC Table 20.40]
TEST_P(TextureMultisampleTest,MaxDepthTextureSamples)357*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, MaxDepthTextureSamples)
358*8975f5c5SAndroid Build Coastguard Worker {
359*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
360*8975f5c5SAndroid Build Coastguard Worker     GLint maxDepthTextureSamples;
361*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &maxDepthTextureSamples);
362*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GE(maxDepthTextureSamples, 1);
363*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(std::numeric_limits<GLint>::max(), maxDepthTextureSamples);
364*8975f5c5SAndroid Build Coastguard Worker }
365*8975f5c5SAndroid Build Coastguard Worker 
366*8975f5c5SAndroid Build Coastguard Worker // Tests the maximum value of MAX_INTEGER_SAMPLES is supported
TEST_P(TextureMultisampleTest,MaxIntegerSamplesValid)367*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, MaxIntegerSamplesValid)
368*8975f5c5SAndroid Build Coastguard Worker {
369*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
370*8975f5c5SAndroid Build Coastguard Worker 
371*8975f5c5SAndroid Build Coastguard Worker     // Fixed in recent mesa.  http://crbug.com/1071142
372*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsVulkan() && IsLinux() && (IsIntel() || IsAMD()));
373*8975f5c5SAndroid Build Coastguard Worker 
374*8975f5c5SAndroid Build Coastguard Worker     GLint maxIntegerSamples;
375*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &maxIntegerSamples);
376*8975f5c5SAndroid Build Coastguard Worker 
377*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
378*8975f5c5SAndroid Build Coastguard Worker 
379*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, maxIntegerSamples, GL_RGBA8I, 1, 1, GL_FALSE);
380*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
381*8975f5c5SAndroid Build Coastguard Worker }
382*8975f5c5SAndroid Build Coastguard Worker 
383*8975f5c5SAndroid Build Coastguard Worker // Tests the maximum value of MAX_COLOR_TEXTURE_SAMPLES is supported
TEST_P(TextureMultisampleTest,MaxColorTextureSamplesValid)384*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, MaxColorTextureSamplesValid)
385*8975f5c5SAndroid Build Coastguard Worker {
386*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
387*8975f5c5SAndroid Build Coastguard Worker     GLint maxColorTextureSamples;
388*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &maxColorTextureSamples);
389*8975f5c5SAndroid Build Coastguard Worker 
390*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
391*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, maxColorTextureSamples, GL_RGBA8, 1, 1,
392*8975f5c5SAndroid Build Coastguard Worker                           GL_FALSE);
393*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
394*8975f5c5SAndroid Build Coastguard Worker }
395*8975f5c5SAndroid Build Coastguard Worker 
396*8975f5c5SAndroid Build Coastguard Worker // Tests the maximum value of MAX_DEPTH_TEXTURE_SAMPLES is supported
TEST_P(TextureMultisampleTest,MaxDepthTextureSamplesValid)397*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, MaxDepthTextureSamplesValid)
398*8975f5c5SAndroid Build Coastguard Worker {
399*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
400*8975f5c5SAndroid Build Coastguard Worker     GLint maxDepthTextureSamples;
401*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &maxDepthTextureSamples);
402*8975f5c5SAndroid Build Coastguard Worker 
403*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
404*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, maxDepthTextureSamples, GL_DEPTH_COMPONENT16,
405*8975f5c5SAndroid Build Coastguard Worker                           1, 1, GL_FALSE);
406*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
407*8975f5c5SAndroid Build Coastguard Worker }
408*8975f5c5SAndroid Build Coastguard Worker 
409*8975f5c5SAndroid Build Coastguard Worker // Tests that multisample parameters are accepted by ES 3.1 or ES 3.0 and ANGLE_texture_multisample
TEST_P(TextureMultisampleTest,GetTexLevelParameter)410*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, GetTexLevelParameter)
411*8975f5c5SAndroid Build Coastguard Worker {
412*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
413*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_get_tex_level_parameter"));
414*8975f5c5SAndroid Build Coastguard Worker 
415*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
416*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, 1, 1, GL_TRUE);
417*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
418*8975f5c5SAndroid Build Coastguard Worker 
419*8975f5c5SAndroid Build Coastguard Worker     GLfloat levelSamples = 0;
420*8975f5c5SAndroid Build Coastguard Worker     glGetTexLevelParameterfvANGLE(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_TEXTURE_SAMPLES, &levelSamples);
421*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(levelSamples, 4);
422*8975f5c5SAndroid Build Coastguard Worker 
423*8975f5c5SAndroid Build Coastguard Worker     GLint fixedSampleLocation = false;
424*8975f5c5SAndroid Build Coastguard Worker     glGetTexLevelParameterivANGLE(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_TEXTURE_FIXED_SAMPLE_LOCATIONS,
425*8975f5c5SAndroid Build Coastguard Worker                                   &fixedSampleLocation);
426*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(fixedSampleLocation, 1);
427*8975f5c5SAndroid Build Coastguard Worker 
428*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
429*8975f5c5SAndroid Build Coastguard Worker }
430*8975f5c5SAndroid Build Coastguard Worker 
431*8975f5c5SAndroid Build Coastguard Worker // The value of sample position should be equal to standard pattern on non-OpenGL backends.
TEST_P(TextureMultisampleTest,CheckSamplePositions)432*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, CheckSamplePositions)
433*8975f5c5SAndroid Build Coastguard Worker {
434*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
435*8975f5c5SAndroid Build Coastguard Worker 
436*8975f5c5SAndroid Build Coastguard Worker     // OpenGL does not guarantee sample positions.
437*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGL());
438*8975f5c5SAndroid Build Coastguard Worker 
439*8975f5c5SAndroid Build Coastguard Worker     GLint numSampleCounts = 0;
440*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 1,
441*8975f5c5SAndroid Build Coastguard Worker                           &numSampleCounts);
442*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GT(numSampleCounts, 0);
443*8975f5c5SAndroid Build Coastguard Worker 
444*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLint> sampleCounts(numSampleCounts);
445*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_RGBA8, GL_SAMPLES, numSampleCounts,
446*8975f5c5SAndroid Build Coastguard Worker                           sampleCounts.data());
447*8975f5c5SAndroid Build Coastguard Worker 
448*8975f5c5SAndroid Build Coastguard Worker     GLfloat samplePosition[2];
449*8975f5c5SAndroid Build Coastguard Worker 
450*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
451*8975f5c5SAndroid Build Coastguard Worker 
452*8975f5c5SAndroid Build Coastguard Worker     for (const GLint sampleCount : sampleCounts)
453*8975f5c5SAndroid Build Coastguard Worker     {
454*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
455*8975f5c5SAndroid Build Coastguard Worker         size_t indexKey = static_cast<size_t>(ceil(log2(sampleCount)));
456*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
457*8975f5c5SAndroid Build Coastguard Worker         texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, sampleCount, GL_RGBA8, 1, 1, GL_TRUE);
458*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
459*8975f5c5SAndroid Build Coastguard Worker                                texture, 0);
460*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
461*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
462*8975f5c5SAndroid Build Coastguard Worker 
463*8975f5c5SAndroid Build Coastguard Worker         for (int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++)
464*8975f5c5SAndroid Build Coastguard Worker         {
465*8975f5c5SAndroid Build Coastguard Worker             getMultisamplefv(GL_SAMPLE_POSITION, sampleIndex, samplePosition);
466*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(samplePosition[0], kSamplePositions[indexKey][2 * sampleIndex]);
467*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(samplePosition[1], kSamplePositions[indexKey][2 * sampleIndex + 1]);
468*8975f5c5SAndroid Build Coastguard Worker         }
469*8975f5c5SAndroid Build Coastguard Worker     }
470*8975f5c5SAndroid Build Coastguard Worker 
471*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
472*8975f5c5SAndroid Build Coastguard Worker }
473*8975f5c5SAndroid Build Coastguard Worker 
474*8975f5c5SAndroid Build Coastguard Worker // Test textureSize and texelFetch when using ANGLE_texture_multisample extension
TEST_P(TextureMultisampleTest,SimpleTexelFetch)475*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, SimpleTexelFetch)
476*8975f5c5SAndroid Build Coastguard Worker {
477*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_texture_multisample"));
478*8975f5c5SAndroid Build Coastguard Worker 
479*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(texelFetchProgram, essl3_shaders::vs::Passthrough(),
480*8975f5c5SAndroid Build Coastguard Worker                      multisampleTextureFragmentShader());
481*8975f5c5SAndroid Build Coastguard Worker 
482*8975f5c5SAndroid Build Coastguard Worker     GLint texLocation = glGetUniformLocation(texelFetchProgram, "tex");
483*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(texLocation, 0);
484*8975f5c5SAndroid Build Coastguard Worker     GLint sampleNumLocation = glGetUniformLocation(texelFetchProgram, "sampleNum");
485*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(sampleNumLocation, 0);
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kWidth  = 4;
488*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kHeight = 4;
489*8975f5c5SAndroid Build Coastguard Worker 
490*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> testFormats = {GL_RGBA8};
491*8975f5c5SAndroid Build Coastguard Worker     GLint samplesToUse              = getSamplesToUse(GL_TEXTURE_2D_MULTISAMPLE_ANGLE, testFormats);
492*8975f5c5SAndroid Build Coastguard Worker 
493*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ANGLE, mTexture);
494*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE_ANGLE, samplesToUse, GL_RGBA8, kWidth, kHeight,
495*8975f5c5SAndroid Build Coastguard Worker                           GL_TRUE);
496*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
497*8975f5c5SAndroid Build Coastguard Worker 
498*8975f5c5SAndroid Build Coastguard Worker     // Clear texture zero to green.
499*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
500*8975f5c5SAndroid Build Coastguard Worker     GLColor clearColor = GLColor::green;
501*8975f5c5SAndroid Build Coastguard Worker 
502*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE_ANGLE,
503*8975f5c5SAndroid Build Coastguard Worker                            mTexture, 0);
504*8975f5c5SAndroid Build Coastguard Worker     GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
505*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
506*8975f5c5SAndroid Build Coastguard Worker     glClearColor(clearColor.R / 255.0f, clearColor.G / 255.0f, clearColor.B / 255.0f,
507*8975f5c5SAndroid Build Coastguard Worker                  clearColor.A / 255.0f);
508*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
509*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
510*8975f5c5SAndroid Build Coastguard Worker 
511*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
512*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(texelFetchProgram);
513*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
514*8975f5c5SAndroid Build Coastguard Worker 
515*8975f5c5SAndroid Build Coastguard Worker     for (GLint sampleNum = 0; sampleNum < samplesToUse; ++sampleNum)
516*8975f5c5SAndroid Build Coastguard Worker     {
517*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(sampleNumLocation, sampleNum);
518*8975f5c5SAndroid Build Coastguard Worker         drawQuad(texelFetchProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
519*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
520*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, clearColor);
521*8975f5c5SAndroid Build Coastguard Worker     }
522*8975f5c5SAndroid Build Coastguard Worker }
523*8975f5c5SAndroid Build Coastguard Worker 
524*8975f5c5SAndroid Build Coastguard Worker // Test toggling sample mask
TEST_P(TextureMultisampleTest,SampleMaskToggling)525*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, SampleMaskToggling)
526*8975f5c5SAndroid Build Coastguard Worker {
527*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
528*8975f5c5SAndroid Build Coastguard Worker 
529*8975f5c5SAndroid Build Coastguard Worker     GLboolean enabled = false;
530*8975f5c5SAndroid Build Coastguard Worker 
531*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(glIsEnabled(GL_SAMPLE_MASK));
532*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
533*8975f5c5SAndroid Build Coastguard Worker 
534*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SAMPLE_MASK);
535*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
536*8975f5c5SAndroid Build Coastguard Worker 
537*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(glIsEnabled(GL_SAMPLE_MASK));
538*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
539*8975f5c5SAndroid Build Coastguard Worker 
540*8975f5c5SAndroid Build Coastguard Worker     glGetBooleanv(GL_SAMPLE_MASK, &enabled);
541*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
542*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(enabled);
543*8975f5c5SAndroid Build Coastguard Worker 
544*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SAMPLE_MASK);
545*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
546*8975f5c5SAndroid Build Coastguard Worker 
547*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(glIsEnabled(GL_SAMPLE_MASK));
548*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
549*8975f5c5SAndroid Build Coastguard Worker 
550*8975f5c5SAndroid Build Coastguard Worker     glGetBooleanv(GL_SAMPLE_MASK, &enabled);
551*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
552*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(enabled);
553*8975f5c5SAndroid Build Coastguard Worker }
554*8975f5c5SAndroid Build Coastguard Worker 
555*8975f5c5SAndroid Build Coastguard Worker // Test setting and querying sample mask value
TEST_P(TextureMultisampleTest,SampleMaski)556*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, SampleMaski)
557*8975f5c5SAndroid Build Coastguard Worker {
558*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
559*8975f5c5SAndroid Build Coastguard Worker 
560*8975f5c5SAndroid Build Coastguard Worker     GLint maxSampleMaskWords = 0;
561*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &maxSampleMaskWords);
562*8975f5c5SAndroid Build Coastguard Worker     sampleMaski(maxSampleMaskWords - 1, 0x1);
563*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
564*8975f5c5SAndroid Build Coastguard Worker 
565*8975f5c5SAndroid Build Coastguard Worker     sampleMaski(maxSampleMaskWords, 0x1);
566*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_VALUE);
567*8975f5c5SAndroid Build Coastguard Worker 
568*8975f5c5SAndroid Build Coastguard Worker     GLint sampleMaskValue = 0;
569*8975f5c5SAndroid Build Coastguard Worker     glGetIntegeri_v(GL_SAMPLE_MASK_VALUE, 0, &sampleMaskValue);
570*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
571*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(sampleMaskValue, 0x1);
572*8975f5c5SAndroid Build Coastguard Worker }
573*8975f5c5SAndroid Build Coastguard Worker 
574*8975f5c5SAndroid Build Coastguard Worker // Test MS rendering with known per-sample values and a global sample mask
TEST_P(TextureMultisampleTest,MaskedDrawWithSampleID)575*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, MaskedDrawWithSampleID)
576*8975f5c5SAndroid Build Coastguard Worker {
577*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_texture_multisample"));
578*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_OES_sample_variables"));
579*8975f5c5SAndroid Build Coastguard Worker 
580*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(fetchProgram, essl3_shaders::vs::Passthrough(),
581*8975f5c5SAndroid Build Coastguard Worker                      multisampleTextureFragmentShader());
582*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(fetchProgram);
583*8975f5c5SAndroid Build Coastguard Worker     const GLint sampleLocation = glGetUniformLocation(fetchProgram, "sampleNum");
584*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(sampleLocation, 0);
585*8975f5c5SAndroid Build Coastguard Worker 
586*8975f5c5SAndroid Build Coastguard Worker     const char kFSDraw[] = R"(#version 300 es
587*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_sample_variables : require
588*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
589*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
590*8975f5c5SAndroid Build Coastguard Worker 
591*8975f5c5SAndroid Build Coastguard Worker void main() {
592*8975f5c5SAndroid Build Coastguard Worker     switch (gl_SampleID) {
593*8975f5c5SAndroid Build Coastguard Worker         case 0: color = vec4(1.0, 0.0, 0.0, 1.0); break;
594*8975f5c5SAndroid Build Coastguard Worker         case 1: color = vec4(0.0, 1.0, 0.0, 1.0); break;
595*8975f5c5SAndroid Build Coastguard Worker         case 2: color = vec4(0.0, 0.0, 1.0, 1.0); break;
596*8975f5c5SAndroid Build Coastguard Worker         case 3: color = vec4(1.0, 1.0, 1.0, 1.0); break;
597*8975f5c5SAndroid Build Coastguard Worker         default: color = vec4(0.0); break;
598*8975f5c5SAndroid Build Coastguard Worker     }
599*8975f5c5SAndroid Build Coastguard Worker })";
600*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawProgram, essl3_shaders::vs::Simple(), kFSDraw);
601*8975f5c5SAndroid Build Coastguard Worker 
602*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kSize    = 64;
603*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kSamples = 4;
604*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ANGLE, mTexture);
605*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE_ANGLE, kSamples, GL_RGBA8, kSize,
606*8975f5c5SAndroid Build Coastguard Worker                                    kSize, GL_TRUE);
607*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
608*8975f5c5SAndroid Build Coastguard Worker 
609*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
610*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
611*8975f5c5SAndroid Build Coastguard Worker                            GL_TEXTURE_2D_MULTISAMPLE_ANGLE, mTexture, 0);
612*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
613*8975f5c5SAndroid Build Coastguard Worker 
614*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SAMPLE_MASK);
615*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 1.0f, 1.0f);
616*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
617*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
618*8975f5c5SAndroid Build Coastguard Worker 
619*8975f5c5SAndroid Build Coastguard Worker     for (size_t mask = 0; mask < 16; ++mask)
620*8975f5c5SAndroid Build Coastguard Worker     {
621*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
622*8975f5c5SAndroid Build Coastguard Worker 
623*8975f5c5SAndroid Build Coastguard Worker         // Clear the MS texture to magenta with zero sample mask, it must not affect clear ops
624*8975f5c5SAndroid Build Coastguard Worker         glSampleMaskiANGLE(0, 0);
625*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
626*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
627*8975f5c5SAndroid Build Coastguard Worker 
628*8975f5c5SAndroid Build Coastguard Worker         // Draw to the MS texture with a sample mask
629*8975f5c5SAndroid Build Coastguard Worker         glSampleMaskiANGLE(0, mask);
630*8975f5c5SAndroid Build Coastguard Worker         drawQuad(drawProgram, essl3_shaders::PositionAttrib(), 0.0f);
631*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
632*8975f5c5SAndroid Build Coastguard Worker 
633*8975f5c5SAndroid Build Coastguard Worker         // Check all four samples
634*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
635*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(sampleLocation, 0);
636*8975f5c5SAndroid Build Coastguard Worker         drawQuad(fetchProgram, essl3_shaders::PositionAttrib(), 0.0f);
637*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, (mask & 1) ? GLColor::red : GLColor::magenta)
638*8975f5c5SAndroid Build Coastguard Worker             << "mask: " << mask;
639*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(sampleLocation, 1);
640*8975f5c5SAndroid Build Coastguard Worker         drawQuad(fetchProgram, essl3_shaders::PositionAttrib(), 0.0f);
641*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, (mask & 2) ? GLColor::green : GLColor::magenta)
642*8975f5c5SAndroid Build Coastguard Worker             << "mask: " << mask;
643*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(sampleLocation, 2);
644*8975f5c5SAndroid Build Coastguard Worker         drawQuad(fetchProgram, essl3_shaders::PositionAttrib(), 0.0f);
645*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, (mask & 4) ? GLColor::blue : GLColor::magenta)
646*8975f5c5SAndroid Build Coastguard Worker             << "mask: " << mask;
647*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(sampleLocation, 3);
648*8975f5c5SAndroid Build Coastguard Worker         drawQuad(fetchProgram, essl3_shaders::PositionAttrib(), 0.0f);
649*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, (mask & 8) ? GLColor::white : GLColor::magenta)
650*8975f5c5SAndroid Build Coastguard Worker             << "mask: " << mask;
651*8975f5c5SAndroid Build Coastguard Worker     }
652*8975f5c5SAndroid Build Coastguard Worker }
653*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(TextureMultisampleTest,ResolveToDefaultFramebuffer)654*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleTest, ResolveToDefaultFramebuffer)
655*8975f5c5SAndroid Build Coastguard Worker {
656*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(lessThanES31MultisampleExtNotSupported());
657*8975f5c5SAndroid Build Coastguard Worker 
658*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
659*8975f5c5SAndroid Build Coastguard Worker     texStorageMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, getWindowWidth(),
660*8975f5c5SAndroid Build Coastguard Worker                           getWindowHeight(), GL_TRUE);
661*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
662*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
663*8975f5c5SAndroid Build Coastguard Worker 
664*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
665*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
666*8975f5c5SAndroid Build Coastguard Worker                            mTexture, 0);
667*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
668*8975f5c5SAndroid Build Coastguard Worker 
669*8975f5c5SAndroid Build Coastguard Worker     // Clear the framebuffer
670*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.25, 0.5, 0.75, 0.25);
671*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
672*8975f5c5SAndroid Build Coastguard Worker 
673*8975f5c5SAndroid Build Coastguard Worker     // Resolve into default framebuffer
674*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
675*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
676*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
677*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
678*8975f5c5SAndroid Build Coastguard Worker                       getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
679*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
680*8975f5c5SAndroid Build Coastguard Worker 
681*8975f5c5SAndroid Build Coastguard Worker     const GLColor kResult = GLColor(63, 127, 191, 63);
682*8975f5c5SAndroid Build Coastguard Worker     const int w           = getWindowWidth() - 1;
683*8975f5c5SAndroid Build Coastguard Worker     const int h           = getWindowHeight() - 1;
684*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
685*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, kResult, 1);
686*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(w, 0, kResult, 1);
687*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, h, kResult, 1);
688*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(w, h, kResult, 1);
689*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(w / 2, h / 2, kResult, 1);
690*8975f5c5SAndroid Build Coastguard Worker }
691*8975f5c5SAndroid Build Coastguard Worker 
692*8975f5c5SAndroid Build Coastguard Worker // Negative tests of multisample texture. When context less than ES 3.1 and
693*8975f5c5SAndroid Build Coastguard Worker // ANGLE_texture_multisample not enabled, the feature isn't supported.
TEST_P(NegativeTextureMultisampleTest,Negative)694*8975f5c5SAndroid Build Coastguard Worker TEST_P(NegativeTextureMultisampleTest, Negative)
695*8975f5c5SAndroid Build Coastguard Worker {
696*8975f5c5SAndroid Build Coastguard Worker     // The extension must have been disabled in test init.
697*8975f5c5SAndroid Build Coastguard Worker     ASSERT_FALSE(IsGLExtensionEnabled("GL_ANGLE_texture_multisample"));
698*8975f5c5SAndroid Build Coastguard Worker 
699*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SAMPLE_MASK);
700*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
701*8975f5c5SAndroid Build Coastguard Worker 
702*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(glIsEnabled(GL_SAMPLE_MASK));
703*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
704*8975f5c5SAndroid Build Coastguard Worker 
705*8975f5c5SAndroid Build Coastguard Worker     GLboolean enabled = false;
706*8975f5c5SAndroid Build Coastguard Worker     glGetBooleanv(GL_SAMPLE_MASK, &enabled);
707*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
708*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(enabled);
709*8975f5c5SAndroid Build Coastguard Worker 
710*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SAMPLE_MASK);
711*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
712*8975f5c5SAndroid Build Coastguard Worker 
713*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamples = 0;
714*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_R8, GL_SAMPLES, 1, &maxSamples);
715*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
716*8975f5c5SAndroid Build Coastguard Worker 
717*8975f5c5SAndroid Build Coastguard Worker     GLint maxColorTextureSamples;
718*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &maxColorTextureSamples);
719*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
720*8975f5c5SAndroid Build Coastguard Worker 
721*8975f5c5SAndroid Build Coastguard Worker     GLint maxDepthTextureSamples;
722*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &maxDepthTextureSamples);
723*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
724*8975f5c5SAndroid Build Coastguard Worker 
725*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
726*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
727*8975f5c5SAndroid Build Coastguard Worker 
728*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisampleANGLE(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, 64, 64, GL_FALSE);
729*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
730*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, 64, 64, GL_FALSE);
731*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
732*8975f5c5SAndroid Build Coastguard Worker 
733*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
734*8975f5c5SAndroid Build Coastguard Worker                            mTexture, 0);
735*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
736*8975f5c5SAndroid Build Coastguard Worker 
737*8975f5c5SAndroid Build Coastguard Worker     GLint params = 0;
738*8975f5c5SAndroid Build Coastguard Worker     glGetTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_IMMUTABLE_FORMAT, &params);
739*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
740*8975f5c5SAndroid Build Coastguard Worker 
741*8975f5c5SAndroid Build Coastguard Worker     if (EnsureGLExtensionEnabled("GL_ANGLE_get_tex_level_parameter"))
742*8975f5c5SAndroid Build Coastguard Worker     {
743*8975f5c5SAndroid Build Coastguard Worker         GLfloat levelSamples = 0;
744*8975f5c5SAndroid Build Coastguard Worker         glGetTexLevelParameterfvANGLE(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_TEXTURE_SAMPLES,
745*8975f5c5SAndroid Build Coastguard Worker                                       &levelSamples);
746*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
747*8975f5c5SAndroid Build Coastguard Worker 
748*8975f5c5SAndroid Build Coastguard Worker         GLint fixedSampleLocation = false;
749*8975f5c5SAndroid Build Coastguard Worker         glGetTexLevelParameterivANGLE(GL_TEXTURE_2D_MULTISAMPLE, 0,
750*8975f5c5SAndroid Build Coastguard Worker                                       GL_TEXTURE_FIXED_SAMPLE_LOCATIONS, &fixedSampleLocation);
751*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
752*8975f5c5SAndroid Build Coastguard Worker     }
753*8975f5c5SAndroid Build Coastguard Worker 
754*8975f5c5SAndroid Build Coastguard Worker     GLfloat samplePosition[2];
755*8975f5c5SAndroid Build Coastguard Worker     glGetMultisamplefvANGLE(GL_SAMPLE_POSITION, 0, samplePosition);
756*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
757*8975f5c5SAndroid Build Coastguard Worker     glGetMultisamplefv(GL_SAMPLE_POSITION, 0, samplePosition);
758*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
759*8975f5c5SAndroid Build Coastguard Worker 
760*8975f5c5SAndroid Build Coastguard Worker     GLint maxSampleMaskWords = 0;
761*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &maxSampleMaskWords);
762*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
763*8975f5c5SAndroid Build Coastguard Worker     glSampleMaskiANGLE(maxSampleMaskWords - 1, 0x1);
764*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
765*8975f5c5SAndroid Build Coastguard Worker     glSampleMaski(maxSampleMaskWords - 1, 0x1);
766*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
767*8975f5c5SAndroid Build Coastguard Worker 
768*8975f5c5SAndroid Build Coastguard Worker     GLint sampleMaskValue = 0;
769*8975f5c5SAndroid Build Coastguard Worker     glGetIntegeri_v(GL_SAMPLE_MASK_VALUE, 0, &sampleMaskValue);
770*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
771*8975f5c5SAndroid Build Coastguard Worker }
772*8975f5c5SAndroid Build Coastguard Worker 
773*8975f5c5SAndroid Build Coastguard Worker // Tests GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY query when the extension is not enabled.
TEST_P(TextureMultisampleArrayTest,MultisampleArrayTargetGetIntegerWithoutExtension)774*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, MultisampleArrayTargetGetIntegerWithoutExtension)
775*8975f5c5SAndroid Build Coastguard Worker {
776*8975f5c5SAndroid Build Coastguard Worker     ASSERT(!IsGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array"));
777*8975f5c5SAndroid Build Coastguard Worker 
778*8975f5c5SAndroid Build Coastguard Worker     GLint binding = -1;
779*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY, &binding);
780*8975f5c5SAndroid Build Coastguard Worker     if (areMultisampleArraysAlwaysAvailable())
781*8975f5c5SAndroid Build Coastguard Worker     {
782*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
783*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(binding, 0);
784*8975f5c5SAndroid Build Coastguard Worker     }
785*8975f5c5SAndroid Build Coastguard Worker     else
786*8975f5c5SAndroid Build Coastguard Worker     {
787*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
788*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(binding, -1);
789*8975f5c5SAndroid Build Coastguard Worker     }
790*8975f5c5SAndroid Build Coastguard Worker }
791*8975f5c5SAndroid Build Coastguard Worker 
792*8975f5c5SAndroid Build Coastguard Worker // Tests GL_TEXTURE_2D_MULTISAMPLE_ARRAY target with GetInternalformativ when the
793*8975f5c5SAndroid Build Coastguard Worker // extension is not enabled.
TEST_P(TextureMultisampleArrayTest,MultisampleArrayTargetGetInternalFormativWithoutExtension)794*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, MultisampleArrayTargetGetInternalFormativWithoutExtension)
795*8975f5c5SAndroid Build Coastguard Worker {
796*8975f5c5SAndroid Build Coastguard Worker     ASSERT(!IsGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array"));
797*8975f5c5SAndroid Build Coastguard Worker 
798*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamples = -1;
799*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_RGBA8, GL_SAMPLES, 1, &maxSamples);
800*8975f5c5SAndroid Build Coastguard Worker     if (areMultisampleArraysAlwaysAvailable())
801*8975f5c5SAndroid Build Coastguard Worker     {
802*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
803*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GT(maxSamples, 0);
804*8975f5c5SAndroid Build Coastguard Worker     }
805*8975f5c5SAndroid Build Coastguard Worker     else
806*8975f5c5SAndroid Build Coastguard Worker     {
807*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
808*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(maxSamples, -1);
809*8975f5c5SAndroid Build Coastguard Worker     }
810*8975f5c5SAndroid Build Coastguard Worker }
811*8975f5c5SAndroid Build Coastguard Worker 
812*8975f5c5SAndroid Build Coastguard Worker // Attempt to bind a texture to multisample array binding point when extension is not enabled.
TEST_P(TextureMultisampleArrayTest,BindMultisampleArrayTextureWithoutExtension)813*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, BindMultisampleArrayTextureWithoutExtension)
814*8975f5c5SAndroid Build Coastguard Worker {
815*8975f5c5SAndroid Build Coastguard Worker     ASSERT(!IsGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array"));
816*8975f5c5SAndroid Build Coastguard Worker 
817*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, mTexture);
818*8975f5c5SAndroid Build Coastguard Worker     if (areMultisampleArraysAlwaysAvailable())
819*8975f5c5SAndroid Build Coastguard Worker     {
820*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
821*8975f5c5SAndroid Build Coastguard Worker     }
822*8975f5c5SAndroid Build Coastguard Worker     else
823*8975f5c5SAndroid Build Coastguard Worker     {
824*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
825*8975f5c5SAndroid Build Coastguard Worker     }
826*8975f5c5SAndroid Build Coastguard Worker }
827*8975f5c5SAndroid Build Coastguard Worker 
828*8975f5c5SAndroid Build Coastguard Worker // Try to compile shaders using GL_OES_texture_storage_multisample_2d_array when the extension is
829*8975f5c5SAndroid Build Coastguard Worker // not enabled.
TEST_P(TextureMultisampleArrayTest,ShaderWithoutExtension)830*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, ShaderWithoutExtension)
831*8975f5c5SAndroid Build Coastguard Worker {
832*8975f5c5SAndroid Build Coastguard Worker     ASSERT(!IsGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array"));
833*8975f5c5SAndroid Build Coastguard Worker 
834*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFSRequiresExtension[] = R"(#version 310 es
835*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_texture_storage_multisample_2d_array : require
836*8975f5c5SAndroid Build Coastguard Worker out highp vec4 my_FragColor;
837*8975f5c5SAndroid Build Coastguard Worker 
838*8975f5c5SAndroid Build Coastguard Worker void main() {
839*8975f5c5SAndroid Build Coastguard Worker         my_FragColor = vec4(0.0);
840*8975f5c5SAndroid Build Coastguard Worker })";
841*8975f5c5SAndroid Build Coastguard Worker 
842*8975f5c5SAndroid Build Coastguard Worker     GLuint program = CompileProgram(essl31_shaders::vs::Simple(), kFSRequiresExtension);
843*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(0u, program);
844*8975f5c5SAndroid Build Coastguard Worker 
845*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFSEnableAndUseExtension[] = R"(#version 310 es
846*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_texture_storage_multisample_2d_array : enable
847*8975f5c5SAndroid Build Coastguard Worker 
848*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2DMSArray tex;
849*8975f5c5SAndroid Build Coastguard Worker out highp ivec4 outSize;
850*8975f5c5SAndroid Build Coastguard Worker 
851*8975f5c5SAndroid Build Coastguard Worker void main() {
852*8975f5c5SAndroid Build Coastguard Worker         outSize = ivec4(textureSize(tex), 0);
853*8975f5c5SAndroid Build Coastguard Worker })";
854*8975f5c5SAndroid Build Coastguard Worker 
855*8975f5c5SAndroid Build Coastguard Worker     program = CompileProgram(essl31_shaders::vs::Simple(), kFSEnableAndUseExtension);
856*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(0u, program);
857*8975f5c5SAndroid Build Coastguard Worker }
858*8975f5c5SAndroid Build Coastguard Worker 
859*8975f5c5SAndroid Build Coastguard Worker // Tests that GL_TEXTURE_2D_MULTISAMPLE_ARRAY is supported in GetInternalformativ.
TEST_P(TextureMultisampleArrayTest,MultisampleArrayTargetGetInternalFormativ)860*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, MultisampleArrayTargetGetInternalFormativ)
861*8975f5c5SAndroid Build Coastguard Worker {
862*8975f5c5SAndroid Build Coastguard Worker     if (!areMultisampleArraysAlwaysAvailable())
863*8975f5c5SAndroid Build Coastguard Worker     {
864*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!requestArrayExtension());
865*8975f5c5SAndroid Build Coastguard Worker     }
866*8975f5c5SAndroid Build Coastguard Worker 
867*8975f5c5SAndroid Build Coastguard Worker     // This query returns supported sample counts in descending order. If only one sample count is
868*8975f5c5SAndroid Build Coastguard Worker     // queried, it should be the maximum one.
869*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamplesRGBA8 = 0;
870*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_RGBA8, GL_SAMPLES, 1,
871*8975f5c5SAndroid Build Coastguard Worker                           &maxSamplesRGBA8);
872*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamplesDepth = 0;
873*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_DEPTH_COMPONENT24, GL_SAMPLES, 1,
874*8975f5c5SAndroid Build Coastguard Worker                           &maxSamplesDepth);
875*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
876*8975f5c5SAndroid Build Coastguard Worker 
877*8975f5c5SAndroid Build Coastguard Worker     // GLES 3.1 section 19.3.1 specifies the required minimum of how many samples are supported.
878*8975f5c5SAndroid Build Coastguard Worker     GLint maxColorTextureSamples;
879*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &maxColorTextureSamples);
880*8975f5c5SAndroid Build Coastguard Worker     GLint maxDepthTextureSamples;
881*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &maxDepthTextureSamples);
882*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamples;
883*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
884*8975f5c5SAndroid Build Coastguard Worker 
885*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamplesRGBA8Required = std::min(maxColorTextureSamples, maxSamples);
886*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GE(maxSamplesRGBA8, maxSamplesRGBA8Required);
887*8975f5c5SAndroid Build Coastguard Worker 
888*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamplesDepthRequired = std::min(maxDepthTextureSamples, maxSamples);
889*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GE(maxSamplesDepth, maxSamplesDepthRequired);
890*8975f5c5SAndroid Build Coastguard Worker }
891*8975f5c5SAndroid Build Coastguard Worker 
892*8975f5c5SAndroid Build Coastguard Worker // Tests that TexImage3D call cannot be used for GL_TEXTURE_2D_MULTISAMPLE_ARRAY.
TEST_P(TextureMultisampleArrayTest,MultiSampleArrayTexImage)893*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, MultiSampleArrayTexImage)
894*8975f5c5SAndroid Build Coastguard Worker {
895*8975f5c5SAndroid Build Coastguard Worker     if (!areMultisampleArraysAlwaysAvailable())
896*8975f5c5SAndroid Build Coastguard Worker     {
897*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!requestArrayExtension());
898*8975f5c5SAndroid Build Coastguard Worker     }
899*8975f5c5SAndroid Build Coastguard Worker 
900*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
901*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
902*8975f5c5SAndroid Build Coastguard Worker 
903*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_RGBA8, 1, 1, 1, 0, GL_RGBA,
904*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
905*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
906*8975f5c5SAndroid Build Coastguard Worker }
907*8975f5c5SAndroid Build Coastguard Worker 
908*8975f5c5SAndroid Build Coastguard Worker // Tests passing invalid parameters to TexStorage3DMultisample.
TEST_P(TextureMultisampleArrayTest,InvalidTexStorage3DMultisample)909*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, InvalidTexStorage3DMultisample)
910*8975f5c5SAndroid Build Coastguard Worker {
911*8975f5c5SAndroid Build Coastguard Worker     if (!areMultisampleArraysAlwaysAvailable())
912*8975f5c5SAndroid Build Coastguard Worker     {
913*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!requestArrayExtension());
914*8975f5c5SAndroid Build Coastguard Worker     }
915*8975f5c5SAndroid Build Coastguard Worker 
916*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
917*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
918*8975f5c5SAndroid Build Coastguard Worker 
919*8975f5c5SAndroid Build Coastguard Worker     // Invalid target
920*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2, GL_RGBA8, 1, 1, 1, GL_TRUE);
921*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
922*8975f5c5SAndroid Build Coastguard Worker 
923*8975f5c5SAndroid Build Coastguard Worker     // Samples 0
924*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_RGBA8, 1, 1, 1, GL_TRUE);
925*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
926*8975f5c5SAndroid Build Coastguard Worker 
927*8975f5c5SAndroid Build Coastguard Worker     // Unsized internalformat
928*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA, 1, 1, 1, GL_TRUE);
929*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
930*8975f5c5SAndroid Build Coastguard Worker 
931*8975f5c5SAndroid Build Coastguard Worker     // Width 0
932*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, 0, 1, 1, GL_TRUE);
933*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
934*8975f5c5SAndroid Build Coastguard Worker 
935*8975f5c5SAndroid Build Coastguard Worker     // Height 0
936*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, 1, 0, 1, GL_TRUE);
937*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
938*8975f5c5SAndroid Build Coastguard Worker 
939*8975f5c5SAndroid Build Coastguard Worker     // Depth 0
940*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, 1, 1, 0, GL_TRUE);
941*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
942*8975f5c5SAndroid Build Coastguard Worker }
943*8975f5c5SAndroid Build Coastguard Worker 
944*8975f5c5SAndroid Build Coastguard Worker // Tests passing invalid parameters to TexParameteri.
TEST_P(TextureMultisampleArrayTest,InvalidTexParameteri)945*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, InvalidTexParameteri)
946*8975f5c5SAndroid Build Coastguard Worker {
947*8975f5c5SAndroid Build Coastguard Worker     if (!areMultisampleArraysAlwaysAvailable())
948*8975f5c5SAndroid Build Coastguard Worker     {
949*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!requestArrayExtension());
950*8975f5c5SAndroid Build Coastguard Worker     }
951*8975f5c5SAndroid Build Coastguard Worker 
952*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
953*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
954*8975f5c5SAndroid Build Coastguard Worker 
955*8975f5c5SAndroid Build Coastguard Worker     // None of the sampler parameters can be set on GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES.
956*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
957*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
958*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
959*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
960*8975f5c5SAndroid Build Coastguard Worker 
961*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
962*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
963*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
964*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
965*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
966*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
967*8975f5c5SAndroid Build Coastguard Worker 
968*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_MIN_LOD, 0);
969*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
970*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_MAX_LOD, 0);
971*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
972*8975f5c5SAndroid Build Coastguard Worker 
973*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_COMPARE_MODE, GL_NONE);
974*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
975*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_COMPARE_FUNC, GL_ALWAYS);
976*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
977*8975f5c5SAndroid Build Coastguard Worker 
978*8975f5c5SAndroid Build Coastguard Worker     // Only valid base level on GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES is 0.
979*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_TEXTURE_BASE_LEVEL, 1);
980*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
981*8975f5c5SAndroid Build Coastguard Worker }
982*8975f5c5SAndroid Build Coastguard Worker 
983*8975f5c5SAndroid Build Coastguard Worker // Test a valid TexStorage3DMultisample call and check that the queried texture level parameters
984*8975f5c5SAndroid Build Coastguard Worker // match. Does not do any drawing.
TEST_P(TextureMultisampleArrayTest,TexStorage3DMultisample)985*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, TexStorage3DMultisample)
986*8975f5c5SAndroid Build Coastguard Worker {
987*8975f5c5SAndroid Build Coastguard Worker     if (!areMultisampleArraysAlwaysAvailable())
988*8975f5c5SAndroid Build Coastguard Worker     {
989*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!requestArrayExtension());
990*8975f5c5SAndroid Build Coastguard Worker     }
991*8975f5c5SAndroid Build Coastguard Worker 
992*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamplesRGBA8 = 0;
993*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_RGBA8, GL_SAMPLES, 1,
994*8975f5c5SAndroid Build Coastguard Worker                           &maxSamplesRGBA8);
995*8975f5c5SAndroid Build Coastguard Worker 
996*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
997*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
998*8975f5c5SAndroid Build Coastguard Worker 
999*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, maxSamplesRGBA8, GL_RGBA8, 8, 4, 2,
1000*8975f5c5SAndroid Build Coastguard Worker                             GL_TRUE);
1001*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1002*8975f5c5SAndroid Build Coastguard Worker 
1003*8975f5c5SAndroid Build Coastguard Worker     GLint width = 0, height = 0, depth = 0, samples = 0;
1004*8975f5c5SAndroid Build Coastguard Worker     glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_TEXTURE_WIDTH, &width);
1005*8975f5c5SAndroid Build Coastguard Worker     glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_TEXTURE_HEIGHT, &height);
1006*8975f5c5SAndroid Build Coastguard Worker     glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_TEXTURE_DEPTH, &depth);
1007*8975f5c5SAndroid Build Coastguard Worker     glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_TEXTURE_SAMPLES, &samples);
1008*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1009*8975f5c5SAndroid Build Coastguard Worker 
1010*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(8, width);
1011*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(4, height);
1012*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(2, depth);
1013*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(maxSamplesRGBA8, samples);
1014*8975f5c5SAndroid Build Coastguard Worker }
1015*8975f5c5SAndroid Build Coastguard Worker 
1016*8975f5c5SAndroid Build Coastguard Worker // Test for invalid FramebufferTextureLayer calls with GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES
1017*8975f5c5SAndroid Build Coastguard Worker // textures.
TEST_P(TextureMultisampleArrayTest,InvalidFramebufferTextureLayer)1018*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, InvalidFramebufferTextureLayer)
1019*8975f5c5SAndroid Build Coastguard Worker {
1020*8975f5c5SAndroid Build Coastguard Worker     if (!areMultisampleArraysAlwaysAvailable())
1021*8975f5c5SAndroid Build Coastguard Worker     {
1022*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!requestArrayExtension());
1023*8975f5c5SAndroid Build Coastguard Worker     }
1024*8975f5c5SAndroid Build Coastguard Worker 
1025*8975f5c5SAndroid Build Coastguard Worker     GLint maxSamplesRGBA8 = 0;
1026*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, GL_RGBA8, GL_SAMPLES, 1,
1027*8975f5c5SAndroid Build Coastguard Worker                           &maxSamplesRGBA8);
1028*8975f5c5SAndroid Build Coastguard Worker 
1029*8975f5c5SAndroid Build Coastguard Worker     GLint maxArrayTextureLayers;
1030*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxArrayTextureLayers);
1031*8975f5c5SAndroid Build Coastguard Worker 
1032*8975f5c5SAndroid Build Coastguard Worker     // Test framebuffer status with just a color texture attached.
1033*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
1034*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, maxSamplesRGBA8, GL_RGBA8, 4, 4, 2,
1035*8975f5c5SAndroid Build Coastguard Worker                             GL_TRUE);
1036*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1037*8975f5c5SAndroid Build Coastguard Worker 
1038*8975f5c5SAndroid Build Coastguard Worker     // Test with mip level 1 and -1 (only level 0 is valid for multisample textures).
1039*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
1040*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 1, 0);
1041*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
1042*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, -1, 0);
1043*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
1044*8975f5c5SAndroid Build Coastguard Worker 
1045*8975f5c5SAndroid Build Coastguard Worker     // Test with layer -1 and layer == MAX_ARRAY_TEXTURE_LAYERS
1046*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
1047*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0, -1);
1048*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
1049*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0,
1050*8975f5c5SAndroid Build Coastguard Worker                               maxArrayTextureLayers);
1051*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
1052*8975f5c5SAndroid Build Coastguard Worker }
1053*8975f5c5SAndroid Build Coastguard Worker 
1054*8975f5c5SAndroid Build Coastguard Worker // Attach layers of TEXTURE_2D_MULTISAMPLE_ARRAY textures to a framebuffer and check for
1055*8975f5c5SAndroid Build Coastguard Worker // completeness.
TEST_P(TextureMultisampleArrayTest,FramebufferCompleteness)1056*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, FramebufferCompleteness)
1057*8975f5c5SAndroid Build Coastguard Worker {
1058*8975f5c5SAndroid Build Coastguard Worker     if (!areMultisampleArraysAlwaysAvailable())
1059*8975f5c5SAndroid Build Coastguard Worker     {
1060*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!requestArrayExtension());
1061*8975f5c5SAndroid Build Coastguard Worker     }
1062*8975f5c5SAndroid Build Coastguard Worker 
1063*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> testFormats = {{GL_RGBA8, GL_DEPTH_COMPONENT24, GL_DEPTH24_STENCIL8}};
1064*8975f5c5SAndroid Build Coastguard Worker     GLint samplesToUse = getSamplesToUse(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, testFormats);
1065*8975f5c5SAndroid Build Coastguard Worker 
1066*8975f5c5SAndroid Build Coastguard Worker     // Test framebuffer status with just a color texture attached.
1067*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
1068*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samplesToUse, GL_RGBA8, 4, 4, 2,
1069*8975f5c5SAndroid Build Coastguard Worker                             GL_TRUE);
1070*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1071*8975f5c5SAndroid Build Coastguard Worker 
1072*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
1073*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0, 0);
1074*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1075*8975f5c5SAndroid Build Coastguard Worker 
1076*8975f5c5SAndroid Build Coastguard Worker     GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
1077*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
1078*8975f5c5SAndroid Build Coastguard Worker 
1079*8975f5c5SAndroid Build Coastguard Worker     // Test framebuffer status with both color and depth textures attached.
1080*8975f5c5SAndroid Build Coastguard Worker     GLTexture depthTexture;
1081*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, depthTexture);
1082*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samplesToUse, GL_DEPTH_COMPONENT24,
1083*8975f5c5SAndroid Build Coastguard Worker                             4, 4, 2, GL_TRUE);
1084*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1085*8975f5c5SAndroid Build Coastguard Worker 
1086*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0, 0);
1087*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1088*8975f5c5SAndroid Build Coastguard Worker 
1089*8975f5c5SAndroid Build Coastguard Worker     status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
1090*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
1091*8975f5c5SAndroid Build Coastguard Worker 
1092*8975f5c5SAndroid Build Coastguard Worker     // Test with color and depth/stencil textures attached.
1093*8975f5c5SAndroid Build Coastguard Worker     GLTexture depthStencilTexture;
1094*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, depthStencilTexture);
1095*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samplesToUse, GL_DEPTH24_STENCIL8,
1096*8975f5c5SAndroid Build Coastguard Worker                             4, 4, 2, GL_TRUE);
1097*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1098*8975f5c5SAndroid Build Coastguard Worker 
1099*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, depthStencilTexture, 0,
1100*8975f5c5SAndroid Build Coastguard Worker                               0);
1101*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1102*8975f5c5SAndroid Build Coastguard Worker 
1103*8975f5c5SAndroid Build Coastguard Worker     status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
1104*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
1105*8975f5c5SAndroid Build Coastguard Worker }
1106*8975f5c5SAndroid Build Coastguard Worker 
1107*8975f5c5SAndroid Build Coastguard Worker // Attach a layer of TEXTURE_2D_MULTISAMPLE_ARRAY texture to a framebuffer, clear it, and resolve by
1108*8975f5c5SAndroid Build Coastguard Worker // blitting.
TEST_P(TextureMultisampleArrayTest,FramebufferColorClearAndBlit)1109*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, FramebufferColorClearAndBlit)
1110*8975f5c5SAndroid Build Coastguard Worker {
1111*8975f5c5SAndroid Build Coastguard Worker     if (!areMultisampleArraysAlwaysAvailable())
1112*8975f5c5SAndroid Build Coastguard Worker     {
1113*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!requestArrayExtension());
1114*8975f5c5SAndroid Build Coastguard Worker     }
1115*8975f5c5SAndroid Build Coastguard Worker 
1116*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kWidth  = 4;
1117*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kHeight = 4;
1118*8975f5c5SAndroid Build Coastguard Worker 
1119*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> testFormats = {GL_RGBA8};
1120*8975f5c5SAndroid Build Coastguard Worker     GLint samplesToUse = getSamplesToUse(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, testFormats);
1121*8975f5c5SAndroid Build Coastguard Worker 
1122*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
1123*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samplesToUse, GL_RGBA8, kWidth,
1124*8975f5c5SAndroid Build Coastguard Worker                             kHeight, 2, GL_TRUE);
1125*8975f5c5SAndroid Build Coastguard Worker 
1126*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
1127*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0, 0);
1128*8975f5c5SAndroid Build Coastguard Worker 
1129*8975f5c5SAndroid Build Coastguard Worker     GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
1130*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1131*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
1132*8975f5c5SAndroid Build Coastguard Worker 
1133*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1134*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1135*8975f5c5SAndroid Build Coastguard Worker 
1136*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFramebuffer;
1137*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
1138*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
1139*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight);
1140*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFramebuffer);
1141*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture,
1142*8975f5c5SAndroid Build Coastguard Worker                            0);
1143*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
1144*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
1145*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1146*8975f5c5SAndroid Build Coastguard Worker 
1147*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFramebuffer);
1148*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
1149*8975f5c5SAndroid Build Coastguard Worker }
1150*8975f5c5SAndroid Build Coastguard Worker 
1151*8975f5c5SAndroid Build Coastguard Worker // Check the size of a multisample array texture in a shader.
TEST_P(TextureMultisampleArrayTest,TextureSizeInShader)1152*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, TextureSizeInShader)
1153*8975f5c5SAndroid Build Coastguard Worker {
1154*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!requestArrayExtension());
1155*8975f5c5SAndroid Build Coastguard Worker 
1156*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 310 es
1157*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_texture_storage_multisample_2d_array : require
1158*8975f5c5SAndroid Build Coastguard Worker 
1159*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2DMSArray tex;
1160*8975f5c5SAndroid Build Coastguard Worker out highp vec4 my_FragColor;
1161*8975f5c5SAndroid Build Coastguard Worker 
1162*8975f5c5SAndroid Build Coastguard Worker void main() {
1163*8975f5c5SAndroid Build Coastguard Worker         my_FragColor = (textureSize(tex) == ivec3(8, 4, 2)) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
1164*8975f5c5SAndroid Build Coastguard Worker })";
1165*8975f5c5SAndroid Build Coastguard Worker 
1166*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(texSizeProgram, essl31_shaders::vs::Simple(), kFS);
1167*8975f5c5SAndroid Build Coastguard Worker 
1168*8975f5c5SAndroid Build Coastguard Worker     GLint texLocation = glGetUniformLocation(texSizeProgram, "tex");
1169*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(texLocation, 0);
1170*8975f5c5SAndroid Build Coastguard Worker 
1171*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kWidth  = 8;
1172*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kHeight = 4;
1173*8975f5c5SAndroid Build Coastguard Worker 
1174*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> testFormats = {GL_RGBA8};
1175*8975f5c5SAndroid Build Coastguard Worker     GLint samplesToUse = getSamplesToUse(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, testFormats);
1176*8975f5c5SAndroid Build Coastguard Worker 
1177*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
1178*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samplesToUse, GL_RGBA8, kWidth,
1179*8975f5c5SAndroid Build Coastguard Worker                             kHeight, 2, GL_TRUE);
1180*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1181*8975f5c5SAndroid Build Coastguard Worker 
1182*8975f5c5SAndroid Build Coastguard Worker     drawQuad(texSizeProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
1183*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1184*8975f5c5SAndroid Build Coastguard Worker 
1185*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1186*8975f5c5SAndroid Build Coastguard Worker }
1187*8975f5c5SAndroid Build Coastguard Worker 
1188*8975f5c5SAndroid Build Coastguard Worker // Clear the layers of a multisample array texture, and then sample all the samples from all the
1189*8975f5c5SAndroid Build Coastguard Worker // layers in a shader.
TEST_P(TextureMultisampleArrayTest,SimpleTexelFetch)1190*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, SimpleTexelFetch)
1191*8975f5c5SAndroid Build Coastguard Worker {
1192*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!requestArrayExtension());
1193*8975f5c5SAndroid Build Coastguard Worker 
1194*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(texelFetchProgram, essl31_shaders::vs::Passthrough(),
1195*8975f5c5SAndroid Build Coastguard Worker                      blitArrayTextureLayerFragmentShader());
1196*8975f5c5SAndroid Build Coastguard Worker 
1197*8975f5c5SAndroid Build Coastguard Worker     GLint texLocation = glGetUniformLocation(texelFetchProgram, "tex");
1198*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(texLocation, 0);
1199*8975f5c5SAndroid Build Coastguard Worker     GLint layerLocation = glGetUniformLocation(texelFetchProgram, "layer");
1200*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(layerLocation, 0);
1201*8975f5c5SAndroid Build Coastguard Worker     GLint sampleNumLocation = glGetUniformLocation(texelFetchProgram, "sampleNum");
1202*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(layerLocation, 0);
1203*8975f5c5SAndroid Build Coastguard Worker 
1204*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kWidth      = 4;
1205*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kHeight     = 4;
1206*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kLayerCount = 2;
1207*8975f5c5SAndroid Build Coastguard Worker 
1208*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> testFormats = {GL_RGBA8};
1209*8975f5c5SAndroid Build Coastguard Worker     GLint samplesToUse = getSamplesToUse(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, testFormats);
1210*8975f5c5SAndroid Build Coastguard Worker 
1211*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
1212*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samplesToUse, GL_RGBA8, kWidth,
1213*8975f5c5SAndroid Build Coastguard Worker                             kHeight, kLayerCount, GL_TRUE);
1214*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1215*8975f5c5SAndroid Build Coastguard Worker 
1216*8975f5c5SAndroid Build Coastguard Worker     // Clear layer zero to green and layer one to blue.
1217*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
1218*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> clearColors = {{GLColor::green, GLColor::blue}};
1219*8975f5c5SAndroid Build Coastguard Worker     for (GLint i = 0; static_cast<GLsizei>(i) < kLayerCount; ++i)
1220*8975f5c5SAndroid Build Coastguard Worker     {
1221*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0, i);
1222*8975f5c5SAndroid Build Coastguard Worker         GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
1223*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
1224*8975f5c5SAndroid Build Coastguard Worker         const GLColor &clearColor = clearColors[i];
1225*8975f5c5SAndroid Build Coastguard Worker         glClearColor(clearColor.R / 255.0f, clearColor.G / 255.0f, clearColor.B / 255.0f,
1226*8975f5c5SAndroid Build Coastguard Worker                      clearColor.A / 255.0f);
1227*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1228*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1229*8975f5c5SAndroid Build Coastguard Worker     }
1230*8975f5c5SAndroid Build Coastguard Worker 
1231*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
1232*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(texelFetchProgram);
1233*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
1234*8975f5c5SAndroid Build Coastguard Worker     for (GLint layer = 0; static_cast<GLsizei>(layer) < kLayerCount; ++layer)
1235*8975f5c5SAndroid Build Coastguard Worker     {
1236*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(layerLocation, layer);
1237*8975f5c5SAndroid Build Coastguard Worker         for (GLint sampleNum = 0; sampleNum < samplesToUse; ++sampleNum)
1238*8975f5c5SAndroid Build Coastguard Worker         {
1239*8975f5c5SAndroid Build Coastguard Worker             glUniform1i(sampleNumLocation, sampleNum);
1240*8975f5c5SAndroid Build Coastguard Worker             drawQuad(texelFetchProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
1241*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
1242*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, clearColors[layer]);
1243*8975f5c5SAndroid Build Coastguard Worker         }
1244*8975f5c5SAndroid Build Coastguard Worker     }
1245*8975f5c5SAndroid Build Coastguard Worker }
1246*8975f5c5SAndroid Build Coastguard Worker 
1247*8975f5c5SAndroid Build Coastguard Worker // Clear the layers of an integer multisample array texture, and then sample all the samples from
1248*8975f5c5SAndroid Build Coastguard Worker // all the layers in a shader.
TEST_P(TextureMultisampleArrayTest,IntegerTexelFetch)1249*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureMultisampleArrayTest, IntegerTexelFetch)
1250*8975f5c5SAndroid Build Coastguard Worker {
1251*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!requestArrayExtension());
1252*8975f5c5SAndroid Build Coastguard Worker 
1253*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(texelFetchProgram, essl31_shaders::vs::Passthrough(),
1254*8975f5c5SAndroid Build Coastguard Worker                      blitIntArrayTextureLayerFragmentShader());
1255*8975f5c5SAndroid Build Coastguard Worker 
1256*8975f5c5SAndroid Build Coastguard Worker     GLint texLocation = glGetUniformLocation(texelFetchProgram, "tex");
1257*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(texLocation, 0);
1258*8975f5c5SAndroid Build Coastguard Worker     GLint layerLocation = glGetUniformLocation(texelFetchProgram, "layer");
1259*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(layerLocation, 0);
1260*8975f5c5SAndroid Build Coastguard Worker     GLint sampleNumLocation = glGetUniformLocation(texelFetchProgram, "sampleNum");
1261*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(layerLocation, 0);
1262*8975f5c5SAndroid Build Coastguard Worker 
1263*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kWidth      = 4;
1264*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kHeight     = 4;
1265*8975f5c5SAndroid Build Coastguard Worker     const GLsizei kLayerCount = 2;
1266*8975f5c5SAndroid Build Coastguard Worker 
1267*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> testFormats = {GL_RGBA8I};
1268*8975f5c5SAndroid Build Coastguard Worker     GLint samplesToUse = getSamplesToUse(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, testFormats);
1269*8975f5c5SAndroid Build Coastguard Worker 
1270*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, mTexture);
1271*8975f5c5SAndroid Build Coastguard Worker     texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samplesToUse, GL_RGBA8I, kWidth,
1272*8975f5c5SAndroid Build Coastguard Worker                             kHeight, kLayerCount, GL_TRUE);
1273*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1274*8975f5c5SAndroid Build Coastguard Worker 
1275*8975f5c5SAndroid Build Coastguard Worker     // Clear layer zero to green and layer one to blue.
1276*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
1277*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> clearColors = {{GLColor::green, GLColor::blue}};
1278*8975f5c5SAndroid Build Coastguard Worker     for (GLint i = 0; static_cast<GLsizei>(i) < kLayerCount; ++i)
1279*8975f5c5SAndroid Build Coastguard Worker     {
1280*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, 0, i);
1281*8975f5c5SAndroid Build Coastguard Worker         GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
1282*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, status);
1283*8975f5c5SAndroid Build Coastguard Worker         std::array<GLint, 4> intColor;
1284*8975f5c5SAndroid Build Coastguard Worker         for (size_t j = 0; j < intColor.size(); ++j)
1285*8975f5c5SAndroid Build Coastguard Worker         {
1286*8975f5c5SAndroid Build Coastguard Worker             intColor[j] = clearColors[i][j] / 255;
1287*8975f5c5SAndroid Build Coastguard Worker         }
1288*8975f5c5SAndroid Build Coastguard Worker         glClearBufferiv(GL_COLOR, 0, intColor.data());
1289*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1290*8975f5c5SAndroid Build Coastguard Worker     }
1291*8975f5c5SAndroid Build Coastguard Worker 
1292*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
1293*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(texelFetchProgram);
1294*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
1295*8975f5c5SAndroid Build Coastguard Worker     for (GLint layer = 0; static_cast<GLsizei>(layer) < kLayerCount; ++layer)
1296*8975f5c5SAndroid Build Coastguard Worker     {
1297*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(layerLocation, layer);
1298*8975f5c5SAndroid Build Coastguard Worker         for (GLint sampleNum = 0; sampleNum < samplesToUse; ++sampleNum)
1299*8975f5c5SAndroid Build Coastguard Worker         {
1300*8975f5c5SAndroid Build Coastguard Worker             glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1301*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
1302*8975f5c5SAndroid Build Coastguard Worker             glUniform1i(sampleNumLocation, sampleNum);
1303*8975f5c5SAndroid Build Coastguard Worker             drawQuad(texelFetchProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
1304*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
1305*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, clearColors[layer]);
1306*8975f5c5SAndroid Build Coastguard Worker         }
1307*8975f5c5SAndroid Build Coastguard Worker     }
1308*8975f5c5SAndroid Build Coastguard Worker }
1309*8975f5c5SAndroid Build Coastguard Worker 
1310*8975f5c5SAndroid Build Coastguard Worker class TextureSampleShadingTest : public ANGLETest<>
1311*8975f5c5SAndroid Build Coastguard Worker {
1312*8975f5c5SAndroid Build Coastguard Worker   protected:
TextureSampleShadingTest()1313*8975f5c5SAndroid Build Coastguard Worker     TextureSampleShadingTest() {}
1314*8975f5c5SAndroid Build Coastguard Worker };
1315*8975f5c5SAndroid Build Coastguard Worker 
1316*8975f5c5SAndroid Build Coastguard Worker // Test that sample shading actually produces different interpolations per sample.  Note that
1317*8975f5c5SAndroid Build Coastguard Worker // variables such as gl_SampleID and gl_SamplePosition are avoided, as well as the |sample|
1318*8975f5c5SAndroid Build Coastguard Worker // qualifier as they automatically enable sample shading.
TEST_P(TextureSampleShadingTest,Basic)1319*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureSampleShadingTest, Basic)
1320*8975f5c5SAndroid Build Coastguard Worker {
1321*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_sample_shading"));
1322*8975f5c5SAndroid Build Coastguard Worker 
1323*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize        = 1;
1324*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSampleCount = 4;
1325*8975f5c5SAndroid Build Coastguard Worker 
1326*8975f5c5SAndroid Build Coastguard Worker     // Create a multisampled texture and framebuffer.
1327*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
1328*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
1329*8975f5c5SAndroid Build Coastguard Worker 
1330*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTexture;
1331*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
1332*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, kSampleCount, GL_RGBA8, kSize, kSize,
1333*8975f5c5SAndroid Build Coastguard Worker                               false);
1334*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1335*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
1336*8975f5c5SAndroid Build Coastguard Worker                            msaaTexture, 0);
1337*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1338*8975f5c5SAndroid Build Coastguard Worker 
1339*8975f5c5SAndroid Build Coastguard Worker     // Enable sample shading and draw a gradient.
1340*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SAMPLE_SHADING_OES);
1341*8975f5c5SAndroid Build Coastguard Worker     glMinSampleShadingOES(1.0f);
1342*8975f5c5SAndroid Build Coastguard Worker 
1343*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
1344*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
1345*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
1346*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
1347*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1348*8975f5c5SAndroid Build Coastguard Worker 
1349*8975f5c5SAndroid Build Coastguard Worker     // Create a buffer for verification.
1350*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kPixelChannels = 4;
1351*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kBufferSize =
1352*8975f5c5SAndroid Build Coastguard Worker         kSize * kSize * kSampleCount * kPixelChannels * sizeof(uint32_t);
1353*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
1354*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
1355*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_SHADER_STORAGE_BUFFER, kBufferSize, nullptr, GL_STATIC_DRAW);
1356*8975f5c5SAndroid Build Coastguard Worker     glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffer);
1357*8975f5c5SAndroid Build Coastguard Worker 
1358*8975f5c5SAndroid Build Coastguard Worker     // Issue a dispatch call that copies the multisampled texture into a buffer.
1359*8975f5c5SAndroid Build Coastguard Worker     constexpr char kCS[] = R"(#version 310 es
1360*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=4, local_size_y=1, local_size_z=1) in;
1361*8975f5c5SAndroid Build Coastguard Worker 
1362*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2DMS imageIn;
1363*8975f5c5SAndroid Build Coastguard Worker layout(std430, binding = 0) buffer dataOut {
1364*8975f5c5SAndroid Build Coastguard Worker     uint data[];
1365*8975f5c5SAndroid Build Coastguard Worker };
1366*8975f5c5SAndroid Build Coastguard Worker 
1367*8975f5c5SAndroid Build Coastguard Worker void main()
1368*8975f5c5SAndroid Build Coastguard Worker {
1369*8975f5c5SAndroid Build Coastguard Worker     int sampleIndex = int(gl_GlobalInvocationID.x) % 4;
1370*8975f5c5SAndroid Build Coastguard Worker 
1371*8975f5c5SAndroid Build Coastguard Worker     vec4 color = texelFetch(imageIn, ivec2(0), sampleIndex);
1372*8975f5c5SAndroid Build Coastguard Worker     uvec4 unnormalized = uvec4(color * 255.0);
1373*8975f5c5SAndroid Build Coastguard Worker 
1374*8975f5c5SAndroid Build Coastguard Worker     int outIndex = sampleIndex * 4;
1375*8975f5c5SAndroid Build Coastguard Worker 
1376*8975f5c5SAndroid Build Coastguard Worker     data[outIndex    ] = unnormalized.r;
1377*8975f5c5SAndroid Build Coastguard Worker     data[outIndex + 1] = unnormalized.g;
1378*8975f5c5SAndroid Build Coastguard Worker     data[outIndex + 2] = unnormalized.b;
1379*8975f5c5SAndroid Build Coastguard Worker     data[outIndex + 3] = unnormalized.a;
1380*8975f5c5SAndroid Build Coastguard Worker })";
1381*8975f5c5SAndroid Build Coastguard Worker 
1382*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_COMPUTE_PROGRAM(program, kCS);
1383*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1384*8975f5c5SAndroid Build Coastguard Worker 
1385*8975f5c5SAndroid Build Coastguard Worker     // Bind the multisampled texture as sampler.
1386*8975f5c5SAndroid Build Coastguard Worker     GLint imageLocation = glGetUniformLocation(program, "imageIn");
1387*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(imageLocation, 0);
1388*8975f5c5SAndroid Build Coastguard Worker 
1389*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
1390*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
1391*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(imageLocation, 0);
1392*8975f5c5SAndroid Build Coastguard Worker 
1393*8975f5c5SAndroid Build Coastguard Worker     glDispatchCompute(1, 1, 1);
1394*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1395*8975f5c5SAndroid Build Coastguard Worker 
1396*8975f5c5SAndroid Build Coastguard Worker     // Verify that the buffer has correct data.
1397*8975f5c5SAndroid Build Coastguard Worker     glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
1398*8975f5c5SAndroid Build Coastguard Worker 
1399*8975f5c5SAndroid Build Coastguard Worker     const uint32_t *ptr = reinterpret_cast<uint32_t *>(
1400*8975f5c5SAndroid Build Coastguard Worker         glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, kBufferSize, GL_MAP_READ_BIT));
1401*8975f5c5SAndroid Build Coastguard Worker     constexpr GLColor kExpectedColors[4] = {
1402*8975f5c5SAndroid Build Coastguard Worker         GLColor(96, 32, 0, 255),
1403*8975f5c5SAndroid Build Coastguard Worker         GLColor(223, 96, 0, 255),
1404*8975f5c5SAndroid Build Coastguard Worker         GLColor(32, 159, 0, 255),
1405*8975f5c5SAndroid Build Coastguard Worker         GLColor(159, 223, 0, 255),
1406*8975f5c5SAndroid Build Coastguard Worker     };
1407*8975f5c5SAndroid Build Coastguard Worker     for (GLsizei pixel = 0; pixel < kSampleCount; ++pixel)
1408*8975f5c5SAndroid Build Coastguard Worker     {
1409*8975f5c5SAndroid Build Coastguard Worker         for (GLsizei channel = 0; channel < kPixelChannels; ++channel)
1410*8975f5c5SAndroid Build Coastguard Worker         {
1411*8975f5c5SAndroid Build Coastguard Worker             EXPECT_NEAR(ptr[pixel * kPixelChannels + channel], kExpectedColors[pixel][channel], 1)
1412*8975f5c5SAndroid Build Coastguard Worker                 << pixel << " " << channel;
1413*8975f5c5SAndroid Build Coastguard Worker         }
1414*8975f5c5SAndroid Build Coastguard Worker     }
1415*8975f5c5SAndroid Build Coastguard Worker 
1416*8975f5c5SAndroid Build Coastguard Worker     glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
1417*8975f5c5SAndroid Build Coastguard Worker }
1418*8975f5c5SAndroid Build Coastguard Worker 
1419*8975f5c5SAndroid Build Coastguard Worker // Test that sample shading actually produces different interpolations per sample when |sample| is
1420*8975f5c5SAndroid Build Coastguard Worker // missing from the shader.  Both varyings and I/O blocks are tested.  When |centroid| is specified,
1421*8975f5c5SAndroid Build Coastguard Worker // |sample| shouldn't be added.
TEST_P(TextureSampleShadingTest,NoSampleQualifier)1422*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureSampleShadingTest, NoSampleQualifier)
1423*8975f5c5SAndroid Build Coastguard Worker {
1424*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_sample_shading"));
1425*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_sample_variables"));
1426*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_shader_multisample_interpolation"));
1427*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_io_blocks"));
1428*8975f5c5SAndroid Build Coastguard Worker 
1429*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize        = 1;
1430*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSampleCount = 4;
1431*8975f5c5SAndroid Build Coastguard Worker 
1432*8975f5c5SAndroid Build Coastguard Worker     // Create a multisampled texture and framebuffer.
1433*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
1434*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
1435*8975f5c5SAndroid Build Coastguard Worker 
1436*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTexture;
1437*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
1438*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, kSampleCount, GL_RGBA8, kSize, kSize,
1439*8975f5c5SAndroid Build Coastguard Worker                               false);
1440*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
1441*8975f5c5SAndroid Build Coastguard Worker                            msaaTexture, 0);
1442*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1443*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1444*8975f5c5SAndroid Build Coastguard Worker 
1445*8975f5c5SAndroid Build Coastguard Worker     // Enable sample shading and draw
1446*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SAMPLE_SHADING_OES);
1447*8975f5c5SAndroid Build Coastguard Worker     glMinSampleShadingOES(1.0f);
1448*8975f5c5SAndroid Build Coastguard Worker 
1449*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(#version 310 es
1450*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_shader_multisample_interpolation : require
1451*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_shader_io_blocks : require
1452*8975f5c5SAndroid Build Coastguard Worker 
1453*8975f5c5SAndroid Build Coastguard Worker in mediump vec2 position;
1454*8975f5c5SAndroid Build Coastguard Worker out mediump vec2 gradient;
1455*8975f5c5SAndroid Build Coastguard Worker centroid out mediump vec2 constant;
1456*8975f5c5SAndroid Build Coastguard Worker out Block
1457*8975f5c5SAndroid Build Coastguard Worker {
1458*8975f5c5SAndroid Build Coastguard Worker     centroid mediump vec2 constant2;
1459*8975f5c5SAndroid Build Coastguard Worker     mediump vec2 gradient2;
1460*8975f5c5SAndroid Build Coastguard Worker     sample mediump vec2 gradient3;
1461*8975f5c5SAndroid Build Coastguard Worker };
1462*8975f5c5SAndroid Build Coastguard Worker 
1463*8975f5c5SAndroid Build Coastguard Worker out Inactive
1464*8975f5c5SAndroid Build Coastguard Worker {
1465*8975f5c5SAndroid Build Coastguard Worker     mediump vec2 gradient4;
1466*8975f5c5SAndroid Build Coastguard Worker };
1467*8975f5c5SAndroid Build Coastguard Worker 
1468*8975f5c5SAndroid Build Coastguard Worker void main()
1469*8975f5c5SAndroid Build Coastguard Worker {
1470*8975f5c5SAndroid Build Coastguard Worker     gradient = position;
1471*8975f5c5SAndroid Build Coastguard Worker     gradient2 = position;
1472*8975f5c5SAndroid Build Coastguard Worker     gradient3 = position;
1473*8975f5c5SAndroid Build Coastguard Worker     constant = position;
1474*8975f5c5SAndroid Build Coastguard Worker     constant2 = position;
1475*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position, 0, 1);
1476*8975f5c5SAndroid Build Coastguard Worker })";
1477*8975f5c5SAndroid Build Coastguard Worker 
1478*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 310 es
1479*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_shader_multisample_interpolation : require
1480*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_sample_variables : require
1481*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_shader_io_blocks : require
1482*8975f5c5SAndroid Build Coastguard Worker 
1483*8975f5c5SAndroid Build Coastguard Worker in highp vec2 gradient;
1484*8975f5c5SAndroid Build Coastguard Worker centroid in highp vec2 constant;
1485*8975f5c5SAndroid Build Coastguard Worker in Block
1486*8975f5c5SAndroid Build Coastguard Worker {
1487*8975f5c5SAndroid Build Coastguard Worker     centroid mediump vec2 constant2;
1488*8975f5c5SAndroid Build Coastguard Worker     mediump vec2 gradient2;
1489*8975f5c5SAndroid Build Coastguard Worker     sample mediump vec2 gradient3;
1490*8975f5c5SAndroid Build Coastguard Worker };
1491*8975f5c5SAndroid Build Coastguard Worker 
1492*8975f5c5SAndroid Build Coastguard Worker in Inactive2
1493*8975f5c5SAndroid Build Coastguard Worker {
1494*8975f5c5SAndroid Build Coastguard Worker     mediump vec2 gradient4;
1495*8975f5c5SAndroid Build Coastguard Worker };
1496*8975f5c5SAndroid Build Coastguard Worker 
1497*8975f5c5SAndroid Build Coastguard Worker out mediump vec4 color;
1498*8975f5c5SAndroid Build Coastguard Worker 
1499*8975f5c5SAndroid Build Coastguard Worker void main()
1500*8975f5c5SAndroid Build Coastguard Worker {
1501*8975f5c5SAndroid Build Coastguard Worker     bool left = gl_SampleID == 0 || gl_SampleID == 2;
1502*8975f5c5SAndroid Build Coastguard Worker     bool top = gl_SampleID == 0 || gl_SampleID == 1;
1503*8975f5c5SAndroid Build Coastguard Worker 
1504*8975f5c5SAndroid Build Coastguard Worker     color = vec4(0);
1505*8975f5c5SAndroid Build Coastguard Worker 
1506*8975f5c5SAndroid Build Coastguard Worker     if (left)
1507*8975f5c5SAndroid Build Coastguard Worker         color.r = gradient.x < -0.1 && gradient2.x < -0.1 && gradient3.x < -0.1 ? 1. : 0.;
1508*8975f5c5SAndroid Build Coastguard Worker     else
1509*8975f5c5SAndroid Build Coastguard Worker         color.r = gradient.x > 0.1 && gradient2.x > 0.1 && gradient3.x > 0.1 ? 1. : 0.;
1510*8975f5c5SAndroid Build Coastguard Worker 
1511*8975f5c5SAndroid Build Coastguard Worker     if (top)
1512*8975f5c5SAndroid Build Coastguard Worker         color.g = gradient.y < -0.1 && gradient2.y < -0.1 && gradient3.y < -0.1 ? 1. : 0.;
1513*8975f5c5SAndroid Build Coastguard Worker     else
1514*8975f5c5SAndroid Build Coastguard Worker         color.g = gradient.y > 0.1 && gradient2.y > 0.1 && gradient3.y > 0.1 ? 1. : 0.;
1515*8975f5c5SAndroid Build Coastguard Worker 
1516*8975f5c5SAndroid Build Coastguard Worker     // centroid doesn't exactly behave consistently between implementations.  In particular, it does
1517*8975f5c5SAndroid Build Coastguard Worker     // _not_ necessarily evaluage the varying at the pixel center.  As a result, there isn't much
1518*8975f5c5SAndroid Build Coastguard Worker     // that can be verified here.  We'd rely on SPIR-V validation to make sure Sample is not added
1519*8975f5c5SAndroid Build Coastguard Worker     // to ids that already have Centroid specified (in the Vulkan backend)
1520*8975f5c5SAndroid Build Coastguard Worker     color.b = abs(constant.x) < 1. && abs(constant.y) < 1. ? 1. : 0.;
1521*8975f5c5SAndroid Build Coastguard Worker     color.a = abs(constant2.x) < 1. && abs(constant2.y) < 1. ? 1. : 0.;
1522*8975f5c5SAndroid Build Coastguard Worker })";
1523*8975f5c5SAndroid Build Coastguard Worker 
1524*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
1525*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
1526*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
1527*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1528*8975f5c5SAndroid Build Coastguard Worker 
1529*8975f5c5SAndroid Build Coastguard Worker     // Resolve the framebuffer
1530*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1531*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
1532*8975f5c5SAndroid Build Coastguard Worker 
1533*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1534*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1535*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
1536*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1537*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1538*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
1539*8975f5c5SAndroid Build Coastguard Worker 
1540*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_LINEAR);
1541*8975f5c5SAndroid Build Coastguard Worker 
1542*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
1543*8975f5c5SAndroid Build Coastguard Worker 
1544*8975f5c5SAndroid Build Coastguard Worker     // Ensure the test passed on every sample location
1545*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
1546*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1547*8975f5c5SAndroid Build Coastguard Worker }
1548*8975f5c5SAndroid Build Coastguard Worker 
1549*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureMultisampleTest);
1550*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(TextureMultisampleTest);
1551*8975f5c5SAndroid Build Coastguard Worker 
1552*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(NegativeTextureMultisampleTest);
1553*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(NegativeTextureMultisampleTest);
1554*8975f5c5SAndroid Build Coastguard Worker 
1555*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureMultisampleArrayTest);
1556*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31_AND(TextureMultisampleArrayTest, ANGLE_ALL_TEST_PLATFORMS_ES32);
1557*8975f5c5SAndroid Build Coastguard Worker 
1558*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureSampleShadingTest);
1559*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(TextureSampleShadingTest);
1560*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
1561