blob: a8c0476b62543972e0ea4aaad43b0b01830e9809 [file] [log] [blame]
Geoff Langd1913172013-10-18 16:15:10 -04001#include "ANGLETest.h"
2
3class ClearTest : public ANGLETest
4{
5protected:
6 ClearTest()
7 {
8 setWindowWidth(128);
9 setWindowHeight(128);
Geoff Langefc551f2013-10-31 10:20:28 -040010 setConfigRedBits(8);
11 setConfigGreenBits(8);
12 setConfigBlueBits(8);
13 setConfigAlphaBits(8);
14 setConfigDepthBits(24);
Jamie Madilla09403c2014-07-21 10:03:36 -040015 setClientVersion(3);
Geoff Langd1913172013-10-18 16:15:10 -040016 }
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
Jamie Madill5599c8f2014-08-26 13:16:39 -040043 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
Geoff Langd1913172013-10-18 16:15:10 -040044 if (mProgram == 0)
45 {
46 FAIL() << "shader compilation failed.";
47 }
Jamie Madilla09403c2014-07-21 10:03:36 -040048
49 glGenFramebuffers(1, &mFBO);
50
51 ASSERT_GL_NO_ERROR();
Geoff Langd1913172013-10-18 16:15:10 -040052 }
53
54 virtual void TearDown()
55 {
56 glDeleteProgram(mProgram);
Jamie Madilla09403c2014-07-21 10:03:36 -040057 glDeleteFramebuffers(1, &mFBO);
Geoff Langd1913172013-10-18 16:15:10 -040058
59 ANGLETest::TearDown();
60 }
61
62 GLuint mProgram;
Jamie Madilla09403c2014-07-21 10:03:36 -040063 GLuint mFBO;
Geoff Langd1913172013-10-18 16:15:10 -040064};
65
Jamie Madillb759a742014-07-17 10:40:49 -040066TEST_F(ClearTest, ClearIssue)
Geoff Langd1913172013-10-18 16:15:10 -040067{
Geoff Langd1913172013-10-18 16:15:10 -040068 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
Jamie Madilla09403c2014-07-21 10:03:36 -040077 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
Geoff Langd1913172013-10-18 16:15:10 -040078
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}
Jamie Madilla09403c2014-07-21 10:03:36 -0400103
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)
107TEST_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);
Jamie Madillc4833262014-09-18 16:18:26 -0400140
141 glDeleteTextures(2, textures);
142}
143
144TEST_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);
Jamie Madilla09403c2014-07-21 10:03:36 -0400190}