blob: 886e995e554d94de4709535894e2c8904d0a809f [file] [log] [blame]
Geoff Langf11dbdb2013-10-23 14:37:58 -04001#include "ANGLETest.h"
2
Austin Kinross18b931d2014-09-29 12:58:31 -07003// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
4typedef ::testing::Types<TFT<Gles::Three, Rend::D3D11>> TestFixtureTypes;
5TYPED_TEST_CASE(ReadPixelsTest, TestFixtureTypes);
6
7template<typename T>
Geoff Langf11dbdb2013-10-23 14:37:58 -04008class ReadPixelsTest : public ANGLETest
9{
10protected:
Austin Kinross18b931d2014-09-29 12:58:31 -070011 ReadPixelsTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
Geoff Langf11dbdb2013-10-23 14:37:58 -040012 {
13 setWindowWidth(32);
14 setWindowHeight(32);
15 setConfigRedBits(8);
16 setConfigGreenBits(8);
17 setConfigBlueBits(8);
18 setConfigAlphaBits(8);
19 }
Jamie Madill8a7bed82014-05-01 14:51:07 -040020
21 virtual void SetUp()
22 {
23 ANGLETest::SetUp();
24
25 glGenBuffers(1, &mPBO);
26 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
27 glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), NULL, GL_STATIC_DRAW);
28 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
29
30 const char *vertexShaderSrc = SHADER_SOURCE
31 (
32 attribute vec4 aTest;
33 attribute vec2 aPosition;
34 varying vec4 vTest;
35
36 void main()
37 {
38 vTest = aTest;
39 gl_Position = vec4(aPosition, 0.0, 1.0);
40 gl_PointSize = 1.0;
41 }
42 );
43
44 const char *fragmentShaderSrc = SHADER_SOURCE
45 (
46 precision mediump float;
47 varying vec4 vTest;
48
49 void main()
50 {
51 gl_FragColor = vTest;
52 }
53 );
54
Jamie Madill5599c8f2014-08-26 13:16:39 -040055 mProgram = CompileProgram(vertexShaderSrc, fragmentShaderSrc);
Jamie Madill8a7bed82014-05-01 14:51:07 -040056
57 glGenTextures(1, &mTexture);
58 glBindTexture(GL_TEXTURE_2D, mTexture);
59 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 1);
60
61 glGenFramebuffers(1, &mFBO);
62 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
63 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
64 glBindFramebuffer(GL_FRAMEBUFFER, 0);
65
66 glGenBuffers(1, &mPositionVBO);
67 glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
68 glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW);
69 glBindBuffer(GL_ARRAY_BUFFER, 0);
70
71 ASSERT_GL_NO_ERROR();
72 }
73
74 virtual void TearDown()
75 {
76 ANGLETest::TearDown();
77
78 glDeleteBuffers(1, &mPBO);
79 glDeleteProgram(mProgram);
80 glDeleteTextures(1, &mTexture);
81 glDeleteFramebuffers(1, &mFBO);
82 }
83
84 GLuint mPBO;
85 GLuint mProgram;
86 GLuint mTexture;
87 GLuint mFBO;
88 GLuint mPositionVBO;
Geoff Langf11dbdb2013-10-23 14:37:58 -040089};
90
Austin Kinross18b931d2014-09-29 12:58:31 -070091TYPED_TEST(ReadPixelsTest, OutOfBounds)
Geoff Langf11dbdb2013-10-23 14:37:58 -040092{
93 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
94 glClear(GL_COLOR_BUFFER_BIT);
95 EXPECT_GL_NO_ERROR();
96
97 GLsizei pixelsWidth = 32;
98 GLsizei pixelsHeight = 32;
Jamie Madill1eb5bd72014-03-28 10:43:39 -040099 GLint offset = 16;
100 std::vector<GLubyte> pixels((pixelsWidth + offset) * (pixelsHeight + offset) * 4);
Geoff Langf11dbdb2013-10-23 14:37:58 -0400101
Jamie Madill1eb5bd72014-03-28 10:43:39 -0400102 glReadPixels(-offset, -offset, pixelsWidth + offset, pixelsHeight + offset, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
Geoff Langf11dbdb2013-10-23 14:37:58 -0400103 EXPECT_GL_NO_ERROR();
104
105 for (int y = pixelsHeight / 2; y < pixelsHeight; y++)
106 {
107 for (int x = pixelsWidth / 2; x < pixelsWidth; x++)
108 {
Jamie Madill1eb5bd72014-03-28 10:43:39 -0400109 const GLubyte* pixel = pixels.data() + ((y * (pixelsWidth + offset) + x) * 4);
110 unsigned int r = static_cast<unsigned int>(pixel[0]);
111 unsigned int g = static_cast<unsigned int>(pixel[1]);
112 unsigned int b = static_cast<unsigned int>(pixel[2]);
113 unsigned int a = static_cast<unsigned int>(pixel[3]);
Geoff Langf11dbdb2013-10-23 14:37:58 -0400114
115 // Expect that all pixels which fell within the framebuffer are red
Jamie Madill1eb5bd72014-03-28 10:43:39 -0400116 EXPECT_EQ(255, r);
117 EXPECT_EQ(0, g);
118 EXPECT_EQ(0, b);
119 EXPECT_EQ(255, a);
Geoff Langf11dbdb2013-10-23 14:37:58 -0400120 }
121 }
122}
Jamie Madill8a7bed82014-05-01 14:51:07 -0400123
Austin Kinross18b931d2014-09-29 12:58:31 -0700124TYPED_TEST(ReadPixelsTest, PBOWithOtherTarget)
Jamie Madill8a7bed82014-05-01 14:51:07 -0400125{
126 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
127 glClear(GL_COLOR_BUFFER_BIT);
128 EXPECT_GL_NO_ERROR();
129
130 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
131 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
132
133 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
134 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
135
136 GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
137 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
138 EXPECT_GL_NO_ERROR();
139
140 EXPECT_EQ(255, dataPtr[0]);
141 EXPECT_EQ(0, dataPtr[1]);
142 EXPECT_EQ(0, dataPtr[2]);
143 EXPECT_EQ(255, dataPtr[3]);
144
145 glUnmapBuffer(GL_ARRAY_BUFFER);
146 EXPECT_GL_NO_ERROR();
147}
Jamie Madill2b5c9cb2014-04-29 16:17:22 -0400148
Austin Kinross18b931d2014-09-29 12:58:31 -0700149TYPED_TEST(ReadPixelsTest, PBOWithExistingData)
Jamie Madill2b5c9cb2014-04-29 16:17:22 -0400150{
151 // Clear backbuffer to red
152 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
153 glClear(GL_COLOR_BUFFER_BIT);
154 EXPECT_GL_NO_ERROR();
155
156 // Read 16x16 region from red backbuffer to PBO
157 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
158 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
159
160 // Clear backbuffer to green
161 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
162 glClear(GL_COLOR_BUFFER_BIT);
163 EXPECT_GL_NO_ERROR();
164
165 // Read 16x16 region from green backbuffer to PBO at offset 16
166 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<GLvoid*>(16));
167 GLvoid * mappedPtr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT);
168 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
169 EXPECT_GL_NO_ERROR();
170
171 // Test pixel 0 is red (existing data)
172 EXPECT_EQ(255, dataPtr[0]);
173 EXPECT_EQ(0, dataPtr[1]);
174 EXPECT_EQ(0, dataPtr[2]);
175 EXPECT_EQ(255, dataPtr[3]);
176
177 // Test pixel 16 is green (new data)
178 EXPECT_EQ(0, dataPtr[16 * 4 + 0]);
179 EXPECT_EQ(255, dataPtr[16 * 4 + 1]);
180 EXPECT_EQ(0, dataPtr[16 * 4 + 2]);
181 EXPECT_EQ(255, dataPtr[16 * 4 + 3]);
182
183 glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
184 EXPECT_GL_NO_ERROR();
185}
Jamie Madill14764a02014-05-08 10:19:20 -0400186
Austin Kinross18b931d2014-09-29 12:58:31 -0700187TYPED_TEST(ReadPixelsTest, PBOAndSubData)
Jamie Madill14764a02014-05-08 10:19:20 -0400188{
189 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
190 glClear(GL_COLOR_BUFFER_BIT);
191 EXPECT_GL_NO_ERROR();
192
193 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
194 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
195
196 unsigned char data[4] = { 1, 2, 3, 4 };
197
198 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
199 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
200 glBufferSubData(GL_ARRAY_BUFFER, 0, 4, data);
201
202 GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
203 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
204 EXPECT_GL_NO_ERROR();
205
206 EXPECT_EQ(1, dataPtr[0]);
207 EXPECT_EQ(2, dataPtr[1]);
208 EXPECT_EQ(3, dataPtr[2]);
209 EXPECT_EQ(4, dataPtr[3]);
210
211 glUnmapBuffer(GL_ARRAY_BUFFER);
212 EXPECT_GL_NO_ERROR();
213}
214
Austin Kinross18b931d2014-09-29 12:58:31 -0700215TYPED_TEST(ReadPixelsTest, PBOAndSubDataOffset)
Jamie Madill14764a02014-05-08 10:19:20 -0400216{
217 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
218 glClear(GL_COLOR_BUFFER_BIT);
219 EXPECT_GL_NO_ERROR();
220
221 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
222 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
223
224 unsigned char data[4] = { 1, 2, 3, 4 };
225
226 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
227 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
228 glBufferSubData(GL_ARRAY_BUFFER, 16, 4, data);
229
230 GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
231 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
232 EXPECT_GL_NO_ERROR();
233
234 EXPECT_EQ(255, dataPtr[0]);
235 EXPECT_EQ(0, dataPtr[1]);
236 EXPECT_EQ(0, dataPtr[2]);
237 EXPECT_EQ(255, dataPtr[3]);
238
239 EXPECT_EQ(1, dataPtr[16]);
240 EXPECT_EQ(2, dataPtr[17]);
241 EXPECT_EQ(3, dataPtr[18]);
242 EXPECT_EQ(4, dataPtr[19]);
243
244 glUnmapBuffer(GL_ARRAY_BUFFER);
245 EXPECT_GL_NO_ERROR();
246}
Jamie Madill5fedd012014-05-08 10:19:36 -0400247
Austin Kinross18b931d2014-09-29 12:58:31 -0700248TYPED_TEST(ReadPixelsTest, DrawWithPBO)
Jamie Madill5fedd012014-05-08 10:19:36 -0400249{
250 unsigned char data[4] = { 1, 2, 3, 4 };
251
252 glBindTexture(GL_TEXTURE_2D, mTexture);
253 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);
254 EXPECT_GL_NO_ERROR();
255
256 // glReadBuffer(GL_COLOR_ATTACHMENT0); // FIXME: currently UNIMPLEMENTED
257 glBindFramebuffer(GL_READ_FRAMEBUFFER, mFBO);
258 EXPECT_GL_NO_ERROR();
259
260 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
261 glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
262 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
263 EXPECT_GL_NO_ERROR();
264
265 float positionData[] = { 0.5f, 0.5f };
266
267 glUseProgram(mProgram);
268 glViewport(0, 0, 1, 1);
269 glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
270 glBufferSubData(GL_ARRAY_BUFFER, 0, 1 * 2 * 4, positionData);
271 EXPECT_GL_NO_ERROR();
272
273 GLint positionLocation = glGetAttribLocation(mProgram, "aPosition");
274 EXPECT_NE(-1, positionLocation);
275
276 GLint testLocation = glGetAttribLocation(mProgram, "aTest");
277 EXPECT_NE(-1, testLocation);
278
279 glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
280 glEnableVertexAttribArray(positionLocation);
281 EXPECT_GL_NO_ERROR();
282
283 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
284 glVertexAttribPointer(testLocation, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0);
285 glEnableVertexAttribArray(testLocation);
286 EXPECT_GL_NO_ERROR();
287
288 glDrawArrays(GL_POINTS, 0, 1);
289 EXPECT_GL_NO_ERROR();
290
291 memset(data, 0, 4);
292 glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);
293 EXPECT_GL_NO_ERROR();
294
295 EXPECT_EQ(1, data[0]);
296 EXPECT_EQ(2, data[1]);
297 EXPECT_EQ(3, data[2]);
298 EXPECT_EQ(4, data[3]);
299}
Jamie Madill4fbd36e2014-07-29 15:20:48 -0400300
Austin Kinross18b931d2014-09-29 12:58:31 -0700301TYPED_TEST(ReadPixelsTest, MultisampledPBO)
Jamie Madill4fbd36e2014-07-29 15:20:48 -0400302{
303 GLuint fbo;
304 glGenFramebuffers(1, &fbo);
305 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
306
307 GLuint rbo;
308 glGenRenderbuffers(1, &rbo);
309 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
310 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 2, GL_RGBA8, 4, 4);
311
312 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
313
314 ASSERT_GL_NO_ERROR();
315
316 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
317 glClear(GL_COLOR_BUFFER_BIT);
318
319 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
320
321 EXPECT_GL_NO_ERROR();
322
323 glReadPixels(0, 0, 1, 1, GL_RGBA8, GL_UNSIGNED_BYTE, NULL);
324
325 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
326
327 glDeleteRenderbuffers(1, &rbo);
328 glDeleteFramebuffers(1, &fbo);
329}