blob: f78a5eea61a5b6ee70d7e5f738aefcd34d30a501 [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"
Jamie Madill78a9c732016-07-15 11:22:43 -04008#include "test_utils/gl_raii.h"
9
Jamie Madillfa05f602015-05-07 13:47:11 -040010using namespace angle;
Austin Kinross18b931d2014-09-29 12:58:31 -070011
Geoff Lange8a1f782013-10-18 16:14:30 -040012class BlitFramebufferANGLETest : public ANGLETest
13{
Jamie Madillfa05f602015-05-07 13:47:11 -040014 protected:
15 BlitFramebufferANGLETest()
Geoff Lange8a1f782013-10-18 16:14:30 -040016 {
17 setWindowWidth(256);
18 setWindowHeight(256);
Geoff Langefc551f2013-10-31 10:20:28 -040019 setConfigRedBits(8);
20 setConfigGreenBits(8);
21 setConfigBlueBits(8);
22 setConfigAlphaBits(8);
23 setConfigDepthBits(24);
Geoff Lang784cc8f2015-02-05 09:00:54 -050024 setConfigStencilBits(8);
Geoff Lange8a1f782013-10-18 16:14:30 -040025
26 mCheckerProgram = 0;
27 mBlueProgram = 0;
28
29 mOriginalFBO = 0;
30
31 mUserFBO = 0;
32 mUserColorBuffer = 0;
33 mUserDepthStencilBuffer = 0;
34
35 mSmallFBO = 0;
36 mSmallColorBuffer = 0;
37 mSmallDepthStencilBuffer = 0;
38
39 mColorOnlyFBO = 0;
40 mColorOnlyColorBuffer = 0;
41
42 mDiffFormatFBO = 0;
43 mDiffFormatColorBuffer = 0;
44
45 mDiffSizeFBO = 0;
46 mDiffSizeColorBuffer = 0;
47
48 mMRTFBO = 0;
49 mMRTColorBuffer0 = 0;
50 mMRTColorBuffer1 = 0;
Jamie Madillc93d6f32014-04-15 16:12:41 -040051
52 mRGBAColorbuffer = 0;
53 mRGBAFBO = 0;
Kenneth Russell69382852017-07-21 16:38:44 -040054 mRGBAMultisampledRenderbuffer = 0;
55 mRGBAMultisampledFBO = 0;
Jamie Madillc93d6f32014-04-15 16:12:41 -040056
Kenneth Russell69382852017-07-21 16:38:44 -040057 mBGRAColorbuffer = 0;
58 mBGRAFBO = 0;
Jamie Madillc93d6f32014-04-15 16:12:41 -040059 mBGRAMultisampledRenderbuffer = 0;
60 mBGRAMultisampledFBO = 0;
Geoff Lange8a1f782013-10-18 16:14:30 -040061 }
62
63 virtual void SetUp()
64 {
65 ANGLETest::SetUp();
66
Olli Etuaho5804dc82018-04-13 14:11:46 +030067 mCheckerProgram =
68 CompileProgram(essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Checkered());
69 mBlueProgram = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
Geoff Lange8a1f782013-10-18 16:14:30 -040070 if (mCheckerProgram == 0 || mBlueProgram == 0)
71 {
72 FAIL() << "shader compilation failed.";
73 }
74
75 EXPECT_GL_NO_ERROR();
76
77 GLint originalFBO;
78 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFBO);
79 if (originalFBO >= 0)
80 {
81 mOriginalFBO = (GLuint)originalFBO;
82 }
83
Geoff Langc4e93662017-05-01 10:45:59 -040084 GLenum format = GL_BGRA_EXT;
85
Geoff Lange8a1f782013-10-18 16:14:30 -040086 glGenFramebuffers(1, &mUserFBO);
87 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
88 glGenTextures(1, &mUserColorBuffer);
89 glGenRenderbuffers(1, &mUserDepthStencilBuffer);
90 glBindTexture(GL_TEXTURE_2D, mUserColorBuffer);
Geoff Lange8a1f782013-10-18 16:14:30 -040091 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mUserColorBuffer, 0);
Geoff Langc4e93662017-05-01 10:45:59 -040092 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
93 GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -040094 glBindRenderbuffer(GL_RENDERBUFFER, mUserDepthStencilBuffer);
95 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth(), getWindowHeight());
96 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer);
97 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer);
98
Corentin Wallez322653b2015-06-17 18:33:56 +020099 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400100 ASSERT_GL_NO_ERROR();
101
102 glGenFramebuffers(1, &mSmallFBO);
103 glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
104 glGenTextures(1, &mSmallColorBuffer);
105 glGenRenderbuffers(1, &mSmallDepthStencilBuffer);
106 glBindTexture(GL_TEXTURE_2D, mSmallColorBuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400107 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth() / 2, getWindowHeight() / 2, 0,
108 format, GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400109 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mSmallColorBuffer, 0);
110 glBindRenderbuffer(GL_RENDERBUFFER, mSmallDepthStencilBuffer);
111 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth() / 2, getWindowHeight() / 2);
112 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer);
113 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer);
114
Corentin Wallez322653b2015-06-17 18:33:56 +0200115 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400116 ASSERT_GL_NO_ERROR();
117
118 glGenFramebuffers(1, &mColorOnlyFBO);
119 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
120 glGenTextures(1, &mColorOnlyColorBuffer);
121 glBindTexture(GL_TEXTURE_2D, mColorOnlyColorBuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400122 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
123 GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400124 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mColorOnlyColorBuffer, 0);
125
Corentin Wallez322653b2015-06-17 18:33:56 +0200126 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400127 ASSERT_GL_NO_ERROR();
128
129 glGenFramebuffers(1, &mDiffFormatFBO);
130 glBindFramebuffer(GL_FRAMEBUFFER, mDiffFormatFBO);
131 glGenTextures(1, &mDiffFormatColorBuffer);
132 glBindTexture(GL_TEXTURE_2D, mDiffFormatColorBuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400133 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB,
134 GL_UNSIGNED_SHORT_5_6_5, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400135 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffFormatColorBuffer, 0);
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, &mDiffSizeFBO);
141 glBindFramebuffer(GL_FRAMEBUFFER, mDiffSizeFBO);
142 glGenTextures(1, &mDiffSizeColorBuffer);
143 glBindTexture(GL_TEXTURE_2D, mDiffSizeColorBuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400144 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth() * 2, getWindowHeight() * 2, 0,
145 format, GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400146 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffSizeColorBuffer, 0);
147
Corentin Wallez322653b2015-06-17 18:33:56 +0200148 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400149 ASSERT_GL_NO_ERROR();
150
151 if (extensionEnabled("GL_EXT_draw_buffers"))
152 {
153 glGenFramebuffers(1, &mMRTFBO);
154 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
155 glGenTextures(1, &mMRTColorBuffer0);
156 glGenTextures(1, &mMRTColorBuffer1);
157 glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer0);
Geoff Langc4e93662017-05-01 10:45:59 -0400158 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
159 GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400160 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
161 glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer1);
Geoff Langc4e93662017-05-01 10:45:59 -0400162 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
163 GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400164 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0);
165
Corentin Wallez322653b2015-06-17 18:33:56 +0200166 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400167 ASSERT_GL_NO_ERROR();
168 }
169
Kenneth Russell69382852017-07-21 16:38:44 -0400170 if (extensionEnabled("GL_ANGLE_framebuffer_multisample") &&
171 extensionEnabled("GL_OES_rgb8_rgba8"))
Jamie Madillc93d6f32014-04-15 16:12:41 -0400172 {
Kenneth Russell69382852017-07-21 16:38:44 -0400173 // RGBA single-sampled framebuffer
Jamie Madillc93d6f32014-04-15 16:12:41 -0400174 glGenTextures(1, &mRGBAColorbuffer);
175 glBindTexture(GL_TEXTURE_2D, mRGBAColorbuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400176 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
177 GL_UNSIGNED_BYTE, nullptr);
Jamie Madillc93d6f32014-04-15 16:12:41 -0400178
179 glGenFramebuffers(1, &mRGBAFBO);
180 glBindFramebuffer(GL_FRAMEBUFFER, mRGBAFBO);
181 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mRGBAColorbuffer, 0);
182
183 ASSERT_GL_NO_ERROR();
Corentin Wallez322653b2015-06-17 18:33:56 +0200184 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Jamie Madillc93d6f32014-04-15 16:12:41 -0400185
Kenneth Russell69382852017-07-21 16:38:44 -0400186 // RGBA multisampled framebuffer
187 glGenRenderbuffers(1, &mRGBAMultisampledRenderbuffer);
188 glBindRenderbuffer(GL_RENDERBUFFER, mRGBAMultisampledRenderbuffer);
189 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_RGBA8, getWindowWidth(),
190 getWindowHeight());
Jamie Madillc93d6f32014-04-15 16:12:41 -0400191
Kenneth Russell69382852017-07-21 16:38:44 -0400192 glGenFramebuffers(1, &mRGBAMultisampledFBO);
193 glBindFramebuffer(GL_FRAMEBUFFER, mRGBAMultisampledFBO);
194 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
195 mRGBAMultisampledRenderbuffer);
Jamie Madillc93d6f32014-04-15 16:12:41 -0400196
197 ASSERT_GL_NO_ERROR();
Corentin Wallez322653b2015-06-17 18:33:56 +0200198 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Kenneth Russell69382852017-07-21 16:38:44 -0400199
200 if (extensionEnabled("GL_EXT_texture_format_BGRA8888"))
201 {
202 // BGRA single-sampled framebuffer
203 glGenTextures(1, &mBGRAColorbuffer);
204 glBindTexture(GL_TEXTURE_2D, mBGRAColorbuffer);
205 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, getWindowWidth(), getWindowHeight(), 0,
206 GL_BGRA_EXT, GL_UNSIGNED_BYTE, nullptr);
207
208 glGenFramebuffers(1, &mBGRAFBO);
209 glBindFramebuffer(GL_FRAMEBUFFER, mBGRAFBO);
210 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
211 mBGRAColorbuffer, 0);
212
213 ASSERT_GL_NO_ERROR();
214 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
215
216 // BGRA multisampled framebuffer
217 glGenRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
218 glBindRenderbuffer(GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
219 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_BGRA8_EXT,
220 getWindowWidth(), getWindowHeight());
221
222 glGenFramebuffers(1, &mBGRAMultisampledFBO);
223 glBindFramebuffer(GL_FRAMEBUFFER, mBGRAMultisampledFBO);
224 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
225 mBGRAMultisampledRenderbuffer);
226
227 ASSERT_GL_NO_ERROR();
228 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
229 }
Jamie Madillc93d6f32014-04-15 16:12:41 -0400230 }
231
Geoff Lange8a1f782013-10-18 16:14:30 -0400232 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
233 }
234
235 virtual void TearDown()
236 {
237 glDeleteProgram(mCheckerProgram);
238 glDeleteProgram(mBlueProgram);
239
240 glDeleteFramebuffers(1, &mUserFBO);
241 glDeleteTextures(1, &mUserColorBuffer);
242 glDeleteRenderbuffers(1, &mUserDepthStencilBuffer);
243
244 glDeleteFramebuffers(1, &mSmallFBO);
245 glDeleteTextures(1, &mSmallColorBuffer);
246 glDeleteRenderbuffers(1, &mSmallDepthStencilBuffer);
247
248 glDeleteFramebuffers(1, &mColorOnlyFBO);
249 glDeleteTextures(1, &mSmallDepthStencilBuffer);
250
251 glDeleteFramebuffers(1, &mDiffFormatFBO);
252 glDeleteTextures(1, &mDiffFormatColorBuffer);
253
254 glDeleteFramebuffers(1, &mDiffSizeFBO);
255 glDeleteTextures(1, &mDiffSizeColorBuffer);
256
257 if (extensionEnabled("GL_EXT_draw_buffers"))
258 {
259 glDeleteFramebuffers(1, &mMRTFBO);
260 glDeleteTextures(1, &mMRTColorBuffer0);
261 glDeleteTextures(1, &mMRTColorBuffer1);
262 }
263
Jamie Madillc93d6f32014-04-15 16:12:41 -0400264 if (mRGBAColorbuffer != 0)
265 {
266 glDeleteTextures(1, &mRGBAColorbuffer);
267 }
268
269 if (mRGBAFBO != 0)
270 {
Kenneth Russell69382852017-07-21 16:38:44 -0400271 glDeleteFramebuffers(1, &mRGBAFBO);
272 }
273
274 if (mRGBAMultisampledRenderbuffer != 0)
275 {
276 glDeleteRenderbuffers(1, &mRGBAMultisampledRenderbuffer);
277 }
278
279 if (mRGBAMultisampledFBO != 0)
280 {
281 glDeleteFramebuffers(1, &mRGBAMultisampledFBO);
282 }
283
284 if (mBGRAColorbuffer != 0)
285 {
286 glDeleteTextures(1, &mBGRAColorbuffer);
287 }
288
289 if (mBGRAFBO != 0)
290 {
291 glDeleteFramebuffers(1, &mBGRAFBO);
Jamie Madillc93d6f32014-04-15 16:12:41 -0400292 }
293
294 if (mBGRAMultisampledRenderbuffer != 0)
295 {
296 glDeleteRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
297 }
298
299 if (mBGRAMultisampledFBO != 0)
300 {
301 glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
302 }
303
Geoff Lange8a1f782013-10-18 16:14:30 -0400304 ANGLETest::TearDown();
305 }
306
Kenneth Russell69382852017-07-21 16:38:44 -0400307 void multisampleTestHelper(GLuint readFramebuffer, GLuint drawFramebuffer)
308 {
309 glClearColor(0.0, 1.0, 0.0, 1.0);
310 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, readFramebuffer);
311 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
312 EXPECT_GL_NO_ERROR();
313
314 glBindFramebuffer(GL_READ_FRAMEBUFFER, readFramebuffer);
315 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFramebuffer);
316 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
317 getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
318 EXPECT_GL_NO_ERROR();
319
320 glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFramebuffer);
321 EXPECT_PIXEL_EQ(getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
322 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
323 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
324 EXPECT_PIXEL_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
325 }
326
327 bool checkExtension(const std::string &extension)
328 {
329 if (!extensionEnabled(extension))
330 {
331 std::cout << "Test skipped because " << extension << " not supported." << std::endl;
332 return false;
333 }
334
335 return true;
336 }
337
Geoff Lange8a1f782013-10-18 16:14:30 -0400338 GLuint mCheckerProgram;
339 GLuint mBlueProgram;
340
341 GLuint mOriginalFBO;
342
343 GLuint mUserFBO;
344 GLuint mUserColorBuffer;
345 GLuint mUserDepthStencilBuffer;
346
347 GLuint mSmallFBO;
348 GLuint mSmallColorBuffer;
349 GLuint mSmallDepthStencilBuffer;
350
351 GLuint mColorOnlyFBO;
352 GLuint mColorOnlyColorBuffer;
353
354 GLuint mDiffFormatFBO;
355 GLuint mDiffFormatColorBuffer;
356
357 GLuint mDiffSizeFBO;
358 GLuint mDiffSizeColorBuffer;
359
360 GLuint mMRTFBO;
361 GLuint mMRTColorBuffer0;
362 GLuint mMRTColorBuffer1;
Jamie Madillc93d6f32014-04-15 16:12:41 -0400363
364 GLuint mRGBAColorbuffer;
365 GLuint mRGBAFBO;
Kenneth Russell69382852017-07-21 16:38:44 -0400366 GLuint mRGBAMultisampledRenderbuffer;
367 GLuint mRGBAMultisampledFBO;
Jamie Madillc93d6f32014-04-15 16:12:41 -0400368
Kenneth Russell69382852017-07-21 16:38:44 -0400369 GLuint mBGRAColorbuffer;
370 GLuint mBGRAFBO;
Jamie Madillc93d6f32014-04-15 16:12:41 -0400371 GLuint mBGRAMultisampledRenderbuffer;
372 GLuint mBGRAMultisampledFBO;
Geoff Lange8a1f782013-10-18 16:14:30 -0400373};
374
375// Draw to user-created framebuffer, blit whole-buffer color to original framebuffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400376TEST_P(BlitFramebufferANGLETest, BlitColorToDefault)
Geoff Lange8a1f782013-10-18 16:14:30 -0400377{
378 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
379
380 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
381
Olli Etuaho5804dc82018-04-13 14:11:46 +0300382 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400383
384 EXPECT_GL_NO_ERROR();
385
386 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
387 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
388
389 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
390 GL_COLOR_BUFFER_BIT, GL_NEAREST);
391
392 EXPECT_GL_NO_ERROR();
393
394 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
395
396 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
397 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
398 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
399 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
400}
401
402// Draw to system framebuffer, blit whole-buffer color to user-created framebuffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400403TEST_P(BlitFramebufferANGLETest, ReverseColorBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400404{
405 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
406
407 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
408
Olli Etuaho5804dc82018-04-13 14:11:46 +0300409 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400410
411 EXPECT_GL_NO_ERROR();
412
413 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
414 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
415
416 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
417 GL_COLOR_BUFFER_BIT, GL_NEAREST);
418
419 EXPECT_GL_NO_ERROR();
420
421 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
422
423 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
424 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
425 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
426 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
427}
428
429// blit from user-created FBO to system framebuffer, with the scissor test enabled.
Jamie Madillfa05f602015-05-07 13:47:11 -0400430TEST_P(BlitFramebufferANGLETest, ScissoredBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400431{
432 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
433
434 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
435
Olli Etuaho5804dc82018-04-13 14:11:46 +0300436 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400437
438 EXPECT_GL_NO_ERROR();
439
440 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
441 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
442
443 glClearColor(1.0, 1.0, 1.0, 1.0);
444 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
445
446 glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
447 glEnable(GL_SCISSOR_TEST);
448
449 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
450 GL_COLOR_BUFFER_BIT, GL_NEAREST);
451
452 EXPECT_GL_NO_ERROR();
453
454 glDisable(GL_SCISSOR_TEST);
455
456 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
457
458 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
459 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
460 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
461 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
462}
463
464// blit from system FBO to user-created framebuffer, with the scissor test enabled.
Jamie Madillfa05f602015-05-07 13:47:11 -0400465TEST_P(BlitFramebufferANGLETest, ReverseScissoredBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400466{
467 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
468
469 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
470
Olli Etuaho5804dc82018-04-13 14:11:46 +0300471 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400472
473 EXPECT_GL_NO_ERROR();
474
475 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
476 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
477
478 glClearColor(1.0, 1.0, 1.0, 1.0);
479 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
480
481 glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
482 glEnable(GL_SCISSOR_TEST);
483
484 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
485 GL_COLOR_BUFFER_BIT, GL_NEAREST);
486
487 EXPECT_GL_NO_ERROR();
488
489 glDisable(GL_SCISSOR_TEST);
490
491 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
492
493 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
494 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
495 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
496 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
497}
498
499// blit from user-created FBO to system framebuffer, using region larger than buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400500TEST_P(BlitFramebufferANGLETest, OversizedBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400501{
502 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
503
504 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
505
Olli Etuaho5804dc82018-04-13 14:11:46 +0300506 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400507
508 EXPECT_GL_NO_ERROR();
509
510 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
511 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
512
513 glClearColor(1.0, 1.0, 1.0, 1.0);
514 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
515
516 glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2,
517 GL_COLOR_BUFFER_BIT, GL_NEAREST);
518
519 EXPECT_GL_NO_ERROR();
520
521 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
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, using region larger than buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400530TEST_P(BlitFramebufferANGLETest, ReverseOversizedBlit)
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
Olli Etuaho5804dc82018-04-13 14:11:46 +0300536 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400537
538 EXPECT_GL_NO_ERROR();
539
540 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
541 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
542
543 glClearColor(1.0, 1.0, 1.0, 1.0);
544 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
545
546 glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2,
547 GL_COLOR_BUFFER_BIT, GL_NEAREST);
548 EXPECT_GL_NO_ERROR();
549
550 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
551
552 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
553 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
554 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
555 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
556}
557
558// blit from user-created FBO to system framebuffer, with depth buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400559TEST_P(BlitFramebufferANGLETest, BlitWithDepth)
Geoff Lange8a1f782013-10-18 16:14:30 -0400560{
561 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
562
563 glDepthMask(GL_TRUE);
564 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
565
566 glEnable(GL_DEPTH_TEST);
567
Olli Etuaho5804dc82018-04-13 14:11:46 +0300568 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400569
570 EXPECT_GL_NO_ERROR();
571
572 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
573 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
574
575 glClearColor(1.0, 1.0, 1.0, 1.0);
576 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
577
578 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
579 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
580 EXPECT_GL_NO_ERROR();
581
582 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
583
584 // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
Olli Etuaho5804dc82018-04-13 14:11:46 +0300585 drawQuad(mBlueProgram, essl1_shaders::PositionAttrib(), 0.8f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400586
587 glDisable(GL_DEPTH_TEST);
588
589 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
590 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
591 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
592 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
593}
594
595// blit from system FBO to user-created framebuffer, with depth buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400596TEST_P(BlitFramebufferANGLETest, ReverseBlitWithDepth)
Geoff Lange8a1f782013-10-18 16:14:30 -0400597{
598 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
599
600 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
601
602 glEnable(GL_DEPTH_TEST);
603
Olli Etuaho5804dc82018-04-13 14:11:46 +0300604 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400605
606 EXPECT_GL_NO_ERROR();
607
608 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
609 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
610
611 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
612 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
613
614 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
615 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
616 EXPECT_GL_NO_ERROR();
617
618 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
619
620 // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
621
Olli Etuaho5804dc82018-04-13 14:11:46 +0300622 drawQuad(mBlueProgram, essl1_shaders::PositionAttrib(), 0.8f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400623
624 glDisable(GL_DEPTH_TEST);
625
626 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
627 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
628 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
629 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
630}
631
632// blit from one region of the system fbo to another-- this should fail.
Jamie Madillfa05f602015-05-07 13:47:11 -0400633TEST_P(BlitFramebufferANGLETest, BlitSameBufferOriginal)
Geoff Lange8a1f782013-10-18 16:14:30 -0400634{
635 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
636
637 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
638
Olli Etuaho5804dc82018-04-13 14:11:46 +0300639 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400640
641 EXPECT_GL_NO_ERROR();
642
643 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(),
644 GL_COLOR_BUFFER_BIT, GL_NEAREST);
645 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
646}
647
648// blit from one region of the system fbo to another.
Jamie Madillfa05f602015-05-07 13:47:11 -0400649TEST_P(BlitFramebufferANGLETest, BlitSameBufferUser)
Geoff Lange8a1f782013-10-18 16:14:30 -0400650{
651 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
652
653 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
654
Olli Etuaho5804dc82018-04-13 14:11:46 +0300655 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400656
657 EXPECT_GL_NO_ERROR();
658
659 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(),
660 GL_COLOR_BUFFER_BIT, GL_NEAREST);
661 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
662}
663
Jamie Madillfa05f602015-05-07 13:47:11 -0400664TEST_P(BlitFramebufferANGLETest, BlitPartialColor)
Geoff Lange8a1f782013-10-18 16:14:30 -0400665{
666 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
667
668 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
669
Olli Etuaho5804dc82018-04-13 14:11:46 +0300670 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400671
672 EXPECT_GL_NO_ERROR();
673
674 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
675 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
676
677 glClearColor(1.0, 1.0, 1.0, 1.0);
678 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
679
680 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight(),
681 GL_COLOR_BUFFER_BIT, GL_NEAREST);
682
683 EXPECT_GL_NO_ERROR();
684
685 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
686
687 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
688 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
689 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
690 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
691}
692
Jamie Madillfa05f602015-05-07 13:47:11 -0400693TEST_P(BlitFramebufferANGLETest, BlitDifferentSizes)
Geoff Lange8a1f782013-10-18 16:14:30 -0400694{
695 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
696
697 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
698
Olli Etuaho5804dc82018-04-13 14:11:46 +0300699 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400700
701 EXPECT_GL_NO_ERROR();
702
703 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mSmallFBO);
704 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
705
706 glClearColor(1.0, 1.0, 1.0, 1.0);
707 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
708
709 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
710 GL_COLOR_BUFFER_BIT, GL_NEAREST);
711
712 EXPECT_GL_NO_ERROR();
713
714 glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
715
716 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
717
718 EXPECT_GL_NO_ERROR();
719}
720
Jamie Madillfa05f602015-05-07 13:47:11 -0400721TEST_P(BlitFramebufferANGLETest, BlitWithMissingAttachments)
Geoff Lange8a1f782013-10-18 16:14:30 -0400722{
723 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
724
725 glClear(GL_COLOR_BUFFER_BIT);
Olli Etuaho5804dc82018-04-13 14:11:46 +0300726 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400727
728 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
729 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
730
731 glClearColor(1.0, 1.0, 1.0, 1.0);
732 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
733
He Yunchao66a41a22016-12-15 16:45:05 +0800734 // generate INVALID_OPERATION if the read FBO has no depth attachment
735 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
736 getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
737 GL_NEAREST);
Geoff Lange8a1f782013-10-18 16:14:30 -0400738
He Yunchao66a41a22016-12-15 16:45:05 +0800739 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Geoff Lange8a1f782013-10-18 16:14:30 -0400740
He Yunchao66a41a22016-12-15 16:45:05 +0800741 // generate INVALID_OPERATION if the read FBO has no stencil attachment
742 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
743 getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
744 GL_NEAREST);
Geoff Lange8a1f782013-10-18 16:14:30 -0400745
He Yunchao66a41a22016-12-15 16:45:05 +0800746 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Geoff Lange8a1f782013-10-18 16:14:30 -0400747
He Yunchao66a41a22016-12-15 16:45:05 +0800748 // generate INVALID_OPERATION if we read from a missing color attachment
749 glReadBuffer(GL_COLOR_ATTACHMENT1);
750 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
751 getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
Geoff Lange8a1f782013-10-18 16:14:30 -0400752
He Yunchao66a41a22016-12-15 16:45:05 +0800753 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Geoff Lange8a1f782013-10-18 16:14:30 -0400754}
755
Jamie Madillfa05f602015-05-07 13:47:11 -0400756TEST_P(BlitFramebufferANGLETest, BlitStencil)
Geoff Lange8a1f782013-10-18 16:14:30 -0400757{
Jamie Madill8e1936c2014-12-03 15:20:12 -0500758 // TODO(jmadill): Figure out if we can fix this on D3D9.
Yunchao He9550c602018-02-13 14:47:05 +0800759 // https://code.google.com/p/angleproject/issues/detail?id=2205
760 ANGLE_SKIP_TEST_IF(IsIntel() && IsD3D9());
Jamie Madill8e1936c2014-12-03 15:20:12 -0500761
Geoff Lange8a1f782013-10-18 16:14:30 -0400762 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
763
764 glClear(GL_COLOR_BUFFER_BIT);
765 // fill the stencil buffer with 0x1
766 glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
767 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
Yunchao He9550c602018-02-13 14:47:05 +0800768 glEnable(GL_STENCIL_TEST);
Olli Etuaho5804dc82018-04-13 14:11:46 +0300769 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400770
771 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
772 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
773
774 glClearColor(1.0, 1.0, 1.0, 1.0);
775 glClearStencil(0x0);
776 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
777
778 // depth blit request should be silently ignored, because the read FBO has no depth attachment
779 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
780 GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
781
782 EXPECT_GL_NO_ERROR();
783
784 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
785
786 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
787 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
788 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
789 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
790
791 glStencilFunc(GL_EQUAL, 0x1, 0xFF); // only pass if stencil buffer at pixel reads 0x1
Olli Etuaho5804dc82018-04-13 14:11:46 +0300792 drawQuad(mBlueProgram, essl1_shaders::PositionAttrib(),
793 0.8f); // blue quad will draw if stencil buffer was copied
Geoff Lange8a1f782013-10-18 16:14:30 -0400794 glDisable(GL_STENCIL_TEST);
795
796 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
797 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
798 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
799 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
800}
801
802// make sure that attempting to blit a partial depth buffer issues an error
Jamie Madillfa05f602015-05-07 13:47:11 -0400803TEST_P(BlitFramebufferANGLETest, BlitPartialDepthStencil)
Geoff Lange8a1f782013-10-18 16:14:30 -0400804{
805 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
806
807 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
808
Olli Etuaho5804dc82018-04-13 14:11:46 +0300809 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400810
811 EXPECT_GL_NO_ERROR();
812
813 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
814 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
815
816 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
817 getWindowWidth() / 2, getWindowHeight() / 2, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
818 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
819}
820
821// Test blit with MRT framebuffers
Jamie Madillfa05f602015-05-07 13:47:11 -0400822TEST_P(BlitFramebufferANGLETest, BlitMRT)
Geoff Lange8a1f782013-10-18 16:14:30 -0400823{
824 if (!extensionEnabled("GL_EXT_draw_buffers"))
825 {
826 return;
827 }
828
829 GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
830
831 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
832 glDrawBuffersEXT(2, drawBuffers);
833
834 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
835
836 glClear(GL_COLOR_BUFFER_BIT);
Olli Etuaho5804dc82018-04-13 14:11:46 +0300837
838 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
839
Geoff Lange8a1f782013-10-18 16:14:30 -0400840 EXPECT_GL_NO_ERROR();
841
842 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
843 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mMRTFBO);
844
845 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
846 GL_COLOR_BUFFER_BIT, GL_NEAREST);
847
848 EXPECT_GL_NO_ERROR();
849
850 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
851
852 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
853 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
854 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
855 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
856
857 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
858 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
859
860 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
861 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
862 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
863 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
864
865 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
866 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0);
867}
868
Kenneth Russell69382852017-07-21 16:38:44 -0400869// Test multisampled framebuffer blits if supported
870TEST_P(BlitFramebufferANGLETest, MultisampledRGBAToRGBA)
871{
872 if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
873 return;
874
875 if (!checkExtension("GL_OES_rgb8_rgba8"))
876 return;
877
878 multisampleTestHelper(mRGBAMultisampledFBO, mRGBAFBO);
879}
880
881TEST_P(BlitFramebufferANGLETest, MultisampledRGBAToBGRA)
882{
883 if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
884 return;
885
886 if (!checkExtension("GL_OES_rgb8_rgba8"))
887 return;
888
889 if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
890 return;
891
892 multisampleTestHelper(mRGBAMultisampledFBO, mBGRAFBO);
893}
894
895TEST_P(BlitFramebufferANGLETest, MultisampledBGRAToRGBA)
896{
897 if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
898 return;
899
900 if (!checkExtension("GL_OES_rgb8_rgba8"))
901 return;
902
903 if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
904 return;
905
906 multisampleTestHelper(mBGRAMultisampledFBO, mRGBAFBO);
907}
908
909TEST_P(BlitFramebufferANGLETest, MultisampledBGRAToBGRA)
910{
911 if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
912 return;
913
914 if (!checkExtension("GL_OES_rgb8_rgba8"))
915 return;
916
917 if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
918 return;
919
920 multisampleTestHelper(mBGRAMultisampledFBO, mBGRAFBO);
921}
922
Geoff Lange8a1f782013-10-18 16:14:30 -0400923// Make sure that attempts to stretch in a blit call issue an error
Jamie Madillfa05f602015-05-07 13:47:11 -0400924TEST_P(BlitFramebufferANGLETest, ErrorStretching)
Geoff Lange8a1f782013-10-18 16:14:30 -0400925{
926 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
927
928 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
929
Olli Etuaho5804dc82018-04-13 14:11:46 +0300930 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400931
932 EXPECT_GL_NO_ERROR();
933
934 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
935 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
936
937 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
938 getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
939 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
940}
941
942// Make sure that attempts to flip in a blit call issue an error
Jamie Madillfa05f602015-05-07 13:47:11 -0400943TEST_P(BlitFramebufferANGLETest, ErrorFlipping)
Geoff Lange8a1f782013-10-18 16:14:30 -0400944{
945 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
946
947 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
948
Olli Etuaho5804dc82018-04-13 14:11:46 +0300949 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400950
951 EXPECT_GL_NO_ERROR();
952
953 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
954 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
955
956 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight() / 2,
957 0, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
958 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
959}
960
Jamie Madillfa05f602015-05-07 13:47:11 -0400961TEST_P(BlitFramebufferANGLETest, Errors)
Geoff Lange8a1f782013-10-18 16:14:30 -0400962{
963 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
964
965 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
966
Olli Etuaho5804dc82018-04-13 14:11:46 +0300967 drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
Geoff Lange8a1f782013-10-18 16:14:30 -0400968
969 EXPECT_GL_NO_ERROR();
970
971 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
972 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
973
974 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
975 GL_COLOR_BUFFER_BIT, GL_LINEAR);
976 EXPECT_GL_ERROR(GL_INVALID_ENUM);
977
978 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
979 GL_COLOR_BUFFER_BIT | 234, GL_NEAREST);
980 EXPECT_GL_ERROR(GL_INVALID_VALUE);
981
982 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mDiffFormatFBO);
983
984 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
985 GL_COLOR_BUFFER_BIT, GL_NEAREST);
986 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Geoff Lange8a1f782013-10-18 16:14:30 -0400987}
Jamie Madillfa05f602015-05-07 13:47:11 -0400988
Geoff Lange0cc2a42016-01-20 10:58:17 -0500989// TODO(geofflang): Fix the dependence on glBlitFramebufferANGLE without checks and assuming the
990// default framebuffer is BGRA to enable the GL and GLES backends. (http://anglebug.com/1289)
991
Jamie Madill78a9c732016-07-15 11:22:43 -0400992class BlitFramebufferTest : public ANGLETest
993{
994 protected:
995 BlitFramebufferTest()
996 {
997 setWindowWidth(256);
998 setWindowHeight(256);
999 setConfigRedBits(8);
1000 setConfigGreenBits(8);
1001 setConfigBlueBits(8);
1002 setConfigAlphaBits(8);
1003 setConfigDepthBits(24);
1004 setConfigStencilBits(8);
1005 }
Olli Etuahode279592018-04-26 12:25:13 +03001006
1007 void initColorFBO(GLFramebuffer *fbo,
1008 GLRenderbuffer *rbo,
1009 GLenum rboFormat,
1010 GLsizei width,
1011 GLsizei height)
1012 {
1013 glBindRenderbuffer(GL_RENDERBUFFER, *rbo);
1014 glRenderbufferStorage(GL_RENDERBUFFER, rboFormat, width, height);
1015
1016 glBindFramebuffer(GL_FRAMEBUFFER, *fbo);
1017 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, *rbo);
1018 }
1019
1020 void initColorFBOWithCheckerPattern(GLFramebuffer *fbo,
1021 GLRenderbuffer *rbo,
1022 GLenum rboFormat,
1023 GLsizei width,
1024 GLsizei height)
1025 {
1026 initColorFBO(fbo, rbo, rboFormat, width, height);
1027
1028 ANGLE_GL_PROGRAM(checkerProgram, essl1_shaders::vs::Passthrough(),
1029 essl1_shaders::fs::Checkered());
1030 glViewport(0, 0, width, height);
1031 glBindFramebuffer(GL_FRAMEBUFFER, *fbo);
1032 drawQuad(checkerProgram.get(), essl1_shaders::PositionAttrib(), 0.5f);
1033 }
Jamie Madill78a9c732016-07-15 11:22:43 -04001034};
1035
Jamie Madill196ca362016-07-12 10:54:04 -04001036// Tests resolving a multisample depth buffer.
1037TEST_P(BlitFramebufferTest, MultisampleDepth)
1038{
Geoff Langf1bcd012018-04-27 14:21:55 -04001039 // TODO(oetuaho@nvidia.com): http://crbug.com/837717
1040 ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
1041
Jamie Madill196ca362016-07-12 10:54:04 -04001042 GLRenderbuffer renderbuf;
1043 glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
1044 glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256);
1045
Jamie Madill196ca362016-07-12 10:54:04 -04001046 const std::string &fragment =
1047 "#version 300 es\n"
1048 "out mediump vec4 red;\n"
1049 "void main() {\n"
1050 " red = vec4(1.0, 0.0, 0.0, 1.0);\n"
1051 " gl_FragDepth = 0.5;\n"
1052 "}";
1053
Olli Etuaho5804dc82018-04-13 14:11:46 +03001054 ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), fragment);
Jamie Madill196ca362016-07-12 10:54:04 -04001055
1056 GLFramebuffer framebuffer;
1057 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
1058 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
1059 renderbuf.get());
1060
1061 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1062
1063 glClearDepthf(0.5f);
1064 glClear(GL_DEPTH_BUFFER_BIT);
1065
1066 GLRenderbuffer destRenderbuf;
1067 glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get());
1068 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 256, 256);
1069
1070 GLFramebuffer resolved;
1071 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved.get());
1072 glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
1073 destRenderbuf.get());
1074
1075 glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer.get());
1076 glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
1077
1078 glBindFramebuffer(GL_FRAMEBUFFER, resolved.get());
1079
1080 GLTexture colorbuf;
1081 glBindTexture(GL_TEXTURE_2D, colorbuf.get());
1082 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
1083 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorbuf.get(), 0);
1084
1085 ASSERT_GL_NO_ERROR();
1086
1087 // Clear to green
1088 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1089 glClear(GL_COLOR_BUFFER_BIT);
1090 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1091
1092 // Draw with 0.5f test and the test should pass.
1093 glEnable(GL_DEPTH_TEST);
1094 glDepthFunc(GL_EQUAL);
Olli Etuaho5804dc82018-04-13 14:11:46 +03001095 drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
Jamie Madill196ca362016-07-12 10:54:04 -04001096 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1097
1098 ASSERT_GL_NO_ERROR();
1099}
1100
Jamie Madill78a9c732016-07-15 11:22:43 -04001101// Test resolving a multisampled stencil buffer.
1102TEST_P(BlitFramebufferTest, MultisampleStencil)
1103{
Olli Etuahode279592018-04-26 12:25:13 +03001104 // Incorrect rendering results seen on AMD Windows OpenGL. http://anglebug.com/2486
1105 ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL() && IsWindows());
1106
Jamie Madill78a9c732016-07-15 11:22:43 -04001107 GLRenderbuffer renderbuf;
1108 glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
1109 glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_STENCIL_INDEX8, 256, 256);
1110
Olli Etuaho5804dc82018-04-13 14:11:46 +03001111 ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
Jamie Madill78a9c732016-07-15 11:22:43 -04001112
1113 GLFramebuffer framebuffer;
1114 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
1115 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1116 renderbuf.get());
1117
1118 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1119
1120 // fill the stencil buffer with 0x1
1121 glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
1122 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1123 glEnable(GL_STENCIL_TEST);
Olli Etuaho5804dc82018-04-13 14:11:46 +03001124 drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
Jamie Madill78a9c732016-07-15 11:22:43 -04001125
1126 GLTexture destColorbuf;
1127 glBindTexture(GL_TEXTURE_2D, destColorbuf.get());
1128 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
1129
1130 GLRenderbuffer destRenderbuf;
1131 glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get());
1132 glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 256, 256);
1133
1134 GLFramebuffer resolved;
1135 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved.get());
1136 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
1137 destColorbuf.get(), 0);
1138 glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1139 destRenderbuf.get());
1140
1141 glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer.get());
1142 glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
1143
1144 glBindFramebuffer(GL_FRAMEBUFFER, resolved.get());
1145
1146 ASSERT_GL_NO_ERROR();
1147
1148 // Clear to green
1149 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1150 glClear(GL_COLOR_BUFFER_BIT);
1151 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1152
1153 // Draw red if the stencil is 0x1, which should be true after the blit/resolve.
1154 glStencilFunc(GL_EQUAL, 0x1, 0xFF);
Olli Etuaho5804dc82018-04-13 14:11:46 +03001155 drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
Jamie Madill78a9c732016-07-15 11:22:43 -04001156 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1157
1158 ASSERT_GL_NO_ERROR();
1159}
1160
Olli Etuahode279592018-04-26 12:25:13 +03001161// Blit an SRGB framebuffer and scale it.
1162TEST_P(BlitFramebufferTest, BlitSRGBToRGBAndScale)
1163{
1164 constexpr const GLsizei kWidth = 256;
1165 constexpr const GLsizei kHeight = 256;
1166
1167 GLRenderbuffer sourceRBO, targetRBO;
1168 GLFramebuffer sourceFBO, targetFBO;
1169 initColorFBOWithCheckerPattern(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth * 2,
1170 kHeight * 2);
1171 initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
1172
1173 EXPECT_GL_NO_ERROR();
1174
1175 glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
1176 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
1177
1178 glViewport(0, 0, kWidth, kHeight);
1179
1180 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
1181 glClear(GL_COLOR_BUFFER_BIT);
1182
1183 // Scale down without flipping.
1184 glBlitFramebuffer(0, 0, kWidth * 2, kHeight * 2, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
1185 GL_NEAREST);
1186
1187 EXPECT_GL_NO_ERROR();
1188
1189 glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
1190
1191 EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::red);
1192 EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::green);
1193 EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::red);
1194 EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::green);
1195
1196 glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
1197 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
1198
1199 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
1200 glClear(GL_COLOR_BUFFER_BIT);
1201
1202 // Scale down and flip in the X direction.
1203 glBlitFramebuffer(0, 0, kWidth * 2, kHeight * 2, kWidth, 0, 0, kHeight, GL_COLOR_BUFFER_BIT,
1204 GL_NEAREST);
1205
1206 EXPECT_GL_NO_ERROR();
1207
1208 glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
1209
1210 EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::green);
1211 EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::red);
1212 EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::green);
1213 EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::red);
1214}
1215
1216// Blit a subregion of an SRGB framebuffer to an RGB framebuffer.
1217TEST_P(BlitFramebufferTest, PartialBlitSRGBToRGB)
1218{
1219 constexpr const GLsizei kWidth = 256;
1220 constexpr const GLsizei kHeight = 256;
1221
1222 GLRenderbuffer sourceRBO, targetRBO;
1223 GLFramebuffer sourceFBO, targetFBO;
1224 initColorFBOWithCheckerPattern(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth * 2,
1225 kHeight * 2);
1226 initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
1227
1228 EXPECT_GL_NO_ERROR();
1229
1230 glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
1231 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
1232
1233 glViewport(0, 0, kWidth, kHeight);
1234
1235 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
1236 glClear(GL_COLOR_BUFFER_BIT);
1237
1238 // Blit a part of the source FBO without flipping.
1239 glBlitFramebuffer(kWidth, kHeight, kWidth * 2, kHeight * 2, 0, 0, kWidth, kHeight,
1240 GL_COLOR_BUFFER_BIT, GL_NEAREST);
1241
1242 EXPECT_GL_NO_ERROR();
1243
1244 glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
1245
1246 EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::red);
1247 EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::red);
1248 EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::red);
1249 EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::red);
1250
1251 glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
1252 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
1253
1254 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
1255 glClear(GL_COLOR_BUFFER_BIT);
1256
1257 // Blit a part of the source FBO and flip in the X direction.
1258 glBlitFramebuffer(kWidth * 2, 0, kWidth, kHeight, kWidth, 0, 0, kHeight, GL_COLOR_BUFFER_BIT,
1259 GL_NEAREST);
1260
1261 EXPECT_GL_NO_ERROR();
1262
1263 glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
1264
1265 EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::green);
1266 EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::green);
1267 EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::green);
1268 EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::green);
1269}
1270
1271// Blit an SRGB framebuffer with an oversized source area (parts outside the source area should be
1272// clipped out).
1273TEST_P(BlitFramebufferTest, BlitSRGBToRGBOversizedSourceArea)
1274{
Olli Etuahode279592018-04-26 12:25:13 +03001275 constexpr const GLsizei kWidth = 256;
1276 constexpr const GLsizei kHeight = 256;
1277
1278 GLRenderbuffer sourceRBO, targetRBO;
1279 GLFramebuffer sourceFBO, targetFBO;
1280 initColorFBOWithCheckerPattern(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth, kHeight);
1281 initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
1282
1283 EXPECT_GL_NO_ERROR();
1284
1285 glViewport(0, 0, kWidth, kHeight);
1286
1287 glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
1288 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
1289
1290 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
1291 glClear(GL_COLOR_BUFFER_BIT);
1292
1293 // Blit so that the source area gets placed at the center of the target FBO.
1294 // The width of the source area is 1/4 of the width of the target FBO.
1295 glBlitFramebuffer(-3 * kWidth / 2, -3 * kHeight / 2, 5 * kWidth / 2, 5 * kHeight / 2, 0, 0,
1296 kWidth, kHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1297
1298 EXPECT_GL_NO_ERROR();
1299
1300 glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
1301
1302 // Source FBO colors can be found in the middle of the target FBO.
1303 EXPECT_PIXEL_COLOR_EQ(7 * kWidth / 16, 7 * kHeight / 16, GLColor::red);
1304 EXPECT_PIXEL_COLOR_EQ(9 * kWidth / 16, 7 * kHeight / 16, GLColor::green);
1305 EXPECT_PIXEL_COLOR_EQ(9 * kWidth / 16, 9 * kHeight / 16, GLColor::red);
1306 EXPECT_PIXEL_COLOR_EQ(7 * kWidth / 16, 9 * kHeight / 16, GLColor::green);
1307
1308 // Clear color should remain around the edges of the target FBO (WebGL 2.0 spec explicitly
1309 // requires this and ANGLE is expected to follow that).
1310 EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::black);
1311 EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::black);
1312 EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::black);
1313 EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::black);
1314}
1315
Olli Etuaho9aef81c2018-04-30 14:56:15 +03001316// Test blitFramebuffer size overflow checks. WebGL 2.0 spec section 5.41. We do validation for
1317// overflows also in non-WebGL mode to avoid triggering driver bugs.
1318TEST_P(BlitFramebufferTest, BlitFramebufferSizeOverflow)
1319{
1320 GLTexture textures[2];
1321 glBindTexture(GL_TEXTURE_2D, textures[0]);
1322 glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 4, 4);
1323 glBindTexture(GL_TEXTURE_2D, textures[1]);
1324 glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 4, 4);
1325
1326 GLFramebuffer framebuffers[2];
1327 glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffers[0]);
1328 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffers[1]);
1329
1330 ASSERT_GL_NO_ERROR();
1331
1332 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0],
1333 0);
1334 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1],
1335 0);
1336 ASSERT_GL_NO_ERROR();
1337
1338 // srcX
1339 glBlitFramebuffer(-1, 0, std::numeric_limits<GLint>::max(), 4, 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
1340 GL_NEAREST);
1341 EXPECT_GL_ERROR(GL_INVALID_VALUE);
1342 glBlitFramebuffer(std::numeric_limits<GLint>::max(), 0, -1, 4, 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
1343 GL_NEAREST);
1344 EXPECT_GL_ERROR(GL_INVALID_VALUE);
1345
1346 // srcY
1347 glBlitFramebuffer(0, -1, 4, std::numeric_limits<GLint>::max(), 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
1348 GL_NEAREST);
1349 EXPECT_GL_ERROR(GL_INVALID_VALUE);
1350 glBlitFramebuffer(0, std::numeric_limits<GLint>::max(), 4, -1, 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
1351 GL_NEAREST);
1352 EXPECT_GL_ERROR(GL_INVALID_VALUE);
1353
1354 // dstX
1355 glBlitFramebuffer(0, 0, 4, 4, -1, 0, std::numeric_limits<GLint>::max(), 4, GL_COLOR_BUFFER_BIT,
1356 GL_NEAREST);
1357 EXPECT_GL_ERROR(GL_INVALID_VALUE);
1358 glBlitFramebuffer(0, 0, 4, 4, std::numeric_limits<GLint>::max(), 0, -1, 4, GL_COLOR_BUFFER_BIT,
1359 GL_NEAREST);
1360 EXPECT_GL_ERROR(GL_INVALID_VALUE);
1361
1362 // dstY
1363 glBlitFramebuffer(0, 0, 4, 4, 0, -1, 4, std::numeric_limits<GLint>::max(), GL_COLOR_BUFFER_BIT,
1364 GL_NEAREST);
1365 EXPECT_GL_ERROR(GL_INVALID_VALUE);
1366 glBlitFramebuffer(0, 0, 4, 4, 0, std::numeric_limits<GLint>::max(), 4, -1, GL_COLOR_BUFFER_BIT,
1367 GL_NEAREST);
1368 EXPECT_GL_ERROR(GL_INVALID_VALUE);
1369}
1370
Jamie Madillfa05f602015-05-07 13:47:11 -04001371// 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 -08001372ANGLE_INSTANTIATE_TEST(BlitFramebufferANGLETest,
1373 ES2_D3D9(),
1374 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE),
Kenneth Russell69382852017-07-21 16:38:44 -04001375 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE),
1376 ES2_OPENGL(),
1377 ES3_OPENGL());
Jamie Madill78a9c732016-07-15 11:22:43 -04001378
Olli Etuahode279592018-04-26 12:25:13 +03001379// We're specifically testing GL 4.4 and GL 4.3 since on versions earlier than 4.4 FramebufferGL
1380// takes a different path for blitting SRGB textures.
1381ANGLE_INSTANTIATE_TEST(BlitFramebufferTest, ES3_D3D11(), ES3_OPENGL(4, 4), ES3_OPENGL(4, 3));