Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / tests / angle_tests / BlitFramebufferANGLETest.cpp
1 #include "ANGLETest.h"
2
3 class BlitFramebufferANGLETest : public ANGLETest
4 {
5 protected:
6     BlitFramebufferANGLETest()
7     {
8         setWindowWidth(256);
9         setWindowHeight(256);
10         setConfigRedBits(8);
11         setConfigGreenBits(8);
12         setConfigBlueBits(8);
13         setConfigAlphaBits(8);
14         setConfigDepthBits(24);
15
16         mCheckerProgram = 0;
17         mBlueProgram = 0;
18
19         mOriginalFBO = 0;
20
21         mUserFBO = 0;
22         mUserColorBuffer = 0;
23         mUserDepthStencilBuffer = 0;
24
25         mSmallFBO = 0;
26         mSmallColorBuffer = 0;
27         mSmallDepthStencilBuffer = 0;
28
29         mColorOnlyFBO = 0;
30         mColorOnlyColorBuffer = 0;
31
32         mDiffFormatFBO = 0;
33         mDiffFormatColorBuffer = 0;
34
35         mDiffSizeFBO = 0;
36         mDiffSizeColorBuffer = 0;
37
38         mMRTFBO = 0;
39         mMRTColorBuffer0 = 0;
40         mMRTColorBuffer1 = 0;
41
42         mRGBAColorbuffer = 0;
43         mRGBAFBO = 0;
44
45         mBGRAMultisampledRenderbuffer = 0;
46         mBGRAMultisampledFBO = 0;
47     }
48
49     virtual void SetUp()
50     {
51         ANGLETest::SetUp();
52
53         const std::string passthroughVS = SHADER_SOURCE
54         (
55             precision highp float;
56             attribute vec4 position;
57             varying vec4 pos;
58
59             void main()
60             {
61                 gl_Position = position;
62                 pos = position;
63             }
64         );
65
66         const std::string checkeredFS = SHADER_SOURCE
67         (
68             precision highp float;
69             varying vec4 pos;
70
71             void main()
72             {
73                 if (pos.x * pos.y > 0.0)
74                 {
75                     gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
76                 }
77                 else
78                 {
79                     gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
80                 }
81             }
82         );
83
84         const std::string blueFS = SHADER_SOURCE
85         (
86             precision highp float;
87             varying vec4 pos;
88
89             void main()
90             {
91                 gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
92             }
93         );
94
95         mCheckerProgram = compileProgram(passthroughVS, checkeredFS);
96         mBlueProgram = compileProgram(passthroughVS, blueFS);
97         if (mCheckerProgram == 0 || mBlueProgram == 0)
98         {
99             FAIL() << "shader compilation failed.";
100         }
101
102         EXPECT_GL_NO_ERROR();
103
104         GLint originalFBO;
105         glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFBO);
106         if (originalFBO >= 0)
107         {
108             mOriginalFBO = (GLuint)originalFBO;
109         }
110
111         GLenum format = GL_BGRA8_EXT;
112         
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);
124
125         ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
126         ASSERT_GL_NO_ERROR();
127
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);
139
140         ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
141         ASSERT_GL_NO_ERROR();
142
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);
149
150         ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
151         ASSERT_GL_NO_ERROR();
152
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);
159
160         ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
161         ASSERT_GL_NO_ERROR();
162
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);
169
170         ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
171         ASSERT_GL_NO_ERROR();
172
173         if (extensionEnabled("GL_EXT_draw_buffers"))
174         {
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);
185
186             ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
187             ASSERT_GL_NO_ERROR();
188         }
189
190         if (extensionEnabled("GL_ANGLE_framebuffer_multisample"))
191         {
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());
196
197             glGenFramebuffers(1, &mRGBAFBO);
198             glBindFramebuffer(GL_FRAMEBUFFER, mRGBAFBO);
199             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mRGBAColorbuffer, 0);
200
201             ASSERT_GL_NO_ERROR();
202             ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
203
204             glGenRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
205             glBindRenderbuffer(GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
206             glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_BGRA8_EXT, getWindowWidth(), getWindowHeight());
207
208             glGenFramebuffers(1, &mBGRAMultisampledFBO);
209             glBindFramebuffer(GL_FRAMEBUFFER, mBGRAMultisampledFBO);
210             glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
211
212             ASSERT_GL_NO_ERROR();
213             ASSERT_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
214         }
215
216         glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
217     }
218
219     virtual void TearDown()
220     {
221         glDeleteProgram(mCheckerProgram);
222         glDeleteProgram(mBlueProgram);
223
224         glDeleteFramebuffers(1, &mUserFBO);
225         glDeleteTextures(1, &mUserColorBuffer);
226         glDeleteRenderbuffers(1, &mUserDepthStencilBuffer);
227
228         glDeleteFramebuffers(1, &mSmallFBO);
229         glDeleteTextures(1, &mSmallColorBuffer);
230         glDeleteRenderbuffers(1, &mSmallDepthStencilBuffer);
231
232         glDeleteFramebuffers(1, &mColorOnlyFBO);
233         glDeleteTextures(1, &mSmallDepthStencilBuffer);
234
235         glDeleteFramebuffers(1, &mDiffFormatFBO);
236         glDeleteTextures(1, &mDiffFormatColorBuffer);
237
238         glDeleteFramebuffers(1, &mDiffSizeFBO);
239         glDeleteTextures(1, &mDiffSizeColorBuffer);
240
241         if (extensionEnabled("GL_EXT_draw_buffers"))
242         {
243             glDeleteFramebuffers(1, &mMRTFBO);
244             glDeleteTextures(1, &mMRTColorBuffer0);
245             glDeleteTextures(1, &mMRTColorBuffer1);
246         }
247
248         if (mRGBAColorbuffer != 0)
249         {
250             glDeleteTextures(1, &mRGBAColorbuffer);
251         }
252
253         if (mRGBAFBO != 0)
254         {
255             glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
256         }
257
258         if (mBGRAMultisampledRenderbuffer != 0)
259         {
260             glDeleteRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
261         }
262
263         if (mBGRAMultisampledFBO != 0)
264         {
265             glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
266         }
267
268         ANGLETest::TearDown();
269     }
270
271     GLuint mCheckerProgram;
272     GLuint mBlueProgram;
273
274     GLuint mOriginalFBO;
275
276     GLuint mUserFBO;
277     GLuint mUserColorBuffer;
278     GLuint mUserDepthStencilBuffer;
279
280     GLuint mSmallFBO;
281     GLuint mSmallColorBuffer;
282     GLuint mSmallDepthStencilBuffer;
283
284     GLuint mColorOnlyFBO;
285     GLuint mColorOnlyColorBuffer;
286
287     GLuint mDiffFormatFBO;
288     GLuint mDiffFormatColorBuffer;
289
290     GLuint mDiffSizeFBO;
291     GLuint mDiffSizeColorBuffer;
292
293     GLuint mMRTFBO;
294     GLuint mMRTColorBuffer0;
295     GLuint mMRTColorBuffer1;
296
297     GLuint mRGBAColorbuffer;
298     GLuint mRGBAFBO;
299
300     GLuint mBGRAMultisampledRenderbuffer;
301     GLuint mBGRAMultisampledFBO;
302 };
303
304 // Draw to user-created framebuffer, blit whole-buffer color to original framebuffer.
305 TEST_F(BlitFramebufferANGLETest, BlitColorToDefault)
306 {
307     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
308
309     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
310
311     drawQuad(mCheckerProgram, "position", 0.8f);
312
313     EXPECT_GL_NO_ERROR();
314
315     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
316     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
317
318     glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), 
319                            GL_COLOR_BUFFER_BIT, GL_NEAREST);
320
321     EXPECT_GL_NO_ERROR();
322
323     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
324
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);
329 }
330
331 // Draw to system framebuffer, blit whole-buffer color to user-created framebuffer.
332 TEST_F(BlitFramebufferANGLETest, ReverseColorBlit)
333 {
334     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
335
336     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
337
338     drawQuad(mCheckerProgram, "position", 0.8f);
339
340     EXPECT_GL_NO_ERROR();
341
342     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
343     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
344
345     glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
346                            GL_COLOR_BUFFER_BIT, GL_NEAREST);
347
348     EXPECT_GL_NO_ERROR();
349
350     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
351
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);
356 }
357
358 // blit from user-created FBO to system framebuffer, with the scissor test enabled.
359 TEST_F(BlitFramebufferANGLETest, ScissoredBlit)
360 {
361     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
362
363     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
364
365     drawQuad(mCheckerProgram, "position", 0.8f);
366
367     EXPECT_GL_NO_ERROR();
368
369     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
370     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
371
372     glClearColor(1.0, 1.0, 1.0, 1.0);
373     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
374
375     glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
376     glEnable(GL_SCISSOR_TEST);
377
378     glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), 
379                            GL_COLOR_BUFFER_BIT, GL_NEAREST);
380
381     EXPECT_GL_NO_ERROR();
382
383     glDisable(GL_SCISSOR_TEST);
384
385     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
386
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);
391 }
392
393 // blit from system FBO to user-created framebuffer, with the scissor test enabled.
394 TEST_F(BlitFramebufferANGLETest, ReverseScissoredBlit)
395 {
396     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
397
398     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
399
400     drawQuad(mCheckerProgram, "position", 0.8f);
401
402     EXPECT_GL_NO_ERROR();
403
404     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
405     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
406
407     glClearColor(1.0, 1.0, 1.0, 1.0);
408     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
409     
410     glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
411     glEnable(GL_SCISSOR_TEST);
412
413     glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), 
414                            GL_COLOR_BUFFER_BIT, GL_NEAREST);
415
416     EXPECT_GL_NO_ERROR();
417
418     glDisable(GL_SCISSOR_TEST);
419
420     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
421     
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);
426 }
427
428 // blit from user-created FBO to system framebuffer, using region larger than buffer.
429 TEST_F(BlitFramebufferANGLETest, OversizedBlit)
430 {
431     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
432
433     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
434
435     drawQuad(mCheckerProgram, "position", 0.8f);
436
437     EXPECT_GL_NO_ERROR();
438
439     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
440     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
441
442     glClearColor(1.0, 1.0, 1.0, 1.0);
443     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
444
445     glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 
446                            GL_COLOR_BUFFER_BIT, GL_NEAREST);
447
448     EXPECT_GL_NO_ERROR();
449
450     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
451
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);
456 }
457
458 // blit from system FBO to user-created framebuffer, using region larger than buffer.
459 TEST_F(BlitFramebufferANGLETest, ReverseOversizedBlit)
460 {
461     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
462
463     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
464
465     drawQuad(mCheckerProgram, "position", 0.8f);
466
467     EXPECT_GL_NO_ERROR();
468
469     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
470     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
471
472     glClearColor(1.0, 1.0, 1.0, 1.0);
473     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
474
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();
478
479     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
480
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);
485 }
486
487 // blit from user-created FBO to system framebuffer, with depth buffer.
488 TEST_F(BlitFramebufferANGLETest, BlitWithDepth)
489 {
490     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
491
492     glDepthMask(GL_TRUE);
493     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
494
495     glEnable(GL_DEPTH_TEST);
496
497     drawQuad(mCheckerProgram, "position", 0.3f);
498
499     EXPECT_GL_NO_ERROR();
500
501     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
502     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
503
504     glClearColor(1.0, 1.0, 1.0, 1.0);
505     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
506
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();
510
511     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
512
513     // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
514     drawQuad(mBlueProgram, "position", 0.8f);
515
516     glDisable(GL_DEPTH_TEST);
517
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);
522 }
523
524 // blit from system FBO to user-created framebuffer, with depth buffer.
525 TEST_F(BlitFramebufferANGLETest, ReverseBlitWithDepth)
526 {
527     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
528
529     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
530
531     glEnable(GL_DEPTH_TEST);
532
533     drawQuad(mCheckerProgram, "position", 0.3f);
534
535     EXPECT_GL_NO_ERROR();
536
537     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
538     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
539
540     glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
541     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
542
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();
546
547     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
548
549     // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
550
551     drawQuad(mBlueProgram, "position", 0.8f);
552
553     glDisable(GL_DEPTH_TEST);
554
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);
559 }
560
561 // blit from one region of the system fbo to another-- this should fail.
562 TEST_F(BlitFramebufferANGLETest, BlitSameBufferOriginal)
563 {
564     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
565
566     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
567
568     drawQuad(mCheckerProgram, "position", 0.3f);
569
570     EXPECT_GL_NO_ERROR();
571
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);
575 }
576
577 // blit from one region of the system fbo to another.
578 TEST_F(BlitFramebufferANGLETest, BlitSameBufferUser)
579 {
580     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
581
582     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
583
584     drawQuad(mCheckerProgram, "position", 0.3f);
585
586     EXPECT_GL_NO_ERROR();
587
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);
591 }
592
593 TEST_F(BlitFramebufferANGLETest, BlitPartialColor)
594 {
595     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
596
597     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
598
599     drawQuad(mCheckerProgram, "position", 0.5f);
600
601     EXPECT_GL_NO_ERROR();
602
603     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
604     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
605
606     glClearColor(1.0, 1.0, 1.0, 1.0);
607     glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
608
609     glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight(),
610                            GL_COLOR_BUFFER_BIT, GL_NEAREST);
611
612     EXPECT_GL_NO_ERROR();
613
614     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
615
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);
620 }
621
622 TEST_F(BlitFramebufferANGLETest, BlitDifferentSizes)
623 {
624     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
625
626     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
627
628     drawQuad(mCheckerProgram, "position", 0.5f);
629
630     EXPECT_GL_NO_ERROR();
631
632     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mSmallFBO);
633     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
634
635     glClearColor(1.0, 1.0, 1.0, 1.0);
636     glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
637
638     glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
639                            GL_COLOR_BUFFER_BIT, GL_NEAREST);
640
641     EXPECT_GL_NO_ERROR();
642
643     glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
644
645     EXPECT_PIXEL_EQ(    getWindowWidth() / 4,     getWindowHeight() / 4, 255,   0,   0, 255);
646
647     EXPECT_GL_NO_ERROR();
648 }
649
650 TEST_F(BlitFramebufferANGLETest, BlitWithMissingAttachments)
651 {
652     glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
653
654     glClear(GL_COLOR_BUFFER_BIT);
655     drawQuad(mCheckerProgram, "position", 0.3f);
656
657     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
658     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
659
660     glClearColor(1.0, 1.0, 1.0, 1.0);
661     glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
662
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); 
666
667     EXPECT_GL_NO_ERROR();
668
669     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
670
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);
675
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);
681
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);
686 }
687
688 TEST_F(BlitFramebufferANGLETest, BlitStencil)
689 {
690     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
691
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);
698
699     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
700     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
701
702     glClearColor(1.0, 1.0, 1.0, 1.0);
703     glClearStencil(0x0);
704     glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
705
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); 
709
710     EXPECT_GL_NO_ERROR();
711
712     glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
713
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);
718
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);
722
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);
727 }
728
729 // make sure that attempting to blit a partial depth buffer issues an error
730 TEST_F(BlitFramebufferANGLETest, BlitPartialDepthStencil)
731 {
732     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
733
734     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
735
736     drawQuad(mCheckerProgram, "position", 0.5f);
737
738     EXPECT_GL_NO_ERROR();
739
740     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
741     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
742
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);
746 }
747
748 // Test blit with MRT framebuffers
749 TEST_F(BlitFramebufferANGLETest, BlitMRT)
750 {
751     if (!extensionEnabled("GL_EXT_draw_buffers"))
752     {
753         return;
754     }
755
756     GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
757
758     glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
759     glDrawBuffersEXT(2, drawBuffers);
760
761     glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
762
763     glClear(GL_COLOR_BUFFER_BIT);
764     
765     drawQuad(mCheckerProgram, "position", 0.8f);
766     
767     EXPECT_GL_NO_ERROR();
768
769     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
770     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mMRTFBO);
771
772     glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), 
773                            GL_COLOR_BUFFER_BIT, GL_NEAREST);
774     
775     EXPECT_GL_NO_ERROR();
776
777     glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
778
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);
783
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);
786
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);
791
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);
794 }
795
796 // Make sure that attempts to stretch in a blit call issue an error
797 TEST_F(BlitFramebufferANGLETest, ErrorStretching)
798 {
799     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
800
801     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
802
803     drawQuad(mCheckerProgram, "position", 0.5f);
804
805     EXPECT_GL_NO_ERROR();
806
807     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
808     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
809
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);
813 }
814
815 // Make sure that attempts to flip in a blit call issue an error
816 TEST_F(BlitFramebufferANGLETest, ErrorFlipping)
817 {
818     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
819
820     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
821
822     drawQuad(mCheckerProgram, "position", 0.5f);
823
824     EXPECT_GL_NO_ERROR();
825
826     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
827     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
828
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);
832 }
833
834 TEST_F(BlitFramebufferANGLETest, Errors)
835 {
836     glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
837
838     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
839
840     drawQuad(mCheckerProgram, "position", 0.5f);
841
842     EXPECT_GL_NO_ERROR();
843
844     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
845     glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
846
847     glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), 
848                            GL_COLOR_BUFFER_BIT, GL_LINEAR);
849     EXPECT_GL_ERROR(GL_INVALID_ENUM);
850
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);
854
855     glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mDiffFormatFBO);
856
857     glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
858                            GL_COLOR_BUFFER_BIT, GL_NEAREST);
859     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
860
861     if (extensionEnabled("GL_ANGLE_framebuffer_multisample"))
862     {
863         glBindFramebuffer(GL_READ_FRAMEBUFFER, mBGRAMultisampledFBO);
864         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mRGBAFBO);
865         EXPECT_GL_NO_ERROR();
866
867         glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
868                                GL_COLOR_BUFFER_BIT, GL_NEAREST);
869         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
870     }
871
872 }