3 class TextureTest : public ANGLETest
11 setConfigGreenBits(8);
13 setConfigAlphaBits(8);
19 glGenTextures(1, &mTexture2D);
20 glGenTextures(1, &mTextureCube);
22 glBindTexture(GL_TEXTURE_2D, mTexture2D);
23 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
26 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
27 glTexStorage2DEXT(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 1, 1);
32 const std::string vertexShaderSource = SHADER_SOURCE
34 precision highp float;
35 attribute vec4 position;
36 varying vec2 texcoord;
40 gl_Position = position;
41 texcoord = (position.xy * 0.5) + 0.5;
45 const std::string fragmentShaderSource2D = SHADER_SOURCE
47 precision highp float;
48 uniform sampler2D tex;
49 varying vec2 texcoord;
53 gl_FragColor = texture2D(tex, texcoord);
57 const std::string fragmentShaderSourceCube = SHADER_SOURCE
59 precision highp float;
60 uniform sampler2D tex2D;
61 uniform samplerCube texCube;
62 varying vec2 texcoord;
66 gl_FragColor = texture2D(tex2D, texcoord);
67 gl_FragColor += textureCube(texCube, vec3(texcoord, 0));
71 m2DProgram = CompileProgram(vertexShaderSource, fragmentShaderSource2D);
72 mCubeProgram = CompileProgram(vertexShaderSource, fragmentShaderSourceCube);
73 if (m2DProgram == 0 || mCubeProgram == 0)
75 FAIL() << "shader compilation failed.";
78 mTexture2DUniformLocation = glGetUniformLocation(m2DProgram, "tex");
81 virtual void TearDown()
83 glDeleteTextures(1, &mTexture2D);
84 glDeleteTextures(1, &mTextureCube);
85 glDeleteProgram(m2DProgram);
86 glDeleteProgram(mCubeProgram);
88 ANGLETest::TearDown();
96 GLint mTexture2DUniformLocation;
99 TEST_F(TextureTest, NegativeAPISubImage)
101 glBindTexture(GL_TEXTURE_2D, mTexture2D);
102 EXPECT_GL_ERROR(GL_NO_ERROR);
104 const GLubyte *pixels[20] = { 0 };
105 glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
106 EXPECT_GL_ERROR(GL_INVALID_VALUE);
109 TEST_F(TextureTest, ZeroSizedUploads)
111 glBindTexture(GL_TEXTURE_2D, mTexture2D);
112 EXPECT_GL_ERROR(GL_NO_ERROR);
114 // Use the texture first to make sure it's in video memory
115 glUseProgram(m2DProgram);
116 glUniform1i(mTexture2DUniformLocation, 0);
117 drawQuad(m2DProgram, "position", 0.5f);
119 const GLubyte *pixel[4] = { 0 };
121 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
122 EXPECT_GL_NO_ERROR();
124 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
125 EXPECT_GL_NO_ERROR();
127 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
128 EXPECT_GL_NO_ERROR();
131 // Test drawing with two texture types, to trigger an ANGLE bug in validation
132 TEST_F(TextureTest, CubeMapBug)
134 glActiveTexture(GL_TEXTURE0);
135 glBindTexture(GL_TEXTURE_2D, mTexture2D);
136 glActiveTexture(GL_TEXTURE1);
137 glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube);
138 EXPECT_GL_ERROR(GL_NO_ERROR);
140 glUseProgram(mCubeProgram);
141 GLint tex2DUniformLocation = glGetUniformLocation(mCubeProgram, "tex2D");
142 GLint texCubeUniformLocation = glGetUniformLocation(mCubeProgram, "texCube");
143 EXPECT_NE(-1, tex2DUniformLocation);
144 EXPECT_NE(-1, texCubeUniformLocation);
145 glUniform1i(tex2DUniformLocation, 0);
146 glUniform1i(texCubeUniformLocation, 1);
147 drawQuad(mCubeProgram, "position", 0.5f);
148 EXPECT_GL_NO_ERROR();