1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 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 #include "test_utils/ANGLETest.h"
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include <vector>
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker class IncompleteTextureTest : public ANGLETest<>
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker protected:
IncompleteTextureTest()17*8975f5c5SAndroid Build Coastguard Worker IncompleteTextureTest()
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(128);
20*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(128);
21*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
22*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
23*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
24*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
25*8975f5c5SAndroid Build Coastguard Worker }
26*8975f5c5SAndroid Build Coastguard Worker
testSetUp()27*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(precision highp float;
30*8975f5c5SAndroid Build Coastguard Worker attribute vec4 position;
31*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
32*8975f5c5SAndroid Build Coastguard Worker
33*8975f5c5SAndroid Build Coastguard Worker void main()
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker gl_Position = position;
36*8975f5c5SAndroid Build Coastguard Worker texcoord = (position.xy * 0.5) + 0.5;
37*8975f5c5SAndroid Build Coastguard Worker })";
38*8975f5c5SAndroid Build Coastguard Worker
39*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision highp float;
40*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
41*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
42*8975f5c5SAndroid Build Coastguard Worker
43*8975f5c5SAndroid Build Coastguard Worker void main()
44*8975f5c5SAndroid Build Coastguard Worker {
45*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = texture2D(tex, texcoord);
46*8975f5c5SAndroid Build Coastguard Worker })";
47*8975f5c5SAndroid Build Coastguard Worker
48*8975f5c5SAndroid Build Coastguard Worker mProgram = CompileProgram(kVS, kFS);
49*8975f5c5SAndroid Build Coastguard Worker if (mProgram == 0)
50*8975f5c5SAndroid Build Coastguard Worker {
51*8975f5c5SAndroid Build Coastguard Worker FAIL() << "shader compilation failed.";
52*8975f5c5SAndroid Build Coastguard Worker }
53*8975f5c5SAndroid Build Coastguard Worker
54*8975f5c5SAndroid Build Coastguard Worker mTextureUniformLocation = glGetUniformLocation(mProgram, "tex");
55*8975f5c5SAndroid Build Coastguard Worker }
56*8975f5c5SAndroid Build Coastguard Worker
testTearDown()57*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override { glDeleteProgram(mProgram); }
58*8975f5c5SAndroid Build Coastguard Worker
59*8975f5c5SAndroid Build Coastguard Worker GLuint mProgram;
60*8975f5c5SAndroid Build Coastguard Worker GLint mTextureUniformLocation;
61*8975f5c5SAndroid Build Coastguard Worker };
62*8975f5c5SAndroid Build Coastguard Worker
63*8975f5c5SAndroid Build Coastguard Worker class IncompleteTextureTestES3 : public ANGLETest<>
64*8975f5c5SAndroid Build Coastguard Worker {
65*8975f5c5SAndroid Build Coastguard Worker protected:
IncompleteTextureTestES3()66*8975f5c5SAndroid Build Coastguard Worker IncompleteTextureTestES3()
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(128);
69*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(128);
70*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
71*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
72*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
73*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker
76*8975f5c5SAndroid Build Coastguard Worker public:
setupFramebuffer(const GLenum sizedInternalFormat)77*8975f5c5SAndroid Build Coastguard Worker void setupFramebuffer(const GLenum sizedInternalFormat)
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
80*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, sizedInternalFormat, getWindowWidth(),
81*8975f5c5SAndroid Build Coastguard Worker getWindowHeight());
82*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
83*8975f5c5SAndroid Build Coastguard Worker
84*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
85*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
86*8975f5c5SAndroid Build Coastguard Worker mRenderbuffer);
87*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, getWindowWidth(), getWindowHeight());
88*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
89*8975f5c5SAndroid Build Coastguard Worker }
90*8975f5c5SAndroid Build Coastguard Worker
91*8975f5c5SAndroid Build Coastguard Worker private:
92*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer mRenderbuffer;
93*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer mFramebuffer;
94*8975f5c5SAndroid Build Coastguard Worker };
95*8975f5c5SAndroid Build Coastguard Worker
96*8975f5c5SAndroid Build Coastguard Worker class IncompleteTextureTestES31 : public ANGLETest<>
97*8975f5c5SAndroid Build Coastguard Worker {
98*8975f5c5SAndroid Build Coastguard Worker protected:
IncompleteTextureTestES31()99*8975f5c5SAndroid Build Coastguard Worker IncompleteTextureTestES31()
100*8975f5c5SAndroid Build Coastguard Worker {
101*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(128);
102*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(128);
103*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
104*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
105*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
106*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker };
109*8975f5c5SAndroid Build Coastguard Worker
110*8975f5c5SAndroid Build Coastguard Worker // Test rendering with an incomplete texture.
TEST_P(IncompleteTextureTest,IncompleteTexture2D)111*8975f5c5SAndroid Build Coastguard Worker TEST_P(IncompleteTextureTest, IncompleteTexture2D)
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
114*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
115*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
116*8975f5c5SAndroid Build Coastguard Worker
117*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
118*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mTextureUniformLocation, 0);
119*8975f5c5SAndroid Build Coastguard Worker
120*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kTextureSize = 2;
121*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> textureData(kTextureSize * kTextureSize, GLColor::red);
122*8975f5c5SAndroid Build Coastguard Worker
123*8975f5c5SAndroid Build Coastguard Worker // Make a complete texture.
124*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTextureSize, kTextureSize, 0, GL_RGBA,
125*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, textureData.data());
126*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
127*8975f5c5SAndroid Build Coastguard Worker
128*8975f5c5SAndroid Build Coastguard Worker // Should be complete - expect red.
129*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
130*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red) << "complete texture should be red";
131*8975f5c5SAndroid Build Coastguard Worker
132*8975f5c5SAndroid Build Coastguard Worker // Make texture incomplete.
133*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
134*8975f5c5SAndroid Build Coastguard Worker
135*8975f5c5SAndroid Build Coastguard Worker // Should be incomplete - expect black.
136*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
137*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black) << "incomplete texture should be black";
138*8975f5c5SAndroid Build Coastguard Worker
139*8975f5c5SAndroid Build Coastguard Worker // Make texture complete by defining the second mip.
140*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kTextureSize >> 1, kTextureSize >> 1, 0, GL_RGBA,
141*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, textureData.data());
142*8975f5c5SAndroid Build Coastguard Worker
143*8975f5c5SAndroid Build Coastguard Worker // Should be complete - expect red.
144*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
145*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red) << "mip-complete texture should be red";
146*8975f5c5SAndroid Build Coastguard Worker }
147*8975f5c5SAndroid Build Coastguard Worker
148*8975f5c5SAndroid Build Coastguard Worker // Tests redefining a texture with half the size works as expected.
TEST_P(IncompleteTextureTest,UpdateTexture)149*8975f5c5SAndroid Build Coastguard Worker TEST_P(IncompleteTextureTest, UpdateTexture)
150*8975f5c5SAndroid Build Coastguard Worker {
151*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
152*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
153*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
154*8975f5c5SAndroid Build Coastguard Worker
155*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
156*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mTextureUniformLocation, 0);
157*8975f5c5SAndroid Build Coastguard Worker
158*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei redTextureSize = 64;
159*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> redTextureData(redTextureSize * redTextureSize, GLColor::red);
160*8975f5c5SAndroid Build Coastguard Worker for (GLint mip = 0; mip < 7; ++mip)
161*8975f5c5SAndroid Build Coastguard Worker {
162*8975f5c5SAndroid Build Coastguard Worker const GLsizei mipSize = redTextureSize >> mip;
163*8975f5c5SAndroid Build Coastguard Worker
164*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, mip, GL_RGBA, mipSize, mipSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
165*8975f5c5SAndroid Build Coastguard Worker redTextureData.data());
166*8975f5c5SAndroid Build Coastguard Worker }
167*8975f5c5SAndroid Build Coastguard Worker
168*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
169*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
170*8975f5c5SAndroid Build Coastguard Worker
171*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
172*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
173*8975f5c5SAndroid Build Coastguard Worker
174*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei greenTextureSize = 32;
175*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> greenTextureData(greenTextureSize * greenTextureSize, GLColor::green);
176*8975f5c5SAndroid Build Coastguard Worker
177*8975f5c5SAndroid Build Coastguard Worker for (GLint mip = 0; mip < 6; ++mip)
178*8975f5c5SAndroid Build Coastguard Worker {
179*8975f5c5SAndroid Build Coastguard Worker const GLsizei mipSize = greenTextureSize >> mip;
180*8975f5c5SAndroid Build Coastguard Worker
181*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, mip, mipSize, mipSize, mipSize, mipSize, GL_RGBA,
182*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, greenTextureData.data());
183*8975f5c5SAndroid Build Coastguard Worker }
184*8975f5c5SAndroid Build Coastguard Worker
185*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
186*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - greenTextureSize, getWindowHeight() - greenTextureSize,
187*8975f5c5SAndroid Build Coastguard Worker GLColor::green);
188*8975f5c5SAndroid Build Coastguard Worker }
189*8975f5c5SAndroid Build Coastguard Worker
190*8975f5c5SAndroid Build Coastguard Worker // Tests that incomplete textures don't get initialized with the unpack buffer contents.
TEST_P(IncompleteTextureTestES3,UnpackBufferBound)191*8975f5c5SAndroid Build Coastguard Worker TEST_P(IncompleteTextureTestES3, UnpackBufferBound)
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> red(16, GLColor::red);
194*8975f5c5SAndroid Build Coastguard Worker
195*8975f5c5SAndroid Build Coastguard Worker GLBuffer unpackBuffer;
196*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer);
197*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_PIXEL_UNPACK_BUFFER, red.size() * sizeof(GLColor), red.data(), GL_STATIC_DRAW);
198*8975f5c5SAndroid Build Coastguard Worker
199*8975f5c5SAndroid Build Coastguard Worker draw2DTexturedQuad(0.5f, 1.0f, true);
200*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
201*8975f5c5SAndroid Build Coastguard Worker
202*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
203*8975f5c5SAndroid Build Coastguard Worker }
204*8975f5c5SAndroid Build Coastguard Worker
205*8975f5c5SAndroid Build Coastguard Worker // Tests that the incomplete multisample texture has the correct alpha value.
TEST_P(IncompleteTextureTestES31,MultisampleTexture)206*8975f5c5SAndroid Build Coastguard Worker TEST_P(IncompleteTextureTestES31, MultisampleTexture)
207*8975f5c5SAndroid Build Coastguard Worker {
208*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 310 es
209*8975f5c5SAndroid Build Coastguard Worker in vec2 position;
210*8975f5c5SAndroid Build Coastguard Worker out vec2 texCoord;
211*8975f5c5SAndroid Build Coastguard Worker void main()
212*8975f5c5SAndroid Build Coastguard Worker {
213*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
214*8975f5c5SAndroid Build Coastguard Worker texCoord = (position * 0.5) + 0.5;
215*8975f5c5SAndroid Build Coastguard Worker })";
216*8975f5c5SAndroid Build Coastguard Worker
217*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 310 es
218*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
219*8975f5c5SAndroid Build Coastguard Worker in vec2 texCoord;
220*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
221*8975f5c5SAndroid Build Coastguard Worker uniform mediump sampler2DMS tex;
222*8975f5c5SAndroid Build Coastguard Worker void main()
223*8975f5c5SAndroid Build Coastguard Worker {
224*8975f5c5SAndroid Build Coastguard Worker ivec2 texSize = textureSize(tex);
225*8975f5c5SAndroid Build Coastguard Worker ivec2 texel = ivec2(vec2(texSize) * texCoord);
226*8975f5c5SAndroid Build Coastguard Worker color = texelFetch(tex, texel, 0);
227*8975f5c5SAndroid Build Coastguard Worker })";
228*8975f5c5SAndroid Build Coastguard Worker
229*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
230*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
231*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
232*8975f5c5SAndroid Build Coastguard Worker
233*8975f5c5SAndroid Build Coastguard Worker // The zero texture will be incomplete by default.
234*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
235*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.5f);
236*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
237*8975f5c5SAndroid Build Coastguard Worker
238*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
239*8975f5c5SAndroid Build Coastguard Worker }
240*8975f5c5SAndroid Build Coastguard Worker
241*8975f5c5SAndroid Build Coastguard Worker // This mirrors a scenario seen in GFXBench Car Chase where a
242*8975f5c5SAndroid Build Coastguard Worker // default CUBE_MAP_ARRAY texture is used without being setup.
243*8975f5c5SAndroid Build Coastguard Worker // Its ends up sampling from an incomplete texture.
TEST_P(IncompleteTextureTestES31,IncompleteTextureCubeMapArray)244*8975f5c5SAndroid Build Coastguard Worker TEST_P(IncompleteTextureTestES31, IncompleteTextureCubeMapArray)
245*8975f5c5SAndroid Build Coastguard Worker {
246*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_cube_map_array"));
247*8975f5c5SAndroid Build Coastguard Worker
248*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] =
249*8975f5c5SAndroid Build Coastguard Worker R"(#version 310 es
250*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
251*8975f5c5SAndroid Build Coastguard Worker in vec3 pos;
252*8975f5c5SAndroid Build Coastguard Worker void main() {
253*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(pos, 1.0);
254*8975f5c5SAndroid Build Coastguard Worker })";
255*8975f5c5SAndroid Build Coastguard Worker
256*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
257*8975f5c5SAndroid Build Coastguard Worker R"(#version 310 es
258*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_texture_cube_map_array : enable
259*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
260*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
261*8975f5c5SAndroid Build Coastguard Worker uniform lowp samplerCubeArray uTex;
262*8975f5c5SAndroid Build Coastguard Worker void main(){
263*8975f5c5SAndroid Build Coastguard Worker vec4 outColor = vec4(0.0);
264*8975f5c5SAndroid Build Coastguard Worker
265*8975f5c5SAndroid Build Coastguard Worker // Pull a color from each cube face to ensure they are all initialized
266*8975f5c5SAndroid Build Coastguard Worker outColor += texture(uTex, vec4(1.0, 0.0, 0.0, 0.0));
267*8975f5c5SAndroid Build Coastguard Worker outColor += texture(uTex, vec4(-1.0, 0.0, 0.0, 0.0));
268*8975f5c5SAndroid Build Coastguard Worker outColor += texture(uTex, vec4(0.0, 1.0, 0.0, 0.0));
269*8975f5c5SAndroid Build Coastguard Worker outColor += texture(uTex, vec4(0.0, -1.0, 0.0, 0.0));
270*8975f5c5SAndroid Build Coastguard Worker outColor += texture(uTex, vec4(0.0, 0.0, 1.0, 0.0));
271*8975f5c5SAndroid Build Coastguard Worker outColor += texture(uTex, vec4(0.0, 0.0, -1.0, 0.0));
272*8975f5c5SAndroid Build Coastguard Worker
273*8975f5c5SAndroid Build Coastguard Worker color = outColor;
274*8975f5c5SAndroid Build Coastguard Worker })";
275*8975f5c5SAndroid Build Coastguard Worker
276*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
277*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
278*8975f5c5SAndroid Build Coastguard Worker
279*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(program, "uTex"), 0);
280*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
281*8975f5c5SAndroid Build Coastguard Worker
282*8975f5c5SAndroid Build Coastguard Worker // Bind the default texture and don't set it up. This ends up being incomplete.
283*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, 0);
284*8975f5c5SAndroid Build Coastguard Worker
285*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "pos", 0.5f, 1.0f, true);
286*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
287*8975f5c5SAndroid Build Coastguard Worker
288*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::black);
289*8975f5c5SAndroid Build Coastguard Worker }
290*8975f5c5SAndroid Build Coastguard Worker
291*8975f5c5SAndroid Build Coastguard Worker // Verifies that an incomplete integer texture has a signed integer type default value.
TEST_P(IncompleteTextureTestES3,IntegerType)292*8975f5c5SAndroid Build Coastguard Worker TEST_P(IncompleteTextureTestES3, IntegerType)
293*8975f5c5SAndroid Build Coastguard Worker {
294*8975f5c5SAndroid Build Coastguard Worker // GLES backend on Adreno has a problem to create a incomplete texture, although it doesn't go
295*8975f5c5SAndroid Build Coastguard Worker // through the routine which creates a incomplete texture in the ANGLE driver.
296*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAdreno() && IsAndroid() && IsOpenGLES());
297*8975f5c5SAndroid Build Coastguard Worker
298*8975f5c5SAndroid Build Coastguard Worker // http://crbug.com/1168370
299*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsMac() && IsARM64() && IsOpenGL());
300*8975f5c5SAndroid Build Coastguard Worker
301*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
302*8975f5c5SAndroid Build Coastguard Worker in highp vec2 position;
303*8975f5c5SAndroid Build Coastguard Worker out highp vec2 texCoord;
304*8975f5c5SAndroid Build Coastguard Worker void main()
305*8975f5c5SAndroid Build Coastguard Worker {
306*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
307*8975f5c5SAndroid Build Coastguard Worker texCoord = (position * 0.5) + 0.5;
308*8975f5c5SAndroid Build Coastguard Worker })";
309*8975f5c5SAndroid Build Coastguard Worker
310*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
311*8975f5c5SAndroid Build Coastguard Worker in highp vec2 texCoord;
312*8975f5c5SAndroid Build Coastguard Worker out highp ivec4 color;
313*8975f5c5SAndroid Build Coastguard Worker uniform highp isampler2D tex;
314*8975f5c5SAndroid Build Coastguard Worker void main()
315*8975f5c5SAndroid Build Coastguard Worker {
316*8975f5c5SAndroid Build Coastguard Worker ivec2 texSize = textureSize(tex, 0);
317*8975f5c5SAndroid Build Coastguard Worker ivec2 texel = ivec2(vec2(texSize) * texCoord);
318*8975f5c5SAndroid Build Coastguard Worker color = texelFetch(tex, texel, 0);
319*8975f5c5SAndroid Build Coastguard Worker })";
320*8975f5c5SAndroid Build Coastguard Worker
321*8975f5c5SAndroid Build Coastguard Worker constexpr GLint clearColori[4] = {-10, 20, -30, 40};
322*8975f5c5SAndroid Build Coastguard Worker constexpr GLint blackColori[4] = {0, 0, 0, 127};
323*8975f5c5SAndroid Build Coastguard Worker
324*8975f5c5SAndroid Build Coastguard Worker setupFramebuffer(GL_RGBA8I);
325*8975f5c5SAndroid Build Coastguard Worker glClearBufferiv(GL_COLOR, 0, clearColori);
326*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
327*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(0, 0, clearColori[0], clearColori[1], clearColori[2], clearColori[3]);
328*8975f5c5SAndroid Build Coastguard Worker
329*8975f5c5SAndroid Build Coastguard Worker // Since no texture attachment has been specified, it is incomplete by definition
330*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
331*8975f5c5SAndroid Build Coastguard Worker
332*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
333*8975f5c5SAndroid Build Coastguard Worker
334*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.5f);
335*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
336*8975f5c5SAndroid Build Coastguard Worker
337*8975f5c5SAndroid Build Coastguard Worker const int width = getWindowWidth() - 1;
338*8975f5c5SAndroid Build Coastguard Worker const int height = getWindowHeight() - 1;
339*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(0, 0, blackColori[0], blackColori[1], blackColori[2], blackColori[3]);
340*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(width, 0, blackColori[0], blackColori[1], blackColori[2], blackColori[3]);
341*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(0, height, blackColori[0], blackColori[1], blackColori[2], blackColori[3]);
342*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(width, height, blackColori[0], blackColori[1], blackColori[2], blackColori[3]);
343*8975f5c5SAndroid Build Coastguard Worker }
344*8975f5c5SAndroid Build Coastguard Worker
345*8975f5c5SAndroid Build Coastguard Worker // Verifies that an incomplete unsigned integer texture has an unsigned integer type default value.
TEST_P(IncompleteTextureTestES3,UnsignedIntegerType)346*8975f5c5SAndroid Build Coastguard Worker TEST_P(IncompleteTextureTestES3, UnsignedIntegerType)
347*8975f5c5SAndroid Build Coastguard Worker {
348*8975f5c5SAndroid Build Coastguard Worker // GLES backend on Adreno has a problem to create a incomplete texture, although it doesn't go
349*8975f5c5SAndroid Build Coastguard Worker // through the routine which creates a incomplete texture in the ANGLE driver.
350*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAdreno() && IsAndroid() && IsOpenGLES());
351*8975f5c5SAndroid Build Coastguard Worker
352*8975f5c5SAndroid Build Coastguard Worker // http://crbug.com/1168370
353*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsMac() && IsARM64() && IsOpenGL());
354*8975f5c5SAndroid Build Coastguard Worker
355*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
356*8975f5c5SAndroid Build Coastguard Worker in highp vec2 position;
357*8975f5c5SAndroid Build Coastguard Worker out highp vec2 texCoord;
358*8975f5c5SAndroid Build Coastguard Worker void main()
359*8975f5c5SAndroid Build Coastguard Worker {
360*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
361*8975f5c5SAndroid Build Coastguard Worker texCoord = (position * 0.5) + 0.5;
362*8975f5c5SAndroid Build Coastguard Worker })";
363*8975f5c5SAndroid Build Coastguard Worker
364*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
365*8975f5c5SAndroid Build Coastguard Worker in highp vec2 texCoord;
366*8975f5c5SAndroid Build Coastguard Worker out highp uvec4 color;
367*8975f5c5SAndroid Build Coastguard Worker uniform highp usampler2D tex;
368*8975f5c5SAndroid Build Coastguard Worker void main()
369*8975f5c5SAndroid Build Coastguard Worker {
370*8975f5c5SAndroid Build Coastguard Worker ivec2 texSize = textureSize(tex, 0);
371*8975f5c5SAndroid Build Coastguard Worker ivec2 texel = ivec2(vec2(texSize) * texCoord);
372*8975f5c5SAndroid Build Coastguard Worker color = texelFetch(tex, texel, 0);
373*8975f5c5SAndroid Build Coastguard Worker })";
374*8975f5c5SAndroid Build Coastguard Worker
375*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint clearColorui[4] = {40, 30, 20, 10};
376*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint blackColorui[4] = {0, 0, 0, 255};
377*8975f5c5SAndroid Build Coastguard Worker
378*8975f5c5SAndroid Build Coastguard Worker setupFramebuffer(GL_RGBA8UI);
379*8975f5c5SAndroid Build Coastguard Worker glClearBufferuiv(GL_COLOR, 0, clearColorui);
380*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
381*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8UI(0, 0, clearColorui[0], clearColorui[1], clearColorui[2], clearColorui[3]);
382*8975f5c5SAndroid Build Coastguard Worker
383*8975f5c5SAndroid Build Coastguard Worker // Since no texture attachment has been specified, it is incomplete by definition
384*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
385*8975f5c5SAndroid Build Coastguard Worker
386*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
387*8975f5c5SAndroid Build Coastguard Worker
388*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.5f);
389*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
390*8975f5c5SAndroid Build Coastguard Worker
391*8975f5c5SAndroid Build Coastguard Worker const int width = getWindowWidth() - 1;
392*8975f5c5SAndroid Build Coastguard Worker const int height = getWindowHeight() - 1;
393*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8UI(0, 0, blackColorui[0], blackColorui[1], blackColorui[2], blackColorui[3]);
394*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8UI(width, 0, blackColorui[0], blackColorui[1], blackColorui[2], blackColorui[3]);
395*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8UI(0, height, blackColorui[0], blackColorui[1], blackColorui[2], blackColorui[3]);
396*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8UI(width, height, blackColorui[0], blackColorui[1], blackColorui[2],
397*8975f5c5SAndroid Build Coastguard Worker blackColorui[3]);
398*8975f5c5SAndroid Build Coastguard Worker }
399*8975f5c5SAndroid Build Coastguard Worker
400*8975f5c5SAndroid Build Coastguard Worker // Verifies that we are able to create an incomplete shadow texture.
TEST_P(IncompleteTextureTestES3,ShadowType)401*8975f5c5SAndroid Build Coastguard Worker TEST_P(IncompleteTextureTestES3, ShadowType)
402*8975f5c5SAndroid Build Coastguard Worker {
403*8975f5c5SAndroid Build Coastguard Worker // GLES backend on Adreno has a problem to create a incomplete texture, although it doesn't go
404*8975f5c5SAndroid Build Coastguard Worker // through the routine which creates a incomplete texture in the ANGLE driver.
405*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAdreno() && IsAndroid() && IsOpenGLES());
406*8975f5c5SAndroid Build Coastguard Worker
407*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42264125
408*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsD3D11());
409*8975f5c5SAndroid Build Coastguard Worker
410*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
411*8975f5c5SAndroid Build Coastguard Worker in highp vec2 position;
412*8975f5c5SAndroid Build Coastguard Worker out highp vec3 texCoord;
413*8975f5c5SAndroid Build Coastguard Worker void main()
414*8975f5c5SAndroid Build Coastguard Worker {
415*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
416*8975f5c5SAndroid Build Coastguard Worker texCoord = vec3(((position * 0.5) + 0.5), 0.5);
417*8975f5c5SAndroid Build Coastguard Worker })";
418*8975f5c5SAndroid Build Coastguard Worker
419*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
420*8975f5c5SAndroid Build Coastguard Worker in highp vec3 texCoord;
421*8975f5c5SAndroid Build Coastguard Worker out highp vec4 color;
422*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2DShadow tex;
423*8975f5c5SAndroid Build Coastguard Worker void main()
424*8975f5c5SAndroid Build Coastguard Worker {
425*8975f5c5SAndroid Build Coastguard Worker color = vec4(vec3(texture(tex, texCoord)), 1.0f);
426*8975f5c5SAndroid Build Coastguard Worker })";
427*8975f5c5SAndroid Build Coastguard Worker
428*8975f5c5SAndroid Build Coastguard Worker constexpr GLColor clearColor = {10, 40, 20, 30};
429*8975f5c5SAndroid Build Coastguard Worker constexpr GLColor blackColor = {0, 0, 0, 255};
430*8975f5c5SAndroid Build Coastguard Worker
431*8975f5c5SAndroid Build Coastguard Worker setupFramebuffer(GL_RGBA8);
432*8975f5c5SAndroid Build Coastguard Worker glClearBufferfv(GL_COLOR, 0, clearColor.toNormalizedVector().data());
433*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
434*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
435*8975f5c5SAndroid Build Coastguard Worker
436*8975f5c5SAndroid Build Coastguard Worker // Since no texture attachment has been specified, it is incomplete by definition
437*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
438*8975f5c5SAndroid Build Coastguard Worker
439*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
440*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(program, "tex"), 1);
441*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
442*8975f5c5SAndroid Build Coastguard Worker
443*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.5f);
444*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
445*8975f5c5SAndroid Build Coastguard Worker
446*8975f5c5SAndroid Build Coastguard Worker const int width = getWindowWidth() - 1;
447*8975f5c5SAndroid Build Coastguard Worker const int height = getWindowHeight() - 1;
448*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, blackColor[0], blackColor[1], blackColor[2], blackColor[3]);
449*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(width, 0, blackColor[0], blackColor[1], blackColor[2], blackColor[3]);
450*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, height, blackColor[0], blackColor[1], blackColor[2], blackColor[3]);
451*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(width, height, blackColor[0], blackColor[1], blackColor[2], blackColor[3]);
452*8975f5c5SAndroid Build Coastguard Worker }
453*8975f5c5SAndroid Build Coastguard Worker
454*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(IncompleteTextureTest);
455*8975f5c5SAndroid Build Coastguard Worker
456*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(IncompleteTextureTestES3);
457*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(IncompleteTextureTestES3);
458*8975f5c5SAndroid Build Coastguard Worker
459*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(IncompleteTextureTestES31);
460*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(IncompleteTextureTestES31);
461