blob: c2d7d4464f4af5977d1b422ffa54f1bf9f5efde4 [file] [log] [blame]
Jamie Madillfa05f602015-05-07 13:47:11 -04001//
2// Copyright 2015 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Corentin Wallezd3970de2015-05-14 11:07:48 -04007#include "test_utils/ANGLETest.h"
Geoff Lange8a1f782013-10-18 16:14:30 -04008
Jamie Madill78a9c732016-07-15 11:22:43 -04009#include "test_utils/gl_raii.h"
10
Jamie Madillfa05f602015-05-07 13:47:11 -040011using namespace angle;
Austin Kinross18b931d2014-09-29 12:58:31 -070012
Geoff Lange8a1f782013-10-18 16:14:30 -040013class BlitFramebufferANGLETest : public ANGLETest
14{
Jamie Madillfa05f602015-05-07 13:47:11 -040015 protected:
16 BlitFramebufferANGLETest()
Geoff Lange8a1f782013-10-18 16:14:30 -040017 {
18 setWindowWidth(256);
19 setWindowHeight(256);
Geoff Langefc551f2013-10-31 10:20:28 -040020 setConfigRedBits(8);
21 setConfigGreenBits(8);
22 setConfigBlueBits(8);
23 setConfigAlphaBits(8);
24 setConfigDepthBits(24);
Geoff Lang784cc8f2015-02-05 09:00:54 -050025 setConfigStencilBits(8);
Geoff Lange8a1f782013-10-18 16:14:30 -040026
27 mCheckerProgram = 0;
28 mBlueProgram = 0;
29
30 mOriginalFBO = 0;
31
32 mUserFBO = 0;
33 mUserColorBuffer = 0;
34 mUserDepthStencilBuffer = 0;
35
36 mSmallFBO = 0;
37 mSmallColorBuffer = 0;
38 mSmallDepthStencilBuffer = 0;
39
40 mColorOnlyFBO = 0;
41 mColorOnlyColorBuffer = 0;
42
43 mDiffFormatFBO = 0;
44 mDiffFormatColorBuffer = 0;
45
46 mDiffSizeFBO = 0;
47 mDiffSizeColorBuffer = 0;
48
49 mMRTFBO = 0;
50 mMRTColorBuffer0 = 0;
51 mMRTColorBuffer1 = 0;
Jamie Madillc93d6f32014-04-15 16:12:41 -040052
53 mRGBAColorbuffer = 0;
54 mRGBAFBO = 0;
55
56 mBGRAMultisampledRenderbuffer = 0;
57 mBGRAMultisampledFBO = 0;
Geoff Lange8a1f782013-10-18 16:14:30 -040058 }
59
60 virtual void SetUp()
61 {
62 ANGLETest::SetUp();
63
64 const std::string passthroughVS = SHADER_SOURCE
65 (
66 precision highp float;
67 attribute vec4 position;
68 varying vec4 pos;
69
70 void main()
71 {
72 gl_Position = position;
73 pos = position;
74 }
75 );
76
77 const std::string checkeredFS = SHADER_SOURCE
78 (
79 precision highp float;
80 varying vec4 pos;
81
82 void main()
83 {
84 if (pos.x * pos.y > 0.0)
85 {
86 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
87 }
88 else
89 {
90 gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
91 }
92 }
93 );
94
95 const std::string blueFS = SHADER_SOURCE
96 (
97 precision highp float;
98 varying vec4 pos;
99
100 void main()
101 {
102 gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
103 }
104 );
105
Jamie Madill5599c8f2014-08-26 13:16:39 -0400106 mCheckerProgram = CompileProgram(passthroughVS, checkeredFS);
107 mBlueProgram = CompileProgram(passthroughVS, blueFS);
Geoff Lange8a1f782013-10-18 16:14:30 -0400108 if (mCheckerProgram == 0 || mBlueProgram == 0)
109 {
110 FAIL() << "shader compilation failed.";
111 }
112
113 EXPECT_GL_NO_ERROR();
114
115 GLint originalFBO;
116 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFBO);
117 if (originalFBO >= 0)
118 {
119 mOriginalFBO = (GLuint)originalFBO;
120 }
121
Geoff Langc4e93662017-05-01 10:45:59 -0400122 GLenum format = GL_BGRA_EXT;
123
Geoff Lange8a1f782013-10-18 16:14:30 -0400124 glGenFramebuffers(1, &mUserFBO);
125 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
126 glGenTextures(1, &mUserColorBuffer);
127 glGenRenderbuffers(1, &mUserDepthStencilBuffer);
128 glBindTexture(GL_TEXTURE_2D, mUserColorBuffer);
Geoff Lange8a1f782013-10-18 16:14:30 -0400129 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mUserColorBuffer, 0);
Geoff Langc4e93662017-05-01 10:45:59 -0400130 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
131 GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400132 glBindRenderbuffer(GL_RENDERBUFFER, mUserDepthStencilBuffer);
133 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth(), getWindowHeight());
134 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer);
135 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer);
136
Corentin Wallez322653b2015-06-17 18:33:56 +0200137 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400138 ASSERT_GL_NO_ERROR();
139
140 glGenFramebuffers(1, &mSmallFBO);
141 glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
142 glGenTextures(1, &mSmallColorBuffer);
143 glGenRenderbuffers(1, &mSmallDepthStencilBuffer);
144 glBindTexture(GL_TEXTURE_2D, mSmallColorBuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400145 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth() / 2, getWindowHeight() / 2, 0,
146 format, GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400147 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mSmallColorBuffer, 0);
148 glBindRenderbuffer(GL_RENDERBUFFER, mSmallDepthStencilBuffer);
149 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth() / 2, getWindowHeight() / 2);
150 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer);
151 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer);
152
Corentin Wallez322653b2015-06-17 18:33:56 +0200153 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400154 ASSERT_GL_NO_ERROR();
155
156 glGenFramebuffers(1, &mColorOnlyFBO);
157 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
158 glGenTextures(1, &mColorOnlyColorBuffer);
159 glBindTexture(GL_TEXTURE_2D, mColorOnlyColorBuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400160 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
161 GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400162 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mColorOnlyColorBuffer, 0);
163
Corentin Wallez322653b2015-06-17 18:33:56 +0200164 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400165 ASSERT_GL_NO_ERROR();
166
167 glGenFramebuffers(1, &mDiffFormatFBO);
168 glBindFramebuffer(GL_FRAMEBUFFER, mDiffFormatFBO);
169 glGenTextures(1, &mDiffFormatColorBuffer);
170 glBindTexture(GL_TEXTURE_2D, mDiffFormatColorBuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400171 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB,
172 GL_UNSIGNED_SHORT_5_6_5, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400173 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffFormatColorBuffer, 0);
174
Corentin Wallez322653b2015-06-17 18:33:56 +0200175 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400176 ASSERT_GL_NO_ERROR();
177
178 glGenFramebuffers(1, &mDiffSizeFBO);
179 glBindFramebuffer(GL_FRAMEBUFFER, mDiffSizeFBO);
180 glGenTextures(1, &mDiffSizeColorBuffer);
181 glBindTexture(GL_TEXTURE_2D, mDiffSizeColorBuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400182 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth() * 2, getWindowHeight() * 2, 0,
183 format, GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400184 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffSizeColorBuffer, 0);
185
Corentin Wallez322653b2015-06-17 18:33:56 +0200186 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400187 ASSERT_GL_NO_ERROR();
188
189 if (extensionEnabled("GL_EXT_draw_buffers"))
190 {
191 glGenFramebuffers(1, &mMRTFBO);
192 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
193 glGenTextures(1, &mMRTColorBuffer0);
194 glGenTextures(1, &mMRTColorBuffer1);
195 glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer0);
Geoff Langc4e93662017-05-01 10:45:59 -0400196 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
197 GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400198 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
199 glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer1);
Geoff Langc4e93662017-05-01 10:45:59 -0400200 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
201 GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400202 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0);
203
Corentin Wallez322653b2015-06-17 18:33:56 +0200204 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400205 ASSERT_GL_NO_ERROR();
206 }
207
Jamie Madillc93d6f32014-04-15 16:12:41 -0400208 if (extensionEnabled("GL_ANGLE_framebuffer_multisample"))
209 {
210 // Test blit between RGBA and multisampled BGRA
211 glGenTextures(1, &mRGBAColorbuffer);
212 glBindTexture(GL_TEXTURE_2D, mRGBAColorbuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400213 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
214 GL_UNSIGNED_BYTE, nullptr);
Jamie Madillc93d6f32014-04-15 16:12:41 -0400215
216 glGenFramebuffers(1, &mRGBAFBO);
217 glBindFramebuffer(GL_FRAMEBUFFER, mRGBAFBO);
218 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mRGBAColorbuffer, 0);
219
220 ASSERT_GL_NO_ERROR();
Corentin Wallez322653b2015-06-17 18:33:56 +0200221 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Jamie Madillc93d6f32014-04-15 16:12:41 -0400222
223 glGenRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
224 glBindRenderbuffer(GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
225 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_BGRA8_EXT, getWindowWidth(), getWindowHeight());
226
227 glGenFramebuffers(1, &mBGRAMultisampledFBO);
228 glBindFramebuffer(GL_FRAMEBUFFER, mBGRAMultisampledFBO);
229 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
230
231 ASSERT_GL_NO_ERROR();
Corentin Wallez322653b2015-06-17 18:33:56 +0200232 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Jamie Madillc93d6f32014-04-15 16:12:41 -0400233 }
234
Geoff Lange8a1f782013-10-18 16:14:30 -0400235 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
236 }
237
238 virtual void TearDown()
239 {
240 glDeleteProgram(mCheckerProgram);
241 glDeleteProgram(mBlueProgram);
242
243 glDeleteFramebuffers(1, &mUserFBO);
244 glDeleteTextures(1, &mUserColorBuffer);
245 glDeleteRenderbuffers(1, &mUserDepthStencilBuffer);
246
247 glDeleteFramebuffers(1, &mSmallFBO);
248 glDeleteTextures(1, &mSmallColorBuffer);
249 glDeleteRenderbuffers(1, &mSmallDepthStencilBuffer);
250
251 glDeleteFramebuffers(1, &mColorOnlyFBO);
252 glDeleteTextures(1, &mSmallDepthStencilBuffer);
253
254 glDeleteFramebuffers(1, &mDiffFormatFBO);
255 glDeleteTextures(1, &mDiffFormatColorBuffer);
256
257 glDeleteFramebuffers(1, &mDiffSizeFBO);
258 glDeleteTextures(1, &mDiffSizeColorBuffer);
259
260 if (extensionEnabled("GL_EXT_draw_buffers"))
261 {
262 glDeleteFramebuffers(1, &mMRTFBO);
263 glDeleteTextures(1, &mMRTColorBuffer0);
264 glDeleteTextures(1, &mMRTColorBuffer1);
265 }
266
Jamie Madillc93d6f32014-04-15 16:12:41 -0400267 if (mRGBAColorbuffer != 0)
268 {
269 glDeleteTextures(1, &mRGBAColorbuffer);
270 }
271
272 if (mRGBAFBO != 0)
273 {
274 glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
275 }
276
277 if (mBGRAMultisampledRenderbuffer != 0)
278 {
279 glDeleteRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
280 }
281
282 if (mBGRAMultisampledFBO != 0)
283 {
284 glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
285 }
286
Geoff Lange8a1f782013-10-18 16:14:30 -0400287 ANGLETest::TearDown();
288 }
289
290 GLuint mCheckerProgram;
291 GLuint mBlueProgram;
292
293 GLuint mOriginalFBO;
294
295 GLuint mUserFBO;
296 GLuint mUserColorBuffer;
297 GLuint mUserDepthStencilBuffer;
298
299 GLuint mSmallFBO;
300 GLuint mSmallColorBuffer;
301 GLuint mSmallDepthStencilBuffer;
302
303 GLuint mColorOnlyFBO;
304 GLuint mColorOnlyColorBuffer;
305
306 GLuint mDiffFormatFBO;
307 GLuint mDiffFormatColorBuffer;
308
309 GLuint mDiffSizeFBO;
310 GLuint mDiffSizeColorBuffer;
311
312 GLuint mMRTFBO;
313 GLuint mMRTColorBuffer0;
314 GLuint mMRTColorBuffer1;
Jamie Madillc93d6f32014-04-15 16:12:41 -0400315
316 GLuint mRGBAColorbuffer;
317 GLuint mRGBAFBO;
318
319 GLuint mBGRAMultisampledRenderbuffer;
320 GLuint mBGRAMultisampledFBO;
Geoff Lange8a1f782013-10-18 16:14:30 -0400321};
322
323// Draw to user-created framebuffer, blit whole-buffer color to original framebuffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400324TEST_P(BlitFramebufferANGLETest, BlitColorToDefault)
Geoff Lange8a1f782013-10-18 16:14:30 -0400325{
326 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
327
328 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
329
330 drawQuad(mCheckerProgram, "position", 0.8f);
331
332 EXPECT_GL_NO_ERROR();
333
334 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
335 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
336
337 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
338 GL_COLOR_BUFFER_BIT, GL_NEAREST);
339
340 EXPECT_GL_NO_ERROR();
341
342 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
343
344 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
345 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
346 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
347 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
348}
349
350// Draw to system framebuffer, blit whole-buffer color to user-created framebuffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400351TEST_P(BlitFramebufferANGLETest, ReverseColorBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400352{
353 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
354
355 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
356
357 drawQuad(mCheckerProgram, "position", 0.8f);
358
359 EXPECT_GL_NO_ERROR();
360
361 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
362 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
363
364 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
365 GL_COLOR_BUFFER_BIT, GL_NEAREST);
366
367 EXPECT_GL_NO_ERROR();
368
369 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
370
371 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
372 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
373 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
374 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
375}
376
377// blit from user-created FBO to system framebuffer, with the scissor test enabled.
Jamie Madillfa05f602015-05-07 13:47:11 -0400378TEST_P(BlitFramebufferANGLETest, ScissoredBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400379{
380 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
381
382 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
383
384 drawQuad(mCheckerProgram, "position", 0.8f);
385
386 EXPECT_GL_NO_ERROR();
387
388 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
389 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
390
391 glClearColor(1.0, 1.0, 1.0, 1.0);
392 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
393
394 glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
395 glEnable(GL_SCISSOR_TEST);
396
397 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
398 GL_COLOR_BUFFER_BIT, GL_NEAREST);
399
400 EXPECT_GL_NO_ERROR();
401
402 glDisable(GL_SCISSOR_TEST);
403
404 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
405
406 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
407 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
408 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
409 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
410}
411
412// blit from system FBO to user-created framebuffer, with the scissor test enabled.
Jamie Madillfa05f602015-05-07 13:47:11 -0400413TEST_P(BlitFramebufferANGLETest, ReverseScissoredBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400414{
Jamie Madill1200c412016-08-16 14:09:14 -0400415 // TODO(jmadill): Triage this driver bug.
416 if (IsAMD() && IsD3D11())
417 {
418 std::cout << "Test skipped on AMD D3D11." << std::endl;
419 return;
420 }
421
Geoff Lange8a1f782013-10-18 16:14:30 -0400422 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
423
424 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
425
426 drawQuad(mCheckerProgram, "position", 0.8f);
427
428 EXPECT_GL_NO_ERROR();
429
430 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
431 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
432
433 glClearColor(1.0, 1.0, 1.0, 1.0);
434 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
435
436 glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
437 glEnable(GL_SCISSOR_TEST);
438
439 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
440 GL_COLOR_BUFFER_BIT, GL_NEAREST);
441
442 EXPECT_GL_NO_ERROR();
443
444 glDisable(GL_SCISSOR_TEST);
445
446 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
447
448 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
449 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
450 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
451 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
452}
453
454// blit from user-created FBO to system framebuffer, using region larger than buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400455TEST_P(BlitFramebufferANGLETest, OversizedBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400456{
457 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
458
459 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
460
461 drawQuad(mCheckerProgram, "position", 0.8f);
462
463 EXPECT_GL_NO_ERROR();
464
465 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
466 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
467
468 glClearColor(1.0, 1.0, 1.0, 1.0);
469 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
470
471 glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2,
472 GL_COLOR_BUFFER_BIT, GL_NEAREST);
473
474 EXPECT_GL_NO_ERROR();
475
476 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
477
478 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
479 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
480 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
481 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
482}
483
484// blit from system FBO to user-created framebuffer, using region larger than buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400485TEST_P(BlitFramebufferANGLETest, ReverseOversizedBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400486{
487 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
488
489 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
490
491 drawQuad(mCheckerProgram, "position", 0.8f);
492
493 EXPECT_GL_NO_ERROR();
494
495 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
496 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
497
498 glClearColor(1.0, 1.0, 1.0, 1.0);
499 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
500
501 glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2,
502 GL_COLOR_BUFFER_BIT, GL_NEAREST);
503 EXPECT_GL_NO_ERROR();
504
505 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
506
507 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
508 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
509 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
510 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
511}
512
513// blit from user-created FBO to system framebuffer, with depth buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400514TEST_P(BlitFramebufferANGLETest, BlitWithDepth)
Geoff Lange8a1f782013-10-18 16:14:30 -0400515{
516 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
517
518 glDepthMask(GL_TRUE);
519 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
520
521 glEnable(GL_DEPTH_TEST);
522
523 drawQuad(mCheckerProgram, "position", 0.3f);
524
525 EXPECT_GL_NO_ERROR();
526
527 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
528 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
529
530 glClearColor(1.0, 1.0, 1.0, 1.0);
531 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
532
533 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
534 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
535 EXPECT_GL_NO_ERROR();
536
537 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
538
539 // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
540 drawQuad(mBlueProgram, "position", 0.8f);
541
542 glDisable(GL_DEPTH_TEST);
543
544 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
545 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
546 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
547 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
548}
549
550// blit from system FBO to user-created framebuffer, with depth buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400551TEST_P(BlitFramebufferANGLETest, ReverseBlitWithDepth)
Geoff Lange8a1f782013-10-18 16:14:30 -0400552{
553 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
554
555 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
556
557 glEnable(GL_DEPTH_TEST);
558
559 drawQuad(mCheckerProgram, "position", 0.3f);
560
561 EXPECT_GL_NO_ERROR();
562
563 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
564 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
565
566 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
567 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
568
569 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
570 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
571 EXPECT_GL_NO_ERROR();
572
573 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
574
575 // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
576
577 drawQuad(mBlueProgram, "position", 0.8f);
578
579 glDisable(GL_DEPTH_TEST);
580
581 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
582 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
583 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
584 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
585}
586
587// blit from one region of the system fbo to another-- this should fail.
Jamie Madillfa05f602015-05-07 13:47:11 -0400588TEST_P(BlitFramebufferANGLETest, BlitSameBufferOriginal)
Geoff Lange8a1f782013-10-18 16:14:30 -0400589{
590 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
591
592 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
593
594 drawQuad(mCheckerProgram, "position", 0.3f);
595
596 EXPECT_GL_NO_ERROR();
597
598 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(),
599 GL_COLOR_BUFFER_BIT, GL_NEAREST);
600 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
601}
602
603// blit from one region of the system fbo to another.
Jamie Madillfa05f602015-05-07 13:47:11 -0400604TEST_P(BlitFramebufferANGLETest, BlitSameBufferUser)
Geoff Lange8a1f782013-10-18 16:14:30 -0400605{
606 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
607
608 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
609
610 drawQuad(mCheckerProgram, "position", 0.3f);
611
612 EXPECT_GL_NO_ERROR();
613
614 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(),
615 GL_COLOR_BUFFER_BIT, GL_NEAREST);
616 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
617}
618
Jamie Madillfa05f602015-05-07 13:47:11 -0400619TEST_P(BlitFramebufferANGLETest, BlitPartialColor)
Geoff Lange8a1f782013-10-18 16:14:30 -0400620{
621 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
622
623 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
624
625 drawQuad(mCheckerProgram, "position", 0.5f);
626
627 EXPECT_GL_NO_ERROR();
628
629 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
630 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
631
632 glClearColor(1.0, 1.0, 1.0, 1.0);
633 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
634
635 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight(),
636 GL_COLOR_BUFFER_BIT, GL_NEAREST);
637
638 EXPECT_GL_NO_ERROR();
639
640 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
641
642 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
643 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
644 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
645 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
646}
647
Jamie Madillfa05f602015-05-07 13:47:11 -0400648TEST_P(BlitFramebufferANGLETest, BlitDifferentSizes)
Geoff Lange8a1f782013-10-18 16:14:30 -0400649{
650 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
651
652 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
653
654 drawQuad(mCheckerProgram, "position", 0.5f);
655
656 EXPECT_GL_NO_ERROR();
657
658 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mSmallFBO);
659 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
660
661 glClearColor(1.0, 1.0, 1.0, 1.0);
662 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
663
664 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
665 GL_COLOR_BUFFER_BIT, GL_NEAREST);
666
667 EXPECT_GL_NO_ERROR();
668
669 glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
670
671 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
672
673 EXPECT_GL_NO_ERROR();
674}
675
Jamie Madillfa05f602015-05-07 13:47:11 -0400676TEST_P(BlitFramebufferANGLETest, BlitWithMissingAttachments)
Geoff Lange8a1f782013-10-18 16:14:30 -0400677{
678 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
679
680 glClear(GL_COLOR_BUFFER_BIT);
681 drawQuad(mCheckerProgram, "position", 0.3f);
682
683 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
684 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
685
686 glClearColor(1.0, 1.0, 1.0, 1.0);
687 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
688
He Yunchao66a41a22016-12-15 16:45:05 +0800689 // generate INVALID_OPERATION if the read FBO has no depth attachment
690 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
691 getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
692 GL_NEAREST);
Geoff Lange8a1f782013-10-18 16:14:30 -0400693
He Yunchao66a41a22016-12-15 16:45:05 +0800694 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Geoff Lange8a1f782013-10-18 16:14:30 -0400695
He Yunchao66a41a22016-12-15 16:45:05 +0800696 // generate INVALID_OPERATION if the read FBO has no stencil attachment
697 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
698 getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
699 GL_NEAREST);
Geoff Lange8a1f782013-10-18 16:14:30 -0400700
He Yunchao66a41a22016-12-15 16:45:05 +0800701 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Geoff Lange8a1f782013-10-18 16:14:30 -0400702
He Yunchao66a41a22016-12-15 16:45:05 +0800703 // generate INVALID_OPERATION if we read from a missing color attachment
704 glReadBuffer(GL_COLOR_ATTACHMENT1);
705 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
706 getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
Geoff Lange8a1f782013-10-18 16:14:30 -0400707
He Yunchao66a41a22016-12-15 16:45:05 +0800708 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Geoff Lange8a1f782013-10-18 16:14:30 -0400709}
710
Jamie Madillfa05f602015-05-07 13:47:11 -0400711TEST_P(BlitFramebufferANGLETest, BlitStencil)
Geoff Lange8a1f782013-10-18 16:14:30 -0400712{
Jamie Madill8e1936c2014-12-03 15:20:12 -0500713 // TODO(jmadill): Figure out if we can fix this on D3D9.
714 // https://code.google.com/p/angleproject/issues/detail?id=809
Jamie Madill518b9fa2016-03-02 11:26:02 -0500715 if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE)
Jamie Madill8e1936c2014-12-03 15:20:12 -0500716 {
Jamie Madillc3b9b262015-01-30 14:00:51 -0500717 std::cout << "Test skipped on Intel D3D9." << std::endl;
Jamie Madill8e1936c2014-12-03 15:20:12 -0500718 return;
719 }
720
Geoff Lange8a1f782013-10-18 16:14:30 -0400721 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
722
723 glClear(GL_COLOR_BUFFER_BIT);
724 // fill the stencil buffer with 0x1
725 glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
726 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
727 glEnable(GL_STENCIL_TEST);
728 drawQuad(mCheckerProgram, "position", 0.3f);
729
730 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
731 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
732
733 glClearColor(1.0, 1.0, 1.0, 1.0);
734 glClearStencil(0x0);
735 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
736
737 // depth blit request should be silently ignored, because the read FBO has no depth attachment
738 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
739 GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
740
741 EXPECT_GL_NO_ERROR();
742
743 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
744
745 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
746 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
747 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
748 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
749
750 glStencilFunc(GL_EQUAL, 0x1, 0xFF); // only pass if stencil buffer at pixel reads 0x1
751 drawQuad(mBlueProgram, "position", 0.8f); // blue quad will draw if stencil buffer was copied
752 glDisable(GL_STENCIL_TEST);
753
754 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
755 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
756 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
757 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
758}
759
760// make sure that attempting to blit a partial depth buffer issues an error
Jamie Madillfa05f602015-05-07 13:47:11 -0400761TEST_P(BlitFramebufferANGLETest, BlitPartialDepthStencil)
Geoff Lange8a1f782013-10-18 16:14:30 -0400762{
763 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
764
765 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
766
767 drawQuad(mCheckerProgram, "position", 0.5f);
768
769 EXPECT_GL_NO_ERROR();
770
771 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
772 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
773
774 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
775 getWindowWidth() / 2, getWindowHeight() / 2, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
776 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
777}
778
779// Test blit with MRT framebuffers
Jamie Madillfa05f602015-05-07 13:47:11 -0400780TEST_P(BlitFramebufferANGLETest, BlitMRT)
Geoff Lange8a1f782013-10-18 16:14:30 -0400781{
782 if (!extensionEnabled("GL_EXT_draw_buffers"))
783 {
784 return;
785 }
786
787 GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
788
789 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
790 glDrawBuffersEXT(2, drawBuffers);
791
792 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
793
794 glClear(GL_COLOR_BUFFER_BIT);
795
796 drawQuad(mCheckerProgram, "position", 0.8f);
797
798 EXPECT_GL_NO_ERROR();
799
800 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
801 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mMRTFBO);
802
803 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
804 GL_COLOR_BUFFER_BIT, GL_NEAREST);
805
806 EXPECT_GL_NO_ERROR();
807
808 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
809
810 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
811 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
812 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
813 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
814
815 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
816 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
817
818 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
819 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
820 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
821 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
822
823 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
824 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0);
825}
826
827// Make sure that attempts to stretch in a blit call issue an error
Jamie Madillfa05f602015-05-07 13:47:11 -0400828TEST_P(BlitFramebufferANGLETest, ErrorStretching)
Geoff Lange8a1f782013-10-18 16:14:30 -0400829{
830 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
831
832 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
833
834 drawQuad(mCheckerProgram, "position", 0.5f);
835
836 EXPECT_GL_NO_ERROR();
837
838 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
839 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
840
841 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
842 getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
843 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
844}
845
846// Make sure that attempts to flip in a blit call issue an error
Jamie Madillfa05f602015-05-07 13:47:11 -0400847TEST_P(BlitFramebufferANGLETest, ErrorFlipping)
Geoff Lange8a1f782013-10-18 16:14:30 -0400848{
849 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
850
851 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
852
853 drawQuad(mCheckerProgram, "position", 0.5f);
854
855 EXPECT_GL_NO_ERROR();
856
857 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
858 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
859
860 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight() / 2,
861 0, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
862 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
863}
864
Jamie Madillfa05f602015-05-07 13:47:11 -0400865TEST_P(BlitFramebufferANGLETest, Errors)
Geoff Lange8a1f782013-10-18 16:14:30 -0400866{
867 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
868
869 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
870
871 drawQuad(mCheckerProgram, "position", 0.5f);
872
873 EXPECT_GL_NO_ERROR();
874
875 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
876 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
877
878 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
879 GL_COLOR_BUFFER_BIT, GL_LINEAR);
880 EXPECT_GL_ERROR(GL_INVALID_ENUM);
881
882 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
883 GL_COLOR_BUFFER_BIT | 234, GL_NEAREST);
884 EXPECT_GL_ERROR(GL_INVALID_VALUE);
885
886 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mDiffFormatFBO);
887
888 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
889 GL_COLOR_BUFFER_BIT, GL_NEAREST);
890 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Jamie Madillc93d6f32014-04-15 16:12:41 -0400891
892 if (extensionEnabled("GL_ANGLE_framebuffer_multisample"))
893 {
894 glBindFramebuffer(GL_READ_FRAMEBUFFER, mBGRAMultisampledFBO);
895 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mRGBAFBO);
896 EXPECT_GL_NO_ERROR();
897
898 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
899 GL_COLOR_BUFFER_BIT, GL_NEAREST);
900 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
901 }
902
Geoff Lange8a1f782013-10-18 16:14:30 -0400903}
Jamie Madillfa05f602015-05-07 13:47:11 -0400904
Geoff Lange0cc2a42016-01-20 10:58:17 -0500905// TODO(geofflang): Fix the dependence on glBlitFramebufferANGLE without checks and assuming the
906// default framebuffer is BGRA to enable the GL and GLES backends. (http://anglebug.com/1289)
907
Jamie Madill78a9c732016-07-15 11:22:43 -0400908class BlitFramebufferTest : public ANGLETest
909{
910 protected:
911 BlitFramebufferTest()
912 {
913 setWindowWidth(256);
914 setWindowHeight(256);
915 setConfigRedBits(8);
916 setConfigGreenBits(8);
917 setConfigBlueBits(8);
918 setConfigAlphaBits(8);
919 setConfigDepthBits(24);
920 setConfigStencilBits(8);
921 }
922};
923
Jamie Madill196ca362016-07-12 10:54:04 -0400924// Tests resolving a multisample depth buffer.
925TEST_P(BlitFramebufferTest, MultisampleDepth)
926{
Jamie Madill1200c412016-08-16 14:09:14 -0400927 // TODO(jmadill): Triage this driver bug.
928 if (IsAMD() && IsD3D11())
929 {
930 std::cout << "Test skipped on AMD D3D11." << std::endl;
931 return;
932 }
933
Jamie Madill196ca362016-07-12 10:54:04 -0400934 GLRenderbuffer renderbuf;
935 glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
936 glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256);
937
938 const std::string &vertex =
939 "#version 300 es\n"
940 "in vec2 position;\n"
941 "void main() {\n"
942 " gl_Position = vec4(position, 0.0, 0.5);\n"
943 "}";
944 const std::string &fragment =
945 "#version 300 es\n"
946 "out mediump vec4 red;\n"
947 "void main() {\n"
948 " red = vec4(1.0, 0.0, 0.0, 1.0);\n"
949 " gl_FragDepth = 0.5;\n"
950 "}";
951
952 ANGLE_GL_PROGRAM(drawRed, vertex, fragment);
953
954 GLFramebuffer framebuffer;
955 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
956 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
957 renderbuf.get());
958
959 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
960
961 glClearDepthf(0.5f);
962 glClear(GL_DEPTH_BUFFER_BIT);
963
964 GLRenderbuffer destRenderbuf;
965 glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get());
966 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 256, 256);
967
968 GLFramebuffer resolved;
969 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved.get());
970 glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
971 destRenderbuf.get());
972
973 glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer.get());
974 glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
975
976 glBindFramebuffer(GL_FRAMEBUFFER, resolved.get());
977
978 GLTexture colorbuf;
979 glBindTexture(GL_TEXTURE_2D, colorbuf.get());
980 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
981 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorbuf.get(), 0);
982
983 ASSERT_GL_NO_ERROR();
984
985 // Clear to green
986 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
987 glClear(GL_COLOR_BUFFER_BIT);
988 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
989
990 // Draw with 0.5f test and the test should pass.
991 glEnable(GL_DEPTH_TEST);
992 glDepthFunc(GL_EQUAL);
993 drawQuad(drawRed.get(), "position", 0.5f);
994 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
995
996 ASSERT_GL_NO_ERROR();
997}
998
Jamie Madill78a9c732016-07-15 11:22:43 -0400999// Test resolving a multisampled stencil buffer.
1000TEST_P(BlitFramebufferTest, MultisampleStencil)
1001{
1002 GLRenderbuffer renderbuf;
1003 glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
1004 glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_STENCIL_INDEX8, 256, 256);
1005
1006 const std::string &vertex =
1007 "#version 300 es\n"
1008 "in vec2 position;\n"
1009 "void main() {\n"
1010 " gl_Position = vec4(position, 0.0, 1.0);\n"
1011 "}";
1012 const std::string &fragment =
1013 "#version 300 es\n"
1014 "out mediump vec4 red;\n"
1015 "void main() {\n"
1016 " red = vec4(1.0, 0.0, 0.0, 1.0);\n"
1017 "}";
1018
1019 ANGLE_GL_PROGRAM(drawRed, vertex, fragment);
1020
1021 GLFramebuffer framebuffer;
1022 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
1023 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1024 renderbuf.get());
1025
1026 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1027
1028 // fill the stencil buffer with 0x1
1029 glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
1030 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1031 glEnable(GL_STENCIL_TEST);
1032 drawQuad(drawRed.get(), "position", 0.5f);
1033
1034 GLTexture destColorbuf;
1035 glBindTexture(GL_TEXTURE_2D, destColorbuf.get());
1036 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
1037
1038 GLRenderbuffer destRenderbuf;
1039 glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get());
1040 glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 256, 256);
1041
1042 GLFramebuffer resolved;
1043 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved.get());
1044 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
1045 destColorbuf.get(), 0);
1046 glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1047 destRenderbuf.get());
1048
1049 glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer.get());
1050 glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
1051
1052 glBindFramebuffer(GL_FRAMEBUFFER, resolved.get());
1053
1054 ASSERT_GL_NO_ERROR();
1055
1056 // Clear to green
1057 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1058 glClear(GL_COLOR_BUFFER_BIT);
1059 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1060
1061 // Draw red if the stencil is 0x1, which should be true after the blit/resolve.
1062 glStencilFunc(GL_EQUAL, 0x1, 0xFF);
1063 drawQuad(drawRed.get(), "position", 0.5f);
1064 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1065
1066 ASSERT_GL_NO_ERROR();
1067}
1068
Jamie Madillfa05f602015-05-07 13:47:11 -04001069// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
Austin Kinross2a63b3f2016-02-08 12:29:08 -08001070ANGLE_INSTANTIATE_TEST(BlitFramebufferANGLETest,
1071 ES2_D3D9(),
1072 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE),
1073 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE));
Jamie Madill78a9c732016-07-15 11:22:43 -04001074
He Yunchao66a41a22016-12-15 16:45:05 +08001075ANGLE_INSTANTIATE_TEST(BlitFramebufferTest, ES3_D3D11());