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