blob: 6e8de98e38186e3aa9bb39b326ca66297390aeb5 [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;
Kenneth Russell69382852017-07-21 16:38:44 -040055 mRGBAMultisampledRenderbuffer = 0;
56 mRGBAMultisampledFBO = 0;
Jamie Madillc93d6f32014-04-15 16:12:41 -040057
Kenneth Russell69382852017-07-21 16:38:44 -040058 mBGRAColorbuffer = 0;
59 mBGRAFBO = 0;
Jamie Madillc93d6f32014-04-15 16:12:41 -040060 mBGRAMultisampledRenderbuffer = 0;
61 mBGRAMultisampledFBO = 0;
Geoff Lange8a1f782013-10-18 16:14:30 -040062 }
63
64 virtual void SetUp()
65 {
66 ANGLETest::SetUp();
67
Olli Etuahoa20af6d2017-09-18 13:32:29 +030068 const std::string passthroughVS =
69 R"(precision highp float;
Geoff Lange8a1f782013-10-18 16:14:30 -040070 attribute vec4 position;
71 varying vec4 pos;
72
73 void main()
74 {
75 gl_Position = position;
76 pos = position;
Olli Etuahoa20af6d2017-09-18 13:32:29 +030077 })";
Geoff Lange8a1f782013-10-18 16:14:30 -040078
Olli Etuahoa20af6d2017-09-18 13:32:29 +030079 const std::string checkeredFS =
80 R"(precision highp float;
Geoff Lange8a1f782013-10-18 16:14:30 -040081 varying vec4 pos;
82
83 void main()
84 {
85 if (pos.x * pos.y > 0.0)
86 {
87 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
88 }
89 else
90 {
91 gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
92 }
Olli Etuahoa20af6d2017-09-18 13:32:29 +030093 })";
Geoff Lange8a1f782013-10-18 16:14:30 -040094
Olli Etuahoa20af6d2017-09-18 13:32:29 +030095 const std::string blueFS =
96 R"(precision highp float;
Geoff Lange8a1f782013-10-18 16:14:30 -040097 varying vec4 pos;
98
99 void main()
100 {
101 gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300102 })";
Geoff Lange8a1f782013-10-18 16:14:30 -0400103
Jamie Madill5599c8f2014-08-26 13:16:39 -0400104 mCheckerProgram = CompileProgram(passthroughVS, checkeredFS);
105 mBlueProgram = CompileProgram(passthroughVS, blueFS);
Geoff Lange8a1f782013-10-18 16:14:30 -0400106 if (mCheckerProgram == 0 || mBlueProgram == 0)
107 {
108 FAIL() << "shader compilation failed.";
109 }
110
111 EXPECT_GL_NO_ERROR();
112
113 GLint originalFBO;
114 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFBO);
115 if (originalFBO >= 0)
116 {
117 mOriginalFBO = (GLuint)originalFBO;
118 }
119
Geoff Langc4e93662017-05-01 10:45:59 -0400120 GLenum format = GL_BGRA_EXT;
121
Geoff Lange8a1f782013-10-18 16:14:30 -0400122 glGenFramebuffers(1, &mUserFBO);
123 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
124 glGenTextures(1, &mUserColorBuffer);
125 glGenRenderbuffers(1, &mUserDepthStencilBuffer);
126 glBindTexture(GL_TEXTURE_2D, mUserColorBuffer);
Geoff Lange8a1f782013-10-18 16:14:30 -0400127 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mUserColorBuffer, 0);
Geoff Langc4e93662017-05-01 10:45:59 -0400128 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
129 GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400130 glBindRenderbuffer(GL_RENDERBUFFER, mUserDepthStencilBuffer);
131 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth(), getWindowHeight());
132 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer);
133 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer);
134
Corentin Wallez322653b2015-06-17 18:33:56 +0200135 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400136 ASSERT_GL_NO_ERROR();
137
138 glGenFramebuffers(1, &mSmallFBO);
139 glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
140 glGenTextures(1, &mSmallColorBuffer);
141 glGenRenderbuffers(1, &mSmallDepthStencilBuffer);
142 glBindTexture(GL_TEXTURE_2D, mSmallColorBuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400143 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth() / 2, getWindowHeight() / 2, 0,
144 format, GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400145 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mSmallColorBuffer, 0);
146 glBindRenderbuffer(GL_RENDERBUFFER, mSmallDepthStencilBuffer);
147 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth() / 2, getWindowHeight() / 2);
148 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer);
149 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer);
150
Corentin Wallez322653b2015-06-17 18:33:56 +0200151 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400152 ASSERT_GL_NO_ERROR();
153
154 glGenFramebuffers(1, &mColorOnlyFBO);
155 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
156 glGenTextures(1, &mColorOnlyColorBuffer);
157 glBindTexture(GL_TEXTURE_2D, mColorOnlyColorBuffer);
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, GL_TEXTURE_2D, mColorOnlyColorBuffer, 0);
161
Corentin Wallez322653b2015-06-17 18:33:56 +0200162 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400163 ASSERT_GL_NO_ERROR();
164
165 glGenFramebuffers(1, &mDiffFormatFBO);
166 glBindFramebuffer(GL_FRAMEBUFFER, mDiffFormatFBO);
167 glGenTextures(1, &mDiffFormatColorBuffer);
168 glBindTexture(GL_TEXTURE_2D, mDiffFormatColorBuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400169 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB,
170 GL_UNSIGNED_SHORT_5_6_5, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400171 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffFormatColorBuffer, 0);
172
Corentin Wallez322653b2015-06-17 18:33:56 +0200173 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400174 ASSERT_GL_NO_ERROR();
175
176 glGenFramebuffers(1, &mDiffSizeFBO);
177 glBindFramebuffer(GL_FRAMEBUFFER, mDiffSizeFBO);
178 glGenTextures(1, &mDiffSizeColorBuffer);
179 glBindTexture(GL_TEXTURE_2D, mDiffSizeColorBuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400180 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth() * 2, getWindowHeight() * 2, 0,
181 format, GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400182 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffSizeColorBuffer, 0);
183
Corentin Wallez322653b2015-06-17 18:33:56 +0200184 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400185 ASSERT_GL_NO_ERROR();
186
187 if (extensionEnabled("GL_EXT_draw_buffers"))
188 {
189 glGenFramebuffers(1, &mMRTFBO);
190 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
191 glGenTextures(1, &mMRTColorBuffer0);
192 glGenTextures(1, &mMRTColorBuffer1);
193 glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer0);
Geoff Langc4e93662017-05-01 10:45:59 -0400194 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
195 GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400196 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
197 glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer1);
Geoff Langc4e93662017-05-01 10:45:59 -0400198 glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
199 GL_UNSIGNED_BYTE, nullptr);
Geoff Lange8a1f782013-10-18 16:14:30 -0400200 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0);
201
Corentin Wallez322653b2015-06-17 18:33:56 +0200202 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Geoff Lange8a1f782013-10-18 16:14:30 -0400203 ASSERT_GL_NO_ERROR();
204 }
205
Kenneth Russell69382852017-07-21 16:38:44 -0400206 if (extensionEnabled("GL_ANGLE_framebuffer_multisample") &&
207 extensionEnabled("GL_OES_rgb8_rgba8"))
Jamie Madillc93d6f32014-04-15 16:12:41 -0400208 {
Kenneth Russell69382852017-07-21 16:38:44 -0400209 // RGBA single-sampled framebuffer
Jamie Madillc93d6f32014-04-15 16:12:41 -0400210 glGenTextures(1, &mRGBAColorbuffer);
211 glBindTexture(GL_TEXTURE_2D, mRGBAColorbuffer);
Geoff Langc4e93662017-05-01 10:45:59 -0400212 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
213 GL_UNSIGNED_BYTE, nullptr);
Jamie Madillc93d6f32014-04-15 16:12:41 -0400214
215 glGenFramebuffers(1, &mRGBAFBO);
216 glBindFramebuffer(GL_FRAMEBUFFER, mRGBAFBO);
217 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mRGBAColorbuffer, 0);
218
219 ASSERT_GL_NO_ERROR();
Corentin Wallez322653b2015-06-17 18:33:56 +0200220 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Jamie Madillc93d6f32014-04-15 16:12:41 -0400221
Kenneth Russell69382852017-07-21 16:38:44 -0400222 // RGBA multisampled framebuffer
223 glGenRenderbuffers(1, &mRGBAMultisampledRenderbuffer);
224 glBindRenderbuffer(GL_RENDERBUFFER, mRGBAMultisampledRenderbuffer);
225 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_RGBA8, getWindowWidth(),
226 getWindowHeight());
Jamie Madillc93d6f32014-04-15 16:12:41 -0400227
Kenneth Russell69382852017-07-21 16:38:44 -0400228 glGenFramebuffers(1, &mRGBAMultisampledFBO);
229 glBindFramebuffer(GL_FRAMEBUFFER, mRGBAMultisampledFBO);
230 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
231 mRGBAMultisampledRenderbuffer);
Jamie Madillc93d6f32014-04-15 16:12:41 -0400232
233 ASSERT_GL_NO_ERROR();
Corentin Wallez322653b2015-06-17 18:33:56 +0200234 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
Kenneth Russell69382852017-07-21 16:38:44 -0400235
236 if (extensionEnabled("GL_EXT_texture_format_BGRA8888"))
237 {
238 // BGRA single-sampled framebuffer
239 glGenTextures(1, &mBGRAColorbuffer);
240 glBindTexture(GL_TEXTURE_2D, mBGRAColorbuffer);
241 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, getWindowWidth(), getWindowHeight(), 0,
242 GL_BGRA_EXT, GL_UNSIGNED_BYTE, nullptr);
243
244 glGenFramebuffers(1, &mBGRAFBO);
245 glBindFramebuffer(GL_FRAMEBUFFER, mBGRAFBO);
246 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
247 mBGRAColorbuffer, 0);
248
249 ASSERT_GL_NO_ERROR();
250 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
251
252 // BGRA multisampled framebuffer
253 glGenRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
254 glBindRenderbuffer(GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
255 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_BGRA8_EXT,
256 getWindowWidth(), getWindowHeight());
257
258 glGenFramebuffers(1, &mBGRAMultisampledFBO);
259 glBindFramebuffer(GL_FRAMEBUFFER, mBGRAMultisampledFBO);
260 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
261 mBGRAMultisampledRenderbuffer);
262
263 ASSERT_GL_NO_ERROR();
264 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
265 }
Jamie Madillc93d6f32014-04-15 16:12:41 -0400266 }
267
Geoff Lange8a1f782013-10-18 16:14:30 -0400268 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
269 }
270
271 virtual void TearDown()
272 {
273 glDeleteProgram(mCheckerProgram);
274 glDeleteProgram(mBlueProgram);
275
276 glDeleteFramebuffers(1, &mUserFBO);
277 glDeleteTextures(1, &mUserColorBuffer);
278 glDeleteRenderbuffers(1, &mUserDepthStencilBuffer);
279
280 glDeleteFramebuffers(1, &mSmallFBO);
281 glDeleteTextures(1, &mSmallColorBuffer);
282 glDeleteRenderbuffers(1, &mSmallDepthStencilBuffer);
283
284 glDeleteFramebuffers(1, &mColorOnlyFBO);
285 glDeleteTextures(1, &mSmallDepthStencilBuffer);
286
287 glDeleteFramebuffers(1, &mDiffFormatFBO);
288 glDeleteTextures(1, &mDiffFormatColorBuffer);
289
290 glDeleteFramebuffers(1, &mDiffSizeFBO);
291 glDeleteTextures(1, &mDiffSizeColorBuffer);
292
293 if (extensionEnabled("GL_EXT_draw_buffers"))
294 {
295 glDeleteFramebuffers(1, &mMRTFBO);
296 glDeleteTextures(1, &mMRTColorBuffer0);
297 glDeleteTextures(1, &mMRTColorBuffer1);
298 }
299
Jamie Madillc93d6f32014-04-15 16:12:41 -0400300 if (mRGBAColorbuffer != 0)
301 {
302 glDeleteTextures(1, &mRGBAColorbuffer);
303 }
304
305 if (mRGBAFBO != 0)
306 {
Kenneth Russell69382852017-07-21 16:38:44 -0400307 glDeleteFramebuffers(1, &mRGBAFBO);
308 }
309
310 if (mRGBAMultisampledRenderbuffer != 0)
311 {
312 glDeleteRenderbuffers(1, &mRGBAMultisampledRenderbuffer);
313 }
314
315 if (mRGBAMultisampledFBO != 0)
316 {
317 glDeleteFramebuffers(1, &mRGBAMultisampledFBO);
318 }
319
320 if (mBGRAColorbuffer != 0)
321 {
322 glDeleteTextures(1, &mBGRAColorbuffer);
323 }
324
325 if (mBGRAFBO != 0)
326 {
327 glDeleteFramebuffers(1, &mBGRAFBO);
Jamie Madillc93d6f32014-04-15 16:12:41 -0400328 }
329
330 if (mBGRAMultisampledRenderbuffer != 0)
331 {
332 glDeleteRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
333 }
334
335 if (mBGRAMultisampledFBO != 0)
336 {
337 glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
338 }
339
Geoff Lange8a1f782013-10-18 16:14:30 -0400340 ANGLETest::TearDown();
341 }
342
Kenneth Russell69382852017-07-21 16:38:44 -0400343 void multisampleTestHelper(GLuint readFramebuffer, GLuint drawFramebuffer)
344 {
345 glClearColor(0.0, 1.0, 0.0, 1.0);
346 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, readFramebuffer);
347 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
348 EXPECT_GL_NO_ERROR();
349
350 glBindFramebuffer(GL_READ_FRAMEBUFFER, readFramebuffer);
351 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFramebuffer);
352 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
353 getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
354 EXPECT_GL_NO_ERROR();
355
356 glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFramebuffer);
357 EXPECT_PIXEL_EQ(getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
358 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
359 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
360 EXPECT_PIXEL_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
361 }
362
363 bool checkExtension(const std::string &extension)
364 {
365 if (!extensionEnabled(extension))
366 {
367 std::cout << "Test skipped because " << extension << " not supported." << std::endl;
368 return false;
369 }
370
371 return true;
372 }
373
Geoff Lange8a1f782013-10-18 16:14:30 -0400374 GLuint mCheckerProgram;
375 GLuint mBlueProgram;
376
377 GLuint mOriginalFBO;
378
379 GLuint mUserFBO;
380 GLuint mUserColorBuffer;
381 GLuint mUserDepthStencilBuffer;
382
383 GLuint mSmallFBO;
384 GLuint mSmallColorBuffer;
385 GLuint mSmallDepthStencilBuffer;
386
387 GLuint mColorOnlyFBO;
388 GLuint mColorOnlyColorBuffer;
389
390 GLuint mDiffFormatFBO;
391 GLuint mDiffFormatColorBuffer;
392
393 GLuint mDiffSizeFBO;
394 GLuint mDiffSizeColorBuffer;
395
396 GLuint mMRTFBO;
397 GLuint mMRTColorBuffer0;
398 GLuint mMRTColorBuffer1;
Jamie Madillc93d6f32014-04-15 16:12:41 -0400399
400 GLuint mRGBAColorbuffer;
401 GLuint mRGBAFBO;
Kenneth Russell69382852017-07-21 16:38:44 -0400402 GLuint mRGBAMultisampledRenderbuffer;
403 GLuint mRGBAMultisampledFBO;
Jamie Madillc93d6f32014-04-15 16:12:41 -0400404
Kenneth Russell69382852017-07-21 16:38:44 -0400405 GLuint mBGRAColorbuffer;
406 GLuint mBGRAFBO;
Jamie Madillc93d6f32014-04-15 16:12:41 -0400407 GLuint mBGRAMultisampledRenderbuffer;
408 GLuint mBGRAMultisampledFBO;
Geoff Lange8a1f782013-10-18 16:14:30 -0400409};
410
411// Draw to user-created framebuffer, blit whole-buffer color to original framebuffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400412TEST_P(BlitFramebufferANGLETest, BlitColorToDefault)
Geoff Lange8a1f782013-10-18 16:14:30 -0400413{
414 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
415
416 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
417
418 drawQuad(mCheckerProgram, "position", 0.8f);
419
420 EXPECT_GL_NO_ERROR();
421
422 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
423 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
424
425 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
426 GL_COLOR_BUFFER_BIT, GL_NEAREST);
427
428 EXPECT_GL_NO_ERROR();
429
430 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
431
432 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
433 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
434 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
435 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
436}
437
438// Draw to system framebuffer, blit whole-buffer color to user-created framebuffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400439TEST_P(BlitFramebufferANGLETest, ReverseColorBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400440{
441 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
442
443 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
444
445 drawQuad(mCheckerProgram, "position", 0.8f);
446
447 EXPECT_GL_NO_ERROR();
448
449 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
450 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
451
452 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
453 GL_COLOR_BUFFER_BIT, GL_NEAREST);
454
455 EXPECT_GL_NO_ERROR();
456
457 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
458
459 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
460 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
461 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
462 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
463}
464
465// blit from user-created FBO to system framebuffer, with the scissor test enabled.
Jamie Madillfa05f602015-05-07 13:47:11 -0400466TEST_P(BlitFramebufferANGLETest, ScissoredBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400467{
468 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
469
470 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
471
472 drawQuad(mCheckerProgram, "position", 0.8f);
473
474 EXPECT_GL_NO_ERROR();
475
476 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
477 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
478
479 glClearColor(1.0, 1.0, 1.0, 1.0);
480 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
481
482 glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
483 glEnable(GL_SCISSOR_TEST);
484
485 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
486 GL_COLOR_BUFFER_BIT, GL_NEAREST);
487
488 EXPECT_GL_NO_ERROR();
489
490 glDisable(GL_SCISSOR_TEST);
491
492 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
493
494 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
495 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
496 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
497 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
498}
499
500// blit from system FBO to user-created framebuffer, with the scissor test enabled.
Jamie Madillfa05f602015-05-07 13:47:11 -0400501TEST_P(BlitFramebufferANGLETest, ReverseScissoredBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400502{
503 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
504
505 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
506
507 drawQuad(mCheckerProgram, "position", 0.8f);
508
509 EXPECT_GL_NO_ERROR();
510
511 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
512 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
513
514 glClearColor(1.0, 1.0, 1.0, 1.0);
515 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
516
517 glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
518 glEnable(GL_SCISSOR_TEST);
519
520 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
521 GL_COLOR_BUFFER_BIT, GL_NEAREST);
522
523 EXPECT_GL_NO_ERROR();
524
525 glDisable(GL_SCISSOR_TEST);
526
527 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
528
529 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
530 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
531 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
532 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
533}
534
535// blit from user-created FBO to system framebuffer, using region larger than buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400536TEST_P(BlitFramebufferANGLETest, OversizedBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400537{
538 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
539
540 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
541
542 drawQuad(mCheckerProgram, "position", 0.8f);
543
544 EXPECT_GL_NO_ERROR();
545
546 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
547 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
548
549 glClearColor(1.0, 1.0, 1.0, 1.0);
550 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
551
552 glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2,
553 GL_COLOR_BUFFER_BIT, GL_NEAREST);
554
555 EXPECT_GL_NO_ERROR();
556
557 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
558
559 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
560 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
561 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
562 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
563}
564
565// blit from system FBO to user-created framebuffer, using region larger than buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400566TEST_P(BlitFramebufferANGLETest, ReverseOversizedBlit)
Geoff Lange8a1f782013-10-18 16:14:30 -0400567{
568 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
569
570 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
571
572 drawQuad(mCheckerProgram, "position", 0.8f);
573
574 EXPECT_GL_NO_ERROR();
575
576 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
577 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
578
579 glClearColor(1.0, 1.0, 1.0, 1.0);
580 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
581
582 glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2,
583 GL_COLOR_BUFFER_BIT, GL_NEAREST);
584 EXPECT_GL_NO_ERROR();
585
586 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
587
588 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
589 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
590 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
591 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
592}
593
594// blit from user-created FBO to system framebuffer, with depth buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400595TEST_P(BlitFramebufferANGLETest, BlitWithDepth)
Geoff Lange8a1f782013-10-18 16:14:30 -0400596{
597 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
598
599 glDepthMask(GL_TRUE);
600 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
601
602 glEnable(GL_DEPTH_TEST);
603
604 drawQuad(mCheckerProgram, "position", 0.3f);
605
606 EXPECT_GL_NO_ERROR();
607
608 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
609 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
610
611 glClearColor(1.0, 1.0, 1.0, 1.0);
612 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
613
614 glBlitFramebufferANGLE(0, 0, getWindowWidth(), 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, mOriginalFBO);
619
620 // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
621 drawQuad(mBlueProgram, "position", 0.8f);
622
623 glDisable(GL_DEPTH_TEST);
624
625 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
626 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
627 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
628 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
629}
630
631// blit from system FBO to user-created framebuffer, with depth buffer.
Jamie Madillfa05f602015-05-07 13:47:11 -0400632TEST_P(BlitFramebufferANGLETest, ReverseBlitWithDepth)
Geoff Lange8a1f782013-10-18 16:14:30 -0400633{
634 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
635
636 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
637
638 glEnable(GL_DEPTH_TEST);
639
640 drawQuad(mCheckerProgram, "position", 0.3f);
641
642 EXPECT_GL_NO_ERROR();
643
644 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
645 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
646
647 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
648 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
649
650 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
651 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
652 EXPECT_GL_NO_ERROR();
653
654 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
655
656 // if blit is happening correctly, this quad will not draw, because it is behind the blitted one
657
658 drawQuad(mBlueProgram, "position", 0.8f);
659
660 glDisable(GL_DEPTH_TEST);
661
662 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
663 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
664 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
665 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
666}
667
668// blit from one region of the system fbo to another-- this should fail.
Jamie Madillfa05f602015-05-07 13:47:11 -0400669TEST_P(BlitFramebufferANGLETest, BlitSameBufferOriginal)
Geoff Lange8a1f782013-10-18 16:14:30 -0400670{
671 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
672
673 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
674
675 drawQuad(mCheckerProgram, "position", 0.3f);
676
677 EXPECT_GL_NO_ERROR();
678
679 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(),
680 GL_COLOR_BUFFER_BIT, GL_NEAREST);
681 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
682}
683
684// blit from one region of the system fbo to another.
Jamie Madillfa05f602015-05-07 13:47:11 -0400685TEST_P(BlitFramebufferANGLETest, BlitSameBufferUser)
Geoff Lange8a1f782013-10-18 16:14:30 -0400686{
687 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
688
689 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
690
691 drawQuad(mCheckerProgram, "position", 0.3f);
692
693 EXPECT_GL_NO_ERROR();
694
695 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(),
696 GL_COLOR_BUFFER_BIT, GL_NEAREST);
697 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
698}
699
Jamie Madillfa05f602015-05-07 13:47:11 -0400700TEST_P(BlitFramebufferANGLETest, BlitPartialColor)
Geoff Lange8a1f782013-10-18 16:14:30 -0400701{
702 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
703
704 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
705
706 drawQuad(mCheckerProgram, "position", 0.5f);
707
708 EXPECT_GL_NO_ERROR();
709
710 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
711 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
712
713 glClearColor(1.0, 1.0, 1.0, 1.0);
714 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
715
716 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight(),
717 GL_COLOR_BUFFER_BIT, GL_NEAREST);
718
719 EXPECT_GL_NO_ERROR();
720
721 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
722
723 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
724 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255);
725 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255);
726 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
727}
728
Jamie Madillfa05f602015-05-07 13:47:11 -0400729TEST_P(BlitFramebufferANGLETest, BlitDifferentSizes)
Geoff Lange8a1f782013-10-18 16:14:30 -0400730{
731 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
732
733 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
734
735 drawQuad(mCheckerProgram, "position", 0.5f);
736
737 EXPECT_GL_NO_ERROR();
738
739 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mSmallFBO);
740 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
741
742 glClearColor(1.0, 1.0, 1.0, 1.0);
743 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
744
745 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
746 GL_COLOR_BUFFER_BIT, GL_NEAREST);
747
748 EXPECT_GL_NO_ERROR();
749
750 glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
751
752 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
753
754 EXPECT_GL_NO_ERROR();
755}
756
Jamie Madillfa05f602015-05-07 13:47:11 -0400757TEST_P(BlitFramebufferANGLETest, BlitWithMissingAttachments)
Geoff Lange8a1f782013-10-18 16:14:30 -0400758{
759 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
760
761 glClear(GL_COLOR_BUFFER_BIT);
762 drawQuad(mCheckerProgram, "position", 0.3f);
763
764 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
765 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
766
767 glClearColor(1.0, 1.0, 1.0, 1.0);
768 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
769
He Yunchao66a41a22016-12-15 16:45:05 +0800770 // generate INVALID_OPERATION if the read FBO has no depth attachment
771 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
772 getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
773 GL_NEAREST);
Geoff Lange8a1f782013-10-18 16:14:30 -0400774
He Yunchao66a41a22016-12-15 16:45:05 +0800775 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Geoff Lange8a1f782013-10-18 16:14:30 -0400776
He Yunchao66a41a22016-12-15 16:45:05 +0800777 // generate INVALID_OPERATION if the read FBO has no stencil attachment
778 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
779 getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
780 GL_NEAREST);
Geoff Lange8a1f782013-10-18 16:14:30 -0400781
He Yunchao66a41a22016-12-15 16:45:05 +0800782 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Geoff Lange8a1f782013-10-18 16:14:30 -0400783
He Yunchao66a41a22016-12-15 16:45:05 +0800784 // generate INVALID_OPERATION if we read from a missing color attachment
785 glReadBuffer(GL_COLOR_ATTACHMENT1);
786 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
787 getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
Geoff Lange8a1f782013-10-18 16:14:30 -0400788
He Yunchao66a41a22016-12-15 16:45:05 +0800789 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Geoff Lange8a1f782013-10-18 16:14:30 -0400790}
791
Jamie Madillfa05f602015-05-07 13:47:11 -0400792TEST_P(BlitFramebufferANGLETest, BlitStencil)
Geoff Lange8a1f782013-10-18 16:14:30 -0400793{
Jamie Madill8e1936c2014-12-03 15:20:12 -0500794 // TODO(jmadill): Figure out if we can fix this on D3D9.
Yunchao He9550c602018-02-13 14:47:05 +0800795 // https://code.google.com/p/angleproject/issues/detail?id=2205
796 ANGLE_SKIP_TEST_IF(IsIntel() && IsD3D9());
Jamie Madill8e1936c2014-12-03 15:20:12 -0500797
Geoff Lange8a1f782013-10-18 16:14:30 -0400798 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
799
800 glClear(GL_COLOR_BUFFER_BIT);
801 // fill the stencil buffer with 0x1
802 glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
803 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
Yunchao He9550c602018-02-13 14:47:05 +0800804 glEnable(GL_STENCIL_TEST);
Geoff Lange8a1f782013-10-18 16:14:30 -0400805 drawQuad(mCheckerProgram, "position", 0.3f);
806
807 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
808 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
809
810 glClearColor(1.0, 1.0, 1.0, 1.0);
811 glClearStencil(0x0);
812 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
813
814 // depth blit request should be silently ignored, because the read FBO has no depth attachment
815 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
816 GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
817
818 EXPECT_GL_NO_ERROR();
819
820 glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
821
822 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
823 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
824 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
825 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
826
827 glStencilFunc(GL_EQUAL, 0x1, 0xFF); // only pass if stencil buffer at pixel reads 0x1
828 drawQuad(mBlueProgram, "position", 0.8f); // blue quad will draw if stencil buffer was copied
829 glDisable(GL_STENCIL_TEST);
830
831 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
832 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255);
833 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
834 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255);
835}
836
837// make sure that attempting to blit a partial depth buffer issues an error
Jamie Madillfa05f602015-05-07 13:47:11 -0400838TEST_P(BlitFramebufferANGLETest, BlitPartialDepthStencil)
Geoff Lange8a1f782013-10-18 16:14:30 -0400839{
840 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
841
842 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
843
844 drawQuad(mCheckerProgram, "position", 0.5f);
845
846 EXPECT_GL_NO_ERROR();
847
848 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
849 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
850
851 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
852 getWindowWidth() / 2, getWindowHeight() / 2, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
853 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
854}
855
856// Test blit with MRT framebuffers
Jamie Madillfa05f602015-05-07 13:47:11 -0400857TEST_P(BlitFramebufferANGLETest, BlitMRT)
Geoff Lange8a1f782013-10-18 16:14:30 -0400858{
859 if (!extensionEnabled("GL_EXT_draw_buffers"))
860 {
861 return;
862 }
863
864 GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
865
866 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
867 glDrawBuffersEXT(2, drawBuffers);
868
869 glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
870
871 glClear(GL_COLOR_BUFFER_BIT);
872
873 drawQuad(mCheckerProgram, "position", 0.8f);
874
875 EXPECT_GL_NO_ERROR();
876
877 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
878 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mMRTFBO);
879
880 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
881 GL_COLOR_BUFFER_BIT, GL_NEAREST);
882
883 EXPECT_GL_NO_ERROR();
884
885 glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
886
887 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
888 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
889 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
890 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
891
892 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
893 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
894
895 EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255);
896 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
897 EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255);
898 EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
899
900 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0);
901 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0);
902}
903
Kenneth Russell69382852017-07-21 16:38:44 -0400904// Test multisampled framebuffer blits if supported
905TEST_P(BlitFramebufferANGLETest, MultisampledRGBAToRGBA)
906{
907 if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
908 return;
909
910 if (!checkExtension("GL_OES_rgb8_rgba8"))
911 return;
912
913 multisampleTestHelper(mRGBAMultisampledFBO, mRGBAFBO);
914}
915
916TEST_P(BlitFramebufferANGLETest, MultisampledRGBAToBGRA)
917{
918 if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
919 return;
920
921 if (!checkExtension("GL_OES_rgb8_rgba8"))
922 return;
923
924 if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
925 return;
926
927 multisampleTestHelper(mRGBAMultisampledFBO, mBGRAFBO);
928}
929
930TEST_P(BlitFramebufferANGLETest, MultisampledBGRAToRGBA)
931{
932 if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
933 return;
934
935 if (!checkExtension("GL_OES_rgb8_rgba8"))
936 return;
937
938 if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
939 return;
940
941 multisampleTestHelper(mBGRAMultisampledFBO, mRGBAFBO);
942}
943
944TEST_P(BlitFramebufferANGLETest, MultisampledBGRAToBGRA)
945{
946 if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
947 return;
948
949 if (!checkExtension("GL_OES_rgb8_rgba8"))
950 return;
951
952 if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
953 return;
954
955 multisampleTestHelper(mBGRAMultisampledFBO, mBGRAFBO);
956}
957
Geoff Lange8a1f782013-10-18 16:14:30 -0400958// Make sure that attempts to stretch in a blit call issue an error
Jamie Madillfa05f602015-05-07 13:47:11 -0400959TEST_P(BlitFramebufferANGLETest, ErrorStretching)
Geoff Lange8a1f782013-10-18 16:14:30 -0400960{
961 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
962
963 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
964
965 drawQuad(mCheckerProgram, "position", 0.5f);
966
967 EXPECT_GL_NO_ERROR();
968
969 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
970 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
971
972 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
973 getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
974 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
975}
976
977// Make sure that attempts to flip in a blit call issue an error
Jamie Madillfa05f602015-05-07 13:47:11 -0400978TEST_P(BlitFramebufferANGLETest, ErrorFlipping)
Geoff Lange8a1f782013-10-18 16:14:30 -0400979{
980 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
981
982 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
983
984 drawQuad(mCheckerProgram, "position", 0.5f);
985
986 EXPECT_GL_NO_ERROR();
987
988 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
989 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
990
991 glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight() / 2,
992 0, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
993 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
994}
995
Jamie Madillfa05f602015-05-07 13:47:11 -0400996TEST_P(BlitFramebufferANGLETest, Errors)
Geoff Lange8a1f782013-10-18 16:14:30 -0400997{
998 glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
999
1000 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1001
1002 drawQuad(mCheckerProgram, "position", 0.5f);
1003
1004 EXPECT_GL_NO_ERROR();
1005
1006 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1007 glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1008
1009 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
1010 GL_COLOR_BUFFER_BIT, GL_LINEAR);
1011 EXPECT_GL_ERROR(GL_INVALID_ENUM);
1012
1013 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
1014 GL_COLOR_BUFFER_BIT | 234, GL_NEAREST);
1015 EXPECT_GL_ERROR(GL_INVALID_VALUE);
1016
1017 glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mDiffFormatFBO);
1018
1019 glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(),
1020 GL_COLOR_BUFFER_BIT, GL_NEAREST);
1021 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
Geoff Lange8a1f782013-10-18 16:14:30 -04001022}
Jamie Madillfa05f602015-05-07 13:47:11 -04001023
Geoff Lange0cc2a42016-01-20 10:58:17 -05001024// TODO(geofflang): Fix the dependence on glBlitFramebufferANGLE without checks and assuming the
1025// default framebuffer is BGRA to enable the GL and GLES backends. (http://anglebug.com/1289)
1026
Jamie Madill78a9c732016-07-15 11:22:43 -04001027class BlitFramebufferTest : public ANGLETest
1028{
1029 protected:
1030 BlitFramebufferTest()
1031 {
1032 setWindowWidth(256);
1033 setWindowHeight(256);
1034 setConfigRedBits(8);
1035 setConfigGreenBits(8);
1036 setConfigBlueBits(8);
1037 setConfigAlphaBits(8);
1038 setConfigDepthBits(24);
1039 setConfigStencilBits(8);
1040 }
1041};
1042
Jamie Madill196ca362016-07-12 10:54:04 -04001043// Tests resolving a multisample depth buffer.
1044TEST_P(BlitFramebufferTest, MultisampleDepth)
1045{
1046 GLRenderbuffer renderbuf;
1047 glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
1048 glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256);
1049
1050 const std::string &vertex =
1051 "#version 300 es\n"
1052 "in vec2 position;\n"
1053 "void main() {\n"
1054 " gl_Position = vec4(position, 0.0, 0.5);\n"
1055 "}";
1056 const std::string &fragment =
1057 "#version 300 es\n"
1058 "out mediump vec4 red;\n"
1059 "void main() {\n"
1060 " red = vec4(1.0, 0.0, 0.0, 1.0);\n"
1061 " gl_FragDepth = 0.5;\n"
1062 "}";
1063
1064 ANGLE_GL_PROGRAM(drawRed, vertex, fragment);
1065
1066 GLFramebuffer framebuffer;
1067 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
1068 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
1069 renderbuf.get());
1070
1071 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1072
1073 glClearDepthf(0.5f);
1074 glClear(GL_DEPTH_BUFFER_BIT);
1075
1076 GLRenderbuffer destRenderbuf;
1077 glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get());
1078 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 256, 256);
1079
1080 GLFramebuffer resolved;
1081 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved.get());
1082 glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
1083 destRenderbuf.get());
1084
1085 glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer.get());
1086 glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
1087
1088 glBindFramebuffer(GL_FRAMEBUFFER, resolved.get());
1089
1090 GLTexture colorbuf;
1091 glBindTexture(GL_TEXTURE_2D, colorbuf.get());
1092 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
1093 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorbuf.get(), 0);
1094
1095 ASSERT_GL_NO_ERROR();
1096
1097 // Clear to green
1098 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1099 glClear(GL_COLOR_BUFFER_BIT);
1100 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1101
1102 // Draw with 0.5f test and the test should pass.
1103 glEnable(GL_DEPTH_TEST);
1104 glDepthFunc(GL_EQUAL);
1105 drawQuad(drawRed.get(), "position", 0.5f);
1106 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1107
1108 ASSERT_GL_NO_ERROR();
1109}
1110
Jamie Madill78a9c732016-07-15 11:22:43 -04001111// Test resolving a multisampled stencil buffer.
1112TEST_P(BlitFramebufferTest, MultisampleStencil)
1113{
1114 GLRenderbuffer renderbuf;
1115 glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
1116 glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_STENCIL_INDEX8, 256, 256);
1117
1118 const std::string &vertex =
1119 "#version 300 es\n"
1120 "in vec2 position;\n"
1121 "void main() {\n"
1122 " gl_Position = vec4(position, 0.0, 1.0);\n"
1123 "}";
1124 const std::string &fragment =
1125 "#version 300 es\n"
1126 "out mediump vec4 red;\n"
1127 "void main() {\n"
1128 " red = vec4(1.0, 0.0, 0.0, 1.0);\n"
1129 "}";
1130
1131 ANGLE_GL_PROGRAM(drawRed, vertex, fragment);
1132
1133 GLFramebuffer framebuffer;
1134 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
1135 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1136 renderbuf.get());
1137
1138 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1139
1140 // fill the stencil buffer with 0x1
1141 glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
1142 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1143 glEnable(GL_STENCIL_TEST);
1144 drawQuad(drawRed.get(), "position", 0.5f);
1145
1146 GLTexture destColorbuf;
1147 glBindTexture(GL_TEXTURE_2D, destColorbuf.get());
1148 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
1149
1150 GLRenderbuffer destRenderbuf;
1151 glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get());
1152 glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 256, 256);
1153
1154 GLFramebuffer resolved;
1155 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved.get());
1156 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
1157 destColorbuf.get(), 0);
1158 glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1159 destRenderbuf.get());
1160
1161 glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer.get());
1162 glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
1163
1164 glBindFramebuffer(GL_FRAMEBUFFER, resolved.get());
1165
1166 ASSERT_GL_NO_ERROR();
1167
1168 // Clear to green
1169 glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1170 glClear(GL_COLOR_BUFFER_BIT);
1171 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1172
1173 // Draw red if the stencil is 0x1, which should be true after the blit/resolve.
1174 glStencilFunc(GL_EQUAL, 0x1, 0xFF);
1175 drawQuad(drawRed.get(), "position", 0.5f);
1176 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1177
1178 ASSERT_GL_NO_ERROR();
1179}
1180
Jamie Madillfa05f602015-05-07 13:47:11 -04001181// 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 -08001182ANGLE_INSTANTIATE_TEST(BlitFramebufferANGLETest,
1183 ES2_D3D9(),
1184 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE),
Kenneth Russell69382852017-07-21 16:38:44 -04001185 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE),
1186 ES2_OPENGL(),
1187 ES3_OPENGL());
Jamie Madill78a9c732016-07-15 11:22:43 -04001188
He Yunchao66a41a22016-12-15 16:45:05 +08001189ANGLE_INSTANTIATE_TEST(BlitFramebufferTest, ES3_D3D11());