Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/tests/gl_tests/BlitFramebufferANGLETest.cpp
1693 views
1
//
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
7
#include "test_utils/ANGLETest.h"
8
#include "test_utils/gl_raii.h"
9
10
using namespace angle;
11
12
namespace
13
{
14
class BlitFramebufferANGLETest : public ANGLETest
15
{
16
protected:
17
BlitFramebufferANGLETest()
18
{
19
setWindowWidth(64);
20
setWindowHeight(32);
21
setConfigRedBits(8);
22
setConfigGreenBits(8);
23
setConfigBlueBits(8);
24
setConfigAlphaBits(8);
25
setConfigDepthBits(24);
26
setConfigStencilBits(8);
27
28
mCheckerProgram = 0;
29
mBlueProgram = 0;
30
mRedProgram = 0;
31
32
mOriginalFBO = 0;
33
34
mUserFBO = 0;
35
mUserColorBuffer = 0;
36
mUserDepthStencilBuffer = 0;
37
38
mSmallFBO = 0;
39
mSmallColorBuffer = 0;
40
mSmallDepthStencilBuffer = 0;
41
42
mColorOnlyFBO = 0;
43
mColorOnlyColorBuffer = 0;
44
45
mDiffFormatFBO = 0;
46
mDiffFormatColorBuffer = 0;
47
48
mDiffSizeFBO = 0;
49
mDiffSizeColorBuffer = 0;
50
51
mMRTFBO = 0;
52
mMRTColorBuffer0 = 0;
53
mMRTColorBuffer1 = 0;
54
55
mRGBAColorbuffer = 0;
56
mRGBAFBO = 0;
57
mRGBAMultisampledRenderbuffer = 0;
58
mRGBAMultisampledFBO = 0;
59
60
mBGRAColorbuffer = 0;
61
mBGRAFBO = 0;
62
mBGRAMultisampledRenderbuffer = 0;
63
mBGRAMultisampledFBO = 0;
64
}
65
66
void testSetUp() override
67
{
68
mCheckerProgram =
69
CompileProgram(essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Checkered());
70
mBlueProgram = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
71
mRedProgram = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
72
if (mCheckerProgram == 0 || mBlueProgram == 0 || mRedProgram == 0)
73
{
74
FAIL() << "shader compilation failed.";
75
}
76
77
EXPECT_GL_NO_ERROR();
78
79
GLint originalFBO;
80
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFBO);
81
if (originalFBO >= 0)
82
{
83
mOriginalFBO = (GLuint)originalFBO;
84
}
85
86
GLenum format = GL_RGBA;
87
88
glGenFramebuffers(1, &mUserFBO);
89
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
90
glGenTextures(1, &mUserColorBuffer);
91
glGenRenderbuffers(1, &mUserDepthStencilBuffer);
92
glBindTexture(GL_TEXTURE_2D, mUserColorBuffer);
93
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
94
mUserColorBuffer, 0);
95
glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
96
GL_UNSIGNED_BYTE, nullptr);
97
glBindRenderbuffer(GL_RENDERBUFFER, mUserDepthStencilBuffer);
98
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth(),
99
getWindowHeight());
100
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
101
mUserDepthStencilBuffer);
102
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
103
mUserDepthStencilBuffer);
104
105
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
106
ASSERT_GL_NO_ERROR();
107
108
glGenFramebuffers(1, &mSmallFBO);
109
glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
110
glGenTextures(1, &mSmallColorBuffer);
111
glGenRenderbuffers(1, &mSmallDepthStencilBuffer);
112
glBindTexture(GL_TEXTURE_2D, mSmallColorBuffer);
113
glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth() / 2, getWindowHeight() / 2, 0,
114
format, GL_UNSIGNED_BYTE, nullptr);
115
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
116
mSmallColorBuffer, 0);
117
glBindRenderbuffer(GL_RENDERBUFFER, mSmallDepthStencilBuffer);
118
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth() / 2,
119
getWindowHeight() / 2);
120
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
121
mSmallDepthStencilBuffer);
122
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
123
mSmallDepthStencilBuffer);
124
125
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
126
ASSERT_GL_NO_ERROR();
127
128
glGenFramebuffers(1, &mColorOnlyFBO);
129
glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
130
glGenTextures(1, &mColorOnlyColorBuffer);
131
glBindTexture(GL_TEXTURE_2D, mColorOnlyColorBuffer);
132
glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
133
GL_UNSIGNED_BYTE, nullptr);
134
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
135
mColorOnlyColorBuffer, 0);
136
137
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
138
ASSERT_GL_NO_ERROR();
139
140
glGenFramebuffers(1, &mDiffFormatFBO);
141
glBindFramebuffer(GL_FRAMEBUFFER, mDiffFormatFBO);
142
glGenTextures(1, &mDiffFormatColorBuffer);
143
glBindTexture(GL_TEXTURE_2D, mDiffFormatColorBuffer);
144
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB,
145
GL_UNSIGNED_SHORT_5_6_5, nullptr);
146
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
147
mDiffFormatColorBuffer, 0);
148
149
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
150
ASSERT_GL_NO_ERROR();
151
152
glGenFramebuffers(1, &mDiffSizeFBO);
153
glBindFramebuffer(GL_FRAMEBUFFER, mDiffSizeFBO);
154
glGenTextures(1, &mDiffSizeColorBuffer);
155
glBindTexture(GL_TEXTURE_2D, mDiffSizeColorBuffer);
156
glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth() * 2, getWindowHeight() * 2, 0,
157
format, GL_UNSIGNED_BYTE, nullptr);
158
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
159
mDiffSizeColorBuffer, 0);
160
161
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
162
ASSERT_GL_NO_ERROR();
163
164
if (IsGLExtensionEnabled("GL_EXT_draw_buffers"))
165
{
166
glGenFramebuffers(1, &mMRTFBO);
167
glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
168
glGenTextures(1, &mMRTColorBuffer0);
169
glGenTextures(1, &mMRTColorBuffer1);
170
glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer0);
171
glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
172
GL_UNSIGNED_BYTE, nullptr);
173
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D,
174
mMRTColorBuffer0, 0);
175
glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer1);
176
glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
177
GL_UNSIGNED_BYTE, nullptr);
178
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D,
179
mMRTColorBuffer1, 0);
180
181
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
182
ASSERT_GL_NO_ERROR();
183
}
184
185
if (IsGLExtensionEnabled("GL_ANGLE_framebuffer_multisample") &&
186
IsGLExtensionEnabled("GL_OES_rgb8_rgba8"))
187
{
188
// RGBA single-sampled framebuffer
189
glGenTextures(1, &mRGBAColorbuffer);
190
glBindTexture(GL_TEXTURE_2D, mRGBAColorbuffer);
191
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
192
GL_UNSIGNED_BYTE, nullptr);
193
194
glGenFramebuffers(1, &mRGBAFBO);
195
glBindFramebuffer(GL_FRAMEBUFFER, mRGBAFBO);
196
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
197
mRGBAColorbuffer, 0);
198
199
ASSERT_GL_NO_ERROR();
200
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
201
202
// RGBA multisampled framebuffer
203
glGenRenderbuffers(1, &mRGBAMultisampledRenderbuffer);
204
glBindRenderbuffer(GL_RENDERBUFFER, mRGBAMultisampledRenderbuffer);
205
glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_RGBA8, getWindowWidth(),
206
getWindowHeight());
207
208
glGenFramebuffers(1, &mRGBAMultisampledFBO);
209
glBindFramebuffer(GL_FRAMEBUFFER, mRGBAMultisampledFBO);
210
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
211
mRGBAMultisampledRenderbuffer);
212
213
ASSERT_GL_NO_ERROR();
214
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
215
216
if (IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"))
217
{
218
// BGRA single-sampled framebuffer
219
glGenTextures(1, &mBGRAColorbuffer);
220
glBindTexture(GL_TEXTURE_2D, mBGRAColorbuffer);
221
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, getWindowWidth(), getWindowHeight(), 0,
222
GL_BGRA_EXT, GL_UNSIGNED_BYTE, nullptr);
223
224
glGenFramebuffers(1, &mBGRAFBO);
225
glBindFramebuffer(GL_FRAMEBUFFER, mBGRAFBO);
226
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
227
mBGRAColorbuffer, 0);
228
229
ASSERT_GL_NO_ERROR();
230
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
231
232
// BGRA multisampled framebuffer
233
glGenRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
234
glBindRenderbuffer(GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
235
glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_BGRA8_EXT,
236
getWindowWidth(), getWindowHeight());
237
238
glGenFramebuffers(1, &mBGRAMultisampledFBO);
239
glBindFramebuffer(GL_FRAMEBUFFER, mBGRAMultisampledFBO);
240
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
241
mBGRAMultisampledRenderbuffer);
242
243
ASSERT_GL_NO_ERROR();
244
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
245
}
246
}
247
248
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
249
}
250
251
void testTearDown() override
252
{
253
glDeleteProgram(mCheckerProgram);
254
glDeleteProgram(mBlueProgram);
255
glDeleteProgram(mRedProgram);
256
257
glDeleteFramebuffers(1, &mUserFBO);
258
glDeleteTextures(1, &mUserColorBuffer);
259
glDeleteRenderbuffers(1, &mUserDepthStencilBuffer);
260
261
glDeleteFramebuffers(1, &mSmallFBO);
262
glDeleteTextures(1, &mSmallColorBuffer);
263
glDeleteRenderbuffers(1, &mSmallDepthStencilBuffer);
264
265
glDeleteFramebuffers(1, &mColorOnlyFBO);
266
glDeleteTextures(1, &mSmallDepthStencilBuffer);
267
268
glDeleteFramebuffers(1, &mDiffFormatFBO);
269
glDeleteTextures(1, &mDiffFormatColorBuffer);
270
271
glDeleteFramebuffers(1, &mDiffSizeFBO);
272
glDeleteTextures(1, &mDiffSizeColorBuffer);
273
274
if (IsGLExtensionEnabled("GL_EXT_draw_buffers"))
275
{
276
glDeleteFramebuffers(1, &mMRTFBO);
277
glDeleteTextures(1, &mMRTColorBuffer0);
278
glDeleteTextures(1, &mMRTColorBuffer1);
279
}
280
281
if (mRGBAColorbuffer != 0)
282
{
283
glDeleteTextures(1, &mRGBAColorbuffer);
284
}
285
286
if (mRGBAFBO != 0)
287
{
288
glDeleteFramebuffers(1, &mRGBAFBO);
289
}
290
291
if (mRGBAMultisampledRenderbuffer != 0)
292
{
293
glDeleteRenderbuffers(1, &mRGBAMultisampledRenderbuffer);
294
}
295
296
if (mRGBAMultisampledFBO != 0)
297
{
298
glDeleteFramebuffers(1, &mRGBAMultisampledFBO);
299
}
300
301
if (mBGRAColorbuffer != 0)
302
{
303
glDeleteTextures(1, &mBGRAColorbuffer);
304
}
305
306
if (mBGRAFBO != 0)
307
{
308
glDeleteFramebuffers(1, &mBGRAFBO);
309
}
310
311
if (mBGRAMultisampledRenderbuffer != 0)
312
{
313
glDeleteRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
314
}
315
316
if (mBGRAMultisampledFBO != 0)
317
{
318
glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
319
}
320
}
321
322
void multisampleTestHelper(GLuint readFramebuffer, GLuint drawFramebuffer)
323
{
324
glClearColor(0.0, 1.0, 0.0, 1.0);
325
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, readFramebuffer);
326
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
327
EXPECT_GL_NO_ERROR();
328
329
glBindFramebuffer(GL_READ_FRAMEBUFFER, readFramebuffer);
330
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFramebuffer);
331
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
332
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
333
EXPECT_GL_NO_ERROR();
334
335
glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFramebuffer);
336
EXPECT_PIXEL_EQ(getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
337
EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
338
EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
339
EXPECT_PIXEL_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
340
}
341
342
bool checkExtension(const std::string &extension)
343
{
344
if (!IsGLExtensionEnabled(extension))
345
{
346
std::cout << "Test skipped because " << extension << " not supported." << std::endl;
347
return false;
348
}
349
350
return true;
351
}
352
353
GLuint mCheckerProgram;
354
GLuint mBlueProgram;
355
GLuint mRedProgram;
356
357
GLuint mOriginalFBO;
358
359
GLuint mUserFBO;
360
GLuint mUserColorBuffer;
361
GLuint mUserDepthStencilBuffer;
362
363
GLuint mSmallFBO;
364
GLuint mSmallColorBuffer;
365
GLuint mSmallDepthStencilBuffer;
366
367
GLuint mColorOnlyFBO;
368
GLuint mColorOnlyColorBuffer;
369
370
GLuint mDiffFormatFBO;
371
GLuint mDiffFormatColorBuffer;
372
373
GLuint mDiffSizeFBO;
374
GLuint mDiffSizeColorBuffer;
375
376
GLuint mMRTFBO;
377
GLuint mMRTColorBuffer0;
378
GLuint mMRTColorBuffer1;
379
380
GLuint mRGBAColorbuffer;
381
GLuint mRGBAFBO;
382
GLuint mRGBAMultisampledRenderbuffer;
383
GLuint mRGBAMultisampledFBO;
384
385
GLuint mBGRAColorbuffer;
386
GLuint mBGRAFBO;
387
GLuint mBGRAMultisampledRenderbuffer;
388
GLuint mBGRAMultisampledFBO;
389
};
390
391
// Draw to user-created framebuffer, blit whole-buffer color to original framebuffer.
392
TEST_P(BlitFramebufferANGLETest, BlitColorToDefault)
393
{
394
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
395
396
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
397
398
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
399
400
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
401
402
EXPECT_GL_NO_ERROR();
403
404
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
405
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
406
407
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
408
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
409
410
EXPECT_GL_NO_ERROR();
411
412
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
413
414
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
415
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
416
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
417
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
418
}
419
420
// Blit color to/from default framebuffer with Flip-X/Flip-Y.
421
TEST_P(BlitFramebufferANGLETest, BlitColorWithFlip)
422
{
423
// OpenGL ES 3.0 / GL_NV_framebuffer_blit required for flip.
424
ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
425
!IsGLExtensionEnabled("GL_NV_framebuffer_blit"));
426
427
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
428
429
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
430
431
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
432
433
EXPECT_GL_NO_ERROR();
434
435
// Blit to default with x-flip.
436
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
437
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
438
439
glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), getWindowWidth(), 0, 0,
440
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
441
442
EXPECT_GL_NO_ERROR();
443
444
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
445
446
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
447
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
448
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
449
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
450
451
// Blit to default with y-flip.
452
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
453
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
454
455
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
456
glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, getWindowHeight(),
457
getWindowWidth(), 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
458
459
EXPECT_GL_NO_ERROR();
460
461
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
462
463
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::green);
464
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::red);
465
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::yellow);
466
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
467
468
// Blit from default with x-flip.
469
470
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
471
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
472
473
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
474
glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), getWindowWidth(), 0, 0,
475
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
476
477
EXPECT_GL_NO_ERROR();
478
479
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
480
481
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::yellow);
482
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
483
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::green);
484
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::red);
485
486
// Blit from default with y-flip.
487
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
488
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
489
490
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
491
glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, getWindowHeight(),
492
getWindowWidth(), 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
493
494
EXPECT_GL_NO_ERROR();
495
496
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
497
498
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
499
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
500
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
501
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
502
}
503
504
// Draw to system framebuffer, blit whole-buffer color to user-created framebuffer.
505
TEST_P(BlitFramebufferANGLETest, ReverseColorBlit)
506
{
507
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
508
509
// TODO(jmadill): Fix this. http://anglebug.com/2743
510
ANGLE_SKIP_TEST_IF(IsVulkan() && IsAndroid());
511
512
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
513
514
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
515
516
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
517
518
EXPECT_GL_NO_ERROR();
519
520
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
521
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
522
523
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
524
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
525
526
EXPECT_GL_NO_ERROR();
527
528
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
529
530
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
531
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
532
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
533
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
534
}
535
536
// blit from user-created FBO to system framebuffer, with the scissor test enabled.
537
TEST_P(BlitFramebufferANGLETest, ScissoredBlit)
538
{
539
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
540
541
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
542
543
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
544
545
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
546
547
EXPECT_GL_NO_ERROR();
548
549
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
550
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
551
552
glClearColor(1.0, 1.0, 1.0, 1.0);
553
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
554
555
glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
556
glEnable(GL_SCISSOR_TEST);
557
558
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
559
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
560
561
EXPECT_GL_NO_ERROR();
562
563
glDisable(GL_SCISSOR_TEST);
564
565
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
566
567
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::white);
568
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::white);
569
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
570
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
571
}
572
573
// blit from system FBO to user-created framebuffer, with the scissor test enabled.
574
TEST_P(BlitFramebufferANGLETest, ReverseScissoredBlit)
575
{
576
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
577
578
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
579
580
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
581
582
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
583
584
EXPECT_GL_NO_ERROR();
585
586
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
587
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
588
589
glClearColor(1.0, 1.0, 1.0, 1.0);
590
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
591
592
glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
593
glEnable(GL_SCISSOR_TEST);
594
595
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
596
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
597
598
EXPECT_GL_NO_ERROR();
599
600
glDisable(GL_SCISSOR_TEST);
601
602
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
603
604
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::white);
605
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::white);
606
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
607
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
608
}
609
610
// blit from user-created FBO to system framebuffer, using region larger than buffer.
611
TEST_P(BlitFramebufferANGLETest, OversizedBlit)
612
{
613
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
614
615
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
616
617
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
618
619
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
620
621
EXPECT_GL_NO_ERROR();
622
623
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
624
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
625
626
glClearColor(1.0, 1.0, 1.0, 1.0);
627
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
628
629
glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0,
630
getWindowWidth() * 2, getWindowHeight() * 2, GL_COLOR_BUFFER_BIT,
631
GL_NEAREST);
632
633
EXPECT_GL_NO_ERROR();
634
635
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
636
637
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
638
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
639
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
640
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
641
}
642
643
// blit from system FBO to user-created framebuffer, using region larger than buffer.
644
TEST_P(BlitFramebufferANGLETest, ReverseOversizedBlit)
645
{
646
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
647
648
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
649
650
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
651
652
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
653
654
EXPECT_GL_NO_ERROR();
655
656
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
657
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
658
659
glClearColor(1.0, 1.0, 1.0, 1.0);
660
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
661
662
glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0,
663
getWindowWidth() * 2, getWindowHeight() * 2, GL_COLOR_BUFFER_BIT,
664
GL_NEAREST);
665
EXPECT_GL_NO_ERROR();
666
667
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
668
669
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
670
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
671
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
672
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
673
}
674
675
// blit from user-created FBO to system framebuffer, with depth buffer.
676
TEST_P(BlitFramebufferANGLETest, BlitWithDepthUserToDefault)
677
{
678
// TODO(http://anglebug.com/6154): glBlitFramebufferANGLE() generates GL_INVALID_OPERATION for
679
// the ES2_OpenGL backend.
680
ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsOpenGL());
681
682
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
683
684
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
685
686
glDepthMask(GL_TRUE);
687
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
688
689
glEnable(GL_DEPTH_TEST);
690
691
EXPECT_GL_NO_ERROR();
692
693
// Clear the first half of the screen
694
glEnable(GL_SCISSOR_TEST);
695
glScissor(0, 0, getWindowWidth(), getWindowHeight() / 2);
696
697
glClearDepthf(0.1f);
698
glClearColor(1.0, 0.0, 0.0, 1.0);
699
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
700
701
// Scissor the second half of the screen
702
glScissor(0, getWindowHeight() / 2, getWindowWidth(), getWindowHeight() / 2);
703
704
glClearDepthf(0.9f);
705
glClearColor(0.0, 1.0, 0.0, 1.0);
706
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
707
708
glDisable(GL_SCISSOR_TEST);
709
710
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
711
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
712
713
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
714
getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
715
GL_NEAREST);
716
EXPECT_GL_NO_ERROR();
717
718
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
719
720
// if blit is happening correctly, this quad will draw only on the bottom half since it will
721
// be behind on the first half and in front on the second half.
722
drawQuad(mBlueProgram, essl1_shaders::PositionAttrib(), 0.5f);
723
724
glDisable(GL_DEPTH_TEST);
725
726
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
727
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
728
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
729
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
730
}
731
732
// blit from system FBO to user-created framebuffer, with depth buffer.
733
TEST_P(BlitFramebufferANGLETest, BlitWithDepthDefaultToUser)
734
{
735
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
736
737
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
738
739
glDepthMask(GL_TRUE);
740
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
741
742
glEnable(GL_DEPTH_TEST);
743
744
EXPECT_GL_NO_ERROR();
745
746
// Clear the first half of the screen
747
glEnable(GL_SCISSOR_TEST);
748
glScissor(0, 0, getWindowWidth(), getWindowHeight() / 2);
749
750
glClearDepthf(0.1f);
751
glClearColor(1.0, 0.0, 0.0, 1.0);
752
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
753
754
// Scissor the second half of the screen
755
glScissor(0, getWindowHeight() / 2, getWindowWidth(), getWindowHeight() / 2);
756
757
glClearDepthf(0.9f);
758
glClearColor(0.0, 1.0, 0.0, 1.0);
759
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
760
761
glDisable(GL_SCISSOR_TEST);
762
763
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
764
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
765
766
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
767
getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
768
GL_NEAREST);
769
EXPECT_GL_NO_ERROR();
770
771
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
772
773
// if blit is happening correctly, this quad will draw only on the bottom half since it will be
774
// behind on the first half and in front on the second half.
775
drawQuad(mBlueProgram, essl1_shaders::PositionAttrib(), 0.5f);
776
777
glDisable(GL_DEPTH_TEST);
778
779
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
780
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
781
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
782
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
783
}
784
785
// blit from one region of the system fbo to another-- this should fail.
786
TEST_P(BlitFramebufferANGLETest, BlitSameBufferOriginal)
787
{
788
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
789
790
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
791
792
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
793
794
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
795
796
EXPECT_GL_NO_ERROR();
797
798
glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0,
799
getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
800
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
801
}
802
803
// blit from one region of the system fbo to another.
804
TEST_P(BlitFramebufferANGLETest, BlitSameBufferUser)
805
{
806
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
807
808
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
809
810
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
811
812
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
813
814
EXPECT_GL_NO_ERROR();
815
816
glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0,
817
getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
818
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
819
}
820
821
TEST_P(BlitFramebufferANGLETest, BlitPartialColor)
822
{
823
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
824
825
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
826
827
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
828
829
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
830
831
EXPECT_GL_NO_ERROR();
832
833
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
834
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
835
836
glClearColor(1.0, 1.0, 1.0, 1.0);
837
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
838
839
glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0,
840
getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight(),
841
GL_COLOR_BUFFER_BIT, GL_NEAREST);
842
843
EXPECT_GL_NO_ERROR();
844
845
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
846
847
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::white);
848
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::red);
849
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::white);
850
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::white);
851
}
852
853
TEST_P(BlitFramebufferANGLETest, BlitDifferentSizes)
854
{
855
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
856
857
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
858
859
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
860
861
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
862
863
EXPECT_GL_NO_ERROR();
864
865
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mSmallFBO);
866
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
867
868
glClearColor(1.0, 1.0, 1.0, 1.0);
869
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
870
871
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
872
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
873
874
EXPECT_GL_NO_ERROR();
875
876
glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
877
878
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
879
880
EXPECT_GL_NO_ERROR();
881
}
882
883
TEST_P(BlitFramebufferANGLETest, BlitWithMissingAttachments)
884
{
885
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
886
887
glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
888
889
glClear(GL_COLOR_BUFFER_BIT);
890
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
891
892
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
893
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
894
895
glClearColor(1.0, 1.0, 1.0, 1.0);
896
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
897
898
// generate INVALID_OPERATION if the read FBO has no depth attachment
899
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
900
getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
901
GL_NEAREST);
902
903
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
904
905
// generate INVALID_OPERATION if the read FBO has no stencil attachment
906
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
907
getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
908
GL_NEAREST);
909
910
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
911
912
// generate INVALID_OPERATION if we read from a missing color attachment
913
glReadBuffer(GL_COLOR_ATTACHMENT1);
914
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
915
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
916
917
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
918
}
919
920
TEST_P(BlitFramebufferANGLETest, BlitStencil)
921
{
922
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
923
924
// http://anglebug.com/2205
925
ANGLE_SKIP_TEST_IF(IsIntel() && IsD3D9());
926
927
// http://anglebug.com/4919
928
ANGLE_SKIP_TEST_IF(IsIntel() && IsMetal());
929
930
// http://anglebug.com/5396
931
ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D9());
932
933
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
934
935
glClearColor(0.0, 1.0, 0.0, 1.0);
936
glClearStencil(0x0);
937
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
938
939
// Scissor half the screen so we fill the stencil only halfway
940
glScissor(0, 0, getWindowWidth(), getWindowHeight() / 2);
941
glEnable(GL_SCISSOR_TEST);
942
943
// fill the stencil buffer with 0x1
944
glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
945
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
946
glEnable(GL_STENCIL_TEST);
947
drawQuad(mRedProgram, essl1_shaders::PositionAttrib(), 0.3f);
948
949
glDisable(GL_SCISSOR_TEST);
950
951
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
952
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
953
954
// These clears are not useful in theory because we're copying over them, but its
955
// helpful in debugging if we see white in any result.
956
glClearColor(1.0, 1.0, 1.0, 1.0);
957
glClearStencil(0x0);
958
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
959
960
// depth blit request should be silently ignored, because the read FBO has no depth attachment
961
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
962
getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
963
GL_NEAREST);
964
965
EXPECT_GL_NO_ERROR();
966
967
glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
968
969
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
970
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
971
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
972
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
973
974
glStencilFunc(GL_EQUAL, 0x1, 0xFF); // only pass if stencil buffer at pixel reads 0x1
975
976
drawQuad(mBlueProgram, essl1_shaders::PositionAttrib(),
977
0.8f); // blue quad will draw if stencil buffer was copied
978
979
glDisable(GL_STENCIL_TEST);
980
981
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
982
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
983
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
984
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
985
}
986
987
// make sure that attempting to blit a partial depth buffer issues an error
988
TEST_P(BlitFramebufferANGLETest, BlitPartialDepthStencil)
989
{
990
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
991
992
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
993
994
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
995
996
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
997
998
EXPECT_GL_NO_ERROR();
999
1000
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1001
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1002
1003
glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
1004
getWindowWidth() / 2, getWindowHeight() / 2, GL_DEPTH_BUFFER_BIT,
1005
GL_NEAREST);
1006
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1007
}
1008
1009
// Test blit with MRT framebuffers
1010
TEST_P(BlitFramebufferANGLETest, BlitMRT)
1011
{
1012
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1013
1014
if (!IsGLExtensionEnabled("GL_EXT_draw_buffers"))
1015
{
1016
return;
1017
}
1018
1019
GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT};
1020
1021
glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
1022
glDrawBuffersEXT(2, drawBuffers);
1023
1024
glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
1025
1026
glClear(GL_COLOR_BUFFER_BIT);
1027
1028
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
1029
1030
EXPECT_GL_NO_ERROR();
1031
1032
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
1033
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mMRTFBO);
1034
1035
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1036
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
1037
1038
EXPECT_GL_NO_ERROR();
1039
1040
glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
1041
1042
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
1043
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
1044
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
1045
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
1046
1047
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
1048
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0,
1049
0);
1050
1051
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
1052
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
1053
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
1054
EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
1055
1056
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0,
1057
0);
1058
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D,
1059
mMRTColorBuffer1, 0);
1060
}
1061
1062
// Test multisampled framebuffer blits if supported
1063
TEST_P(BlitFramebufferANGLETest, MultisampledRGBAToRGBA)
1064
{
1065
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1066
1067
if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
1068
return;
1069
1070
if (!checkExtension("GL_OES_rgb8_rgba8"))
1071
return;
1072
1073
multisampleTestHelper(mRGBAMultisampledFBO, mRGBAFBO);
1074
}
1075
1076
TEST_P(BlitFramebufferANGLETest, MultisampledRGBAToBGRA)
1077
{
1078
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1079
1080
// VVL report error http://anglebug.com/4694
1081
ANGLE_SKIP_TEST_IF(IsVulkan());
1082
1083
if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
1084
return;
1085
1086
if (!checkExtension("GL_OES_rgb8_rgba8"))
1087
return;
1088
1089
if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
1090
return;
1091
1092
multisampleTestHelper(mRGBAMultisampledFBO, mBGRAFBO);
1093
}
1094
1095
TEST_P(BlitFramebufferANGLETest, MultisampledBGRAToRGBA)
1096
{
1097
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1098
1099
// VVL report error http://anglebug.com/4694
1100
ANGLE_SKIP_TEST_IF(IsVulkan());
1101
1102
if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
1103
return;
1104
1105
if (!checkExtension("GL_OES_rgb8_rgba8"))
1106
return;
1107
1108
if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
1109
return;
1110
1111
multisampleTestHelper(mBGRAMultisampledFBO, mRGBAFBO);
1112
}
1113
1114
TEST_P(BlitFramebufferANGLETest, MultisampledBGRAToBGRA)
1115
{
1116
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1117
1118
if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
1119
return;
1120
1121
if (!checkExtension("GL_OES_rgb8_rgba8"))
1122
return;
1123
1124
if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
1125
return;
1126
1127
multisampleTestHelper(mBGRAMultisampledFBO, mBGRAFBO);
1128
}
1129
1130
// Make sure that attempts to stretch in a blit call issue an error
1131
TEST_P(BlitFramebufferANGLETest, ErrorStretching)
1132
{
1133
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1134
1135
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1136
1137
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1138
1139
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
1140
1141
EXPECT_GL_NO_ERROR();
1142
1143
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1144
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1145
1146
glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
1147
getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
1148
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1149
}
1150
1151
// Make sure that attempts to flip in a blit call issue an error
1152
TEST_P(BlitFramebufferANGLETest, ErrorFlipping)
1153
{
1154
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1155
1156
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1157
1158
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1159
1160
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
1161
1162
EXPECT_GL_NO_ERROR();
1163
1164
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1165
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1166
1167
glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, getWindowWidth() / 2,
1168
getWindowHeight() / 2, 0, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1169
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1170
}
1171
1172
TEST_P(BlitFramebufferANGLETest, Errors)
1173
{
1174
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1175
1176
glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1177
1178
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1179
1180
drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
1181
1182
EXPECT_GL_NO_ERROR();
1183
1184
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1185
glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1186
1187
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1188
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_LINEAR);
1189
EXPECT_GL_ERROR(GL_INVALID_ENUM);
1190
1191
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1192
getWindowHeight(), GL_COLOR_BUFFER_BIT | 234, GL_NEAREST);
1193
EXPECT_GL_ERROR(GL_INVALID_VALUE);
1194
1195
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mDiffFormatFBO);
1196
1197
glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1198
getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
1199
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1200
}
1201
1202
// TODO(geofflang): Fix the dependence on glBlitFramebufferANGLE without checks and assuming the
1203
// default framebuffer is BGRA to enable the GL and GLES backends. (http://anglebug.com/1289)
1204
1205
class BlitFramebufferTest : public ANGLETest
1206
{
1207
protected:
1208
BlitFramebufferTest()
1209
{
1210
setWindowWidth(256);
1211
setWindowHeight(256);
1212
setConfigRedBits(8);
1213
setConfigGreenBits(8);
1214
setConfigBlueBits(8);
1215
setConfigAlphaBits(8);
1216
setConfigDepthBits(24);
1217
setConfigStencilBits(8);
1218
}
1219
1220
void initColorFBO(GLFramebuffer *fbo,
1221
GLRenderbuffer *rbo,
1222
GLenum rboFormat,
1223
GLsizei width,
1224
GLsizei height)
1225
{
1226
glBindRenderbuffer(GL_RENDERBUFFER, *rbo);
1227
glRenderbufferStorage(GL_RENDERBUFFER, rboFormat, width, height);
1228
1229
glBindFramebuffer(GL_FRAMEBUFFER, *fbo);
1230
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, *rbo);
1231
}
1232
1233
void initColorFBOWithCheckerPattern(GLFramebuffer *fbo,
1234
GLRenderbuffer *rbo,
1235
GLenum rboFormat,
1236
GLsizei width,
1237
GLsizei height)
1238
{
1239
initColorFBO(fbo, rbo, rboFormat, width, height);
1240
1241
ANGLE_GL_PROGRAM(checkerProgram, essl1_shaders::vs::Passthrough(),
1242
essl1_shaders::fs::Checkered());
1243
glViewport(0, 0, width, height);
1244
glBindFramebuffer(GL_FRAMEBUFFER, *fbo);
1245
drawQuad(checkerProgram.get(), essl1_shaders::PositionAttrib(), 0.5f);
1246
}
1247
};
1248
1249
class BlitFramebufferTestES31 : public BlitFramebufferTest
1250
{};
1251
1252
// Tests resolving a multisample depth buffer.
1253
TEST_P(BlitFramebufferTest, MultisampleDepth)
1254
{
1255
// Test failure introduced by Apple's changes (anglebug.com/5505)
1256
ANGLE_SKIP_TEST_IF(IsMetal());
1257
1258
// TODO([email protected]): http://crbug.com/837717
1259
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
1260
1261
GLRenderbuffer renderbuf;
1262
glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
1263
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256);
1264
1265
GLFramebuffer framebuffer;
1266
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
1267
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
1268
renderbuf.get());
1269
1270
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1271
1272
glClearDepthf(0.5f);
1273
glClear(GL_DEPTH_BUFFER_BIT);
1274
1275
GLRenderbuffer destRenderbuf;
1276
glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get());
1277
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 256, 256);
1278
1279
GLFramebuffer resolved;
1280
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved.get());
1281
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
1282
destRenderbuf.get());
1283
1284
glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer.get());
1285
glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
1286
1287
glBindFramebuffer(GL_FRAMEBUFFER, resolved.get());
1288
1289
GLTexture colorbuf;
1290
glBindTexture(GL_TEXTURE_2D, colorbuf.get());
1291
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
1292
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorbuf.get(), 0);
1293
1294
ASSERT_GL_NO_ERROR();
1295
1296
// Clear to green
1297
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1298
glClear(GL_COLOR_BUFFER_BIT);
1299
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1300
1301
// Make sure resulting depth is near 0.5f.
1302
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1303
glEnable(GL_DEPTH_TEST);
1304
glDepthMask(false);
1305
glDepthFunc(GL_LESS);
1306
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), -0.01f);
1307
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1308
EXPECT_PIXEL_COLOR_EQ(255, 0, GLColor::red);
1309
EXPECT_PIXEL_COLOR_EQ(0, 255, GLColor::red);
1310
EXPECT_PIXEL_COLOR_EQ(255, 255, GLColor::red);
1311
EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::red);
1312
1313
ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
1314
glEnable(GL_DEPTH_TEST);
1315
glDepthMask(false);
1316
glDepthFunc(GL_GREATER);
1317
drawQuad(drawBlue.get(), essl3_shaders::PositionAttrib(), 0.01f);
1318
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1319
EXPECT_PIXEL_COLOR_EQ(255, 0, GLColor::blue);
1320
EXPECT_PIXEL_COLOR_EQ(0, 255, GLColor::blue);
1321
EXPECT_PIXEL_COLOR_EQ(255, 255, GLColor::blue);
1322
EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::blue);
1323
1324
ASSERT_GL_NO_ERROR();
1325
}
1326
1327
// Blit multisample stencil buffer to default framebuffer without prerotaion.
1328
TEST_P(BlitFramebufferTest, BlitMultisampleStencilToDefault)
1329
{
1330
// http://anglebug.com/3496
1331
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsOSX());
1332
1333
// http://anglebug.com/5106
1334
ANGLE_SKIP_TEST_IF(IsMetal() && IsIntel() && IsOSX());
1335
1336
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
1337
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1338
1339
GLRenderbuffer colorbuf;
1340
glBindRenderbuffer(GL_RENDERBUFFER, colorbuf.get());
1341
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 128, 128);
1342
1343
GLRenderbuffer depthstencilbuf;
1344
glBindRenderbuffer(GL_RENDERBUFFER, depthstencilbuf.get());
1345
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, 128, 128);
1346
1347
GLFramebuffer framebuffer;
1348
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
1349
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorbuf);
1350
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
1351
depthstencilbuf);
1352
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1353
depthstencilbuf);
1354
glCheckFramebufferStatus(GL_FRAMEBUFFER);
1355
1356
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1357
glFlush();
1358
1359
// Replace stencil to 1.
1360
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1361
glEnable(GL_STENCIL_TEST);
1362
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1363
glStencilFunc(GL_ALWAYS, 1, 255);
1364
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.8f);
1365
1366
// Blit multisample stencil buffer to default frambuffer.
1367
GLenum attachments1[] = {GL_COLOR_ATTACHMENT0};
1368
glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments1);
1369
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
1370
glBlitFramebuffer(0, 0, 128, 128, 0, 0, 128, 128, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
1371
GL_NEAREST);
1372
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
1373
1374
// Disable stencil and draw full_screen green color.
1375
ANGLE_GL_PROGRAM(drawGreen, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
1376
glDisable(GL_STENCIL_TEST);
1377
drawQuad(drawGreen.get(), essl3_shaders::PositionAttrib(), 0.5f);
1378
1379
// Draw blue color if the stencil is equal to 1.
1380
// If the blit finished successfully, the stencil test should all pass.
1381
ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
1382
glEnable(GL_STENCIL_TEST);
1383
glStencilFunc(GL_EQUAL, 1, 255);
1384
drawQuad(drawBlue.get(), essl3_shaders::PositionAttrib(), 0.2f);
1385
1386
// Check the result, especially the boundaries.
1387
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1388
EXPECT_PIXEL_COLOR_EQ(127, 0, GLColor::blue);
1389
EXPECT_PIXEL_COLOR_EQ(50, 0, GLColor::blue);
1390
EXPECT_PIXEL_COLOR_EQ(127, 1, GLColor::blue);
1391
EXPECT_PIXEL_COLOR_EQ(0, 127, GLColor::blue);
1392
EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::blue);
1393
EXPECT_PIXEL_COLOR_EQ(64, 64, GLColor::blue);
1394
1395
ASSERT_GL_NO_ERROR();
1396
}
1397
1398
// Tests clearing a multisampled depth buffer.
1399
TEST_P(BlitFramebufferTest, MultisampleDepthClear)
1400
{
1401
// clearDepth && !maskDepth fails on Intel Ubuntu 19.04 Mesa 19.0.2 GL. http://anglebug.com/3614
1402
ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsDesktopOpenGL());
1403
1404
// http://anglebug.com/4092
1405
ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
1406
1407
GLRenderbuffer depthMS;
1408
glBindRenderbuffer(GL_RENDERBUFFER, depthMS.get());
1409
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256);
1410
1411
GLRenderbuffer colorMS;
1412
glBindRenderbuffer(GL_RENDERBUFFER, colorMS.get());
1413
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_RGBA8, 256, 256);
1414
1415
GLRenderbuffer colorResolved;
1416
glBindRenderbuffer(GL_RENDERBUFFER, colorResolved.get());
1417
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 256, 256);
1418
1419
GLFramebuffer framebufferMS;
1420
glBindFramebuffer(GL_FRAMEBUFFER, framebufferMS.get());
1421
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthMS.get());
1422
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorMS.get());
1423
1424
// Clear depth buffer to 0.5 and color to green.
1425
glClearDepthf(0.5f);
1426
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1427
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
1428
1429
glFlush();
1430
1431
// Draw red into the multisampled color buffer.
1432
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1433
glEnable(GL_DEPTH_TEST);
1434
glDepthFunc(GL_EQUAL);
1435
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.0f);
1436
1437
// Resolve the color buffer to make sure the above draw worked correctly, which in turn implies
1438
// that the multisampled depth clear worked.
1439
GLFramebuffer framebufferResolved;
1440
glBindFramebuffer(GL_FRAMEBUFFER, framebufferResolved.get());
1441
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
1442
colorResolved.get());
1443
glBindFramebuffer(GL_READ_FRAMEBUFFER, framebufferMS.get());
1444
glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1445
1446
glBindFramebuffer(GL_FRAMEBUFFER, framebufferResolved.get());
1447
1448
ASSERT_GL_NO_ERROR();
1449
1450
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1451
EXPECT_PIXEL_COLOR_EQ(255, 0, GLColor::red);
1452
EXPECT_PIXEL_COLOR_EQ(0, 255, GLColor::red);
1453
EXPECT_PIXEL_COLOR_EQ(255, 255, GLColor::red);
1454
EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::red);
1455
1456
ASSERT_GL_NO_ERROR();
1457
}
1458
1459
// Test resolving a multisampled stencil buffer.
1460
TEST_P(BlitFramebufferTest, MultisampleStencil)
1461
{
1462
// Incorrect rendering results seen on AMD Windows OpenGL. http://anglebug.com/2486
1463
ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL() && IsWindows());
1464
1465
// http://anglebug.com/5106
1466
ANGLE_SKIP_TEST_IF(IsMetal() && IsIntel() && IsOSX());
1467
1468
GLRenderbuffer renderbuf;
1469
glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
1470
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_STENCIL_INDEX8, 256, 256);
1471
1472
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1473
1474
GLFramebuffer framebuffer;
1475
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
1476
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1477
renderbuf.get());
1478
1479
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1480
1481
// fill the stencil buffer with 0x1
1482
glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
1483
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1484
glEnable(GL_STENCIL_TEST);
1485
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1486
1487
GLTexture destColorbuf;
1488
glBindTexture(GL_TEXTURE_2D, destColorbuf.get());
1489
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
1490
1491
GLRenderbuffer destRenderbuf;
1492
glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get());
1493
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 256, 256);
1494
1495
GLFramebuffer resolved;
1496
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved.get());
1497
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
1498
destColorbuf.get(), 0);
1499
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1500
destRenderbuf.get());
1501
1502
glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer.get());
1503
glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
1504
1505
glBindFramebuffer(GL_FRAMEBUFFER, resolved.get());
1506
1507
ASSERT_GL_NO_ERROR();
1508
1509
// Clear to green
1510
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1511
glClear(GL_COLOR_BUFFER_BIT);
1512
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1513
1514
// Draw red if the stencil is 0x1, which should be true after the resolve.
1515
glStencilFunc(GL_EQUAL, 0x1, 0xFF);
1516
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1517
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1518
1519
ASSERT_GL_NO_ERROR();
1520
}
1521
1522
// Test resolving a multisampled stencil buffer with scissor.
1523
TEST_P(BlitFramebufferTest, ScissoredMultisampleStencil)
1524
{
1525
// Incorrect rendering results seen on AMD Windows OpenGL. http://anglebug.com/2486
1526
ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL() && IsWindows());
1527
1528
// Fails verifying that the middle pixel is red. http://anglebug.com/3496
1529
ANGLE_SKIP_TEST_IF((IsIntel() || IsAMD()) && IsOSX());
1530
1531
constexpr GLuint kSize = 256;
1532
1533
// Create the resolve framebuffer.
1534
GLTexture destColorbuf;
1535
glBindTexture(GL_TEXTURE_2D, destColorbuf.get());
1536
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
1537
1538
GLRenderbuffer destRenderbuf;
1539
glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get());
1540
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, kSize, kSize);
1541
1542
GLFramebuffer resolved;
1543
glBindFramebuffer(GL_FRAMEBUFFER, resolved.get());
1544
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
1545
destColorbuf.get(), 0);
1546
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1547
destRenderbuf.get());
1548
1549
// Clear the resolved buffer with gray and 0x10 stencil.
1550
GLColor gray(127, 127, 127, 255);
1551
glClearStencil(0x10);
1552
glClearColor(0.499f, 0.499f, 0.499f, 1.0f);
1553
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1554
EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
1555
EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, gray);
1556
1557
// Create the multisampled framebuffer.
1558
GLRenderbuffer renderbuf;
1559
glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
1560
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_STENCIL_INDEX8, kSize, kSize);
1561
1562
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1563
ANGLE_GL_PROGRAM(drawGreen, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
1564
ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
1565
1566
GLFramebuffer framebuffer;
1567
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
1568
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1569
renderbuf.get());
1570
1571
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1572
1573
// Fill the stencil buffer with 0x1.
1574
glClearStencil(0x1);
1575
glClear(GL_STENCIL_BUFFER_BIT);
1576
1577
// Fill a smaller region of the buffer with 0x2.
1578
glEnable(GL_SCISSOR_TEST);
1579
glEnable(GL_STENCIL_TEST);
1580
glScissor(kSize / 4, kSize / 4, kSize / 2, kSize / 2);
1581
glStencilFunc(GL_ALWAYS, 0x2, 0xFF);
1582
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1583
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1584
1585
// Blit into the resolved framebuffer (with scissor still enabled).
1586
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved.get());
1587
glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
1588
1589
glBindFramebuffer(GL_FRAMEBUFFER, resolved.get());
1590
1591
ASSERT_GL_NO_ERROR();
1592
1593
// Draw blue if the stencil is 0x1, which should never be true.
1594
glDisable(GL_SCISSOR_TEST);
1595
glStencilMask(0);
1596
glStencilFunc(GL_EQUAL, 0x1, 0xFF);
1597
drawQuad(drawBlue.get(), essl3_shaders::PositionAttrib(), 0.5f);
1598
EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
1599
EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, gray);
1600
EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, gray);
1601
EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, gray);
1602
EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, gray);
1603
1604
// Draw red if the stencil is 0x2, which should be true in the middle after the blit/resolve.
1605
glStencilFunc(GL_EQUAL, 0x2, 0xFF);
1606
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1607
EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
1608
EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, gray);
1609
EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, gray);
1610
EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, gray);
1611
EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
1612
1613
// Draw green if the stencil is 0x10, which should be left untouched in the outer regions.
1614
glStencilFunc(GL_EQUAL, 0x10, 0xFF);
1615
drawQuad(drawGreen.get(), essl3_shaders::PositionAttrib(), 0.5f);
1616
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1617
EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
1618
EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
1619
EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
1620
EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
1621
1622
ASSERT_GL_NO_ERROR();
1623
}
1624
1625
// Test blitting from a texture with non-zero base. The blit is non-stretching and between
1626
// identical formats so that the path that uses vkCmdBlitImage is taken.
1627
TEST_P(BlitFramebufferTest, NonZeroBaseSource)
1628
{
1629
// http://anglebug.com/5001
1630
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsOSX());
1631
1632
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1633
1634
// Create a framebuffer for source data. It usea a non-zero base.
1635
GLTexture srcColor;
1636
glBindTexture(GL_TEXTURE_2D, srcColor);
1637
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1638
glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1639
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
1640
1641
GLFramebuffer srcFramebuffer;
1642
glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
1643
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcColor, 1);
1644
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1645
1646
// fill the color buffer with red.
1647
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1648
1649
// Create a framebuffer for blit destination.
1650
GLTexture dstColor;
1651
glBindTexture(GL_TEXTURE_2D, dstColor);
1652
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1653
1654
GLFramebuffer dstFramebuffer;
1655
glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
1656
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstColor, 0);
1657
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1658
1659
// Blit. Note: no stretching is done so that vkCmdBlitImage can be used.
1660
glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
1661
glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1662
1663
glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
1664
1665
ASSERT_GL_NO_ERROR();
1666
1667
// Make sure the blit is done.
1668
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1669
1670
ASSERT_GL_NO_ERROR();
1671
}
1672
1673
// Test blitting to a texture with non-zero base. The blit is non-stretching and between
1674
// identical formats so that the path that uses vkCmdBlitImage is taken.
1675
TEST_P(BlitFramebufferTest, NonZeroBaseDestination)
1676
{
1677
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1678
1679
// Create a framebuffer for source data. It usea a non-zero base.
1680
GLTexture srcColor;
1681
glBindTexture(GL_TEXTURE_2D, srcColor);
1682
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1683
1684
GLFramebuffer srcFramebuffer;
1685
glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
1686
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcColor, 0);
1687
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1688
1689
// fill the color buffer with red.
1690
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1691
1692
// Create a framebuffer for blit destination.
1693
GLTexture dstColor;
1694
glBindTexture(GL_TEXTURE_2D, dstColor);
1695
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1696
glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1697
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
1698
1699
GLFramebuffer dstFramebuffer;
1700
glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
1701
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstColor, 1);
1702
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1703
1704
// Blit. Note: no stretching is done so that vkCmdBlitImage can be used.
1705
glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
1706
glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1707
1708
glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
1709
1710
ASSERT_GL_NO_ERROR();
1711
1712
// Make sure the blit is done.
1713
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1714
1715
ASSERT_GL_NO_ERROR();
1716
}
1717
1718
// Test blitting from a stencil buffer with non-zero base.
1719
TEST_P(BlitFramebufferTest, NonZeroBaseSourceStencil)
1720
{
1721
// http://anglebug.com/5001
1722
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsOSX());
1723
1724
// http://anglebug.com/5106
1725
ANGLE_SKIP_TEST_IF(IsMetal() && IsIntel() && IsOSX());
1726
1727
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1728
1729
// Create a framebuffer with an attachment that has non-zero base
1730
GLTexture stencilTexture;
1731
glBindTexture(GL_TEXTURE_2D, stencilTexture);
1732
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
1733
GL_UNSIGNED_INT_24_8, nullptr);
1734
glTexImage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
1735
GL_UNSIGNED_INT_24_8, nullptr);
1736
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
1737
1738
GLFramebuffer srcFramebuffer;
1739
glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
1740
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, stencilTexture, 1);
1741
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1742
1743
// fill the stencil buffer with 0x1
1744
glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
1745
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1746
glEnable(GL_STENCIL_TEST);
1747
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1748
1749
// Create a framebuffer with an attachment that has non-zero base
1750
GLTexture colorTexture;
1751
glBindTexture(GL_TEXTURE_2D, colorTexture);
1752
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
1753
1754
GLRenderbuffer renderbuf;
1755
glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
1756
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 256, 256);
1757
1758
GLFramebuffer dstFramebuffer;
1759
glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
1760
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
1761
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuf);
1762
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1763
1764
// Blit stencil.
1765
glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
1766
glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
1767
1768
glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
1769
1770
ASSERT_GL_NO_ERROR();
1771
1772
// Clear to green
1773
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1774
glClear(GL_COLOR_BUFFER_BIT);
1775
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1776
1777
// Draw red if the stencil is 0x1, which should be true after the blit.
1778
glStencilFunc(GL_EQUAL, 0x1, 0xFF);
1779
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1780
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1781
1782
ASSERT_GL_NO_ERROR();
1783
}
1784
1785
// Test blitting to a stencil buffer with non-zero base.
1786
TEST_P(BlitFramebufferTest, NonZeroBaseDestinationStencil)
1787
{
1788
// http://anglebug.com/5001
1789
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsOSX());
1790
// http://anglebug.com/5106
1791
ANGLE_SKIP_TEST_IF(IsMetal() && (IsAMD() || IsIntel()));
1792
// http://anglebug.com/5003
1793
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsWindows());
1794
1795
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1796
1797
// Create a framebuffer for source data.
1798
GLRenderbuffer renderbuf;
1799
glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
1800
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 256, 256);
1801
1802
GLFramebuffer srcFramebuffer;
1803
glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
1804
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuf);
1805
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1806
1807
// fill the stencil buffer with 0x1
1808
glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
1809
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1810
glEnable(GL_STENCIL_TEST);
1811
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1812
1813
// Create a framebuffer with an attachment that has non-zero base
1814
GLTexture colorTexture;
1815
glBindTexture(GL_TEXTURE_2D, colorTexture);
1816
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
1817
1818
GLTexture stencilTexture;
1819
glBindTexture(GL_TEXTURE_2D, stencilTexture);
1820
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
1821
GL_UNSIGNED_INT_24_8, nullptr);
1822
glTexImage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
1823
GL_UNSIGNED_INT_24_8, nullptr);
1824
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
1825
1826
GLFramebuffer dstFramebuffer;
1827
glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
1828
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
1829
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, stencilTexture, 1);
1830
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1831
1832
// Blit stencil.
1833
glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
1834
glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
1835
1836
glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
1837
1838
ASSERT_GL_NO_ERROR();
1839
1840
// Clear to green
1841
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1842
glClear(GL_COLOR_BUFFER_BIT);
1843
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1844
1845
// Draw red if the stencil is 0x1, which should be true after the blit.
1846
glStencilFunc(GL_EQUAL, 0x1, 0xFF);
1847
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1848
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1849
1850
ASSERT_GL_NO_ERROR();
1851
}
1852
1853
// Test blitting to a stencil buffer with non-zero base. Exercises the compute path in the Vulkan
1854
// backend if stencil export is not supported. The blit is not 1-to-1 for this path to be taken.
1855
TEST_P(BlitFramebufferTest, NonZeroBaseDestinationStencilStretch)
1856
{
1857
// http://anglebug.com/5000
1858
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsWindows());
1859
1860
// http://anglebug.com/5001
1861
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsOSX());
1862
1863
// http://anglebug.com/5106
1864
ANGLE_SKIP_TEST_IF(IsMetal() && (IsAMD() || IsIntel()));
1865
1866
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1867
1868
// Create a framebuffer for source data.
1869
GLRenderbuffer renderbuf;
1870
glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
1871
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 256, 256);
1872
1873
GLFramebuffer srcFramebuffer;
1874
glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
1875
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuf);
1876
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1877
1878
// fill the stencil buffer with 0x1
1879
glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
1880
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1881
glEnable(GL_STENCIL_TEST);
1882
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1883
1884
// Create a framebuffer with an attachment that has non-zero base
1885
GLTexture colorTexture;
1886
glBindTexture(GL_TEXTURE_2D, colorTexture);
1887
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
1888
1889
GLTexture stencilTexture;
1890
glBindTexture(GL_TEXTURE_2D, stencilTexture);
1891
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
1892
GL_UNSIGNED_INT_24_8, nullptr);
1893
glTexImage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
1894
GL_UNSIGNED_INT_24_8, nullptr);
1895
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
1896
1897
GLFramebuffer dstFramebuffer;
1898
glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
1899
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
1900
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, stencilTexture, 1);
1901
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1902
1903
// Blit stencil. Note: stretch is intentional so vkCmdBlitImage cannot be used in the Vulkan
1904
// backend.
1905
glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
1906
glBlitFramebuffer(0, 0, 256, 256, -256, -256, 512, 512, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
1907
1908
glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
1909
1910
ASSERT_GL_NO_ERROR();
1911
1912
// Clear to green
1913
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1914
glClear(GL_COLOR_BUFFER_BIT);
1915
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1916
1917
// Draw red if the stencil is 0x1, which should be true after the blit.
1918
glStencilFunc(GL_EQUAL, 0x1, 0xFF);
1919
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
1920
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1921
1922
ASSERT_GL_NO_ERROR();
1923
}
1924
1925
// Blit an SRGB framebuffer and scale it.
1926
TEST_P(BlitFramebufferTest, BlitSRGBToRGBAndScale)
1927
{
1928
constexpr const GLsizei kWidth = 256;
1929
constexpr const GLsizei kHeight = 256;
1930
1931
GLRenderbuffer sourceRBO, targetRBO;
1932
GLFramebuffer sourceFBO, targetFBO;
1933
initColorFBOWithCheckerPattern(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth * 2,
1934
kHeight * 2);
1935
initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
1936
1937
EXPECT_GL_NO_ERROR();
1938
1939
glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
1940
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
1941
1942
glViewport(0, 0, kWidth, kHeight);
1943
1944
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
1945
glClear(GL_COLOR_BUFFER_BIT);
1946
1947
// Scale down without flipping.
1948
glBlitFramebuffer(0, 0, kWidth * 2, kHeight * 2, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
1949
GL_NEAREST);
1950
1951
EXPECT_GL_NO_ERROR();
1952
1953
glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
1954
1955
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::red);
1956
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::green);
1957
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::blue);
1958
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::yellow);
1959
1960
glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
1961
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
1962
1963
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
1964
glClear(GL_COLOR_BUFFER_BIT);
1965
1966
// Scale down and flip in the X direction.
1967
glBlitFramebuffer(0, 0, kWidth * 2, kHeight * 2, kWidth, 0, 0, kHeight, GL_COLOR_BUFFER_BIT,
1968
GL_NEAREST);
1969
1970
EXPECT_GL_NO_ERROR();
1971
1972
glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
1973
1974
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::blue);
1975
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::yellow);
1976
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::red);
1977
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::green);
1978
}
1979
1980
// Blit stencil, with scissor and scale it.
1981
TEST_P(BlitFramebufferTest, BlitStencilScissoredScaled)
1982
{
1983
// http://anglebug.com/5106
1984
ANGLE_SKIP_TEST_IF(IsMetal() && IsIntel() && IsOSX());
1985
1986
constexpr GLint kSize = 256;
1987
1988
// Create the destination framebuffer.
1989
GLTexture destColorbuf;
1990
glBindTexture(GL_TEXTURE_2D, destColorbuf.get());
1991
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
1992
1993
GLRenderbuffer destRenderbuf;
1994
glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get());
1995
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, kSize, kSize);
1996
1997
GLFramebuffer destFBO;
1998
glBindFramebuffer(GL_FRAMEBUFFER, destFBO.get());
1999
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
2000
destColorbuf.get(), 0);
2001
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2002
destRenderbuf.get());
2003
2004
// Clear the destination buffer with gray and 0x10 stencil.
2005
GLColor gray(127, 127, 127, 255);
2006
glClearStencil(0x10);
2007
glClearColor(0.499f, 0.499f, 0.499f, 1.0f);
2008
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2009
EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
2010
EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, gray);
2011
2012
// Create the source framebuffer.
2013
GLRenderbuffer renderbuf;
2014
glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
2015
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, kSize, kSize);
2016
2017
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
2018
ANGLE_GL_PROGRAM(drawGreen, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
2019
ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
2020
2021
GLFramebuffer sourceFBO;
2022
glBindFramebuffer(GL_FRAMEBUFFER, sourceFBO.get());
2023
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2024
renderbuf.get());
2025
2026
ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2027
2028
// Fill the stencil buffer with 0x1.
2029
glClearStencil(0x1);
2030
glClear(GL_STENCIL_BUFFER_BIT);
2031
2032
// Fill a smaller region of the buffer with 0x2.
2033
glEnable(GL_SCISSOR_TEST);
2034
glEnable(GL_STENCIL_TEST);
2035
glScissor(kSize / 4, kSize / 4, kSize / 2, kSize / 2);
2036
glStencilFunc(GL_ALWAYS, 0x2, 0xFF);
2037
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2038
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
2039
2040
// Blit and scale down into the destination framebuffer (with scissor still enabled).
2041
//
2042
// Source looks like this:
2043
//
2044
// +----|----|----|----+
2045
// | |
2046
// | 0x1 |
2047
// - +---------+ -
2048
// | | | |
2049
// | | | |
2050
// - | 0x2 | -
2051
// | | | |
2052
// | | | |
2053
// - +---------+ -
2054
// | |
2055
// | |
2056
// +----|----|----|----+
2057
//
2058
// We want the destination to look like this:
2059
//
2060
// +----|----|----|----+
2061
// | |
2062
// | 0x10 |
2063
// - +---------+ -
2064
// | | 0x1 | |
2065
// | | +------+ |
2066
// - | | | -
2067
// | | | 0x2 | |
2068
// | | | | |
2069
// - +--+------+ -
2070
// | |
2071
// | |
2072
// +----|----|----|----+
2073
//
2074
// The corresponding blit would be: (0, 0, 3/4, 3/4) -> (1/4, 1/4, 3/4, 3/4). For testing, we
2075
// would like to avoid having the destination area and scissor to match. Using destination
2076
// area as (0, 0, 1, 1), and keeping the same scaling, the source area should be
2077
// (-3/8, -3/8, 9/8, 9/8).
2078
//
2079
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, destFBO.get());
2080
constexpr GLint kBlitSrc[2] = {-3 * kSize / 8, 9 * kSize / 8};
2081
glBlitFramebuffer(kBlitSrc[0], kBlitSrc[0], kBlitSrc[1], kBlitSrc[1], 0, 0, kSize, kSize,
2082
GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2083
2084
glBindFramebuffer(GL_FRAMEBUFFER, destFBO.get());
2085
2086
ASSERT_GL_NO_ERROR();
2087
2088
// Draw blue if the stencil is 0x1, which should be true only in the top and left of the inner
2089
// square.
2090
glDisable(GL_SCISSOR_TEST);
2091
glStencilMask(0);
2092
glStencilFunc(GL_EQUAL, 0x1, 0xFF);
2093
drawQuad(drawBlue.get(), essl3_shaders::PositionAttrib(), 0.5f);
2094
EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
2095
EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, gray);
2096
EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, gray);
2097
EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, gray);
2098
2099
EXPECT_PIXEL_COLOR_EQ(kSize / 4, kSize / 4, GLColor::blue);
2100
EXPECT_PIXEL_COLOR_EQ(kSize / 4, 3 * kSize / 4 - 1, GLColor::blue);
2101
EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, kSize / 4, GLColor::blue);
2102
2103
EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, gray);
2104
EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, 3 * kSize / 4 - 1, gray);
2105
2106
// Draw red if the stencil is 0x2, which should be true in the bottom/right of the middle
2107
// square after the blit.
2108
glStencilFunc(GL_EQUAL, 0x2, 0xFF);
2109
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f);
2110
EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
2111
EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, gray);
2112
EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, gray);
2113
EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, gray);
2114
2115
EXPECT_PIXEL_COLOR_EQ(kSize / 4, kSize / 4, GLColor::blue);
2116
EXPECT_PIXEL_COLOR_EQ(kSize / 4, 3 * kSize / 4 - 1, GLColor::blue);
2117
EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, kSize / 4, GLColor::blue);
2118
2119
EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
2120
EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, 3 * kSize / 4 - 1, GLColor::red);
2121
2122
// Draw green if the stencil is 0x10, which should be left untouched in the outer regions.
2123
glStencilFunc(GL_EQUAL, 0x10, 0xFF);
2124
drawQuad(drawGreen.get(), essl3_shaders::PositionAttrib(), 0.5f);
2125
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2126
EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
2127
EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
2128
EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
2129
2130
EXPECT_PIXEL_COLOR_EQ(kSize / 4, kSize / 4, GLColor::blue);
2131
EXPECT_PIXEL_COLOR_EQ(kSize / 4, 3 * kSize / 4 - 1, GLColor::blue);
2132
EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, kSize / 4, GLColor::blue);
2133
2134
EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
2135
EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, 3 * kSize / 4 - 1, GLColor::red);
2136
2137
ASSERT_GL_NO_ERROR();
2138
}
2139
2140
// Blit a subregion of an SRGB framebuffer to an RGB framebuffer.
2141
TEST_P(BlitFramebufferTest, PartialBlitSRGBToRGB)
2142
{
2143
constexpr const GLsizei kWidth = 256;
2144
constexpr const GLsizei kHeight = 256;
2145
2146
GLRenderbuffer sourceRBO, targetRBO;
2147
GLFramebuffer sourceFBO, targetFBO;
2148
initColorFBOWithCheckerPattern(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth * 2,
2149
kHeight * 2);
2150
initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
2151
2152
EXPECT_GL_NO_ERROR();
2153
2154
glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2155
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2156
2157
glViewport(0, 0, kWidth, kHeight);
2158
2159
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
2160
glClear(GL_COLOR_BUFFER_BIT);
2161
2162
// Blit a part of the source FBO without flipping.
2163
glBlitFramebuffer(kWidth, kHeight, kWidth * 2, kHeight * 2, 0, 0, kWidth, kHeight,
2164
GL_COLOR_BUFFER_BIT, GL_NEAREST);
2165
2166
EXPECT_GL_NO_ERROR();
2167
2168
glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2169
2170
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::yellow);
2171
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::yellow);
2172
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::yellow);
2173
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::yellow);
2174
2175
glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2176
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2177
2178
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
2179
glClear(GL_COLOR_BUFFER_BIT);
2180
2181
// Blit a part of the source FBO and flip in the X direction.
2182
glBlitFramebuffer(kWidth * 2, 0, kWidth, kHeight, kWidth, 0, 0, kHeight, GL_COLOR_BUFFER_BIT,
2183
GL_NEAREST);
2184
2185
EXPECT_GL_NO_ERROR();
2186
2187
glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2188
2189
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::blue);
2190
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::blue);
2191
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::blue);
2192
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::blue);
2193
}
2194
2195
// Blit an SRGB framebuffer with an oversized source area (parts outside the source area should be
2196
// clipped out).
2197
TEST_P(BlitFramebufferTest, BlitSRGBToRGBOversizedSourceArea)
2198
{
2199
constexpr const GLsizei kWidth = 256;
2200
constexpr const GLsizei kHeight = 256;
2201
2202
GLRenderbuffer sourceRBO, targetRBO;
2203
GLFramebuffer sourceFBO, targetFBO;
2204
initColorFBOWithCheckerPattern(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth, kHeight);
2205
initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
2206
2207
EXPECT_GL_NO_ERROR();
2208
2209
glViewport(0, 0, kWidth, kHeight);
2210
2211
glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2212
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2213
2214
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
2215
glClear(GL_COLOR_BUFFER_BIT);
2216
2217
// Blit so that the source area gets placed at the center of the target FBO.
2218
// The width of the source area is 1/4 of the width of the target FBO.
2219
glBlitFramebuffer(-3 * kWidth / 2, -3 * kHeight / 2, 5 * kWidth / 2, 5 * kHeight / 2, 0, 0,
2220
kWidth, kHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2221
2222
EXPECT_GL_NO_ERROR();
2223
2224
glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2225
2226
// Source FBO colors can be found in the middle of the target FBO.
2227
EXPECT_PIXEL_COLOR_EQ(7 * kWidth / 16, 7 * kHeight / 16, GLColor::red);
2228
EXPECT_PIXEL_COLOR_EQ(7 * kWidth / 16, 9 * kHeight / 16, GLColor::green);
2229
EXPECT_PIXEL_COLOR_EQ(9 * kWidth / 16, 7 * kHeight / 16, GLColor::blue);
2230
EXPECT_PIXEL_COLOR_EQ(9 * kWidth / 16, 9 * kHeight / 16, GLColor::yellow);
2231
2232
// Clear color should remain around the edges of the target FBO (WebGL 2.0 spec explicitly
2233
// requires this and ANGLE is expected to follow that).
2234
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::blue);
2235
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::blue);
2236
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::blue);
2237
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::blue);
2238
}
2239
2240
// Blit an SRGB framebuffer with an oversized dest area (even though the result is clipped, it
2241
// should be scaled as if the whole dest area was used).
2242
TEST_P(BlitFramebufferTest, BlitSRGBToRGBOversizedDestArea)
2243
{
2244
constexpr const GLsizei kWidth = 256;
2245
constexpr const GLsizei kHeight = 256;
2246
2247
GLRenderbuffer sourceRBO, targetRBO;
2248
GLFramebuffer sourceFBO, targetFBO;
2249
initColorFBOWithCheckerPattern(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth, kHeight);
2250
initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
2251
2252
EXPECT_GL_NO_ERROR();
2253
2254
glViewport(0, 0, kWidth, kHeight);
2255
2256
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
2257
glClear(GL_COLOR_BUFFER_BIT);
2258
2259
// Dest is oversized but centered the same as source
2260
glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2261
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2262
2263
glBlitFramebuffer(0, 0, kWidth, kHeight, -kWidth / 2, -kHeight / 2, 3 * kWidth / 2,
2264
3 * kHeight / 2, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2265
2266
EXPECT_GL_NO_ERROR();
2267
2268
glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2269
2270
// Expected result:
2271
//
2272
// +-------+-------+
2273
// | | |
2274
// | R | B |
2275
// | | |
2276
// +-------+-------+
2277
// | | |
2278
// | G | Y |
2279
// | | |
2280
// +-------+-------+
2281
//
2282
EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
2283
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::red);
2284
EXPECT_PIXEL_COLOR_EQ(kWidth / 2 - 1, kHeight / 2 - 1, GLColor::red);
2285
2286
EXPECT_PIXEL_COLOR_EQ(1, kWidth - 1, GLColor::green);
2287
EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::green);
2288
EXPECT_PIXEL_COLOR_EQ(kWidth / 2 - 1, kHeight / 2 + 1, GLColor::green);
2289
2290
EXPECT_PIXEL_COLOR_EQ(kWidth - 1, 1, GLColor::blue);
2291
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::blue);
2292
EXPECT_PIXEL_COLOR_EQ(kWidth / 2 + 1, kHeight / 2 - 1, GLColor::blue);
2293
2294
EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight - 1, GLColor::yellow);
2295
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::yellow);
2296
EXPECT_PIXEL_COLOR_EQ(kWidth / 2 + 1, kHeight / 2 + 1, GLColor::yellow);
2297
2298
// Dest is oversized in the negative direction
2299
glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2300
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2301
2302
glBlitFramebuffer(0, 0, kWidth, kHeight, -kWidth / 2, -kHeight / 2, kWidth, kHeight,
2303
GL_COLOR_BUFFER_BIT, GL_NEAREST);
2304
2305
EXPECT_GL_NO_ERROR();
2306
2307
glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2308
2309
// Expected result:
2310
//
2311
// Width / 4
2312
// |
2313
// V
2314
// +---+-----------+
2315
// | R | B |
2316
// +---+-----------+ <- Height / 4
2317
// | | |
2318
// | | |
2319
// | G | Y |
2320
// | | |
2321
// | | |
2322
// +---+-----------+
2323
//
2324
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2325
EXPECT_PIXEL_COLOR_EQ(0, kHeight / 4 - 1, GLColor::red);
2326
EXPECT_PIXEL_COLOR_EQ(kWidth / 4 - 1, 0, GLColor::red);
2327
EXPECT_PIXEL_COLOR_EQ(kWidth / 4 - 1, kHeight / 4 - 1, GLColor::red);
2328
EXPECT_PIXEL_COLOR_EQ(kWidth / 8, kHeight / 8, GLColor::red);
2329
2330
EXPECT_PIXEL_COLOR_EQ(0, kHeight / 4 + 1, GLColor::green);
2331
EXPECT_PIXEL_COLOR_EQ(0, kHeight - 1, GLColor::green);
2332
EXPECT_PIXEL_COLOR_EQ(kWidth / 4 - 1, kHeight / 4 + 1, GLColor::green);
2333
EXPECT_PIXEL_COLOR_EQ(kWidth / 4 - 1, kHeight - 1, GLColor::green);
2334
EXPECT_PIXEL_COLOR_EQ(kWidth / 8, kHeight / 2, GLColor::green);
2335
2336
EXPECT_PIXEL_COLOR_EQ(kWidth / 4 + 1, 0, GLColor::blue);
2337
EXPECT_PIXEL_COLOR_EQ(kWidth / 4 + 1, kHeight / 4 - 1, GLColor::blue);
2338
EXPECT_PIXEL_COLOR_EQ(kWidth - 1, 0, GLColor::blue);
2339
EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight / 4 - 1, GLColor::blue);
2340
EXPECT_PIXEL_COLOR_EQ(kWidth / 2, kHeight / 8, GLColor::blue);
2341
2342
EXPECT_PIXEL_COLOR_EQ(kWidth / 4 + 1, kHeight / 4 + 1, GLColor::yellow);
2343
EXPECT_PIXEL_COLOR_EQ(kWidth / 4 + 1, kHeight - 1, GLColor::yellow);
2344
EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight / 4 + 1, GLColor::yellow);
2345
EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight - 1, GLColor::yellow);
2346
EXPECT_PIXEL_COLOR_EQ(kWidth / 2, kHeight / 2, GLColor::yellow);
2347
2348
// Dest is oversized in the positive direction
2349
glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2350
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2351
2352
glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, 3 * kWidth / 2, 3 * kHeight / 2,
2353
GL_COLOR_BUFFER_BIT, GL_NEAREST);
2354
2355
EXPECT_GL_NO_ERROR();
2356
2357
glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2358
2359
// Expected result:
2360
//
2361
// 3 * Width / 4
2362
// |
2363
// V
2364
// +-----------+---+
2365
// | | |
2366
// | | |
2367
// | R | B |
2368
// | | |
2369
// | | |
2370
// +-----------+---+ <- 3 * Height / 4
2371
// | G | Y |
2372
// +-----------+---+
2373
//
2374
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2375
EXPECT_PIXEL_COLOR_EQ(0, 3 * kHeight / 4 - 1, GLColor::red);
2376
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 - 1, 0, GLColor::red);
2377
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 - 1, 3 * kHeight / 4 - 1, GLColor::red);
2378
EXPECT_PIXEL_COLOR_EQ(kWidth / 2, kHeight / 2, GLColor::red);
2379
2380
EXPECT_PIXEL_COLOR_EQ(0, 3 * kHeight / 4 + 1, GLColor::green);
2381
EXPECT_PIXEL_COLOR_EQ(0, kHeight - 1, GLColor::green);
2382
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 - 1, 3 * kHeight / 4 + 1, GLColor::green);
2383
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 - 1, kHeight - 1, GLColor::green);
2384
EXPECT_PIXEL_COLOR_EQ(kWidth / 2, 7 * kHeight / 8, GLColor::green);
2385
2386
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 + 1, 0, GLColor::blue);
2387
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 + 1, 3 * kHeight / 4 - 1, GLColor::blue);
2388
EXPECT_PIXEL_COLOR_EQ(kWidth - 1, 0, GLColor::blue);
2389
EXPECT_PIXEL_COLOR_EQ(kWidth - 1, 3 * kHeight / 4 - 1, GLColor::blue);
2390
EXPECT_PIXEL_COLOR_EQ(7 * kWidth / 8, kHeight / 2, GLColor::blue);
2391
2392
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 + 1, 3 * kHeight / 4 + 1, GLColor::yellow);
2393
EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 + 1, kHeight - 1, GLColor::yellow);
2394
EXPECT_PIXEL_COLOR_EQ(kWidth - 1, 3 * kHeight / 4 + 1, GLColor::yellow);
2395
EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight - 1, GLColor::yellow);
2396
EXPECT_PIXEL_COLOR_EQ(7 * kWidth / 8, 7 * kHeight / 8, GLColor::yellow);
2397
}
2398
2399
// Test blitFramebuffer size overflow checks. WebGL 2.0 spec section 5.41. We do validation for
2400
// overflows also in non-WebGL mode to avoid triggering driver bugs.
2401
TEST_P(BlitFramebufferTest, BlitFramebufferSizeOverflow)
2402
{
2403
GLTexture textures[2];
2404
glBindTexture(GL_TEXTURE_2D, textures[0]);
2405
glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 4, 4);
2406
glBindTexture(GL_TEXTURE_2D, textures[1]);
2407
glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 4, 4);
2408
2409
GLFramebuffer framebuffers[2];
2410
glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffers[0]);
2411
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffers[1]);
2412
2413
ASSERT_GL_NO_ERROR();
2414
2415
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0],
2416
0);
2417
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1],
2418
0);
2419
ASSERT_GL_NO_ERROR();
2420
2421
// srcX
2422
glBlitFramebuffer(-1, 0, std::numeric_limits<GLint>::max(), 4, 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
2423
GL_NEAREST);
2424
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2425
glBlitFramebuffer(std::numeric_limits<GLint>::max(), 0, -1, 4, 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
2426
GL_NEAREST);
2427
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2428
2429
// srcY
2430
glBlitFramebuffer(0, -1, 4, std::numeric_limits<GLint>::max(), 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
2431
GL_NEAREST);
2432
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2433
glBlitFramebuffer(0, std::numeric_limits<GLint>::max(), 4, -1, 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
2434
GL_NEAREST);
2435
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2436
2437
// dstX
2438
glBlitFramebuffer(0, 0, 4, 4, -1, 0, std::numeric_limits<GLint>::max(), 4, GL_COLOR_BUFFER_BIT,
2439
GL_NEAREST);
2440
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2441
glBlitFramebuffer(0, 0, 4, 4, std::numeric_limits<GLint>::max(), 0, -1, 4, GL_COLOR_BUFFER_BIT,
2442
GL_NEAREST);
2443
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2444
2445
// dstY
2446
glBlitFramebuffer(0, 0, 4, 4, 0, -1, 4, std::numeric_limits<GLint>::max(), GL_COLOR_BUFFER_BIT,
2447
GL_NEAREST);
2448
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2449
glBlitFramebuffer(0, 0, 4, 4, 0, std::numeric_limits<GLint>::max(), 4, -1, GL_COLOR_BUFFER_BIT,
2450
GL_NEAREST);
2451
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2452
}
2453
2454
// Test blitFramebuffer size overflow checks. WebGL 2.0 spec section 5.41. Similar to above test,
2455
// but this test more accurately duplicates the behavior of the WebGL test
2456
// conformance2/rendering/blitframebuffer-size-overflow.html, which covers a few more edge cases.
2457
TEST_P(BlitFramebufferTest, BlitFramebufferSizeOverflow2)
2458
{
2459
GLTexture textures[2];
2460
glBindTexture(GL_TEXTURE_2D, textures[0]);
2461
glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 4, 4);
2462
glBindTexture(GL_TEXTURE_2D, textures[1]);
2463
glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 4, 4);
2464
2465
GLFramebuffer framebuffers[2];
2466
glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffers[0]);
2467
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffers[1]);
2468
2469
ASSERT_GL_NO_ERROR();
2470
2471
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0],
2472
0);
2473
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1],
2474
0);
2475
ASSERT_GL_NO_ERROR();
2476
2477
GLint width = 8;
2478
GLint height = 8;
2479
2480
GLTexture tex0;
2481
glBindTexture(GL_TEXTURE_2D, tex0);
2482
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2483
2484
GLFramebuffer fb0;
2485
glBindFramebuffer(GL_READ_FRAMEBUFFER, fb0);
2486
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex0, 0);
2487
2488
GLTexture tex1;
2489
glBindTexture(GL_TEXTURE_2D, tex1);
2490
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
2491
2492
GLFramebuffer fb1;
2493
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb1);
2494
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1, 0);
2495
2496
GLint max = std::numeric_limits<GLint>::max();
2497
// Using max 32-bit integer as blitFramebuffer parameter should succeed.
2498
glBlitFramebuffer(0, 0, max, max, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2499
glBlitFramebuffer(0, 0, width, height, 0, 0, max, max, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2500
glBlitFramebuffer(0, 0, max, max, 0, 0, max, max, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2501
EXPECT_GL_NO_ERROR();
2502
2503
// Using blitFramebuffer parameters where calculated width/height matches max 32-bit integer
2504
// should succeed
2505
glBlitFramebuffer(-1, -1, max - 1, max - 1, 0, 0, width, height, GL_COLOR_BUFFER_BIT,
2506
GL_NEAREST);
2507
glBlitFramebuffer(0, 0, width, height, -1, -1, max - 1, max - 1, GL_COLOR_BUFFER_BIT,
2508
GL_NEAREST);
2509
glBlitFramebuffer(-1, -1, max - 1, max - 1, -1, -1, max - 1, max - 1, GL_COLOR_BUFFER_BIT,
2510
GL_NEAREST);
2511
EXPECT_GL_NO_ERROR();
2512
2513
// Using source width/height greater than max 32-bit integer should fail.
2514
glBlitFramebuffer(-1, -1, max, max, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2515
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2516
2517
// Using source width/height greater than max 32-bit integer should fail.
2518
glBlitFramebuffer(max, max, -1, -1, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2519
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2520
2521
// Using destination width/height greater than max 32-bit integer should fail.
2522
glBlitFramebuffer(0, 0, width, height, -1, -1, max, max, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2523
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2524
2525
// Using destination width/height greater than max 32-bit integer should fail.
2526
glBlitFramebuffer(0, 0, width, height, max, max, -1, -1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2527
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2528
2529
// Using both source and destination width/height greater than max 32-bit integer should fail.
2530
glBlitFramebuffer(-1, -1, max, max, -1, -1, max, max, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2531
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2532
2533
// Using minimum and maximum integers for all boundaries should fail.
2534
glBlitFramebuffer(-max - 1, -max - 1, max, max, -max - 1, -max - 1, max, max,
2535
GL_COLOR_BUFFER_BIT, GL_NEAREST);
2536
EXPECT_GL_ERROR(GL_INVALID_VALUE);
2537
}
2538
2539
// Test an edge case in D3D11 stencil blitting on the CPU that does not properly clip the
2540
// destination regions
2541
TEST_P(BlitFramebufferTest, BlitFramebufferStencilClipNoIntersection)
2542
{
2543
GLFramebuffer framebuffers[2];
2544
glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffers[0]);
2545
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffers[1]);
2546
2547
GLRenderbuffer renderbuffers[2];
2548
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[0]);
2549
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 4, 4);
2550
glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2551
renderbuffers[0]);
2552
2553
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[1]);
2554
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 4, 4);
2555
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2556
renderbuffers[1]);
2557
2558
glBlitFramebuffer(0, 0, 4, 4, 1 << 24, 1 << 24, 1 << 25, 1 << 25, GL_STENCIL_BUFFER_BIT,
2559
GL_NEAREST);
2560
EXPECT_GL_NO_ERROR();
2561
}
2562
2563
// Covers an edge case with blitting borderline values.
2564
TEST_P(BlitFramebufferTest, OOBWrite)
2565
{
2566
constexpr size_t length = 0x100000;
2567
GLFramebuffer rfb;
2568
GLFramebuffer dfb;
2569
GLRenderbuffer rb1;
2570
GLRenderbuffer rb2;
2571
glBindFramebuffer(GL_READ_FRAMEBUFFER, rfb);
2572
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dfb);
2573
glBindRenderbuffer(GL_RENDERBUFFER, rb1);
2574
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 0x1000, 2);
2575
glBindRenderbuffer(GL_RENDERBUFFER, rb2);
2576
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 2, 2);
2577
glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2578
rb1);
2579
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2580
rb2);
2581
glBlitFramebuffer(1, 0, 0, 1, 1, 0, (2147483648 / 2) - (length / 4) + 1, 1,
2582
GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2583
ASSERT_GL_NO_ERROR();
2584
}
2585
2586
// Test blitting a depthStencil buffer with multiple depth values to a larger size.
2587
TEST_P(BlitFramebufferTest, BlitDepthStencilPixelByPixel)
2588
{
2589
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
2590
2591
glViewport(0, 0, 128, 1);
2592
glEnable(GL_DEPTH_TEST);
2593
2594
GLFramebuffer srcFramebuffer;
2595
GLRenderbuffer srcRenderbuffer;
2596
glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
2597
glBindRenderbuffer(GL_RENDERBUFFER, srcRenderbuffer);
2598
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 128, 1);
2599
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2600
srcRenderbuffer);
2601
glClearDepthf(1.0f);
2602
glClear(GL_DEPTH_BUFFER_BIT);
2603
2604
drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.0f, 0.5f);
2605
glViewport(0, 0, 256, 2);
2606
2607
GLFramebuffer dstFramebuffer;
2608
GLRenderbuffer dstRenderbuffer;
2609
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFramebuffer);
2610
glBindRenderbuffer(GL_RENDERBUFFER, dstRenderbuffer);
2611
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 256, 2);
2612
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2613
dstRenderbuffer);
2614
2615
GLTexture dstColor;
2616
glBindTexture(GL_TEXTURE_2D, dstColor);
2617
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 2);
2618
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstColor, 0);
2619
2620
glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
2621
glBlitFramebuffer(0, 0, 128, 1, 0, 0, 256, 2, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
2622
GL_NEAREST);
2623
2624
glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
2625
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2626
glClear(GL_COLOR_BUFFER_BIT);
2627
glDepthMask(false);
2628
glDepthFunc(GL_LESS);
2629
drawQuad(drawRed, essl1_shaders::PositionAttrib(), -0.01f, 0.5f);
2630
EXPECT_PIXEL_RECT_EQ(64, 0, 128, 1, GLColor::red);
2631
2632
ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
2633
glEnable(GL_DEPTH_TEST);
2634
glDepthMask(false);
2635
glDepthFunc(GL_GREATER);
2636
drawQuad(drawBlue, essl1_shaders::PositionAttrib(), 0.01f, 0.5f);
2637
EXPECT_PIXEL_RECT_EQ(64, 0, 128, 1, GLColor::blue);
2638
}
2639
2640
// Test that a draw call to a small FBO followed by a resolve of a large FBO works.
2641
TEST_P(BlitFramebufferTestES31, DrawToSmallFBOThenResolveLargeFBO)
2642
{
2643
GLFramebuffer fboMS[2];
2644
GLTexture textureMS[2];
2645
GLFramebuffer fboSS;
2646
GLTexture textureSS;
2647
2648
// A bug in the Vulkan backend grew the render area of the previous render pass on blit, even
2649
// though the previous render pass belonged to an unrelated framebuffer. This test only needs
2650
// to make sure that the FBO being resolved is not strictly smaller than the previous FBO which
2651
// was drawn to.
2652
constexpr GLsizei kLargeWidth = 127;
2653
constexpr GLsizei kLargeHeight = 54;
2654
constexpr GLsizei kSmallWidth = 37;
2655
constexpr GLsizei kSmallHeight = 79;
2656
2657
ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
2658
2659
// Create resolve target.
2660
glBindTexture(GL_TEXTURE_2D, textureSS);
2661
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kLargeWidth, kLargeHeight);
2662
2663
glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
2664
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureSS, 0);
2665
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2666
2667
// Create multisampled framebuffers and draw into them one by one.
2668
for (size_t fboIndex = 0; fboIndex < 2; ++fboIndex)
2669
{
2670
const GLsizei width = fboIndex == 0 ? kLargeWidth : kSmallWidth;
2671
const GLsizei height = fboIndex == 0 ? kLargeHeight : kSmallHeight;
2672
2673
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureMS[fboIndex]);
2674
glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, width, height, GL_TRUE);
2675
2676
glBindFramebuffer(GL_FRAMEBUFFER, fboMS[fboIndex]);
2677
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
2678
textureMS[fboIndex], 0);
2679
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2680
2681
glViewport(0, 0, width, height);
2682
drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.8f);
2683
EXPECT_GL_NO_ERROR();
2684
}
2685
2686
// Resolve the first FBO
2687
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboSS);
2688
glBindFramebuffer(GL_READ_FRAMEBUFFER, fboMS[0]);
2689
2690
glViewport(0, 0, kLargeWidth, kLargeHeight);
2691
glBlitFramebuffer(0, 0, kLargeWidth, kLargeHeight, 0, 0, kLargeWidth, kLargeHeight,
2692
GL_COLOR_BUFFER_BIT, GL_NEAREST);
2693
EXPECT_GL_NO_ERROR();
2694
2695
// Verify the resolve
2696
glBindFramebuffer(GL_READ_FRAMEBUFFER, fboSS);
2697
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2698
EXPECT_PIXEL_COLOR_EQ(kLargeWidth - 1, kLargeHeight - 1, GLColor::red);
2699
}
2700
2701
// Use this to select which configurations (e.g. which renderer, which GLES major version) these
2702
// tests should be run against.
2703
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlitFramebufferANGLETest);
2704
ANGLE_INSTANTIATE_TEST(BlitFramebufferANGLETest,
2705
ES2_D3D9(),
2706
ES2_D3D11(),
2707
ES2_D3D11_PRESENT_PATH_FAST(),
2708
ES2_OPENGL(),
2709
ES3_OPENGL(),
2710
ES2_VULKAN(),
2711
ES3_VULKAN(),
2712
WithEmulatedPrerotation(ES3_VULKAN(), 90),
2713
WithEmulatedPrerotation(ES3_VULKAN(), 180),
2714
WithEmulatedPrerotation(ES3_VULKAN(), 270),
2715
ES2_METAL(),
2716
WithNoShaderStencilOutput(ES2_METAL()));
2717
2718
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlitFramebufferTest);
2719
ANGLE_INSTANTIATE_TEST_ES3_AND(BlitFramebufferTest, WithNoShaderStencilOutput(ES3_METAL()));
2720
2721
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlitFramebufferTestES31);
2722
ANGLE_INSTANTIATE_TEST_ES31(BlitFramebufferTestES31);
2723
} // namespace
2724
2725