xref: /aosp_15_r20/external/angle/src/tests/gl_tests/IncompleteTextureTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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