• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "ANGLETest.h"
2 
3 class ClearTest : public ANGLETest
4 {
5 protected:
ClearTest()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 
SetUp()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 
TearDown()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 
TEST_F(ClearTest,ClearIssue)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)
TEST_F(ClearTest,MaskedClearBufferBug)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 
TEST_F(ClearTest,BadFBOSerialBug)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 }
191