3 class ReadPixelsTest : public ANGLETest
12 setConfigGreenBits(8);
14 setConfigAlphaBits(8);
21 glGenBuffers(1, &mPBO);
22 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
23 glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), NULL, GL_STATIC_DRAW);
24 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
26 const char *vertexShaderSrc = SHADER_SOURCE
29 attribute vec2 aPosition;
35 gl_Position = vec4(aPosition, 0.0, 1.0);
40 const char *fragmentShaderSrc = SHADER_SOURCE
42 precision mediump float;
51 mProgram = CompileProgram(vertexShaderSrc, fragmentShaderSrc);
53 glGenTextures(1, &mTexture);
54 glBindTexture(GL_TEXTURE_2D, mTexture);
55 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 1);
57 glGenFramebuffers(1, &mFBO);
58 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
59 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
60 glBindFramebuffer(GL_FRAMEBUFFER, 0);
62 glGenBuffers(1, &mPositionVBO);
63 glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
64 glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW);
65 glBindBuffer(GL_ARRAY_BUFFER, 0);
70 virtual void TearDown()
72 ANGLETest::TearDown();
74 glDeleteBuffers(1, &mPBO);
75 glDeleteProgram(mProgram);
76 glDeleteTextures(1, &mTexture);
77 glDeleteFramebuffers(1, &mFBO);
87 TEST_F(ReadPixelsTest, OutOfBounds)
89 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
90 glClear(GL_COLOR_BUFFER_BIT);
93 GLsizei pixelsWidth = 32;
94 GLsizei pixelsHeight = 32;
96 std::vector<GLubyte> pixels((pixelsWidth + offset) * (pixelsHeight + offset) * 4);
98 glReadPixels(-offset, -offset, pixelsWidth + offset, pixelsHeight + offset, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
101 for (int y = pixelsHeight / 2; y < pixelsHeight; y++)
103 for (int x = pixelsWidth / 2; x < pixelsWidth; x++)
105 const GLubyte* pixel = pixels.data() + ((y * (pixelsWidth + offset) + x) * 4);
106 unsigned int r = static_cast<unsigned int>(pixel[0]);
107 unsigned int g = static_cast<unsigned int>(pixel[1]);
108 unsigned int b = static_cast<unsigned int>(pixel[2]);
109 unsigned int a = static_cast<unsigned int>(pixel[3]);
111 // Expect that all pixels which fell within the framebuffer are red
120 TEST_F(ReadPixelsTest, PBOWithOtherTarget)
122 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
123 glClear(GL_COLOR_BUFFER_BIT);
124 EXPECT_GL_NO_ERROR();
126 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
127 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
129 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
130 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
132 GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
133 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
134 EXPECT_GL_NO_ERROR();
136 EXPECT_EQ(255, dataPtr[0]);
137 EXPECT_EQ(0, dataPtr[1]);
138 EXPECT_EQ(0, dataPtr[2]);
139 EXPECT_EQ(255, dataPtr[3]);
141 glUnmapBuffer(GL_ARRAY_BUFFER);
142 EXPECT_GL_NO_ERROR();
145 TEST_F(ReadPixelsTest, PBOWithExistingData)
147 // Clear backbuffer to red
148 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
149 glClear(GL_COLOR_BUFFER_BIT);
150 EXPECT_GL_NO_ERROR();
152 // Read 16x16 region from red backbuffer to PBO
153 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
154 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
156 // Clear backbuffer to green
157 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
158 glClear(GL_COLOR_BUFFER_BIT);
159 EXPECT_GL_NO_ERROR();
161 // Read 16x16 region from green backbuffer to PBO at offset 16
162 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<GLvoid*>(16));
163 GLvoid * mappedPtr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT);
164 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
165 EXPECT_GL_NO_ERROR();
167 // Test pixel 0 is red (existing data)
168 EXPECT_EQ(255, dataPtr[0]);
169 EXPECT_EQ(0, dataPtr[1]);
170 EXPECT_EQ(0, dataPtr[2]);
171 EXPECT_EQ(255, dataPtr[3]);
173 // Test pixel 16 is green (new data)
174 EXPECT_EQ(0, dataPtr[16 * 4 + 0]);
175 EXPECT_EQ(255, dataPtr[16 * 4 + 1]);
176 EXPECT_EQ(0, dataPtr[16 * 4 + 2]);
177 EXPECT_EQ(255, dataPtr[16 * 4 + 3]);
179 glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
180 EXPECT_GL_NO_ERROR();
183 TEST_F(ReadPixelsTest, PBOAndSubData)
185 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
186 glClear(GL_COLOR_BUFFER_BIT);
187 EXPECT_GL_NO_ERROR();
189 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
190 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
192 unsigned char data[4] = { 1, 2, 3, 4 };
194 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
195 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
196 glBufferSubData(GL_ARRAY_BUFFER, 0, 4, data);
198 GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
199 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
200 EXPECT_GL_NO_ERROR();
202 EXPECT_EQ(1, dataPtr[0]);
203 EXPECT_EQ(2, dataPtr[1]);
204 EXPECT_EQ(3, dataPtr[2]);
205 EXPECT_EQ(4, dataPtr[3]);
207 glUnmapBuffer(GL_ARRAY_BUFFER);
208 EXPECT_GL_NO_ERROR();
211 TEST_F(ReadPixelsTest, PBOAndSubDataOffset)
213 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
214 glClear(GL_COLOR_BUFFER_BIT);
215 EXPECT_GL_NO_ERROR();
217 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
218 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
220 unsigned char data[4] = { 1, 2, 3, 4 };
222 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
223 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
224 glBufferSubData(GL_ARRAY_BUFFER, 16, 4, data);
226 GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
227 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
228 EXPECT_GL_NO_ERROR();
230 EXPECT_EQ(255, dataPtr[0]);
231 EXPECT_EQ(0, dataPtr[1]);
232 EXPECT_EQ(0, dataPtr[2]);
233 EXPECT_EQ(255, dataPtr[3]);
235 EXPECT_EQ(1, dataPtr[16]);
236 EXPECT_EQ(2, dataPtr[17]);
237 EXPECT_EQ(3, dataPtr[18]);
238 EXPECT_EQ(4, dataPtr[19]);
240 glUnmapBuffer(GL_ARRAY_BUFFER);
241 EXPECT_GL_NO_ERROR();
244 TEST_F(ReadPixelsTest, DrawWithPBO)
246 unsigned char data[4] = { 1, 2, 3, 4 };
248 glBindTexture(GL_TEXTURE_2D, mTexture);
249 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);
250 EXPECT_GL_NO_ERROR();
252 // glReadBuffer(GL_COLOR_ATTACHMENT0); // FIXME: currently UNIMPLEMENTED
253 glBindFramebuffer(GL_READ_FRAMEBUFFER, mFBO);
254 EXPECT_GL_NO_ERROR();
256 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
257 glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
258 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
259 EXPECT_GL_NO_ERROR();
261 float positionData[] = { 0.5f, 0.5f };
263 glUseProgram(mProgram);
264 glViewport(0, 0, 1, 1);
265 glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
266 glBufferSubData(GL_ARRAY_BUFFER, 0, 1 * 2 * 4, positionData);
267 EXPECT_GL_NO_ERROR();
269 GLint positionLocation = glGetAttribLocation(mProgram, "aPosition");
270 EXPECT_NE(-1, positionLocation);
272 GLint testLocation = glGetAttribLocation(mProgram, "aTest");
273 EXPECT_NE(-1, testLocation);
275 glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
276 glEnableVertexAttribArray(positionLocation);
277 EXPECT_GL_NO_ERROR();
279 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
280 glVertexAttribPointer(testLocation, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0);
281 glEnableVertexAttribArray(testLocation);
282 EXPECT_GL_NO_ERROR();
284 glDrawArrays(GL_POINTS, 0, 1);
285 EXPECT_GL_NO_ERROR();
288 glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);
289 EXPECT_GL_NO_ERROR();
291 EXPECT_EQ(1, data[0]);
292 EXPECT_EQ(2, data[1]);
293 EXPECT_EQ(3, data[2]);
294 EXPECT_EQ(4, data[3]);
297 TEST_F(ReadPixelsTest, MultisampledPBO)
300 glGenFramebuffers(1, &fbo);
301 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
304 glGenRenderbuffers(1, &rbo);
305 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
306 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 2, GL_RGBA8, 4, 4);
308 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
310 ASSERT_GL_NO_ERROR();
312 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
313 glClear(GL_COLOR_BUFFER_BIT);
315 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
317 EXPECT_GL_NO_ERROR();
319 glReadPixels(0, 0, 1, 1, GL_RGBA8, GL_UNSIGNED_BYTE, NULL);
321 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
323 glDeleteRenderbuffers(1, &rbo);
324 glDeleteFramebuffers(1, &fbo);