1f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill#include "ANGLETest.h" 2f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill 3f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madillclass TextureTest : public ANGLETest 4f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill{ 5f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madillprotected: 6f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill TextureTest() 7f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill { 8f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill setWindowWidth(128); 9f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill setWindowHeight(128); 10f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill setConfigRedBits(8); 11f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill setConfigGreenBits(8); 12f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill setConfigBlueBits(8); 13f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill setConfigAlphaBits(8); 14f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill } 15f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill 16f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill virtual void SetUp() 17f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill { 18f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill ANGLETest::SetUp(); 19d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glGenTextures(1, &mTexture2D); 20d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glGenTextures(1, &mTextureCube); 21f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill 22d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glBindTexture(GL_TEXTURE_2D, mTexture2D); 23f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 24f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill EXPECT_GL_NO_ERROR(); 25f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill 26d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube); 27d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glTexStorage2DEXT(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 1, 1); 28d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill EXPECT_GL_NO_ERROR(); 29d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill 30f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill ASSERT_GL_NO_ERROR(); 31c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 32c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang const std::string vertexShaderSource = SHADER_SOURCE 33c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang ( 34c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang precision highp float; 35c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang attribute vec4 position; 36c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang varying vec2 texcoord; 37c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 38c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang void main() 39c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang { 40c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang gl_Position = position; 41c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang texcoord = (position.xy * 0.5) + 0.5; 42c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang } 43c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang ); 44c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 45d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill const std::string fragmentShaderSource2D = SHADER_SOURCE 46c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang ( 47c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang precision highp float; 48c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang uniform sampler2D tex; 49c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang varying vec2 texcoord; 50c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 51c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang void main() 52c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang { 53c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang gl_FragColor = texture2D(tex, texcoord); 54c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang } 55c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang ); 56c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 57d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill const std::string fragmentShaderSourceCube = SHADER_SOURCE 58d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill ( 59d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill precision highp float; 60d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill uniform sampler2D tex2D; 61d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill uniform samplerCube texCube; 62d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill varying vec2 texcoord; 63d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill 64d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill void main() 65d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill { 66d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill gl_FragColor = texture2D(tex2D, texcoord); 67d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill gl_FragColor += textureCube(texCube, vec3(texcoord, 0)); 68d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill } 69d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill ); 70d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill 715599c8f6ffa7239c40069288461e015f9e545ff4Jamie Madill m2DProgram = CompileProgram(vertexShaderSource, fragmentShaderSource2D); 725599c8f6ffa7239c40069288461e015f9e545ff4Jamie Madill mCubeProgram = CompileProgram(vertexShaderSource, fragmentShaderSourceCube); 73d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill if (m2DProgram == 0 || mCubeProgram == 0) 74c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang { 75c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang FAIL() << "shader compilation failed."; 76c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang } 77c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 78d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill mTexture2DUniformLocation = glGetUniformLocation(m2DProgram, "tex"); 79f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill } 80f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill 81f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill virtual void TearDown() 82f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill { 83d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glDeleteTextures(1, &mTexture2D); 84d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glDeleteTextures(1, &mTextureCube); 85d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glDeleteProgram(m2DProgram); 86d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glDeleteProgram(mCubeProgram); 87f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill 88f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill ANGLETest::TearDown(); 89f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill } 90f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill 91d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill GLuint mTexture2D; 92d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill GLuint mTextureCube; 93c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 94d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill GLuint m2DProgram; 95d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill GLuint mCubeProgram; 96d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill GLint mTexture2DUniformLocation; 97f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill}; 98f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill 99b759a748730b4a0b169ebb588046feb63dc164b5Jamie MadillTEST_F(TextureTest, NegativeAPISubImage) 100f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill{ 101d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glBindTexture(GL_TEXTURE_2D, mTexture2D); 102f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill EXPECT_GL_ERROR(GL_NO_ERROR); 103f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill 104f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill const GLubyte *pixels[20] = { 0 }; 105f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 106f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill EXPECT_GL_ERROR(GL_INVALID_VALUE); 107f67115ce37b89380847cfd9a1009781ac06ffaaaJamie Madill} 108c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 109b759a748730b4a0b169ebb588046feb63dc164b5Jamie MadillTEST_F(TextureTest, ZeroSizedUploads) 110c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang{ 111d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glBindTexture(GL_TEXTURE_2D, mTexture2D); 112c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang EXPECT_GL_ERROR(GL_NO_ERROR); 113c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 114c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang // Use the texture first to make sure it's in video memory 115d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glUseProgram(m2DProgram); 116d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glUniform1i(mTexture2DUniformLocation, 0); 117d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill drawQuad(m2DProgram, "position", 0.5f); 118c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 119c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang const GLubyte *pixel[4] = { 0 }; 120c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 121c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixel); 122c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang EXPECT_GL_NO_ERROR(); 123c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 124c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel); 125c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang EXPECT_GL_NO_ERROR(); 126c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang 127c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixel); 128c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang EXPECT_GL_NO_ERROR(); 129c41e42d49626e1527c9e049b48d7c9fb30b0b9d6Geoff Lang} 130d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill 131d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill// Test drawing with two texture types, to trigger an ANGLE bug in validation 132b759a748730b4a0b169ebb588046feb63dc164b5Jamie MadillTEST_F(TextureTest, CubeMapBug) 133d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill{ 134d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glActiveTexture(GL_TEXTURE0); 135d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glBindTexture(GL_TEXTURE_2D, mTexture2D); 136d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glActiveTexture(GL_TEXTURE1); 137d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube); 138d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill EXPECT_GL_ERROR(GL_NO_ERROR); 139d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill 140d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glUseProgram(mCubeProgram); 141d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill GLint tex2DUniformLocation = glGetUniformLocation(mCubeProgram, "tex2D"); 142d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill GLint texCubeUniformLocation = glGetUniformLocation(mCubeProgram, "texCube"); 143d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill EXPECT_NE(-1, tex2DUniformLocation); 144d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill EXPECT_NE(-1, texCubeUniformLocation); 145d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glUniform1i(tex2DUniformLocation, 0); 146d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill glUniform1i(texCubeUniformLocation, 1); 147d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill drawQuad(mCubeProgram, "position", 0.5f); 148d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill EXPECT_GL_NO_ERROR(); 149d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill} 150