blob: 8627c2c0c473aae6ff09208d085c549102734295 [file] [log] [blame]
Geoff Lange8a1f782013-10-18 16:14:30 -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(BlitFramebufferANGLETest, ES2_D3D9, ES2_D3D11);
Austin Kinross18b931d2014-09-29 12:58:31 -07005
6template<typename T>
Geoff Lange8a1f782013-10-18 16:14:30 -04007class BlitFramebufferANGLETest : public ANGLETest
8{
9protected:
Geoff Lang0d3683c2014-10-23 11:08:16 -040010 BlitFramebufferANGLETest() : ANGLETest(T::GetGlesMajorVersion(), T::GetPlatform())
Geoff Lange8a1f782013-10-18 16:14:30 -040011 {
12 setWindowWidth(256);
13 setWindowHeight(256);
Geoff Langefc551f2013-10-31 10:20:28 -040014 setConfigRedBits(8);
15 setConfigGreenBits(8);
16 setConfigBlueBits(8);
17 setConfigAlphaBits(8);
18 setConfigDepthBits(24);
Geoff Lange8a1f782013-10-18 16:14:30 -040019
20 mCheckerProgram = 0;
21 mBlueProgram = 0;
22
23 mOriginalFBO = 0;
24
25 mUserFBO = 0;
26 mUserColorBuffer = 0;
27 mUserDepthStencilBuffer = 0;
28
29 mSmallFBO = 0;
30 mSmallColorBuffer = 0;
31 mSmallDepthStencilBuffer = 0;
32
33 mColorOnlyFBO = 0;
34 mColorOnlyColorBuffer = 0;
35
36 mDiffFormatFBO = 0;
37 mDiffFormatColorBuffer = 0;
38
39 mDiffSizeFBO = 0;
40 mDiffSizeColorBuffer = 0;
41
42 mMRTFBO = 0;
43 mMRTColorBuffer0 = 0;
44 mMRTColorBuffer1 = 0;
Jamie Madillc93d6f32014-04-15 16:12:41 -040045
46 mRGBAColorbuffer = 0;
47 mRGBAFBO = 0;
48
49 mBGRAMultisampledRenderbuffer = 0;
50 mBGRAMultisampledFBO = 0;
Geoff Lange8a1f782013-10-18 16:14:30 -040051 }
52
53 virtual void SetUp()
54 {
55 ANGLETest::SetUp();
56
57 const std::string passthroughVS = SHADER_SOURCE
58 (
59 precision highp float;
60 attribute vec4 position;
61 varying vec4 pos;
62
63 void main()
64 {
65 gl_Position = position;
66 pos = position;
67 }
68 );
69
70 const std::string checkeredFS = SHADER_SOURCE
71 (
72 precision highp float;
73 varying vec4 pos;
74
75 void main()
76 {
77 if (pos.x * pos.y > 0.0)
78 {
79 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
80 }
81 else
82 {
83 gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
84 }
85 }
86 );
87
88 const std::string blueFS = SHADER_SOURCE
89 (
90 precision highp float;
91 varying vec4 pos;
92
93 void main()
94 {
95 gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
96 }
97 );
98
Jamie Madill5599c8f2014-08-26 13:16:39 -040099 mCheckerProgram = CompileProgram(passthroughVS, checkeredFS);
100 mBlueProgram = CompileProgram(passthroughVS, blueFS);
Geoff Lange8a1f782013-10-18 16:14:30 -0400101 if (mCheckerProgram == 0 || mBlueProgram == 0)
102 {
103 FAIL() << "shader compilation failed.";
104 }
105
106 EXPECT_GL_NO_ERROR();
107
108 GLint originalFBO;
109 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFBO);
110 if (originalFBO >= 0)
111 {
112 mOriginalFBO = (GLuint)originalFBO;
113 }
114
115 GLenum format = GL_BGRA8_EXT;
116
117 glGenFramebuffers(1, &mUserFBO);
118 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
119 glGenTextures(1, &mUserColorBuffer);
120 glGenRenderbuffers(1, &mUserDepthStencilBuffer);
121 glBindTexture(GL_TEXTURE_2D, mUserColorBuffer);
122 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight());
123 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mUserColorBuffer, 0);
124 glBindRenderbuffer(GL_RENDERBUFFER, mUserDepthStencilBuffer);
125 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth(), getWindowHeight());
126 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer);
127 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer);
128
Jamie Madillc93d6f32014-04-15 16:12:41 -0400129 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400130 ASSERT_GL_NO_ERROR();
131
132 glGenFramebuffers(1, &mSmallFBO);
133 glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
134 glGenTextures(1, &mSmallColorBuffer);
135 glGenRenderbuffers(1, &mSmallDepthStencilBuffer);
136 glBindTexture(GL_TEXTURE_2D, mSmallColorBuffer);
137 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth() / 2, getWindowHeight() / 2);
138 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mSmallColorBuffer, 0);
139 glBindRenderbuffer(GL_RENDERBUFFER, mSmallDepthStencilBuffer);
140 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth() / 2, getWindowHeight() / 2);
141 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer);
142 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer);
143
Jamie Madillc93d6f32014-04-15 16:12:41 -0400144 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400145 ASSERT_GL_NO_ERROR();
146
147 glGenFramebuffers(1, &mColorOnlyFBO);
148 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
149 glGenTextures(1, &mColorOnlyColorBuffer);
150 glBindTexture(GL_TEXTURE_2D, mColorOnlyColorBuffer);
151 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight());
152 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mColorOnlyColorBuffer, 0);
153
Jamie Madillc93d6f32014-04-15 16:12:41 -0400154 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400155 ASSERT_GL_NO_ERROR();
156
157 glGenFramebuffers(1, &mDiffFormatFBO);
158 glBindFramebuffer(GL_FRAMEBUFFER, mDiffFormatFBO);
159 glGenTextures(1, &mDiffFormatColorBuffer);
160 glBindTexture(GL_TEXTURE_2D, mDiffFormatColorBuffer);
161 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB565, getWindowWidth(), getWindowHeight());
162 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffFormatColorBuffer, 0);
163
Jamie Madillc93d6f32014-04-15 16:12:41 -0400164 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400165 ASSERT_GL_NO_ERROR();
166
167 glGenFramebuffers(1, &mDiffSizeFBO);
168 glBindFramebuffer(GL_FRAMEBUFFER, mDiffSizeFBO);
169 glGenTextures(1, &mDiffSizeColorBuffer);
170 glBindTexture(GL_TEXTURE_2D, mDiffSizeColorBuffer);
171 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth()*2, getWindowHeight()*2);
172 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffSizeColorBuffer, 0);
173
Jamie Madillc93d6f32014-04-15 16:12:41 -0400174 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400175 ASSERT_GL_NO_ERROR();
176
177 if (extensionEnabled("GL_EXT_draw_buffers"))
178 {
179 glGenFramebuffers(1, &mMRTFBO);
180 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
181 glGenTextures(1, &mMRTColorBuffer0);
182 glGenTextures(1, &mMRTColorBuffer1);
183 glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer0);
184 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight());
185 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
186 glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer1);
187 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight());
188 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0);
189
Jamie Madillc93d6f32014-04-15 16:12:41 -0400190 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400191 ASSERT_GL_NO_ERROR();
192 }
193
Jamie Madillc93d6f32014-04-15 16:12:41 -0400194 if (extensionEnabled("GL_ANGLE_framebuffer_multisample"))
195 {
196 // Test blit between RGBA and multisampled BGRA
197 glGenTextures(1, &mRGBAColorbuffer);
198 glBindTexture(GL_TEXTURE_2D, mRGBAColorbuffer);
199 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, getWindowWidth(), getWindowHeight());
200
201 glGenFramebuffers(1, &mRGBAFBO);
202 glBindFramebuffer(GL_FRAMEBUFFER, mRGBAFBO);
203 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mRGBAColorbuffer, 0);
204
205 ASSERT_GL_NO_ERROR();
206 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
207
208 glGenRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
209 glBindRenderbuffer(GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
210 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_BGRA8_EXT, getWindowWidth(), getWindowHeight());
211
212 glGenFramebuffers(1, &mBGRAMultisampledFBO);
213 glBindFramebuffer(GL_FRAMEBUFFER, mBGRAMultisampledFBO);
214 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
215
216 ASSERT_GL_NO_ERROR();
217 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
218 }
219
Geoff Lange8a1f782013-10-18 16:14:30 -0400220 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
221 }
222
223 virtual void TearDown()
224 {
225 glDeleteProgram(mCheckerProgram);
226 glDeleteProgram(mBlueProgram);
227
228 glDeleteFramebuffers(1, &mUserFBO);
229 glDeleteTextures(1, &mUserColorBuffer);
230 glDeleteRenderbuffers(1, &mUserDepthStencilBuffer);
231
232 glDeleteFramebuffers(1, &mSmallFBO);
233 glDeleteTextures(1, &mSmallColorBuffer);
234 glDeleteRenderbuffers(1, &mSmallDepthStencilBuffer);
235
236 glDeleteFramebuffers(1, &mColorOnlyFBO);
237 glDeleteTextures(1, &mSmallDepthStencilBuffer);
238
239 glDeleteFramebuffers(1, &mDiffFormatFBO);
240 glDeleteTextures(1, &mDiffFormatColorBuffer);
241
242 glDeleteFramebuffers(1, &mDiffSizeFBO);
243 glDeleteTextures(1, &mDiffSizeColorBuffer);
244
245 if (extensionEnabled("GL_EXT_draw_buffers"))
246 {
247 glDeleteFramebuffers(1, &mMRTFBO);
248 glDeleteTextures(1, &mMRTColorBuffer0);
249 glDeleteTextures(1, &mMRTColorBuffer1);
250 }
251
Jamie Madillc93d6f32014-04-15 16:12:41 -0400252 if (mRGBAColorbuffer != 0)
253 {
254 glDeleteTextures(1, &mRGBAColorbuffer);
255 }
256
257 if (mRGBAFBO != 0)
258 {
259 glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
260 }
261
262 if (mBGRAMultisampledRenderbuffer != 0)
263 {
264 glDeleteRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
265 }
266
267 if (mBGRAMultisampledFBO != 0)
268 {
269 glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
270 }
271
Geoff Lange8a1f782013-10-18 16:14:30 -0400272 ANGLETest::TearDown();
273 }
274
275 GLuint mCheckerProgram;
276 GLuint mBlueProgram;
277
278 GLuint mOriginalFBO;
279
280 GLuint mUserFBO;
281 GLuint mUserColorBuffer;
282 GLuint mUserDepthStencilBuffer;
283
284 GLuint mSmallFBO;
285 GLuint mSmallColorBuffer;
286 GLuint mSmallDepthStencilBuffer;
287
288 GLuint mColorOnlyFBO;
289 GLuint mColorOnlyColorBuffer;
290
291 GLuint mDiffFormatFBO;
292 GLuint mDiffFormatColorBuffer;
293
294 GLuint mDiffSizeFBO;
295 GLuint mDiffSizeColorBuffer;
296
297 GLuint mMRTFBO;
298 GLuint mMRTColorBuffer0;
299 GLuint mMRTColorBuffer1;
Jamie Madillc93d6f32014-04-15 16:12:41 -0400300
301 GLuint mRGBAColorbuffer;
302 GLuint mRGBAFBO;
303
304 GLuint mBGRAMultisampledRenderbuffer;
305 GLuint mBGRAMultisampledFBO;
Geoff Lange8a1f782013-10-18 16:14:30 -0400306};
307
308// Draw to user-created framebuffer, blit whole-buffer color to original framebuffer.
Austin Kinross18b931d2014-09-29 12:58:31 -0700309TYPED_TEST(BlitFramebufferANGLETest, BlitColorToDefault)
Geoff Lange8a1f782013-10-18 16:14:30 -0400310{
311 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
312
313 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
314
315 drawQuad(mCheckerProgram, "position", 0.8f);
316
317 EXPECT_GL_NO_ERROR();
318
319 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
320 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
321
322 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
323 GL_COLOR_BUFFER_BIT, GL_NEAREST);
324
325 EXPECT_GL_NO_ERROR();
326
327 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
328
329 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
330 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
331 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
332 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
333}
334
335// Draw to system framebuffer, blit whole-buffer color to user-created framebuffer.
Austin Kinross18b931d2014-09-29 12:58:31 -0700336TYPED_TEST(BlitFramebufferANGLETest, ReverseColorBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400337{
338 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
339
340 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
341
342 drawQuad(mCheckerProgram, "position", 0.8f);
343
344 EXPECT_GL_NO_ERROR();
345
346 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
347 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
348
349 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
350 GL_COLOR_BUFFER_BIT, GL_NEAREST);
351
352 EXPECT_GL_NO_ERROR();
353
354 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
355
356 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
357 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
358 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
359 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
360}
361
362// blit from user-created FBO to system framebuffer, with the scissor test enabled.
Austin Kinross18b931d2014-09-29 12:58:31 -0700363TYPED_TEST(BlitFramebufferANGLETest, ScissoredBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400364{
365 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
366
367 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
368
369 drawQuad(mCheckerProgram, "position", 0.8f);
370
371 EXPECT_GL_NO_ERROR();
372
373 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
374 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
375
376 glClearColor(1.0, 1.0, 1.0, 1.0);
377 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
378
379 glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
380 glEnable(GL_SCISSOR_TEST);
381
382 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
383 GL_COLOR_BUFFER_BIT, GL_NEAREST);
384
385 EXPECT_GL_NO_ERROR();
386
387 glDisable(GL_SCISSOR_TEST);
388
389 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
390
391 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
392 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
393 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
394 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
395}
396
397// blit from system FBO to user-created framebuffer, with the scissor test enabled.
Austin Kinross18b931d2014-09-29 12:58:31 -0700398TYPED_TEST(BlitFramebufferANGLETest, ReverseScissoredBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400399{
400 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
401
402 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
403
404 drawQuad(mCheckerProgram, "position", 0.8f);
405
406 EXPECT_GL_NO_ERROR();
407
408 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
409 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
410
411 glClearColor(1.0, 1.0, 1.0, 1.0);
412 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
413
414 glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
415 glEnable(GL_SCISSOR_TEST);
416
417 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
418 GL_COLOR_BUFFER_BIT, GL_NEAREST);
419
420 EXPECT_GL_NO_ERROR();
421
422 glDisable(GL_SCISSOR_TEST);
423
424 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
425
426 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
427 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
428 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
429 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
430}
431
432// blit from user-created FBO to system framebuffer, using region larger than buffer.
Austin Kinross18b931d2014-09-29 12:58:31 -0700433TYPED_TEST(BlitFramebufferANGLETest, OversizedBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400434{
435 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
436
437 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
438
439 drawQuad(mCheckerProgram, "position", 0.8f);
440
441 EXPECT_GL_NO_ERROR();
442
443 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
444 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
445
446 glClearColor(1.0, 1.0, 1.0, 1.0);
447 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
448
449 glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2,
450 GL_COLOR_BUFFER_BIT, GL_NEAREST);
451
452 EXPECT_GL_NO_ERROR();
453
454 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
455
456 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
457 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
458 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
459 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
460}
461
462// blit from system FBO to user-created framebuffer, using region larger than buffer.
Austin Kinross18b931d2014-09-29 12:58:31 -0700463TYPED_TEST(BlitFramebufferANGLETest, ReverseOversizedBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400464{
465 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
466
467 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
468
469 drawQuad(mCheckerProgram, "position", 0.8f);
470
471 EXPECT_GL_NO_ERROR();
472
473 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
474 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
475
476 glClearColor(1.0, 1.0, 1.0, 1.0);
477 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
478
479 glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2,
480 GL_COLOR_BUFFER_BIT, GL_NEAREST);
481 EXPECT_GL_NO_ERROR();
482
483 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
484
485 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
486 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
487 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
488 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
489}
490
491// blit from user-created FBO to system framebuffer, with depth buffer.
Austin Kinross18b931d2014-09-29 12:58:31 -0700492TYPED_TEST(BlitFramebufferANGLETest, BlitWithDepth)
Geoff Lange8a1f782013-10-18 16:14:30 -0400493{
494 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
495
496 glDepthMask(GL_TRUE);
497 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
498
499 glEnable(GL_DEPTH_TEST);
500
501 drawQuad(mCheckerProgram, "position", 0.3f);
502
503 EXPECT_GL_NO_ERROR();
504
505 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
506 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
507
508 glClearColor(1.0, 1.0, 1.0, 1.0);
509 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
510
511 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
512 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
513 EXPECT_GL_NO_ERROR();
514
515 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
516
517 // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
518 drawQuad(mBlueProgram, "position", 0.8f);
519
520 glDisable(GL_DEPTH_TEST);
521
522 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
523 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
524 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
525 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
526}
527
528// blit from system FBO to user-created framebuffer, with depth buffer.
Austin Kinross18b931d2014-09-29 12:58:31 -0700529TYPED_TEST(BlitFramebufferANGLETest, ReverseBlitWithDepth)
Geoff Lange8a1f782013-10-18 16:14:30 -0400530{
531 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
532
533 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
534
535 glEnable(GL_DEPTH_TEST);
536
537 drawQuad(mCheckerProgram, "position", 0.3f);
538
539 EXPECT_GL_NO_ERROR();
540
541 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
542 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
543
544 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
545 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
546
547 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
548 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
549 EXPECT_GL_NO_ERROR();
550
551 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
552
553 // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
554
555 drawQuad(mBlueProgram, "position", 0.8f);
556
557 glDisable(GL_DEPTH_TEST);
558
559 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
560 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
561 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
562 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
563}
564
565// blit from one region of the system fbo to another-- this should fail.
Austin Kinross18b931d2014-09-29 12:58:31 -0700566TYPED_TEST(BlitFramebufferANGLETest, BlitSameBufferOriginal)
Geoff Lange8a1f782013-10-18 16:14:30 -0400567{
568 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
569
570 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
571
572 drawQuad(mCheckerProgram, "position", 0.3f);
573
574 EXPECT_GL_NO_ERROR();
575
576 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(),
577 GL_COLOR_BUFFER_BIT, GL_NEAREST);
578 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
579}
580
581// blit from one region of the system fbo to another.
Austin Kinross18b931d2014-09-29 12:58:31 -0700582TYPED_TEST(BlitFramebufferANGLETest, BlitSameBufferUser)
Geoff Lange8a1f782013-10-18 16:14:30 -0400583{
584 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
585
586 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
587
588 drawQuad(mCheckerProgram, "position", 0.3f);
589
590 EXPECT_GL_NO_ERROR();
591
592 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(),
593 GL_COLOR_BUFFER_BIT, GL_NEAREST);
594 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
595}
596
Austin Kinross18b931d2014-09-29 12:58:31 -0700597TYPED_TEST(BlitFramebufferANGLETest, BlitPartialColor)
Geoff Lange8a1f782013-10-18 16:14:30 -0400598{
599 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
600
601 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
602
603 drawQuad(mCheckerProgram, "position", 0.5f);
604
605 EXPECT_GL_NO_ERROR();
606
607 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
608 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
609
610 glClearColor(1.0, 1.0, 1.0, 1.0);
611 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
612
613 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight(),
614 GL_COLOR_BUFFER_BIT, GL_NEAREST);
615
616 EXPECT_GL_NO_ERROR();
617
618 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
619
620 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
621 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
622 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
623 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
624}
625
Austin Kinross18b931d2014-09-29 12:58:31 -0700626TYPED_TEST(BlitFramebufferANGLETest, BlitDifferentSizes)
Geoff Lange8a1f782013-10-18 16:14:30 -0400627{
628 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
629
630 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
631
632 drawQuad(mCheckerProgram, "position", 0.5f);
633
634 EXPECT_GL_NO_ERROR();
635
636 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mSmallFBO);
637 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
638
639 glClearColor(1.0, 1.0, 1.0, 1.0);
640 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
641
642 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
643 GL_COLOR_BUFFER_BIT, GL_NEAREST);
644
645 EXPECT_GL_NO_ERROR();
646
647 glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
648
649 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
650
651 EXPECT_GL_NO_ERROR();
652}
653
Austin Kinross18b931d2014-09-29 12:58:31 -0700654TYPED_TEST(BlitFramebufferANGLETest, BlitWithMissingAttachments)
Geoff Lange8a1f782013-10-18 16:14:30 -0400655{
656 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
657
658 glClear(GL_COLOR_BUFFER_BIT);
659 drawQuad(mCheckerProgram, "position", 0.3f);
660
661 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
662 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
663
664 glClearColor(1.0, 1.0, 1.0, 1.0);
665 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
666
667 // depth blit request should be silently ignored, because the read FBO has no depth attachment
668 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
669 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
670
671 EXPECT_GL_NO_ERROR();
672
673 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
674
675 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
676 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
677 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
678 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
679
680 // unlike in the depth blit tests, this *should* draw a blue quad, because depth info
681 // has not been copied
682 glEnable(GL_DEPTH_TEST);
683 drawQuad(mBlueProgram, "position", 0.8f);
684 glDisable(GL_DEPTH_TEST);
685
686 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
687 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
688 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
689 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
690}
691
Austin Kinross18b931d2014-09-29 12:58:31 -0700692TYPED_TEST(BlitFramebufferANGLETest, BlitStencil)
Geoff Lange8a1f782013-10-18 16:14:30 -0400693{
694 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
695
696 glClear(GL_COLOR_BUFFER_BIT);
697 // fill the stencil buffer with 0x1
698 glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
699 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
700 glEnable(GL_STENCIL_TEST);
701 drawQuad(mCheckerProgram, "position", 0.3f);
702
703 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
704 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
705
706 glClearColor(1.0, 1.0, 1.0, 1.0);
707 glClearStencil(0x0);
708 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
709
710 // depth blit request should be silently ignored, because the read FBO has no depth attachment
711 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
712 GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
713
714 EXPECT_GL_NO_ERROR();
715
716 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
717
718 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
719 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
720 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
721 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
722
723 glStencilFunc(GL_EQUAL, 0x1, 0xFF); // only pass if stencil buffer at pixel reads 0x1
724 drawQuad(mBlueProgram, "position", 0.8f); // blue quad will draw if stencil buffer was copied
725 glDisable(GL_STENCIL_TEST);
726
727 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
728 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
729 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
730 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
731}
732
733// make sure that attempting to blit a partial depth buffer issues an error
Austin Kinross18b931d2014-09-29 12:58:31 -0700734TYPED_TEST(BlitFramebufferANGLETest, BlitPartialDepthStencil)
Geoff Lange8a1f782013-10-18 16:14:30 -0400735{
736 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
737
738 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
739
740 drawQuad(mCheckerProgram, "position", 0.5f);
741
742 EXPECT_GL_NO_ERROR();
743
744 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
745 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
746
747 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
748 getWindowWidth() / 2, getWindowHeight() / 2, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
749 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
750}
751
752// Test blit with MRT framebuffers
Austin Kinross18b931d2014-09-29 12:58:31 -0700753TYPED_TEST(BlitFramebufferANGLETest, BlitMRT)
Geoff Lange8a1f782013-10-18 16:14:30 -0400754{
755 if (!extensionEnabled("GL_EXT_draw_buffers"))
756 {
757 return;
758 }
759
760 GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
761
762 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
763 glDrawBuffersEXT(2, drawBuffers);
764
765 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
766
767 glClear(GL_COLOR_BUFFER_BIT);
768
769 drawQuad(mCheckerProgram, "position", 0.8f);
770
771 EXPECT_GL_NO_ERROR();
772
773 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
774 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mMRTFBO);
775
776 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
777 GL_COLOR_BUFFER_BIT, GL_NEAREST);
778
779 EXPECT_GL_NO_ERROR();
780
781 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
782
783 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
784 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
785 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
786 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
787
788 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
789 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
790
791 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
792 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
793 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
794 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
795
796 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
797 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0);
798}
799
800// Make sure that attempts to stretch in a blit call issue an error
Austin Kinross18b931d2014-09-29 12:58:31 -0700801TYPED_TEST(BlitFramebufferANGLETest, ErrorStretching)
Geoff Lange8a1f782013-10-18 16:14:30 -0400802{
803 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
804
805 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
806
807 drawQuad(mCheckerProgram, "position", 0.5f);
808
809 EXPECT_GL_NO_ERROR();
810
811 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
812 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
813
814 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
815 getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
816 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
817}
818
819// Make sure that attempts to flip in a blit call issue an error
Austin Kinross18b931d2014-09-29 12:58:31 -0700820TYPED_TEST(BlitFramebufferANGLETest, ErrorFlipping)
Geoff Lange8a1f782013-10-18 16:14:30 -0400821{
822 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
823
824 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
825
826 drawQuad(mCheckerProgram, "position", 0.5f);
827
828 EXPECT_GL_NO_ERROR();
829
830 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
831 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
832
833 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight() / 2,
834 0, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
835 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
836}
837
Austin Kinross18b931d2014-09-29 12:58:31 -0700838TYPED_TEST(BlitFramebufferANGLETest, Errors)
Geoff Lange8a1f782013-10-18 16:14:30 -0400839{
840 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
841
842 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
843
844 drawQuad(mCheckerProgram, "position", 0.5f);
845
846 EXPECT_GL_NO_ERROR();
847
848 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
849 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
850
851 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
852 GL_COLOR_BUFFER_BIT, GL_LINEAR);
853 EXPECT_GL_ERROR(GL_INVALID_ENUM);
854
855 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
856 GL_COLOR_BUFFER_BIT | 234, GL_NEAREST);
857 EXPECT_GL_ERROR(GL_INVALID_VALUE);
858
859 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mDiffFormatFBO);
860
861 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
862 GL_COLOR_BUFFER_BIT, GL_NEAREST);
863 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Jamie Madillc93d6f32014-04-15 16:12:41 -0400864
865 if (extensionEnabled("GL_ANGLE_framebuffer_multisample"))
866 {
867 glBindFramebuffer(GL_READ_FRAMEBUFFER, mBGRAMultisampledFBO);
868 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mRGBAFBO);
869 EXPECT_GL_NO_ERROR();
870
871 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
872 GL_COLOR_BUFFER_BIT, GL_NEAREST);
873 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
874 }
875
Geoff Lange8a1f782013-10-18 16:14:30 -0400876}