3 class BlitFramebufferANGLETest : public ANGLETest
6 BlitFramebufferANGLETest()
11 setConfigGreenBits(8);
13 setConfigAlphaBits(8);
14 setConfigDepthBits(24);
23 mUserDepthStencilBuffer = 0;
26 mSmallColorBuffer = 0;
27 mSmallDepthStencilBuffer = 0;
30 mColorOnlyColorBuffer = 0;
33 mDiffFormatColorBuffer = 0;
36 mDiffSizeColorBuffer = 0;
45 mBGRAMultisampledRenderbuffer = 0;
46 mBGRAMultisampledFBO = 0;
53 const std::string passthroughVS = SHADER_SOURCE
55 precision highp float;
56 attribute vec4 position;
61 gl_Position = position;
66 const std::string checkeredFS = SHADER_SOURCE
68 precision highp float;
73 if (pos.x * pos.y > 0.0)
75 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
79 gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
84 const std::string blueFS = SHADER_SOURCE
86 precision highp float;
91 gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
95 mCheckerProgram = compileProgram(passthroughVS, checkeredFS);
96 mBlueProgram = compileProgram(passthroughVS, blueFS);
97 if (mCheckerProgram == 0 || mBlueProgram == 0)
99 FAIL() << "shader compilation failed.";
102 EXPECT_GL_NO_ERROR();
105 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFBO);
106 if (originalFBO >= 0)
108 mOriginalFBO = (GLuint)originalFBO;
111 GLenum format = GL_BGRA8_EXT;
113 glGenFramebuffers(1, &mUserFBO);
114 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
115 glGenTextures(1, &mUserColorBuffer);
116 glGenRenderbuffers(1, &mUserDepthStencilBuffer);
117 glBindTexture(GL_TEXTURE_2D, mUserColorBuffer);
118 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight());
119 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mUserColorBuffer, 0);
120 glBindRenderbuffer(GL_RENDERBUFFER, mUserDepthStencilBuffer);
121 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth(), getWindowHeight());
122 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer);
123 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer);
125 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
126 ASSERT_GL_NO_ERROR();
128 glGenFramebuffers(1, &mSmallFBO);
129 glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
130 glGenTextures(1, &mSmallColorBuffer);
131 glGenRenderbuffers(1, &mSmallDepthStencilBuffer);
132 glBindTexture(GL_TEXTURE_2D, mSmallColorBuffer);
133 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth() / 2, getWindowHeight() / 2);
134 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mSmallColorBuffer, 0);
135 glBindRenderbuffer(GL_RENDERBUFFER, mSmallDepthStencilBuffer);
136 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth() / 2, getWindowHeight() / 2);
137 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer);
138 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer);
140 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
141 ASSERT_GL_NO_ERROR();
143 glGenFramebuffers(1, &mColorOnlyFBO);
144 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
145 glGenTextures(1, &mColorOnlyColorBuffer);
146 glBindTexture(GL_TEXTURE_2D, mColorOnlyColorBuffer);
147 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight());
148 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mColorOnlyColorBuffer, 0);
150 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
151 ASSERT_GL_NO_ERROR();
153 glGenFramebuffers(1, &mDiffFormatFBO);
154 glBindFramebuffer(GL_FRAMEBUFFER, mDiffFormatFBO);
155 glGenTextures(1, &mDiffFormatColorBuffer);
156 glBindTexture(GL_TEXTURE_2D, mDiffFormatColorBuffer);
157 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB565, getWindowWidth(), getWindowHeight());
158 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffFormatColorBuffer, 0);
160 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
161 ASSERT_GL_NO_ERROR();
163 glGenFramebuffers(1, &mDiffSizeFBO);
164 glBindFramebuffer(GL_FRAMEBUFFER, mDiffSizeFBO);
165 glGenTextures(1, &mDiffSizeColorBuffer);
166 glBindTexture(GL_TEXTURE_2D, mDiffSizeColorBuffer);
167 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth()*2, getWindowHeight()*2);
168 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffSizeColorBuffer, 0);
170 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
171 ASSERT_GL_NO_ERROR();
173 if (extensionEnabled("GL_EXT_draw_buffers"))
175 glGenFramebuffers(1, &mMRTFBO);
176 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
177 glGenTextures(1, &mMRTColorBuffer0);
178 glGenTextures(1, &mMRTColorBuffer1);
179 glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer0);
180 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight());
181 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
182 glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer1);
183 glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight());
184 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0);
186 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
187 ASSERT_GL_NO_ERROR();
190 if (extensionEnabled("GL_ANGLE_framebuffer_multisample"))
192 // Test blit between RGBA and multisampled BGRA
193 glGenTextures(1, &mRGBAColorbuffer);
194 glBindTexture(GL_TEXTURE_2D, mRGBAColorbuffer);
195 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, getWindowWidth(), getWindowHeight());
197 glGenFramebuffers(1, &mRGBAFBO);
198 glBindFramebuffer(GL_FRAMEBUFFER, mRGBAFBO);
199 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mRGBAColorbuffer, 0);
201 ASSERT_GL_NO_ERROR();
202 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
204 glGenRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
205 glBindRenderbuffer(GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
206 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_BGRA8_EXT, getWindowWidth(), getWindowHeight());
208 glGenFramebuffers(1, &mBGRAMultisampledFBO);
209 glBindFramebuffer(GL_FRAMEBUFFER, mBGRAMultisampledFBO);
210 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
212 ASSERT_GL_NO_ERROR();
213 ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
216 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
219 virtual void TearDown()
221 glDeleteProgram(mCheckerProgram);
222 glDeleteProgram(mBlueProgram);
224 glDeleteFramebuffers(1, &mUserFBO);
225 glDeleteTextures(1, &mUserColorBuffer);
226 glDeleteRenderbuffers(1, &mUserDepthStencilBuffer);
228 glDeleteFramebuffers(1, &mSmallFBO);
229 glDeleteTextures(1, &mSmallColorBuffer);
230 glDeleteRenderbuffers(1, &mSmallDepthStencilBuffer);
232 glDeleteFramebuffers(1, &mColorOnlyFBO);
233 glDeleteTextures(1, &mSmallDepthStencilBuffer);
235 glDeleteFramebuffers(1, &mDiffFormatFBO);
236 glDeleteTextures(1, &mDiffFormatColorBuffer);
238 glDeleteFramebuffers(1, &mDiffSizeFBO);
239 glDeleteTextures(1, &mDiffSizeColorBuffer);
241 if (extensionEnabled("GL_EXT_draw_buffers"))
243 glDeleteFramebuffers(1, &mMRTFBO);
244 glDeleteTextures(1, &mMRTColorBuffer0);
245 glDeleteTextures(1, &mMRTColorBuffer1);
248 if (mRGBAColorbuffer != 0)
250 glDeleteTextures(1, &mRGBAColorbuffer);
255 glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
258 if (mBGRAMultisampledRenderbuffer != 0)
260 glDeleteRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
263 if (mBGRAMultisampledFBO != 0)
265 glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
268 ANGLETest::TearDown();
271 GLuint mCheckerProgram;
277 GLuint mUserColorBuffer;
278 GLuint mUserDepthStencilBuffer;
281 GLuint mSmallColorBuffer;
282 GLuint mSmallDepthStencilBuffer;
284 GLuint mColorOnlyFBO;
285 GLuint mColorOnlyColorBuffer;
287 GLuint mDiffFormatFBO;
288 GLuint mDiffFormatColorBuffer;
291 GLuint mDiffSizeColorBuffer;
294 GLuint mMRTColorBuffer0;
295 GLuint mMRTColorBuffer1;
297 GLuint mRGBAColorbuffer;
300 GLuint mBGRAMultisampledRenderbuffer;
301 GLuint mBGRAMultisampledFBO;
304 // Draw to user-created framebuffer, blit whole-buffer color to original framebuffer.
305 TEST_F(BlitFramebufferANGLETest, BlitColorToDefault)
307 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
309 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
311 drawQuad(mCheckerProgram, "position", 0.8f);
313 EXPECT_GL_NO_ERROR();
315 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
316 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
318 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
319 GL_COLOR_BUFFER_BIT, GL_NEAREST);
321 EXPECT_GL_NO_ERROR();
323 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
325 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
326 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
327 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
328 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
331 // Draw to system framebuffer, blit whole-buffer color to user-created framebuffer.
332 TEST_F(BlitFramebufferANGLETest, ReverseColorBlit)
334 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
336 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
338 drawQuad(mCheckerProgram, "position", 0.8f);
340 EXPECT_GL_NO_ERROR();
342 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
343 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
345 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
346 GL_COLOR_BUFFER_BIT, GL_NEAREST);
348 EXPECT_GL_NO_ERROR();
350 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
352 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
353 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
354 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
355 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
358 // blit from user-created FBO to system framebuffer, with the scissor test enabled.
359 TEST_F(BlitFramebufferANGLETest, ScissoredBlit)
361 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
363 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
365 drawQuad(mCheckerProgram, "position", 0.8f);
367 EXPECT_GL_NO_ERROR();
369 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
370 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
372 glClearColor(1.0, 1.0, 1.0, 1.0);
373 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
375 glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
376 glEnable(GL_SCISSOR_TEST);
378 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
379 GL_COLOR_BUFFER_BIT, GL_NEAREST);
381 EXPECT_GL_NO_ERROR();
383 glDisable(GL_SCISSOR_TEST);
385 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
387 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
388 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
389 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
390 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
393 // blit from system FBO to user-created framebuffer, with the scissor test enabled.
394 TEST_F(BlitFramebufferANGLETest, ReverseScissoredBlit)
396 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
398 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
400 drawQuad(mCheckerProgram, "position", 0.8f);
402 EXPECT_GL_NO_ERROR();
404 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
405 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
407 glClearColor(1.0, 1.0, 1.0, 1.0);
408 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
410 glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
411 glEnable(GL_SCISSOR_TEST);
413 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
414 GL_COLOR_BUFFER_BIT, GL_NEAREST);
416 EXPECT_GL_NO_ERROR();
418 glDisable(GL_SCISSOR_TEST);
420 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
422 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
423 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
424 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
425 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
428 // blit from user-created FBO to system framebuffer, using region larger than buffer.
429 TEST_F(BlitFramebufferANGLETest, OversizedBlit)
431 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
433 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
435 drawQuad(mCheckerProgram, "position", 0.8f);
437 EXPECT_GL_NO_ERROR();
439 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
440 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
442 glClearColor(1.0, 1.0, 1.0, 1.0);
443 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
445 glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2,
446 GL_COLOR_BUFFER_BIT, GL_NEAREST);
448 EXPECT_GL_NO_ERROR();
450 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
452 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
453 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
454 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
455 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
458 // blit from system FBO to user-created framebuffer, using region larger than buffer.
459 TEST_F(BlitFramebufferANGLETest, ReverseOversizedBlit)
461 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
463 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
465 drawQuad(mCheckerProgram, "position", 0.8f);
467 EXPECT_GL_NO_ERROR();
469 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
470 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
472 glClearColor(1.0, 1.0, 1.0, 1.0);
473 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
475 glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2,
476 GL_COLOR_BUFFER_BIT, GL_NEAREST);
477 EXPECT_GL_NO_ERROR();
479 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
481 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
482 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
483 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
484 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
487 // blit from user-created FBO to system framebuffer, with depth buffer.
488 TEST_F(BlitFramebufferANGLETest, BlitWithDepth)
490 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
492 glDepthMask(GL_TRUE);
493 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
495 glEnable(GL_DEPTH_TEST);
497 drawQuad(mCheckerProgram, "position", 0.3f);
499 EXPECT_GL_NO_ERROR();
501 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
502 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
504 glClearColor(1.0, 1.0, 1.0, 1.0);
505 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
507 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
508 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
509 EXPECT_GL_NO_ERROR();
511 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
513 // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
514 drawQuad(mBlueProgram, "position", 0.8f);
516 glDisable(GL_DEPTH_TEST);
518 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
519 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
520 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
521 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
524 // blit from system FBO to user-created framebuffer, with depth buffer.
525 TEST_F(BlitFramebufferANGLETest, ReverseBlitWithDepth)
527 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
529 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
531 glEnable(GL_DEPTH_TEST);
533 drawQuad(mCheckerProgram, "position", 0.3f);
535 EXPECT_GL_NO_ERROR();
537 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
538 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
540 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
541 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
543 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
544 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
545 EXPECT_GL_NO_ERROR();
547 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
549 // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
551 drawQuad(mBlueProgram, "position", 0.8f);
553 glDisable(GL_DEPTH_TEST);
555 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
556 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
557 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
558 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
561 // blit from one region of the system fbo to another-- this should fail.
562 TEST_F(BlitFramebufferANGLETest, BlitSameBufferOriginal)
564 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
566 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
568 drawQuad(mCheckerProgram, "position", 0.3f);
570 EXPECT_GL_NO_ERROR();
572 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(),
573 GL_COLOR_BUFFER_BIT, GL_NEAREST);
574 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
577 // blit from one region of the system fbo to another.
578 TEST_F(BlitFramebufferANGLETest, BlitSameBufferUser)
580 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
582 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
584 drawQuad(mCheckerProgram, "position", 0.3f);
586 EXPECT_GL_NO_ERROR();
588 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(),
589 GL_COLOR_BUFFER_BIT, GL_NEAREST);
590 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
593 TEST_F(BlitFramebufferANGLETest, BlitPartialColor)
595 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
597 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
599 drawQuad(mCheckerProgram, "position", 0.5f);
601 EXPECT_GL_NO_ERROR();
603 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
604 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
606 glClearColor(1.0, 1.0, 1.0, 1.0);
607 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
609 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight(),
610 GL_COLOR_BUFFER_BIT, GL_NEAREST);
612 EXPECT_GL_NO_ERROR();
614 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
616 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
617 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
618 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
619 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
622 TEST_F(BlitFramebufferANGLETest, BlitDifferentSizes)
624 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
626 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
628 drawQuad(mCheckerProgram, "position", 0.5f);
630 EXPECT_GL_NO_ERROR();
632 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mSmallFBO);
633 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
635 glClearColor(1.0, 1.0, 1.0, 1.0);
636 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
638 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
639 GL_COLOR_BUFFER_BIT, GL_NEAREST);
641 EXPECT_GL_NO_ERROR();
643 glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
645 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
647 EXPECT_GL_NO_ERROR();
650 TEST_F(BlitFramebufferANGLETest, BlitWithMissingAttachments)
652 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
654 glClear(GL_COLOR_BUFFER_BIT);
655 drawQuad(mCheckerProgram, "position", 0.3f);
657 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
658 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
660 glClearColor(1.0, 1.0, 1.0, 1.0);
661 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
663 // depth blit request should be silently ignored, because the read FBO has no depth attachment
664 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
665 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
667 EXPECT_GL_NO_ERROR();
669 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
671 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
672 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
673 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
674 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
676 // unlike in the depth blit tests, this *should* draw a blue quad, because depth info
677 // has not been copied
678 glEnable(GL_DEPTH_TEST);
679 drawQuad(mBlueProgram, "position", 0.8f);
680 glDisable(GL_DEPTH_TEST);
682 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
683 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
684 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
685 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
688 TEST_F(BlitFramebufferANGLETest, BlitStencil)
690 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
692 glClear(GL_COLOR_BUFFER_BIT);
693 // fill the stencil buffer with 0x1
694 glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
695 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
696 glEnable(GL_STENCIL_TEST);
697 drawQuad(mCheckerProgram, "position", 0.3f);
699 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
700 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
702 glClearColor(1.0, 1.0, 1.0, 1.0);
704 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
706 // depth blit request should be silently ignored, because the read FBO has no depth attachment
707 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
708 GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
710 EXPECT_GL_NO_ERROR();
712 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
714 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
715 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
716 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
717 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
719 glStencilFunc(GL_EQUAL, 0x1, 0xFF); // only pass if stencil buffer at pixel reads 0x1
720 drawQuad(mBlueProgram, "position", 0.8f); // blue quad will draw if stencil buffer was copied
721 glDisable(GL_STENCIL_TEST);
723 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
724 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
725 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
726 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
729 // make sure that attempting to blit a partial depth buffer issues an error
730 TEST_F(BlitFramebufferANGLETest, BlitPartialDepthStencil)
732 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
734 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
736 drawQuad(mCheckerProgram, "position", 0.5f);
738 EXPECT_GL_NO_ERROR();
740 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
741 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
743 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
744 getWindowWidth() / 2, getWindowHeight() / 2, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
745 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
748 // Test blit with MRT framebuffers
749 TEST_F(BlitFramebufferANGLETest, BlitMRT)
751 if (!extensionEnabled("GL_EXT_draw_buffers"))
756 GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
758 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
759 glDrawBuffersEXT(2, drawBuffers);
761 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
763 glClear(GL_COLOR_BUFFER_BIT);
765 drawQuad(mCheckerProgram, "position", 0.8f);
767 EXPECT_GL_NO_ERROR();
769 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
770 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mMRTFBO);
772 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
773 GL_COLOR_BUFFER_BIT, GL_NEAREST);
775 EXPECT_GL_NO_ERROR();
777 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
779 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
780 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
781 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
782 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
784 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
785 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
787 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
788 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
789 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
790 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
792 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
793 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0);
796 // Make sure that attempts to stretch in a blit call issue an error
797 TEST_F(BlitFramebufferANGLETest, ErrorStretching)
799 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
801 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
803 drawQuad(mCheckerProgram, "position", 0.5f);
805 EXPECT_GL_NO_ERROR();
807 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
808 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
810 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
811 getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
812 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
815 // Make sure that attempts to flip in a blit call issue an error
816 TEST_F(BlitFramebufferANGLETest, ErrorFlipping)
818 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
820 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
822 drawQuad(mCheckerProgram, "position", 0.5f);
824 EXPECT_GL_NO_ERROR();
826 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
827 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
829 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight() / 2,
830 0, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
831 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
834 TEST_F(BlitFramebufferANGLETest, Errors)
836 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
838 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
840 drawQuad(mCheckerProgram, "position", 0.5f);
842 EXPECT_GL_NO_ERROR();
844 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
845 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
847 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
848 GL_COLOR_BUFFER_BIT, GL_LINEAR);
849 EXPECT_GL_ERROR(GL_INVALID_ENUM);
851 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
852 GL_COLOR_BUFFER_BIT | 234, GL_NEAREST);
853 EXPECT_GL_ERROR(GL_INVALID_VALUE);
855 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mDiffFormatFBO);
857 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
858 GL_COLOR_BUFFER_BIT, GL_NEAREST);
859 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
861 if (extensionEnabled("GL_ANGLE_framebuffer_multisample"))
863 glBindFramebuffer(GL_READ_FRAMEBUFFER, mBGRAMultisampledFBO);
864 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mRGBAFBO);
865 EXPECT_GL_NO_ERROR();
867 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
868 GL_COLOR_BUFFER_BIT, GL_NEAREST);
869 EXPECT_GL_ERROR(GL_INVALID_OPERATION);