1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
8*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker namespace
13*8975f5c5SAndroid Build Coastguard Worker {
14*8975f5c5SAndroid Build Coastguard Worker class BlitFramebufferANGLETest : public ANGLETest<>
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker protected:
BlitFramebufferANGLETest()17*8975f5c5SAndroid Build Coastguard Worker BlitFramebufferANGLETest()
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(64);
20*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(32);
21*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
22*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
23*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
24*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
25*8975f5c5SAndroid Build Coastguard Worker setConfigDepthBits(24);
26*8975f5c5SAndroid Build Coastguard Worker setConfigStencilBits(8);
27*8975f5c5SAndroid Build Coastguard Worker
28*8975f5c5SAndroid Build Coastguard Worker mCheckerProgram = 0;
29*8975f5c5SAndroid Build Coastguard Worker mBlueProgram = 0;
30*8975f5c5SAndroid Build Coastguard Worker mRedProgram = 0;
31*8975f5c5SAndroid Build Coastguard Worker
32*8975f5c5SAndroid Build Coastguard Worker mOriginalFBO = 0;
33*8975f5c5SAndroid Build Coastguard Worker
34*8975f5c5SAndroid Build Coastguard Worker mUserFBO = 0;
35*8975f5c5SAndroid Build Coastguard Worker mUserColorBuffer = 0;
36*8975f5c5SAndroid Build Coastguard Worker mUserDepthStencilBuffer = 0;
37*8975f5c5SAndroid Build Coastguard Worker
38*8975f5c5SAndroid Build Coastguard Worker mSmallFBO = 0;
39*8975f5c5SAndroid Build Coastguard Worker mSmallColorBuffer = 0;
40*8975f5c5SAndroid Build Coastguard Worker mSmallDepthStencilBuffer = 0;
41*8975f5c5SAndroid Build Coastguard Worker
42*8975f5c5SAndroid Build Coastguard Worker mColorOnlyFBO = 0;
43*8975f5c5SAndroid Build Coastguard Worker mColorOnlyColorBuffer = 0;
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Worker mDiffFormatFBO = 0;
46*8975f5c5SAndroid Build Coastguard Worker mDiffFormatColorBuffer = 0;
47*8975f5c5SAndroid Build Coastguard Worker
48*8975f5c5SAndroid Build Coastguard Worker mDiffSizeFBO = 0;
49*8975f5c5SAndroid Build Coastguard Worker mDiffSizeColorBuffer = 0;
50*8975f5c5SAndroid Build Coastguard Worker
51*8975f5c5SAndroid Build Coastguard Worker mMRTFBO = 0;
52*8975f5c5SAndroid Build Coastguard Worker mMRTColorBuffer0 = 0;
53*8975f5c5SAndroid Build Coastguard Worker mMRTColorBuffer1 = 0;
54*8975f5c5SAndroid Build Coastguard Worker
55*8975f5c5SAndroid Build Coastguard Worker mRGBAColorbuffer = 0;
56*8975f5c5SAndroid Build Coastguard Worker mRGBAFBO = 0;
57*8975f5c5SAndroid Build Coastguard Worker mRGBAMultisampledRenderbuffer = 0;
58*8975f5c5SAndroid Build Coastguard Worker mRGBAMultisampledFBO = 0;
59*8975f5c5SAndroid Build Coastguard Worker
60*8975f5c5SAndroid Build Coastguard Worker mBGRAColorbuffer = 0;
61*8975f5c5SAndroid Build Coastguard Worker mBGRAFBO = 0;
62*8975f5c5SAndroid Build Coastguard Worker mBGRAMultisampledRenderbuffer = 0;
63*8975f5c5SAndroid Build Coastguard Worker mBGRAMultisampledFBO = 0;
64*8975f5c5SAndroid Build Coastguard Worker }
65*8975f5c5SAndroid Build Coastguard Worker
testSetUp()66*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker mCheckerProgram =
69*8975f5c5SAndroid Build Coastguard Worker CompileProgram(essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Checkered());
70*8975f5c5SAndroid Build Coastguard Worker mBlueProgram = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
71*8975f5c5SAndroid Build Coastguard Worker mRedProgram = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
72*8975f5c5SAndroid Build Coastguard Worker if (mCheckerProgram == 0 || mBlueProgram == 0 || mRedProgram == 0)
73*8975f5c5SAndroid Build Coastguard Worker {
74*8975f5c5SAndroid Build Coastguard Worker FAIL() << "shader compilation failed.";
75*8975f5c5SAndroid Build Coastguard Worker }
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
78*8975f5c5SAndroid Build Coastguard Worker
79*8975f5c5SAndroid Build Coastguard Worker GLint originalFBO;
80*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFBO);
81*8975f5c5SAndroid Build Coastguard Worker if (originalFBO >= 0)
82*8975f5c5SAndroid Build Coastguard Worker {
83*8975f5c5SAndroid Build Coastguard Worker mOriginalFBO = (GLuint)originalFBO;
84*8975f5c5SAndroid Build Coastguard Worker }
85*8975f5c5SAndroid Build Coastguard Worker
86*8975f5c5SAndroid Build Coastguard Worker GLenum format = GL_RGBA;
87*8975f5c5SAndroid Build Coastguard Worker
88*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mUserFBO);
89*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
90*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mUserColorBuffer);
91*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &mUserDepthStencilBuffer);
92*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mUserColorBuffer);
93*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
94*8975f5c5SAndroid Build Coastguard Worker mUserColorBuffer, 0);
95*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
96*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
97*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mUserDepthStencilBuffer);
98*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth(),
99*8975f5c5SAndroid Build Coastguard Worker getWindowHeight());
100*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
101*8975f5c5SAndroid Build Coastguard Worker mUserDepthStencilBuffer);
102*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
103*8975f5c5SAndroid Build Coastguard Worker mUserDepthStencilBuffer);
104*8975f5c5SAndroid Build Coastguard Worker
105*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
106*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
107*8975f5c5SAndroid Build Coastguard Worker
108*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mSmallFBO);
109*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
110*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mSmallColorBuffer);
111*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &mSmallDepthStencilBuffer);
112*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mSmallColorBuffer);
113*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth() / 2, getWindowHeight() / 2, 0,
114*8975f5c5SAndroid Build Coastguard Worker format, GL_UNSIGNED_BYTE, nullptr);
115*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
116*8975f5c5SAndroid Build Coastguard Worker mSmallColorBuffer, 0);
117*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mSmallDepthStencilBuffer);
118*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth() / 2,
119*8975f5c5SAndroid Build Coastguard Worker getWindowHeight() / 2);
120*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
121*8975f5c5SAndroid Build Coastguard Worker mSmallDepthStencilBuffer);
122*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
123*8975f5c5SAndroid Build Coastguard Worker mSmallDepthStencilBuffer);
124*8975f5c5SAndroid Build Coastguard Worker
125*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
126*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
127*8975f5c5SAndroid Build Coastguard Worker
128*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mColorOnlyFBO);
129*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
130*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mColorOnlyColorBuffer);
131*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mColorOnlyColorBuffer);
132*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
133*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
134*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
135*8975f5c5SAndroid Build Coastguard Worker mColorOnlyColorBuffer, 0);
136*8975f5c5SAndroid Build Coastguard Worker
137*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
138*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
139*8975f5c5SAndroid Build Coastguard Worker
140*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mDiffFormatFBO);
141*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mDiffFormatFBO);
142*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mDiffFormatColorBuffer);
143*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mDiffFormatColorBuffer);
144*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB,
145*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_SHORT_5_6_5, nullptr);
146*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
147*8975f5c5SAndroid Build Coastguard Worker mDiffFormatColorBuffer, 0);
148*8975f5c5SAndroid Build Coastguard Worker
149*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
150*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
151*8975f5c5SAndroid Build Coastguard Worker
152*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mDiffSizeFBO);
153*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mDiffSizeFBO);
154*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mDiffSizeColorBuffer);
155*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mDiffSizeColorBuffer);
156*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth() * 2, getWindowHeight() * 2, 0,
157*8975f5c5SAndroid Build Coastguard Worker format, GL_UNSIGNED_BYTE, nullptr);
158*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
159*8975f5c5SAndroid Build Coastguard Worker mDiffSizeColorBuffer, 0);
160*8975f5c5SAndroid Build Coastguard Worker
161*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
162*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
163*8975f5c5SAndroid Build Coastguard Worker
164*8975f5c5SAndroid Build Coastguard Worker if (IsGLExtensionEnabled("GL_EXT_draw_buffers"))
165*8975f5c5SAndroid Build Coastguard Worker {
166*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mMRTFBO);
167*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
168*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mMRTColorBuffer0);
169*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mMRTColorBuffer1);
170*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer0);
171*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
172*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
173*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D,
174*8975f5c5SAndroid Build Coastguard Worker mMRTColorBuffer0, 0);
175*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer1);
176*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, format, getWindowWidth(), getWindowHeight(), 0, format,
177*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
178*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D,
179*8975f5c5SAndroid Build Coastguard Worker mMRTColorBuffer1, 0);
180*8975f5c5SAndroid Build Coastguard Worker
181*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
182*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
183*8975f5c5SAndroid Build Coastguard Worker }
184*8975f5c5SAndroid Build Coastguard Worker
185*8975f5c5SAndroid Build Coastguard Worker if (IsGLExtensionEnabled("GL_ANGLE_framebuffer_multisample") &&
186*8975f5c5SAndroid Build Coastguard Worker IsGLExtensionEnabled("GL_OES_rgb8_rgba8"))
187*8975f5c5SAndroid Build Coastguard Worker {
188*8975f5c5SAndroid Build Coastguard Worker // RGBA single-sampled framebuffer
189*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mRGBAColorbuffer);
190*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mRGBAColorbuffer);
191*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
192*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
193*8975f5c5SAndroid Build Coastguard Worker
194*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mRGBAFBO);
195*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mRGBAFBO);
196*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
197*8975f5c5SAndroid Build Coastguard Worker mRGBAColorbuffer, 0);
198*8975f5c5SAndroid Build Coastguard Worker
199*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
200*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
201*8975f5c5SAndroid Build Coastguard Worker
202*8975f5c5SAndroid Build Coastguard Worker // RGBA multisampled framebuffer
203*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &mRGBAMultisampledRenderbuffer);
204*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mRGBAMultisampledRenderbuffer);
205*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_RGBA8, getWindowWidth(),
206*8975f5c5SAndroid Build Coastguard Worker getWindowHeight());
207*8975f5c5SAndroid Build Coastguard Worker
208*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mRGBAMultisampledFBO);
209*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mRGBAMultisampledFBO);
210*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
211*8975f5c5SAndroid Build Coastguard Worker mRGBAMultisampledRenderbuffer);
212*8975f5c5SAndroid Build Coastguard Worker
213*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
214*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
215*8975f5c5SAndroid Build Coastguard Worker
216*8975f5c5SAndroid Build Coastguard Worker if (IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"))
217*8975f5c5SAndroid Build Coastguard Worker {
218*8975f5c5SAndroid Build Coastguard Worker // BGRA single-sampled framebuffer
219*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mBGRAColorbuffer);
220*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mBGRAColorbuffer);
221*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, getWindowWidth(), getWindowHeight(), 0,
222*8975f5c5SAndroid Build Coastguard Worker GL_BGRA_EXT, GL_UNSIGNED_BYTE, nullptr);
223*8975f5c5SAndroid Build Coastguard Worker
224*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mBGRAFBO);
225*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mBGRAFBO);
226*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
227*8975f5c5SAndroid Build Coastguard Worker mBGRAColorbuffer, 0);
228*8975f5c5SAndroid Build Coastguard Worker
229*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
230*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
231*8975f5c5SAndroid Build Coastguard Worker
232*8975f5c5SAndroid Build Coastguard Worker // BGRA multisampled framebuffer
233*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
234*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer);
235*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_BGRA8_EXT,
236*8975f5c5SAndroid Build Coastguard Worker getWindowWidth(), getWindowHeight());
237*8975f5c5SAndroid Build Coastguard Worker
238*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mBGRAMultisampledFBO);
239*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mBGRAMultisampledFBO);
240*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
241*8975f5c5SAndroid Build Coastguard Worker mBGRAMultisampledRenderbuffer);
242*8975f5c5SAndroid Build Coastguard Worker
243*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
244*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
245*8975f5c5SAndroid Build Coastguard Worker }
246*8975f5c5SAndroid Build Coastguard Worker }
247*8975f5c5SAndroid Build Coastguard Worker
248*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
249*8975f5c5SAndroid Build Coastguard Worker }
250*8975f5c5SAndroid Build Coastguard Worker
testTearDown()251*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override
252*8975f5c5SAndroid Build Coastguard Worker {
253*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mCheckerProgram);
254*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mBlueProgram);
255*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mRedProgram);
256*8975f5c5SAndroid Build Coastguard Worker
257*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mUserFBO);
258*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mUserColorBuffer);
259*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &mUserDepthStencilBuffer);
260*8975f5c5SAndroid Build Coastguard Worker
261*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mSmallFBO);
262*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mSmallColorBuffer);
263*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &mSmallDepthStencilBuffer);
264*8975f5c5SAndroid Build Coastguard Worker
265*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mColorOnlyFBO);
266*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mSmallDepthStencilBuffer);
267*8975f5c5SAndroid Build Coastguard Worker
268*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mDiffFormatFBO);
269*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mDiffFormatColorBuffer);
270*8975f5c5SAndroid Build Coastguard Worker
271*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mDiffSizeFBO);
272*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mDiffSizeColorBuffer);
273*8975f5c5SAndroid Build Coastguard Worker
274*8975f5c5SAndroid Build Coastguard Worker if (IsGLExtensionEnabled("GL_EXT_draw_buffers"))
275*8975f5c5SAndroid Build Coastguard Worker {
276*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mMRTFBO);
277*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mMRTColorBuffer0);
278*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mMRTColorBuffer1);
279*8975f5c5SAndroid Build Coastguard Worker }
280*8975f5c5SAndroid Build Coastguard Worker
281*8975f5c5SAndroid Build Coastguard Worker if (mRGBAColorbuffer != 0)
282*8975f5c5SAndroid Build Coastguard Worker {
283*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mRGBAColorbuffer);
284*8975f5c5SAndroid Build Coastguard Worker }
285*8975f5c5SAndroid Build Coastguard Worker
286*8975f5c5SAndroid Build Coastguard Worker if (mRGBAFBO != 0)
287*8975f5c5SAndroid Build Coastguard Worker {
288*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mRGBAFBO);
289*8975f5c5SAndroid Build Coastguard Worker }
290*8975f5c5SAndroid Build Coastguard Worker
291*8975f5c5SAndroid Build Coastguard Worker if (mRGBAMultisampledRenderbuffer != 0)
292*8975f5c5SAndroid Build Coastguard Worker {
293*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &mRGBAMultisampledRenderbuffer);
294*8975f5c5SAndroid Build Coastguard Worker }
295*8975f5c5SAndroid Build Coastguard Worker
296*8975f5c5SAndroid Build Coastguard Worker if (mRGBAMultisampledFBO != 0)
297*8975f5c5SAndroid Build Coastguard Worker {
298*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mRGBAMultisampledFBO);
299*8975f5c5SAndroid Build Coastguard Worker }
300*8975f5c5SAndroid Build Coastguard Worker
301*8975f5c5SAndroid Build Coastguard Worker if (mBGRAColorbuffer != 0)
302*8975f5c5SAndroid Build Coastguard Worker {
303*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mBGRAColorbuffer);
304*8975f5c5SAndroid Build Coastguard Worker }
305*8975f5c5SAndroid Build Coastguard Worker
306*8975f5c5SAndroid Build Coastguard Worker if (mBGRAFBO != 0)
307*8975f5c5SAndroid Build Coastguard Worker {
308*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mBGRAFBO);
309*8975f5c5SAndroid Build Coastguard Worker }
310*8975f5c5SAndroid Build Coastguard Worker
311*8975f5c5SAndroid Build Coastguard Worker if (mBGRAMultisampledRenderbuffer != 0)
312*8975f5c5SAndroid Build Coastguard Worker {
313*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &mBGRAMultisampledRenderbuffer);
314*8975f5c5SAndroid Build Coastguard Worker }
315*8975f5c5SAndroid Build Coastguard Worker
316*8975f5c5SAndroid Build Coastguard Worker if (mBGRAMultisampledFBO != 0)
317*8975f5c5SAndroid Build Coastguard Worker {
318*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mBGRAMultisampledFBO);
319*8975f5c5SAndroid Build Coastguard Worker }
320*8975f5c5SAndroid Build Coastguard Worker }
321*8975f5c5SAndroid Build Coastguard Worker
multisampleTestHelper(GLuint readFramebuffer,GLuint drawFramebuffer)322*8975f5c5SAndroid Build Coastguard Worker void multisampleTestHelper(GLuint readFramebuffer, GLuint drawFramebuffer)
323*8975f5c5SAndroid Build Coastguard Worker {
324*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 1.0, 0.0, 1.0);
325*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, readFramebuffer);
326*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
327*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
328*8975f5c5SAndroid Build Coastguard Worker
329*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, readFramebuffer);
330*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFramebuffer);
331*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
332*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
333*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
334*8975f5c5SAndroid Build Coastguard Worker
335*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFramebuffer);
336*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
337*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255);
338*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
339*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255);
340*8975f5c5SAndroid Build Coastguard Worker }
341*8975f5c5SAndroid Build Coastguard Worker
checkExtension(const std::string & extension)342*8975f5c5SAndroid Build Coastguard Worker bool checkExtension(const std::string &extension)
343*8975f5c5SAndroid Build Coastguard Worker {
344*8975f5c5SAndroid Build Coastguard Worker if (!IsGLExtensionEnabled(extension))
345*8975f5c5SAndroid Build Coastguard Worker {
346*8975f5c5SAndroid Build Coastguard Worker std::cout << "Test skipped because " << extension << " not supported." << std::endl;
347*8975f5c5SAndroid Build Coastguard Worker return false;
348*8975f5c5SAndroid Build Coastguard Worker }
349*8975f5c5SAndroid Build Coastguard Worker
350*8975f5c5SAndroid Build Coastguard Worker return true;
351*8975f5c5SAndroid Build Coastguard Worker }
352*8975f5c5SAndroid Build Coastguard Worker
BlitStencilTestHelper(bool mesaYFlip)353*8975f5c5SAndroid Build Coastguard Worker void BlitStencilTestHelper(bool mesaYFlip)
354*8975f5c5SAndroid Build Coastguard Worker {
355*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
356*8975f5c5SAndroid Build Coastguard Worker
357*8975f5c5SAndroid Build Coastguard Worker if (mesaYFlip)
358*8975f5c5SAndroid Build Coastguard Worker {
359*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
360*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
361*8975f5c5SAndroid Build Coastguard Worker }
362*8975f5c5SAndroid Build Coastguard Worker
363*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 1.0, 0.0, 1.0);
364*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x0);
365*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
366*8975f5c5SAndroid Build Coastguard Worker
367*8975f5c5SAndroid Build Coastguard Worker // Scissor half the screen so we fill the stencil only halfway
368*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, getWindowWidth(), getWindowHeight() / 2);
369*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
370*8975f5c5SAndroid Build Coastguard Worker
371*8975f5c5SAndroid Build Coastguard Worker // fill the stencil buffer with 0x1
372*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
373*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
374*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
375*8975f5c5SAndroid Build Coastguard Worker drawQuad(mRedProgram, essl1_shaders::PositionAttrib(), 0.3f);
376*8975f5c5SAndroid Build Coastguard Worker
377*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
378*8975f5c5SAndroid Build Coastguard Worker
379*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
380*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
381*8975f5c5SAndroid Build Coastguard Worker
382*8975f5c5SAndroid Build Coastguard Worker // These clears are not useful in theory because we're copying over them, but its
383*8975f5c5SAndroid Build Coastguard Worker // helpful in debugging if we see white in any result.
384*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 1.0, 1.0, 1.0);
385*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x0);
386*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
387*8975f5c5SAndroid Build Coastguard Worker
388*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
389*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
390*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
391*8975f5c5SAndroid Build Coastguard Worker
392*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
393*8975f5c5SAndroid Build Coastguard Worker
394*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
395*8975f5c5SAndroid Build Coastguard Worker
396*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
397*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
398*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
399*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
400*8975f5c5SAndroid Build Coastguard Worker
401*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x1, 0xFF); // only pass if stencil buffer at pixel reads 0x1
402*8975f5c5SAndroid Build Coastguard Worker
403*8975f5c5SAndroid Build Coastguard Worker drawQuad(mBlueProgram, essl1_shaders::PositionAttrib(),
404*8975f5c5SAndroid Build Coastguard Worker 0.8f); // blue quad will draw if stencil buffer was copied
405*8975f5c5SAndroid Build Coastguard Worker
406*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_STENCIL_TEST);
407*8975f5c5SAndroid Build Coastguard Worker
408*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
409*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
410*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
411*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
412*8975f5c5SAndroid Build Coastguard Worker }
413*8975f5c5SAndroid Build Coastguard Worker
414*8975f5c5SAndroid Build Coastguard Worker GLuint mCheckerProgram;
415*8975f5c5SAndroid Build Coastguard Worker GLuint mBlueProgram;
416*8975f5c5SAndroid Build Coastguard Worker GLuint mRedProgram;
417*8975f5c5SAndroid Build Coastguard Worker
418*8975f5c5SAndroid Build Coastguard Worker GLuint mOriginalFBO;
419*8975f5c5SAndroid Build Coastguard Worker
420*8975f5c5SAndroid Build Coastguard Worker GLuint mUserFBO;
421*8975f5c5SAndroid Build Coastguard Worker GLuint mUserColorBuffer;
422*8975f5c5SAndroid Build Coastguard Worker GLuint mUserDepthStencilBuffer;
423*8975f5c5SAndroid Build Coastguard Worker
424*8975f5c5SAndroid Build Coastguard Worker GLuint mSmallFBO;
425*8975f5c5SAndroid Build Coastguard Worker GLuint mSmallColorBuffer;
426*8975f5c5SAndroid Build Coastguard Worker GLuint mSmallDepthStencilBuffer;
427*8975f5c5SAndroid Build Coastguard Worker
428*8975f5c5SAndroid Build Coastguard Worker GLuint mColorOnlyFBO;
429*8975f5c5SAndroid Build Coastguard Worker GLuint mColorOnlyColorBuffer;
430*8975f5c5SAndroid Build Coastguard Worker
431*8975f5c5SAndroid Build Coastguard Worker GLuint mDiffFormatFBO;
432*8975f5c5SAndroid Build Coastguard Worker GLuint mDiffFormatColorBuffer;
433*8975f5c5SAndroid Build Coastguard Worker
434*8975f5c5SAndroid Build Coastguard Worker GLuint mDiffSizeFBO;
435*8975f5c5SAndroid Build Coastguard Worker GLuint mDiffSizeColorBuffer;
436*8975f5c5SAndroid Build Coastguard Worker
437*8975f5c5SAndroid Build Coastguard Worker GLuint mMRTFBO;
438*8975f5c5SAndroid Build Coastguard Worker GLuint mMRTColorBuffer0;
439*8975f5c5SAndroid Build Coastguard Worker GLuint mMRTColorBuffer1;
440*8975f5c5SAndroid Build Coastguard Worker
441*8975f5c5SAndroid Build Coastguard Worker GLuint mRGBAColorbuffer;
442*8975f5c5SAndroid Build Coastguard Worker GLuint mRGBAFBO;
443*8975f5c5SAndroid Build Coastguard Worker GLuint mRGBAMultisampledRenderbuffer;
444*8975f5c5SAndroid Build Coastguard Worker GLuint mRGBAMultisampledFBO;
445*8975f5c5SAndroid Build Coastguard Worker
446*8975f5c5SAndroid Build Coastguard Worker GLuint mBGRAColorbuffer;
447*8975f5c5SAndroid Build Coastguard Worker GLuint mBGRAFBO;
448*8975f5c5SAndroid Build Coastguard Worker GLuint mBGRAMultisampledRenderbuffer;
449*8975f5c5SAndroid Build Coastguard Worker GLuint mBGRAMultisampledFBO;
450*8975f5c5SAndroid Build Coastguard Worker };
451*8975f5c5SAndroid Build Coastguard Worker
452*8975f5c5SAndroid Build Coastguard Worker // Draw to user-created framebuffer, blit whole-buffer color to original framebuffer.
TEST_P(BlitFramebufferANGLETest,BlitColorToDefault)453*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitColorToDefault)
454*8975f5c5SAndroid Build Coastguard Worker {
455*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
456*8975f5c5SAndroid Build Coastguard Worker
457*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
458*8975f5c5SAndroid Build Coastguard Worker
459*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
460*8975f5c5SAndroid Build Coastguard Worker
461*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
462*8975f5c5SAndroid Build Coastguard Worker
463*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
464*8975f5c5SAndroid Build Coastguard Worker
465*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
466*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
467*8975f5c5SAndroid Build Coastguard Worker
468*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
469*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
470*8975f5c5SAndroid Build Coastguard Worker
471*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
472*8975f5c5SAndroid Build Coastguard Worker
473*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
474*8975f5c5SAndroid Build Coastguard Worker
475*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
476*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
477*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
478*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
479*8975f5c5SAndroid Build Coastguard Worker }
480*8975f5c5SAndroid Build Coastguard Worker
481*8975f5c5SAndroid Build Coastguard Worker // Blit color to/from default framebuffer with Flip-X/Flip-Y.
TEST_P(BlitFramebufferANGLETest,BlitColorWithFlip)482*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitColorWithFlip)
483*8975f5c5SAndroid Build Coastguard Worker {
484*8975f5c5SAndroid Build Coastguard Worker // OpenGL ES 3.0 / GL_NV_framebuffer_blit required for flip.
485*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
486*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_NV_framebuffer_blit"));
487*8975f5c5SAndroid Build Coastguard Worker
488*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
489*8975f5c5SAndroid Build Coastguard Worker
490*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
491*8975f5c5SAndroid Build Coastguard Worker
492*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
493*8975f5c5SAndroid Build Coastguard Worker
494*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
495*8975f5c5SAndroid Build Coastguard Worker
496*8975f5c5SAndroid Build Coastguard Worker // Blit to default with x-flip.
497*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
498*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
499*8975f5c5SAndroid Build Coastguard Worker
500*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), getWindowWidth(), 0, 0,
501*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
502*8975f5c5SAndroid Build Coastguard Worker
503*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
504*8975f5c5SAndroid Build Coastguard Worker
505*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
506*8975f5c5SAndroid Build Coastguard Worker
507*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
508*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
509*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
510*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
511*8975f5c5SAndroid Build Coastguard Worker
512*8975f5c5SAndroid Build Coastguard Worker // Blit to default with y-flip.
513*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
514*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
515*8975f5c5SAndroid Build Coastguard Worker
516*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
517*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, getWindowHeight(),
518*8975f5c5SAndroid Build Coastguard Worker getWindowWidth(), 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
519*8975f5c5SAndroid Build Coastguard Worker
520*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
521*8975f5c5SAndroid Build Coastguard Worker
522*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
523*8975f5c5SAndroid Build Coastguard Worker
524*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::green);
525*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::red);
526*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::yellow);
527*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
528*8975f5c5SAndroid Build Coastguard Worker
529*8975f5c5SAndroid Build Coastguard Worker // Blit from default with x-flip.
530*8975f5c5SAndroid Build Coastguard Worker
531*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
532*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
533*8975f5c5SAndroid Build Coastguard Worker
534*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
535*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), getWindowWidth(), 0, 0,
536*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
537*8975f5c5SAndroid Build Coastguard Worker
538*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
539*8975f5c5SAndroid Build Coastguard Worker
540*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
541*8975f5c5SAndroid Build Coastguard Worker
542*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::yellow);
543*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
544*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::green);
545*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::red);
546*8975f5c5SAndroid Build Coastguard Worker
547*8975f5c5SAndroid Build Coastguard Worker // Blit from default with y-flip.
548*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
549*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
550*8975f5c5SAndroid Build Coastguard Worker
551*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
552*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, getWindowHeight(),
553*8975f5c5SAndroid Build Coastguard Worker getWindowWidth(), 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
554*8975f5c5SAndroid Build Coastguard Worker
555*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
556*8975f5c5SAndroid Build Coastguard Worker
557*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
558*8975f5c5SAndroid Build Coastguard Worker
559*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
560*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
561*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
562*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
563*8975f5c5SAndroid Build Coastguard Worker }
564*8975f5c5SAndroid Build Coastguard Worker
565*8975f5c5SAndroid Build Coastguard Worker // Blit color to default framebuffer from another framebuffer with GL_MESA_framebuffer_flip_y.
TEST_P(BlitFramebufferANGLETest,BlitColorWithMesaYFlipSrc)566*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitColorWithMesaYFlipSrc)
567*8975f5c5SAndroid Build Coastguard Worker {
568*8975f5c5SAndroid Build Coastguard Worker // OpenGL ES 3.0 / GL_NV_framebuffer_blit required for flip.
569*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(
570*8975f5c5SAndroid Build Coastguard Worker (getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_NV_framebuffer_blit")) ||
571*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
572*8975f5c5SAndroid Build Coastguard Worker
573*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
574*8975f5c5SAndroid Build Coastguard Worker
575*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
576*8975f5c5SAndroid Build Coastguard Worker
577*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
578*8975f5c5SAndroid Build Coastguard Worker
579*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
580*8975f5c5SAndroid Build Coastguard Worker
581*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
582*8975f5c5SAndroid Build Coastguard Worker
583*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
584*8975f5c5SAndroid Build Coastguard Worker
585*8975f5c5SAndroid Build Coastguard Worker // Blit to default from y-flipped.
586*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
587*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
588*8975f5c5SAndroid Build Coastguard Worker
589*8975f5c5SAndroid Build Coastguard Worker const int fboTargetWidth = getWindowHeight() / 2;
590*8975f5c5SAndroid Build Coastguard Worker const int fboTargetHeight = getWindowHeight() / 2;
591*8975f5c5SAndroid Build Coastguard Worker
592*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
593*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
594*8975f5c5SAndroid Build Coastguard Worker
595*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, fboTargetWidth,
596*8975f5c5SAndroid Build Coastguard Worker fboTargetHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
597*8975f5c5SAndroid Build Coastguard Worker
598*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
599*8975f5c5SAndroid Build Coastguard Worker
600*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
601*8975f5c5SAndroid Build Coastguard Worker
602*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, fboTargetHeight / 4, GLColor::red);
603*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::green);
604*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, fboTargetHeight / 4, GLColor::blue);
605*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::yellow);
606*8975f5c5SAndroid Build Coastguard Worker }
607*8975f5c5SAndroid Build Coastguard Worker
608*8975f5c5SAndroid Build Coastguard Worker // Blit color to y-flipped with GL_MESA_framebuffer_flip_y framebuffer from normal framebuffer.
TEST_P(BlitFramebufferANGLETest,BlitColorWithMesaYFlipDst)609*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitColorWithMesaYFlipDst)
610*8975f5c5SAndroid Build Coastguard Worker {
611*8975f5c5SAndroid Build Coastguard Worker // OpenGL ES 3.0 / GL_NV_framebuffer_blit required for flip.
612*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(
613*8975f5c5SAndroid Build Coastguard Worker (getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_NV_framebuffer_blit")) ||
614*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
615*8975f5c5SAndroid Build Coastguard Worker
616*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
617*8975f5c5SAndroid Build Coastguard Worker
618*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
619*8975f5c5SAndroid Build Coastguard Worker
620*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
621*8975f5c5SAndroid Build Coastguard Worker
622*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
623*8975f5c5SAndroid Build Coastguard Worker
624*8975f5c5SAndroid Build Coastguard Worker // Blit to default from y-flipped.
625*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
626*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
627*8975f5c5SAndroid Build Coastguard Worker
628*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
629*8975f5c5SAndroid Build Coastguard Worker
630*8975f5c5SAndroid Build Coastguard Worker const int fboTargetWidth = getWindowWidth() / 2;
631*8975f5c5SAndroid Build Coastguard Worker const int fboTargetHeight = getWindowHeight();
632*8975f5c5SAndroid Build Coastguard Worker
633*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
634*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
635*8975f5c5SAndroid Build Coastguard Worker
636*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, fboTargetWidth,
637*8975f5c5SAndroid Build Coastguard Worker fboTargetHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
638*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), getWindowWidth() / 2, 0,
639*8975f5c5SAndroid Build Coastguard Worker getWindowWidth(), getWindowHeight() / 2, GL_COLOR_BUFFER_BIT, GL_NEAREST);
640*8975f5c5SAndroid Build Coastguard Worker
641*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
642*8975f5c5SAndroid Build Coastguard Worker
643*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
644*8975f5c5SAndroid Build Coastguard Worker
645*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
646*8975f5c5SAndroid Build Coastguard Worker
647*8975f5c5SAndroid Build Coastguard Worker // Left side have inverted checker pattern.
648*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, fboTargetHeight / 4, GLColor::green);
649*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::red);
650*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, fboTargetHeight / 4, GLColor::yellow);
651*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::blue);
652*8975f5c5SAndroid Build Coastguard Worker
653*8975f5c5SAndroid Build Coastguard Worker // Right side is split to 2 parts where upper part have non y-flipped checker pattern and the
654*8975f5c5SAndroid Build Coastguard Worker // bottom one has white color.
655*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5 * getWindowWidth() / 8, 5 * getWindowHeight() / 8, GLColor::green);
656*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5 * getWindowWidth() / 8, 7 * getWindowHeight() / 8, GLColor::red);
657*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(7 * getWindowWidth() / 8, 5 * getWindowHeight() / 8, GLColor::yellow);
658*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(7 * getWindowWidth() / 8, 7 * getWindowHeight() / 8, GLColor::blue);
659*8975f5c5SAndroid Build Coastguard Worker
660*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(4 * getWindowWidth() / 8, 0, getWindowWidth() / 4, getWindowHeight() / 2,
661*8975f5c5SAndroid Build Coastguard Worker GLColor::white);
662*8975f5c5SAndroid Build Coastguard Worker }
663*8975f5c5SAndroid Build Coastguard Worker
664*8975f5c5SAndroid Build Coastguard Worker // Blit color to/from y-flipped with GL_MESA_framebuffer_flip_y framebuffers where dst framebuffer
665*8975f5c5SAndroid Build Coastguard Worker // have different size.
TEST_P(BlitFramebufferANGLETest,BlitColorWithMesaYFlipSrcDst)666*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitColorWithMesaYFlipSrcDst)
667*8975f5c5SAndroid Build Coastguard Worker {
668*8975f5c5SAndroid Build Coastguard Worker // OpenGL ES 3.0 / GL_NV_framebuffer_blit required for flip.
669*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(
670*8975f5c5SAndroid Build Coastguard Worker (getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_NV_framebuffer_blit")) ||
671*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
672*8975f5c5SAndroid Build Coastguard Worker
673*8975f5c5SAndroid Build Coastguard Worker // Create a custom framebuffer as the default one cannot be flipped.
674*8975f5c5SAndroid Build Coastguard Worker GLTexture tex0;
675*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex0);
676*8975f5c5SAndroid Build Coastguard Worker const int fb0Width = getWindowWidth() / 2;
677*8975f5c5SAndroid Build Coastguard Worker const int fb0Height = getWindowHeight() / 2;
678*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fb0Width, fb0Height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
679*8975f5c5SAndroid Build Coastguard Worker nullptr);
680*8975f5c5SAndroid Build Coastguard Worker
681*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fb0;
682*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb0);
683*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex0, 0);
684*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
685*8975f5c5SAndroid Build Coastguard Worker
686*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
687*8975f5c5SAndroid Build Coastguard Worker
688*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
689*8975f5c5SAndroid Build Coastguard Worker
690*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
691*8975f5c5SAndroid Build Coastguard Worker
692*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
693*8975f5c5SAndroid Build Coastguard Worker
694*8975f5c5SAndroid Build Coastguard Worker // Blit to default from y-flipped.
695*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
696*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, fb0);
697*8975f5c5SAndroid Build Coastguard Worker
698*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
699*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_READ_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
700*8975f5c5SAndroid Build Coastguard Worker
701*8975f5c5SAndroid Build Coastguard Worker const int fboTargetWidth = fb0Width / 2;
702*8975f5c5SAndroid Build Coastguard Worker const int fboTargetHeight = fb0Height;
703*8975f5c5SAndroid Build Coastguard Worker
704*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
705*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
706*8975f5c5SAndroid Build Coastguard Worker
707*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, fboTargetWidth,
708*8975f5c5SAndroid Build Coastguard Worker fboTargetHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
709*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), fb0Width / 2, 0, fb0Width,
710*8975f5c5SAndroid Build Coastguard Worker fb0Height / 2, GL_COLOR_BUFFER_BIT, GL_NEAREST);
711*8975f5c5SAndroid Build Coastguard Worker
712*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
713*8975f5c5SAndroid Build Coastguard Worker
714*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb0);
715*8975f5c5SAndroid Build Coastguard Worker
716*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
717*8975f5c5SAndroid Build Coastguard Worker
718*8975f5c5SAndroid Build Coastguard Worker // Left side have inverted checker pattern.
719*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, fboTargetHeight / 4, GLColor::red);
720*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::green);
721*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, fboTargetHeight / 4, GLColor::blue);
722*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::yellow);
723*8975f5c5SAndroid Build Coastguard Worker
724*8975f5c5SAndroid Build Coastguard Worker // Right side is split to 2 parts where upper part have y-flipped checker pattern and the
725*8975f5c5SAndroid Build Coastguard Worker // bottom one has white color.
726*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5 * fb0Width / 8, 5 * fb0Height / 8, GLColor::red);
727*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5 * fb0Width / 8, 7 * fb0Height / 8, GLColor::green);
728*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(7 * fb0Width / 8, 5 * fb0Height / 8, GLColor::blue);
729*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(7 * fb0Width / 8, 7 * fb0Height / 8, GLColor::yellow);
730*8975f5c5SAndroid Build Coastguard Worker
731*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(4 * fb0Width / 8, 0, fb0Width / 4, fb0Height / 2, GLColor::white);
732*8975f5c5SAndroid Build Coastguard Worker }
733*8975f5c5SAndroid Build Coastguard Worker
734*8975f5c5SAndroid Build Coastguard Worker // Same as BlitColorWithMesaYFlip but uses an integer buffer format.
TEST_P(BlitFramebufferANGLETest,BlitColorWithMesaYFlipInteger)735*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitColorWithMesaYFlipInteger)
736*8975f5c5SAndroid Build Coastguard Worker {
737*8975f5c5SAndroid Build Coastguard Worker // OpenGL ES 3.0 / GL_NV_framebuffer_blit required for flip.
738*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(
739*8975f5c5SAndroid Build Coastguard Worker (getClientMajorVersion() < 3 || !IsGLExtensionEnabled("GL_NV_framebuffer_blit")) ||
740*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
741*8975f5c5SAndroid Build Coastguard Worker
742*8975f5c5SAndroid Build Coastguard Worker GLTexture tex0;
743*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex0);
744*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8I, getWindowWidth(), getWindowHeight(), 0,
745*8975f5c5SAndroid Build Coastguard Worker GL_RGBA_INTEGER, GL_BYTE, nullptr);
746*8975f5c5SAndroid Build Coastguard Worker
747*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fb0;
748*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb0);
749*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex0, 0);
750*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
751*8975f5c5SAndroid Build Coastguard Worker
752*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
753*8975f5c5SAndroid Build Coastguard Worker
754*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
755*8975f5c5SAndroid Build Coastguard Worker
756*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
757*8975f5c5SAndroid Build Coastguard Worker
758*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
759*8975f5c5SAndroid Build Coastguard Worker
760*8975f5c5SAndroid Build Coastguard Worker GLTexture tex1;
761*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex1);
762*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8I, getWindowWidth(), getWindowHeight(), 0,
763*8975f5c5SAndroid Build Coastguard Worker GL_RGBA_INTEGER, GL_BYTE, nullptr);
764*8975f5c5SAndroid Build Coastguard Worker
765*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fb1;
766*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb1);
767*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1, 0);
768*8975f5c5SAndroid Build Coastguard Worker
769*8975f5c5SAndroid Build Coastguard Worker // Blit to default from y-flipped.
770*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, fb0);
771*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, fb1);
772*8975f5c5SAndroid Build Coastguard Worker
773*8975f5c5SAndroid Build Coastguard Worker const int fb1_target_width = getWindowHeight() / 3;
774*8975f5c5SAndroid Build Coastguard Worker const int fb1_target_height = getWindowHeight() / 3;
775*8975f5c5SAndroid Build Coastguard Worker
776*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
777*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
778*8975f5c5SAndroid Build Coastguard Worker
779*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, fb1_target_width,
780*8975f5c5SAndroid Build Coastguard Worker fb1_target_height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
781*8975f5c5SAndroid Build Coastguard Worker
782*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
783*8975f5c5SAndroid Build Coastguard Worker
784*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb1);
785*8975f5c5SAndroid Build Coastguard Worker
786*8975f5c5SAndroid Build Coastguard Worker // The colors outside the target must remain the same.
787*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(getWindowWidth() - 1, getWindowHeight() - 1, 0, 127, 127, 127);
788*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(getWindowWidth() - 1, 0, 0, 127, 127, 127);
789*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(0, getWindowHeight() - 1, 0, 127, 127, 127);
790*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(fb1_target_width, fb1_target_height, 0, 127, 127, 127);
791*8975f5c5SAndroid Build Coastguard Worker
792*8975f5c5SAndroid Build Coastguard Worker // While inside must change.
793*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(fb1_target_width / 4, fb1_target_height / 4, 127, 0, 0, 127);
794*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(fb1_target_width / 4, 3 * fb1_target_height / 4, 0, 127, 0, 127);
795*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(3 * fb1_target_width / 4, fb1_target_height / 4, 0, 0, 127, 127);
796*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(3 * fb1_target_width / 4, 3 * fb1_target_height / 4, 127, 127, 0, 127);
797*8975f5c5SAndroid Build Coastguard Worker
798*8975f5c5SAndroid Build Coastguard Worker // Blit from y-flipped to default.
799*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, fb1);
800*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, fb0);
801*8975f5c5SAndroid Build Coastguard Worker
802*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
803*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
804*8975f5c5SAndroid Build Coastguard Worker
805*8975f5c5SAndroid Build Coastguard Worker // Set y-flip flag so that y-flipped frame buffer blit to the original fbo in reverse. This
806*8975f5c5SAndroid Build Coastguard Worker // should result in flipping y back.
807*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
808*8975f5c5SAndroid Build Coastguard Worker
809*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
810*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, fb1_target_width, fb1_target_height, 0, 0, getWindowWidth(),
811*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
812*8975f5c5SAndroid Build Coastguard Worker
813*8975f5c5SAndroid Build Coastguard Worker // And explicitly disable y-flip so that read does not implicitly use this flag.
814*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
815*8975f5c5SAndroid Build Coastguard Worker
816*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
817*8975f5c5SAndroid Build Coastguard Worker
818*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb0);
819*8975f5c5SAndroid Build Coastguard Worker
820*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(getWindowWidth() / 4, getWindowHeight() / 4, 0, 127, 0, 127);
821*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(getWindowWidth() / 4, 3 * getWindowHeight() / 4, 127, 0, 0, 127);
822*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(3 * getWindowWidth() / 4, getWindowHeight() / 4, 127, 127, 0, 127);
823*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_8I(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 127, 127);
824*8975f5c5SAndroid Build Coastguard Worker }
825*8975f5c5SAndroid Build Coastguard Worker
826*8975f5c5SAndroid Build Coastguard Worker // Draw to system framebuffer, blit whole-buffer color to user-created framebuffer.
TEST_P(BlitFramebufferANGLETest,ReverseColorBlit)827*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, ReverseColorBlit)
828*8975f5c5SAndroid Build Coastguard Worker {
829*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
830*8975f5c5SAndroid Build Coastguard Worker
831*8975f5c5SAndroid Build Coastguard Worker // TODO(jmadill): Fix this. http://anglebug.com/42261451
832*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsVulkan() && IsAndroid());
833*8975f5c5SAndroid Build Coastguard Worker
834*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
835*8975f5c5SAndroid Build Coastguard Worker
836*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
837*8975f5c5SAndroid Build Coastguard Worker
838*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
839*8975f5c5SAndroid Build Coastguard Worker
840*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
841*8975f5c5SAndroid Build Coastguard Worker
842*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
843*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
844*8975f5c5SAndroid Build Coastguard Worker
845*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
846*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
847*8975f5c5SAndroid Build Coastguard Worker
848*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
849*8975f5c5SAndroid Build Coastguard Worker
850*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
851*8975f5c5SAndroid Build Coastguard Worker
852*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
853*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
854*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
855*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
856*8975f5c5SAndroid Build Coastguard Worker }
857*8975f5c5SAndroid Build Coastguard Worker
858*8975f5c5SAndroid Build Coastguard Worker // blit from user-created FBO to system framebuffer, with the scissor test enabled.
TEST_P(BlitFramebufferANGLETest,ScissoredBlit)859*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, ScissoredBlit)
860*8975f5c5SAndroid Build Coastguard Worker {
861*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
862*8975f5c5SAndroid Build Coastguard Worker
863*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
864*8975f5c5SAndroid Build Coastguard Worker
865*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
866*8975f5c5SAndroid Build Coastguard Worker
867*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
868*8975f5c5SAndroid Build Coastguard Worker
869*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
870*8975f5c5SAndroid Build Coastguard Worker
871*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
872*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
873*8975f5c5SAndroid Build Coastguard Worker
874*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 1.0, 1.0, 1.0);
875*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
876*8975f5c5SAndroid Build Coastguard Worker
877*8975f5c5SAndroid Build Coastguard Worker glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
878*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
879*8975f5c5SAndroid Build Coastguard Worker
880*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
881*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
882*8975f5c5SAndroid Build Coastguard Worker
883*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
884*8975f5c5SAndroid Build Coastguard Worker
885*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
886*8975f5c5SAndroid Build Coastguard Worker
887*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
888*8975f5c5SAndroid Build Coastguard Worker
889*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::white);
890*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::white);
891*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
892*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
893*8975f5c5SAndroid Build Coastguard Worker }
894*8975f5c5SAndroid Build Coastguard Worker
895*8975f5c5SAndroid Build Coastguard Worker // blit from system FBO to user-created framebuffer, with the scissor test enabled.
TEST_P(BlitFramebufferANGLETest,ReverseScissoredBlit)896*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, ReverseScissoredBlit)
897*8975f5c5SAndroid Build Coastguard Worker {
898*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
899*8975f5c5SAndroid Build Coastguard Worker
900*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
901*8975f5c5SAndroid Build Coastguard Worker
902*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
903*8975f5c5SAndroid Build Coastguard Worker
904*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
905*8975f5c5SAndroid Build Coastguard Worker
906*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
907*8975f5c5SAndroid Build Coastguard Worker
908*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
909*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
910*8975f5c5SAndroid Build Coastguard Worker
911*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 1.0, 1.0, 1.0);
912*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
913*8975f5c5SAndroid Build Coastguard Worker
914*8975f5c5SAndroid Build Coastguard Worker glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
915*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
916*8975f5c5SAndroid Build Coastguard Worker
917*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
918*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
919*8975f5c5SAndroid Build Coastguard Worker
920*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
921*8975f5c5SAndroid Build Coastguard Worker
922*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
923*8975f5c5SAndroid Build Coastguard Worker
924*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
925*8975f5c5SAndroid Build Coastguard Worker
926*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::white);
927*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::white);
928*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
929*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
930*8975f5c5SAndroid Build Coastguard Worker }
931*8975f5c5SAndroid Build Coastguard Worker
932*8975f5c5SAndroid Build Coastguard Worker // blit from user-created FBO to system framebuffer, using region larger than buffer.
TEST_P(BlitFramebufferANGLETest,OversizedBlit)933*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, OversizedBlit)
934*8975f5c5SAndroid Build Coastguard Worker {
935*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
936*8975f5c5SAndroid Build Coastguard Worker
937*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
938*8975f5c5SAndroid Build Coastguard Worker
939*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
940*8975f5c5SAndroid Build Coastguard Worker
941*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
942*8975f5c5SAndroid Build Coastguard Worker
943*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
944*8975f5c5SAndroid Build Coastguard Worker
945*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
946*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
947*8975f5c5SAndroid Build Coastguard Worker
948*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 1.0, 1.0, 1.0);
949*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
950*8975f5c5SAndroid Build Coastguard Worker
951*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0,
952*8975f5c5SAndroid Build Coastguard Worker getWindowWidth() * 2, getWindowHeight() * 2, GL_COLOR_BUFFER_BIT,
953*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
954*8975f5c5SAndroid Build Coastguard Worker
955*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
956*8975f5c5SAndroid Build Coastguard Worker
957*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
958*8975f5c5SAndroid Build Coastguard Worker
959*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
960*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
961*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
962*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
963*8975f5c5SAndroid Build Coastguard Worker }
964*8975f5c5SAndroid Build Coastguard Worker
965*8975f5c5SAndroid Build Coastguard Worker // blit from system FBO to user-created framebuffer, using region larger than buffer.
TEST_P(BlitFramebufferANGLETest,ReverseOversizedBlit)966*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, ReverseOversizedBlit)
967*8975f5c5SAndroid Build Coastguard Worker {
968*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
969*8975f5c5SAndroid Build Coastguard Worker
970*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
971*8975f5c5SAndroid Build Coastguard Worker
972*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
973*8975f5c5SAndroid Build Coastguard Worker
974*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
975*8975f5c5SAndroid Build Coastguard Worker
976*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
977*8975f5c5SAndroid Build Coastguard Worker
978*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
979*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
980*8975f5c5SAndroid Build Coastguard Worker
981*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 1.0, 1.0, 1.0);
982*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
983*8975f5c5SAndroid Build Coastguard Worker
984*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0,
985*8975f5c5SAndroid Build Coastguard Worker getWindowWidth() * 2, getWindowHeight() * 2, GL_COLOR_BUFFER_BIT,
986*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
987*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
988*8975f5c5SAndroid Build Coastguard Worker
989*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
990*8975f5c5SAndroid Build Coastguard Worker
991*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
992*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
993*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
994*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
995*8975f5c5SAndroid Build Coastguard Worker }
996*8975f5c5SAndroid Build Coastguard Worker
997*8975f5c5SAndroid Build Coastguard Worker // blit from user-created FBO to system framebuffer, with depth buffer.
TEST_P(BlitFramebufferANGLETest,BlitWithDepthUserToDefault)998*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitWithDepthUserToDefault)
999*8975f5c5SAndroid Build Coastguard Worker {
1000*8975f5c5SAndroid Build Coastguard Worker // TODO(http://anglebug.com/42264679): glBlitFramebufferANGLE() generates GL_INVALID_OPERATION
1001*8975f5c5SAndroid Build Coastguard Worker // for the ES2_OpenGL backend.
1002*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsOpenGL());
1003*8975f5c5SAndroid Build Coastguard Worker
1004*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1005*8975f5c5SAndroid Build Coastguard Worker
1006*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1007*8975f5c5SAndroid Build Coastguard Worker
1008*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
1009*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1010*8975f5c5SAndroid Build Coastguard Worker
1011*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
1012*8975f5c5SAndroid Build Coastguard Worker
1013*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1014*8975f5c5SAndroid Build Coastguard Worker
1015*8975f5c5SAndroid Build Coastguard Worker // Clear the first half of the screen
1016*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
1017*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, getWindowWidth(), getWindowHeight() / 2);
1018*8975f5c5SAndroid Build Coastguard Worker
1019*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.1f);
1020*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 0.0, 0.0, 1.0);
1021*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1022*8975f5c5SAndroid Build Coastguard Worker
1023*8975f5c5SAndroid Build Coastguard Worker // Scissor the second half of the screen
1024*8975f5c5SAndroid Build Coastguard Worker glScissor(0, getWindowHeight() / 2, getWindowWidth(), getWindowHeight() / 2);
1025*8975f5c5SAndroid Build Coastguard Worker
1026*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.9f);
1027*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 1.0, 0.0, 1.0);
1028*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1029*8975f5c5SAndroid Build Coastguard Worker
1030*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
1031*8975f5c5SAndroid Build Coastguard Worker
1032*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1033*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1034*8975f5c5SAndroid Build Coastguard Worker
1035*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1036*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
1037*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
1038*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1039*8975f5c5SAndroid Build Coastguard Worker
1040*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
1041*8975f5c5SAndroid Build Coastguard Worker
1042*8975f5c5SAndroid Build Coastguard Worker // if blit is happening correctly, this quad will draw only on the bottom half since it will
1043*8975f5c5SAndroid Build Coastguard Worker // be behind on the first half and in front on the second half.
1044*8975f5c5SAndroid Build Coastguard Worker drawQuad(mBlueProgram, essl1_shaders::PositionAttrib(), 0.5f);
1045*8975f5c5SAndroid Build Coastguard Worker
1046*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
1047*8975f5c5SAndroid Build Coastguard Worker
1048*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
1049*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
1050*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
1051*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
1052*8975f5c5SAndroid Build Coastguard Worker }
1053*8975f5c5SAndroid Build Coastguard Worker
1054*8975f5c5SAndroid Build Coastguard Worker // blit from system FBO to user-created framebuffer, with depth buffer.
TEST_P(BlitFramebufferANGLETest,BlitWithDepthDefaultToUser)1055*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitWithDepthDefaultToUser)
1056*8975f5c5SAndroid Build Coastguard Worker {
1057*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1058*8975f5c5SAndroid Build Coastguard Worker
1059*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
1060*8975f5c5SAndroid Build Coastguard Worker
1061*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
1062*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1063*8975f5c5SAndroid Build Coastguard Worker
1064*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
1065*8975f5c5SAndroid Build Coastguard Worker
1066*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1067*8975f5c5SAndroid Build Coastguard Worker
1068*8975f5c5SAndroid Build Coastguard Worker // Clear the first half of the screen
1069*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
1070*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, getWindowWidth(), getWindowHeight() / 2);
1071*8975f5c5SAndroid Build Coastguard Worker
1072*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.1f);
1073*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 0.0, 0.0, 1.0);
1074*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1075*8975f5c5SAndroid Build Coastguard Worker
1076*8975f5c5SAndroid Build Coastguard Worker // Scissor the second half of the screen
1077*8975f5c5SAndroid Build Coastguard Worker glScissor(0, getWindowHeight() / 2, getWindowWidth(), getWindowHeight() / 2);
1078*8975f5c5SAndroid Build Coastguard Worker
1079*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.9f);
1080*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 1.0, 0.0, 1.0);
1081*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1082*8975f5c5SAndroid Build Coastguard Worker
1083*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
1084*8975f5c5SAndroid Build Coastguard Worker
1085*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO);
1086*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO);
1087*8975f5c5SAndroid Build Coastguard Worker
1088*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1089*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
1090*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
1091*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1092*8975f5c5SAndroid Build Coastguard Worker
1093*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1094*8975f5c5SAndroid Build Coastguard Worker
1095*8975f5c5SAndroid Build Coastguard Worker // if blit is happening correctly, this quad will draw only on the bottom half since it will be
1096*8975f5c5SAndroid Build Coastguard Worker // behind on the first half and in front on the second half.
1097*8975f5c5SAndroid Build Coastguard Worker drawQuad(mBlueProgram, essl1_shaders::PositionAttrib(), 0.5f);
1098*8975f5c5SAndroid Build Coastguard Worker
1099*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
1100*8975f5c5SAndroid Build Coastguard Worker
1101*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
1102*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
1103*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
1104*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::blue);
1105*8975f5c5SAndroid Build Coastguard Worker }
1106*8975f5c5SAndroid Build Coastguard Worker
1107*8975f5c5SAndroid Build Coastguard Worker // blit from one region of the system fbo to another-- this should fail.
TEST_P(BlitFramebufferANGLETest,BlitSameBufferOriginal)1108*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitSameBufferOriginal)
1109*8975f5c5SAndroid Build Coastguard Worker {
1110*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1111*8975f5c5SAndroid Build Coastguard Worker
1112*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
1113*8975f5c5SAndroid Build Coastguard Worker
1114*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1115*8975f5c5SAndroid Build Coastguard Worker
1116*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
1117*8975f5c5SAndroid Build Coastguard Worker
1118*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1119*8975f5c5SAndroid Build Coastguard Worker
1120*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0,
1121*8975f5c5SAndroid Build Coastguard Worker getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
1122*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1123*8975f5c5SAndroid Build Coastguard Worker }
1124*8975f5c5SAndroid Build Coastguard Worker
1125*8975f5c5SAndroid Build Coastguard Worker // blit from one region of the system fbo to another.
TEST_P(BlitFramebufferANGLETest,BlitSameBufferUser)1126*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitSameBufferUser)
1127*8975f5c5SAndroid Build Coastguard Worker {
1128*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1129*8975f5c5SAndroid Build Coastguard Worker
1130*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1131*8975f5c5SAndroid Build Coastguard Worker
1132*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1133*8975f5c5SAndroid Build Coastguard Worker
1134*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
1135*8975f5c5SAndroid Build Coastguard Worker
1136*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1137*8975f5c5SAndroid Build Coastguard Worker
1138*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0,
1139*8975f5c5SAndroid Build Coastguard Worker getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
1140*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1141*8975f5c5SAndroid Build Coastguard Worker }
1142*8975f5c5SAndroid Build Coastguard Worker
TEST_P(BlitFramebufferANGLETest,BlitPartialColor)1143*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitPartialColor)
1144*8975f5c5SAndroid Build Coastguard Worker {
1145*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1146*8975f5c5SAndroid Build Coastguard Worker
1147*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1148*8975f5c5SAndroid Build Coastguard Worker
1149*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1150*8975f5c5SAndroid Build Coastguard Worker
1151*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
1152*8975f5c5SAndroid Build Coastguard Worker
1153*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1154*8975f5c5SAndroid Build Coastguard Worker
1155*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1156*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1157*8975f5c5SAndroid Build Coastguard Worker
1158*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 1.0, 1.0, 1.0);
1159*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1160*8975f5c5SAndroid Build Coastguard Worker
1161*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0,
1162*8975f5c5SAndroid Build Coastguard Worker getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight(),
1163*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT, GL_NEAREST);
1164*8975f5c5SAndroid Build Coastguard Worker
1165*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1166*8975f5c5SAndroid Build Coastguard Worker
1167*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO);
1168*8975f5c5SAndroid Build Coastguard Worker
1169*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::white);
1170*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::red);
1171*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::white);
1172*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::white);
1173*8975f5c5SAndroid Build Coastguard Worker }
1174*8975f5c5SAndroid Build Coastguard Worker
TEST_P(BlitFramebufferANGLETest,BlitDifferentSizes)1175*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitDifferentSizes)
1176*8975f5c5SAndroid Build Coastguard Worker {
1177*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1178*8975f5c5SAndroid Build Coastguard Worker
1179*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1180*8975f5c5SAndroid Build Coastguard Worker
1181*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1182*8975f5c5SAndroid Build Coastguard Worker
1183*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
1184*8975f5c5SAndroid Build Coastguard Worker
1185*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1186*8975f5c5SAndroid Build Coastguard Worker
1187*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mSmallFBO);
1188*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1189*8975f5c5SAndroid Build Coastguard Worker
1190*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 1.0, 1.0, 1.0);
1191*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1192*8975f5c5SAndroid Build Coastguard Worker
1193*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1194*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
1195*8975f5c5SAndroid Build Coastguard Worker
1196*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1197*8975f5c5SAndroid Build Coastguard Worker
1198*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO);
1199*8975f5c5SAndroid Build Coastguard Worker
1200*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
1201*8975f5c5SAndroid Build Coastguard Worker
1202*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1203*8975f5c5SAndroid Build Coastguard Worker }
1204*8975f5c5SAndroid Build Coastguard Worker
1205*8975f5c5SAndroid Build Coastguard Worker // Test that blit with missing attachments is ignored.
TEST_P(BlitFramebufferANGLETest,BlitWithMissingAttachments)1206*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitWithMissingAttachments)
1207*8975f5c5SAndroid Build Coastguard Worker {
1208*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1209*8975f5c5SAndroid Build Coastguard Worker
1210*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
1211*8975f5c5SAndroid Build Coastguard Worker
1212*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1213*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.3f);
1214*8975f5c5SAndroid Build Coastguard Worker
1215*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1216*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
1217*8975f5c5SAndroid Build Coastguard Worker
1218*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 1.0, 1.0, 1.0);
1219*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1220*8975f5c5SAndroid Build Coastguard Worker
1221*8975f5c5SAndroid Build Coastguard Worker // No error if the read FBO has no depth attachment
1222*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1223*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
1224*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
1225*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1226*8975f5c5SAndroid Build Coastguard Worker
1227*8975f5c5SAndroid Build Coastguard Worker // No error if the read FBO has no stencil attachment
1228*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1229*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
1230*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
1231*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1232*8975f5c5SAndroid Build Coastguard Worker
1233*8975f5c5SAndroid Build Coastguard Worker // No error if we read from a missing color attachment. Create a temp attachment as
1234*8975f5c5SAndroid Build Coastguard Worker // attachment1, then remove attachment 0.
1235*8975f5c5SAndroid Build Coastguard Worker //
1236*8975f5c5SAndroid Build Coastguard Worker // The same could be done with glReadBuffer, which requires ES3 (this test runs on ES2).
1237*8975f5c5SAndroid Build Coastguard Worker GLTexture tempColor;
1238*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tempColor);
1239*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
1240*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
1241*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, tempColor, 0);
1242*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
1243*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
1244*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1245*8975f5c5SAndroid Build Coastguard Worker
1246*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1247*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
1248*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1249*8975f5c5SAndroid Build Coastguard Worker }
1250*8975f5c5SAndroid Build Coastguard Worker
TEST_P(BlitFramebufferANGLETest,BlitStencil)1251*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitStencil)
1252*8975f5c5SAndroid Build Coastguard Worker {
1253*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1254*8975f5c5SAndroid Build Coastguard Worker
1255*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40096473
1256*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsIntel() && IsD3D9());
1257*8975f5c5SAndroid Build Coastguard Worker
1258*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263934
1259*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D9());
1260*8975f5c5SAndroid Build Coastguard Worker
1261*8975f5c5SAndroid Build Coastguard Worker BlitStencilTestHelper(false /* mesaFlipY */);
1262*8975f5c5SAndroid Build Coastguard Worker }
1263*8975f5c5SAndroid Build Coastguard Worker
1264*8975f5c5SAndroid Build Coastguard Worker // Same as BlitStencil, but with y-flip flag set.
TEST_P(BlitFramebufferANGLETest,BlitStencilWithMesaYFlip)1265*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitStencilWithMesaYFlip)
1266*8975f5c5SAndroid Build Coastguard Worker {
1267*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit") ||
1268*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
1269*8975f5c5SAndroid Build Coastguard Worker
1270*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40096473
1271*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsIntel() && IsD3D9());
1272*8975f5c5SAndroid Build Coastguard Worker
1273*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263934
1274*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D9());
1275*8975f5c5SAndroid Build Coastguard Worker
1276*8975f5c5SAndroid Build Coastguard Worker BlitStencilTestHelper(true /* mesaFlipY */);
1277*8975f5c5SAndroid Build Coastguard Worker }
1278*8975f5c5SAndroid Build Coastguard Worker
1279*8975f5c5SAndroid Build Coastguard Worker // make sure that attempting to blit a partial depth buffer issues an error
TEST_P(BlitFramebufferANGLETest,BlitPartialDepthStencil)1280*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitPartialDepthStencil)
1281*8975f5c5SAndroid Build Coastguard Worker {
1282*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1283*8975f5c5SAndroid Build Coastguard Worker
1284*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1285*8975f5c5SAndroid Build Coastguard Worker
1286*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1287*8975f5c5SAndroid Build Coastguard Worker
1288*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
1289*8975f5c5SAndroid Build Coastguard Worker
1290*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1291*8975f5c5SAndroid Build Coastguard Worker
1292*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1293*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1294*8975f5c5SAndroid Build Coastguard Worker
1295*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
1296*8975f5c5SAndroid Build Coastguard Worker getWindowWidth() / 2, getWindowHeight() / 2, GL_DEPTH_BUFFER_BIT,
1297*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
1298*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1299*8975f5c5SAndroid Build Coastguard Worker }
1300*8975f5c5SAndroid Build Coastguard Worker
1301*8975f5c5SAndroid Build Coastguard Worker // Test blit with MRT framebuffers
TEST_P(BlitFramebufferANGLETest,BlitMRT)1302*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, BlitMRT)
1303*8975f5c5SAndroid Build Coastguard Worker {
1304*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1305*8975f5c5SAndroid Build Coastguard Worker
1306*8975f5c5SAndroid Build Coastguard Worker if (!IsGLExtensionEnabled("GL_EXT_draw_buffers"))
1307*8975f5c5SAndroid Build Coastguard Worker {
1308*8975f5c5SAndroid Build Coastguard Worker return;
1309*8975f5c5SAndroid Build Coastguard Worker }
1310*8975f5c5SAndroid Build Coastguard Worker
1311*8975f5c5SAndroid Build Coastguard Worker GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT};
1312*8975f5c5SAndroid Build Coastguard Worker
1313*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
1314*8975f5c5SAndroid Build Coastguard Worker glDrawBuffersEXT(2, drawBuffers);
1315*8975f5c5SAndroid Build Coastguard Worker
1316*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO);
1317*8975f5c5SAndroid Build Coastguard Worker
1318*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1319*8975f5c5SAndroid Build Coastguard Worker
1320*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f);
1321*8975f5c5SAndroid Build Coastguard Worker
1322*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1323*8975f5c5SAndroid Build Coastguard Worker
1324*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO);
1325*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mMRTFBO);
1326*8975f5c5SAndroid Build Coastguard Worker
1327*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1328*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
1329*8975f5c5SAndroid Build Coastguard Worker
1330*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1331*8975f5c5SAndroid Build Coastguard Worker
1332*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO);
1333*8975f5c5SAndroid Build Coastguard Worker
1334*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
1335*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
1336*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
1337*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
1338*8975f5c5SAndroid Build Coastguard Worker
1339*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
1340*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0,
1341*8975f5c5SAndroid Build Coastguard Worker 0);
1342*8975f5c5SAndroid Build Coastguard Worker
1343*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red);
1344*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green);
1345*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue);
1346*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow);
1347*8975f5c5SAndroid Build Coastguard Worker
1348*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0,
1349*8975f5c5SAndroid Build Coastguard Worker 0);
1350*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D,
1351*8975f5c5SAndroid Build Coastguard Worker mMRTColorBuffer1, 0);
1352*8975f5c5SAndroid Build Coastguard Worker }
1353*8975f5c5SAndroid Build Coastguard Worker
1354*8975f5c5SAndroid Build Coastguard Worker // Test multisampled framebuffer blits if supported
TEST_P(BlitFramebufferANGLETest,MultisampledRGBAToRGBA)1355*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, MultisampledRGBAToRGBA)
1356*8975f5c5SAndroid Build Coastguard Worker {
1357*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1358*8975f5c5SAndroid Build Coastguard Worker
1359*8975f5c5SAndroid Build Coastguard Worker if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
1360*8975f5c5SAndroid Build Coastguard Worker return;
1361*8975f5c5SAndroid Build Coastguard Worker
1362*8975f5c5SAndroid Build Coastguard Worker if (!checkExtension("GL_OES_rgb8_rgba8"))
1363*8975f5c5SAndroid Build Coastguard Worker return;
1364*8975f5c5SAndroid Build Coastguard Worker
1365*8975f5c5SAndroid Build Coastguard Worker multisampleTestHelper(mRGBAMultisampledFBO, mRGBAFBO);
1366*8975f5c5SAndroid Build Coastguard Worker }
1367*8975f5c5SAndroid Build Coastguard Worker
TEST_P(BlitFramebufferANGLETest,MultisampledRGBAToBGRA)1368*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, MultisampledRGBAToBGRA)
1369*8975f5c5SAndroid Build Coastguard Worker {
1370*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1371*8975f5c5SAndroid Build Coastguard Worker
1372*8975f5c5SAndroid Build Coastguard Worker if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
1373*8975f5c5SAndroid Build Coastguard Worker return;
1374*8975f5c5SAndroid Build Coastguard Worker
1375*8975f5c5SAndroid Build Coastguard Worker if (!checkExtension("GL_OES_rgb8_rgba8"))
1376*8975f5c5SAndroid Build Coastguard Worker return;
1377*8975f5c5SAndroid Build Coastguard Worker
1378*8975f5c5SAndroid Build Coastguard Worker if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
1379*8975f5c5SAndroid Build Coastguard Worker return;
1380*8975f5c5SAndroid Build Coastguard Worker
1381*8975f5c5SAndroid Build Coastguard Worker multisampleTestHelper(mRGBAMultisampledFBO, mBGRAFBO);
1382*8975f5c5SAndroid Build Coastguard Worker }
1383*8975f5c5SAndroid Build Coastguard Worker
TEST_P(BlitFramebufferANGLETest,MultisampledBGRAToRGBA)1384*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, MultisampledBGRAToRGBA)
1385*8975f5c5SAndroid Build Coastguard Worker {
1386*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1387*8975f5c5SAndroid Build Coastguard Worker
1388*8975f5c5SAndroid Build Coastguard Worker if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
1389*8975f5c5SAndroid Build Coastguard Worker return;
1390*8975f5c5SAndroid Build Coastguard Worker
1391*8975f5c5SAndroid Build Coastguard Worker if (!checkExtension("GL_OES_rgb8_rgba8"))
1392*8975f5c5SAndroid Build Coastguard Worker return;
1393*8975f5c5SAndroid Build Coastguard Worker
1394*8975f5c5SAndroid Build Coastguard Worker if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
1395*8975f5c5SAndroid Build Coastguard Worker return;
1396*8975f5c5SAndroid Build Coastguard Worker
1397*8975f5c5SAndroid Build Coastguard Worker multisampleTestHelper(mBGRAMultisampledFBO, mRGBAFBO);
1398*8975f5c5SAndroid Build Coastguard Worker }
1399*8975f5c5SAndroid Build Coastguard Worker
TEST_P(BlitFramebufferANGLETest,MultisampledBGRAToBGRA)1400*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, MultisampledBGRAToBGRA)
1401*8975f5c5SAndroid Build Coastguard Worker {
1402*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1403*8975f5c5SAndroid Build Coastguard Worker
1404*8975f5c5SAndroid Build Coastguard Worker if (!checkExtension("GL_ANGLE_framebuffer_multisample"))
1405*8975f5c5SAndroid Build Coastguard Worker return;
1406*8975f5c5SAndroid Build Coastguard Worker
1407*8975f5c5SAndroid Build Coastguard Worker if (!checkExtension("GL_OES_rgb8_rgba8"))
1408*8975f5c5SAndroid Build Coastguard Worker return;
1409*8975f5c5SAndroid Build Coastguard Worker
1410*8975f5c5SAndroid Build Coastguard Worker if (!checkExtension("GL_EXT_texture_format_BGRA8888"))
1411*8975f5c5SAndroid Build Coastguard Worker return;
1412*8975f5c5SAndroid Build Coastguard Worker
1413*8975f5c5SAndroid Build Coastguard Worker multisampleTestHelper(mBGRAMultisampledFBO, mBGRAFBO);
1414*8975f5c5SAndroid Build Coastguard Worker }
1415*8975f5c5SAndroid Build Coastguard Worker
1416*8975f5c5SAndroid Build Coastguard Worker // Make sure that attempts to stretch in a blit call issue an error
TEST_P(BlitFramebufferANGLETest,ErrorStretching)1417*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, ErrorStretching)
1418*8975f5c5SAndroid Build Coastguard Worker {
1419*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1420*8975f5c5SAndroid Build Coastguard Worker
1421*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1422*8975f5c5SAndroid Build Coastguard Worker
1423*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1424*8975f5c5SAndroid Build Coastguard Worker
1425*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
1426*8975f5c5SAndroid Build Coastguard Worker
1427*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1428*8975f5c5SAndroid Build Coastguard Worker
1429*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1430*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1431*8975f5c5SAndroid Build Coastguard Worker
1432*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0,
1433*8975f5c5SAndroid Build Coastguard Worker getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
1434*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1435*8975f5c5SAndroid Build Coastguard Worker }
1436*8975f5c5SAndroid Build Coastguard Worker
1437*8975f5c5SAndroid Build Coastguard Worker // Make sure that attempts to flip in a blit call issue an error
TEST_P(BlitFramebufferANGLETest,ErrorFlipping)1438*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, ErrorFlipping)
1439*8975f5c5SAndroid Build Coastguard Worker {
1440*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1441*8975f5c5SAndroid Build Coastguard Worker
1442*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1443*8975f5c5SAndroid Build Coastguard Worker
1444*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1445*8975f5c5SAndroid Build Coastguard Worker
1446*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
1447*8975f5c5SAndroid Build Coastguard Worker
1448*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1449*8975f5c5SAndroid Build Coastguard Worker
1450*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1451*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1452*8975f5c5SAndroid Build Coastguard Worker
1453*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, getWindowWidth() / 2,
1454*8975f5c5SAndroid Build Coastguard Worker getWindowHeight() / 2, 0, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1455*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1456*8975f5c5SAndroid Build Coastguard Worker }
1457*8975f5c5SAndroid Build Coastguard Worker
TEST_P(BlitFramebufferANGLETest,Errors)1458*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferANGLETest, Errors)
1459*8975f5c5SAndroid Build Coastguard Worker {
1460*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
1461*8975f5c5SAndroid Build Coastguard Worker
1462*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO);
1463*8975f5c5SAndroid Build Coastguard Worker
1464*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1465*8975f5c5SAndroid Build Coastguard Worker
1466*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.5f);
1467*8975f5c5SAndroid Build Coastguard Worker
1468*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1469*8975f5c5SAndroid Build Coastguard Worker
1470*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO);
1471*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO);
1472*8975f5c5SAndroid Build Coastguard Worker
1473*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1474*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_LINEAR);
1475*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
1476*8975f5c5SAndroid Build Coastguard Worker
1477*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1478*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT | 234, GL_NEAREST);
1479*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
1480*8975f5c5SAndroid Build Coastguard Worker
1481*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mDiffFormatFBO);
1482*8975f5c5SAndroid Build Coastguard Worker
1483*8975f5c5SAndroid Build Coastguard Worker glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1484*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
1485*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1486*8975f5c5SAndroid Build Coastguard Worker }
1487*8975f5c5SAndroid Build Coastguard Worker
1488*8975f5c5SAndroid Build Coastguard Worker // TODO(geofflang): Fix the dependence on glBlitFramebufferANGLE without checks and assuming the
1489*8975f5c5SAndroid Build Coastguard Worker // default framebuffer is BGRA to enable the GL and GLES backends. (http://anglebug.com/42260299)
1490*8975f5c5SAndroid Build Coastguard Worker
1491*8975f5c5SAndroid Build Coastguard Worker class BlitFramebufferTest : public ANGLETest<>
1492*8975f5c5SAndroid Build Coastguard Worker {
1493*8975f5c5SAndroid Build Coastguard Worker protected:
BlitFramebufferTest()1494*8975f5c5SAndroid Build Coastguard Worker BlitFramebufferTest()
1495*8975f5c5SAndroid Build Coastguard Worker {
1496*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(256);
1497*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(256);
1498*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
1499*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
1500*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
1501*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
1502*8975f5c5SAndroid Build Coastguard Worker setConfigDepthBits(24);
1503*8975f5c5SAndroid Build Coastguard Worker setConfigStencilBits(8);
1504*8975f5c5SAndroid Build Coastguard Worker }
1505*8975f5c5SAndroid Build Coastguard Worker
initColorFBO(GLFramebuffer * fbo,GLRenderbuffer * rbo,GLenum rboFormat,GLsizei width,GLsizei height)1506*8975f5c5SAndroid Build Coastguard Worker void initColorFBO(GLFramebuffer *fbo,
1507*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer *rbo,
1508*8975f5c5SAndroid Build Coastguard Worker GLenum rboFormat,
1509*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1510*8975f5c5SAndroid Build Coastguard Worker GLsizei height)
1511*8975f5c5SAndroid Build Coastguard Worker {
1512*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, *rbo);
1513*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, rboFormat, width, height);
1514*8975f5c5SAndroid Build Coastguard Worker
1515*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, *fbo);
1516*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, *rbo);
1517*8975f5c5SAndroid Build Coastguard Worker }
1518*8975f5c5SAndroid Build Coastguard Worker
initColorFBOWithCheckerPattern(GLFramebuffer * fbo,GLRenderbuffer * rbo,GLenum rboFormat,GLsizei width,GLsizei height)1519*8975f5c5SAndroid Build Coastguard Worker void initColorFBOWithCheckerPattern(GLFramebuffer *fbo,
1520*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer *rbo,
1521*8975f5c5SAndroid Build Coastguard Worker GLenum rboFormat,
1522*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1523*8975f5c5SAndroid Build Coastguard Worker GLsizei height)
1524*8975f5c5SAndroid Build Coastguard Worker {
1525*8975f5c5SAndroid Build Coastguard Worker initColorFBO(fbo, rbo, rboFormat, width, height);
1526*8975f5c5SAndroid Build Coastguard Worker
1527*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(checkerProgram, essl1_shaders::vs::Passthrough(),
1528*8975f5c5SAndroid Build Coastguard Worker essl1_shaders::fs::Checkered());
1529*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, width, height);
1530*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, *fbo);
1531*8975f5c5SAndroid Build Coastguard Worker drawQuad(checkerProgram, essl1_shaders::PositionAttrib(), 0.5f);
1532*8975f5c5SAndroid Build Coastguard Worker }
1533*8975f5c5SAndroid Build Coastguard Worker
BlitDepthStencilPixelByPixelTestHelper(bool mesaYFlip)1534*8975f5c5SAndroid Build Coastguard Worker void BlitDepthStencilPixelByPixelTestHelper(bool mesaYFlip)
1535*8975f5c5SAndroid Build Coastguard Worker {
1536*8975f5c5SAndroid Build Coastguard Worker if (mesaYFlip)
1537*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
1538*8975f5c5SAndroid Build Coastguard Worker
1539*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1540*8975f5c5SAndroid Build Coastguard Worker
1541*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, 128, 1);
1542*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
1543*8975f5c5SAndroid Build Coastguard Worker
1544*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFramebuffer;
1545*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer srcRenderbuffer;
1546*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
1547*8975f5c5SAndroid Build Coastguard Worker if (mesaYFlip)
1548*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
1549*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, srcRenderbuffer);
1550*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 128, 1);
1551*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1552*8975f5c5SAndroid Build Coastguard Worker srcRenderbuffer);
1553*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(1.0f);
1554*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT);
1555*8975f5c5SAndroid Build Coastguard Worker
1556*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.0f, 0.5f);
1557*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, 256, 2);
1558*8975f5c5SAndroid Build Coastguard Worker
1559*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer dstFramebuffer;
1560*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer dstRenderbuffer;
1561*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFramebuffer);
1562*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, dstRenderbuffer);
1563*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 256, 2);
1564*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1565*8975f5c5SAndroid Build Coastguard Worker dstRenderbuffer);
1566*8975f5c5SAndroid Build Coastguard Worker
1567*8975f5c5SAndroid Build Coastguard Worker GLTexture dstColor;
1568*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, dstColor);
1569*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 2);
1570*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstColor, 0);
1571*8975f5c5SAndroid Build Coastguard Worker
1572*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
1573*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 128, 1, 0, 0, 256, 2, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
1574*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
1575*8975f5c5SAndroid Build Coastguard Worker
1576*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
1577*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1578*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1579*8975f5c5SAndroid Build Coastguard Worker glDepthMask(false);
1580*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
1581*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl1_shaders::PositionAttrib(), -0.01f, 0.5f);
1582*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(64, 0, 128, 1, GLColor::red);
1583*8975f5c5SAndroid Build Coastguard Worker
1584*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
1585*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
1586*8975f5c5SAndroid Build Coastguard Worker glDepthMask(false);
1587*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
1588*8975f5c5SAndroid Build Coastguard Worker if (mesaYFlip)
1589*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
1590*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawBlue, essl1_shaders::PositionAttrib(), 0.01f, 0.5f);
1591*8975f5c5SAndroid Build Coastguard Worker if (mesaYFlip)
1592*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(64, 0, 128, 1, GLColor::green);
1593*8975f5c5SAndroid Build Coastguard Worker else
1594*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(64, 0, 128, 1, GLColor::blue);
1595*8975f5c5SAndroid Build Coastguard Worker }
1596*8975f5c5SAndroid Build Coastguard Worker
1597*8975f5c5SAndroid Build Coastguard Worker // Test blitting between 3D textures and 2D array textures
test3DBlit(GLenum sourceTarget,GLenum destTarget)1598*8975f5c5SAndroid Build Coastguard Worker void test3DBlit(GLenum sourceTarget, GLenum destTarget)
1599*8975f5c5SAndroid Build Coastguard Worker {
1600*8975f5c5SAndroid Build Coastguard Worker
1601*8975f5c5SAndroid Build Coastguard Worker constexpr int kTexWidth = 4;
1602*8975f5c5SAndroid Build Coastguard Worker constexpr int kTexHeight = 3;
1603*8975f5c5SAndroid Build Coastguard Worker constexpr int kTexDepth = 2;
1604*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kTexWidth, kTexHeight);
1605*8975f5c5SAndroid Build Coastguard Worker
1606*8975f5c5SAndroid Build Coastguard Worker size_t size = kTexWidth * kTexHeight * kTexDepth;
1607*8975f5c5SAndroid Build Coastguard Worker std::vector<uint32_t> sourceData(size);
1608*8975f5c5SAndroid Build Coastguard Worker std::vector<uint32_t> destData(size);
1609*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < size; ++i)
1610*8975f5c5SAndroid Build Coastguard Worker {
1611*8975f5c5SAndroid Build Coastguard Worker sourceData[i] = i;
1612*8975f5c5SAndroid Build Coastguard Worker destData[i] = size - i;
1613*8975f5c5SAndroid Build Coastguard Worker }
1614*8975f5c5SAndroid Build Coastguard Worker
1615*8975f5c5SAndroid Build Coastguard Worker // Create a source 3D texture and FBO.
1616*8975f5c5SAndroid Build Coastguard Worker GLTexture sourceTexture;
1617*8975f5c5SAndroid Build Coastguard Worker glBindTexture(sourceTarget, sourceTexture);
1618*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(sourceTarget, 0, GL_RGBA8, kTexWidth, kTexHeight, kTexDepth, 0, GL_RGBA,
1619*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, sourceData.data());
1620*8975f5c5SAndroid Build Coastguard Worker
1621*8975f5c5SAndroid Build Coastguard Worker // Create a dest texture and FBO.
1622*8975f5c5SAndroid Build Coastguard Worker GLTexture destTexture;
1623*8975f5c5SAndroid Build Coastguard Worker glBindTexture(destTarget, destTexture);
1624*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(destTarget, 0, GL_RGBA8, kTexWidth, kTexHeight, kTexDepth, 0, GL_RGBA,
1625*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, destData.data());
1626*8975f5c5SAndroid Build Coastguard Worker
1627*8975f5c5SAndroid Build Coastguard Worker for (int z = 0; z < kTexDepth; ++z)
1628*8975f5c5SAndroid Build Coastguard Worker {
1629*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1630*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer sourceFBO;
1631*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
1632*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, sourceTexture, 0,
1633*8975f5c5SAndroid Build Coastguard Worker z);
1634*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1635*8975f5c5SAndroid Build Coastguard Worker
1636*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer destFBO;
1637*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, destFBO);
1638*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, destTexture, 0, z);
1639*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1640*8975f5c5SAndroid Build Coastguard Worker
1641*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kTexWidth, kTexHeight, 0, 0, kTexWidth, kTexHeight,
1642*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT, GL_NEAREST);
1643*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1644*8975f5c5SAndroid Build Coastguard Worker }
1645*8975f5c5SAndroid Build Coastguard Worker
1646*8975f5c5SAndroid Build Coastguard Worker for (int z = 0; z < kTexDepth; ++z)
1647*8975f5c5SAndroid Build Coastguard Worker {
1648*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer readFBO;
1649*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, readFBO);
1650*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, destTexture, 0, z);
1651*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1652*8975f5c5SAndroid Build Coastguard Worker
1653*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
1654*8975f5c5SAndroid Build Coastguard Worker for (int y = 0; y < kTexHeight; ++y)
1655*8975f5c5SAndroid Build Coastguard Worker {
1656*8975f5c5SAndroid Build Coastguard Worker for (int x = 0; x < kTexWidth; ++x)
1657*8975f5c5SAndroid Build Coastguard Worker {
1658*8975f5c5SAndroid Build Coastguard Worker int index = x + kTexWidth * (y + z * kTexHeight);
1659*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(x, y, index);
1660*8975f5c5SAndroid Build Coastguard Worker }
1661*8975f5c5SAndroid Build Coastguard Worker }
1662*8975f5c5SAndroid Build Coastguard Worker }
1663*8975f5c5SAndroid Build Coastguard Worker }
1664*8975f5c5SAndroid Build Coastguard Worker
initFBOWithProgramAndDepth(GLFramebuffer * fbo,GLRenderbuffer * colorRenderBuffer,GLenum colorFormat,GLRenderbuffer * depthRenderBuffer,GLenum depthFormat,GLsizei width,GLsizei height,GLuint program,float depthValue)1665*8975f5c5SAndroid Build Coastguard Worker void initFBOWithProgramAndDepth(GLFramebuffer *fbo,
1666*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer *colorRenderBuffer,
1667*8975f5c5SAndroid Build Coastguard Worker GLenum colorFormat,
1668*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer *depthRenderBuffer,
1669*8975f5c5SAndroid Build Coastguard Worker GLenum depthFormat,
1670*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1671*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
1672*8975f5c5SAndroid Build Coastguard Worker GLuint program,
1673*8975f5c5SAndroid Build Coastguard Worker float depthValue)
1674*8975f5c5SAndroid Build Coastguard Worker {
1675*8975f5c5SAndroid Build Coastguard Worker if (fbo != nullptr)
1676*8975f5c5SAndroid Build Coastguard Worker {
1677*8975f5c5SAndroid Build Coastguard Worker // Create renderbuffer
1678*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, *colorRenderBuffer);
1679*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, colorFormat, width, height);
1680*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, *depthRenderBuffer);
1681*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, depthFormat, width, height);
1682*8975f5c5SAndroid Build Coastguard Worker
1683*8975f5c5SAndroid Build Coastguard Worker // Create fbo
1684*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, *fbo);
1685*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
1686*8975f5c5SAndroid Build Coastguard Worker *colorRenderBuffer);
1687*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
1688*8975f5c5SAndroid Build Coastguard Worker *depthRenderBuffer);
1689*8975f5c5SAndroid Build Coastguard Worker }
1690*8975f5c5SAndroid Build Coastguard Worker else
1691*8975f5c5SAndroid Build Coastguard Worker {
1692*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
1693*8975f5c5SAndroid Build Coastguard Worker }
1694*8975f5c5SAndroid Build Coastguard Worker
1695*8975f5c5SAndroid Build Coastguard Worker // draw with program
1696*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
1697*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
1698*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(1.0f);
1699*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1700*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
1701*8975f5c5SAndroid Build Coastguard Worker glDepthMask(true);
1702*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), depthValue);
1703*8975f5c5SAndroid Build Coastguard Worker }
1704*8975f5c5SAndroid Build Coastguard Worker
drawWithDepthValue(std::array<Vector3,6> & quadVertices,float depth)1705*8975f5c5SAndroid Build Coastguard Worker void drawWithDepthValue(std::array<Vector3, 6> &quadVertices, float depth)
1706*8975f5c5SAndroid Build Coastguard Worker {
1707*8975f5c5SAndroid Build Coastguard Worker for (Vector3 &vertice : quadVertices)
1708*8975f5c5SAndroid Build Coastguard Worker {
1709*8975f5c5SAndroid Build Coastguard Worker vertice[2] = depth;
1710*8975f5c5SAndroid Build Coastguard Worker }
1711*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(quadVertices[0]) * quadVertices.size(),
1712*8975f5c5SAndroid Build Coastguard Worker quadVertices.data());
1713*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
1714*8975f5c5SAndroid Build Coastguard Worker }
1715*8975f5c5SAndroid Build Coastguard Worker };
1716*8975f5c5SAndroid Build Coastguard Worker
1717*8975f5c5SAndroid Build Coastguard Worker class BlitFramebufferTestES31 : public BlitFramebufferTest
1718*8975f5c5SAndroid Build Coastguard Worker {};
1719*8975f5c5SAndroid Build Coastguard Worker
1720*8975f5c5SAndroid Build Coastguard Worker // Tests resolving a multisample depth buffer.
TEST_P(BlitFramebufferTest,MultisampleDepth)1721*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, MultisampleDepth)
1722*8975f5c5SAndroid Build Coastguard Worker {
1723*8975f5c5SAndroid Build Coastguard Worker // TODO([email protected]): http://crbug.com/837717
1724*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && IsMac());
1725*8975f5c5SAndroid Build Coastguard Worker
1726*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuf;
1727*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
1728*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256);
1729*8975f5c5SAndroid Build Coastguard Worker
1730*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
1731*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1732*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuf);
1733*8975f5c5SAndroid Build Coastguard Worker
1734*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1735*8975f5c5SAndroid Build Coastguard Worker
1736*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.5f);
1737*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT);
1738*8975f5c5SAndroid Build Coastguard Worker
1739*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer destRenderbuf;
1740*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf);
1741*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 256, 256);
1742*8975f5c5SAndroid Build Coastguard Worker
1743*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer resolved;
1744*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved);
1745*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
1746*8975f5c5SAndroid Build Coastguard Worker destRenderbuf);
1747*8975f5c5SAndroid Build Coastguard Worker
1748*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
1749*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
1750*8975f5c5SAndroid Build Coastguard Worker
1751*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, resolved);
1752*8975f5c5SAndroid Build Coastguard Worker
1753*8975f5c5SAndroid Build Coastguard Worker // Immediately destroy the framebuffer and the associated textures for additional cleanup
1754*8975f5c5SAndroid Build Coastguard Worker // ordering testing.
1755*8975f5c5SAndroid Build Coastguard Worker framebuffer.reset();
1756*8975f5c5SAndroid Build Coastguard Worker renderbuf.reset();
1757*8975f5c5SAndroid Build Coastguard Worker
1758*8975f5c5SAndroid Build Coastguard Worker GLTexture colorbuf;
1759*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorbuf);
1760*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
1761*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorbuf, 0);
1762*8975f5c5SAndroid Build Coastguard Worker
1763*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1764*8975f5c5SAndroid Build Coastguard Worker
1765*8975f5c5SAndroid Build Coastguard Worker // Clear to green
1766*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1767*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1768*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1769*8975f5c5SAndroid Build Coastguard Worker
1770*8975f5c5SAndroid Build Coastguard Worker // Make sure resulting depth is near 0.5f.
1771*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1772*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
1773*8975f5c5SAndroid Build Coastguard Worker glDepthMask(false);
1774*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
1775*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), -0.01f);
1776*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1777*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(255, 0, GLColor::red);
1778*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 255, GLColor::red);
1779*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(255, 255, GLColor::red);
1780*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::red);
1781*8975f5c5SAndroid Build Coastguard Worker
1782*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
1783*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
1784*8975f5c5SAndroid Build Coastguard Worker glDepthMask(false);
1785*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
1786*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawBlue, essl3_shaders::PositionAttrib(), 0.01f);
1787*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1788*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(255, 0, GLColor::blue);
1789*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 255, GLColor::blue);
1790*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(255, 255, GLColor::blue);
1791*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::blue);
1792*8975f5c5SAndroid Build Coastguard Worker
1793*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1794*8975f5c5SAndroid Build Coastguard Worker }
1795*8975f5c5SAndroid Build Coastguard Worker
1796*8975f5c5SAndroid Build Coastguard Worker // Blit multisample stencil buffer to default framebuffer without prerotaion.
TEST_P(BlitFramebufferTest,BlitMultisampleStencilToDefault)1797*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, BlitMultisampleStencilToDefault)
1798*8975f5c5SAndroid Build Coastguard Worker {
1799*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42262159
1800*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsMac());
1801*8975f5c5SAndroid Build Coastguard Worker
1802*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
1803*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1804*8975f5c5SAndroid Build Coastguard Worker
1805*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer colorbuf;
1806*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, colorbuf);
1807*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 128, 128);
1808*8975f5c5SAndroid Build Coastguard Worker
1809*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthstencilbuf;
1810*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthstencilbuf);
1811*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, 128, 128);
1812*8975f5c5SAndroid Build Coastguard Worker
1813*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
1814*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1815*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorbuf);
1816*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
1817*8975f5c5SAndroid Build Coastguard Worker depthstencilbuf);
1818*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1819*8975f5c5SAndroid Build Coastguard Worker depthstencilbuf);
1820*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER);
1821*8975f5c5SAndroid Build Coastguard Worker
1822*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1823*8975f5c5SAndroid Build Coastguard Worker glFlush();
1824*8975f5c5SAndroid Build Coastguard Worker
1825*8975f5c5SAndroid Build Coastguard Worker // Replace stencil to 1.
1826*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1827*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
1828*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1829*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 1, 255);
1830*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.8f);
1831*8975f5c5SAndroid Build Coastguard Worker
1832*8975f5c5SAndroid Build Coastguard Worker // Blit multisample stencil buffer to default frambuffer.
1833*8975f5c5SAndroid Build Coastguard Worker GLenum attachments1[] = {GL_COLOR_ATTACHMENT0};
1834*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments1);
1835*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
1836*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 128, 128, 0, 0, 128, 128, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
1837*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
1838*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
1839*8975f5c5SAndroid Build Coastguard Worker
1840*8975f5c5SAndroid Build Coastguard Worker // Disable stencil and draw full_screen green color.
1841*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawGreen, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
1842*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_STENCIL_TEST);
1843*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawGreen, essl3_shaders::PositionAttrib(), 0.5f);
1844*8975f5c5SAndroid Build Coastguard Worker
1845*8975f5c5SAndroid Build Coastguard Worker // Draw blue color if the stencil is equal to 1.
1846*8975f5c5SAndroid Build Coastguard Worker // If the blit finished successfully, the stencil test should all pass.
1847*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
1848*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
1849*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 1, 255);
1850*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawBlue, essl3_shaders::PositionAttrib(), 0.2f);
1851*8975f5c5SAndroid Build Coastguard Worker
1852*8975f5c5SAndroid Build Coastguard Worker // Check the result, especially the boundaries.
1853*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1854*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(127, 0, GLColor::blue);
1855*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(50, 0, GLColor::blue);
1856*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(127, 1, GLColor::blue);
1857*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 127, GLColor::blue);
1858*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::blue);
1859*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(64, 64, GLColor::blue);
1860*8975f5c5SAndroid Build Coastguard Worker
1861*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1862*8975f5c5SAndroid Build Coastguard Worker }
1863*8975f5c5SAndroid Build Coastguard Worker
1864*8975f5c5SAndroid Build Coastguard Worker // Test blit multisampled framebuffer to MRT framebuffer
TEST_P(BlitFramebufferTest,BlitMultisampledFramebufferToMRT)1865*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, BlitMultisampledFramebufferToMRT)
1866*8975f5c5SAndroid Build Coastguard Worker {
1867*8975f5c5SAndroid Build Coastguard Worker // https://issues.angleproject.org/issues/361369302
1868*8975f5c5SAndroid Build Coastguard Worker
1869*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
1870*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1871*8975f5c5SAndroid Build Coastguard Worker
1872*8975f5c5SAndroid Build Coastguard Worker // Prepare multisampled framebuffer to blit from.
1873*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer multiSampleColorbuf;
1874*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, multiSampleColorbuf);
1875*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, getWindowWidth(),
1876*8975f5c5SAndroid Build Coastguard Worker getWindowHeight());
1877*8975f5c5SAndroid Build Coastguard Worker
1878*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer multiSampleFramebuffer;
1879*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, multiSampleFramebuffer);
1880*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
1881*8975f5c5SAndroid Build Coastguard Worker multiSampleColorbuf);
1882*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER);
1883*8975f5c5SAndroid Build Coastguard Worker
1884*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1885*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.8f);
1886*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1887*8975f5c5SAndroid Build Coastguard Worker
1888*8975f5c5SAndroid Build Coastguard Worker // Prepare mrt framebuffer with two attachments to blit to.
1889*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer MRTFBO;
1890*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, MRTFBO);
1891*8975f5c5SAndroid Build Coastguard Worker GLTexture MRTColorBuffer0;
1892*8975f5c5SAndroid Build Coastguard Worker GLTexture MRTColorBuffer1;
1893*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, MRTColorBuffer0);
1894*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
1895*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
1896*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, MRTColorBuffer0, 0);
1897*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, MRTColorBuffer1);
1898*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
1899*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
1900*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, MRTColorBuffer1, 0);
1901*8975f5c5SAndroid Build Coastguard Worker
1902*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, multiSampleFramebuffer);
1903*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, MRTFBO);
1904*8975f5c5SAndroid Build Coastguard Worker
1905*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
1906*8975f5c5SAndroid Build Coastguard Worker GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
1907*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, drawBuffers);
1908*8975f5c5SAndroid Build Coastguard Worker
1909*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
1910*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
1911*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1912*8975f5c5SAndroid Build Coastguard Worker
1913*8975f5c5SAndroid Build Coastguard Worker // Check results
1914*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, MRTFBO);
1915*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
1916*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::red);
1917*8975f5c5SAndroid Build Coastguard Worker
1918*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT1);
1919*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::red);
1920*8975f5c5SAndroid Build Coastguard Worker }
1921*8975f5c5SAndroid Build Coastguard Worker
1922*8975f5c5SAndroid Build Coastguard Worker // Tests clearing a multisampled depth buffer.
TEST_P(BlitFramebufferTest,MultisampleDepthClear)1923*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, MultisampleDepthClear)
1924*8975f5c5SAndroid Build Coastguard Worker {
1925*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40096654
1926*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
1927*8975f5c5SAndroid Build Coastguard Worker
1928*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthMS;
1929*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthMS);
1930*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256);
1931*8975f5c5SAndroid Build Coastguard Worker
1932*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer colorMS;
1933*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, colorMS);
1934*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_RGBA8, 256, 256);
1935*8975f5c5SAndroid Build Coastguard Worker
1936*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer colorResolved;
1937*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, colorResolved);
1938*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 256, 256);
1939*8975f5c5SAndroid Build Coastguard Worker
1940*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebufferMS;
1941*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebufferMS);
1942*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthMS);
1943*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorMS);
1944*8975f5c5SAndroid Build Coastguard Worker
1945*8975f5c5SAndroid Build Coastguard Worker // Clear depth buffer to 0.5 and color to green.
1946*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.5f);
1947*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1948*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
1949*8975f5c5SAndroid Build Coastguard Worker
1950*8975f5c5SAndroid Build Coastguard Worker glFlush();
1951*8975f5c5SAndroid Build Coastguard Worker
1952*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
1953*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
1954*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
1955*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_EQUAL);
1956*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.0f);
1957*8975f5c5SAndroid Build Coastguard Worker
1958*8975f5c5SAndroid Build Coastguard Worker // Resolve the color buffer to make sure the above draw worked correctly, which in turn implies
1959*8975f5c5SAndroid Build Coastguard Worker // that the multisampled depth clear worked.
1960*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebufferResolved;
1961*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebufferResolved);
1962*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorResolved);
1963*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, framebufferMS);
1964*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1965*8975f5c5SAndroid Build Coastguard Worker
1966*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebufferResolved);
1967*8975f5c5SAndroid Build Coastguard Worker
1968*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1969*8975f5c5SAndroid Build Coastguard Worker
1970*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1971*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(255, 0, GLColor::red);
1972*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 255, GLColor::red);
1973*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(255, 255, GLColor::red);
1974*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::red);
1975*8975f5c5SAndroid Build Coastguard Worker
1976*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1977*8975f5c5SAndroid Build Coastguard Worker }
1978*8975f5c5SAndroid Build Coastguard Worker
1979*8975f5c5SAndroid Build Coastguard Worker // Tests clearing a multisampled depth buffer with a glFenceSync in between.
TEST_P(BlitFramebufferTest,MultisampleDepthClearWithFenceSync)1980*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, MultisampleDepthClearWithFenceSync)
1981*8975f5c5SAndroid Build Coastguard Worker {
1982*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40096654
1983*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
1984*8975f5c5SAndroid Build Coastguard Worker
1985*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthMS;
1986*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthMS);
1987*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256);
1988*8975f5c5SAndroid Build Coastguard Worker
1989*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer colorMS;
1990*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, colorMS);
1991*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_RGBA8, 256, 256);
1992*8975f5c5SAndroid Build Coastguard Worker
1993*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer colorResolved;
1994*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, colorResolved);
1995*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 256, 256);
1996*8975f5c5SAndroid Build Coastguard Worker
1997*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebufferMS;
1998*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebufferMS);
1999*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthMS);
2000*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorMS);
2001*8975f5c5SAndroid Build Coastguard Worker
2002*8975f5c5SAndroid Build Coastguard Worker // Clear depth buffer to 0.5 and color to green.
2003*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.5f);
2004*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2005*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
2006*8975f5c5SAndroid Build Coastguard Worker
2007*8975f5c5SAndroid Build Coastguard Worker glFlush();
2008*8975f5c5SAndroid Build Coastguard Worker
2009*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
2010*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
2011*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
2012*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_EQUAL);
2013*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.0f);
2014*8975f5c5SAndroid Build Coastguard Worker
2015*8975f5c5SAndroid Build Coastguard Worker // This should trigger a deferred renderPass end
2016*8975f5c5SAndroid Build Coastguard Worker GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
2017*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2018*8975f5c5SAndroid Build Coastguard Worker
2019*8975f5c5SAndroid Build Coastguard Worker // Resolve the color buffer to make sure the above draw worked correctly, which in turn implies
2020*8975f5c5SAndroid Build Coastguard Worker // that the multisampled depth clear worked.
2021*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebufferResolved;
2022*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebufferResolved);
2023*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorResolved);
2024*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, framebufferMS);
2025*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2026*8975f5c5SAndroid Build Coastguard Worker
2027*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebufferResolved);
2028*8975f5c5SAndroid Build Coastguard Worker
2029*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2030*8975f5c5SAndroid Build Coastguard Worker
2031*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2032*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(255, 0, GLColor::red);
2033*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 255, GLColor::red);
2034*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(255, 255, GLColor::red);
2035*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::red);
2036*8975f5c5SAndroid Build Coastguard Worker
2037*8975f5c5SAndroid Build Coastguard Worker glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED);
2038*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2039*8975f5c5SAndroid Build Coastguard Worker }
2040*8975f5c5SAndroid Build Coastguard Worker
2041*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled stencil buffer.
TEST_P(BlitFramebufferTest,MultisampleStencil)2042*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, MultisampleStencil)
2043*8975f5c5SAndroid Build Coastguard Worker {
2044*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuf;
2045*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
2046*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_STENCIL_INDEX8, 256, 256);
2047*8975f5c5SAndroid Build Coastguard Worker
2048*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
2049*8975f5c5SAndroid Build Coastguard Worker
2050*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
2051*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
2052*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuf);
2053*8975f5c5SAndroid Build Coastguard Worker
2054*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2055*8975f5c5SAndroid Build Coastguard Worker
2056*8975f5c5SAndroid Build Coastguard Worker // fill the stencil buffer with 0x1
2057*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
2058*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2059*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2060*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2061*8975f5c5SAndroid Build Coastguard Worker
2062*8975f5c5SAndroid Build Coastguard Worker GLTexture destColorbuf;
2063*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destColorbuf);
2064*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
2065*8975f5c5SAndroid Build Coastguard Worker
2066*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer destRenderbuf;
2067*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf);
2068*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 256, 256);
2069*8975f5c5SAndroid Build Coastguard Worker
2070*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer resolved;
2071*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved);
2072*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destColorbuf,
2073*8975f5c5SAndroid Build Coastguard Worker 0);
2074*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2075*8975f5c5SAndroid Build Coastguard Worker destRenderbuf);
2076*8975f5c5SAndroid Build Coastguard Worker
2077*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
2078*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2079*8975f5c5SAndroid Build Coastguard Worker
2080*8975f5c5SAndroid Build Coastguard Worker // Immediately destroy the framebuffer and the associated textures for additional cleanup
2081*8975f5c5SAndroid Build Coastguard Worker // ordering testing.
2082*8975f5c5SAndroid Build Coastguard Worker framebuffer.reset();
2083*8975f5c5SAndroid Build Coastguard Worker renderbuf.reset();
2084*8975f5c5SAndroid Build Coastguard Worker
2085*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, resolved);
2086*8975f5c5SAndroid Build Coastguard Worker
2087*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2088*8975f5c5SAndroid Build Coastguard Worker
2089*8975f5c5SAndroid Build Coastguard Worker // Clear to green
2090*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2091*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2092*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2093*8975f5c5SAndroid Build Coastguard Worker
2094*8975f5c5SAndroid Build Coastguard Worker // Draw red if the stencil is 0x1, which should be true after the resolve.
2095*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x1, 0xFF);
2096*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2097*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2098*8975f5c5SAndroid Build Coastguard Worker
2099*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2100*8975f5c5SAndroid Build Coastguard Worker }
2101*8975f5c5SAndroid Build Coastguard Worker
2102*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled stencil buffer with scissor.
TEST_P(BlitFramebufferTest,ScissoredMultisampleStencil)2103*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, ScissoredMultisampleStencil)
2104*8975f5c5SAndroid Build Coastguard Worker {
2105*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint kSize = 256;
2106*8975f5c5SAndroid Build Coastguard Worker
2107*8975f5c5SAndroid Build Coastguard Worker // Create the resolve framebuffer.
2108*8975f5c5SAndroid Build Coastguard Worker GLTexture destColorbuf;
2109*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destColorbuf);
2110*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
2111*8975f5c5SAndroid Build Coastguard Worker
2112*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer destRenderbuf;
2113*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf);
2114*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, kSize, kSize);
2115*8975f5c5SAndroid Build Coastguard Worker
2116*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer resolved;
2117*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, resolved);
2118*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destColorbuf,
2119*8975f5c5SAndroid Build Coastguard Worker 0);
2120*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2121*8975f5c5SAndroid Build Coastguard Worker destRenderbuf);
2122*8975f5c5SAndroid Build Coastguard Worker
2123*8975f5c5SAndroid Build Coastguard Worker // Clear the resolved buffer with gray and 0x10 stencil.
2124*8975f5c5SAndroid Build Coastguard Worker GLColor gray(127, 127, 127, 255);
2125*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x10);
2126*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.499f, 0.499f, 0.499f, 1.0f);
2127*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2128*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
2129*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, gray);
2130*8975f5c5SAndroid Build Coastguard Worker
2131*8975f5c5SAndroid Build Coastguard Worker // Create the multisampled framebuffer.
2132*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuf;
2133*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
2134*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_STENCIL_INDEX8, kSize, kSize);
2135*8975f5c5SAndroid Build Coastguard Worker
2136*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
2137*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawGreen, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
2138*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
2139*8975f5c5SAndroid Build Coastguard Worker
2140*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
2141*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
2142*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuf);
2143*8975f5c5SAndroid Build Coastguard Worker
2144*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2145*8975f5c5SAndroid Build Coastguard Worker
2146*8975f5c5SAndroid Build Coastguard Worker // Fill the stencil buffer with 0x1.
2147*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x1);
2148*8975f5c5SAndroid Build Coastguard Worker glClear(GL_STENCIL_BUFFER_BIT);
2149*8975f5c5SAndroid Build Coastguard Worker
2150*8975f5c5SAndroid Build Coastguard Worker // Fill a smaller region of the buffer with 0x2.
2151*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
2152*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2153*8975f5c5SAndroid Build Coastguard Worker glScissor(kSize / 4, kSize / 4, kSize / 2, kSize / 2);
2154*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x2, 0xFF);
2155*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2156*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2157*8975f5c5SAndroid Build Coastguard Worker
2158*8975f5c5SAndroid Build Coastguard Worker // Blit into the resolved framebuffer (with scissor still enabled).
2159*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved);
2160*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2161*8975f5c5SAndroid Build Coastguard Worker
2162*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, resolved);
2163*8975f5c5SAndroid Build Coastguard Worker
2164*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2165*8975f5c5SAndroid Build Coastguard Worker
2166*8975f5c5SAndroid Build Coastguard Worker // Draw blue if the stencil is 0x1, which should never be true.
2167*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
2168*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0);
2169*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x1, 0xFF);
2170*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawBlue, essl3_shaders::PositionAttrib(), 0.5f);
2171*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
2172*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, gray);
2173*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, gray);
2174*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, gray);
2175*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, gray);
2176*8975f5c5SAndroid Build Coastguard Worker
2177*8975f5c5SAndroid Build Coastguard Worker // Draw red if the stencil is 0x2, which should be true in the middle after the blit/resolve.
2178*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x2, 0xFF);
2179*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2180*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
2181*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, gray);
2182*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, gray);
2183*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, gray);
2184*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
2185*8975f5c5SAndroid Build Coastguard Worker
2186*8975f5c5SAndroid Build Coastguard Worker // Draw green if the stencil is 0x10, which should be left untouched in the outer regions.
2187*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x10, 0xFF);
2188*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawGreen, essl3_shaders::PositionAttrib(), 0.5f);
2189*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2190*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
2191*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
2192*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
2193*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
2194*8975f5c5SAndroid Build Coastguard Worker
2195*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2196*8975f5c5SAndroid Build Coastguard Worker }
2197*8975f5c5SAndroid Build Coastguard Worker
2198*8975f5c5SAndroid Build Coastguard Worker // Test blitting from a texture with non-zero base. The blit is non-stretching and between
2199*8975f5c5SAndroid Build Coastguard Worker // identical formats so that the path that uses vkCmdBlitImage is taken.
TEST_P(BlitFramebufferTest,NonZeroBaseSource)2200*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, NonZeroBaseSource)
2201*8975f5c5SAndroid Build Coastguard Worker {
2202*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40644751
2203*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsMac());
2204*8975f5c5SAndroid Build Coastguard Worker
2205*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
2206*8975f5c5SAndroid Build Coastguard Worker
2207*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer for source data. It usea a non-zero base.
2208*8975f5c5SAndroid Build Coastguard Worker GLTexture srcColor;
2209*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, srcColor);
2210*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2211*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2212*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2213*8975f5c5SAndroid Build Coastguard Worker
2214*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFramebuffer;
2215*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
2216*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcColor, 1);
2217*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2218*8975f5c5SAndroid Build Coastguard Worker
2219*8975f5c5SAndroid Build Coastguard Worker // fill the color buffer with red.
2220*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2221*8975f5c5SAndroid Build Coastguard Worker
2222*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer for blit destination.
2223*8975f5c5SAndroid Build Coastguard Worker GLTexture dstColor;
2224*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, dstColor);
2225*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2226*8975f5c5SAndroid Build Coastguard Worker
2227*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer dstFramebuffer;
2228*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
2229*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstColor, 0);
2230*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2231*8975f5c5SAndroid Build Coastguard Worker
2232*8975f5c5SAndroid Build Coastguard Worker // Blit. Note: no stretching is done so that vkCmdBlitImage can be used.
2233*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
2234*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2235*8975f5c5SAndroid Build Coastguard Worker
2236*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
2237*8975f5c5SAndroid Build Coastguard Worker
2238*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2239*8975f5c5SAndroid Build Coastguard Worker
2240*8975f5c5SAndroid Build Coastguard Worker // Make sure the blit is done.
2241*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2242*8975f5c5SAndroid Build Coastguard Worker
2243*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2244*8975f5c5SAndroid Build Coastguard Worker }
2245*8975f5c5SAndroid Build Coastguard Worker
2246*8975f5c5SAndroid Build Coastguard Worker // Test blitting to a texture with non-zero base. The blit is non-stretching and between
2247*8975f5c5SAndroid Build Coastguard Worker // identical formats so that the path that uses vkCmdBlitImage is taken.
TEST_P(BlitFramebufferTest,NonZeroBaseDestination)2248*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, NonZeroBaseDestination)
2249*8975f5c5SAndroid Build Coastguard Worker {
2250*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
2251*8975f5c5SAndroid Build Coastguard Worker
2252*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer for source data. It usea a non-zero base.
2253*8975f5c5SAndroid Build Coastguard Worker GLTexture srcColor;
2254*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, srcColor);
2255*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2256*8975f5c5SAndroid Build Coastguard Worker
2257*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFramebuffer;
2258*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
2259*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcColor, 0);
2260*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2261*8975f5c5SAndroid Build Coastguard Worker
2262*8975f5c5SAndroid Build Coastguard Worker // fill the color buffer with red.
2263*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2264*8975f5c5SAndroid Build Coastguard Worker
2265*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer for blit destination.
2266*8975f5c5SAndroid Build Coastguard Worker GLTexture dstColor;
2267*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, dstColor);
2268*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2269*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2270*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2271*8975f5c5SAndroid Build Coastguard Worker
2272*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer dstFramebuffer;
2273*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
2274*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstColor, 1);
2275*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2276*8975f5c5SAndroid Build Coastguard Worker
2277*8975f5c5SAndroid Build Coastguard Worker // Blit. Note: no stretching is done so that vkCmdBlitImage can be used.
2278*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
2279*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2280*8975f5c5SAndroid Build Coastguard Worker
2281*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
2282*8975f5c5SAndroid Build Coastguard Worker
2283*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2284*8975f5c5SAndroid Build Coastguard Worker
2285*8975f5c5SAndroid Build Coastguard Worker // Make sure the blit is done.
2286*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2287*8975f5c5SAndroid Build Coastguard Worker
2288*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2289*8975f5c5SAndroid Build Coastguard Worker }
2290*8975f5c5SAndroid Build Coastguard Worker
2291*8975f5c5SAndroid Build Coastguard Worker // Test blitting from a stencil buffer with non-zero base.
TEST_P(BlitFramebufferTest,NonZeroBaseSourceStencil)2292*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, NonZeroBaseSourceStencil)
2293*8975f5c5SAndroid Build Coastguard Worker {
2294*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40644751
2295*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsMac());
2296*8975f5c5SAndroid Build Coastguard Worker
2297*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
2298*8975f5c5SAndroid Build Coastguard Worker
2299*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer with an attachment that has non-zero base
2300*8975f5c5SAndroid Build Coastguard Worker GLTexture stencilTexture;
2301*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, stencilTexture);
2302*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
2303*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_INT_24_8, nullptr);
2304*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
2305*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_INT_24_8, nullptr);
2306*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2307*8975f5c5SAndroid Build Coastguard Worker
2308*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFramebuffer;
2309*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
2310*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, stencilTexture, 1);
2311*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2312*8975f5c5SAndroid Build Coastguard Worker
2313*8975f5c5SAndroid Build Coastguard Worker // fill the stencil buffer with 0x1
2314*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
2315*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2316*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2317*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2318*8975f5c5SAndroid Build Coastguard Worker
2319*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer with an attachment that has non-zero base
2320*8975f5c5SAndroid Build Coastguard Worker GLTexture colorTexture;
2321*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorTexture);
2322*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
2323*8975f5c5SAndroid Build Coastguard Worker
2324*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuf;
2325*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
2326*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 256, 256);
2327*8975f5c5SAndroid Build Coastguard Worker
2328*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer dstFramebuffer;
2329*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
2330*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
2331*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuf);
2332*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2333*8975f5c5SAndroid Build Coastguard Worker
2334*8975f5c5SAndroid Build Coastguard Worker // Blit stencil.
2335*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
2336*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2337*8975f5c5SAndroid Build Coastguard Worker
2338*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
2339*8975f5c5SAndroid Build Coastguard Worker
2340*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2341*8975f5c5SAndroid Build Coastguard Worker
2342*8975f5c5SAndroid Build Coastguard Worker // Clear to green
2343*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2344*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2345*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2346*8975f5c5SAndroid Build Coastguard Worker
2347*8975f5c5SAndroid Build Coastguard Worker // Draw red if the stencil is 0x1, which should be true after the blit.
2348*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x1, 0xFF);
2349*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2350*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2351*8975f5c5SAndroid Build Coastguard Worker
2352*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2353*8975f5c5SAndroid Build Coastguard Worker }
2354*8975f5c5SAndroid Build Coastguard Worker
2355*8975f5c5SAndroid Build Coastguard Worker // Test blitting to a stencil buffer with non-zero base.
TEST_P(BlitFramebufferTest,NonZeroBaseDestinationStencil)2356*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, NonZeroBaseDestinationStencil)
2357*8975f5c5SAndroid Build Coastguard Worker {
2358*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40644751
2359*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsMac());
2360*8975f5c5SAndroid Build Coastguard Worker
2361*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263576
2362*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsWindows());
2363*8975f5c5SAndroid Build Coastguard Worker
2364*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
2365*8975f5c5SAndroid Build Coastguard Worker
2366*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer for source data.
2367*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuf;
2368*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
2369*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 256, 256);
2370*8975f5c5SAndroid Build Coastguard Worker
2371*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFramebuffer;
2372*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
2373*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuf);
2374*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2375*8975f5c5SAndroid Build Coastguard Worker
2376*8975f5c5SAndroid Build Coastguard Worker // fill the stencil buffer with 0x1
2377*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
2378*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2379*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2380*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2381*8975f5c5SAndroid Build Coastguard Worker
2382*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer with an attachment that has non-zero base
2383*8975f5c5SAndroid Build Coastguard Worker GLTexture colorTexture;
2384*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorTexture);
2385*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
2386*8975f5c5SAndroid Build Coastguard Worker
2387*8975f5c5SAndroid Build Coastguard Worker GLTexture stencilTexture;
2388*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, stencilTexture);
2389*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
2390*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_INT_24_8, nullptr);
2391*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
2392*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_INT_24_8, nullptr);
2393*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2394*8975f5c5SAndroid Build Coastguard Worker
2395*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer dstFramebuffer;
2396*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
2397*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
2398*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, stencilTexture, 1);
2399*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2400*8975f5c5SAndroid Build Coastguard Worker
2401*8975f5c5SAndroid Build Coastguard Worker // Blit stencil.
2402*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
2403*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2404*8975f5c5SAndroid Build Coastguard Worker
2405*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
2406*8975f5c5SAndroid Build Coastguard Worker
2407*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2408*8975f5c5SAndroid Build Coastguard Worker
2409*8975f5c5SAndroid Build Coastguard Worker // Clear to green
2410*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2411*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2412*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2413*8975f5c5SAndroid Build Coastguard Worker
2414*8975f5c5SAndroid Build Coastguard Worker // Draw red if the stencil is 0x1, which should be true after the blit.
2415*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x1, 0xFF);
2416*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2417*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2418*8975f5c5SAndroid Build Coastguard Worker
2419*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2420*8975f5c5SAndroid Build Coastguard Worker }
2421*8975f5c5SAndroid Build Coastguard Worker
2422*8975f5c5SAndroid Build Coastguard Worker // Test blitting to a stencil buffer with non-zero base. Exercises the compute path in the Vulkan
2423*8975f5c5SAndroid Build Coastguard Worker // backend if stencil export is not supported. The blit is not 1-to-1 for this path to be taken.
TEST_P(BlitFramebufferTest,NonZeroBaseDestinationStencilStretch)2424*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, NonZeroBaseDestinationStencilStretch)
2425*8975f5c5SAndroid Build Coastguard Worker {
2426*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40644750
2427*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsWindows());
2428*8975f5c5SAndroid Build Coastguard Worker
2429*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40644751
2430*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsMac());
2431*8975f5c5SAndroid Build Coastguard Worker
2432*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
2433*8975f5c5SAndroid Build Coastguard Worker
2434*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer for source data.
2435*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuf;
2436*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
2437*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 256, 256);
2438*8975f5c5SAndroid Build Coastguard Worker
2439*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFramebuffer;
2440*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer);
2441*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuf);
2442*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2443*8975f5c5SAndroid Build Coastguard Worker
2444*8975f5c5SAndroid Build Coastguard Worker // fill the stencil buffer with 0x1
2445*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x1, 0xFF);
2446*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2447*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2448*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2449*8975f5c5SAndroid Build Coastguard Worker
2450*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer with an attachment that has non-zero base
2451*8975f5c5SAndroid Build Coastguard Worker GLTexture colorTexture;
2452*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorTexture);
2453*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256);
2454*8975f5c5SAndroid Build Coastguard Worker
2455*8975f5c5SAndroid Build Coastguard Worker GLTexture stencilTexture;
2456*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, stencilTexture);
2457*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
2458*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_INT_24_8, nullptr);
2459*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, 256, 256, 0, GL_DEPTH_STENCIL,
2460*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_INT_24_8, nullptr);
2461*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2462*8975f5c5SAndroid Build Coastguard Worker
2463*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer dstFramebuffer;
2464*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
2465*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
2466*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, stencilTexture, 1);
2467*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2468*8975f5c5SAndroid Build Coastguard Worker
2469*8975f5c5SAndroid Build Coastguard Worker // Blit stencil. Note: stretch is intentional so vkCmdBlitImage cannot be used in the Vulkan
2470*8975f5c5SAndroid Build Coastguard Worker // backend.
2471*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer);
2472*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 256, 256, -256, -256, 512, 512, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2473*8975f5c5SAndroid Build Coastguard Worker
2474*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer);
2475*8975f5c5SAndroid Build Coastguard Worker
2476*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2477*8975f5c5SAndroid Build Coastguard Worker
2478*8975f5c5SAndroid Build Coastguard Worker // Clear to green
2479*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2480*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2481*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2482*8975f5c5SAndroid Build Coastguard Worker
2483*8975f5c5SAndroid Build Coastguard Worker // Draw red if the stencil is 0x1, which should be true after the blit.
2484*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x1, 0xFF);
2485*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2486*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2487*8975f5c5SAndroid Build Coastguard Worker
2488*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2489*8975f5c5SAndroid Build Coastguard Worker }
2490*8975f5c5SAndroid Build Coastguard Worker
2491*8975f5c5SAndroid Build Coastguard Worker // Blit an SRGB framebuffer and scale it.
TEST_P(BlitFramebufferTest,BlitSRGBToRGBAndScale)2492*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, BlitSRGBToRGBAndScale)
2493*8975f5c5SAndroid Build Coastguard Worker {
2494*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kWidth = 256;
2495*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kHeight = 256;
2496*8975f5c5SAndroid Build Coastguard Worker
2497*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer sourceRBO, targetRBO;
2498*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer sourceFBO, targetFBO;
2499*8975f5c5SAndroid Build Coastguard Worker initColorFBOWithCheckerPattern(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth * 2,
2500*8975f5c5SAndroid Build Coastguard Worker kHeight * 2);
2501*8975f5c5SAndroid Build Coastguard Worker initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
2502*8975f5c5SAndroid Build Coastguard Worker
2503*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2504*8975f5c5SAndroid Build Coastguard Worker
2505*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2506*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2507*8975f5c5SAndroid Build Coastguard Worker
2508*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kWidth, kHeight);
2509*8975f5c5SAndroid Build Coastguard Worker
2510*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
2511*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2512*8975f5c5SAndroid Build Coastguard Worker
2513*8975f5c5SAndroid Build Coastguard Worker // Scale down without flipping.
2514*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kWidth * 2, kHeight * 2, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
2515*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
2516*8975f5c5SAndroid Build Coastguard Worker
2517*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2518*8975f5c5SAndroid Build Coastguard Worker
2519*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2520*8975f5c5SAndroid Build Coastguard Worker
2521*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::red);
2522*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::green);
2523*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::blue);
2524*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::yellow);
2525*8975f5c5SAndroid Build Coastguard Worker
2526*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2527*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2528*8975f5c5SAndroid Build Coastguard Worker
2529*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
2530*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2531*8975f5c5SAndroid Build Coastguard Worker
2532*8975f5c5SAndroid Build Coastguard Worker // Scale down and flip in the X direction.
2533*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kWidth * 2, kHeight * 2, kWidth, 0, 0, kHeight, GL_COLOR_BUFFER_BIT,
2534*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
2535*8975f5c5SAndroid Build Coastguard Worker
2536*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2537*8975f5c5SAndroid Build Coastguard Worker
2538*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2539*8975f5c5SAndroid Build Coastguard Worker
2540*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::blue);
2541*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::yellow);
2542*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::red);
2543*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::green);
2544*8975f5c5SAndroid Build Coastguard Worker }
2545*8975f5c5SAndroid Build Coastguard Worker
2546*8975f5c5SAndroid Build Coastguard Worker // Blit stencil, with scissor and scale it.
TEST_P(BlitFramebufferTest,BlitStencilScissoredScaled)2547*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, BlitStencilScissoredScaled)
2548*8975f5c5SAndroid Build Coastguard Worker {
2549*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kSize = 256;
2550*8975f5c5SAndroid Build Coastguard Worker
2551*8975f5c5SAndroid Build Coastguard Worker // Create the destination framebuffer.
2552*8975f5c5SAndroid Build Coastguard Worker GLTexture destColorbuf;
2553*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destColorbuf);
2554*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
2555*8975f5c5SAndroid Build Coastguard Worker
2556*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer destRenderbuf;
2557*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf);
2558*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, kSize, kSize);
2559*8975f5c5SAndroid Build Coastguard Worker
2560*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer destFBO;
2561*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, destFBO);
2562*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destColorbuf,
2563*8975f5c5SAndroid Build Coastguard Worker 0);
2564*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2565*8975f5c5SAndroid Build Coastguard Worker destRenderbuf);
2566*8975f5c5SAndroid Build Coastguard Worker
2567*8975f5c5SAndroid Build Coastguard Worker // Clear the destination buffer with gray and 0x10 stencil.
2568*8975f5c5SAndroid Build Coastguard Worker GLColor gray(127, 127, 127, 255);
2569*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x10);
2570*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.499f, 0.499f, 0.499f, 1.0f);
2571*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2572*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
2573*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, gray);
2574*8975f5c5SAndroid Build Coastguard Worker
2575*8975f5c5SAndroid Build Coastguard Worker // Create the source framebuffer.
2576*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuf;
2577*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
2578*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, kSize, kSize);
2579*8975f5c5SAndroid Build Coastguard Worker
2580*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
2581*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawGreen, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
2582*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
2583*8975f5c5SAndroid Build Coastguard Worker
2584*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer sourceFBO;
2585*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, sourceFBO);
2586*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuf);
2587*8975f5c5SAndroid Build Coastguard Worker
2588*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2589*8975f5c5SAndroid Build Coastguard Worker
2590*8975f5c5SAndroid Build Coastguard Worker // Fill the stencil buffer with 0x1.
2591*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x1);
2592*8975f5c5SAndroid Build Coastguard Worker glClear(GL_STENCIL_BUFFER_BIT);
2593*8975f5c5SAndroid Build Coastguard Worker
2594*8975f5c5SAndroid Build Coastguard Worker // Fill a smaller region of the buffer with 0x2.
2595*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
2596*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2597*8975f5c5SAndroid Build Coastguard Worker glScissor(kSize / 4, kSize / 4, kSize / 2, kSize / 2);
2598*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x2, 0xFF);
2599*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2600*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2601*8975f5c5SAndroid Build Coastguard Worker
2602*8975f5c5SAndroid Build Coastguard Worker // Blit and scale down into the destination framebuffer (with scissor still enabled).
2603*8975f5c5SAndroid Build Coastguard Worker //
2604*8975f5c5SAndroid Build Coastguard Worker // Source looks like this:
2605*8975f5c5SAndroid Build Coastguard Worker //
2606*8975f5c5SAndroid Build Coastguard Worker // +----|----|----|----+
2607*8975f5c5SAndroid Build Coastguard Worker // | |
2608*8975f5c5SAndroid Build Coastguard Worker // | 0x1 |
2609*8975f5c5SAndroid Build Coastguard Worker // - +---------+ -
2610*8975f5c5SAndroid Build Coastguard Worker // | | | |
2611*8975f5c5SAndroid Build Coastguard Worker // | | | |
2612*8975f5c5SAndroid Build Coastguard Worker // - | 0x2 | -
2613*8975f5c5SAndroid Build Coastguard Worker // | | | |
2614*8975f5c5SAndroid Build Coastguard Worker // | | | |
2615*8975f5c5SAndroid Build Coastguard Worker // - +---------+ -
2616*8975f5c5SAndroid Build Coastguard Worker // | |
2617*8975f5c5SAndroid Build Coastguard Worker // | |
2618*8975f5c5SAndroid Build Coastguard Worker // +----|----|----|----+
2619*8975f5c5SAndroid Build Coastguard Worker //
2620*8975f5c5SAndroid Build Coastguard Worker // We want the destination to look like this:
2621*8975f5c5SAndroid Build Coastguard Worker //
2622*8975f5c5SAndroid Build Coastguard Worker // +----|----|----|----+
2623*8975f5c5SAndroid Build Coastguard Worker // | |
2624*8975f5c5SAndroid Build Coastguard Worker // | 0x10 |
2625*8975f5c5SAndroid Build Coastguard Worker // - +---------+ -
2626*8975f5c5SAndroid Build Coastguard Worker // | | 0x1 | |
2627*8975f5c5SAndroid Build Coastguard Worker // | | +------+ |
2628*8975f5c5SAndroid Build Coastguard Worker // - | | | -
2629*8975f5c5SAndroid Build Coastguard Worker // | | | 0x2 | |
2630*8975f5c5SAndroid Build Coastguard Worker // | | | | |
2631*8975f5c5SAndroid Build Coastguard Worker // - +--+------+ -
2632*8975f5c5SAndroid Build Coastguard Worker // | |
2633*8975f5c5SAndroid Build Coastguard Worker // | |
2634*8975f5c5SAndroid Build Coastguard Worker // +----|----|----|----+
2635*8975f5c5SAndroid Build Coastguard Worker //
2636*8975f5c5SAndroid Build Coastguard Worker // The corresponding blit would be: (0, 0, 3/4, 3/4) -> (1/4, 1/4, 3/4, 3/4). For testing, we
2637*8975f5c5SAndroid Build Coastguard Worker // would like to avoid having the destination area and scissor to match. Using destination
2638*8975f5c5SAndroid Build Coastguard Worker // area as (0, 0, 1, 1), and keeping the same scaling, the source area should be
2639*8975f5c5SAndroid Build Coastguard Worker // (-3/8, -3/8, 9/8, 9/8).
2640*8975f5c5SAndroid Build Coastguard Worker //
2641*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, destFBO);
2642*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kBlitSrc[2] = {-3 * kSize / 8, 9 * kSize / 8};
2643*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(kBlitSrc[0], kBlitSrc[0], kBlitSrc[1], kBlitSrc[1], 0, 0, kSize, kSize,
2644*8975f5c5SAndroid Build Coastguard Worker GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2645*8975f5c5SAndroid Build Coastguard Worker
2646*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, destFBO);
2647*8975f5c5SAndroid Build Coastguard Worker
2648*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2649*8975f5c5SAndroid Build Coastguard Worker
2650*8975f5c5SAndroid Build Coastguard Worker // Draw blue if the stencil is 0x1, which should be true only in the top and left of the inner
2651*8975f5c5SAndroid Build Coastguard Worker // square.
2652*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
2653*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0);
2654*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x1, 0xFF);
2655*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawBlue, essl3_shaders::PositionAttrib(), 0.5f);
2656*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
2657*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, gray);
2658*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, gray);
2659*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, gray);
2660*8975f5c5SAndroid Build Coastguard Worker
2661*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 4, kSize / 4, GLColor::blue);
2662*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 4, 3 * kSize / 4 - 1, GLColor::blue);
2663*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, kSize / 4, GLColor::blue);
2664*8975f5c5SAndroid Build Coastguard Worker
2665*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, gray);
2666*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, 3 * kSize / 4 - 1, gray);
2667*8975f5c5SAndroid Build Coastguard Worker
2668*8975f5c5SAndroid Build Coastguard Worker // Draw red if the stencil is 0x2, which should be true in the bottom/right of the middle
2669*8975f5c5SAndroid Build Coastguard Worker // square after the blit.
2670*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x2, 0xFF);
2671*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl3_shaders::PositionAttrib(), 0.5f);
2672*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, gray);
2673*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, gray);
2674*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, gray);
2675*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, gray);
2676*8975f5c5SAndroid Build Coastguard Worker
2677*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 4, kSize / 4, GLColor::blue);
2678*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 4, 3 * kSize / 4 - 1, GLColor::blue);
2679*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, kSize / 4, GLColor::blue);
2680*8975f5c5SAndroid Build Coastguard Worker
2681*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
2682*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, 3 * kSize / 4 - 1, GLColor::red);
2683*8975f5c5SAndroid Build Coastguard Worker
2684*8975f5c5SAndroid Build Coastguard Worker // Draw green if the stencil is 0x10, which should be left untouched in the outer regions.
2685*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x10, 0xFF);
2686*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawGreen, essl3_shaders::PositionAttrib(), 0.5f);
2687*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2688*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
2689*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
2690*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
2691*8975f5c5SAndroid Build Coastguard Worker
2692*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 4, kSize / 4, GLColor::blue);
2693*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 4, 3 * kSize / 4 - 1, GLColor::blue);
2694*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, kSize / 4, GLColor::blue);
2695*8975f5c5SAndroid Build Coastguard Worker
2696*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
2697*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, 3 * kSize / 4 - 1, GLColor::red);
2698*8975f5c5SAndroid Build Coastguard Worker
2699*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2700*8975f5c5SAndroid Build Coastguard Worker }
2701*8975f5c5SAndroid Build Coastguard Worker
2702*8975f5c5SAndroid Build Coastguard Worker // Blit a subregion of an SRGB framebuffer to an RGB framebuffer.
TEST_P(BlitFramebufferTest,PartialBlitSRGBToRGB)2703*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, PartialBlitSRGBToRGB)
2704*8975f5c5SAndroid Build Coastguard Worker {
2705*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kWidth = 256;
2706*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kHeight = 256;
2707*8975f5c5SAndroid Build Coastguard Worker
2708*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer sourceRBO, targetRBO;
2709*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer sourceFBO, targetFBO;
2710*8975f5c5SAndroid Build Coastguard Worker initColorFBOWithCheckerPattern(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth * 2,
2711*8975f5c5SAndroid Build Coastguard Worker kHeight * 2);
2712*8975f5c5SAndroid Build Coastguard Worker initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
2713*8975f5c5SAndroid Build Coastguard Worker
2714*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2715*8975f5c5SAndroid Build Coastguard Worker
2716*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2717*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2718*8975f5c5SAndroid Build Coastguard Worker
2719*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kWidth, kHeight);
2720*8975f5c5SAndroid Build Coastguard Worker
2721*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
2722*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2723*8975f5c5SAndroid Build Coastguard Worker
2724*8975f5c5SAndroid Build Coastguard Worker // Blit a part of the source FBO without flipping.
2725*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(kWidth, kHeight, kWidth * 2, kHeight * 2, 0, 0, kWidth, kHeight,
2726*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT, GL_NEAREST);
2727*8975f5c5SAndroid Build Coastguard Worker
2728*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2729*8975f5c5SAndroid Build Coastguard Worker
2730*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2731*8975f5c5SAndroid Build Coastguard Worker
2732*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::yellow);
2733*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::yellow);
2734*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::yellow);
2735*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::yellow);
2736*8975f5c5SAndroid Build Coastguard Worker
2737*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2738*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2739*8975f5c5SAndroid Build Coastguard Worker
2740*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
2741*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2742*8975f5c5SAndroid Build Coastguard Worker
2743*8975f5c5SAndroid Build Coastguard Worker // Blit a part of the source FBO and flip in the X direction.
2744*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(kWidth * 2, 0, kWidth, kHeight, kWidth, 0, 0, kHeight, GL_COLOR_BUFFER_BIT,
2745*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
2746*8975f5c5SAndroid Build Coastguard Worker
2747*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2748*8975f5c5SAndroid Build Coastguard Worker
2749*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2750*8975f5c5SAndroid Build Coastguard Worker
2751*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::blue);
2752*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::blue);
2753*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::blue);
2754*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::blue);
2755*8975f5c5SAndroid Build Coastguard Worker }
2756*8975f5c5SAndroid Build Coastguard Worker
2757*8975f5c5SAndroid Build Coastguard Worker // Blit an SRGB framebuffer with an oversized source area (parts outside the source area should be
2758*8975f5c5SAndroid Build Coastguard Worker // clipped out).
TEST_P(BlitFramebufferTest,BlitSRGBToRGBOversizedSourceArea)2759*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, BlitSRGBToRGBOversizedSourceArea)
2760*8975f5c5SAndroid Build Coastguard Worker {
2761*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kWidth = 256;
2762*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kHeight = 256;
2763*8975f5c5SAndroid Build Coastguard Worker
2764*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer sourceRBO, targetRBO;
2765*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer sourceFBO, targetFBO;
2766*8975f5c5SAndroid Build Coastguard Worker initColorFBOWithCheckerPattern(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth, kHeight);
2767*8975f5c5SAndroid Build Coastguard Worker initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
2768*8975f5c5SAndroid Build Coastguard Worker
2769*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2770*8975f5c5SAndroid Build Coastguard Worker
2771*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kWidth, kHeight);
2772*8975f5c5SAndroid Build Coastguard Worker
2773*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2774*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2775*8975f5c5SAndroid Build Coastguard Worker
2776*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
2777*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2778*8975f5c5SAndroid Build Coastguard Worker
2779*8975f5c5SAndroid Build Coastguard Worker // Blit so that the source area gets placed at the center of the target FBO.
2780*8975f5c5SAndroid Build Coastguard Worker // The width of the source area is 1/4 of the width of the target FBO.
2781*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(-3 * kWidth / 2, -3 * kHeight / 2, 5 * kWidth / 2, 5 * kHeight / 2, 0, 0,
2782*8975f5c5SAndroid Build Coastguard Worker kWidth, kHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2783*8975f5c5SAndroid Build Coastguard Worker
2784*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2785*8975f5c5SAndroid Build Coastguard Worker
2786*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2787*8975f5c5SAndroid Build Coastguard Worker
2788*8975f5c5SAndroid Build Coastguard Worker // Source FBO colors can be found in the middle of the target FBO.
2789*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(7 * kWidth / 16, 7 * kHeight / 16, GLColor::red);
2790*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(7 * kWidth / 16, 9 * kHeight / 16, GLColor::green);
2791*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(9 * kWidth / 16, 7 * kHeight / 16, GLColor::blue);
2792*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(9 * kWidth / 16, 9 * kHeight / 16, GLColor::yellow);
2793*8975f5c5SAndroid Build Coastguard Worker
2794*8975f5c5SAndroid Build Coastguard Worker // Clear color should remain around the edges of the target FBO (WebGL 2.0 spec explicitly
2795*8975f5c5SAndroid Build Coastguard Worker // requires this and ANGLE is expected to follow that).
2796*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::blue);
2797*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::blue);
2798*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::blue);
2799*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::blue);
2800*8975f5c5SAndroid Build Coastguard Worker }
2801*8975f5c5SAndroid Build Coastguard Worker
2802*8975f5c5SAndroid Build Coastguard Worker // Blit an SRGB framebuffer with an oversized dest area (even though the result is clipped, it
2803*8975f5c5SAndroid Build Coastguard Worker // should be scaled as if the whole dest area was used).
TEST_P(BlitFramebufferTest,BlitSRGBToRGBOversizedDestArea)2804*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, BlitSRGBToRGBOversizedDestArea)
2805*8975f5c5SAndroid Build Coastguard Worker {
2806*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kWidth = 256;
2807*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kHeight = 256;
2808*8975f5c5SAndroid Build Coastguard Worker
2809*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer sourceRBO, targetRBO;
2810*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer sourceFBO, targetFBO;
2811*8975f5c5SAndroid Build Coastguard Worker initColorFBOWithCheckerPattern(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth, kHeight);
2812*8975f5c5SAndroid Build Coastguard Worker initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
2813*8975f5c5SAndroid Build Coastguard Worker
2814*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2815*8975f5c5SAndroid Build Coastguard Worker
2816*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kWidth, kHeight);
2817*8975f5c5SAndroid Build Coastguard Worker
2818*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
2819*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2820*8975f5c5SAndroid Build Coastguard Worker
2821*8975f5c5SAndroid Build Coastguard Worker // Dest is oversized but centered the same as source
2822*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2823*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2824*8975f5c5SAndroid Build Coastguard Worker
2825*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kWidth, kHeight, -kWidth / 2, -kHeight / 2, 3 * kWidth / 2,
2826*8975f5c5SAndroid Build Coastguard Worker 3 * kHeight / 2, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2827*8975f5c5SAndroid Build Coastguard Worker
2828*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2829*8975f5c5SAndroid Build Coastguard Worker
2830*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2831*8975f5c5SAndroid Build Coastguard Worker
2832*8975f5c5SAndroid Build Coastguard Worker // Expected result:
2833*8975f5c5SAndroid Build Coastguard Worker //
2834*8975f5c5SAndroid Build Coastguard Worker // +-------+-------+
2835*8975f5c5SAndroid Build Coastguard Worker // | | |
2836*8975f5c5SAndroid Build Coastguard Worker // | R | B |
2837*8975f5c5SAndroid Build Coastguard Worker // | | |
2838*8975f5c5SAndroid Build Coastguard Worker // +-------+-------+
2839*8975f5c5SAndroid Build Coastguard Worker // | | |
2840*8975f5c5SAndroid Build Coastguard Worker // | G | Y |
2841*8975f5c5SAndroid Build Coastguard Worker // | | |
2842*8975f5c5SAndroid Build Coastguard Worker // +-------+-------+
2843*8975f5c5SAndroid Build Coastguard Worker //
2844*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
2845*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::red);
2846*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 2 - 1, kHeight / 2 - 1, GLColor::red);
2847*8975f5c5SAndroid Build Coastguard Worker
2848*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, kWidth - 1, GLColor::green);
2849*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::green);
2850*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 2 - 1, kHeight / 2 + 1, GLColor::green);
2851*8975f5c5SAndroid Build Coastguard Worker
2852*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth - 1, 1, GLColor::blue);
2853*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::blue);
2854*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 2 + 1, kHeight / 2 - 1, GLColor::blue);
2855*8975f5c5SAndroid Build Coastguard Worker
2856*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight - 1, GLColor::yellow);
2857*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::yellow);
2858*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 2 + 1, kHeight / 2 + 1, GLColor::yellow);
2859*8975f5c5SAndroid Build Coastguard Worker
2860*8975f5c5SAndroid Build Coastguard Worker // Dest is oversized in the negative direction
2861*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2862*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2863*8975f5c5SAndroid Build Coastguard Worker
2864*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kWidth, kHeight, -kWidth / 2, -kHeight / 2, kWidth, kHeight,
2865*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT, GL_NEAREST);
2866*8975f5c5SAndroid Build Coastguard Worker
2867*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2868*8975f5c5SAndroid Build Coastguard Worker
2869*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2870*8975f5c5SAndroid Build Coastguard Worker
2871*8975f5c5SAndroid Build Coastguard Worker // Expected result:
2872*8975f5c5SAndroid Build Coastguard Worker //
2873*8975f5c5SAndroid Build Coastguard Worker // Width / 4
2874*8975f5c5SAndroid Build Coastguard Worker // |
2875*8975f5c5SAndroid Build Coastguard Worker // V
2876*8975f5c5SAndroid Build Coastguard Worker // +---+-----------+
2877*8975f5c5SAndroid Build Coastguard Worker // | R | B |
2878*8975f5c5SAndroid Build Coastguard Worker // +---+-----------+ <- Height / 4
2879*8975f5c5SAndroid Build Coastguard Worker // | | |
2880*8975f5c5SAndroid Build Coastguard Worker // | | |
2881*8975f5c5SAndroid Build Coastguard Worker // | G | Y |
2882*8975f5c5SAndroid Build Coastguard Worker // | | |
2883*8975f5c5SAndroid Build Coastguard Worker // | | |
2884*8975f5c5SAndroid Build Coastguard Worker // +---+-----------+
2885*8975f5c5SAndroid Build Coastguard Worker //
2886*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2887*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kHeight / 4 - 1, GLColor::red);
2888*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4 - 1, 0, GLColor::red);
2889*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4 - 1, kHeight / 4 - 1, GLColor::red);
2890*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 8, kHeight / 8, GLColor::red);
2891*8975f5c5SAndroid Build Coastguard Worker
2892*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kHeight / 4 + 1, GLColor::green);
2893*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kHeight - 1, GLColor::green);
2894*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4 - 1, kHeight / 4 + 1, GLColor::green);
2895*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4 - 1, kHeight - 1, GLColor::green);
2896*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 8, kHeight / 2, GLColor::green);
2897*8975f5c5SAndroid Build Coastguard Worker
2898*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4 + 1, 0, GLColor::blue);
2899*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4 + 1, kHeight / 4 - 1, GLColor::blue);
2900*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth - 1, 0, GLColor::blue);
2901*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight / 4 - 1, GLColor::blue);
2902*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 2, kHeight / 8, GLColor::blue);
2903*8975f5c5SAndroid Build Coastguard Worker
2904*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4 + 1, kHeight / 4 + 1, GLColor::yellow);
2905*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4 + 1, kHeight - 1, GLColor::yellow);
2906*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight / 4 + 1, GLColor::yellow);
2907*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight - 1, GLColor::yellow);
2908*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 2, kHeight / 2, GLColor::yellow);
2909*8975f5c5SAndroid Build Coastguard Worker
2910*8975f5c5SAndroid Build Coastguard Worker // Dest is oversized in the positive direction
2911*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2912*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2913*8975f5c5SAndroid Build Coastguard Worker
2914*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, 3 * kWidth / 2, 3 * kHeight / 2,
2915*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT, GL_NEAREST);
2916*8975f5c5SAndroid Build Coastguard Worker
2917*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2918*8975f5c5SAndroid Build Coastguard Worker
2919*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
2920*8975f5c5SAndroid Build Coastguard Worker
2921*8975f5c5SAndroid Build Coastguard Worker // Expected result:
2922*8975f5c5SAndroid Build Coastguard Worker //
2923*8975f5c5SAndroid Build Coastguard Worker // 3 * Width / 4
2924*8975f5c5SAndroid Build Coastguard Worker // |
2925*8975f5c5SAndroid Build Coastguard Worker // V
2926*8975f5c5SAndroid Build Coastguard Worker // +-----------+---+
2927*8975f5c5SAndroid Build Coastguard Worker // | | |
2928*8975f5c5SAndroid Build Coastguard Worker // | | |
2929*8975f5c5SAndroid Build Coastguard Worker // | R | B |
2930*8975f5c5SAndroid Build Coastguard Worker // | | |
2931*8975f5c5SAndroid Build Coastguard Worker // | | |
2932*8975f5c5SAndroid Build Coastguard Worker // +-----------+---+ <- 3 * Height / 4
2933*8975f5c5SAndroid Build Coastguard Worker // | G | Y |
2934*8975f5c5SAndroid Build Coastguard Worker // +-----------+---+
2935*8975f5c5SAndroid Build Coastguard Worker //
2936*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2937*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 3 * kHeight / 4 - 1, GLColor::red);
2938*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 - 1, 0, GLColor::red);
2939*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 - 1, 3 * kHeight / 4 - 1, GLColor::red);
2940*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 2, kHeight / 2, GLColor::red);
2941*8975f5c5SAndroid Build Coastguard Worker
2942*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 3 * kHeight / 4 + 1, GLColor::green);
2943*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kHeight - 1, GLColor::green);
2944*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 - 1, 3 * kHeight / 4 + 1, GLColor::green);
2945*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 - 1, kHeight - 1, GLColor::green);
2946*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 2, 7 * kHeight / 8, GLColor::green);
2947*8975f5c5SAndroid Build Coastguard Worker
2948*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 + 1, 0, GLColor::blue);
2949*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 + 1, 3 * kHeight / 4 - 1, GLColor::blue);
2950*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth - 1, 0, GLColor::blue);
2951*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth - 1, 3 * kHeight / 4 - 1, GLColor::blue);
2952*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(7 * kWidth / 8, kHeight / 2, GLColor::blue);
2953*8975f5c5SAndroid Build Coastguard Worker
2954*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 + 1, 3 * kHeight / 4 + 1, GLColor::yellow);
2955*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4 + 1, kHeight - 1, GLColor::yellow);
2956*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth - 1, 3 * kHeight / 4 + 1, GLColor::yellow);
2957*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight - 1, GLColor::yellow);
2958*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(7 * kWidth / 8, 7 * kHeight / 8, GLColor::yellow);
2959*8975f5c5SAndroid Build Coastguard Worker }
2960*8975f5c5SAndroid Build Coastguard Worker
2961*8975f5c5SAndroid Build Coastguard Worker // This test is to demonstrate a bug that when a program is created and used and then destroyed, we
2962*8975f5c5SAndroid Build Coastguard Worker // should not have a dangling PipelineHelper pointer in the context point to the already destroyed
2963*8975f5c5SAndroid Build Coastguard Worker // object.
TEST_P(BlitFramebufferTest,useAndDestroyProgramThenBlit)2964*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, useAndDestroyProgramThenBlit)
2965*8975f5c5SAndroid Build Coastguard Worker {
2966*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kWidth = 256;
2967*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kHeight = 256;
2968*8975f5c5SAndroid Build Coastguard Worker
2969*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer sourceRBO, targetRBO;
2970*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer sourceFBO, targetFBO;
2971*8975f5c5SAndroid Build Coastguard Worker
2972*8975f5c5SAndroid Build Coastguard Worker {
2973*8975f5c5SAndroid Build Coastguard Worker initColorFBO(&sourceFBO, &sourceRBO, GL_SRGB8_ALPHA8, kWidth, kHeight);
2974*8975f5c5SAndroid Build Coastguard Worker // checkerProgram will be created and destroyed in this code block
2975*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(checkerProgram, essl1_shaders::vs::Passthrough(),
2976*8975f5c5SAndroid Build Coastguard Worker essl1_shaders::fs::Checkered());
2977*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kWidth, kHeight);
2978*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, sourceFBO);
2979*8975f5c5SAndroid Build Coastguard Worker drawQuad(checkerProgram, essl1_shaders::PositionAttrib(), 0.5f);
2980*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
2981*8975f5c5SAndroid Build Coastguard Worker }
2982*8975f5c5SAndroid Build Coastguard Worker initColorFBO(&targetFBO, &targetRBO, GL_RGBA8, kWidth, kHeight);
2983*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2984*8975f5c5SAndroid Build Coastguard Worker
2985*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kWidth, kHeight);
2986*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
2987*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2988*8975f5c5SAndroid Build Coastguard Worker
2989*8975f5c5SAndroid Build Coastguard Worker // Blit call should not crash or assert
2990*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
2991*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
2992*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kWidth, kHeight, -kWidth / 2, -kHeight / 2, 3 * kWidth / 2,
2993*8975f5c5SAndroid Build Coastguard Worker 3 * kHeight / 2, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2994*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2995*8975f5c5SAndroid Build Coastguard Worker }
2996*8975f5c5SAndroid Build Coastguard Worker
2997*8975f5c5SAndroid Build Coastguard Worker // This test is to ensure the draw after blit without any state change works properly
TEST_P(BlitFramebufferTest,drawBlitAndDrawAgain)2998*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, drawBlitAndDrawAgain)
2999*8975f5c5SAndroid Build Coastguard Worker {
3000*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kWidth = 256;
3001*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kHeight = 256;
3002*8975f5c5SAndroid Build Coastguard Worker
3003*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer srcColorRB, srcDepthRB;
3004*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFBO;
3005*8975f5c5SAndroid Build Coastguard Worker
3006*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Red());
3007*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Green());
3008*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawBlue, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
3009*8975f5c5SAndroid Build Coastguard Worker
3010*8975f5c5SAndroid Build Coastguard Worker // Initialize source FBO with red color and depth==0.8f
3011*8975f5c5SAndroid Build Coastguard Worker initFBOWithProgramAndDepth(&srcFBO, &srcColorRB, GL_RGBA8, &srcDepthRB, GL_DEPTH24_STENCIL8_OES,
3012*8975f5c5SAndroid Build Coastguard Worker kWidth, kHeight, drawRed, 0.8f);
3013*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
3014*8975f5c5SAndroid Build Coastguard Worker
3015*8975f5c5SAndroid Build Coastguard Worker // Initialize destination FBO and initialize to green and depth==0.7
3016*8975f5c5SAndroid Build Coastguard Worker initFBOWithProgramAndDepth(nullptr, nullptr, 0, nullptr, 0, kWidth, kHeight, drawGreen, 0.7f);
3017*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::green);
3018*8975f5c5SAndroid Build Coastguard Worker
3019*8975f5c5SAndroid Build Coastguard Worker // Setup for draw-blit-draw use pattern
3020*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFBO);
3021*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
3022*8975f5c5SAndroid Build Coastguard Worker std::array<Vector3, 6> quadVertices = GetQuadVertices();
3023*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kBufferSize = sizeof(quadVertices[0]) * quadVertices.size();
3024*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
3025*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
3026*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, kBufferSize, nullptr, GL_STATIC_DRAW);
3027*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawBlue);
3028*8975f5c5SAndroid Build Coastguard Worker const GLint positionLocation = glGetAttribLocation(drawBlue, essl1_shaders::PositionAttrib());
3029*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
3030*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
3031*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
3032*8975f5c5SAndroid Build Coastguard Worker
3033*8975f5c5SAndroid Build Coastguard Worker // Draw with depth=0.75, should fail depth test
3034*8975f5c5SAndroid Build Coastguard Worker drawWithDepthValue(quadVertices, 0.75f);
3035*8975f5c5SAndroid Build Coastguard Worker // Now blit depth buffer from source FBO to the right half of destination FBO, so left half has
3036*8975f5c5SAndroid Build Coastguard Worker // depth 0.7f and right half has 0.8f
3037*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(kWidth / 2, 0, kWidth, kHeight, kWidth / 2, 0, kWidth, kHeight,
3038*8975f5c5SAndroid Build Coastguard Worker GL_DEPTH_BUFFER_BIT, GL_NEAREST);
3039*8975f5c5SAndroid Build Coastguard Worker // Continue draw without state change and depth==0.75f, now it should pass depth test on right
3040*8975f5c5SAndroid Build Coastguard Worker // half
3041*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
3042*8975f5c5SAndroid Build Coastguard Worker
3043*8975f5c5SAndroid Build Coastguard Worker // Now verify dstFBO
3044*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
3045*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::green);
3046*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 2 + 1, 1, GLColor::blue);
3047*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3048*8975f5c5SAndroid Build Coastguard Worker }
3049*8975f5c5SAndroid Build Coastguard Worker
3050*8975f5c5SAndroid Build Coastguard Worker // This test is to ensure the scissored draw after blit without any state change works properly
TEST_P(BlitFramebufferTest,scissorDrawBlitAndDrawAgain)3051*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, scissorDrawBlitAndDrawAgain)
3052*8975f5c5SAndroid Build Coastguard Worker {
3053*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kWidth = 256;
3054*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kHeight = 256;
3055*8975f5c5SAndroid Build Coastguard Worker
3056*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer srcColorRB, srcDepthRB;
3057*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFBO;
3058*8975f5c5SAndroid Build Coastguard Worker
3059*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Red());
3060*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Green());
3061*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawBlue, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
3062*8975f5c5SAndroid Build Coastguard Worker
3063*8975f5c5SAndroid Build Coastguard Worker // Initialize source FBO with red color and depth==0.8f
3064*8975f5c5SAndroid Build Coastguard Worker initFBOWithProgramAndDepth(&srcFBO, &srcColorRB, GL_RGBA8, &srcDepthRB, GL_DEPTH24_STENCIL8_OES,
3065*8975f5c5SAndroid Build Coastguard Worker kWidth, kHeight, drawRed, 0.8f);
3066*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
3067*8975f5c5SAndroid Build Coastguard Worker
3068*8975f5c5SAndroid Build Coastguard Worker // Initialize destination FBO and initialize to green and depth==0.7
3069*8975f5c5SAndroid Build Coastguard Worker initFBOWithProgramAndDepth(nullptr, nullptr, 0, nullptr, 0, kWidth, kHeight, drawGreen, 0.7f);
3070*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::green);
3071*8975f5c5SAndroid Build Coastguard Worker
3072*8975f5c5SAndroid Build Coastguard Worker // Setup for draw-blit-draw use pattern
3073*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFBO);
3074*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
3075*8975f5c5SAndroid Build Coastguard Worker std::array<Vector3, 6> quadVertices = GetQuadVertices();
3076*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kBufferSize = sizeof(quadVertices[0]) * quadVertices.size();
3077*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
3078*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
3079*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, kBufferSize, nullptr, GL_STATIC_DRAW);
3080*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawBlue);
3081*8975f5c5SAndroid Build Coastguard Worker const GLint positionLocation = glGetAttribLocation(drawBlue, essl1_shaders::PositionAttrib());
3082*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
3083*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
3084*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
3085*8975f5c5SAndroid Build Coastguard Worker
3086*8975f5c5SAndroid Build Coastguard Worker // Scissored draw with depth=0.75, should fail depth test
3087*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
3088*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, kWidth, kHeight / 2);
3089*8975f5c5SAndroid Build Coastguard Worker drawWithDepthValue(quadVertices, 0.75f);
3090*8975f5c5SAndroid Build Coastguard Worker // Now blit depth buffer from source FBO to the right half of destination FBO, so left half has
3091*8975f5c5SAndroid Build Coastguard Worker // depth 0.7f and right half has 0.8f
3092*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(kWidth / 2, 0, kWidth, kHeight, kWidth / 2, 0, kWidth, kHeight,
3093*8975f5c5SAndroid Build Coastguard Worker GL_DEPTH_BUFFER_BIT, GL_NEAREST);
3094*8975f5c5SAndroid Build Coastguard Worker // Continue draw without state change and depth==0.75f, now it should pass depth test on right
3095*8975f5c5SAndroid Build Coastguard Worker // half
3096*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
3097*8975f5c5SAndroid Build Coastguard Worker
3098*8975f5c5SAndroid Build Coastguard Worker // Now verify dstFBO
3099*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
3100*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::green);
3101*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 2 + 1, 1, GLColor::blue);
3102*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, kHeight - 1, GLColor::green);
3103*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 2 + 1, kHeight - 1, GLColor::green);
3104*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3105*8975f5c5SAndroid Build Coastguard Worker }
3106*8975f5c5SAndroid Build Coastguard Worker
3107*8975f5c5SAndroid Build Coastguard Worker // Test blitFramebuffer size overflow checks. WebGL 2.0 spec section 5.41. We do validation for
3108*8975f5c5SAndroid Build Coastguard Worker // overflows also in non-WebGL mode to avoid triggering driver bugs.
TEST_P(BlitFramebufferTest,BlitFramebufferSizeOverflow)3109*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, BlitFramebufferSizeOverflow)
3110*8975f5c5SAndroid Build Coastguard Worker {
3111*8975f5c5SAndroid Build Coastguard Worker GLTexture textures[2];
3112*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
3113*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 4, 4);
3114*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[1]);
3115*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 4, 4);
3116*8975f5c5SAndroid Build Coastguard Worker
3117*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffers[2];
3118*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffers[0]);
3119*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffers[1]);
3120*8975f5c5SAndroid Build Coastguard Worker
3121*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3122*8975f5c5SAndroid Build Coastguard Worker
3123*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0],
3124*8975f5c5SAndroid Build Coastguard Worker 0);
3125*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1],
3126*8975f5c5SAndroid Build Coastguard Worker 0);
3127*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3128*8975f5c5SAndroid Build Coastguard Worker
3129*8975f5c5SAndroid Build Coastguard Worker // srcX
3130*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(-1, 0, std::numeric_limits<GLint>::max(), 4, 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
3131*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3132*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3133*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(std::numeric_limits<GLint>::max(), 0, -1, 4, 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
3134*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3135*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3136*8975f5c5SAndroid Build Coastguard Worker
3137*8975f5c5SAndroid Build Coastguard Worker // srcY
3138*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, -1, 4, std::numeric_limits<GLint>::max(), 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
3139*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3140*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3141*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, std::numeric_limits<GLint>::max(), 4, -1, 0, 0, 4, 4, GL_COLOR_BUFFER_BIT,
3142*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3143*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3144*8975f5c5SAndroid Build Coastguard Worker
3145*8975f5c5SAndroid Build Coastguard Worker // dstX
3146*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 4, 4, -1, 0, std::numeric_limits<GLint>::max(), 4, GL_COLOR_BUFFER_BIT,
3147*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3148*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3149*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 4, 4, std::numeric_limits<GLint>::max(), 0, -1, 4, GL_COLOR_BUFFER_BIT,
3150*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3151*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3152*8975f5c5SAndroid Build Coastguard Worker
3153*8975f5c5SAndroid Build Coastguard Worker // dstY
3154*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 4, 4, 0, -1, 4, std::numeric_limits<GLint>::max(), GL_COLOR_BUFFER_BIT,
3155*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3156*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3157*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 4, 4, 0, std::numeric_limits<GLint>::max(), 4, -1, GL_COLOR_BUFFER_BIT,
3158*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3159*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3160*8975f5c5SAndroid Build Coastguard Worker }
3161*8975f5c5SAndroid Build Coastguard Worker
3162*8975f5c5SAndroid Build Coastguard Worker // Test blitFramebuffer size overflow checks. WebGL 2.0 spec section 5.41. Similar to above test,
3163*8975f5c5SAndroid Build Coastguard Worker // but this test more accurately duplicates the behavior of the WebGL test
3164*8975f5c5SAndroid Build Coastguard Worker // conformance2/rendering/blitframebuffer-size-overflow.html, which covers a few more edge cases.
TEST_P(BlitFramebufferTest,BlitFramebufferSizeOverflow2)3165*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, BlitFramebufferSizeOverflow2)
3166*8975f5c5SAndroid Build Coastguard Worker {
3167*8975f5c5SAndroid Build Coastguard Worker GLTexture textures[2];
3168*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
3169*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 4, 4);
3170*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[1]);
3171*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 4, 4);
3172*8975f5c5SAndroid Build Coastguard Worker
3173*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffers[2];
3174*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffers[0]);
3175*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffers[1]);
3176*8975f5c5SAndroid Build Coastguard Worker
3177*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3178*8975f5c5SAndroid Build Coastguard Worker
3179*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0],
3180*8975f5c5SAndroid Build Coastguard Worker 0);
3181*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1],
3182*8975f5c5SAndroid Build Coastguard Worker 0);
3183*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3184*8975f5c5SAndroid Build Coastguard Worker
3185*8975f5c5SAndroid Build Coastguard Worker GLint width = 8;
3186*8975f5c5SAndroid Build Coastguard Worker GLint height = 8;
3187*8975f5c5SAndroid Build Coastguard Worker
3188*8975f5c5SAndroid Build Coastguard Worker GLTexture tex0;
3189*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex0);
3190*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3191*8975f5c5SAndroid Build Coastguard Worker
3192*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fb0;
3193*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fb0);
3194*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex0, 0);
3195*8975f5c5SAndroid Build Coastguard Worker
3196*8975f5c5SAndroid Build Coastguard Worker GLTexture tex1;
3197*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex1);
3198*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
3199*8975f5c5SAndroid Build Coastguard Worker
3200*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fb1;
3201*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb1);
3202*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1, 0);
3203*8975f5c5SAndroid Build Coastguard Worker
3204*8975f5c5SAndroid Build Coastguard Worker GLint max = std::numeric_limits<GLint>::max();
3205*8975f5c5SAndroid Build Coastguard Worker // Using max 32-bit integer as blitFramebuffer parameter should succeed.
3206*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, max, max, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3207*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, width, height, 0, 0, max, max, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3208*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, max, max, 0, 0, max, max, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3209*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3210*8975f5c5SAndroid Build Coastguard Worker
3211*8975f5c5SAndroid Build Coastguard Worker // Using blitFramebuffer parameters where calculated width/height matches max 32-bit integer
3212*8975f5c5SAndroid Build Coastguard Worker // should succeed
3213*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(-1, -1, max - 1, max - 1, 0, 0, width, height, GL_COLOR_BUFFER_BIT,
3214*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3215*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, width, height, -1, -1, max - 1, max - 1, GL_COLOR_BUFFER_BIT,
3216*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3217*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(-1, -1, max - 1, max - 1, -1, -1, max - 1, max - 1, GL_COLOR_BUFFER_BIT,
3218*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3219*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3220*8975f5c5SAndroid Build Coastguard Worker
3221*8975f5c5SAndroid Build Coastguard Worker // Using source width/height greater than max 32-bit integer should fail.
3222*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(-1, -1, max, max, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3223*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3224*8975f5c5SAndroid Build Coastguard Worker
3225*8975f5c5SAndroid Build Coastguard Worker // Using source width/height greater than max 32-bit integer should fail.
3226*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(max, max, -1, -1, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3227*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3228*8975f5c5SAndroid Build Coastguard Worker
3229*8975f5c5SAndroid Build Coastguard Worker // Using destination width/height greater than max 32-bit integer should fail.
3230*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, width, height, -1, -1, max, max, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3231*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3232*8975f5c5SAndroid Build Coastguard Worker
3233*8975f5c5SAndroid Build Coastguard Worker // Using destination width/height greater than max 32-bit integer should fail.
3234*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, width, height, max, max, -1, -1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3235*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3236*8975f5c5SAndroid Build Coastguard Worker
3237*8975f5c5SAndroid Build Coastguard Worker // Using both source and destination width/height greater than max 32-bit integer should fail.
3238*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(-1, -1, max, max, -1, -1, max, max, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3239*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3240*8975f5c5SAndroid Build Coastguard Worker
3241*8975f5c5SAndroid Build Coastguard Worker // Using minimum and maximum integers for all boundaries should fail.
3242*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(-max - 1, -max - 1, max, max, -max - 1, -max - 1, max, max,
3243*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT, GL_NEAREST);
3244*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
3245*8975f5c5SAndroid Build Coastguard Worker }
3246*8975f5c5SAndroid Build Coastguard Worker
3247*8975f5c5SAndroid Build Coastguard Worker // Test an edge case in D3D11 stencil blitting on the CPU that does not properly clip the
3248*8975f5c5SAndroid Build Coastguard Worker // destination regions
TEST_P(BlitFramebufferTest,BlitFramebufferStencilClipNoIntersection)3249*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, BlitFramebufferStencilClipNoIntersection)
3250*8975f5c5SAndroid Build Coastguard Worker {
3251*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffers[2];
3252*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffers[0]);
3253*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffers[1]);
3254*8975f5c5SAndroid Build Coastguard Worker
3255*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffers[2];
3256*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[0]);
3257*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 4, 4);
3258*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
3259*8975f5c5SAndroid Build Coastguard Worker renderbuffers[0]);
3260*8975f5c5SAndroid Build Coastguard Worker
3261*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[1]);
3262*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 4, 4);
3263*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
3264*8975f5c5SAndroid Build Coastguard Worker renderbuffers[1]);
3265*8975f5c5SAndroid Build Coastguard Worker
3266*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 4, 4, 1 << 24, 1 << 24, 1 << 25, 1 << 25, GL_STENCIL_BUFFER_BIT,
3267*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3268*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3269*8975f5c5SAndroid Build Coastguard Worker }
3270*8975f5c5SAndroid Build Coastguard Worker
3271*8975f5c5SAndroid Build Coastguard Worker // Covers an edge case with blitting borderline values.
TEST_P(BlitFramebufferTest,OOBWrite)3272*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, OOBWrite)
3273*8975f5c5SAndroid Build Coastguard Worker {
3274*8975f5c5SAndroid Build Coastguard Worker constexpr size_t length = 0x100000;
3275*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer rfb;
3276*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer dfb;
3277*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rb1;
3278*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rb2;
3279*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, rfb);
3280*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dfb);
3281*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rb1);
3282*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 0x1000, 2);
3283*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rb2);
3284*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 2, 2);
3285*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
3286*8975f5c5SAndroid Build Coastguard Worker rb1);
3287*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
3288*8975f5c5SAndroid Build Coastguard Worker rb2);
3289*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(1, 0, 0, 1, 1, 0, (2147483648 / 2) - (length / 4) + 1, 1,
3290*8975f5c5SAndroid Build Coastguard Worker GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
3291*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3292*8975f5c5SAndroid Build Coastguard Worker }
3293*8975f5c5SAndroid Build Coastguard Worker
3294*8975f5c5SAndroid Build Coastguard Worker // Test that flipped blits don't have off-by-one errors
TEST_P(BlitFramebufferTest,FlippedBlits)3295*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, FlippedBlits)
3296*8975f5c5SAndroid Build Coastguard Worker {
3297*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kWidth = 11;
3298*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kHeight = 19;
3299*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kWidth, kHeight);
3300*8975f5c5SAndroid Build Coastguard Worker
3301*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer srcColorRB, srcDepthRB, dstColorRB, dstDepthRB;
3302*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFBO, dstFBO;
3303*8975f5c5SAndroid Build Coastguard Worker
3304*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Red());
3305*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Green());
3306*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
3307*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3308*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
3309*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
3310*8975f5c5SAndroid Build Coastguard Worker
3311*8975f5c5SAndroid Build Coastguard Worker // Create source and dest FBOs
3312*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, srcColorRB);
3313*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kWidth, kHeight);
3314*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, srcDepthRB);
3315*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, kWidth, kHeight);
3316*8975f5c5SAndroid Build Coastguard Worker
3317*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, srcFBO);
3318*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, srcColorRB);
3319*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
3320*8975f5c5SAndroid Build Coastguard Worker srcDepthRB);
3321*8975f5c5SAndroid Build Coastguard Worker
3322*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, dstColorRB);
3323*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kWidth, kHeight);
3324*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, dstDepthRB);
3325*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, kWidth, kHeight);
3326*8975f5c5SAndroid Build Coastguard Worker
3327*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFBO);
3328*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, dstColorRB);
3329*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
3330*8975f5c5SAndroid Build Coastguard Worker dstDepthRB);
3331*8975f5c5SAndroid Build Coastguard Worker
3332*8975f5c5SAndroid Build Coastguard Worker // Fill the source framebuffer with differring values per pixel, so off-by-one errors are more
3333*8975f5c5SAndroid Build Coastguard Worker // easily found.
3334*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
3335*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
3336*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
3337*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
3338*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
3339*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
3340*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
3341*8975f5c5SAndroid Build Coastguard Worker
3342*8975f5c5SAndroid Build Coastguard Worker auto makeColor = [](GLsizei row, GLsizei col) -> GLColor {
3343*8975f5c5SAndroid Build Coastguard Worker return GLColor(row * 255 / kHeight, col * 255 / kWidth, (row * 7 + col * 11) % 256, 255);
3344*8975f5c5SAndroid Build Coastguard Worker };
3345*8975f5c5SAndroid Build Coastguard Worker auto makeDepth = [](GLsizei row, GLsizei col) -> float {
3346*8975f5c5SAndroid Build Coastguard Worker return 1.8f * ((row * kWidth + col) % 33 / 32.0f) - 0.9f;
3347*8975f5c5SAndroid Build Coastguard Worker };
3348*8975f5c5SAndroid Build Coastguard Worker auto makeStencil = [](GLsizei row, GLsizei col) -> uint8_t {
3349*8975f5c5SAndroid Build Coastguard Worker return (col * kHeight + row) & 0xFF;
3350*8975f5c5SAndroid Build Coastguard Worker };
3351*8975f5c5SAndroid Build Coastguard Worker
3352*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, srcFBO);
3353*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3354*8975f5c5SAndroid Build Coastguard Worker for (GLsizei row = 0; row < kHeight; ++row)
3355*8975f5c5SAndroid Build Coastguard Worker {
3356*8975f5c5SAndroid Build Coastguard Worker for (GLsizei col = 0; col < kWidth; ++col)
3357*8975f5c5SAndroid Build Coastguard Worker {
3358*8975f5c5SAndroid Build Coastguard Worker glScissor(col, row, 1, 1);
3359*8975f5c5SAndroid Build Coastguard Worker
3360*8975f5c5SAndroid Build Coastguard Worker glUniform4fv(colorLoc, 1, makeColor(row, col).toNormalizedVector().data());
3361*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, makeStencil(row, col), 0xFF);
3362*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), makeDepth(row, col));
3363*8975f5c5SAndroid Build Coastguard Worker }
3364*8975f5c5SAndroid Build Coastguard Worker }
3365*8975f5c5SAndroid Build Coastguard Worker
3366*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
3367*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
3368*8975f5c5SAndroid Build Coastguard Worker
3369*8975f5c5SAndroid Build Coastguard Worker auto test = [&](int testIndex, bool flipX, bool flipY, GLint srcOffsetX, GLint srcOffsetY,
3370*8975f5c5SAndroid Build Coastguard Worker GLint dstOffsetX, GLint dstOffsetY, GLint width, GLint height) {
3371*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
3372*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFBO);
3373*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
3374*8975f5c5SAndroid Build Coastguard Worker
3375*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFBO);
3376*8975f5c5SAndroid Build Coastguard Worker
3377*8975f5c5SAndroid Build Coastguard Worker const GLint srcX0 = srcOffsetX;
3378*8975f5c5SAndroid Build Coastguard Worker const GLint srcY0 = srcOffsetY;
3379*8975f5c5SAndroid Build Coastguard Worker const GLint srcX1 = srcOffsetX + width;
3380*8975f5c5SAndroid Build Coastguard Worker const GLint srcY1 = srcOffsetY + height;
3381*8975f5c5SAndroid Build Coastguard Worker
3382*8975f5c5SAndroid Build Coastguard Worker const GLint dstX0 = flipX ? dstOffsetX + width : dstOffsetX;
3383*8975f5c5SAndroid Build Coastguard Worker const GLint dstY0 = flipY ? dstOffsetY + height : dstOffsetY;
3384*8975f5c5SAndroid Build Coastguard Worker const GLint dstX1 = flipX ? dstOffsetX : dstOffsetX + width;
3385*8975f5c5SAndroid Build Coastguard Worker const GLint dstY1 = flipY ? dstOffsetY : dstOffsetY + height;
3386*8975f5c5SAndroid Build Coastguard Worker
3387*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
3388*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
3389*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3390*8975f5c5SAndroid Build Coastguard Worker
3391*8975f5c5SAndroid Build Coastguard Worker // Verify results
3392*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, dstFBO);
3393*8975f5c5SAndroid Build Coastguard Worker
3394*8975f5c5SAndroid Build Coastguard Worker for (GLsizei row = 0; row < height; ++row)
3395*8975f5c5SAndroid Build Coastguard Worker {
3396*8975f5c5SAndroid Build Coastguard Worker for (GLsizei col = 0; col < width; ++col)
3397*8975f5c5SAndroid Build Coastguard Worker {
3398*8975f5c5SAndroid Build Coastguard Worker const GLint srcPixelX = col + srcOffsetX;
3399*8975f5c5SAndroid Build Coastguard Worker const GLint srcPixelY = row + srcOffsetY;
3400*8975f5c5SAndroid Build Coastguard Worker const GLint dstPixelX = dstOffsetX + (flipX ? width - 1 - col : col);
3401*8975f5c5SAndroid Build Coastguard Worker const GLint dstPixelY = dstOffsetY + (flipY ? height - 1 - row : row);
3402*8975f5c5SAndroid Build Coastguard Worker
3403*8975f5c5SAndroid Build Coastguard Worker const GLColor expectColor = makeColor(srcPixelY, srcPixelX);
3404*8975f5c5SAndroid Build Coastguard Worker const float expectDepth = makeDepth(srcPixelY, srcPixelX);
3405*8975f5c5SAndroid Build Coastguard Worker const uint8_t expectStencil = makeStencil(srcPixelY, srcPixelX);
3406*8975f5c5SAndroid Build Coastguard Worker
3407*8975f5c5SAndroid Build Coastguard Worker // Verify color
3408*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(dstPixelX, dstPixelY, expectColor)
3409*8975f5c5SAndroid Build Coastguard Worker << testIndex << " " << flipX << " " << flipY << " " << row << " " << col;
3410*8975f5c5SAndroid Build Coastguard Worker
3411*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
3412*8975f5c5SAndroid Build Coastguard Worker glScissor(dstPixelX, dstPixelY, 1, 1);
3413*8975f5c5SAndroid Build Coastguard Worker
3414*8975f5c5SAndroid Build Coastguard Worker // Verify depth and stencil
3415*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, expectStencil, 0xFF);
3416*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl1_shaders::PositionAttrib(), expectDepth - 0.05);
3417*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawGreen, essl1_shaders::PositionAttrib(), expectDepth + 0.05);
3418*8975f5c5SAndroid Build Coastguard Worker
3419*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(dstPixelX, dstPixelY, GLColor::red)
3420*8975f5c5SAndroid Build Coastguard Worker << testIndex << " " << flipX << " " << flipY << " " << row << " " << col;
3421*8975f5c5SAndroid Build Coastguard Worker }
3422*8975f5c5SAndroid Build Coastguard Worker }
3423*8975f5c5SAndroid Build Coastguard Worker };
3424*8975f5c5SAndroid Build Coastguard Worker
3425*8975f5c5SAndroid Build Coastguard Worker for (int flipX = 0; flipX < 2; ++flipX)
3426*8975f5c5SAndroid Build Coastguard Worker {
3427*8975f5c5SAndroid Build Coastguard Worker for (int flipY = 0; flipY < 2; ++flipY)
3428*8975f5c5SAndroid Build Coastguard Worker {
3429*8975f5c5SAndroid Build Coastguard Worker // Test 0, full sized blit
3430*8975f5c5SAndroid Build Coastguard Worker test(0, flipX != 0, flipY != 0, 0, 0, 0, 0, kWidth, kHeight);
3431*8975f5c5SAndroid Build Coastguard Worker // Test 1, blit only one pixel
3432*8975f5c5SAndroid Build Coastguard Worker test(1, flipX != 0, flipY != 0, kWidth / 3, kHeight / 7, 2 * kWidth / 5,
3433*8975f5c5SAndroid Build Coastguard Worker 3 * kHeight / 4, 1, 1);
3434*8975f5c5SAndroid Build Coastguard Worker // Test 2, random region
3435*8975f5c5SAndroid Build Coastguard Worker test(2, flipX != 0, flipY != 0, kWidth / 5, 2 * kHeight / 7, kWidth / 6, kHeight / 4,
3436*8975f5c5SAndroid Build Coastguard Worker kWidth / 2, kHeight / 2);
3437*8975f5c5SAndroid Build Coastguard Worker }
3438*8975f5c5SAndroid Build Coastguard Worker }
3439*8975f5c5SAndroid Build Coastguard Worker }
3440*8975f5c5SAndroid Build Coastguard Worker
3441*8975f5c5SAndroid Build Coastguard Worker // Test blitting a depthStencil buffer with multiple depth values to a larger size.
TEST_P(BlitFramebufferTest,BlitDepthStencilPixelByPixel)3442*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, BlitDepthStencilPixelByPixel)
3443*8975f5c5SAndroid Build Coastguard Worker {
3444*8975f5c5SAndroid Build Coastguard Worker BlitDepthStencilPixelByPixelTestHelper(false /* mesaYFlip */);
3445*8975f5c5SAndroid Build Coastguard Worker }
3446*8975f5c5SAndroid Build Coastguard Worker
3447*8975f5c5SAndroid Build Coastguard Worker // Same as BlitDepthStencilPixelByPixel, but with y-flip flag set.
TEST_P(BlitFramebufferTest,BlitDepthStencilPixelByPixelMesaYFlip)3448*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, BlitDepthStencilPixelByPixelMesaYFlip)
3449*8975f5c5SAndroid Build Coastguard Worker {
3450*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
3451*8975f5c5SAndroid Build Coastguard Worker
3452*8975f5c5SAndroid Build Coastguard Worker BlitDepthStencilPixelByPixelTestHelper(true /* mesaYFlip */);
3453*8975f5c5SAndroid Build Coastguard Worker }
3454*8975f5c5SAndroid Build Coastguard Worker
3455*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug in the Vulkan backend where vkCmdResolveImage was used with
3456*8975f5c5SAndroid Build Coastguard Worker // out-of-bounds regions.
TEST_P(BlitFramebufferTestES31,OOBResolve)3457*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTestES31, OOBResolve)
3458*8975f5c5SAndroid Build Coastguard Worker {
3459*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kWidth = 16;
3460*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kHeight = 32;
3461*8975f5c5SAndroid Build Coastguard Worker
3462*8975f5c5SAndroid Build Coastguard Worker // Read framebuffer is multisampled.
3463*8975f5c5SAndroid Build Coastguard Worker GLTexture readTexture;
3464*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, readTexture);
3465*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, GL_TRUE);
3466*8975f5c5SAndroid Build Coastguard Worker
3467*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer readFbo;
3468*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, readFbo);
3469*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3470*8975f5c5SAndroid Build Coastguard Worker readTexture, 0);
3471*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3472*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3473*8975f5c5SAndroid Build Coastguard Worker
3474*8975f5c5SAndroid Build Coastguard Worker glClearColor(1, 0, 0, 1);
3475*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3476*8975f5c5SAndroid Build Coastguard Worker
3477*8975f5c5SAndroid Build Coastguard Worker // Draw framebuffer is single sampled.
3478*8975f5c5SAndroid Build Coastguard Worker GLTexture drawTexture;
3479*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, drawTexture);
3480*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
3481*8975f5c5SAndroid Build Coastguard Worker nullptr);
3482*8975f5c5SAndroid Build Coastguard Worker glGenerateMipmap(GL_TEXTURE_2D);
3483*8975f5c5SAndroid Build Coastguard Worker
3484*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFbo;
3485*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, drawFbo);
3486*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, drawTexture, 0);
3487*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3488*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3489*8975f5c5SAndroid Build Coastguard Worker
3490*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 1, 0, 1);
3491*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3492*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
3493*8975f5c5SAndroid Build Coastguard Worker
3494*8975f5c5SAndroid Build Coastguard Worker // Resolve the read framebuffer, using bounds that are outside the size of the image.
3495*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
3496*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(-kWidth * 2, -kHeight * 3, kWidth * 11, kHeight * 8, -kWidth * 2,
3497*8975f5c5SAndroid Build Coastguard Worker -kHeight * 3, kWidth * 11, kHeight * 8, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3498*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3499*8975f5c5SAndroid Build Coastguard Worker
3500*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFbo);
3501*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
3502*8975f5c5SAndroid Build Coastguard Worker }
3503*8975f5c5SAndroid Build Coastguard Worker
3504*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug in the Vulkan backend where vkCmdResolveImage was using the src extents
3505*8975f5c5SAndroid Build Coastguard Worker // as the resolve area instead of the area passed to glBlitFramebuffer.
TEST_P(BlitFramebufferTestES31,PartialResolve)3506*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTestES31, PartialResolve)
3507*8975f5c5SAndroid Build Coastguard Worker {
3508*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kWidth = 16;
3509*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kHeight = 32;
3510*8975f5c5SAndroid Build Coastguard Worker
3511*8975f5c5SAndroid Build Coastguard Worker // Read framebuffer is multisampled.
3512*8975f5c5SAndroid Build Coastguard Worker GLTexture readTexture;
3513*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, readTexture);
3514*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, GL_TRUE);
3515*8975f5c5SAndroid Build Coastguard Worker
3516*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer readFbo;
3517*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, readFbo);
3518*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3519*8975f5c5SAndroid Build Coastguard Worker readTexture, 0);
3520*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3521*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3522*8975f5c5SAndroid Build Coastguard Worker
3523*8975f5c5SAndroid Build Coastguard Worker glClearColor(1, 0, 0, 1);
3524*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3525*8975f5c5SAndroid Build Coastguard Worker
3526*8975f5c5SAndroid Build Coastguard Worker // Draw framebuffer is single sampled. It's bound to a texture with base level the same size as
3527*8975f5c5SAndroid Build Coastguard Worker // the read framebuffer, but it's bound to mip 1.
3528*8975f5c5SAndroid Build Coastguard Worker GLTexture drawTexture;
3529*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, drawTexture);
3530*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
3531*8975f5c5SAndroid Build Coastguard Worker nullptr);
3532*8975f5c5SAndroid Build Coastguard Worker glGenerateMipmap(GL_TEXTURE_2D);
3533*8975f5c5SAndroid Build Coastguard Worker
3534*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFbo;
3535*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, drawFbo);
3536*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, drawTexture, 1);
3537*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3538*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3539*8975f5c5SAndroid Build Coastguard Worker
3540*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 1, 0, 1);
3541*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3542*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kWidth / 2, kHeight / 2, GLColor::green);
3543*8975f5c5SAndroid Build Coastguard Worker
3544*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kResolveX0 = 1;
3545*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kResolveY0 = 2;
3546*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kResolveX1 = 4;
3547*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kResolveY1 = 6;
3548*8975f5c5SAndroid Build Coastguard Worker
3549*8975f5c5SAndroid Build Coastguard Worker // Resolve only a portion of the read framebuffer.
3550*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
3551*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(kResolveX0, kResolveY0, kResolveX1, kResolveY1, kResolveX0, kResolveY0,
3552*8975f5c5SAndroid Build Coastguard Worker kResolveX1, kResolveY1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3553*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3554*8975f5c5SAndroid Build Coastguard Worker
3555*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFbo);
3556*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kWidth / 2, kResolveY0, GLColor::green);
3557*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kResolveX0, kHeight / 2, GLColor::green);
3558*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(kResolveX1, 0, kWidth / 2 - kResolveX1, kHeight / 2, GLColor::green);
3559*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, kResolveY1, kWidth / 2, kHeight / 2 - kResolveY1, GLColor::green);
3560*8975f5c5SAndroid Build Coastguard Worker
3561*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(kResolveX0, kResolveY0, kResolveX1 - kResolveX0, kResolveY1 - kResolveY0,
3562*8975f5c5SAndroid Build Coastguard Worker GLColor::red);
3563*8975f5c5SAndroid Build Coastguard Worker }
3564*8975f5c5SAndroid Build Coastguard Worker
3565*8975f5c5SAndroid Build Coastguard Worker // Test that a draw call to a small FBO followed by a resolve of a large FBO works.
TEST_P(BlitFramebufferTestES31,DrawToSmallFBOThenResolveLargeFBO)3566*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTestES31, DrawToSmallFBOThenResolveLargeFBO)
3567*8975f5c5SAndroid Build Coastguard Worker {
3568*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS[2];
3569*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS[2];
3570*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboSS;
3571*8975f5c5SAndroid Build Coastguard Worker GLTexture textureSS;
3572*8975f5c5SAndroid Build Coastguard Worker
3573*8975f5c5SAndroid Build Coastguard Worker // A bug in the Vulkan backend grew the render area of the previous render pass on blit, even
3574*8975f5c5SAndroid Build Coastguard Worker // though the previous render pass belonged to an unrelated framebuffer. This test only needs
3575*8975f5c5SAndroid Build Coastguard Worker // to make sure that the FBO being resolved is not strictly smaller than the previous FBO which
3576*8975f5c5SAndroid Build Coastguard Worker // was drawn to.
3577*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kLargeWidth = 127;
3578*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kLargeHeight = 54;
3579*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSmallWidth = 37;
3580*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSmallHeight = 79;
3581*8975f5c5SAndroid Build Coastguard Worker
3582*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3583*8975f5c5SAndroid Build Coastguard Worker
3584*8975f5c5SAndroid Build Coastguard Worker // Create resolve target.
3585*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textureSS);
3586*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kLargeWidth, kLargeHeight);
3587*8975f5c5SAndroid Build Coastguard Worker
3588*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
3589*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureSS, 0);
3590*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3591*8975f5c5SAndroid Build Coastguard Worker
3592*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffers and draw into them one by one.
3593*8975f5c5SAndroid Build Coastguard Worker for (size_t fboIndex = 0; fboIndex < 2; ++fboIndex)
3594*8975f5c5SAndroid Build Coastguard Worker {
3595*8975f5c5SAndroid Build Coastguard Worker const GLsizei width = fboIndex == 0 ? kLargeWidth : kSmallWidth;
3596*8975f5c5SAndroid Build Coastguard Worker const GLsizei height = fboIndex == 0 ? kLargeHeight : kSmallHeight;
3597*8975f5c5SAndroid Build Coastguard Worker
3598*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureMS[fboIndex]);
3599*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, width, height, GL_TRUE);
3600*8975f5c5SAndroid Build Coastguard Worker
3601*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS[fboIndex]);
3602*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3603*8975f5c5SAndroid Build Coastguard Worker textureMS[fboIndex], 0);
3604*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3605*8975f5c5SAndroid Build Coastguard Worker
3606*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, width, height);
3607*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.8f);
3608*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3609*8975f5c5SAndroid Build Coastguard Worker }
3610*8975f5c5SAndroid Build Coastguard Worker
3611*8975f5c5SAndroid Build Coastguard Worker // Resolve the first FBO
3612*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboSS);
3613*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fboMS[0]);
3614*8975f5c5SAndroid Build Coastguard Worker
3615*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kLargeWidth, kLargeHeight);
3616*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kLargeWidth, kLargeHeight, 0, 0, kLargeWidth, kLargeHeight,
3617*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT, GL_NEAREST);
3618*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3619*8975f5c5SAndroid Build Coastguard Worker
3620*8975f5c5SAndroid Build Coastguard Worker // Verify the resolve
3621*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fboSS);
3622*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3623*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kLargeWidth - 1, kLargeHeight - 1, GLColor::red);
3624*8975f5c5SAndroid Build Coastguard Worker }
3625*8975f5c5SAndroid Build Coastguard Worker
3626*8975f5c5SAndroid Build Coastguard Worker // Blit a multisampled RGBX8 framebuffer to an RGB8 framebuffer.
TEST_P(BlitFramebufferTestES31,BlitMultisampledRGBX8ToRGB8)3627*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTestES31, BlitMultisampledRGBX8ToRGB8)
3628*8975f5c5SAndroid Build Coastguard Worker {
3629*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_rgbx_internal_format"));
3630*8975f5c5SAndroid Build Coastguard Worker
3631*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kWidth = 256;
3632*8975f5c5SAndroid Build Coastguard Worker constexpr const GLsizei kHeight = 256;
3633*8975f5c5SAndroid Build Coastguard Worker
3634*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
3635*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer targetRBO;
3636*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer sourceFBO, targetFBO;
3637*8975f5c5SAndroid Build Coastguard Worker
3638*8975f5c5SAndroid Build Coastguard Worker // Initialize a source multisampled FBO with checker pattern
3639*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureMS);
3640*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBX8_ANGLE, kWidth, kHeight,
3641*8975f5c5SAndroid Build Coastguard Worker GL_TRUE);
3642*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3643*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, sourceFBO);
3644*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3645*8975f5c5SAndroid Build Coastguard Worker textureMS, 0);
3646*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3647*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(checkerProgram, essl1_shaders::vs::Passthrough(),
3648*8975f5c5SAndroid Build Coastguard Worker essl1_shaders::fs::Checkered());
3649*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kWidth, kHeight);
3650*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, sourceFBO);
3651*8975f5c5SAndroid Build Coastguard Worker drawQuad(checkerProgram, essl1_shaders::PositionAttrib(), 0.5f);
3652*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3653*8975f5c5SAndroid Build Coastguard Worker
3654*8975f5c5SAndroid Build Coastguard Worker // Initialize the destination FBO
3655*8975f5c5SAndroid Build Coastguard Worker initColorFBO(&targetFBO, &targetRBO, GL_RGB8, kWidth, kHeight);
3656*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3657*8975f5c5SAndroid Build Coastguard Worker
3658*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
3659*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFBO);
3660*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3661*8975f5c5SAndroid Build Coastguard Worker
3662*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kWidth, kHeight);
3663*8975f5c5SAndroid Build Coastguard Worker
3664*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
3665*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3666*8975f5c5SAndroid Build Coastguard Worker
3667*8975f5c5SAndroid Build Coastguard Worker // Scale down without flipping.
3668*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
3669*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3670*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3671*8975f5c5SAndroid Build Coastguard Worker
3672*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
3673*8975f5c5SAndroid Build Coastguard Worker
3674*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, kHeight / 4, GLColor::red);
3675*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kWidth / 4, 3 * kHeight / 4, GLColor::green);
3676*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, kHeight / 4, GLColor::blue);
3677*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::yellow);
3678*8975f5c5SAndroid Build Coastguard Worker }
3679*8975f5c5SAndroid Build Coastguard Worker
3680*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit. Draw flipped, resolve with read fbo flipped.
TEST_P(BlitFramebufferTestES31,MultisampleFlippedResolveReadWithBlitAndFlippedDraw)3681*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTestES31, MultisampleFlippedResolveReadWithBlitAndFlippedDraw)
3682*8975f5c5SAndroid Build Coastguard Worker {
3683*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
3684*8975f5c5SAndroid Build Coastguard Worker
3685*8975f5c5SAndroid Build Coastguard Worker constexpr int kSize = 16;
3686*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
3687*8975f5c5SAndroid Build Coastguard Worker
3688*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer msaaFBO;
3689*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3690*8975f5c5SAndroid Build Coastguard Worker
3691*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
3692*8975f5c5SAndroid Build Coastguard Worker
3693*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3694*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
3695*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3696*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3697*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
3698*8975f5c5SAndroid Build Coastguard Worker 0);
3699*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3700*8975f5c5SAndroid Build Coastguard Worker
3701*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
3702*8975f5c5SAndroid Build Coastguard Worker essl31_shaders::fs::RedGreenGradient());
3703*8975f5c5SAndroid Build Coastguard Worker drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3704*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3705*8975f5c5SAndroid Build Coastguard Worker
3706*8975f5c5SAndroid Build Coastguard Worker // Create another FBO to resolve the multisample buffer into.
3707*8975f5c5SAndroid Build Coastguard Worker GLTexture resolveTexture;
3708*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer resolveFBO;
3709*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, resolveTexture);
3710*8975f5c5SAndroid Build Coastguard Worker constexpr int kResolveFBOWidth = kSize - 3;
3711*8975f5c5SAndroid Build Coastguard Worker constexpr int kResolveFBOHeight = kSize - 2;
3712*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kResolveFBOWidth, kResolveFBOHeight, 0, GL_RGBA,
3713*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
3714*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3715*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
3716*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3717*8975f5c5SAndroid Build Coastguard Worker
3718*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3719*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_READ_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
3720*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3721*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kResolveFBOWidth, kResolveFBOHeight, 0, 0, kResolveFBOWidth,
3722*8975f5c5SAndroid Build Coastguard Worker kResolveFBOHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3723*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3724*8975f5c5SAndroid Build Coastguard Worker
3725*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3726*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
3727*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3728*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, 0, 199, kHalfPixelGradient, 0, 255, 1.0);
3729*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(0, kResolveFBOHeight - 1, kHalfPixelGradient, 215, 0, 255, 1.0);
3730*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, kResolveFBOHeight - 1, 199, 215, 0, 255, 1.0);
3731*8975f5c5SAndroid Build Coastguard Worker }
3732*8975f5c5SAndroid Build Coastguard Worker
3733*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit. Draw non-flipped, resolve with read fbo flipped.
TEST_P(BlitFramebufferTestES31,MultisampleFlippedResolveReadWithBlitAndNonFlippedDraw)3734*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTestES31, MultisampleFlippedResolveReadWithBlitAndNonFlippedDraw)
3735*8975f5c5SAndroid Build Coastguard Worker {
3736*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
3737*8975f5c5SAndroid Build Coastguard Worker
3738*8975f5c5SAndroid Build Coastguard Worker constexpr int kSize = 16;
3739*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
3740*8975f5c5SAndroid Build Coastguard Worker
3741*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer msaaFBO;
3742*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3743*8975f5c5SAndroid Build Coastguard Worker
3744*8975f5c5SAndroid Build Coastguard Worker // Draw non-flipped - explicitly set y-flip to 0.
3745*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
3746*8975f5c5SAndroid Build Coastguard Worker
3747*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3748*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
3749*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3750*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3751*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
3752*8975f5c5SAndroid Build Coastguard Worker 0);
3753*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3754*8975f5c5SAndroid Build Coastguard Worker
3755*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
3756*8975f5c5SAndroid Build Coastguard Worker essl31_shaders::fs::RedGreenGradient());
3757*8975f5c5SAndroid Build Coastguard Worker drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3758*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3759*8975f5c5SAndroid Build Coastguard Worker
3760*8975f5c5SAndroid Build Coastguard Worker // Create another FBO to resolve the multisample buffer into.
3761*8975f5c5SAndroid Build Coastguard Worker GLTexture resolveTexture;
3762*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer resolveFBO;
3763*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, resolveTexture);
3764*8975f5c5SAndroid Build Coastguard Worker constexpr int kResolveFBOWidth = kSize - 3;
3765*8975f5c5SAndroid Build Coastguard Worker constexpr int kResolveFBOHeight = kSize - 2;
3766*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kResolveFBOWidth, kResolveFBOHeight, 0, GL_RGBA,
3767*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
3768*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3769*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
3770*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3771*8975f5c5SAndroid Build Coastguard Worker
3772*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3773*8975f5c5SAndroid Build Coastguard Worker // Resolve with read fbo flipped and draw fbo non-flipped
3774*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_READ_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
3775*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3776*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kResolveFBOWidth, kResolveFBOHeight, 0, 0, kResolveFBOWidth,
3777*8975f5c5SAndroid Build Coastguard Worker kResolveFBOHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3778*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3779*8975f5c5SAndroid Build Coastguard Worker
3780*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3781*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
3782*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
3783*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, 0, 199, 255 - kHalfPixelGradient, 0, 255, 1.0);
3784*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(0, kResolveFBOHeight - 1, kHalfPixelGradient, 40, 0, 255, 1.0);
3785*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, kResolveFBOHeight - 1, 199, 40, 0, 255, 1.0);
3786*8975f5c5SAndroid Build Coastguard Worker }
3787*8975f5c5SAndroid Build Coastguard Worker
3788*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit. Draw non-flipped, resolve with draw fbo flipped
TEST_P(BlitFramebufferTestES31,MultisampleFlippedResolveDrawWithBlitAndNonFlippedDraw)3789*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTestES31, MultisampleFlippedResolveDrawWithBlitAndNonFlippedDraw)
3790*8975f5c5SAndroid Build Coastguard Worker {
3791*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
3792*8975f5c5SAndroid Build Coastguard Worker
3793*8975f5c5SAndroid Build Coastguard Worker constexpr int kSize = 16;
3794*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
3795*8975f5c5SAndroid Build Coastguard Worker
3796*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer msaaFBO;
3797*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3798*8975f5c5SAndroid Build Coastguard Worker
3799*8975f5c5SAndroid Build Coastguard Worker // Draw non-flipped - explicitly set y-flip to 0.
3800*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
3801*8975f5c5SAndroid Build Coastguard Worker
3802*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3803*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
3804*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3805*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3806*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
3807*8975f5c5SAndroid Build Coastguard Worker 0);
3808*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3809*8975f5c5SAndroid Build Coastguard Worker
3810*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
3811*8975f5c5SAndroid Build Coastguard Worker essl31_shaders::fs::RedGreenGradient());
3812*8975f5c5SAndroid Build Coastguard Worker drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3813*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3814*8975f5c5SAndroid Build Coastguard Worker
3815*8975f5c5SAndroid Build Coastguard Worker // Create another FBO to resolve the multisample buffer into.
3816*8975f5c5SAndroid Build Coastguard Worker GLTexture resolveTexture;
3817*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer resolveFBO;
3818*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, resolveTexture);
3819*8975f5c5SAndroid Build Coastguard Worker constexpr int kResolveFBOWidth = kSize - 3;
3820*8975f5c5SAndroid Build Coastguard Worker constexpr int kResolveFBOHeight = kSize - 2;
3821*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kResolveFBOWidth, kResolveFBOHeight, 0, GL_RGBA,
3822*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
3823*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3824*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
3825*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3826*8975f5c5SAndroid Build Coastguard Worker
3827*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3828*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3829*8975f5c5SAndroid Build Coastguard Worker // Resolve with draw fbo flipped and read fbo non-flipped.
3830*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_READ_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
3831*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
3832*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kResolveFBOWidth, kResolveFBOHeight, 0, 0, kResolveFBOWidth,
3833*8975f5c5SAndroid Build Coastguard Worker kResolveFBOHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3834*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3835*8975f5c5SAndroid Build Coastguard Worker
3836*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3837*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
3838*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3839*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, 0, 199, kHalfPixelGradient, 0, 255, 1.0);
3840*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(0, kResolveFBOHeight - 1, kHalfPixelGradient, 215, 0, 255, 1.0);
3841*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, kResolveFBOHeight - 1, 199, 215, 0, 255, 1.0);
3842*8975f5c5SAndroid Build Coastguard Worker }
3843*8975f5c5SAndroid Build Coastguard Worker
3844*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit. Draw non-flipped, resolve with both read and
3845*8975f5c5SAndroid Build Coastguard Worker // draw fbos flipped
TEST_P(BlitFramebufferTestES31,MultisampleFlippedResolveWithBlitAndNonFlippedDraw)3846*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTestES31, MultisampleFlippedResolveWithBlitAndNonFlippedDraw)
3847*8975f5c5SAndroid Build Coastguard Worker {
3848*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
3849*8975f5c5SAndroid Build Coastguard Worker
3850*8975f5c5SAndroid Build Coastguard Worker constexpr int kSize = 16;
3851*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
3852*8975f5c5SAndroid Build Coastguard Worker
3853*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer msaaFBO;
3854*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3855*8975f5c5SAndroid Build Coastguard Worker
3856*8975f5c5SAndroid Build Coastguard Worker // Draw non-flipped - explicitly set y-flip to 0.
3857*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
3858*8975f5c5SAndroid Build Coastguard Worker
3859*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3860*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
3861*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3862*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3863*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
3864*8975f5c5SAndroid Build Coastguard Worker 0);
3865*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3866*8975f5c5SAndroid Build Coastguard Worker
3867*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
3868*8975f5c5SAndroid Build Coastguard Worker essl31_shaders::fs::RedGreenGradient());
3869*8975f5c5SAndroid Build Coastguard Worker drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3870*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3871*8975f5c5SAndroid Build Coastguard Worker
3872*8975f5c5SAndroid Build Coastguard Worker // Create another FBO to resolve the multisample buffer into.
3873*8975f5c5SAndroid Build Coastguard Worker GLTexture resolveTexture;
3874*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer resolveFBO;
3875*8975f5c5SAndroid Build Coastguard Worker constexpr int kResolveFBOWidth = kSize - 3;
3876*8975f5c5SAndroid Build Coastguard Worker constexpr int kResolveFBOHeight = kSize - 2;
3877*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, resolveTexture);
3878*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kResolveFBOWidth, kResolveFBOHeight, 0, GL_RGBA,
3879*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
3880*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3881*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
3882*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3883*8975f5c5SAndroid Build Coastguard Worker
3884*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3885*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3886*8975f5c5SAndroid Build Coastguard Worker // Resolve with draw and read fbo flipped.
3887*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_READ_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
3888*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
3889*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kResolveFBOWidth, kResolveFBOHeight, 0, 0, kResolveFBOWidth,
3890*8975f5c5SAndroid Build Coastguard Worker kResolveFBOHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3891*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3892*8975f5c5SAndroid Build Coastguard Worker
3893*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3894*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
3895*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
3896*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, 0, 199, 255 - kHalfPixelGradient, 0, 255, 1.0);
3897*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(0, kResolveFBOHeight - 1, kHalfPixelGradient, 40, 0, 255, 1.0);
3898*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, kResolveFBOHeight - 1, 199, 40, 0, 255, 1.0);
3899*8975f5c5SAndroid Build Coastguard Worker }
3900*8975f5c5SAndroid Build Coastguard Worker
3901*8975f5c5SAndroid Build Coastguard Worker // Test resolving into smaller framebuffer.
TEST_P(BlitFramebufferTest,ResolveIntoSmallerFramebuffer)3902*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, ResolveIntoSmallerFramebuffer)
3903*8975f5c5SAndroid Build Coastguard Worker {
3904*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint kSize[2] = {40, 32};
3905*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize[0], kSize[0]);
3906*8975f5c5SAndroid Build Coastguard Worker
3907*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo[2];
3908*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo[2];
3909*8975f5c5SAndroid Build Coastguard Worker
3910*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i)
3911*8975f5c5SAndroid Build Coastguard Worker {
3912*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo[i]);
3913*8975f5c5SAndroid Build Coastguard Worker if (i == 0)
3914*8975f5c5SAndroid Build Coastguard Worker {
3915*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, kSize[i], kSize[i]);
3916*8975f5c5SAndroid Build Coastguard Worker }
3917*8975f5c5SAndroid Build Coastguard Worker else
3918*8975f5c5SAndroid Build Coastguard Worker {
3919*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize[i], kSize[i]);
3920*8975f5c5SAndroid Build Coastguard Worker }
3921*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo[i]);
3922*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[i]);
3923*8975f5c5SAndroid Build Coastguard Worker }
3924*8975f5c5SAndroid Build Coastguard Worker
3925*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3926*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
3927*8975f5c5SAndroid Build Coastguard Worker
3928*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]);
3929*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.3f);
3930*8975f5c5SAndroid Build Coastguard Worker
3931*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo[1]);
3932*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize[1], kSize[1], 0, 0, kSize[1], kSize[1], GL_COLOR_BUFFER_BIT,
3933*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3934*8975f5c5SAndroid Build Coastguard Worker
3935*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo[1]);
3936*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kSize[1], kSize[1], GLColor::red);
3937*8975f5c5SAndroid Build Coastguard Worker }
3938*8975f5c5SAndroid Build Coastguard Worker
3939*8975f5c5SAndroid Build Coastguard Worker // Test resolving into bigger framebuffer.
TEST_P(BlitFramebufferTest,ResolveIntoBiggerFramebuffer)3940*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, ResolveIntoBiggerFramebuffer)
3941*8975f5c5SAndroid Build Coastguard Worker {
3942*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint kSize[2] = {32, 40};
3943*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize[0], kSize[0]);
3944*8975f5c5SAndroid Build Coastguard Worker
3945*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo[2];
3946*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo[2];
3947*8975f5c5SAndroid Build Coastguard Worker
3948*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i)
3949*8975f5c5SAndroid Build Coastguard Worker {
3950*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo[i]);
3951*8975f5c5SAndroid Build Coastguard Worker if (i == 0)
3952*8975f5c5SAndroid Build Coastguard Worker {
3953*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, kSize[i], kSize[i]);
3954*8975f5c5SAndroid Build Coastguard Worker }
3955*8975f5c5SAndroid Build Coastguard Worker else
3956*8975f5c5SAndroid Build Coastguard Worker {
3957*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize[i], kSize[i]);
3958*8975f5c5SAndroid Build Coastguard Worker }
3959*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo[i]);
3960*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[i]);
3961*8975f5c5SAndroid Build Coastguard Worker }
3962*8975f5c5SAndroid Build Coastguard Worker
3963*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3964*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
3965*8975f5c5SAndroid Build Coastguard Worker
3966*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]);
3967*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.3f);
3968*8975f5c5SAndroid Build Coastguard Worker
3969*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo[1]);
3970*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize[1], kSize[1], 0, 0, kSize[1], kSize[1], GL_COLOR_BUFFER_BIT,
3971*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
3972*8975f5c5SAndroid Build Coastguard Worker
3973*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo[1]);
3974*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kSize[0], kSize[0], GLColor::red);
3975*8975f5c5SAndroid Build Coastguard Worker }
3976*8975f5c5SAndroid Build Coastguard Worker
3977*8975f5c5SAndroid Build Coastguard Worker // Test resolving into a rotated framebuffer
TEST_P(BlitFramebufferTest,ResolveWithRotation)3978*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, ResolveWithRotation)
3979*8975f5c5SAndroid Build Coastguard Worker {
3980*8975f5c5SAndroid Build Coastguard Worker const GLint w = getWindowWidth();
3981*8975f5c5SAndroid Build Coastguard Worker const GLint h = getWindowHeight();
3982*8975f5c5SAndroid Build Coastguard Worker
3983*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, w, h);
3984*8975f5c5SAndroid Build Coastguard Worker
3985*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo;
3986*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
3987*8975f5c5SAndroid Build Coastguard Worker
3988*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
3989*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, w, h);
3990*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3991*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
3992*8975f5c5SAndroid Build Coastguard Worker
3993*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Checkered());
3994*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
3995*8975f5c5SAndroid Build Coastguard Worker
3996*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3997*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.3f);
3998*8975f5c5SAndroid Build Coastguard Worker
3999*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
4000*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST);
4001*8975f5c5SAndroid Build Coastguard Worker
4002*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
4003*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::red);
4004*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::blue);
4005*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::green);
4006*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::yellow);
4007*8975f5c5SAndroid Build Coastguard Worker }
4008*8975f5c5SAndroid Build Coastguard Worker
4009*8975f5c5SAndroid Build Coastguard Worker // Test blitting a 3D texture to a 3D texture
TEST_P(BlitFramebufferTest,Blit3D)4010*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, Blit3D)
4011*8975f5c5SAndroid Build Coastguard Worker {
4012*8975f5c5SAndroid Build Coastguard Worker test3DBlit(GL_TEXTURE_3D, GL_TEXTURE_3D);
4013*8975f5c5SAndroid Build Coastguard Worker }
4014*8975f5c5SAndroid Build Coastguard Worker
4015*8975f5c5SAndroid Build Coastguard Worker // Test blitting a 2D array texture to a 2D array texture
TEST_P(BlitFramebufferTest,Blit2DArray)4016*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, Blit2DArray)
4017*8975f5c5SAndroid Build Coastguard Worker {
4018*8975f5c5SAndroid Build Coastguard Worker test3DBlit(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_2D_ARRAY);
4019*8975f5c5SAndroid Build Coastguard Worker }
4020*8975f5c5SAndroid Build Coastguard Worker
4021*8975f5c5SAndroid Build Coastguard Worker // Test blitting a 3D texture to a 2D array texture
TEST_P(BlitFramebufferTest,Blit3DTo2DArray)4022*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, Blit3DTo2DArray)
4023*8975f5c5SAndroid Build Coastguard Worker {
4024*8975f5c5SAndroid Build Coastguard Worker test3DBlit(GL_TEXTURE_3D, GL_TEXTURE_2D_ARRAY);
4025*8975f5c5SAndroid Build Coastguard Worker }
4026*8975f5c5SAndroid Build Coastguard Worker
4027*8975f5c5SAndroid Build Coastguard Worker // Test blitting a 2D array texture to a 3D texture
TEST_P(BlitFramebufferTest,Blit2DArrayTo3D)4028*8975f5c5SAndroid Build Coastguard Worker TEST_P(BlitFramebufferTest, Blit2DArrayTo3D)
4029*8975f5c5SAndroid Build Coastguard Worker {
4030*8975f5c5SAndroid Build Coastguard Worker test3DBlit(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D);
4031*8975f5c5SAndroid Build Coastguard Worker }
4032*8975f5c5SAndroid Build Coastguard Worker
4033*8975f5c5SAndroid Build Coastguard Worker // Use this to select which configurations (e.g. which renderer, which GLES major version) these
4034*8975f5c5SAndroid Build Coastguard Worker // tests should be run against.
4035*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlitFramebufferANGLETest);
4036*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(BlitFramebufferANGLETest,
4037*8975f5c5SAndroid Build Coastguard Worker ES2_D3D9(),
4038*8975f5c5SAndroid Build Coastguard Worker ES2_D3D11(),
4039*8975f5c5SAndroid Build Coastguard Worker ES2_D3D11_PRESENT_PATH_FAST(),
4040*8975f5c5SAndroid Build Coastguard Worker ES2_OPENGL(),
4041*8975f5c5SAndroid Build Coastguard Worker ES3_OPENGL(),
4042*8975f5c5SAndroid Build Coastguard Worker ES2_VULKAN(),
4043*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN(),
4044*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().enable(Feature::EmulatedPrerotation90),
4045*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().enable(Feature::EmulatedPrerotation180),
4046*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().enable(Feature::EmulatedPrerotation270),
4047*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN()
4048*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState)
4049*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState2),
4050*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::SupportsExtendedDynamicState2),
4051*8975f5c5SAndroid Build Coastguard Worker ES2_METAL(),
4052*8975f5c5SAndroid Build Coastguard Worker ES2_METAL().disable(Feature::HasShaderStencilOutput));
4053*8975f5c5SAndroid Build Coastguard Worker
4054*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlitFramebufferTest);
4055*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(BlitFramebufferTest,
4056*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().enable(Feature::EmulatedPrerotation90),
4057*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().enable(Feature::EmulatedPrerotation180),
4058*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().enable(Feature::EmulatedPrerotation270),
4059*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN()
4060*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState)
4061*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState2),
4062*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::SupportsExtendedDynamicState2),
4063*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().enable(Feature::DisableFlippingBlitWithCommand),
4064*8975f5c5SAndroid Build Coastguard Worker ES3_METAL().disable(Feature::HasShaderStencilOutput));
4065*8975f5c5SAndroid Build Coastguard Worker
4066*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlitFramebufferTestES31);
4067*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(BlitFramebufferTestES31);
4068*8975f5c5SAndroid Build Coastguard Worker } // namespace
4069