blob: d54081cd2508f1172c92673e1e5739fd3bfc40b1 [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.
Geoff Lang0d3683c2014-10-23 11:08:16 -04004ANGLE_TYPED_TEST_CASE(ReadPixelsTest, ES3_D3D11);
Austin Kinross18b931d2014-09-29 12:58:31 -07005
6template<typename T>
Geoff Langf11dbdb2013-10-23 14:37:58 -04007class ReadPixelsTest : public ANGLETest
8{
9protected:
Geoff Lang0d3683c2014-10-23 11:08:16 -040010 ReadPixelsTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetPlatform())
Geoff Langf11dbdb2013-10-23 14:37:58 -040011 {
12 setWindowWidth(32);
13 setWindowHeight(32);
14 setConfigRedBits(8);
15 setConfigGreenBits(8);
16 setConfigBlueBits(8);
17 setConfigAlphaBits(8);
18 }
Jamie Madill8a7bed82014-05-01 14:51:07 -040019
20 virtual void SetUp()
21 {
22 ANGLETest::SetUp();
23
24 glGenBuffers(1, &mPBO);
25 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
26 glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), NULL, GL_STATIC_DRAW);
27 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
28
29 const char *vertexShaderSrc = SHADER_SOURCE
30 (
31 attribute vec4 aTest;
32 attribute vec2 aPosition;
33 varying vec4 vTest;
34
35 void main()
36 {
37 vTest = aTest;
38 gl_Position = vec4(aPosition, 0.0, 1.0);
39 gl_PointSize = 1.0;
40 }
41 );
42
43 const char *fragmentShaderSrc = SHADER_SOURCE
44 (
45 precision mediump float;
46 varying vec4 vTest;
47
48 void main()
49 {
50 gl_FragColor = vTest;
51 }
52 );
53
Jamie Madill5599c8f2014-08-26 13:16:39 -040054 mProgram = CompileProgram(vertexShaderSrc, fragmentShaderSrc);
Jamie Madill8a7bed82014-05-01 14:51:07 -040055
56 glGenTextures(1, &mTexture);
57 glBindTexture(GL_TEXTURE_2D, mTexture);
58 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 1);
59
60 glGenFramebuffers(1, &mFBO);
61 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
62 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
63 glBindFramebuffer(GL_FRAMEBUFFER, 0);
64
65 glGenBuffers(1, &mPositionVBO);
66 glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
67 glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW);
68 glBindBuffer(GL_ARRAY_BUFFER, 0);
69
70 ASSERT_GL_NO_ERROR();
71 }
72
73 virtual void TearDown()
74 {
75 ANGLETest::TearDown();
76
77 glDeleteBuffers(1, &mPBO);
78 glDeleteProgram(mProgram);
79 glDeleteTextures(1, &mTexture);
80 glDeleteFramebuffers(1, &mFBO);
81 }
82
83 GLuint mPBO;
84 GLuint mProgram;
85 GLuint mTexture;
86 GLuint mFBO;
87 GLuint mPositionVBO;
Geoff Langf11dbdb2013-10-23 14:37:58 -040088};
89
Austin Kinross18b931d2014-09-29 12:58:31 -070090TYPED_TEST(ReadPixelsTest, OutOfBounds)
Geoff Langf11dbdb2013-10-23 14:37:58 -040091{
92 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
93 glClear(GL_COLOR_BUFFER_BIT);
94 EXPECT_GL_NO_ERROR();
95
96 GLsizei pixelsWidth = 32;
97 GLsizei pixelsHeight = 32;
Jamie Madill1eb5bd72014-03-28 10:43:39 -040098 GLint offset = 16;
99 std::vector<GLubyte> pixels((pixelsWidth + offset) * (pixelsHeight + offset) * 4);
Geoff Langf11dbdb2013-10-23 14:37:58 -0400100
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400101 glReadPixels(-offset, -offset, pixelsWidth + offset, pixelsHeight + offset, GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0]);
Geoff Langf11dbdb2013-10-23 14:37:58 -0400102 EXPECT_GL_NO_ERROR();
103
104 for (int y = pixelsHeight / 2; y < pixelsHeight; y++)
105 {
106 for (int x = pixelsWidth / 2; x < pixelsWidth; x++)
107 {
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400108 const GLubyte* pixel = &pixels[0] + ((y * (pixelsWidth + offset) + x) * 4);
Jamie Madill1eb5bd72014-03-28 10:43:39 -0400109 unsigned int r = static_cast<unsigned int>(pixel[0]);
110 unsigned int g = static_cast<unsigned int>(pixel[1]);
111 unsigned int b = static_cast<unsigned int>(pixel[2]);
112 unsigned int a = static_cast<unsigned int>(pixel[3]);
Geoff Langf11dbdb2013-10-23 14:37:58 -0400113
114 // Expect that all pixels which fell within the framebuffer are red
Jamie Madill1eb5bd72014-03-28 10:43:39 -0400115 EXPECT_EQ(255, r);
116 EXPECT_EQ(0, g);
117 EXPECT_EQ(0, b);
118 EXPECT_EQ(255, a);
Geoff Langf11dbdb2013-10-23 14:37:58 -0400119 }
120 }
121}
Jamie Madill8a7bed82014-05-01 14:51:07 -0400122
Austin Kinross18b931d2014-09-29 12:58:31 -0700123TYPED_TEST(ReadPixelsTest, PBOWithOtherTarget)
Jamie Madill8a7bed82014-05-01 14:51:07 -0400124{
125 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
126 glClear(GL_COLOR_BUFFER_BIT);
127 EXPECT_GL_NO_ERROR();
128
129 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
130 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
131
132 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
133 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
134
135 GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
136 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
137 EXPECT_GL_NO_ERROR();
138
139 EXPECT_EQ(255, dataPtr[0]);
140 EXPECT_EQ(0, dataPtr[1]);
141 EXPECT_EQ(0, dataPtr[2]);
142 EXPECT_EQ(255, dataPtr[3]);
143
144 glUnmapBuffer(GL_ARRAY_BUFFER);
145 EXPECT_GL_NO_ERROR();
146}
Jamie Madill2b5c9cb2014-04-29 16:17:22 -0400147
Austin Kinross18b931d2014-09-29 12:58:31 -0700148TYPED_TEST(ReadPixelsTest, PBOWithExistingData)
Jamie Madill2b5c9cb2014-04-29 16:17:22 -0400149{
150 // Clear backbuffer to red
151 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
152 glClear(GL_COLOR_BUFFER_BIT);
153 EXPECT_GL_NO_ERROR();
154
155 // Read 16x16 region from red backbuffer to PBO
156 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
157 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
158
159 // Clear backbuffer to green
160 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
161 glClear(GL_COLOR_BUFFER_BIT);
162 EXPECT_GL_NO_ERROR();
163
164 // Read 16x16 region from green backbuffer to PBO at offset 16
165 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<GLvoid*>(16));
166 GLvoid * mappedPtr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT);
167 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
168 EXPECT_GL_NO_ERROR();
169
170 // Test pixel 0 is red (existing data)
171 EXPECT_EQ(255, dataPtr[0]);
172 EXPECT_EQ(0, dataPtr[1]);
173 EXPECT_EQ(0, dataPtr[2]);
174 EXPECT_EQ(255, dataPtr[3]);
175
176 // Test pixel 16 is green (new data)
177 EXPECT_EQ(0, dataPtr[16 * 4 + 0]);
178 EXPECT_EQ(255, dataPtr[16 * 4 + 1]);
179 EXPECT_EQ(0, dataPtr[16 * 4 + 2]);
180 EXPECT_EQ(255, dataPtr[16 * 4 + 3]);
181
182 glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
183 EXPECT_GL_NO_ERROR();
184}
Jamie Madill14764a02014-05-08 10:19:20 -0400185
Austin Kinross18b931d2014-09-29 12:58:31 -0700186TYPED_TEST(ReadPixelsTest, PBOAndSubData)
Jamie Madill14764a02014-05-08 10:19:20 -0400187{
188 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
189 glClear(GL_COLOR_BUFFER_BIT);
190 EXPECT_GL_NO_ERROR();
191
192 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
193 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
194
195 unsigned char data[4] = { 1, 2, 3, 4 };
196
197 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
198 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
199 glBufferSubData(GL_ARRAY_BUFFER, 0, 4, data);
200
201 GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
202 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
203 EXPECT_GL_NO_ERROR();
204
205 EXPECT_EQ(1, dataPtr[0]);
206 EXPECT_EQ(2, dataPtr[1]);
207 EXPECT_EQ(3, dataPtr[2]);
208 EXPECT_EQ(4, dataPtr[3]);
209
210 glUnmapBuffer(GL_ARRAY_BUFFER);
211 EXPECT_GL_NO_ERROR();
212}
213
Austin Kinross18b931d2014-09-29 12:58:31 -0700214TYPED_TEST(ReadPixelsTest, PBOAndSubDataOffset)
Jamie Madill14764a02014-05-08 10:19:20 -0400215{
216 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
217 glClear(GL_COLOR_BUFFER_BIT);
218 EXPECT_GL_NO_ERROR();
219
220 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
221 glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
222
223 unsigned char data[4] = { 1, 2, 3, 4 };
224
225 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
226 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
227 glBufferSubData(GL_ARRAY_BUFFER, 16, 4, data);
228
229 GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
230 unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
231 EXPECT_GL_NO_ERROR();
232
233 EXPECT_EQ(255, dataPtr[0]);
234 EXPECT_EQ(0, dataPtr[1]);
235 EXPECT_EQ(0, dataPtr[2]);
236 EXPECT_EQ(255, dataPtr[3]);
237
238 EXPECT_EQ(1, dataPtr[16]);
239 EXPECT_EQ(2, dataPtr[17]);
240 EXPECT_EQ(3, dataPtr[18]);
241 EXPECT_EQ(4, dataPtr[19]);
242
243 glUnmapBuffer(GL_ARRAY_BUFFER);
244 EXPECT_GL_NO_ERROR();
245}
Jamie Madill5fedd012014-05-08 10:19:36 -0400246
Austin Kinross18b931d2014-09-29 12:58:31 -0700247TYPED_TEST(ReadPixelsTest, DrawWithPBO)
Jamie Madill5fedd012014-05-08 10:19:36 -0400248{
249 unsigned char data[4] = { 1, 2, 3, 4 };
250
251 glBindTexture(GL_TEXTURE_2D, mTexture);
252 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);
253 EXPECT_GL_NO_ERROR();
254
255 // glReadBuffer(GL_COLOR_ATTACHMENT0); // FIXME: currently UNIMPLEMENTED
256 glBindFramebuffer(GL_READ_FRAMEBUFFER, mFBO);
257 EXPECT_GL_NO_ERROR();
258
259 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
260 glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
261 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
262 EXPECT_GL_NO_ERROR();
263
264 float positionData[] = { 0.5f, 0.5f };
265
266 glUseProgram(mProgram);
267 glViewport(0, 0, 1, 1);
268 glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
269 glBufferSubData(GL_ARRAY_BUFFER, 0, 1 * 2 * 4, positionData);
270 EXPECT_GL_NO_ERROR();
271
272 GLint positionLocation = glGetAttribLocation(mProgram, "aPosition");
273 EXPECT_NE(-1, positionLocation);
274
275 GLint testLocation = glGetAttribLocation(mProgram, "aTest");
276 EXPECT_NE(-1, testLocation);
277
278 glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
279 glEnableVertexAttribArray(positionLocation);
280 EXPECT_GL_NO_ERROR();
281
282 glBindBuffer(GL_ARRAY_BUFFER, mPBO);
283 glVertexAttribPointer(testLocation, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0);
284 glEnableVertexAttribArray(testLocation);
285 EXPECT_GL_NO_ERROR();
286
287 glDrawArrays(GL_POINTS, 0, 1);
288 EXPECT_GL_NO_ERROR();
289
290 memset(data, 0, 4);
291 glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);
292 EXPECT_GL_NO_ERROR();
293
294 EXPECT_EQ(1, data[0]);
295 EXPECT_EQ(2, data[1]);
296 EXPECT_EQ(3, data[2]);
297 EXPECT_EQ(4, data[3]);
298}
Jamie Madill4fbd36e2014-07-29 15:20:48 -0400299
Austin Kinross18b931d2014-09-29 12:58:31 -0700300TYPED_TEST(ReadPixelsTest, MultisampledPBO)
Jamie Madill4fbd36e2014-07-29 15:20:48 -0400301{
Geoff Langa8091652015-04-27 10:53:55 -0400302 if (getClientVersion() < 3 && !extensionEnabled("GL_ANGLE_framebuffer_multisample"))
303 {
304 std::cout << "Test skipped because ES3 or GL_ANGLE_framebuffer_multisample is not available." << std::endl;
305 return;
306 }
307
Jamie Madill4fbd36e2014-07-29 15:20:48 -0400308 GLuint fbo;
309 glGenFramebuffers(1, &fbo);
310 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
311
312 GLuint rbo;
313 glGenRenderbuffers(1, &rbo);
314 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
Geoff Langa8091652015-04-27 10:53:55 -0400315
316 if (extensionEnabled("GL_ANGLE_framebuffer_multisample"))
317 {
318 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 2, GL_RGBA8, 4, 4);
319 }
320 else
321 {
322 glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_RGBA8, 4, 4);
323 }
Jamie Madill4fbd36e2014-07-29 15:20:48 -0400324
325 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
326
327 ASSERT_GL_NO_ERROR();
328
329 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
330 glClear(GL_COLOR_BUFFER_BIT);
331
332 glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
333
334 EXPECT_GL_NO_ERROR();
335
336 glReadPixels(0, 0, 1, 1, GL_RGBA8, GL_UNSIGNED_BYTE, NULL);
337
338 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
339
340 glDeleteRenderbuffers(1, &rbo);
341 glDeleteFramebuffers(1, &fbo);
342}