Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / tests / angle_tests / ClearTest.cpp
1 #include "ANGLETest.h"
2
3 class ClearTest : public ANGLETest
4 {
5 protected:
6     ClearTest()
7     {
8         setWindowWidth(128);
9         setWindowHeight(128);
10         setConfigRedBits(8);
11         setConfigGreenBits(8);
12         setConfigBlueBits(8);
13         setConfigAlphaBits(8);
14         setConfigDepthBits(24);
15         setClientVersion(3);
16     }
17
18     virtual void SetUp()
19     {
20         ANGLETest::SetUp();
21
22         const std::string vertexShaderSource = SHADER_SOURCE
23         (
24             precision highp float;
25             attribute vec4 position;
26
27             void main()
28             {
29                 gl_Position = position;
30             }
31         );
32
33         const std::string fragmentShaderSource = SHADER_SOURCE
34         (
35             precision highp float;
36
37             void main()
38             {
39                 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
40             }
41         );
42
43         mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
44         if (mProgram == 0)
45         {
46             FAIL() << "shader compilation failed.";
47         }
48
49         glGenFramebuffers(1, &mFBO);
50
51         ASSERT_GL_NO_ERROR();
52     }
53
54     virtual void TearDown()
55     {
56         glDeleteProgram(mProgram);
57         glDeleteFramebuffers(1, &mFBO);
58
59         ANGLETest::TearDown();
60     }
61
62     GLuint mProgram;
63     GLuint mFBO;
64 };
65
66 TEST_F(ClearTest, ClearIssue)
67 {
68     glEnable(GL_DEPTH_TEST);
69     glDepthFunc(GL_LEQUAL);
70
71     glClearColor(0.0, 1.0, 0.0, 1.0);
72     glClearDepthf(0.0);
73     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
74
75     EXPECT_GL_NO_ERROR();
76
77     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
78
79     GLuint rbo;
80     glGenRenderbuffers(1, &rbo);
81     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
82     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB565, 16, 16);
83
84     EXPECT_GL_NO_ERROR();
85
86     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
87
88     EXPECT_GL_NO_ERROR();
89
90     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
91     glClearDepthf(1.0f);
92     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
93
94     EXPECT_GL_NO_ERROR();
95
96     glBindFramebuffer(GL_FRAMEBUFFER, 0);
97     glBindBuffer(GL_ARRAY_BUFFER, 0);
98
99     drawQuad(mProgram, "position", 0.5f);
100
101     EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
102 }
103
104 // Requires ES3
105 // This tests a bug where in a masked clear when calling "ClearBuffer", we would
106 // mistakenly clear every channel (including the masked-out ones)
107 TEST_F(ClearTest, MaskedClearBufferBug)
108 {
109     unsigned char pixelData[] = { 255, 255, 255, 255 };
110
111     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
112
113     GLuint textures[2];
114     glGenTextures(2, &textures[0]);
115
116     glBindTexture(GL_TEXTURE_2D, textures[0]);
117     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
118     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0);
119
120     glBindTexture(GL_TEXTURE_2D, textures[1]);
121     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
122     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, textures[1], 0);
123
124     ASSERT_GL_NO_ERROR();
125     EXPECT_PIXEL_EQ(0, 0, 255, 255, 255, 255);
126
127     float clearValue[] = { 0, 0.5f, 0.5f, 1.0f };
128     GLenum drawBuffers[] = { GL_NONE, GL_COLOR_ATTACHMENT1 };
129     glDrawBuffers(2, drawBuffers);
130     glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
131     glClearBufferfv(GL_COLOR, 1, clearValue);
132
133     ASSERT_GL_NO_ERROR();
134     EXPECT_PIXEL_EQ(0, 0, 255, 255, 255, 255);
135
136     // TODO: glReadBuffer support
137     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, 0, 0);
138     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);
139     EXPECT_PIXEL_EQ(0, 0, 0, 127, 255, 255);
140
141     glDeleteTextures(2, textures);
142 }
143
144 TEST_F(ClearTest, BadFBOSerialBug)
145 {
146     // First make a simple framebuffer, and clear it to green
147     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
148
149     GLuint textures[2];
150     glGenTextures(2, &textures[0]);
151
152     glBindTexture(GL_TEXTURE_2D, textures[0]);
153     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
154     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0);
155
156     GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0 };
157     glDrawBuffers(1, drawBuffers);
158
159     float clearValues1[] = { 0.0f, 1.0f, 0.0f, 1.0f };
160     glClearBufferfv(GL_COLOR, 0, clearValues1);
161
162     ASSERT_GL_NO_ERROR();
163     EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
164
165     // Next make a second framebuffer, and draw it to red
166     // (Triggers bad applied render target serial)
167     GLuint fbo2;
168     glGenFramebuffers(1, &fbo2);
169     ASSERT_GL_NO_ERROR();
170
171     glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
172
173     glBindTexture(GL_TEXTURE_2D, textures[1]);
174     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
175     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);
176
177     glDrawBuffers(1, drawBuffers);
178
179     drawQuad(mProgram, "position", 0.5f);
180
181     ASSERT_GL_NO_ERROR();
182     EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
183
184     // Check that the first framebuffer is still green.
185     glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
186     EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
187
188     glDeleteTextures(2, textures);
189     glDeleteFramebuffers(1, &fbo2);
190 }