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