1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 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 // MultisampledRenderToTextureTest: Tests of EXT_multisampled_render_to_texture extension
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker namespace
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker
19*8975f5c5SAndroid Build Coastguard Worker using MultisampledRenderToTextureTestParams = std::tuple<angle::PlatformParameters, bool>;
20*8975f5c5SAndroid Build Coastguard Worker
PrintToStringParamName(const::testing::TestParamInfo<MultisampledRenderToTextureTestParams> & info)21*8975f5c5SAndroid Build Coastguard Worker std::string PrintToStringParamName(
22*8975f5c5SAndroid Build Coastguard Worker const ::testing::TestParamInfo<MultisampledRenderToTextureTestParams> &info)
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker std::stringstream ss;
25*8975f5c5SAndroid Build Coastguard Worker ss << std::get<0>(info.param);
26*8975f5c5SAndroid Build Coastguard Worker if (std::get<1>(info.param))
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker ss << "_RobustResourceInit";
29*8975f5c5SAndroid Build Coastguard Worker }
30*8975f5c5SAndroid Build Coastguard Worker return ss.str();
31*8975f5c5SAndroid Build Coastguard Worker }
32*8975f5c5SAndroid Build Coastguard Worker
33*8975f5c5SAndroid Build Coastguard Worker class MultisampledRenderToTextureTest : public ANGLETest<MultisampledRenderToTextureTestParams>
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker protected:
MultisampledRenderToTextureTest()36*8975f5c5SAndroid Build Coastguard Worker MultisampledRenderToTextureTest()
37*8975f5c5SAndroid Build Coastguard Worker {
38*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(64);
39*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(64);
40*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
41*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
42*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
43*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Worker setRobustResourceInit(::testing::get<1>(GetParam()));
46*8975f5c5SAndroid Build Coastguard Worker forceNewDisplay();
47*8975f5c5SAndroid Build Coastguard Worker }
48*8975f5c5SAndroid Build Coastguard Worker
testSetUp()49*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
50*8975f5c5SAndroid Build Coastguard Worker {
51*8975f5c5SAndroid Build Coastguard Worker if (getClientMajorVersion() >= 3 && getClientMinorVersion() >= 1)
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &mMaxIntegerSamples);
54*8975f5c5SAndroid Build Coastguard Worker }
55*8975f5c5SAndroid Build Coastguard Worker }
56*8975f5c5SAndroid Build Coastguard Worker
testTearDown()57*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override {}
58*8975f5c5SAndroid Build Coastguard Worker
assertErrorIfNotMSRTT2(GLenum error)59*8975f5c5SAndroid Build Coastguard Worker void assertErrorIfNotMSRTT2(GLenum error)
60*8975f5c5SAndroid Build Coastguard Worker {
61*8975f5c5SAndroid Build Coastguard Worker if (EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2"))
62*8975f5c5SAndroid Build Coastguard Worker {
63*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
64*8975f5c5SAndroid Build Coastguard Worker }
65*8975f5c5SAndroid Build Coastguard Worker else
66*8975f5c5SAndroid Build Coastguard Worker {
67*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(error);
68*8975f5c5SAndroid Build Coastguard Worker }
69*8975f5c5SAndroid Build Coastguard Worker }
70*8975f5c5SAndroid Build Coastguard Worker
setupCopyTexProgram()71*8975f5c5SAndroid Build Coastguard Worker void setupCopyTexProgram()
72*8975f5c5SAndroid Build Coastguard Worker {
73*8975f5c5SAndroid Build Coastguard Worker mCopyTextureProgram.makeRaster(essl1_shaders::vs::Texture2D(),
74*8975f5c5SAndroid Build Coastguard Worker essl1_shaders::fs::Texture2D());
75*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_TRUE(mCopyTextureProgram.valid());
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker mCopyTextureUniformLocation =
78*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(mCopyTextureProgram, essl1_shaders::Texture2DUniform());
79*8975f5c5SAndroid Build Coastguard Worker
80*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker
setupUniformColorProgramMultiRenderTarget(const bool bufferEnabled[8],GLuint * programOut)83*8975f5c5SAndroid Build Coastguard Worker void setupUniformColorProgramMultiRenderTarget(const bool bufferEnabled[8], GLuint *programOut)
84*8975f5c5SAndroid Build Coastguard Worker {
85*8975f5c5SAndroid Build Coastguard Worker std::stringstream fs;
86*8975f5c5SAndroid Build Coastguard Worker
87*8975f5c5SAndroid Build Coastguard Worker fs << "#extension GL_EXT_draw_buffers : enable\n"
88*8975f5c5SAndroid Build Coastguard Worker "precision highp float;\n"
89*8975f5c5SAndroid Build Coastguard Worker "uniform mediump vec4 "
90*8975f5c5SAndroid Build Coastguard Worker << essl1_shaders::ColorUniform()
91*8975f5c5SAndroid Build Coastguard Worker << ";\n"
92*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
93*8975f5c5SAndroid Build Coastguard Worker "{\n";
94*8975f5c5SAndroid Build Coastguard Worker
95*8975f5c5SAndroid Build Coastguard Worker for (unsigned int index = 0; index < 8; index++)
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker if (bufferEnabled[index])
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker fs << " gl_FragData[" << index << "] = " << essl1_shaders::ColorUniform()
100*8975f5c5SAndroid Build Coastguard Worker << ";\n";
101*8975f5c5SAndroid Build Coastguard Worker }
102*8975f5c5SAndroid Build Coastguard Worker }
103*8975f5c5SAndroid Build Coastguard Worker
104*8975f5c5SAndroid Build Coastguard Worker fs << "}\n";
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Worker *programOut = CompileProgram(essl1_shaders::vs::Simple(), fs.str().c_str());
107*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(*programOut, 0u);
108*8975f5c5SAndroid Build Coastguard Worker }
109*8975f5c5SAndroid Build Coastguard Worker
verifyResults(GLuint texture,const GLColor expected,GLint fboSize,GLint xs,GLint ys,GLint xe,GLint ye)110*8975f5c5SAndroid Build Coastguard Worker void verifyResults(GLuint texture,
111*8975f5c5SAndroid Build Coastguard Worker const GLColor expected,
112*8975f5c5SAndroid Build Coastguard Worker GLint fboSize,
113*8975f5c5SAndroid Build Coastguard Worker GLint xs,
114*8975f5c5SAndroid Build Coastguard Worker GLint ys,
115*8975f5c5SAndroid Build Coastguard Worker GLint xe,
116*8975f5c5SAndroid Build Coastguard Worker GLint ye)
117*8975f5c5SAndroid Build Coastguard Worker {
118*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, fboSize, fboSize);
119*8975f5c5SAndroid Build Coastguard Worker
120*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
121*8975f5c5SAndroid Build Coastguard Worker
122*8975f5c5SAndroid Build Coastguard Worker // Draw a quad with the target texture
123*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mCopyTextureProgram);
124*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
125*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mCopyTextureUniformLocation, 0);
126*8975f5c5SAndroid Build Coastguard Worker
127*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
128*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_STENCIL_TEST);
129*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_BLEND);
130*8975f5c5SAndroid Build Coastguard Worker glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
131*8975f5c5SAndroid Build Coastguard Worker drawQuad(mCopyTextureProgram, essl1_shaders::PositionAttrib(), 0.5f);
132*8975f5c5SAndroid Build Coastguard Worker
133*8975f5c5SAndroid Build Coastguard Worker // Expect that the rendered quad has the same color as the source texture
134*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(xs, ys, expected, 1.0);
135*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(xs, ye - 1, expected, 1.0);
136*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(xe - 1, ys, expected, 1.0);
137*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(xe - 1, ye - 1, expected, 1.0);
138*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR((xs + xe) / 2, (ys + ye) / 2, expected, 1.0);
139*8975f5c5SAndroid Build Coastguard Worker }
140*8975f5c5SAndroid Build Coastguard Worker
clearAndDrawQuad(GLuint program,GLsizei viewportWidth,GLsizei viewportHeight)141*8975f5c5SAndroid Build Coastguard Worker void clearAndDrawQuad(GLuint program, GLsizei viewportWidth, GLsizei viewportHeight)
142*8975f5c5SAndroid Build Coastguard Worker {
143*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
144*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
145*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, viewportWidth, viewportHeight);
146*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
147*8975f5c5SAndroid Build Coastguard Worker
148*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
149*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
150*8975f5c5SAndroid Build Coastguard Worker }
151*8975f5c5SAndroid Build Coastguard Worker
152*8975f5c5SAndroid Build Coastguard Worker struct GLType
153*8975f5c5SAndroid Build Coastguard Worker {
154*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat;
155*8975f5c5SAndroid Build Coastguard Worker GLenum format;
156*8975f5c5SAndroid Build Coastguard Worker GLenum type;
157*8975f5c5SAndroid Build Coastguard Worker };
158*8975f5c5SAndroid Build Coastguard Worker
159*8975f5c5SAndroid Build Coastguard Worker void createAndAttachColorAttachment(bool useRenderbuffer,
160*8975f5c5SAndroid Build Coastguard Worker GLsizei size,
161*8975f5c5SAndroid Build Coastguard Worker GLenum renderbufferTarget,
162*8975f5c5SAndroid Build Coastguard Worker const GLType *glType,
163*8975f5c5SAndroid Build Coastguard Worker GLint samples,
164*8975f5c5SAndroid Build Coastguard Worker GLTexture *textureOut,
165*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer *renderbufferOut);
166*8975f5c5SAndroid Build Coastguard Worker void createAndAttachDepthStencilAttachment(bool useRenderbuffer,
167*8975f5c5SAndroid Build Coastguard Worker GLsizei size,
168*8975f5c5SAndroid Build Coastguard Worker GLTexture *textureOut,
169*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer *renderbufferOut);
170*8975f5c5SAndroid Build Coastguard Worker void colorAttachmentMultisampleDrawTestCommon(bool useRenderbuffer);
171*8975f5c5SAndroid Build Coastguard Worker void copyTexImageTestCommon(bool useRenderbuffer);
172*8975f5c5SAndroid Build Coastguard Worker void copyTexSubImageTestCommon(bool useRenderbuffer);
173*8975f5c5SAndroid Build Coastguard Worker void drawCopyThenBlendCommon(bool useRenderbuffer);
174*8975f5c5SAndroid Build Coastguard Worker void clearDrawCopyThenBlendSameProgramCommon(bool useRenderbuffer);
175*8975f5c5SAndroid Build Coastguard Worker void drawCopyDrawThenMaskedClearCommon(bool useRenderbuffer);
176*8975f5c5SAndroid Build Coastguard Worker void clearThenBlendCommon(bool useRenderbuffer);
177*8975f5c5SAndroid Build Coastguard Worker
178*8975f5c5SAndroid Build Coastguard Worker GLProgram mCopyTextureProgram;
179*8975f5c5SAndroid Build Coastguard Worker GLint mCopyTextureUniformLocation = -1;
180*8975f5c5SAndroid Build Coastguard Worker
181*8975f5c5SAndroid Build Coastguard Worker const GLint mTestSampleCount = 4;
182*8975f5c5SAndroid Build Coastguard Worker GLint mMaxIntegerSamples = 0;
183*8975f5c5SAndroid Build Coastguard Worker };
184*8975f5c5SAndroid Build Coastguard Worker
185*8975f5c5SAndroid Build Coastguard Worker class MultisampledRenderToTextureES3Test : public MultisampledRenderToTextureTest
186*8975f5c5SAndroid Build Coastguard Worker {
187*8975f5c5SAndroid Build Coastguard Worker protected:
188*8975f5c5SAndroid Build Coastguard Worker void readPixelsTestCommon(bool useRenderbuffer);
189*8975f5c5SAndroid Build Coastguard Worker void blitFramebufferTestCommon(bool useRenderbuffer);
190*8975f5c5SAndroid Build Coastguard Worker void drawCopyDrawAttachInvalidatedThenDrawCommon(bool useRenderbuffer);
191*8975f5c5SAndroid Build Coastguard Worker void drawCopyDrawAttachDepthStencilClearThenDrawCommon(bool useRenderbuffer);
192*8975f5c5SAndroid Build Coastguard Worker void depthStencilClearThenDrawCommon(bool useRenderbuffer);
193*8975f5c5SAndroid Build Coastguard Worker void colorAttachment1Common(bool useRenderbuffer);
194*8975f5c5SAndroid Build Coastguard Worker void colorAttachments0And3Common(bool useRenderbuffer);
195*8975f5c5SAndroid Build Coastguard Worker void blitFramebufferMixedColorAndDepthCommon(bool useRenderbuffer);
196*8975f5c5SAndroid Build Coastguard Worker void renderbufferUnresolveColorAndDepthStencilThenTwoColors(bool withDepth, bool withStencil);
197*8975f5c5SAndroid Build Coastguard Worker };
198*8975f5c5SAndroid Build Coastguard Worker
199*8975f5c5SAndroid Build Coastguard Worker class MultisampledRenderToTextureES31Test : public MultisampledRenderToTextureTest
200*8975f5c5SAndroid Build Coastguard Worker {
201*8975f5c5SAndroid Build Coastguard Worker protected:
202*8975f5c5SAndroid Build Coastguard Worker void blitFramebufferAttachment1Common(bool useRenderbuffer);
203*8975f5c5SAndroid Build Coastguard Worker void drawCopyThenBlendAllAttachmentsMixed(bool useRenderbuffer);
204*8975f5c5SAndroid Build Coastguard Worker };
205*8975f5c5SAndroid Build Coastguard Worker
206*8975f5c5SAndroid Build Coastguard Worker // Checking against invalid parameters for RenderbufferStorageMultisampleEXT.
TEST_P(MultisampledRenderToTextureTest,RenderbufferParameterCheck)207*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, RenderbufferParameterCheck)
208*8975f5c5SAndroid Build Coastguard Worker {
209*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
210*8975f5c5SAndroid Build Coastguard Worker
211*8975f5c5SAndroid Build Coastguard Worker // Linux Intel Vulkan returns 0 for GL_MAX_INTEGER_SAMPLES http://anglebug.com/42264519
212*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
213*8975f5c5SAndroid Build Coastguard Worker
214*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer;
215*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
216*8975f5c5SAndroid Build Coastguard Worker
217*8975f5c5SAndroid Build Coastguard Worker // Positive test case. Formats required by the spec (GLES2.0 Table 4.5)
218*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, 64, 64);
219*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
220*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_STENCIL_INDEX8, 64, 64);
221*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
222*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_RGBA4, 64, 64);
223*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
224*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_RGB5_A1, 64, 64);
225*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
226*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_RGB565, 64, 64);
227*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
228*8975f5c5SAndroid Build Coastguard Worker
229*8975f5c5SAndroid Build Coastguard Worker // Positive test case. A few of the ES3 formats
230*8975f5c5SAndroid Build Coastguard Worker if (getClientMajorVersion() >= 3)
231*8975f5c5SAndroid Build Coastguard Worker {
232*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, 64, 64);
233*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
234*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_RGBA8, 64, 64);
235*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
236*8975f5c5SAndroid Build Coastguard Worker
237*8975f5c5SAndroid Build Coastguard Worker if (getClientMinorVersion() >= 1)
238*8975f5c5SAndroid Build Coastguard Worker {
239*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, mMaxIntegerSamples, GL_RGBA32I, 64,
240*8975f5c5SAndroid Build Coastguard Worker 64);
241*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
242*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, mMaxIntegerSamples, GL_RGBA32UI,
243*8975f5c5SAndroid Build Coastguard Worker 64, 64);
244*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
245*8975f5c5SAndroid Build Coastguard Worker }
246*8975f5c5SAndroid Build Coastguard Worker }
247*8975f5c5SAndroid Build Coastguard Worker
248*8975f5c5SAndroid Build Coastguard Worker GLint samples;
249*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_SAMPLES_EXT, &samples);
250*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
251*8975f5c5SAndroid Build Coastguard Worker EXPECT_GE(samples, 1);
252*8975f5c5SAndroid Build Coastguard Worker
253*8975f5c5SAndroid Build Coastguard Worker // Samples too large
254*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples + 1, GL_DEPTH_COMPONENT16, 64, 64);
255*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_VALUE);
256*8975f5c5SAndroid Build Coastguard Worker
257*8975f5c5SAndroid Build Coastguard Worker // Renderbuffer size too large
258*8975f5c5SAndroid Build Coastguard Worker GLint maxSize;
259*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &maxSize);
260*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 2, GL_RGBA4, maxSize + 1, maxSize);
261*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_VALUE);
262*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT16, maxSize,
263*8975f5c5SAndroid Build Coastguard Worker maxSize + 1);
264*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_VALUE);
265*8975f5c5SAndroid Build Coastguard Worker
266*8975f5c5SAndroid Build Coastguard Worker // Retrieving samples
267*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, 64, 64);
268*8975f5c5SAndroid Build Coastguard Worker GLint param = 0;
269*8975f5c5SAndroid Build Coastguard Worker glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES_EXT, ¶m);
270*8975f5c5SAndroid Build Coastguard Worker // GE because samples may vary base on implementation. Spec says "the resulting value for
271*8975f5c5SAndroid Build Coastguard Worker // RENDERBUFFER_SAMPLES_EXT is guaranteed to be greater than or equal to samples and no more
272*8975f5c5SAndroid Build Coastguard Worker // than the next larger sample count supported by the implementation"
273*8975f5c5SAndroid Build Coastguard Worker EXPECT_GE(param, 4);
274*8975f5c5SAndroid Build Coastguard Worker }
275*8975f5c5SAndroid Build Coastguard Worker
276*8975f5c5SAndroid Build Coastguard Worker // Checking against invalid parameters for FramebufferTexture2DMultisampleEXT.
TEST_P(MultisampledRenderToTextureTest,Texture2DParameterCheck)277*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, Texture2DParameterCheck)
278*8975f5c5SAndroid Build Coastguard Worker {
279*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
280*8975f5c5SAndroid Build Coastguard Worker bool isES3 = getClientMajorVersion() >= 3;
281*8975f5c5SAndroid Build Coastguard Worker
282*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
283*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
284*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
285*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
286*8975f5c5SAndroid Build Coastguard Worker
287*8975f5c5SAndroid Build Coastguard Worker GLTexture depthTexture;
288*8975f5c5SAndroid Build Coastguard Worker if (isES3)
289*8975f5c5SAndroid Build Coastguard Worker {
290*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, depthTexture);
291*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 64, 64, 0, GL_DEPTH_STENCIL,
292*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_INT_24_8_OES, nullptr);
293*8975f5c5SAndroid Build Coastguard Worker }
294*8975f5c5SAndroid Build Coastguard Worker
295*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
296*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
297*8975f5c5SAndroid Build Coastguard Worker // Positive test case
298*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
299*8975f5c5SAndroid Build Coastguard Worker texture, 0, 4);
300*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
301*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
302*8975f5c5SAndroid Build Coastguard Worker
303*8975f5c5SAndroid Build Coastguard Worker if (EnsureGLExtensionEnabled("GL_EXT_draw_buffers") || isES3)
304*8975f5c5SAndroid Build Coastguard Worker {
305*8975f5c5SAndroid Build Coastguard Worker // Attachment not COLOR_ATTACHMENT0. Allowed only in EXT_multisampled_render_to_texture2
306*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
307*8975f5c5SAndroid Build Coastguard Worker texture, 0, 4);
308*8975f5c5SAndroid Build Coastguard Worker assertErrorIfNotMSRTT2(GL_INVALID_ENUM);
309*8975f5c5SAndroid Build Coastguard Worker }
310*8975f5c5SAndroid Build Coastguard Worker
311*8975f5c5SAndroid Build Coastguard Worker // Depth/stencil attachment. Allowed only in EXT_multisampled_render_to_texture2
312*8975f5c5SAndroid Build Coastguard Worker if (isES3)
313*8975f5c5SAndroid Build Coastguard Worker {
314*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
315*8975f5c5SAndroid Build Coastguard Worker depthTexture, 0, 4);
316*8975f5c5SAndroid Build Coastguard Worker assertErrorIfNotMSRTT2(GL_INVALID_ENUM);
317*8975f5c5SAndroid Build Coastguard Worker
318*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
319*8975f5c5SAndroid Build Coastguard Worker depthTexture, 0, 4);
320*8975f5c5SAndroid Build Coastguard Worker assertErrorIfNotMSRTT2(GL_INVALID_ENUM);
321*8975f5c5SAndroid Build Coastguard Worker
322*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
323*8975f5c5SAndroid Build Coastguard Worker GL_TEXTURE_2D, depthTexture, 0, 4);
324*8975f5c5SAndroid Build Coastguard Worker assertErrorIfNotMSRTT2(GL_INVALID_ENUM);
325*8975f5c5SAndroid Build Coastguard Worker
326*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
327*8975f5c5SAndroid Build Coastguard Worker depthTexture, 0, 4);
328*8975f5c5SAndroid Build Coastguard Worker assertErrorIfNotMSRTT2(GL_INVALID_ENUM);
329*8975f5c5SAndroid Build Coastguard Worker }
330*8975f5c5SAndroid Build Coastguard Worker
331*8975f5c5SAndroid Build Coastguard Worker // Target not framebuffer
332*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_RENDERBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
333*8975f5c5SAndroid Build Coastguard Worker texture, 0, 4);
334*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_ENUM);
335*8975f5c5SAndroid Build Coastguard Worker
336*8975f5c5SAndroid Build Coastguard Worker GLint samples;
337*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_SAMPLES_EXT, &samples);
338*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
339*8975f5c5SAndroid Build Coastguard Worker EXPECT_GE(samples, 1);
340*8975f5c5SAndroid Build Coastguard Worker
341*8975f5c5SAndroid Build Coastguard Worker // Samples too large
342*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
343*8975f5c5SAndroid Build Coastguard Worker texture, 0, samples + 1);
344*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_VALUE);
345*8975f5c5SAndroid Build Coastguard Worker
346*8975f5c5SAndroid Build Coastguard Worker // Retrieving samples
347*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
348*8975f5c5SAndroid Build Coastguard Worker texture, 0, 4);
349*8975f5c5SAndroid Build Coastguard Worker GLint param = 0;
350*8975f5c5SAndroid Build Coastguard Worker glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
351*8975f5c5SAndroid Build Coastguard Worker GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT, ¶m);
352*8975f5c5SAndroid Build Coastguard Worker // GE because samples may vary base on implementation. Spec says "the resulting value for
353*8975f5c5SAndroid Build Coastguard Worker // TEXTURE_SAMPLES_EXT is guaranteed to be greater than or equal to samples and no more than the
354*8975f5c5SAndroid Build Coastguard Worker // next larger sample count supported by the implementation"
355*8975f5c5SAndroid Build Coastguard Worker EXPECT_GE(param, 4);
356*8975f5c5SAndroid Build Coastguard Worker }
357*8975f5c5SAndroid Build Coastguard Worker
358*8975f5c5SAndroid Build Coastguard Worker // Checking against invalid parameters for FramebufferTexture2DMultisampleEXT (cubemap).
TEST_P(MultisampledRenderToTextureTest,TextureCubeMapParameterCheck)359*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, TextureCubeMapParameterCheck)
360*8975f5c5SAndroid Build Coastguard Worker {
361*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
362*8975f5c5SAndroid Build Coastguard Worker bool isES3 = getClientMajorVersion() >= 3;
363*8975f5c5SAndroid Build Coastguard Worker
364*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
365*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
366*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = 0; face < 6; face++)
367*8975f5c5SAndroid Build Coastguard Worker {
368*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGBA, 64, 64, 0, GL_RGBA,
369*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
370*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
371*8975f5c5SAndroid Build Coastguard Worker }
372*8975f5c5SAndroid Build Coastguard Worker
373*8975f5c5SAndroid Build Coastguard Worker GLint samples;
374*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_SAMPLES_EXT, &samples);
375*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
376*8975f5c5SAndroid Build Coastguard Worker EXPECT_GE(samples, 1);
377*8975f5c5SAndroid Build Coastguard Worker
378*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
379*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
380*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = 0; face < 6; face++)
381*8975f5c5SAndroid Build Coastguard Worker {
382*8975f5c5SAndroid Build Coastguard Worker // Positive test case
383*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
384*8975f5c5SAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture, 0, 4);
385*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
386*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
387*8975f5c5SAndroid Build Coastguard Worker
388*8975f5c5SAndroid Build Coastguard Worker if (EnsureGLExtensionEnabled("GL_EXT_draw_buffers") || isES3)
389*8975f5c5SAndroid Build Coastguard Worker {
390*8975f5c5SAndroid Build Coastguard Worker // Attachment not COLOR_ATTACHMENT0. Allowed only in
391*8975f5c5SAndroid Build Coastguard Worker // EXT_multisampled_render_to_texture2
392*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1,
393*8975f5c5SAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture, 0,
394*8975f5c5SAndroid Build Coastguard Worker 4);
395*8975f5c5SAndroid Build Coastguard Worker assertErrorIfNotMSRTT2(GL_INVALID_ENUM);
396*8975f5c5SAndroid Build Coastguard Worker }
397*8975f5c5SAndroid Build Coastguard Worker
398*8975f5c5SAndroid Build Coastguard Worker // Target not framebuffer
399*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_RENDERBUFFER, GL_COLOR_ATTACHMENT0,
400*8975f5c5SAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture, 0, 4);
401*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_ENUM);
402*8975f5c5SAndroid Build Coastguard Worker
403*8975f5c5SAndroid Build Coastguard Worker // Samples too large
404*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
405*8975f5c5SAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture, 0,
406*8975f5c5SAndroid Build Coastguard Worker samples + 1);
407*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_VALUE);
408*8975f5c5SAndroid Build Coastguard Worker
409*8975f5c5SAndroid Build Coastguard Worker // Retrieving samples
410*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
411*8975f5c5SAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture, 0, 4);
412*8975f5c5SAndroid Build Coastguard Worker GLint param = 0;
413*8975f5c5SAndroid Build Coastguard Worker glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
414*8975f5c5SAndroid Build Coastguard Worker GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT,
415*8975f5c5SAndroid Build Coastguard Worker ¶m);
416*8975f5c5SAndroid Build Coastguard Worker // GE because samples may vary base on implementation. Spec says "the resulting value for
417*8975f5c5SAndroid Build Coastguard Worker // TEXTURE_SAMPLES_EXT is guaranteed to be greater than or equal to samples and no more than
418*8975f5c5SAndroid Build Coastguard Worker // the next larger sample count supported by the implementation"
419*8975f5c5SAndroid Build Coastguard Worker EXPECT_GE(param, 4);
420*8975f5c5SAndroid Build Coastguard Worker }
421*8975f5c5SAndroid Build Coastguard Worker }
422*8975f5c5SAndroid Build Coastguard Worker
423*8975f5c5SAndroid Build Coastguard Worker // Checking for framebuffer completeness using extension methods.
TEST_P(MultisampledRenderToTextureTest,FramebufferCompleteness)424*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, FramebufferCompleteness)
425*8975f5c5SAndroid Build Coastguard Worker {
426*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
427*8975f5c5SAndroid Build Coastguard Worker
428*8975f5c5SAndroid Build Coastguard Worker // Checking that Renderbuffer and texture2d having different number of samples results
429*8975f5c5SAndroid Build Coastguard Worker // in a FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
430*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
431*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
432*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
433*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
434*8975f5c5SAndroid Build Coastguard Worker
435*8975f5c5SAndroid Build Coastguard Worker // Texture attachment for color attachment 0. Framebuffer should be complete.
436*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
437*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
438*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
439*8975f5c5SAndroid Build Coastguard Worker texture, 0, 4);
440*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
441*8975f5c5SAndroid Build Coastguard Worker
442*8975f5c5SAndroid Build Coastguard Worker GLsizei maxSamples = 0;
443*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
444*8975f5c5SAndroid Build Coastguard Worker
445*8975f5c5SAndroid Build Coastguard Worker // Depth/stencil renderbuffer, potentially with a different sample count.
446*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer dsRenderbuffer;
447*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, dsRenderbuffer);
448*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, maxSamples, GL_DEPTH_COMPONENT16, 64, 64);
449*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
450*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, dsRenderbuffer);
451*8975f5c5SAndroid Build Coastguard Worker
452*8975f5c5SAndroid Build Coastguard Worker if (maxSamples > 4)
453*8975f5c5SAndroid Build Coastguard Worker {
454*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE,
455*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
456*8975f5c5SAndroid Build Coastguard Worker }
457*8975f5c5SAndroid Build Coastguard Worker else
458*8975f5c5SAndroid Build Coastguard Worker {
459*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
460*8975f5c5SAndroid Build Coastguard Worker }
461*8975f5c5SAndroid Build Coastguard Worker
462*8975f5c5SAndroid Build Coastguard Worker // Color renderbuffer for color attachment 0.
463*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer colorRenderbuffer;
464*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
465*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, maxSamples, GL_RGBA4, 64, 64);
466*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
467*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
468*8975f5c5SAndroid Build Coastguard Worker colorRenderbuffer);
469*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
470*8975f5c5SAndroid Build Coastguard Worker
471*8975f5c5SAndroid Build Coastguard Worker // D3D backend doesn't implement multisampled render to texture renderbuffers correctly.
472*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42261786
473*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsD3D());
474*8975f5c5SAndroid Build Coastguard Worker
475*8975f5c5SAndroid Build Coastguard Worker if (getClientMajorVersion() >= 3 &&
476*8975f5c5SAndroid Build Coastguard Worker EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2"))
477*8975f5c5SAndroid Build Coastguard Worker {
478*8975f5c5SAndroid Build Coastguard Worker // Texture attachment for color attachment 1.
479*8975f5c5SAndroid Build Coastguard Worker GLTexture texture2;
480*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture2);
481*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
482*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
483*8975f5c5SAndroid Build Coastguard Worker
484*8975f5c5SAndroid Build Coastguard Worker // Attach with a potentially different number of samples.
485*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
486*8975f5c5SAndroid Build Coastguard Worker texture, 0, 4);
487*8975f5c5SAndroid Build Coastguard Worker
488*8975f5c5SAndroid Build Coastguard Worker if (maxSamples > 4)
489*8975f5c5SAndroid Build Coastguard Worker {
490*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE,
491*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
492*8975f5c5SAndroid Build Coastguard Worker }
493*8975f5c5SAndroid Build Coastguard Worker else
494*8975f5c5SAndroid Build Coastguard Worker {
495*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
496*8975f5c5SAndroid Build Coastguard Worker }
497*8975f5c5SAndroid Build Coastguard Worker
498*8975f5c5SAndroid Build Coastguard Worker // Attach with same number of samples.
499*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
500*8975f5c5SAndroid Build Coastguard Worker texture, 0, maxSamples);
501*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
502*8975f5c5SAndroid Build Coastguard Worker }
503*8975f5c5SAndroid Build Coastguard Worker }
504*8975f5c5SAndroid Build Coastguard Worker
505*8975f5c5SAndroid Build Coastguard Worker // Checking for framebuffer completeness using extension methods.
TEST_P(MultisampledRenderToTextureTest,FramebufferCompletenessSmallSampleCount)506*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, FramebufferCompletenessSmallSampleCount)
507*8975f5c5SAndroid Build Coastguard Worker {
508*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
509*8975f5c5SAndroid Build Coastguard Worker
510*8975f5c5SAndroid Build Coastguard Worker // A sample count of '2' can be rounded up to '4' on some systems (e.g., ARM+Android).
511*8975f5c5SAndroid Build Coastguard Worker GLsizei samples = 2;
512*8975f5c5SAndroid Build Coastguard Worker
513*8975f5c5SAndroid Build Coastguard Worker // Checking that Renderbuffer and texture2d having different number of samples results
514*8975f5c5SAndroid Build Coastguard Worker // in a FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
515*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
516*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
517*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
518*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
519*8975f5c5SAndroid Build Coastguard Worker
520*8975f5c5SAndroid Build Coastguard Worker // Texture attachment for color attachment 0. Framebuffer should be complete.
521*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
522*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
523*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
524*8975f5c5SAndroid Build Coastguard Worker texture, 0, samples);
525*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
526*8975f5c5SAndroid Build Coastguard Worker
527*8975f5c5SAndroid Build Coastguard Worker // Depth/stencil renderbuffer, potentially with a different sample count.
528*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer dsRenderbuffer;
529*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, dsRenderbuffer);
530*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, GL_DEPTH_COMPONENT16, 64, 64);
531*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
532*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, dsRenderbuffer);
533*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
534*8975f5c5SAndroid Build Coastguard Worker
535*8975f5c5SAndroid Build Coastguard Worker // Color renderbuffer for color attachment 0.
536*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer colorRenderbuffer;
537*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
538*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, GL_RGBA4, 64, 64);
539*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
540*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
541*8975f5c5SAndroid Build Coastguard Worker colorRenderbuffer);
542*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
543*8975f5c5SAndroid Build Coastguard Worker }
544*8975f5c5SAndroid Build Coastguard Worker
545*8975f5c5SAndroid Build Coastguard Worker // Test mixing unsized and sized formats with multisampling. Regression test for
546*8975f5c5SAndroid Build Coastguard Worker // http://crbug.com/1238327
TEST_P(MultisampledRenderToTextureTest,UnsizedTextureFormatSampleMissmatch)547*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, UnsizedTextureFormatSampleMissmatch)
548*8975f5c5SAndroid Build Coastguard Worker {
549*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
550*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_texture_rg"));
551*8975f5c5SAndroid Build Coastguard Worker
552*8975f5c5SAndroid Build Coastguard Worker GLsizei samples = 0;
553*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_SAMPLES, &samples);
554*8975f5c5SAndroid Build Coastguard Worker
555*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
556*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
557*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 64, 64, 0, GL_RED, GL_UNSIGNED_BYTE, nullptr);
558*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
559*8975f5c5SAndroid Build Coastguard Worker
560*8975f5c5SAndroid Build Coastguard Worker // Texture attachment for color attachment 0. Framebuffer should be complete.
561*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
562*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
563*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
564*8975f5c5SAndroid Build Coastguard Worker texture, 0, samples);
565*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
566*8975f5c5SAndroid Build Coastguard Worker
567*8975f5c5SAndroid Build Coastguard Worker // Depth/stencil renderbuffer, potentially with a different sample count.
568*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer dsRenderbuffer;
569*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, dsRenderbuffer);
570*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, GL_STENCIL_INDEX8, 64, 64);
571*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
572*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
573*8975f5c5SAndroid Build Coastguard Worker dsRenderbuffer);
574*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
575*8975f5c5SAndroid Build Coastguard Worker }
576*8975f5c5SAndroid Build Coastguard Worker
createAndAttachColorAttachment(bool useRenderbuffer,GLsizei size,GLenum renderbufferTarget,const GLType * glType,GLint samples,GLTexture * textureOut,GLRenderbuffer * renderbufferOut)577*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureTest::createAndAttachColorAttachment(
578*8975f5c5SAndroid Build Coastguard Worker bool useRenderbuffer,
579*8975f5c5SAndroid Build Coastguard Worker GLsizei size,
580*8975f5c5SAndroid Build Coastguard Worker GLenum renderbufferTarget,
581*8975f5c5SAndroid Build Coastguard Worker const GLType *glType,
582*8975f5c5SAndroid Build Coastguard Worker GLint samples,
583*8975f5c5SAndroid Build Coastguard Worker GLTexture *textureOut,
584*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer *renderbufferOut)
585*8975f5c5SAndroid Build Coastguard Worker {
586*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat = glType ? glType->internalFormat : GL_RGBA;
587*8975f5c5SAndroid Build Coastguard Worker GLenum format = glType ? glType->format : GL_RGBA;
588*8975f5c5SAndroid Build Coastguard Worker GLenum type = glType ? glType->type : GL_UNSIGNED_BYTE;
589*8975f5c5SAndroid Build Coastguard Worker
590*8975f5c5SAndroid Build Coastguard Worker if (useRenderbuffer)
591*8975f5c5SAndroid Build Coastguard Worker {
592*8975f5c5SAndroid Build Coastguard Worker if (internalFormat == GL_RGBA)
593*8975f5c5SAndroid Build Coastguard Worker {
594*8975f5c5SAndroid Build Coastguard Worker internalFormat = GL_RGBA8;
595*8975f5c5SAndroid Build Coastguard Worker }
596*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, *renderbufferOut);
597*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, internalFormat, size, size);
598*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, renderbufferTarget, GL_RENDERBUFFER,
599*8975f5c5SAndroid Build Coastguard Worker *renderbufferOut);
600*8975f5c5SAndroid Build Coastguard Worker }
601*8975f5c5SAndroid Build Coastguard Worker else
602*8975f5c5SAndroid Build Coastguard Worker {
603*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, *textureOut);
604*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, size, size, 0, format, type, nullptr);
605*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
606*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
607*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, renderbufferTarget, GL_TEXTURE_2D,
608*8975f5c5SAndroid Build Coastguard Worker *textureOut, 0, samples);
609*8975f5c5SAndroid Build Coastguard Worker }
610*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
611*8975f5c5SAndroid Build Coastguard Worker }
612*8975f5c5SAndroid Build Coastguard Worker
createAndAttachDepthStencilAttachment(bool useRenderbuffer,GLsizei size,GLTexture * textureOut,GLRenderbuffer * renderbufferOut)613*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureTest::createAndAttachDepthStencilAttachment(
614*8975f5c5SAndroid Build Coastguard Worker bool useRenderbuffer,
615*8975f5c5SAndroid Build Coastguard Worker GLsizei size,
616*8975f5c5SAndroid Build Coastguard Worker GLTexture *textureOut,
617*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer *renderbufferOut)
618*8975f5c5SAndroid Build Coastguard Worker {
619*8975f5c5SAndroid Build Coastguard Worker if (useRenderbuffer)
620*8975f5c5SAndroid Build Coastguard Worker {
621*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, *renderbufferOut);
622*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, mTestSampleCount, GL_DEPTH24_STENCIL8,
623*8975f5c5SAndroid Build Coastguard Worker size, size);
624*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
625*8975f5c5SAndroid Build Coastguard Worker *renderbufferOut);
626*8975f5c5SAndroid Build Coastguard Worker }
627*8975f5c5SAndroid Build Coastguard Worker else
628*8975f5c5SAndroid Build Coastguard Worker {
629*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, *textureOut);
630*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, size, size, 0, GL_DEPTH_STENCIL,
631*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_INT_24_8_OES, nullptr);
632*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
633*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
634*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
635*8975f5c5SAndroid Build Coastguard Worker GL_TEXTURE_2D, *textureOut, 0, mTestSampleCount);
636*8975f5c5SAndroid Build Coastguard Worker }
637*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
638*8975f5c5SAndroid Build Coastguard Worker }
639*8975f5c5SAndroid Build Coastguard Worker
colorAttachmentMultisampleDrawTestCommon(bool useRenderbuffer)640*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureTest::colorAttachmentMultisampleDrawTestCommon(bool useRenderbuffer)
641*8975f5c5SAndroid Build Coastguard Worker {
642*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
643*8975f5c5SAndroid Build Coastguard Worker
644*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
645*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
646*8975f5c5SAndroid Build Coastguard Worker
647*8975f5c5SAndroid Build Coastguard Worker // Set up color attachment and bind to FBO
648*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 6;
649*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
650*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer;
651*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
652*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &texture, &renderbuffer);
653*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
654*8975f5c5SAndroid Build Coastguard Worker
655*8975f5c5SAndroid Build Coastguard Worker // Set viewport and clear to black
656*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
657*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 0.0, 0.0, 1.0);
658*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
659*8975f5c5SAndroid Build Coastguard Worker
660*8975f5c5SAndroid Build Coastguard Worker // Set up Green square program
661*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
662*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
663*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
664*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
665*8975f5c5SAndroid Build Coastguard Worker
666*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(0.5f, 0.5f);
667*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
668*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
669*8975f5c5SAndroid Build Coastguard Worker
670*8975f5c5SAndroid Build Coastguard Worker // Draw green square
671*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
672*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
673*8975f5c5SAndroid Build Coastguard Worker
674*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
675*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::green);
676*8975f5c5SAndroid Build Coastguard Worker
677*8975f5c5SAndroid Build Coastguard Worker // Set up Red square program
678*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program2, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
679*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program2);
680*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation2 = glGetAttribLocation(program2, essl1_shaders::PositionAttrib());
681*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation2);
682*8975f5c5SAndroid Build Coastguard Worker
683*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(0.5f, 0.75f);
684*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation2, 3, GL_FLOAT, GL_FALSE, 0, 0);
685*8975f5c5SAndroid Build Coastguard Worker
686*8975f5c5SAndroid Build Coastguard Worker // Draw red square
687*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
688*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
689*8975f5c5SAndroid Build Coastguard Worker
690*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
691*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
692*8975f5c5SAndroid Build Coastguard Worker
693*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(0);
694*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
695*8975f5c5SAndroid Build Coastguard Worker }
696*8975f5c5SAndroid Build Coastguard Worker
697*8975f5c5SAndroid Build Coastguard Worker // Draw test with color attachment only.
698*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, 2DColorAttachmentMultisampleDrawTest)
699*8975f5c5SAndroid Build Coastguard Worker {
700*8975f5c5SAndroid Build Coastguard Worker colorAttachmentMultisampleDrawTestCommon(false);
701*8975f5c5SAndroid Build Coastguard Worker }
702*8975f5c5SAndroid Build Coastguard Worker
703*8975f5c5SAndroid Build Coastguard Worker // Draw test with renderbuffer color attachment only
TEST_P(MultisampledRenderToTextureTest,RenderbufferColorAttachmentMultisampleDrawTest)704*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, RenderbufferColorAttachmentMultisampleDrawTest)
705*8975f5c5SAndroid Build Coastguard Worker {
706*8975f5c5SAndroid Build Coastguard Worker colorAttachmentMultisampleDrawTestCommon(true);
707*8975f5c5SAndroid Build Coastguard Worker }
708*8975f5c5SAndroid Build Coastguard Worker
709*8975f5c5SAndroid Build Coastguard Worker // Test draw with a scissored region.
TEST_P(MultisampledRenderToTextureTest,ScissoredDrawTest)710*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, ScissoredDrawTest)
711*8975f5c5SAndroid Build Coastguard Worker {
712*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
713*8975f5c5SAndroid Build Coastguard Worker
714*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
715*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
716*8975f5c5SAndroid Build Coastguard Worker
717*8975f5c5SAndroid Build Coastguard Worker // Set up color attachment and bind to FBO
718*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 1024;
719*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
720*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer;
721*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(false, kSize, GL_COLOR_ATTACHMENT0, nullptr, mTestSampleCount,
722*8975f5c5SAndroid Build Coastguard Worker &texture, &renderbuffer);
723*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
724*8975f5c5SAndroid Build Coastguard Worker
725*8975f5c5SAndroid Build Coastguard Worker // Set viewport and clear to black
726*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
727*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 0.0, 0.0, 1.0);
728*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
729*8975f5c5SAndroid Build Coastguard Worker
730*8975f5c5SAndroid Build Coastguard Worker // Set up Green square program
731*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
732*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawGreen);
733*8975f5c5SAndroid Build Coastguard Worker
734*8975f5c5SAndroid Build Coastguard Worker // Draw green square
735*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.0f);
736*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
737*8975f5c5SAndroid Build Coastguard Worker
738*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
739*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
740*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
741*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
742*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::green);
743*8975f5c5SAndroid Build Coastguard Worker
744*8975f5c5SAndroid Build Coastguard Worker // Set up Red square program
745*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
746*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawRed);
747*8975f5c5SAndroid Build Coastguard Worker
748*8975f5c5SAndroid Build Coastguard Worker // Draw a scissored red square
749*8975f5c5SAndroid Build Coastguard Worker
750*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kScissorStartX = 1;
751*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kScissorStartY = 103;
752*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kScissorEndX = 285;
753*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kScissorEndY = 402;
754*8975f5c5SAndroid Build Coastguard Worker
755*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
756*8975f5c5SAndroid Build Coastguard Worker glScissor(kScissorStartX, kScissorStartY, kScissorEndX - kScissorStartX + 1,
757*8975f5c5SAndroid Build Coastguard Worker kScissorEndY - kScissorStartY + 1);
758*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.0f);
759*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
760*8975f5c5SAndroid Build Coastguard Worker
761*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
762*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
763*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
764*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
765*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::green);
766*8975f5c5SAndroid Build Coastguard Worker
767*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorStartX, kScissorStartY, GLColor::red);
768*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorEndX, kScissorStartY, GLColor::red);
769*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorStartX, kScissorEndY, GLColor::red);
770*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorEndX, kScissorEndY, GLColor::red);
771*8975f5c5SAndroid Build Coastguard Worker
772*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorStartX - 1, kScissorStartY, GLColor::green);
773*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorStartX, kScissorStartY - 1, GLColor::green);
774*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorEndX + 1, kScissorStartY, GLColor::green);
775*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorEndX, kScissorStartY - 1, GLColor::green);
776*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorStartX - 1, kScissorEndY, GLColor::green);
777*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorStartX, kScissorEndY + 1, GLColor::green);
778*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorEndX + 1, kScissorEndY, GLColor::green);
779*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kScissorEndX, kScissorEndY + 1, GLColor::green);
780*8975f5c5SAndroid Build Coastguard Worker }
781*8975f5c5SAndroid Build Coastguard Worker
782*8975f5c5SAndroid Build Coastguard Worker // Test transform feedback with state change. In the Vulkan backend, this results in an implicit
783*8975f5c5SAndroid Build Coastguard Worker // break of the render pass, and must work correctly with respect to the subpass index that's used.
TEST_P(MultisampledRenderToTextureES3Test,TransformFeedbackTest)784*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, TransformFeedbackTest)
785*8975f5c5SAndroid Build Coastguard Worker {
786*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
787*8975f5c5SAndroid Build Coastguard Worker
788*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
789*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
790*8975f5c5SAndroid Build Coastguard Worker
791*8975f5c5SAndroid Build Coastguard Worker // Set up color attachment and bind to FBO
792*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 1024;
793*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
794*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer;
795*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(false, kSize, GL_COLOR_ATTACHMENT0, nullptr, mTestSampleCount,
796*8975f5c5SAndroid Build Coastguard Worker &texture, &renderbuffer);
797*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
798*8975f5c5SAndroid Build Coastguard Worker
799*8975f5c5SAndroid Build Coastguard Worker // Set up transform feedback.
800*8975f5c5SAndroid Build Coastguard Worker GLTransformFeedback xfb;
801*8975f5c5SAndroid Build Coastguard Worker glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, xfb);
802*8975f5c5SAndroid Build Coastguard Worker
803*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kXfbBufferSize = 1024; // arbitrary number
804*8975f5c5SAndroid Build Coastguard Worker GLBuffer xfbBuffer;
805*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfbBuffer);
806*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, kXfbBufferSize, nullptr, GL_STATIC_DRAW);
807*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, xfbBuffer);
808*8975f5c5SAndroid Build Coastguard Worker
809*8975f5c5SAndroid Build Coastguard Worker // Set up program with transform feedback
810*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> tfVaryings = {"gl_Position"};
811*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(drawColor, essl1_shaders::vs::Simple(),
812*8975f5c5SAndroid Build Coastguard Worker essl1_shaders::fs::UniformColor(), tfVaryings,
813*8975f5c5SAndroid Build Coastguard Worker GL_INTERLEAVED_ATTRIBS);
814*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
815*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
816*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
817*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
818*8975f5c5SAndroid Build Coastguard Worker
819*8975f5c5SAndroid Build Coastguard Worker // Start transform feedback
820*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_TRIANGLES);
821*8975f5c5SAndroid Build Coastguard Worker
822*8975f5c5SAndroid Build Coastguard Worker // Set viewport and clear to black
823*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
824*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 0.0, 0.0, 1.0);
825*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
826*8975f5c5SAndroid Build Coastguard Worker
827*8975f5c5SAndroid Build Coastguard Worker // Draw green. There's no unresolve operation as the framebuffer has just been cleared.
828*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
829*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.0f);
830*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
831*8975f5c5SAndroid Build Coastguard Worker
832*8975f5c5SAndroid Build Coastguard Worker // Incur a state change while transform feedback is active. This will result in a pipeline
833*8975f5c5SAndroid Build Coastguard Worker // rebind in the Vulkan backend, which should necessarily break the render pass when
834*8975f5c5SAndroid Build Coastguard Worker // VK_EXT_transform_feedback is used.
835*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
836*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
837*8975f5c5SAndroid Build Coastguard Worker
838*8975f5c5SAndroid Build Coastguard Worker // Draw red. The implicit render pass break means that there's an unresolve operation.
839*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
840*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.0f);
841*8975f5c5SAndroid Build Coastguard Worker
842*8975f5c5SAndroid Build Coastguard Worker // End transform feedback
843*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
844*8975f5c5SAndroid Build Coastguard Worker
845*8975f5c5SAndroid Build Coastguard Worker // Expect yellow.
846*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
847*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::yellow);
848*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::yellow);
849*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::yellow);
850*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::yellow);
851*8975f5c5SAndroid Build Coastguard Worker }
852*8975f5c5SAndroid Build Coastguard Worker
853*8975f5c5SAndroid Build Coastguard Worker // Draw test using both color and depth attachments.
854*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, 2DColorDepthMultisampleDrawTest)
855*8975f5c5SAndroid Build Coastguard Worker {
856*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
857*8975f5c5SAndroid Build Coastguard Worker
858*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 6;
859*8975f5c5SAndroid Build Coastguard Worker // create complete framebuffer with depth buffer
860*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
861*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
862*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
863*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
864*8975f5c5SAndroid Build Coastguard Worker
865*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
866*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
867*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
868*8975f5c5SAndroid Build Coastguard Worker texture, 0, 4);
869*8975f5c5SAndroid Build Coastguard Worker
870*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer;
871*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
872*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, kSize, kSize);
873*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
874*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer);
875*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
876*8975f5c5SAndroid Build Coastguard Worker
877*8975f5c5SAndroid Build Coastguard Worker // Set viewport and clear framebuffer
878*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
879*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 0.0, 0.0, 1.0);
880*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.5f);
881*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
882*8975f5c5SAndroid Build Coastguard Worker
883*8975f5c5SAndroid Build Coastguard Worker // Draw first green square
884*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
885*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
886*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
887*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
888*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
889*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
890*8975f5c5SAndroid Build Coastguard Worker
891*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(0.8f, 0.5f);
892*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
893*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
894*8975f5c5SAndroid Build Coastguard Worker
895*8975f5c5SAndroid Build Coastguard Worker // Tests that TRIANGLES works.
896*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
897*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
898*8975f5c5SAndroid Build Coastguard Worker
899*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
900*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::green);
901*8975f5c5SAndroid Build Coastguard Worker
902*8975f5c5SAndroid Build Coastguard Worker // Draw red square behind green square
903*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program2, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
904*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program2);
905*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation2 = glGetAttribLocation(program2, essl1_shaders::PositionAttrib());
906*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation2);
907*8975f5c5SAndroid Build Coastguard Worker
908*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(0.7f, 1.0f);
909*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation2, 3, GL_FLOAT, GL_FALSE, 0, 0);
910*8975f5c5SAndroid Build Coastguard Worker
911*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
912*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
913*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
914*8975f5c5SAndroid Build Coastguard Worker
915*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
916*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::green);
917*8975f5c5SAndroid Build Coastguard Worker
918*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(0);
919*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
920*8975f5c5SAndroid Build Coastguard Worker }
921*8975f5c5SAndroid Build Coastguard Worker
922*8975f5c5SAndroid Build Coastguard Worker // Draw test using color attachment with multiple levels.
TEST_P(MultisampledRenderToTextureTest,MultipleLevelsMultisampleDraw2DColor)923*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, MultipleLevelsMultisampleDraw2DColor)
924*8975f5c5SAndroid Build Coastguard Worker {
925*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
926*8975f5c5SAndroid Build Coastguard Worker
927*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 256;
928*8975f5c5SAndroid Build Coastguard Worker const GLuint desiredLevelCount = gl::log2(kSize) + 1;
929*8975f5c5SAndroid Build Coastguard Worker const std::vector<GLColor> greenColor(kSize * kSize, GLColor::green);
930*8975f5c5SAndroid Build Coastguard Worker
931*8975f5c5SAndroid Build Coastguard Worker // Create texture to be used as color attachment
932*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
933*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
934*8975f5c5SAndroid Build Coastguard Worker
935*8975f5c5SAndroid Build Coastguard Worker // Initialize all levels
936*8975f5c5SAndroid Build Coastguard Worker for (GLuint level = 0; level < desiredLevelCount; level++)
937*8975f5c5SAndroid Build Coastguard Worker {
938*8975f5c5SAndroid Build Coastguard Worker GLsizei levelSize = kSize >> level;
939*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, levelSize, levelSize, 0, GL_RGBA,
940*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, greenColor.data());
941*8975f5c5SAndroid Build Coastguard Worker }
942*8975f5c5SAndroid Build Coastguard Worker
943*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
944*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer readFbo;
945*8975f5c5SAndroid Build Coastguard Worker
946*8975f5c5SAndroid Build Coastguard Worker // Multisample draw and verify with each level
947*8975f5c5SAndroid Build Coastguard Worker for (GLuint currentLevel = 0; currentLevel < desiredLevelCount; currentLevel++)
948*8975f5c5SAndroid Build Coastguard Worker {
949*8975f5c5SAndroid Build Coastguard Worker GLsizei currentLevelSize = kSize >> currentLevel;
950*8975f5c5SAndroid Build Coastguard Worker
951*8975f5c5SAndroid Build Coastguard Worker // Attach a texture level as color attachment
952*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
953*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
954*8975f5c5SAndroid Build Coastguard Worker texture, currentLevel, 4);
955*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
956*8975f5c5SAndroid Build Coastguard Worker
957*8975f5c5SAndroid Build Coastguard Worker // Draw blue color
958*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, currentLevelSize, currentLevelSize);
959*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
960*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
961*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
962*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
963*8975f5c5SAndroid Build Coastguard Worker
964*8975f5c5SAndroid Build Coastguard Worker // Verify blue color
965*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, readFbo);
966*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
967*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture,
968*8975f5c5SAndroid Build Coastguard Worker currentLevel);
969*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
970*8975f5c5SAndroid Build Coastguard Worker
971*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
972*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(currentLevelSize / 2, currentLevelSize / 2, GLColor::blue);
973*8975f5c5SAndroid Build Coastguard Worker }
974*8975f5c5SAndroid Build Coastguard Worker }
975*8975f5c5SAndroid Build Coastguard Worker
976*8975f5c5SAndroid Build Coastguard Worker // Draw test using color attachment with multiple levels and multiple render targets.
TEST_P(MultisampledRenderToTextureES3Test,MultipleLevelsMultisampleMRTDraw2DColor)977*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, MultipleLevelsMultisampleMRTDraw2DColor)
978*8975f5c5SAndroid Build Coastguard Worker {
979*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
980*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_draw_buffers"));
981*8975f5c5SAndroid Build Coastguard Worker
982*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 256;
983*8975f5c5SAndroid Build Coastguard Worker const GLuint desiredLevelCount = gl::log2(kSize) + 1;
984*8975f5c5SAndroid Build Coastguard Worker const std::vector<GLColor> greenColor(kSize * kSize, GLColor::green);
985*8975f5c5SAndroid Build Coastguard Worker
986*8975f5c5SAndroid Build Coastguard Worker // Create texture to be used as color attachment
987*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
988*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
989*8975f5c5SAndroid Build Coastguard Worker
990*8975f5c5SAndroid Build Coastguard Worker // Initialize all levels
991*8975f5c5SAndroid Build Coastguard Worker for (GLuint level = 0; level < desiredLevelCount; level++)
992*8975f5c5SAndroid Build Coastguard Worker {
993*8975f5c5SAndroid Build Coastguard Worker GLsizei levelSize = kSize >> level;
994*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, levelSize, levelSize, 0, GL_RGBA,
995*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, greenColor.data());
996*8975f5c5SAndroid Build Coastguard Worker }
997*8975f5c5SAndroid Build Coastguard Worker
998*8975f5c5SAndroid Build Coastguard Worker // Multisample MRT draw and verify
999*8975f5c5SAndroid Build Coastguard Worker const std::string frag = R"(#extension GL_EXT_draw_buffers : enable
1000*8975f5c5SAndroid Build Coastguard Worker precision highp float;
1001*8975f5c5SAndroid Build Coastguard Worker uniform mediump vec4 u_color;
1002*8975f5c5SAndroid Build Coastguard Worker void main()
1003*8975f5c5SAndroid Build Coastguard Worker {
1004*8975f5c5SAndroid Build Coastguard Worker gl_FragData[0] = u_color;
1005*8975f5c5SAndroid Build Coastguard Worker gl_FragData[1] = u_color;
1006*8975f5c5SAndroid Build Coastguard Worker })";
1007*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(mrtProgram, essl1_shaders::vs::Simple(), frag.c_str());
1008*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mrtProgram);
1009*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation = glGetUniformLocation(mrtProgram, "u_color");
1010*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
1011*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 1.0f, 0.0f, 1.0f);
1012*8975f5c5SAndroid Build Coastguard Worker
1013*8975f5c5SAndroid Build Coastguard Worker // Attach texture level 0 and 1 as color attachment
1014*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
1015*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
1016*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
1017*8975f5c5SAndroid Build Coastguard Worker texture, 0, 4);
1018*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
1019*8975f5c5SAndroid Build Coastguard Worker texture, 1, 4);
1020*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1021*8975f5c5SAndroid Build Coastguard Worker
1022*8975f5c5SAndroid Build Coastguard Worker // Draw yellow color to both attachments
1023*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
1024*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kDrawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
1025*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, kDrawBuffers);
1026*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1027*8975f5c5SAndroid Build Coastguard Worker drawQuad(mrtProgram, essl1_shaders::PositionAttrib(), 0.5f);
1028*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1029*8975f5c5SAndroid Build Coastguard Worker
1030*8975f5c5SAndroid Build Coastguard Worker // Verify yellow color in common render area of both attachments
1031*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer readFbo;
1032*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, readFbo);
1033*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
1034*8975f5c5SAndroid Build Coastguard Worker
1035*8975f5c5SAndroid Build Coastguard Worker // Verify level 0
1036*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1037*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1038*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ((kSize >> 1) - 1, (kSize >> 1) - 1, GLColor::yellow);
1039*8975f5c5SAndroid Build Coastguard Worker
1040*8975f5c5SAndroid Build Coastguard Worker // Verify level 1
1041*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 1);
1042*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1043*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ((kSize >> 1) - 1, (kSize >> 1) - 1, GLColor::yellow);
1044*8975f5c5SAndroid Build Coastguard Worker }
1045*8975f5c5SAndroid Build Coastguard Worker
readPixelsTestCommon(bool useRenderbuffer)1046*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureES3Test::readPixelsTestCommon(bool useRenderbuffer)
1047*8975f5c5SAndroid Build Coastguard Worker {
1048*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1049*8975f5c5SAndroid Build Coastguard Worker
1050*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
1051*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
1052*8975f5c5SAndroid Build Coastguard Worker
1053*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 6;
1054*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
1055*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer;
1056*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
1057*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &texture, &renderbuffer);
1058*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1059*8975f5c5SAndroid Build Coastguard Worker
1060*8975f5c5SAndroid Build Coastguard Worker // Set viewport and clear to red
1061*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
1062*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1063*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1064*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1065*8975f5c5SAndroid Build Coastguard Worker
1066*8975f5c5SAndroid Build Coastguard Worker // Bind Pack Pixel Buffer and read to it
1067*8975f5c5SAndroid Build Coastguard Worker GLBuffer PBO;
1068*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_PIXEL_PACK_BUFFER, PBO);
1069*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_PIXEL_PACK_BUFFER, 4 * kSize * kSize, nullptr, GL_STATIC_DRAW);
1070*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
1071*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1072*8975f5c5SAndroid Build Coastguard Worker
1073*8975f5c5SAndroid Build Coastguard Worker // Retrieving pixel color
1074*8975f5c5SAndroid Build Coastguard Worker void *mappedPtr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT);
1075*8975f5c5SAndroid Build Coastguard Worker GLColor *dataColor = static_cast<GLColor *>(mappedPtr);
1076*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1077*8975f5c5SAndroid Build Coastguard Worker
1078*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::red, dataColor[0]);
1079*8975f5c5SAndroid Build Coastguard Worker
1080*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
1081*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1082*8975f5c5SAndroid Build Coastguard Worker }
1083*8975f5c5SAndroid Build Coastguard Worker
1084*8975f5c5SAndroid Build Coastguard Worker // Read pixels with pack buffer. ES3+.
TEST_P(MultisampledRenderToTextureES3Test,ReadPixelsTest)1085*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, ReadPixelsTest)
1086*8975f5c5SAndroid Build Coastguard Worker {
1087*8975f5c5SAndroid Build Coastguard Worker readPixelsTestCommon(false);
1088*8975f5c5SAndroid Build Coastguard Worker }
1089*8975f5c5SAndroid Build Coastguard Worker
1090*8975f5c5SAndroid Build Coastguard Worker // Read pixels with pack buffer from renderbuffer. ES3+.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferReadPixelsTest)1091*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferReadPixelsTest)
1092*8975f5c5SAndroid Build Coastguard Worker {
1093*8975f5c5SAndroid Build Coastguard Worker // D3D backend doesn't implement multisampled render to texture renderbuffers correctly.
1094*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42261786
1095*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsD3D());
1096*8975f5c5SAndroid Build Coastguard Worker
1097*8975f5c5SAndroid Build Coastguard Worker readPixelsTestCommon(true);
1098*8975f5c5SAndroid Build Coastguard Worker }
1099*8975f5c5SAndroid Build Coastguard Worker
copyTexImageTestCommon(bool useRenderbuffer)1100*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureTest::copyTexImageTestCommon(bool useRenderbuffer)
1101*8975f5c5SAndroid Build Coastguard Worker {
1102*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1103*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 16;
1104*8975f5c5SAndroid Build Coastguard Worker
1105*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
1106*8975f5c5SAndroid Build Coastguard Worker
1107*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
1108*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
1109*8975f5c5SAndroid Build Coastguard Worker
1110*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
1111*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer;
1112*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
1113*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &texture, &renderbuffer);
1114*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1115*8975f5c5SAndroid Build Coastguard Worker
1116*8975f5c5SAndroid Build Coastguard Worker // Set color for framebuffer
1117*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.25f, 1.0f, 0.75f, 0.5f);
1118*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1119*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1120*8975f5c5SAndroid Build Coastguard Worker
1121*8975f5c5SAndroid Build Coastguard Worker GLTexture copyToTex;
1122*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, copyToTex);
1123*8975f5c5SAndroid Build Coastguard Worker
1124*8975f5c5SAndroid Build Coastguard Worker // Disable mipmapping
1125*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1126*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1127*8975f5c5SAndroid Build Coastguard Worker
1128*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, kSize, kSize, 0);
1129*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1130*8975f5c5SAndroid Build Coastguard Worker
1131*8975f5c5SAndroid Build Coastguard Worker verifyResults(copyToTex, {64, 255, 191, 255}, kSize, 0, 0, kSize, kSize);
1132*8975f5c5SAndroid Build Coastguard Worker }
1133*8975f5c5SAndroid Build Coastguard Worker
1134*8975f5c5SAndroid Build Coastguard Worker // CopyTexImage from a multisampled texture functionality test.
TEST_P(MultisampledRenderToTextureTest,CopyTexImageTest)1135*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, CopyTexImageTest)
1136*8975f5c5SAndroid Build Coastguard Worker {
1137*8975f5c5SAndroid Build Coastguard Worker copyTexImageTestCommon(false);
1138*8975f5c5SAndroid Build Coastguard Worker }
1139*8975f5c5SAndroid Build Coastguard Worker
1140*8975f5c5SAndroid Build Coastguard Worker // CopyTexImage from a multisampled texture functionality test using renderbuffer.
TEST_P(MultisampledRenderToTextureTest,RenderbufferCopyTexImageTest)1141*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, RenderbufferCopyTexImageTest)
1142*8975f5c5SAndroid Build Coastguard Worker {
1143*8975f5c5SAndroid Build Coastguard Worker copyTexImageTestCommon(true);
1144*8975f5c5SAndroid Build Coastguard Worker }
1145*8975f5c5SAndroid Build Coastguard Worker
copyTexSubImageTestCommon(bool useRenderbuffer)1146*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureTest::copyTexSubImageTestCommon(bool useRenderbuffer)
1147*8975f5c5SAndroid Build Coastguard Worker {
1148*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1149*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 16;
1150*8975f5c5SAndroid Build Coastguard Worker
1151*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
1152*8975f5c5SAndroid Build Coastguard Worker
1153*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer copyFBO0;
1154*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, copyFBO0);
1155*8975f5c5SAndroid Build Coastguard Worker
1156*8975f5c5SAndroid Build Coastguard Worker // Create color attachment for copyFBO0
1157*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
1158*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer;
1159*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
1160*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &texture, &renderbuffer);
1161*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1162*8975f5c5SAndroid Build Coastguard Worker
1163*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer copyFBO1;
1164*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, copyFBO1);
1165*8975f5c5SAndroid Build Coastguard Worker
1166*8975f5c5SAndroid Build Coastguard Worker // Create color attachment for copyFBO1
1167*8975f5c5SAndroid Build Coastguard Worker GLTexture texture1;
1168*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer1;
1169*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
1170*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &texture1, &renderbuffer1);
1171*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1172*8975f5c5SAndroid Build Coastguard Worker
1173*8975f5c5SAndroid Build Coastguard Worker // Set color for copyFBO0
1174*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, copyFBO0);
1175*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.25f, 1.0f, 0.75f, 0.5f);
1176*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1177*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1178*8975f5c5SAndroid Build Coastguard Worker
1179*8975f5c5SAndroid Build Coastguard Worker // Set color for copyFBO1
1180*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, copyFBO1);
1181*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.75f, 0.5f, 0.25f);
1182*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1183*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1184*8975f5c5SAndroid Build Coastguard Worker
1185*8975f5c5SAndroid Build Coastguard Worker GLTexture copyToTex;
1186*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, copyToTex);
1187*8975f5c5SAndroid Build Coastguard Worker
1188*8975f5c5SAndroid Build Coastguard Worker // Disable mipmapping
1189*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1190*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1191*8975f5c5SAndroid Build Coastguard Worker
1192*8975f5c5SAndroid Build Coastguard Worker // copyFBO0 -> copyToTex
1193*8975f5c5SAndroid Build Coastguard Worker // copyToTex should hold what was originally in copyFBO0 : (.25, 1, .75, .5)
1194*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, copyFBO0);
1195*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, kSize, kSize, 0);
1196*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1197*8975f5c5SAndroid Build Coastguard Worker
1198*8975f5c5SAndroid Build Coastguard Worker const GLColor expected0(64, 255, 191, 255);
1199*8975f5c5SAndroid Build Coastguard Worker verifyResults(copyToTex, expected0, kSize, 0, 0, kSize, kSize);
1200*8975f5c5SAndroid Build Coastguard Worker
1201*8975f5c5SAndroid Build Coastguard Worker // copyFBO[1] - copySubImage -> copyToTex
1202*8975f5c5SAndroid Build Coastguard Worker // copyToTex should have subportion what was in copyFBO[1] : (1, .75, .5, .25)
1203*8975f5c5SAndroid Build Coastguard Worker // The rest should still be untouched: (.25, 1, .75, .5)
1204*8975f5c5SAndroid Build Coastguard Worker GLint half = kSize / 2;
1205*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, copyFBO1);
1206*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage2D(GL_TEXTURE_2D, 0, half, half, half, half, half, half);
1207*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1208*8975f5c5SAndroid Build Coastguard Worker
1209*8975f5c5SAndroid Build Coastguard Worker const GLColor expected1(255, 191, 127, 255);
1210*8975f5c5SAndroid Build Coastguard Worker verifyResults(copyToTex, expected1, kSize, half, half, kSize, kSize);
1211*8975f5c5SAndroid Build Coastguard Worker
1212*8975f5c5SAndroid Build Coastguard Worker // Verify rest is untouched
1213*8975f5c5SAndroid Build Coastguard Worker verifyResults(copyToTex, expected0, kSize, 0, 0, half, half);
1214*8975f5c5SAndroid Build Coastguard Worker verifyResults(copyToTex, expected0, kSize, 0, half, half, kSize);
1215*8975f5c5SAndroid Build Coastguard Worker verifyResults(copyToTex, expected0, kSize, half, 0, kSize, half);
1216*8975f5c5SAndroid Build Coastguard Worker }
1217*8975f5c5SAndroid Build Coastguard Worker
1218*8975f5c5SAndroid Build Coastguard Worker // CopyTexSubImage from a multisampled texture functionality test.
TEST_P(MultisampledRenderToTextureTest,CopyTexSubImageTest)1219*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, CopyTexSubImageTest)
1220*8975f5c5SAndroid Build Coastguard Worker {
1221*8975f5c5SAndroid Build Coastguard Worker copyTexSubImageTestCommon(false);
1222*8975f5c5SAndroid Build Coastguard Worker }
1223*8975f5c5SAndroid Build Coastguard Worker
1224*8975f5c5SAndroid Build Coastguard Worker // CopyTexSubImage from a multisampled texture functionality test with renderbuffers
TEST_P(MultisampledRenderToTextureTest,RenderbufferCopyTexSubImageTest)1225*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, RenderbufferCopyTexSubImageTest)
1226*8975f5c5SAndroid Build Coastguard Worker {
1227*8975f5c5SAndroid Build Coastguard Worker copyTexSubImageTestCommon(true);
1228*8975f5c5SAndroid Build Coastguard Worker }
1229*8975f5c5SAndroid Build Coastguard Worker
blitFramebufferTestCommon(bool useRenderbuffer)1230*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureES3Test::blitFramebufferTestCommon(bool useRenderbuffer)
1231*8975f5c5SAndroid Build Coastguard Worker {
1232*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1233*8975f5c5SAndroid Build Coastguard Worker
1234*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 16;
1235*8975f5c5SAndroid Build Coastguard Worker
1236*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
1237*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
1238*8975f5c5SAndroid Build Coastguard Worker
1239*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to use as source.
1240*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthMS;
1241*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthMS);
1242*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT24, kSize, kSize);
1243*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthMS);
1244*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1245*8975f5c5SAndroid Build Coastguard Worker
1246*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
1247*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
1248*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
1249*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS, &renderbufferMS);
1250*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1251*8975f5c5SAndroid Build Coastguard Worker
1252*8975f5c5SAndroid Build Coastguard Worker // Clear depth to 0.5 and color to green.
1253*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.5f);
1254*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1255*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
1256*8975f5c5SAndroid Build Coastguard Worker glFlush();
1257*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1258*8975f5c5SAndroid Build Coastguard Worker
1259*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
1260*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
1261*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawBlue, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
1262*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
1263*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl1_shaders::PositionAttrib(), -0.05f);
1264*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawBlue, essl1_shaders::PositionAttrib(), 0.05f);
1265*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1266*8975f5c5SAndroid Build Coastguard Worker
1267*8975f5c5SAndroid Build Coastguard Worker // Create single sampled framebuffer to use as dest.
1268*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboSS;
1269*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
1270*8975f5c5SAndroid Build Coastguard Worker GLTexture colorSS;
1271*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorSS);
1272*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1273*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorSS, 0);
1274*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1275*8975f5c5SAndroid Build Coastguard Worker
1276*8975f5c5SAndroid Build Coastguard Worker // Bind MS to READ as SS is already bound to DRAW.
1277*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fboMS);
1278*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1279*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1280*8975f5c5SAndroid Build Coastguard Worker
1281*8975f5c5SAndroid Build Coastguard Worker // Bind SS to READ so we can readPixels from it
1282*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
1283*8975f5c5SAndroid Build Coastguard Worker
1284*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1285*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red);
1286*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red);
1287*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red);
1288*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
1289*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1290*8975f5c5SAndroid Build Coastguard Worker }
1291*8975f5c5SAndroid Build Coastguard Worker
1292*8975f5c5SAndroid Build Coastguard Worker // BlitFramebuffer functionality test. ES3+.
TEST_P(MultisampledRenderToTextureES3Test,BlitFramebufferTest)1293*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, BlitFramebufferTest)
1294*8975f5c5SAndroid Build Coastguard Worker {
1295*8975f5c5SAndroid Build Coastguard Worker blitFramebufferTestCommon(false);
1296*8975f5c5SAndroid Build Coastguard Worker }
1297*8975f5c5SAndroid Build Coastguard Worker
1298*8975f5c5SAndroid Build Coastguard Worker // BlitFramebuffer functionality test with renderbuffer. ES3+.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferBlitFramebufferTest)1299*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferBlitFramebufferTest)
1300*8975f5c5SAndroid Build Coastguard Worker {
1301*8975f5c5SAndroid Build Coastguard Worker blitFramebufferTestCommon(true);
1302*8975f5c5SAndroid Build Coastguard Worker }
1303*8975f5c5SAndroid Build Coastguard Worker
1304*8975f5c5SAndroid Build Coastguard Worker // GenerateMipmap functionality test
TEST_P(MultisampledRenderToTextureTest,GenerateMipmapTest)1305*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, GenerateMipmapTest)
1306*8975f5c5SAndroid Build Coastguard Worker {
1307*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1308*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
1309*8975f5c5SAndroid Build Coastguard Worker
1310*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
1311*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mCopyTextureProgram);
1312*8975f5c5SAndroid Build Coastguard Worker
1313*8975f5c5SAndroid Build Coastguard Worker // Initialize texture with blue
1314*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
1315*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
1316*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, kSize, kSize, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
1317*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1318*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1319*8975f5c5SAndroid Build Coastguard Worker
1320*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
1321*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
1322*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
1323*8975f5c5SAndroid Build Coastguard Worker texture, 0, 4);
1324*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1325*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
1326*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1327*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
1328*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
1329*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1330*8975f5c5SAndroid Build Coastguard Worker
1331*8975f5c5SAndroid Build Coastguard Worker // Generate mipmap
1332*8975f5c5SAndroid Build Coastguard Worker glGenerateMipmap(GL_TEXTURE_2D);
1333*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1334*8975f5c5SAndroid Build Coastguard Worker
1335*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
1336*8975f5c5SAndroid Build Coastguard Worker
1337*8975f5c5SAndroid Build Coastguard Worker // Now draw the texture to various different sized areas.
1338*8975f5c5SAndroid Build Coastguard Worker clearAndDrawQuad(mCopyTextureProgram, kSize, kSize);
1339*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::blue);
1340*8975f5c5SAndroid Build Coastguard Worker
1341*8975f5c5SAndroid Build Coastguard Worker // Use mip level 1
1342*8975f5c5SAndroid Build Coastguard Worker clearAndDrawQuad(mCopyTextureProgram, kSize / 2, kSize / 2);
1343*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 4, kSize / 4, GLColor::blue);
1344*8975f5c5SAndroid Build Coastguard Worker
1345*8975f5c5SAndroid Build Coastguard Worker // Use mip level 2
1346*8975f5c5SAndroid Build Coastguard Worker clearAndDrawQuad(mCopyTextureProgram, kSize / 4, kSize / 4);
1347*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 8, kSize / 8, GLColor::blue);
1348*8975f5c5SAndroid Build Coastguard Worker
1349*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1350*8975f5c5SAndroid Build Coastguard Worker }
1351*8975f5c5SAndroid Build Coastguard Worker
drawCopyThenBlendCommon(bool useRenderbuffer)1352*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureTest::drawCopyThenBlendCommon(bool useRenderbuffer)
1353*8975f5c5SAndroid Build Coastguard Worker {
1354*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1355*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
1356*8975f5c5SAndroid Build Coastguard Worker
1357*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
1358*8975f5c5SAndroid Build Coastguard Worker
1359*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
1360*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
1361*8975f5c5SAndroid Build Coastguard Worker
1362*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
1363*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
1364*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
1365*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
1366*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS, &renderbufferMS);
1367*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1368*8975f5c5SAndroid Build Coastguard Worker
1369*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
1370*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1371*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
1372*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
1373*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
1374*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
1375*8975f5c5SAndroid Build Coastguard Worker
1376*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
1377*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1378*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1379*8975f5c5SAndroid Build Coastguard Worker
1380*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
1381*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
1382*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
1383*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
1384*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1385*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1386*8975f5c5SAndroid Build Coastguard Worker
1387*8975f5c5SAndroid Build Coastguard Worker // Draw again into the framebuffer, this time blending. This tests that the framebuffer's data,
1388*8975f5c5SAndroid Build Coastguard Worker // residing in the single-sampled texture, is available to the multisampled intermediate image
1389*8975f5c5SAndroid Build Coastguard Worker // for blending.
1390*8975f5c5SAndroid Build Coastguard Worker
1391*8975f5c5SAndroid Build Coastguard Worker // Blend half-transparent green into the multisampled color buffer.
1392*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 0.5f);
1393*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
1394*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1395*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1396*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1397*8975f5c5SAndroid Build Coastguard Worker
1398*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now yellow
1399*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected(127, 127, 0, 191);
1400*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
1401*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected, 1);
1402*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected, 1);
1403*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected, 1);
1404*8975f5c5SAndroid Build Coastguard Worker
1405*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
1406*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1407*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
1408*8975f5c5SAndroid Build Coastguard Worker
1409*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1410*8975f5c5SAndroid Build Coastguard Worker }
1411*8975f5c5SAndroid Build Coastguard Worker
1412*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, then blend. The copy will make sure an implicit resolve happens. Regardless, the
1413*8975f5c5SAndroid Build Coastguard Worker // following draw should retain the data written by the first draw command.
TEST_P(MultisampledRenderToTextureTest,DrawCopyThenBlend)1414*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, DrawCopyThenBlend)
1415*8975f5c5SAndroid Build Coastguard Worker {
1416*8975f5c5SAndroid Build Coastguard Worker drawCopyThenBlendCommon(false);
1417*8975f5c5SAndroid Build Coastguard Worker }
1418*8975f5c5SAndroid Build Coastguard Worker
1419*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, then blend. The copy will make sure an implicit resolve happens. Regardless, the
1420*8975f5c5SAndroid Build Coastguard Worker // following draw should retain the data written by the first draw command. Uses renderbuffer.
TEST_P(MultisampledRenderToTextureTest,RenderbufferDrawCopyThenBlend)1421*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, RenderbufferDrawCopyThenBlend)
1422*8975f5c5SAndroid Build Coastguard Worker {
1423*8975f5c5SAndroid Build Coastguard Worker drawCopyThenBlendCommon(true);
1424*8975f5c5SAndroid Build Coastguard Worker }
1425*8975f5c5SAndroid Build Coastguard Worker
clearDrawCopyThenBlendSameProgramCommon(bool useRenderbuffer)1426*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureTest::clearDrawCopyThenBlendSameProgramCommon(bool useRenderbuffer)
1427*8975f5c5SAndroid Build Coastguard Worker {
1428*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1429*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
1430*8975f5c5SAndroid Build Coastguard Worker
1431*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
1432*8975f5c5SAndroid Build Coastguard Worker
1433*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
1434*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
1435*8975f5c5SAndroid Build Coastguard Worker
1436*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
1437*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
1438*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
1439*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
1440*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS, &renderbufferMS);
1441*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1442*8975f5c5SAndroid Build Coastguard Worker
1443*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
1444*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1445*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
1446*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
1447*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
1448*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
1449*8975f5c5SAndroid Build Coastguard Worker
1450*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer.
1451*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.1f, 0.9f, 0.2f, 0.8f);
1452*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1453*8975f5c5SAndroid Build Coastguard Worker
1454*8975f5c5SAndroid Build Coastguard Worker // Then draw into it.
1455*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
1456*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1457*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1458*8975f5c5SAndroid Build Coastguard Worker
1459*8975f5c5SAndroid Build Coastguard Worker // Blend green into it. This makes sure that the blend after the resolve doesn't have different
1460*8975f5c5SAndroid Build Coastguard Worker // state from the one used here.
1461*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
1462*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
1463*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
1464*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1465*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1466*8975f5c5SAndroid Build Coastguard Worker
1467*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
1468*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
1469*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
1470*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
1471*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1472*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1473*8975f5c5SAndroid Build Coastguard Worker
1474*8975f5c5SAndroid Build Coastguard Worker // Draw again into the framebuffer, this time blending. This tests that the framebuffer's data,
1475*8975f5c5SAndroid Build Coastguard Worker // residing in the single-sampled texture, is available to the multisampled intermediate image
1476*8975f5c5SAndroid Build Coastguard Worker // for blending.
1477*8975f5c5SAndroid Build Coastguard Worker
1478*8975f5c5SAndroid Build Coastguard Worker // Blend blue into the multisampled color buffer.
1479*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
1480*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1481*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1482*8975f5c5SAndroid Build Coastguard Worker
1483*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now white
1484*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
1485*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::white);
1486*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::white);
1487*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::white);
1488*8975f5c5SAndroid Build Coastguard Worker
1489*8975f5c5SAndroid Build Coastguard Worker // Once again, clear and draw so the program is used again in the way it was first used.
1490*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1491*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_BLEND);
1492*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
1493*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1494*8975f5c5SAndroid Build Coastguard Worker
1495*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1496*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::blue);
1497*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::blue);
1498*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::blue);
1499*8975f5c5SAndroid Build Coastguard Worker
1500*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is yellow.
1501*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1502*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::yellow, kSize, 0, 0, kSize, kSize);
1503*8975f5c5SAndroid Build Coastguard Worker
1504*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1505*8975f5c5SAndroid Build Coastguard Worker }
1506*8975f5c5SAndroid Build Coastguard Worker
1507*8975f5c5SAndroid Build Coastguard Worker // Clear&Draw, copy, then blend with same program. The copy will make sure an implicit resolve
1508*8975f5c5SAndroid Build Coastguard Worker // happens. The second draw should retain the data written by the first draw command ("unresolve"
1509*8975f5c5SAndroid Build Coastguard Worker // operation). The same program is used for the first and second draw calls, and the fact that the
1510*8975f5c5SAndroid Build Coastguard Worker // attachment is cleared or unresolved should not cause issues. In the Vulkan backend, the program
1511*8975f5c5SAndroid Build Coastguard Worker // will be used in different subpass indices, so two graphics pipelines should be created for it.
TEST_P(MultisampledRenderToTextureTest,ClearDrawCopyThenBlendSameProgram)1512*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, ClearDrawCopyThenBlendSameProgram)
1513*8975f5c5SAndroid Build Coastguard Worker {
1514*8975f5c5SAndroid Build Coastguard Worker clearDrawCopyThenBlendSameProgramCommon(false);
1515*8975f5c5SAndroid Build Coastguard Worker }
1516*8975f5c5SAndroid Build Coastguard Worker
1517*8975f5c5SAndroid Build Coastguard Worker // Same as ClearDrawCopyThenBlendSameProgram but with renderbuffers
TEST_P(MultisampledRenderToTextureTest,RenderbufferClearDrawCopyThenBlendSameProgram)1518*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, RenderbufferClearDrawCopyThenBlendSameProgram)
1519*8975f5c5SAndroid Build Coastguard Worker {
1520*8975f5c5SAndroid Build Coastguard Worker clearDrawCopyThenBlendSameProgramCommon(true);
1521*8975f5c5SAndroid Build Coastguard Worker }
1522*8975f5c5SAndroid Build Coastguard Worker
1523*8975f5c5SAndroid Build Coastguard Worker // Similar to RenderbufferClearDrawCopyThenBlendSameProgram, but with the depth/stencil attachment
1524*8975f5c5SAndroid Build Coastguard Worker // being unresolved only.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferClearDrawCopyThenBlendWithDepthStencilSameProgram)1525*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test,
1526*8975f5c5SAndroid Build Coastguard Worker RenderbufferClearDrawCopyThenBlendWithDepthStencilSameProgram)
1527*8975f5c5SAndroid Build Coastguard Worker {
1528*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1529*8975f5c5SAndroid Build Coastguard Worker
1530*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
1531*8975f5c5SAndroid Build Coastguard Worker
1532*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
1533*8975f5c5SAndroid Build Coastguard Worker
1534*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
1535*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
1536*8975f5c5SAndroid Build Coastguard Worker
1537*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
1538*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
1539*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
1540*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1541*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color,
1542*8975f5c5SAndroid Build Coastguard Worker 0, 4);
1543*8975f5c5SAndroid Build Coastguard Worker
1544*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencil;
1545*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
1546*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kSize, kSize);
1547*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1548*8975f5c5SAndroid Build Coastguard Worker depthStencil);
1549*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1550*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1551*8975f5c5SAndroid Build Coastguard Worker
1552*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
1553*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1554*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
1555*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
1556*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
1557*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
1558*8975f5c5SAndroid Build Coastguard Worker
1559*8975f5c5SAndroid Build Coastguard Worker // Enable write to depth/stencil so the attachment has valid contents, but always pass the test.
1560*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
1561*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
1562*8975f5c5SAndroid Build Coastguard Worker
1563*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
1564*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x55, 0xFF);
1565*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1566*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
1567*8975f5c5SAndroid Build Coastguard Worker
1568*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer.
1569*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.1f, 0.9f, 0.2f, 0.8f);
1570*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1571*8975f5c5SAndroid Build Coastguard Worker
1572*8975f5c5SAndroid Build Coastguard Worker // Then draw into it.
1573*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
1574*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 1.0f);
1575*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1576*8975f5c5SAndroid Build Coastguard Worker
1577*8975f5c5SAndroid Build Coastguard Worker // Blend green into it. This makes sure that the blend after the resolve doesn't have different
1578*8975f5c5SAndroid Build Coastguard Worker // state from the one used here. Additionally, test that the previous draw output the correct
1579*8975f5c5SAndroid Build Coastguard Worker // depth/stencil data. Again, this makes sure that the draw call after the resolve doesn't have
1580*8975f5c5SAndroid Build Coastguard Worker // different has depth/stencil test state.
1581*8975f5c5SAndroid Build Coastguard Worker
1582*8975f5c5SAndroid Build Coastguard Worker // If depth is not set to 1, rendering would fail.
1583*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
1584*8975f5c5SAndroid Build Coastguard Worker
1585*8975f5c5SAndroid Build Coastguard Worker // If stencil is not set to 0x55, rendering would fail.
1586*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x55, 0xFF);
1587*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
1588*8975f5c5SAndroid Build Coastguard Worker
1589*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
1590*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
1591*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
1592*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.95f);
1593*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1594*8975f5c5SAndroid Build Coastguard Worker
1595*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
1596*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
1597*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
1598*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
1599*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1600*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1601*8975f5c5SAndroid Build Coastguard Worker
1602*8975f5c5SAndroid Build Coastguard Worker // Clear color (but not depth/stencil), and draw again into the framebuffer, this time blending.
1603*8975f5c5SAndroid Build Coastguard Worker // Additionally, make sure the depth/stencil data are retained.
1604*8975f5c5SAndroid Build Coastguard Worker
1605*8975f5c5SAndroid Build Coastguard Worker // Clear color (to blue), but not depth/stencil.
1606*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
1607*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1608*8975f5c5SAndroid Build Coastguard Worker
1609*8975f5c5SAndroid Build Coastguard Worker // Blend green into the multisampled color buffer.
1610*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
1611*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.9f);
1612*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1613*8975f5c5SAndroid Build Coastguard Worker
1614*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now cyan
1615*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
1616*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::cyan);
1617*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::cyan);
1618*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::cyan);
1619*8975f5c5SAndroid Build Coastguard Worker
1620*8975f5c5SAndroid Build Coastguard Worker // Once again, clear and draw so the program is used again in the way it was first used.
1621*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1622*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_BLEND);
1623*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
1624*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x55, 0xFF);
1625*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1626*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
1627*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1628*8975f5c5SAndroid Build Coastguard Worker
1629*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1630*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::blue);
1631*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::blue);
1632*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::blue);
1633*8975f5c5SAndroid Build Coastguard Worker
1634*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is yellow.
1635*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1636*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::yellow, kSize, 0, 0, kSize, kSize);
1637*8975f5c5SAndroid Build Coastguard Worker
1638*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1639*8975f5c5SAndroid Build Coastguard Worker }
1640*8975f5c5SAndroid Build Coastguard Worker
drawCopyDrawThenMaskedClearCommon(bool useRenderbuffer)1641*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureTest::drawCopyDrawThenMaskedClearCommon(bool useRenderbuffer)
1642*8975f5c5SAndroid Build Coastguard Worker {
1643*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1644*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
1645*8975f5c5SAndroid Build Coastguard Worker
1646*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
1647*8975f5c5SAndroid Build Coastguard Worker
1648*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
1649*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
1650*8975f5c5SAndroid Build Coastguard Worker
1651*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
1652*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
1653*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
1654*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
1655*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS, &renderbufferMS);
1656*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1657*8975f5c5SAndroid Build Coastguard Worker
1658*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
1659*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1660*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
1661*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
1662*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
1663*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
1664*8975f5c5SAndroid Build Coastguard Worker
1665*8975f5c5SAndroid Build Coastguard Worker // Draw into framebuffer.
1666*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
1667*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1668*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1669*8975f5c5SAndroid Build Coastguard Worker
1670*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
1671*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
1672*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
1673*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
1674*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1675*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1676*8975f5c5SAndroid Build Coastguard Worker
1677*8975f5c5SAndroid Build Coastguard Worker // Draw again into the framebuffer, this time blending. Afterwards, issue a masked clear. This
1678*8975f5c5SAndroid Build Coastguard Worker // ensures that previous resolved data is unresolved, and mid-render-pass clears work correctly.
1679*8975f5c5SAndroid Build Coastguard Worker
1680*8975f5c5SAndroid Build Coastguard Worker // Draw green into the multisampled color buffer.
1681*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
1682*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1683*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1684*8975f5c5SAndroid Build Coastguard Worker
1685*8975f5c5SAndroid Build Coastguard Worker // Issue a masked clear.
1686*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.1f, 0.9f, 1.0f, 0.8f);
1687*8975f5c5SAndroid Build Coastguard Worker glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_FALSE);
1688*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1689*8975f5c5SAndroid Build Coastguard Worker
1690*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now cyan
1691*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
1692*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::cyan);
1693*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::cyan);
1694*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::cyan);
1695*8975f5c5SAndroid Build Coastguard Worker
1696*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
1697*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1698*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
1699*8975f5c5SAndroid Build Coastguard Worker
1700*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1701*8975f5c5SAndroid Build Coastguard Worker }
1702*8975f5c5SAndroid Build Coastguard Worker
1703*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, draw then issue a masked clear. The copy will make sure an implicit resolve
1704*8975f5c5SAndroid Build Coastguard Worker // happens. The second draw should retain the data written by the first draw command ("unresolve"
1705*8975f5c5SAndroid Build Coastguard Worker // operation). The final clear uses a draw call to perform the clear in the Vulkan backend, and it
1706*8975f5c5SAndroid Build Coastguard Worker // should use the correct subpass index.
TEST_P(MultisampledRenderToTextureTest,DrawCopyDrawThenMaskedClear)1707*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, DrawCopyDrawThenMaskedClear)
1708*8975f5c5SAndroid Build Coastguard Worker {
1709*8975f5c5SAndroid Build Coastguard Worker drawCopyDrawThenMaskedClearCommon(false);
1710*8975f5c5SAndroid Build Coastguard Worker }
1711*8975f5c5SAndroid Build Coastguard Worker
1712*8975f5c5SAndroid Build Coastguard Worker // Same as DrawCopyDrawThenMaskedClearCommon but with renderbuffers
TEST_P(MultisampledRenderToTextureTest,RenderbufferDrawCopyDrawThenMaskedClear)1713*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, RenderbufferDrawCopyDrawThenMaskedClear)
1714*8975f5c5SAndroid Build Coastguard Worker {
1715*8975f5c5SAndroid Build Coastguard Worker drawCopyDrawThenMaskedClearCommon(true);
1716*8975f5c5SAndroid Build Coastguard Worker }
1717*8975f5c5SAndroid Build Coastguard Worker
drawCopyDrawAttachInvalidatedThenDrawCommon(bool useRenderbuffer)1718*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureES3Test::drawCopyDrawAttachInvalidatedThenDrawCommon(
1719*8975f5c5SAndroid Build Coastguard Worker bool useRenderbuffer)
1720*8975f5c5SAndroid Build Coastguard Worker {
1721*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1722*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
1723*8975f5c5SAndroid Build Coastguard Worker
1724*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
1725*8975f5c5SAndroid Build Coastguard Worker
1726*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
1727*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
1728*8975f5c5SAndroid Build Coastguard Worker
1729*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
1730*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
1731*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
1732*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
1733*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS, &renderbufferMS);
1734*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1735*8975f5c5SAndroid Build Coastguard Worker
1736*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
1737*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1738*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
1739*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
1740*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
1741*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
1742*8975f5c5SAndroid Build Coastguard Worker
1743*8975f5c5SAndroid Build Coastguard Worker // Clear and draw into framebuffer.
1744*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1745*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
1746*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1747*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1748*8975f5c5SAndroid Build Coastguard Worker
1749*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
1750*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
1751*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
1752*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
1753*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1754*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1755*8975f5c5SAndroid Build Coastguard Worker
1756*8975f5c5SAndroid Build Coastguard Worker // Draw green into framebuffer. This will unresolve color.
1757*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
1758*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1759*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1760*8975f5c5SAndroid Build Coastguard Worker
1761*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer and invalidate its attachment.
1762*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer invalidateFboMS;
1763*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, invalidateFboMS);
1764*8975f5c5SAndroid Build Coastguard Worker
1765*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
1766*8975f5c5SAndroid Build Coastguard Worker GLTexture invalidateTextureMS;
1767*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer invalidateRenderbufferMS;
1768*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
1769*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &invalidateTextureMS,
1770*8975f5c5SAndroid Build Coastguard Worker &invalidateRenderbufferMS);
1771*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1772*8975f5c5SAndroid Build Coastguard Worker
1773*8975f5c5SAndroid Build Coastguard Worker // Invalidate the attachment.
1774*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachments[] = {GL_COLOR_ATTACHMENT0};
1775*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, invalidateAttachments);
1776*8975f5c5SAndroid Build Coastguard Worker
1777*8975f5c5SAndroid Build Coastguard Worker // Replace the original framebuffer's attachment with the invalidated one.
1778*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
1779*8975f5c5SAndroid Build Coastguard Worker if (useRenderbuffer)
1780*8975f5c5SAndroid Build Coastguard Worker {
1781*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
1782*8975f5c5SAndroid Build Coastguard Worker invalidateRenderbufferMS);
1783*8975f5c5SAndroid Build Coastguard Worker }
1784*8975f5c5SAndroid Build Coastguard Worker else
1785*8975f5c5SAndroid Build Coastguard Worker {
1786*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
1787*8975f5c5SAndroid Build Coastguard Worker invalidateTextureMS, 0, 4);
1788*8975f5c5SAndroid Build Coastguard Worker }
1789*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1790*8975f5c5SAndroid Build Coastguard Worker
1791*8975f5c5SAndroid Build Coastguard Worker // Draw blue into the multisampled color buffer.
1792*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
1793*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1794*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1795*8975f5c5SAndroid Build Coastguard Worker
1796*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now blue
1797*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1798*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::blue);
1799*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::blue);
1800*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::blue);
1801*8975f5c5SAndroid Build Coastguard Worker
1802*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
1803*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1804*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
1805*8975f5c5SAndroid Build Coastguard Worker
1806*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1807*8975f5c5SAndroid Build Coastguard Worker }
1808*8975f5c5SAndroid Build Coastguard Worker
1809*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, draw, attach an invalidated image then draw. The second draw will need to unresolve
1810*8975f5c5SAndroid Build Coastguard Worker // color. Attaching an invalidated image changes the framebuffer, and the following draw doesn't
1811*8975f5c5SAndroid Build Coastguard Worker // require an unresolve. In the Vulkan backend, mismatches in unresolve state between framebuffer
1812*8975f5c5SAndroid Build Coastguard Worker // and render pass will result in an ASSERT.
TEST_P(MultisampledRenderToTextureES3Test,DrawCopyDrawAttachInvalidatedThenDraw)1813*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, DrawCopyDrawAttachInvalidatedThenDraw)
1814*8975f5c5SAndroid Build Coastguard Worker {
1815*8975f5c5SAndroid Build Coastguard Worker drawCopyDrawAttachInvalidatedThenDrawCommon(false);
1816*8975f5c5SAndroid Build Coastguard Worker }
1817*8975f5c5SAndroid Build Coastguard Worker
1818*8975f5c5SAndroid Build Coastguard Worker // Same as DrawCopyDrawAttachInvalidatedThenDraw but with renderbuffers
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferDrawCopyDrawAttachInvalidatedThenDraw)1819*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDrawCopyDrawAttachInvalidatedThenDraw)
1820*8975f5c5SAndroid Build Coastguard Worker {
1821*8975f5c5SAndroid Build Coastguard Worker drawCopyDrawAttachInvalidatedThenDrawCommon(true);
1822*8975f5c5SAndroid Build Coastguard Worker }
1823*8975f5c5SAndroid Build Coastguard Worker
1824*8975f5c5SAndroid Build Coastguard Worker // Draw with a stencil-only attachment once without needing to unresolve it, and once needing to.
1825*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug in the Vulkan backend where the state of stencil unresolve attachment's
1826*8975f5c5SAndroid Build Coastguard Worker // existence was masked out by mistake in the framebuffer cache key, so the same framebuffer object
1827*8975f5c5SAndroid Build Coastguard Worker // was used for both render passes, even though they could have different subpass counts due to
1828*8975f5c5SAndroid Build Coastguard Worker // stencil unresolve.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferDrawStencilThenUnresolveStencil)1829*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDrawStencilThenUnresolveStencil)
1830*8975f5c5SAndroid Build Coastguard Worker {
1831*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1832*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
1833*8975f5c5SAndroid Build Coastguard Worker
1834*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
1835*8975f5c5SAndroid Build Coastguard Worker
1836*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1837*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
1838*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
1839*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
1840*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
1841*8975f5c5SAndroid Build Coastguard Worker
1842*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
1843*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
1844*8975f5c5SAndroid Build Coastguard Worker
1845*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
1846*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
1847*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(false, kSize, GL_COLOR_ATTACHMENT0, nullptr, mTestSampleCount,
1848*8975f5c5SAndroid Build Coastguard Worker &textureMS, nullptr);
1849*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1850*8975f5c5SAndroid Build Coastguard Worker
1851*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer dsRenderbufferMS;
1852*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, dsRenderbufferMS);
1853*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, mTestSampleCount, GL_STENCIL_INDEX8, kSize,
1854*8975f5c5SAndroid Build Coastguard Worker kSize);
1855*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1856*8975f5c5SAndroid Build Coastguard Worker dsRenderbufferMS);
1857*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1858*8975f5c5SAndroid Build Coastguard Worker
1859*8975f5c5SAndroid Build Coastguard Worker // Draw red once with stencil cleared, not needing unresolve
1860*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.1, 0.2, 0.3, 0.4);
1861*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0);
1862*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1863*8975f5c5SAndroid Build Coastguard Worker
1864*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
1865*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x55, 0xFF);
1866*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
1867*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
1868*8975f5c5SAndroid Build Coastguard Worker
1869*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
1870*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 1.0f);
1871*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1872*8975f5c5SAndroid Build Coastguard Worker
1873*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy color into it, this breaks the render pass
1874*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
1875*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
1876*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1877*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1878*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
1879*8975f5c5SAndroid Build Coastguard Worker
1880*8975f5c5SAndroid Build Coastguard Worker // Clear the color, so that only stencil needs unresolving.
1881*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1882*8975f5c5SAndroid Build Coastguard Worker
1883*8975f5c5SAndroid Build Coastguard Worker // Draw green, expecting correct stencil. This unresolves stencil.
1884*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x55, 0xFF);
1885*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
1886*8975f5c5SAndroid Build Coastguard Worker
1887*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
1888*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 1.0f);
1889*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1890*8975f5c5SAndroid Build Coastguard Worker
1891*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now green
1892*8975f5c5SAndroid Build Coastguard Worker verifyResults(textureMS, GLColor::green, kSize, 0, 0, kSize, kSize);
1893*8975f5c5SAndroid Build Coastguard Worker
1894*8975f5c5SAndroid Build Coastguard Worker // For completeness, also verify that the copy texture is red
1895*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
1896*8975f5c5SAndroid Build Coastguard Worker
1897*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1898*8975f5c5SAndroid Build Coastguard Worker }
1899*8975f5c5SAndroid Build Coastguard Worker
drawCopyDrawAttachDepthStencilClearThenDrawCommon(bool useRenderbuffer)1900*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureES3Test::drawCopyDrawAttachDepthStencilClearThenDrawCommon(
1901*8975f5c5SAndroid Build Coastguard Worker bool useRenderbuffer)
1902*8975f5c5SAndroid Build Coastguard Worker {
1903*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
1904*8975f5c5SAndroid Build Coastguard Worker // Use glFramebufferTexture2DMultisampleEXT for depth/stencil texture is only supported with
1905*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_multisampled_render_to_texture2.
1906*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!useRenderbuffer &&
1907*8975f5c5SAndroid Build Coastguard Worker !EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2"));
1908*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
1909*8975f5c5SAndroid Build Coastguard Worker
1910*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263509
1911*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsD3D11());
1912*8975f5c5SAndroid Build Coastguard Worker
1913*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
1914*8975f5c5SAndroid Build Coastguard Worker
1915*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
1916*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
1917*8975f5c5SAndroid Build Coastguard Worker
1918*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
1919*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
1920*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
1921*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
1922*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS, &renderbufferMS);
1923*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1924*8975f5c5SAndroid Build Coastguard Worker
1925*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
1926*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1927*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
1928*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
1929*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
1930*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
1931*8975f5c5SAndroid Build Coastguard Worker
1932*8975f5c5SAndroid Build Coastguard Worker // Clear and draw into framebuffer. There is no unresolve due to clear. The clear value is
1933*8975f5c5SAndroid Build Coastguard Worker // irrelevant as the contents are immediately overdrawn with the draw call.
1934*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1935*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
1936*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1937*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1938*8975f5c5SAndroid Build Coastguard Worker
1939*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
1940*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
1941*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
1942*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
1943*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1944*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1945*8975f5c5SAndroid Build Coastguard Worker
1946*8975f5c5SAndroid Build Coastguard Worker // Draw green into framebuffer. This will unresolve color.
1947*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
1948*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
1949*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1950*8975f5c5SAndroid Build Coastguard Worker
1951*8975f5c5SAndroid Build Coastguard Worker // Attach a depth/stencil attachment.
1952*8975f5c5SAndroid Build Coastguard Worker GLTexture dsTextureMS;
1953*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer dsRenderbufferMS;
1954*8975f5c5SAndroid Build Coastguard Worker createAndAttachDepthStencilAttachment(useRenderbuffer, kSize, &dsTextureMS, &dsRenderbufferMS);
1955*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1956*8975f5c5SAndroid Build Coastguard Worker
1957*8975f5c5SAndroid Build Coastguard Worker // Clear all attachments, so no unresolve would be necessary.
1958*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
1959*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(1);
1960*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x55);
1961*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1962*8975f5c5SAndroid Build Coastguard Worker
1963*8975f5c5SAndroid Build Coastguard Worker // If depth is not cleared to 1, rendering would fail.
1964*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
1965*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
1966*8975f5c5SAndroid Build Coastguard Worker
1967*8975f5c5SAndroid Build Coastguard Worker // If stencil is not cleared to 0x55, rendering would fail.
1968*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
1969*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x55, 0xFF);
1970*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
1971*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
1972*8975f5c5SAndroid Build Coastguard Worker
1973*8975f5c5SAndroid Build Coastguard Worker // Blend half-transparent green into the multisampled color buffer.
1974*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 0.5f);
1975*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
1976*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1977*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.95f);
1978*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1979*8975f5c5SAndroid Build Coastguard Worker
1980*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now cyan
1981*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected2(0, 127, 127, 191);
1982*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected2, 1);
1983*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected2, 1);
1984*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected2, 1);
1985*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected2, 1);
1986*8975f5c5SAndroid Build Coastguard Worker
1987*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
1988*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1989*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
1990*8975f5c5SAndroid Build Coastguard Worker
1991*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1992*8975f5c5SAndroid Build Coastguard Worker }
1993*8975f5c5SAndroid Build Coastguard Worker
1994*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, draw, attach depth/stencil, clear then draw. The second draw will need to unresolve
1995*8975f5c5SAndroid Build Coastguard Worker // color. Attaching depth/stencil changes the framebuffer, and the following clear ensures no
1996*8975f5c5SAndroid Build Coastguard Worker // unresolve is necessary. In the Vulkan backend, mismatches in unresolve state between framebuffer
1997*8975f5c5SAndroid Build Coastguard Worker // and render pass will result in an ASSERT.
TEST_P(MultisampledRenderToTextureES3Test,DrawCopyDrawAttachDepthStencilClearThenDraw)1998*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, DrawCopyDrawAttachDepthStencilClearThenDraw)
1999*8975f5c5SAndroid Build Coastguard Worker {
2000*8975f5c5SAndroid Build Coastguard Worker drawCopyDrawAttachDepthStencilClearThenDrawCommon(false);
2001*8975f5c5SAndroid Build Coastguard Worker }
2002*8975f5c5SAndroid Build Coastguard Worker
2003*8975f5c5SAndroid Build Coastguard Worker // Same as DrawCopyDrawAttachDepthStencilClearThenDraw but with renderbuffers
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferDrawCopyDrawAttachDepthStencilClearThenDraw)2004*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDrawCopyDrawAttachDepthStencilClearThenDraw)
2005*8975f5c5SAndroid Build Coastguard Worker {
2006*8975f5c5SAndroid Build Coastguard Worker drawCopyDrawAttachDepthStencilClearThenDrawCommon(true);
2007*8975f5c5SAndroid Build Coastguard Worker }
2008*8975f5c5SAndroid Build Coastguard Worker
2009*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, redefine the color attachment with a different format, clear, copy then draw. The
2010*8975f5c5SAndroid Build Coastguard Worker // initial draw will need to unresolve color as the color attachment is preinitilized with data.
2011*8975f5c5SAndroid Build Coastguard Worker // Redefining the color attachment forces framebuffer to recreate when the clear is called. The
2012*8975f5c5SAndroid Build Coastguard Worker // second copy resolves the clear and the final draw unresolves again. In the Vulkan backend,
2013*8975f5c5SAndroid Build Coastguard Worker // mismatches in unresolve state between framebuffer and render pass will result in an ASSERT and a
2014*8975f5c5SAndroid Build Coastguard Worker // validation error (if ASSERT is removed).
TEST_P(MultisampledRenderToTextureES3Test,DrawCopyRedefineClearCopyThenDraw)2015*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, DrawCopyRedefineClearCopyThenDraw)
2016*8975f5c5SAndroid Build Coastguard Worker {
2017*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
2018*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
2019*8975f5c5SAndroid Build Coastguard Worker
2020*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
2021*8975f5c5SAndroid Build Coastguard Worker
2022*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
2023*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
2024*8975f5c5SAndroid Build Coastguard Worker
2025*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> initialColorData(kSize * kSize, GLColor::black);
2026*8975f5c5SAndroid Build Coastguard Worker
2027*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
2028*8975f5c5SAndroid Build Coastguard Worker GLTexture colorMS;
2029*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorMS);
2030*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2031*8975f5c5SAndroid Build Coastguard Worker initialColorData.data());
2032*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
2033*8975f5c5SAndroid Build Coastguard Worker colorMS, 0, 4);
2034*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2035*8975f5c5SAndroid Build Coastguard Worker
2036*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
2037*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2038*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
2039*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2040*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
2041*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2042*8975f5c5SAndroid Build Coastguard Worker
2043*8975f5c5SAndroid Build Coastguard Worker // Draw into framebuffer. This will unresolve color.
2044*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
2045*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2046*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2047*8975f5c5SAndroid Build Coastguard Worker
2048*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
2049*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2050*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2051*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
2052*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2053*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2054*8975f5c5SAndroid Build Coastguard Worker
2055*8975f5c5SAndroid Build Coastguard Worker // Incompatibly redefine the texture, forcing its image to be recreated.
2056*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorMS);
2057*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, kSize, kSize, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
2058*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2059*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2060*8975f5c5SAndroid Build Coastguard Worker
2061*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2062*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2063*8975f5c5SAndroid Build Coastguard Worker
2064*8975f5c5SAndroid Build Coastguard Worker // Create another texture and copy into it.
2065*8975f5c5SAndroid Build Coastguard Worker GLTexture texture2;
2066*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture2);
2067*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, kSize, kSize, 0);
2068*8975f5c5SAndroid Build Coastguard Worker
2069*8975f5c5SAndroid Build Coastguard Worker // Clear to green and blend blue into the multisampled color buffer.
2070*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
2071*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
2072*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
2073*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
2074*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2075*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2076*8975f5c5SAndroid Build Coastguard Worker
2077*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now cyan
2078*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
2079*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::cyan);
2080*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::cyan);
2081*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::cyan);
2082*8975f5c5SAndroid Build Coastguard Worker
2083*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
2084*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2085*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
2086*8975f5c5SAndroid Build Coastguard Worker
2087*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2088*8975f5c5SAndroid Build Coastguard Worker }
2089*8975f5c5SAndroid Build Coastguard Worker
2090*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, rebind the attachment, clear then draw. The initial draw will need to unresolve
2091*8975f5c5SAndroid Build Coastguard Worker // color. The framebuffer attachment is temporary changed and then reset back to the original.
2092*8975f5c5SAndroid Build Coastguard Worker // This causes the framebuffer to be recreated on the following clear and draw. The clear prevents
2093*8975f5c5SAndroid Build Coastguard Worker // the final draw from doing an unresolve. In the Vulkan backend, mismatches in unresolve state
2094*8975f5c5SAndroid Build Coastguard Worker // between framebuffer and render pass will result in an ASSERT and a validation error (if ASSERT is
2095*8975f5c5SAndroid Build Coastguard Worker // removed).
TEST_P(MultisampledRenderToTextureES3Test,DrawCopyRebindAttachmentClearThenDraw)2096*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, DrawCopyRebindAttachmentClearThenDraw)
2097*8975f5c5SAndroid Build Coastguard Worker {
2098*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
2099*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
2100*8975f5c5SAndroid Build Coastguard Worker
2101*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
2102*8975f5c5SAndroid Build Coastguard Worker
2103*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
2104*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
2105*8975f5c5SAndroid Build Coastguard Worker
2106*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> initialColorData(kSize * kSize, GLColor::black);
2107*8975f5c5SAndroid Build Coastguard Worker
2108*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
2109*8975f5c5SAndroid Build Coastguard Worker GLTexture colorMS;
2110*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorMS);
2111*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2112*8975f5c5SAndroid Build Coastguard Worker initialColorData.data());
2113*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
2114*8975f5c5SAndroid Build Coastguard Worker colorMS, 0, 4);
2115*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2116*8975f5c5SAndroid Build Coastguard Worker
2117*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
2118*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2119*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
2120*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2121*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
2122*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2123*8975f5c5SAndroid Build Coastguard Worker
2124*8975f5c5SAndroid Build Coastguard Worker // Draw into framebuffer. This will unresolve color.
2125*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
2126*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2127*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2128*8975f5c5SAndroid Build Coastguard Worker
2129*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
2130*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2131*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2132*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
2133*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2134*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2135*8975f5c5SAndroid Build Coastguard Worker
2136*8975f5c5SAndroid Build Coastguard Worker // Bind the framebuffer to another texture.
2137*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
2138*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
2139*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2140*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
2141*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2142*8975f5c5SAndroid Build Coastguard Worker
2143*8975f5c5SAndroid Build Coastguard Worker // Do whatever.
2144*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2145*8975f5c5SAndroid Build Coastguard Worker
2146*8975f5c5SAndroid Build Coastguard Worker // Rebind the framebuffer back to the original texture.
2147*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorMS);
2148*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
2149*8975f5c5SAndroid Build Coastguard Worker colorMS, 0, 4);
2150*8975f5c5SAndroid Build Coastguard Worker
2151*8975f5c5SAndroid Build Coastguard Worker // Clear to green and blend blue into the multisampled color buffer.
2152*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2153*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2154*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
2155*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
2156*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
2157*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
2158*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2159*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2160*8975f5c5SAndroid Build Coastguard Worker
2161*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now cyan
2162*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
2163*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::cyan);
2164*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::cyan);
2165*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::cyan);
2166*8975f5c5SAndroid Build Coastguard Worker
2167*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
2168*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2169*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
2170*8975f5c5SAndroid Build Coastguard Worker
2171*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2172*8975f5c5SAndroid Build Coastguard Worker }
2173*8975f5c5SAndroid Build Coastguard Worker
clearThenBlendCommon(bool useRenderbuffer)2174*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureTest::clearThenBlendCommon(bool useRenderbuffer)
2175*8975f5c5SAndroid Build Coastguard Worker {
2176*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
2177*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
2178*8975f5c5SAndroid Build Coastguard Worker
2179*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
2180*8975f5c5SAndroid Build Coastguard Worker
2181*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
2182*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
2183*8975f5c5SAndroid Build Coastguard Worker
2184*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
2185*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
2186*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
2187*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
2188*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS, &renderbufferMS);
2189*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2190*8975f5c5SAndroid Build Coastguard Worker
2191*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer.
2192*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2193*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2194*8975f5c5SAndroid Build Coastguard Worker
2195*8975f5c5SAndroid Build Coastguard Worker // Blend half-transparent green into the multisampled color buffer.
2196*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2197*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
2198*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2199*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
2200*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2201*8975f5c5SAndroid Build Coastguard Worker
2202*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 0.5f);
2203*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
2204*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2205*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2206*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2207*8975f5c5SAndroid Build Coastguard Worker
2208*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now yellow
2209*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected(127, 127, 0, 191);
2210*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
2211*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected, 1);
2212*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected, 1);
2213*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected, 1);
2214*8975f5c5SAndroid Build Coastguard Worker }
2215*8975f5c5SAndroid Build Coastguard Worker
2216*8975f5c5SAndroid Build Coastguard Worker // Clear then blend. The clear should be applied correctly.
TEST_P(MultisampledRenderToTextureTest,ClearThenBlend)2217*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, ClearThenBlend)
2218*8975f5c5SAndroid Build Coastguard Worker {
2219*8975f5c5SAndroid Build Coastguard Worker clearThenBlendCommon(false);
2220*8975f5c5SAndroid Build Coastguard Worker }
2221*8975f5c5SAndroid Build Coastguard Worker
2222*8975f5c5SAndroid Build Coastguard Worker // Clear then blend. The clear should be applied correctly. Uses renderbuffer.
TEST_P(MultisampledRenderToTextureTest,RenderbufferClearThenBlend)2223*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, RenderbufferClearThenBlend)
2224*8975f5c5SAndroid Build Coastguard Worker {
2225*8975f5c5SAndroid Build Coastguard Worker clearThenBlendCommon(true);
2226*8975f5c5SAndroid Build Coastguard Worker }
2227*8975f5c5SAndroid Build Coastguard Worker
depthStencilClearThenDrawCommon(bool useRenderbuffer)2228*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureES3Test::depthStencilClearThenDrawCommon(bool useRenderbuffer)
2229*8975f5c5SAndroid Build Coastguard Worker {
2230*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
2231*8975f5c5SAndroid Build Coastguard Worker if (!useRenderbuffer)
2232*8975f5c5SAndroid Build Coastguard Worker {
2233*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2"));
2234*8975f5c5SAndroid Build Coastguard Worker }
2235*8975f5c5SAndroid Build Coastguard Worker
2236*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
2237*8975f5c5SAndroid Build Coastguard Worker
2238*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
2239*8975f5c5SAndroid Build Coastguard Worker
2240*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
2241*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
2242*8975f5c5SAndroid Build Coastguard Worker
2243*8975f5c5SAndroid Build Coastguard Worker // Create framebuffer to draw into, with both color and depth attachments.
2244*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
2245*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
2246*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
2247*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS, &renderbufferMS);
2248*8975f5c5SAndroid Build Coastguard Worker
2249*8975f5c5SAndroid Build Coastguard Worker GLTexture dsTextureMS;
2250*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer dsRenderbufferMS;
2251*8975f5c5SAndroid Build Coastguard Worker createAndAttachDepthStencilAttachment(useRenderbuffer, kSize, &dsTextureMS, &dsRenderbufferMS);
2252*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2253*8975f5c5SAndroid Build Coastguard Worker
2254*8975f5c5SAndroid Build Coastguard Worker // Set viewport and clear depth/stencil
2255*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
2256*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(1);
2257*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x55);
2258*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2259*8975f5c5SAndroid Build Coastguard Worker
2260*8975f5c5SAndroid Build Coastguard Worker // If depth is not cleared to 1, rendering would fail.
2261*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
2262*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
2263*8975f5c5SAndroid Build Coastguard Worker
2264*8975f5c5SAndroid Build Coastguard Worker // If stencil is not cleared to 0x55, rendering would fail.
2265*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2266*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x55, 0xFF);
2267*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2268*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
2269*8975f5c5SAndroid Build Coastguard Worker
2270*8975f5c5SAndroid Build Coastguard Worker // Set up program
2271*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
2272*8975f5c5SAndroid Build Coastguard Worker
2273*8975f5c5SAndroid Build Coastguard Worker // Draw red
2274*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.0f);
2275*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2276*8975f5c5SAndroid Build Coastguard Worker
2277*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
2278*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2279*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2280*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
2281*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2282*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2283*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2284*8975f5c5SAndroid Build Coastguard Worker
2285*8975f5c5SAndroid Build Coastguard Worker // Verify.
2286*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
2287*8975f5c5SAndroid Build Coastguard Worker }
2288*8975f5c5SAndroid Build Coastguard Worker
2289*8975f5c5SAndroid Build Coastguard Worker // Clear depth stencil, then draw. The clear should be applied correctly.
TEST_P(MultisampledRenderToTextureES3Test,DepthStencilClearThenDraw)2290*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, DepthStencilClearThenDraw)
2291*8975f5c5SAndroid Build Coastguard Worker {
2292*8975f5c5SAndroid Build Coastguard Worker depthStencilClearThenDrawCommon(false);
2293*8975f5c5SAndroid Build Coastguard Worker }
2294*8975f5c5SAndroid Build Coastguard Worker
2295*8975f5c5SAndroid Build Coastguard Worker // Clear depth stencil, then draw. The clear should be applied correctly. Uses renderbuffer.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferDepthStencilClearThenDraw)2296*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDepthStencilClearThenDraw)
2297*8975f5c5SAndroid Build Coastguard Worker {
2298*8975f5c5SAndroid Build Coastguard Worker depthStencilClearThenDrawCommon(true);
2299*8975f5c5SAndroid Build Coastguard Worker }
2300*8975f5c5SAndroid Build Coastguard Worker
2301*8975f5c5SAndroid Build Coastguard Worker // Clear&Draw, copy, then blend similarly to RenderbufferClearDrawCopyThenBlendSameProgram. This
2302*8975f5c5SAndroid Build Coastguard Worker // tests uses a depth/stencil buffer and makes sure the second draw (in the second render pass)
2303*8975f5c5SAndroid Build Coastguard Worker // succeeds (i.e. depth/stencil data is not lost). Note that this test doesn't apply to
2304*8975f5c5SAndroid Build Coastguard Worker // depth/stencil textures as they are explicitly autoinvalidated between render passes.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferDepthStencilClearDrawCopyThenBlend)2305*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDepthStencilClearDrawCopyThenBlend)
2306*8975f5c5SAndroid Build Coastguard Worker {
2307*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
2308*8975f5c5SAndroid Build Coastguard Worker
2309*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263663
2310*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
2311*8975f5c5SAndroid Build Coastguard Worker
2312*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
2313*8975f5c5SAndroid Build Coastguard Worker
2314*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
2315*8975f5c5SAndroid Build Coastguard Worker
2316*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
2317*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2318*8975f5c5SAndroid Build Coastguard Worker
2319*8975f5c5SAndroid Build Coastguard Worker // Create framebuffer to draw into, with both color and depth/stencil attachments.
2320*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
2321*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
2322*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2323*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color,
2324*8975f5c5SAndroid Build Coastguard Worker 0, 4);
2325*8975f5c5SAndroid Build Coastguard Worker
2326*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencil;
2327*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
2328*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kSize, kSize);
2329*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2330*8975f5c5SAndroid Build Coastguard Worker depthStencil);
2331*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2332*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2333*8975f5c5SAndroid Build Coastguard Worker
2334*8975f5c5SAndroid Build Coastguard Worker // Set viewport and clear depth/stencil
2335*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
2336*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(1);
2337*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x55);
2338*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2339*8975f5c5SAndroid Build Coastguard Worker
2340*8975f5c5SAndroid Build Coastguard Worker // If depth is not cleared to 1, rendering would fail.
2341*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
2342*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
2343*8975f5c5SAndroid Build Coastguard Worker
2344*8975f5c5SAndroid Build Coastguard Worker // If stencil is not cleared to 0x55, rendering would fail.
2345*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2346*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x55, 0xFF);
2347*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2348*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
2349*8975f5c5SAndroid Build Coastguard Worker
2350*8975f5c5SAndroid Build Coastguard Worker // Set up program
2351*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2352*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
2353*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2354*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
2355*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2356*8975f5c5SAndroid Build Coastguard Worker
2357*8975f5c5SAndroid Build Coastguard Worker // Draw red
2358*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
2359*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.25f);
2360*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2361*8975f5c5SAndroid Build Coastguard Worker
2362*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
2363*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2364*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2365*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
2366*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2367*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2368*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2369*8975f5c5SAndroid Build Coastguard Worker
2370*8975f5c5SAndroid Build Coastguard Worker // Draw again into the framebuffer, this time blending. This tests that both the color and
2371*8975f5c5SAndroid Build Coastguard Worker // depth/stencil data are preserved after the resolve incurred by the copy above.
2372*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 0.5f);
2373*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
2374*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2375*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.0f);
2376*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2377*8975f5c5SAndroid Build Coastguard Worker
2378*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now yellow
2379*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected(127, 127, 0, 191);
2380*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
2381*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected, 1);
2382*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected, 1);
2383*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected, 1);
2384*8975f5c5SAndroid Build Coastguard Worker
2385*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
2386*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
2387*8975f5c5SAndroid Build Coastguard Worker }
2388*8975f5c5SAndroid Build Coastguard Worker
2389*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, then clear&blend. This tests uses a depth/stencil buffer and makes sure the second
2390*8975f5c5SAndroid Build Coastguard Worker // draw (in the second render pass) succeeds (i.e. depth/stencil data is not lost). The difference
2391*8975f5c5SAndroid Build Coastguard Worker // with RenderbufferDepthStencilClearDrawCopyThenBlend is that color is cleared in the second render
2392*8975f5c5SAndroid Build Coastguard Worker // pass, so only depth/stencil data is unresolved. This test doesn't apply to depth/stencil
2393*8975f5c5SAndroid Build Coastguard Worker // textures as they are explicitly autoinvalidated between render passes.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferDepthStencilDrawCopyClearThenBlend)2394*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDepthStencilDrawCopyClearThenBlend)
2395*8975f5c5SAndroid Build Coastguard Worker {
2396*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
2397*8975f5c5SAndroid Build Coastguard Worker
2398*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263663
2399*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
2400*8975f5c5SAndroid Build Coastguard Worker
2401*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
2402*8975f5c5SAndroid Build Coastguard Worker
2403*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
2404*8975f5c5SAndroid Build Coastguard Worker
2405*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
2406*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2407*8975f5c5SAndroid Build Coastguard Worker
2408*8975f5c5SAndroid Build Coastguard Worker // Create framebuffer to draw into, with both color and depth/stencil attachments.
2409*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
2410*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
2411*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2412*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color,
2413*8975f5c5SAndroid Build Coastguard Worker 0, 4);
2414*8975f5c5SAndroid Build Coastguard Worker
2415*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencil;
2416*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
2417*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kSize, kSize);
2418*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2419*8975f5c5SAndroid Build Coastguard Worker depthStencil);
2420*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2421*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2422*8975f5c5SAndroid Build Coastguard Worker
2423*8975f5c5SAndroid Build Coastguard Worker // Set viewport and clear depth/stencil through draw
2424*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
2425*8975f5c5SAndroid Build Coastguard Worker
2426*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
2427*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
2428*8975f5c5SAndroid Build Coastguard Worker
2429*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2430*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x55, 0xFF);
2431*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2432*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
2433*8975f5c5SAndroid Build Coastguard Worker
2434*8975f5c5SAndroid Build Coastguard Worker // Set up program
2435*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2436*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
2437*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2438*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
2439*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2440*8975f5c5SAndroid Build Coastguard Worker
2441*8975f5c5SAndroid Build Coastguard Worker // Draw red
2442*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
2443*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 1.0f);
2444*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2445*8975f5c5SAndroid Build Coastguard Worker
2446*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
2447*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2448*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2449*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
2450*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2451*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2452*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2453*8975f5c5SAndroid Build Coastguard Worker
2454*8975f5c5SAndroid Build Coastguard Worker // Clear color to blue
2455*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 0.0, 1.0, 1.0);
2456*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2457*8975f5c5SAndroid Build Coastguard Worker
2458*8975f5c5SAndroid Build Coastguard Worker // If depth is not cleared to 1, rendering would fail.
2459*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
2460*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
2461*8975f5c5SAndroid Build Coastguard Worker
2462*8975f5c5SAndroid Build Coastguard Worker // If stencil is not cleared to 0x55, rendering would fail.
2463*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2464*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x55, 0xFF);
2465*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2466*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
2467*8975f5c5SAndroid Build Coastguard Worker
2468*8975f5c5SAndroid Build Coastguard Worker // Draw again into the framebuffer, this time blending. This tests that depth/stencil data are
2469*8975f5c5SAndroid Build Coastguard Worker // preserved after the resolve incurred by the copy above and color is cleared correctly.
2470*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 0.5f);
2471*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
2472*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2473*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.0f);
2474*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2475*8975f5c5SAndroid Build Coastguard Worker
2476*8975f5c5SAndroid Build Coastguard Worker // Copy into the texture again.
2477*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2478*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
2479*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2480*8975f5c5SAndroid Build Coastguard Worker
2481*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now cyan
2482*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected(0, 127, 127, 191);
2483*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
2484*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected, 1);
2485*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected, 1);
2486*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected, 1);
2487*8975f5c5SAndroid Build Coastguard Worker
2488*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is also cyan.
2489*8975f5c5SAndroid Build Coastguard Worker const GLColor expectedCopyResult(0, 127, 127, 191);
2490*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, expectedCopyResult, kSize, 0, 0, kSize, kSize);
2491*8975f5c5SAndroid Build Coastguard Worker }
2492*8975f5c5SAndroid Build Coastguard Worker
2493*8975f5c5SAndroid Build Coastguard Worker // Clear, then blit depth/stencil with renderbuffers. This test makes sure depth/stencil blit uses
2494*8975f5c5SAndroid Build Coastguard Worker // the correct image. Note that this test doesn't apply to depth/stencil textures as they are
2495*8975f5c5SAndroid Build Coastguard Worker // explicitly autoinvalidated between render passes.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferClearThenBlitDepthStencil)2496*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferClearThenBlitDepthStencil)
2497*8975f5c5SAndroid Build Coastguard Worker {
2498*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
2499*8975f5c5SAndroid Build Coastguard Worker
2500*8975f5c5SAndroid Build Coastguard Worker // D3D backend doesn't implement multisampled render to texture renderbuffers correctly.
2501*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42261786
2502*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsD3D());
2503*8975f5c5SAndroid Build Coastguard Worker
2504*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
2505*8975f5c5SAndroid Build Coastguard Worker
2506*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
2507*8975f5c5SAndroid Build Coastguard Worker
2508*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
2509*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
2510*8975f5c5SAndroid Build Coastguard Worker
2511*8975f5c5SAndroid Build Coastguard Worker // Create framebuffer to draw into, with both color and depth/stencil attachments.
2512*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
2513*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
2514*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2515*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color,
2516*8975f5c5SAndroid Build Coastguard Worker 0, 4);
2517*8975f5c5SAndroid Build Coastguard Worker
2518*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencilMS;
2519*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencilMS);
2520*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kSize, kSize);
2521*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2522*8975f5c5SAndroid Build Coastguard Worker depthStencilMS);
2523*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2524*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2525*8975f5c5SAndroid Build Coastguard Worker
2526*8975f5c5SAndroid Build Coastguard Worker // Clear depth/stencil
2527*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(1);
2528*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x55);
2529*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2530*8975f5c5SAndroid Build Coastguard Worker
2531*8975f5c5SAndroid Build Coastguard Worker // Create framebuffer as blit target.
2532*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
2533*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
2534*8975f5c5SAndroid Build Coastguard Worker
2535*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
2536*8975f5c5SAndroid Build Coastguard Worker
2537*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencil;
2538*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
2539*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
2540*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2541*8975f5c5SAndroid Build Coastguard Worker depthStencil);
2542*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2543*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2544*8975f5c5SAndroid Build Coastguard Worker
2545*8975f5c5SAndroid Build Coastguard Worker // Blit depth/stencil
2546*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize,
2547*8975f5c5SAndroid Build Coastguard Worker GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2548*8975f5c5SAndroid Build Coastguard Worker
2549*8975f5c5SAndroid Build Coastguard Worker // Draw into the framebuffer that was the destination of blit, verifying that depth and stencil
2550*8975f5c5SAndroid Build Coastguard Worker // values are correct.
2551*8975f5c5SAndroid Build Coastguard Worker
2552*8975f5c5SAndroid Build Coastguard Worker // If depth is not 1, rendering would fail.
2553*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
2554*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
2555*8975f5c5SAndroid Build Coastguard Worker
2556*8975f5c5SAndroid Build Coastguard Worker // If stencil is not 0x55, rendering would fail.
2557*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2558*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x55, 0xFF);
2559*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2560*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
2561*8975f5c5SAndroid Build Coastguard Worker
2562*8975f5c5SAndroid Build Coastguard Worker // Set up program
2563*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2564*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
2565*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2566*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
2567*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2568*8975f5c5SAndroid Build Coastguard Worker
2569*8975f5c5SAndroid Build Coastguard Worker // Draw red
2570*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
2571*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.0f);
2572*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2573*8975f5c5SAndroid Build Coastguard Worker
2574*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now red
2575*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2576*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red);
2577*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red);
2578*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red);
2579*8975f5c5SAndroid Build Coastguard Worker
2580*8975f5c5SAndroid Build Coastguard Worker // Clear depth/stencil to a different value, and blit again but this time flipped.
2581*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboMS);
2582*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0);
2583*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x3E);
2584*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2585*8975f5c5SAndroid Build Coastguard Worker
2586*8975f5c5SAndroid Build Coastguard Worker // Blit
2587*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
2588*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, kSize, kSize, 0, 0,
2589*8975f5c5SAndroid Build Coastguard Worker GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2590*8975f5c5SAndroid Build Coastguard Worker
2591*8975f5c5SAndroid Build Coastguard Worker // Draw green
2592*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
2593*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x3E, 0xFF);
2594*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
2595*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.0f);
2596*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2597*8975f5c5SAndroid Build Coastguard Worker
2598*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now green
2599*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2600*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
2601*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
2602*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
2603*8975f5c5SAndroid Build Coastguard Worker }
2604*8975f5c5SAndroid Build Coastguard Worker
2605*8975f5c5SAndroid Build Coastguard Worker // Draw, then blit depth/stencil with renderbuffers. This test makes sure depth/stencil resolve is
2606*8975f5c5SAndroid Build Coastguard Worker // correctly implemented. Note that this test doesn't apply to depth/stencil textures as they are
2607*8975f5c5SAndroid Build Coastguard Worker // explicitly autoinvalidated between render passes.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferDrawThenBlitDepthStencil)2608*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDrawThenBlitDepthStencil)
2609*8975f5c5SAndroid Build Coastguard Worker {
2610*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
2611*8975f5c5SAndroid Build Coastguard Worker
2612*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263663
2613*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
2614*8975f5c5SAndroid Build Coastguard Worker
2615*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
2616*8975f5c5SAndroid Build Coastguard Worker
2617*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
2618*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
2619*8975f5c5SAndroid Build Coastguard Worker
2620*8975f5c5SAndroid Build Coastguard Worker // Create framebuffer to draw into, with both color and depth/stencil attachments.
2621*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
2622*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
2623*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2624*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color,
2625*8975f5c5SAndroid Build Coastguard Worker 0, 4);
2626*8975f5c5SAndroid Build Coastguard Worker
2627*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencilMS;
2628*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencilMS);
2629*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kSize, kSize);
2630*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2631*8975f5c5SAndroid Build Coastguard Worker depthStencilMS);
2632*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2633*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2634*8975f5c5SAndroid Build Coastguard Worker
2635*8975f5c5SAndroid Build Coastguard Worker // Set up program
2636*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2637*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
2638*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2639*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
2640*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2641*8975f5c5SAndroid Build Coastguard Worker
2642*8975f5c5SAndroid Build Coastguard Worker // Output depth/stencil through draw
2643*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
2644*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
2645*8975f5c5SAndroid Build Coastguard Worker
2646*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2647*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x55, 0xFF);
2648*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2649*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
2650*8975f5c5SAndroid Build Coastguard Worker
2651*8975f5c5SAndroid Build Coastguard Worker // Draw blue
2652*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
2653*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 1.0f);
2654*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2655*8975f5c5SAndroid Build Coastguard Worker
2656*8975f5c5SAndroid Build Coastguard Worker // Create framebuffer as blit target.
2657*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
2658*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
2659*8975f5c5SAndroid Build Coastguard Worker
2660*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
2661*8975f5c5SAndroid Build Coastguard Worker
2662*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencil;
2663*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
2664*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
2665*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2666*8975f5c5SAndroid Build Coastguard Worker depthStencil);
2667*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2668*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2669*8975f5c5SAndroid Build Coastguard Worker
2670*8975f5c5SAndroid Build Coastguard Worker // Blit depth/stencil
2671*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize,
2672*8975f5c5SAndroid Build Coastguard Worker GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2673*8975f5c5SAndroid Build Coastguard Worker
2674*8975f5c5SAndroid Build Coastguard Worker // Draw into the framebuffer that was the destination of blit, verifying that depth and stencil
2675*8975f5c5SAndroid Build Coastguard Worker // values are correct.
2676*8975f5c5SAndroid Build Coastguard Worker
2677*8975f5c5SAndroid Build Coastguard Worker // If depth is not 1, rendering would fail.
2678*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
2679*8975f5c5SAndroid Build Coastguard Worker
2680*8975f5c5SAndroid Build Coastguard Worker // If stencil is not 0x55, rendering would fail.
2681*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x55, 0xFF);
2682*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2683*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
2684*8975f5c5SAndroid Build Coastguard Worker
2685*8975f5c5SAndroid Build Coastguard Worker // Draw red
2686*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
2687*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.0f);
2688*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2689*8975f5c5SAndroid Build Coastguard Worker
2690*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now red
2691*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2692*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red);
2693*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red);
2694*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red);
2695*8975f5c5SAndroid Build Coastguard Worker }
2696*8975f5c5SAndroid Build Coastguard Worker
2697*8975f5c5SAndroid Build Coastguard Worker // Draw, then blit depth/stencil with renderbuffers, without a color attachment. Note that this test
2698*8975f5c5SAndroid Build Coastguard Worker // doesn't apply to depth/stencil textures as they are explicitly autoinvalidated between render
2699*8975f5c5SAndroid Build Coastguard Worker // passes.
2700*8975f5c5SAndroid Build Coastguard Worker //
2701*8975f5c5SAndroid Build Coastguard Worker // This test first uses a draw call to fill in the depth/stencil buffer, then blits it to force a
2702*8975f5c5SAndroid Build Coastguard Worker // resolve. Then it uses a no-op draw call to start a "fullscreen" render pass followed by a
2703*8975f5c5SAndroid Build Coastguard Worker // scissored draw to modify parts of the depth buffer:
2704*8975f5c5SAndroid Build Coastguard Worker //
2705*8975f5c5SAndroid Build Coastguard Worker // +--------------------+
2706*8975f5c5SAndroid Build Coastguard Worker // | D=1, S=0x55 |
2707*8975f5c5SAndroid Build Coastguard Worker // | |
2708*8975f5c5SAndroid Build Coastguard Worker // | +--------+ |
2709*8975f5c5SAndroid Build Coastguard Worker // | | D=0 | |
2710*8975f5c5SAndroid Build Coastguard Worker // | | S=0xAA | |
2711*8975f5c5SAndroid Build Coastguard Worker // | +--------+ |
2712*8975f5c5SAndroid Build Coastguard Worker // | |
2713*8975f5c5SAndroid Build Coastguard Worker // | |
2714*8975f5c5SAndroid Build Coastguard Worker // +--------------------+
2715*8975f5c5SAndroid Build Coastguard Worker //
2716*8975f5c5SAndroid Build Coastguard Worker // Blit is used again to copy the depth/stencil attachment data, and the result is verified.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferDrawThenBlitDepthStencilOnly)2717*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDrawThenBlitDepthStencilOnly)
2718*8975f5c5SAndroid Build Coastguard Worker {
2719*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
2720*8975f5c5SAndroid Build Coastguard Worker
2721*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263663
2722*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
2723*8975f5c5SAndroid Build Coastguard Worker
2724*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263677
2725*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsD3D());
2726*8975f5c5SAndroid Build Coastguard Worker
2727*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
2728*8975f5c5SAndroid Build Coastguard Worker
2729*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
2730*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
2731*8975f5c5SAndroid Build Coastguard Worker
2732*8975f5c5SAndroid Build Coastguard Worker // Create framebuffer to draw into, with depth/stencil attachment only.
2733*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencilMS;
2734*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencilMS);
2735*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kSize, kSize);
2736*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2737*8975f5c5SAndroid Build Coastguard Worker depthStencilMS);
2738*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2739*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2740*8975f5c5SAndroid Build Coastguard Worker
2741*8975f5c5SAndroid Build Coastguard Worker // Set up program
2742*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2743*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
2744*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2745*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
2746*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2747*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
2748*8975f5c5SAndroid Build Coastguard Worker
2749*8975f5c5SAndroid Build Coastguard Worker // Output depth/stencil through draw
2750*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
2751*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
2752*8975f5c5SAndroid Build Coastguard Worker
2753*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2754*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x55, 0xFF);
2755*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2756*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
2757*8975f5c5SAndroid Build Coastguard Worker
2758*8975f5c5SAndroid Build Coastguard Worker // Draw. Depth/stencil is now:
2759*8975f5c5SAndroid Build Coastguard Worker //
2760*8975f5c5SAndroid Build Coastguard Worker // +--------------------+
2761*8975f5c5SAndroid Build Coastguard Worker // | D=1, S=0x55 |
2762*8975f5c5SAndroid Build Coastguard Worker // | |
2763*8975f5c5SAndroid Build Coastguard Worker // | |
2764*8975f5c5SAndroid Build Coastguard Worker // | |
2765*8975f5c5SAndroid Build Coastguard Worker // | |
2766*8975f5c5SAndroid Build Coastguard Worker // | |
2767*8975f5c5SAndroid Build Coastguard Worker // | |
2768*8975f5c5SAndroid Build Coastguard Worker // | |
2769*8975f5c5SAndroid Build Coastguard Worker // +--------------------+
2770*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 1.0f);
2771*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2772*8975f5c5SAndroid Build Coastguard Worker
2773*8975f5c5SAndroid Build Coastguard Worker // Create framebuffer as blit target.
2774*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
2775*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
2776*8975f5c5SAndroid Build Coastguard Worker
2777*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencil;
2778*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
2779*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
2780*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2781*8975f5c5SAndroid Build Coastguard Worker depthStencil);
2782*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2783*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2784*8975f5c5SAndroid Build Coastguard Worker
2785*8975f5c5SAndroid Build Coastguard Worker // Blit depth/stencil
2786*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize,
2787*8975f5c5SAndroid Build Coastguard Worker GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2788*8975f5c5SAndroid Build Coastguard Worker
2789*8975f5c5SAndroid Build Coastguard Worker // Disable depth/stencil and draw again. Depth/stencil is not modified.
2790*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboMS);
2791*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
2792*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_STENCIL_TEST);
2793*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.0f);
2794*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2795*8975f5c5SAndroid Build Coastguard Worker
2796*8975f5c5SAndroid Build Coastguard Worker // Enable depth/stencil and do a scissored draw. Depth/stencil is now:
2797*8975f5c5SAndroid Build Coastguard Worker //
2798*8975f5c5SAndroid Build Coastguard Worker // +--------------------+
2799*8975f5c5SAndroid Build Coastguard Worker // | D=1, S=0x55 |
2800*8975f5c5SAndroid Build Coastguard Worker // | |
2801*8975f5c5SAndroid Build Coastguard Worker // | +--------+ |
2802*8975f5c5SAndroid Build Coastguard Worker // | | D=0 | |
2803*8975f5c5SAndroid Build Coastguard Worker // | | S=0xAA | |
2804*8975f5c5SAndroid Build Coastguard Worker // | +--------+ |
2805*8975f5c5SAndroid Build Coastguard Worker // | |
2806*8975f5c5SAndroid Build Coastguard Worker // | |
2807*8975f5c5SAndroid Build Coastguard Worker // +--------------------+
2808*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
2809*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
2810*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0xAA, 0xFF);
2811*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
2812*8975f5c5SAndroid Build Coastguard Worker glScissor(kSize / 4, kSize / 4, kSize / 2, kSize / 2);
2813*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), -1.0f);
2814*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
2815*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2816*8975f5c5SAndroid Build Coastguard Worker
2817*8975f5c5SAndroid Build Coastguard Worker // Blit depth/stencil again.
2818*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
2819*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize,
2820*8975f5c5SAndroid Build Coastguard Worker GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
2821*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2822*8975f5c5SAndroid Build Coastguard Worker
2823*8975f5c5SAndroid Build Coastguard Worker // Draw into the framebuffer that was the destination of blit, verifying that depth and stencil
2824*8975f5c5SAndroid Build Coastguard Worker // values are correct.
2825*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
2826*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
2827*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2828*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
2829*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2830*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2831*8975f5c5SAndroid Build Coastguard Worker
2832*8975f5c5SAndroid Build Coastguard Worker // First, verify the outside border, where D=1 and S=0x55
2833*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
2834*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x55, 0xFF);
2835*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2836*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
2837*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2838*8975f5c5SAndroid Build Coastguard Worker
2839*8975f5c5SAndroid Build Coastguard Worker // Draw green
2840*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
2841*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.95f);
2842*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2843*8975f5c5SAndroid Build Coastguard Worker
2844*8975f5c5SAndroid Build Coastguard Worker // Then, verify the center, where D=0 and S=0xAA
2845*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
2846*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0xAA, 0xFF);
2847*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2848*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
2849*8975f5c5SAndroid Build Coastguard Worker
2850*8975f5c5SAndroid Build Coastguard Worker // Draw blue
2851*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
2852*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), -0.95f);
2853*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2854*8975f5c5SAndroid Build Coastguard Worker
2855*8975f5c5SAndroid Build Coastguard Worker // Verify that the border is now green
2856*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
2857*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2858*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
2859*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
2860*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
2861*8975f5c5SAndroid Build Coastguard Worker
2862*8975f5c5SAndroid Build Coastguard Worker // Verify that the center is now blue
2863*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 4, kSize / 4, GLColor::blue);
2864*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, kSize / 4, GLColor::blue);
2865*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 4, 3 * kSize / 4 - 1, GLColor::blue);
2866*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 4 - 1, 3 * kSize / 4 - 1, GLColor::blue);
2867*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::blue);
2868*8975f5c5SAndroid Build Coastguard Worker }
2869*8975f5c5SAndroid Build Coastguard Worker
2870*8975f5c5SAndroid Build Coastguard Worker // Test the depth read/write mode change within the renderpass while there is color unresolve
2871*8975f5c5SAndroid Build Coastguard Worker // attachment
TEST_P(MultisampledRenderToTextureTest,DepthReadWriteToggleWithStartedRenderPass)2872*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, DepthReadWriteToggleWithStartedRenderPass)
2873*8975f5c5SAndroid Build Coastguard Worker {
2874*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
2875*8975f5c5SAndroid Build Coastguard Worker
2876*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
2877*8975f5c5SAndroid Build Coastguard Worker
2878*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
2879*8975f5c5SAndroid Build Coastguard Worker
2880*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
2881*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
2882*8975f5c5SAndroid Build Coastguard Worker
2883*8975f5c5SAndroid Build Coastguard Worker // Create framebuffer to draw into, with both color and depth attachments.
2884*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
2885*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
2886*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(true, kSize, GL_COLOR_ATTACHMENT0, nullptr, mTestSampleCount,
2887*8975f5c5SAndroid Build Coastguard Worker &textureMS, &renderbufferMS);
2888*8975f5c5SAndroid Build Coastguard Worker
2889*8975f5c5SAndroid Build Coastguard Worker GLTexture dsTextureMS;
2890*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer dsRenderbufferMS;
2891*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, dsRenderbufferMS);
2892*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, kSize, kSize);
2893*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
2894*8975f5c5SAndroid Build Coastguard Worker dsRenderbufferMS);
2895*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2896*8975f5c5SAndroid Build Coastguard Worker
2897*8975f5c5SAndroid Build Coastguard Worker // First renderpass: draw with depth value 0.5f
2898*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
2899*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
2900*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
2901*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
2902*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 0.0, 0.0, 1.0);
2903*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2904*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
2905*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ZERO);
2906*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawBlue, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
2907*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawBlue, essl1_shaders::PositionAttrib(), 0.5f);
2908*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2909*8975f5c5SAndroid Build Coastguard Worker // The color check should end the renderpass
2910*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
2911*8975f5c5SAndroid Build Coastguard Worker
2912*8975f5c5SAndroid Build Coastguard Worker // Create another FBO and render, jus so try to clear rendering cache. At least on pixel4,
2913*8975f5c5SAndroid Build Coastguard Worker // the test now properly fail if I force the loadOP to DontCare in the next renderpass.
2914*8975f5c5SAndroid Build Coastguard Worker constexpr bool clearRenderingCacheWithFBO = true;
2915*8975f5c5SAndroid Build Coastguard Worker if (clearRenderingCacheWithFBO)
2916*8975f5c5SAndroid Build Coastguard Worker {
2917*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS2;
2918*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS2);
2919*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS2;
2920*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS2;
2921*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(true, 2048, GL_COLOR_ATTACHMENT0, nullptr, mTestSampleCount,
2922*8975f5c5SAndroid Build Coastguard Worker &textureMS2, &renderbufferMS2);
2923*8975f5c5SAndroid Build Coastguard Worker GLTexture dsTextureMS2;
2924*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer dsRenderbufferMS2;
2925*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, dsRenderbufferMS2);
2926*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, 2048, 2048);
2927*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
2928*8975f5c5SAndroid Build Coastguard Worker dsRenderbufferMS2);
2929*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2930*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2931*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, 2048, 2048);
2932*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2933*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
2934*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2935*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
2936*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2937*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 0.0f, 0.0f);
2938*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2939*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2940*8975f5c5SAndroid Build Coastguard Worker }
2941*8975f5c5SAndroid Build Coastguard Worker
2942*8975f5c5SAndroid Build Coastguard Worker // Second renderpass: Start with depth read only and then switch to depth write
2943*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
2944*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
2945*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
2946*8975f5c5SAndroid Build Coastguard Worker // Draw red with depth read only. pass depth test, Result: color=Red, depth=0.5
2947*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_FALSE);
2948*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
2949*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
2950*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawRed);
2951*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.1f);
2952*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2953*8975f5c5SAndroid Build Coastguard Worker
2954*8975f5c5SAndroid Build Coastguard Worker // Draw green with depth write. Pass depth test. Result: color=Green, depth=0.3
2955*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
2956*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
2957*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2958*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawGreen);
2959*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.3f);
2960*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2961*8975f5c5SAndroid Build Coastguard Worker
2962*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
2963*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2964*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2965*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
2966*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2967*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2968*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2969*8975f5c5SAndroid Build Coastguard Worker
2970*8975f5c5SAndroid Build Coastguard Worker // Verify the color has all three color in it.
2971*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::white);
2972*8975f5c5SAndroid Build Coastguard Worker }
2973*8975f5c5SAndroid Build Coastguard Worker
colorAttachment1Common(bool useRenderbuffer)2974*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureES3Test::colorAttachment1Common(bool useRenderbuffer)
2975*8975f5c5SAndroid Build Coastguard Worker {
2976*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
2977*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2"));
2978*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_draw_buffers"));
2979*8975f5c5SAndroid Build Coastguard Worker
2980*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
2981*8975f5c5SAndroid Build Coastguard Worker
2982*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
2983*8975f5c5SAndroid Build Coastguard Worker
2984*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
2985*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
2986*8975f5c5SAndroid Build Coastguard Worker
2987*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into, use color attachment 1
2988*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
2989*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
2990*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT1, nullptr,
2991*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS, &renderbufferMS);
2992*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2993*8975f5c5SAndroid Build Coastguard Worker
2994*8975f5c5SAndroid Build Coastguard Worker // Setup program to render into attachment 1.
2995*8975f5c5SAndroid Build Coastguard Worker constexpr bool kBuffersEnabled[8] = {false, true};
2996*8975f5c5SAndroid Build Coastguard Worker
2997*8975f5c5SAndroid Build Coastguard Worker GLuint drawColor;
2998*8975f5c5SAndroid Build Coastguard Worker setupUniformColorProgramMultiRenderTarget(kBuffersEnabled, &drawColor);
2999*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3000*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
3001*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
3002*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
3003*8975f5c5SAndroid Build Coastguard Worker
3004*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kDrawBuffers[] = {GL_NONE, GL_COLOR_ATTACHMENT1};
3005*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, kDrawBuffers);
3006*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT1);
3007*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3008*8975f5c5SAndroid Build Coastguard Worker
3009*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
3010*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
3011*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3012*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3013*8975f5c5SAndroid Build Coastguard Worker
3014*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
3015*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3016*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
3017*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
3018*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3019*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3020*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3021*8975f5c5SAndroid Build Coastguard Worker
3022*8975f5c5SAndroid Build Coastguard Worker // Blend half-transparent green into the multisampled color buffer.
3023*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 0.5f);
3024*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
3025*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
3026*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3027*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3028*8975f5c5SAndroid Build Coastguard Worker
3029*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now yellow
3030*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected(127, 127, 0, 191);
3031*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
3032*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected, 1);
3033*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected, 1);
3034*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected, 1);
3035*8975f5c5SAndroid Build Coastguard Worker
3036*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
3037*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
3038*8975f5c5SAndroid Build Coastguard Worker
3039*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3040*8975f5c5SAndroid Build Coastguard Worker
3041*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(drawColor);
3042*8975f5c5SAndroid Build Coastguard Worker }
3043*8975f5c5SAndroid Build Coastguard Worker
3044*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, then blend. The copy will make sure an implicit resolve happens. Regardless, the
3045*8975f5c5SAndroid Build Coastguard Worker // following draw should retain the data written by the first draw command.
3046*8975f5c5SAndroid Build Coastguard Worker // Uses color attachment 1.
TEST_P(MultisampledRenderToTextureES3Test,ColorAttachment1)3047*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, ColorAttachment1)
3048*8975f5c5SAndroid Build Coastguard Worker {
3049*8975f5c5SAndroid Build Coastguard Worker colorAttachment1Common(false);
3050*8975f5c5SAndroid Build Coastguard Worker }
3051*8975f5c5SAndroid Build Coastguard Worker
3052*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, then blend. The copy will make sure an implicit resolve happens. Regardless, the
3053*8975f5c5SAndroid Build Coastguard Worker // following draw should retain the data written by the first draw command.
3054*8975f5c5SAndroid Build Coastguard Worker // Uses color attachment 1. Uses renderbuffer.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferColorAttachment1)3055*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferColorAttachment1)
3056*8975f5c5SAndroid Build Coastguard Worker {
3057*8975f5c5SAndroid Build Coastguard Worker colorAttachment1Common(true);
3058*8975f5c5SAndroid Build Coastguard Worker }
3059*8975f5c5SAndroid Build Coastguard Worker
colorAttachments0And3Common(bool useRenderbuffer)3060*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureES3Test::colorAttachments0And3Common(bool useRenderbuffer)
3061*8975f5c5SAndroid Build Coastguard Worker {
3062*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
3063*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!useRenderbuffer &&
3064*8975f5c5SAndroid Build Coastguard Worker !EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2"));
3065*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_draw_buffers"));
3066*8975f5c5SAndroid Build Coastguard Worker
3067*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
3068*8975f5c5SAndroid Build Coastguard Worker
3069*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
3070*8975f5c5SAndroid Build Coastguard Worker
3071*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
3072*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
3073*8975f5c5SAndroid Build Coastguard Worker
3074*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into, use color attachment 1
3075*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS0;
3076*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS0;
3077*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
3078*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS0, &renderbufferMS0);
3079*8975f5c5SAndroid Build Coastguard Worker
3080*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS3;
3081*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS3;
3082*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT3, nullptr,
3083*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS3, &renderbufferMS3);
3084*8975f5c5SAndroid Build Coastguard Worker
3085*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3086*8975f5c5SAndroid Build Coastguard Worker
3087*8975f5c5SAndroid Build Coastguard Worker // Setup program to render into attachments 0 and 3.
3088*8975f5c5SAndroid Build Coastguard Worker constexpr bool kBuffersEnabled[8] = {true, false, false, true};
3089*8975f5c5SAndroid Build Coastguard Worker
3090*8975f5c5SAndroid Build Coastguard Worker GLuint drawColor;
3091*8975f5c5SAndroid Build Coastguard Worker setupUniformColorProgramMultiRenderTarget(kBuffersEnabled, &drawColor);
3092*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3093*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
3094*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
3095*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
3096*8975f5c5SAndroid Build Coastguard Worker
3097*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kDrawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_NONE, GL_NONE,
3098*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_ATTACHMENT3};
3099*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(4, kDrawBuffers);
3100*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT3);
3101*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3102*8975f5c5SAndroid Build Coastguard Worker
3103*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffers.
3104*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
3105*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3106*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3107*8975f5c5SAndroid Build Coastguard Worker
3108*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy from one of them.
3109*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3110*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
3111*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
3112*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3113*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3114*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3115*8975f5c5SAndroid Build Coastguard Worker
3116*8975f5c5SAndroid Build Coastguard Worker // Blend half-transparent green into the multisampled color buffers.
3117*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 0.5f);
3118*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
3119*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
3120*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3121*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3122*8975f5c5SAndroid Build Coastguard Worker
3123*8975f5c5SAndroid Build Coastguard Worker // Verify that the textures are now yellow
3124*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected(127, 127, 0, 191);
3125*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
3126*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected, 1);
3127*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected, 1);
3128*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected, 1);
3129*8975f5c5SAndroid Build Coastguard Worker
3130*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
3131*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
3132*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected, 1);
3133*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected, 1);
3134*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected, 1);
3135*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3136*8975f5c5SAndroid Build Coastguard Worker
3137*8975f5c5SAndroid Build Coastguard Worker // Test color unresolve with these attachments too, by adding blue into the attachments.
3138*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
3139*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 0.0f);
3140*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3141*8975f5c5SAndroid Build Coastguard Worker
3142*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected2(127, 127, 255, 191);
3143*8975f5c5SAndroid Build Coastguard Worker
3144*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
3145*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected2, 1);
3146*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected2, 1);
3147*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected2, 1);
3148*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected2, 1);
3149*8975f5c5SAndroid Build Coastguard Worker
3150*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT3);
3151*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected2, 1);
3152*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected2, 1);
3153*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected2, 1);
3154*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected2, 1);
3155*8975f5c5SAndroid Build Coastguard Worker
3156*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
3157*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
3158*8975f5c5SAndroid Build Coastguard Worker
3159*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3160*8975f5c5SAndroid Build Coastguard Worker
3161*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(drawColor);
3162*8975f5c5SAndroid Build Coastguard Worker }
3163*8975f5c5SAndroid Build Coastguard Worker
3164*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, then blend. The copy will make sure an implicit resolve happens. Regardless, the
3165*8975f5c5SAndroid Build Coastguard Worker // following draw should retain the data written by the first draw command.
3166*8975f5c5SAndroid Build Coastguard Worker // Uses color attachments 0 and 3.
TEST_P(MultisampledRenderToTextureES3Test,ColorAttachments0And3)3167*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, ColorAttachments0And3)
3168*8975f5c5SAndroid Build Coastguard Worker {
3169*8975f5c5SAndroid Build Coastguard Worker colorAttachments0And3Common(false);
3170*8975f5c5SAndroid Build Coastguard Worker }
3171*8975f5c5SAndroid Build Coastguard Worker
3172*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, then blend. The copy will make sure an implicit resolve happens. Regardless, the
3173*8975f5c5SAndroid Build Coastguard Worker // following draw should retain the data written by the first draw command.
3174*8975f5c5SAndroid Build Coastguard Worker // Uses color attachments 0 and 3. Uses renderbuffer.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferColorAttachments0And3)3175*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferColorAttachments0And3)
3176*8975f5c5SAndroid Build Coastguard Worker {
3177*8975f5c5SAndroid Build Coastguard Worker colorAttachments0And3Common(true);
3178*8975f5c5SAndroid Build Coastguard Worker }
3179*8975f5c5SAndroid Build Coastguard Worker
3180*8975f5c5SAndroid Build Coastguard Worker // Draw with depth buffer. Uses EXT_multisampled_render_to_texture2.
3181*8975f5c5SAndroid Build Coastguard Worker // The test works with a 64x1 texture. The first draw call will render geometry whose depth is
3182*8975f5c5SAndroid Build Coastguard Worker // different between top and bottom. The second draw call will enable depth test and draw with the
3183*8975f5c5SAndroid Build Coastguard Worker // average of the two depths. Only half of the samples will take the new color. Once resolved, the
3184*8975f5c5SAndroid Build Coastguard Worker // expected color would be the average of the two draw colors.
TEST_P(MultisampledRenderToTextureES3Test,DepthStencilAttachment)3185*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, DepthStencilAttachment)
3186*8975f5c5SAndroid Build Coastguard Worker {
3187*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
3188*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2"));
3189*8975f5c5SAndroid Build Coastguard Worker
3190*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kWidth = 64;
3191*8975f5c5SAndroid Build Coastguard Worker
3192*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into, with both color and depth attachments.
3193*8975f5c5SAndroid Build Coastguard Worker GLTexture colorMS;
3194*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorMS);
3195*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3196*8975f5c5SAndroid Build Coastguard Worker
3197*8975f5c5SAndroid Build Coastguard Worker GLTexture depthMS;
3198*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, depthMS);
3199*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, kWidth, 1, 0, GL_DEPTH_STENCIL,
3200*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_INT_24_8_OES, nullptr);
3201*8975f5c5SAndroid Build Coastguard Worker
3202*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
3203*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
3204*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
3205*8975f5c5SAndroid Build Coastguard Worker colorMS, 0, 4);
3206*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
3207*8975f5c5SAndroid Build Coastguard Worker depthMS, 0, 4);
3208*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3209*8975f5c5SAndroid Build Coastguard Worker
3210*8975f5c5SAndroid Build Coastguard Worker // Setup draw program
3211*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
3212*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3213*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
3214*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
3215*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
3216*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(drawColor, essl1_shaders::PositionAttrib());
3217*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
3218*8975f5c5SAndroid Build Coastguard Worker
3219*8975f5c5SAndroid Build Coastguard Worker // Setup vertices such that depth is varied from top to bottom.
3220*8975f5c5SAndroid Build Coastguard Worker std::array<Vector3, 6> quadVertices = {
3221*8975f5c5SAndroid Build Coastguard Worker Vector3(-1.0f, 1.0f, 0.8f), Vector3(-1.0f, -1.0f, 0.2f), Vector3(1.0f, -1.0f, 0.2f),
3222*8975f5c5SAndroid Build Coastguard Worker Vector3(-1.0f, 1.0f, 0.8f), Vector3(1.0f, -1.0f, 0.2f), Vector3(1.0f, 1.0f, 0.8f),
3223*8975f5c5SAndroid Build Coastguard Worker };
3224*8975f5c5SAndroid Build Coastguard Worker GLBuffer quadVertexBuffer;
3225*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, quadVertexBuffer);
3226*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, quadVertices.data(), GL_STATIC_DRAW);
3227*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
3228*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
3229*8975f5c5SAndroid Build Coastguard Worker
3230*8975f5c5SAndroid Build Coastguard Worker // Draw red into the framebuffer.
3231*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kWidth, 1);
3232*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
3233*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
3234*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
3235*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
3236*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3237*8975f5c5SAndroid Build Coastguard Worker
3238*8975f5c5SAndroid Build Coastguard Worker // Draw green such that half the samples of each pixel pass the depth test.
3239*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
3240*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
3241*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3242*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3243*8975f5c5SAndroid Build Coastguard Worker
3244*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected(127, 127, 0, 255);
3245*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
3246*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kWidth - 1, 0, kExpected, 1);
3247*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kWidth / 2, 0, kExpected, 1);
3248*8975f5c5SAndroid Build Coastguard Worker
3249*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(0);
3250*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
3251*8975f5c5SAndroid Build Coastguard Worker }
3252*8975f5c5SAndroid Build Coastguard Worker
3253*8975f5c5SAndroid Build Coastguard Worker // Draw with depth buffer, with depth discard before the end of the render
3254*8975f5c5SAndroid Build Coastguard Worker // pass. On desktop Windows AMD drivers, this would previously cause a crash
3255*8975f5c5SAndroid Build Coastguard Worker // because of a NULL pDepthStencilResolveAttachment pointer when ending the
3256*8975f5c5SAndroid Build Coastguard Worker // render pass. Other vendors don't seem to mind the NULL pointer.
TEST_P(MultisampledRenderToTextureES3Test,DepthStencilInvalidate)3257*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, DepthStencilInvalidate)
3258*8975f5c5SAndroid Build Coastguard Worker {
3259*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
3260*8975f5c5SAndroid Build Coastguard Worker
3261*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kWidth = 64;
3262*8975f5c5SAndroid Build Coastguard Worker
3263*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into, with both color and depth attachments.
3264*8975f5c5SAndroid Build Coastguard Worker GLTexture colorMS;
3265*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorMS);
3266*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3267*8975f5c5SAndroid Build Coastguard Worker
3268*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthMS;
3269*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthMS);
3270*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT32F, kWidth, 1);
3271*8975f5c5SAndroid Build Coastguard Worker
3272*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
3273*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
3274*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
3275*8975f5c5SAndroid Build Coastguard Worker colorMS, 0, 4);
3276*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthMS);
3277*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3278*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3279*8975f5c5SAndroid Build Coastguard Worker
3280*8975f5c5SAndroid Build Coastguard Worker // Setup draw program
3281*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
3282*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3283*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
3284*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
3285*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
3286*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(drawColor, essl1_shaders::PositionAttrib());
3287*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
3288*8975f5c5SAndroid Build Coastguard Worker
3289*8975f5c5SAndroid Build Coastguard Worker // Setup vertices such that depth is varied from top to bottom.
3290*8975f5c5SAndroid Build Coastguard Worker std::array<Vector3, 6> redQuadVertices = {
3291*8975f5c5SAndroid Build Coastguard Worker Vector3(-1.0f, 1.0f, 0.8f), Vector3(-1.0f, -1.0f, 0.2f), Vector3(1.0f, -1.0f, 0.2f),
3292*8975f5c5SAndroid Build Coastguard Worker Vector3(-1.0f, 1.0f, 0.8f), Vector3(1.0f, -1.0f, 0.2f), Vector3(1.0f, 1.0f, 0.8f),
3293*8975f5c5SAndroid Build Coastguard Worker };
3294*8975f5c5SAndroid Build Coastguard Worker GLBuffer redQuadVertexBuffer;
3295*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, redQuadVertexBuffer);
3296*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, redQuadVertices.data(), GL_STATIC_DRAW);
3297*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
3298*8975f5c5SAndroid Build Coastguard Worker
3299*8975f5c5SAndroid Build Coastguard Worker // Green quad has the same depth.
3300*8975f5c5SAndroid Build Coastguard Worker std::array<Vector3, 6> greenQuadVertices = {
3301*8975f5c5SAndroid Build Coastguard Worker Vector3(-1.0f, 1.0f, 0.5f), Vector3(-1.0f, -1.0f, 0.5f), Vector3(1.0f, -1.0f, 0.5f),
3302*8975f5c5SAndroid Build Coastguard Worker Vector3(-1.0f, 1.0f, 0.5f), Vector3(1.0f, -1.0f, 0.5f), Vector3(1.0f, 1.0f, 0.5f),
3303*8975f5c5SAndroid Build Coastguard Worker };
3304*8975f5c5SAndroid Build Coastguard Worker GLBuffer greenQuadVertexBuffer;
3305*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, greenQuadVertexBuffer);
3306*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, greenQuadVertices.data(),
3307*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
3308*8975f5c5SAndroid Build Coastguard Worker
3309*8975f5c5SAndroid Build Coastguard Worker // Draw red into the framebuffer.
3310*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kWidth, 1);
3311*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
3312*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
3313*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
3314*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, redQuadVertexBuffer);
3315*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
3316*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
3317*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3318*8975f5c5SAndroid Build Coastguard Worker
3319*8975f5c5SAndroid Build Coastguard Worker // Draw green such that half the samples of each pixel pass the depth test.
3320*8975f5c5SAndroid Build Coastguard Worker // Note: We don't use drawQuad() because it could internally create a vertex buffer
3321*8975f5c5SAndroid Build Coastguard Worker // or client array pointer on the fly. Those could break the render pass in some backends and
3322*8975f5c5SAndroid Build Coastguard Worker // force unresolve unwantedly. The unexpected unresolve would have written average depth value
3323*8975f5c5SAndroid Build Coastguard Worker // to all samples in the depth buffer.
3324*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
3325*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
3326*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, greenQuadVertexBuffer);
3327*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
3328*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
3329*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3330*8975f5c5SAndroid Build Coastguard Worker
3331*8975f5c5SAndroid Build Coastguard Worker // Invalidate depth attachment
3332*8975f5c5SAndroid Build Coastguard Worker GLenum discardDepth[] = {GL_DEPTH_ATTACHMENT};
3333*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, discardDepth);
3334*8975f5c5SAndroid Build Coastguard Worker
3335*8975f5c5SAndroid Build Coastguard Worker // End render pass with pixel reads, ensure no crash occurs here.
3336*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
3337*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fboMS);
3338*8975f5c5SAndroid Build Coastguard Worker
3339*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected(127, 127, 0, 255);
3340*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
3341*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kWidth - 1, 0, kExpected, 1);
3342*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kWidth / 2, 0, kExpected, 1);
3343*8975f5c5SAndroid Build Coastguard Worker
3344*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(0);
3345*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
3346*8975f5c5SAndroid Build Coastguard Worker }
3347*8975f5c5SAndroid Build Coastguard Worker
3348*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, then blend. The copy will make sure an implicit resolve happens. Regardless, the
3349*8975f5c5SAndroid Build Coastguard Worker // following draw should retain the data written by the first draw command.
3350*8975f5c5SAndroid Build Coastguard Worker // Uses color attachments 0 and 1. Attachment 0 is a normal multisampled texture, while attachment
3351*8975f5c5SAndroid Build Coastguard Worker // 1 is a multisampled-render-to-texture texture.
TEST_P(MultisampledRenderToTextureES31Test,MixedMultisampledAndMultisampledRenderToTexture)3352*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES31Test, MixedMultisampledAndMultisampledRenderToTexture)
3353*8975f5c5SAndroid Build Coastguard Worker {
3354*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
3355*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2"));
3356*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_draw_buffers"));
3357*8975f5c5SAndroid Build Coastguard Worker
3358*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
3359*8975f5c5SAndroid Build Coastguard Worker
3360*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
3361*8975f5c5SAndroid Build Coastguard Worker
3362*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into, use color attachment 1
3363*8975f5c5SAndroid Build Coastguard Worker GLTexture colorMS0;
3364*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, colorMS0);
3365*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, true);
3366*8975f5c5SAndroid Build Coastguard Worker
3367*8975f5c5SAndroid Build Coastguard Worker GLTexture colorMS1;
3368*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorMS1);
3369*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3370*8975f5c5SAndroid Build Coastguard Worker
3371*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
3372*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
3373*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3374*8975f5c5SAndroid Build Coastguard Worker colorMS0, 0);
3375*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
3376*8975f5c5SAndroid Build Coastguard Worker colorMS1, 0, 4);
3377*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3378*8975f5c5SAndroid Build Coastguard Worker
3379*8975f5c5SAndroid Build Coastguard Worker // Setup program to render into attachments 0 and 1.
3380*8975f5c5SAndroid Build Coastguard Worker constexpr bool kBuffersEnabled[8] = {true, true};
3381*8975f5c5SAndroid Build Coastguard Worker
3382*8975f5c5SAndroid Build Coastguard Worker GLuint drawColor;
3383*8975f5c5SAndroid Build Coastguard Worker setupUniformColorProgramMultiRenderTarget(kBuffersEnabled, &drawColor);
3384*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3385*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
3386*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
3387*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
3388*8975f5c5SAndroid Build Coastguard Worker
3389*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kDrawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
3390*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, kDrawBuffers);
3391*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT1);
3392*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3393*8975f5c5SAndroid Build Coastguard Worker
3394*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffers.
3395*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
3396*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3397*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3398*8975f5c5SAndroid Build Coastguard Worker
3399*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy from one of them.
3400*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3401*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
3402*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
3403*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3404*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3405*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3406*8975f5c5SAndroid Build Coastguard Worker
3407*8975f5c5SAndroid Build Coastguard Worker // Blend half-transparent green into the multisampled color buffers.
3408*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 0.5f);
3409*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
3410*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
3411*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3412*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3413*8975f5c5SAndroid Build Coastguard Worker
3414*8975f5c5SAndroid Build Coastguard Worker // Verify that the textures are now yellow
3415*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected(127, 127, 0, 191);
3416*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
3417*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected, 1);
3418*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected, 1);
3419*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected, 1);
3420*8975f5c5SAndroid Build Coastguard Worker
3421*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
3422*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
3423*8975f5c5SAndroid Build Coastguard Worker
3424*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3425*8975f5c5SAndroid Build Coastguard Worker
3426*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(drawColor);
3427*8975f5c5SAndroid Build Coastguard Worker }
3428*8975f5c5SAndroid Build Coastguard Worker
blitFramebufferAttachment1Common(bool useRenderbuffer)3429*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureES31Test::blitFramebufferAttachment1Common(bool useRenderbuffer)
3430*8975f5c5SAndroid Build Coastguard Worker {
3431*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
3432*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!useRenderbuffer &&
3433*8975f5c5SAndroid Build Coastguard Worker !EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2"));
3434*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_draw_buffers"));
3435*8975f5c5SAndroid Build Coastguard Worker
3436*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 16;
3437*8975f5c5SAndroid Build Coastguard Worker
3438*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
3439*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
3440*8975f5c5SAndroid Build Coastguard Worker
3441*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into, use color attachment 1
3442*8975f5c5SAndroid Build Coastguard Worker GLTexture colorMS0;
3443*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, colorMS0);
3444*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, true);
3445*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3446*8975f5c5SAndroid Build Coastguard Worker colorMS0, 0);
3447*8975f5c5SAndroid Build Coastguard Worker
3448*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS1;
3449*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS1;
3450*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT1, nullptr,
3451*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS1, &renderbufferMS1);
3452*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3453*8975f5c5SAndroid Build Coastguard Worker
3454*8975f5c5SAndroid Build Coastguard Worker // Setup program to render into attachments 0 and 1.
3455*8975f5c5SAndroid Build Coastguard Worker constexpr bool kBuffersEnabled[8] = {true, true};
3456*8975f5c5SAndroid Build Coastguard Worker
3457*8975f5c5SAndroid Build Coastguard Worker GLuint drawColor;
3458*8975f5c5SAndroid Build Coastguard Worker setupUniformColorProgramMultiRenderTarget(kBuffersEnabled, &drawColor);
3459*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3460*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
3461*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
3462*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
3463*8975f5c5SAndroid Build Coastguard Worker
3464*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kDrawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
3465*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, kDrawBuffers);
3466*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT1);
3467*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3468*8975f5c5SAndroid Build Coastguard Worker
3469*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffers.
3470*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
3471*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3472*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3473*8975f5c5SAndroid Build Coastguard Worker
3474*8975f5c5SAndroid Build Coastguard Worker // Create single sampled framebuffer to use as dest.
3475*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboSS;
3476*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
3477*8975f5c5SAndroid Build Coastguard Worker GLTexture colorSS;
3478*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorSS);
3479*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3480*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorSS, 0);
3481*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3482*8975f5c5SAndroid Build Coastguard Worker
3483*8975f5c5SAndroid Build Coastguard Worker // Bind MS to READ as SS is already bound to DRAW.
3484*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fboMS);
3485*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT1);
3486*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3487*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3488*8975f5c5SAndroid Build Coastguard Worker
3489*8975f5c5SAndroid Build Coastguard Worker // Bind SS to READ so we can readPixels from it
3490*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
3491*8975f5c5SAndroid Build Coastguard Worker
3492*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3493*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red);
3494*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red);
3495*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red);
3496*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
3497*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3498*8975f5c5SAndroid Build Coastguard Worker }
3499*8975f5c5SAndroid Build Coastguard Worker
3500*8975f5c5SAndroid Build Coastguard Worker // BlitFramebuffer functionality test with mixed color attachments where multisampled render to
3501*8975f5c5SAndroid Build Coastguard Worker // texture as attachment 1 and is the read buffer. This test makes sure the fact that attachment 0
3502*8975f5c5SAndroid Build Coastguard Worker // is a true multisampled texture doesn't cause issues.
3503*8975f5c5SAndroid Build Coastguard Worker // Uses EXT_multisampled_render_to_texture2.
TEST_P(MultisampledRenderToTextureES31Test,BlitFramebufferAttachment1)3504*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES31Test, BlitFramebufferAttachment1)
3505*8975f5c5SAndroid Build Coastguard Worker {
3506*8975f5c5SAndroid Build Coastguard Worker blitFramebufferAttachment1Common(false);
3507*8975f5c5SAndroid Build Coastguard Worker }
3508*8975f5c5SAndroid Build Coastguard Worker
3509*8975f5c5SAndroid Build Coastguard Worker // BlitFramebuffer functionality test with mixed color attachments where multisampled render to
3510*8975f5c5SAndroid Build Coastguard Worker // texture as attachment 1 and is the read buffer. This test makes sure the fact that attachment 0
3511*8975f5c5SAndroid Build Coastguard Worker // is a true multisampled texture doesn't cause issues.
3512*8975f5c5SAndroid Build Coastguard Worker // Uses renderbuffer.
TEST_P(MultisampledRenderToTextureES31Test,RenderbufferBlitFramebufferAttachment1)3513*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES31Test, RenderbufferBlitFramebufferAttachment1)
3514*8975f5c5SAndroid Build Coastguard Worker {
3515*8975f5c5SAndroid Build Coastguard Worker blitFramebufferAttachment1Common(true);
3516*8975f5c5SAndroid Build Coastguard Worker }
3517*8975f5c5SAndroid Build Coastguard Worker
blitFramebufferMixedColorAndDepthCommon(bool useRenderbuffer)3518*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureES3Test::blitFramebufferMixedColorAndDepthCommon(
3519*8975f5c5SAndroid Build Coastguard Worker bool useRenderbuffer)
3520*8975f5c5SAndroid Build Coastguard Worker {
3521*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
3522*8975f5c5SAndroid Build Coastguard Worker
3523*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 16;
3524*8975f5c5SAndroid Build Coastguard Worker
3525*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
3526*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
3527*8975f5c5SAndroid Build Coastguard Worker
3528*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to use as source.
3529*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthMS;
3530*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthMS);
3531*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT24, kSize, kSize);
3532*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthMS);
3533*8975f5c5SAndroid Build Coastguard Worker
3534*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
3535*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
3536*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
3537*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &textureMS, &renderbufferMS);
3538*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3539*8975f5c5SAndroid Build Coastguard Worker
3540*8975f5c5SAndroid Build Coastguard Worker // Clear depth to 0.5 and color to red.
3541*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.5f);
3542*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
3543*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
3544*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3545*8975f5c5SAndroid Build Coastguard Worker
3546*8975f5c5SAndroid Build Coastguard Worker // Create single sampled framebuffer to use as dest.
3547*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthSS;
3548*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthSS);
3549*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, kSize, kSize);
3550*8975f5c5SAndroid Build Coastguard Worker
3551*8975f5c5SAndroid Build Coastguard Worker GLTexture colorSS;
3552*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorSS);
3553*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3554*8975f5c5SAndroid Build Coastguard Worker
3555*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboSS;
3556*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
3557*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthSS);
3558*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorSS, 0);
3559*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3560*8975f5c5SAndroid Build Coastguard Worker
3561*8975f5c5SAndroid Build Coastguard Worker // Bind MS to READ as SS is already bound to DRAW.
3562*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fboMS);
3563*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize,
3564*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
3565*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3566*8975f5c5SAndroid Build Coastguard Worker
3567*8975f5c5SAndroid Build Coastguard Worker // Bind SS to READ so we can readPixels from it
3568*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
3569*8975f5c5SAndroid Build Coastguard Worker
3570*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3571*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red);
3572*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red);
3573*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red);
3574*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::red);
3575*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3576*8975f5c5SAndroid Build Coastguard Worker
3577*8975f5c5SAndroid Build Coastguard Worker // Use a small shader to verify depth.
3578*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(depthTestProgram, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
3579*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(depthTestProgramFail, essl1_shaders::vs::Passthrough(),
3580*8975f5c5SAndroid Build Coastguard Worker essl1_shaders::fs::Green());
3581*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
3582*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
3583*8975f5c5SAndroid Build Coastguard Worker drawQuad(depthTestProgram, essl1_shaders::PositionAttrib(), -0.01f);
3584*8975f5c5SAndroid Build Coastguard Worker drawQuad(depthTestProgramFail, essl1_shaders::PositionAttrib(), 0.01f);
3585*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
3586*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3587*8975f5c5SAndroid Build Coastguard Worker
3588*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
3589*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::blue);
3590*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::blue);
3591*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::blue);
3592*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::blue);
3593*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3594*8975f5c5SAndroid Build Coastguard Worker }
3595*8975f5c5SAndroid Build Coastguard Worker
3596*8975f5c5SAndroid Build Coastguard Worker // BlitFramebuffer functionality test with mixed multisampled-render-to-texture color attachment and
3597*8975f5c5SAndroid Build Coastguard Worker // multisampled depth buffer. This test makes sure that the color attachment is blitted, while
3598*8975f5c5SAndroid Build Coastguard Worker // the depth/stencil attachment is resolved.
TEST_P(MultisampledRenderToTextureES3Test,BlitFramebufferMixedColorAndDepth)3599*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, BlitFramebufferMixedColorAndDepth)
3600*8975f5c5SAndroid Build Coastguard Worker {
3601*8975f5c5SAndroid Build Coastguard Worker blitFramebufferMixedColorAndDepthCommon(false);
3602*8975f5c5SAndroid Build Coastguard Worker }
3603*8975f5c5SAndroid Build Coastguard Worker
3604*8975f5c5SAndroid Build Coastguard Worker // BlitFramebuffer functionality test with mixed multisampled-render-to-texture color attachment and
3605*8975f5c5SAndroid Build Coastguard Worker // multisampled depth buffer. This test makes sure that the color attachment is blitted, while
3606*8975f5c5SAndroid Build Coastguard Worker // the depth/stencil attachment is resolved. Uses renderbuffer.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferBlitFramebufferMixedColorAndDepth)3607*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferBlitFramebufferMixedColorAndDepth)
3608*8975f5c5SAndroid Build Coastguard Worker {
3609*8975f5c5SAndroid Build Coastguard Worker blitFramebufferMixedColorAndDepthCommon(true);
3610*8975f5c5SAndroid Build Coastguard Worker }
3611*8975f5c5SAndroid Build Coastguard Worker
3612*8975f5c5SAndroid Build Coastguard Worker // Draw non-multisampled, draw multisampled, repeat. This tests the same texture being bound
3613*8975f5c5SAndroid Build Coastguard Worker // differently to two FBOs.
TEST_P(MultisampledRenderToTextureTest,DrawNonMultisampledThenMultisampled)3614*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, DrawNonMultisampledThenMultisampled)
3615*8975f5c5SAndroid Build Coastguard Worker {
3616*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
3617*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
3618*8975f5c5SAndroid Build Coastguard Worker
3619*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263509
3620*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsD3D11());
3621*8975f5c5SAndroid Build Coastguard Worker
3622*8975f5c5SAndroid Build Coastguard Worker // Texture attachment to the two framebuffers.
3623*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
3624*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
3625*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3626*8975f5c5SAndroid Build Coastguard Worker
3627*8975f5c5SAndroid Build Coastguard Worker // Create singlesampled framebuffer.
3628*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboSS;
3629*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
3630*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3631*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3632*8975f5c5SAndroid Build Coastguard Worker
3633*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer.
3634*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
3635*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
3636*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color,
3637*8975f5c5SAndroid Build Coastguard Worker 0, 4);
3638*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3639*8975f5c5SAndroid Build Coastguard Worker
3640*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer.
3641*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
3642*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3643*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
3644*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
3645*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
3646*8975f5c5SAndroid Build Coastguard Worker
3647*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
3648*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3649*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3650*8975f5c5SAndroid Build Coastguard Worker
3651*8975f5c5SAndroid Build Coastguard Worker // Draw green into the singlesampled color buffer
3652*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
3653*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
3654*8975f5c5SAndroid Build Coastguard Worker glScissor(kSize / 8, kSize / 8, 3 * kSize / 4, 3 * kSize / 4);
3655*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
3656*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3657*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3658*8975f5c5SAndroid Build Coastguard Worker
3659*8975f5c5SAndroid Build Coastguard Worker // Draw blue into the multisampled color buffer
3660*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
3661*8975f5c5SAndroid Build Coastguard Worker glScissor(kSize / 4, kSize / 4, kSize / 2, kSize / 2);
3662*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
3663*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3664*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3665*8975f5c5SAndroid Build Coastguard Worker
3666*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is red on the border, blue in the middle and green in between.
3667*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fboSS);
3668*8975f5c5SAndroid Build Coastguard Worker
3669*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3670*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red);
3671*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red);
3672*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red);
3673*8975f5c5SAndroid Build Coastguard Worker
3674*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 16, 3 * kSize / 16, GLColor::green);
3675*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(13 * kSize / 16, 3 * kSize / 16, GLColor::green);
3676*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 16, 13 * kSize / 16, GLColor::green);
3677*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(13 * kSize / 16, 13 * kSize / 16, GLColor::green);
3678*8975f5c5SAndroid Build Coastguard Worker
3679*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 8, 3 * kSize / 8, GLColor::blue);
3680*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5 * kSize / 8, 3 * kSize / 8, GLColor::blue);
3681*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 8, 5 * kSize / 8, GLColor::blue);
3682*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5 * kSize / 8, 5 * kSize / 8, GLColor::blue);
3683*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::blue);
3684*8975f5c5SAndroid Build Coastguard Worker
3685*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3686*8975f5c5SAndroid Build Coastguard Worker }
3687*8975f5c5SAndroid Build Coastguard Worker
3688*8975f5c5SAndroid Build Coastguard Worker // Draw multisampled, draw multisampled with another sample count, repeat. This tests the same
3689*8975f5c5SAndroid Build Coastguard Worker // texture being bound as multisampled-render-to-texture with different sample counts to two FBOs.
TEST_P(MultisampledRenderToTextureTest,DrawMultisampledDifferentSamples)3690*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureTest, DrawMultisampledDifferentSamples)
3691*8975f5c5SAndroid Build Coastguard Worker {
3692*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
3693*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
3694*8975f5c5SAndroid Build Coastguard Worker
3695*8975f5c5SAndroid Build Coastguard Worker GLsizei maxSamples = 0;
3696*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
3697*8975f5c5SAndroid Build Coastguard Worker ASSERT_GE(maxSamples, 4);
3698*8975f5c5SAndroid Build Coastguard Worker
3699*8975f5c5SAndroid Build Coastguard Worker // Texture attachment to the two framebuffers.
3700*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
3701*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
3702*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3703*8975f5c5SAndroid Build Coastguard Worker
3704*8975f5c5SAndroid Build Coastguard Worker // Create two multisampled framebuffers.
3705*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS1;
3706*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS1);
3707*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color,
3708*8975f5c5SAndroid Build Coastguard Worker 0, 4);
3709*8975f5c5SAndroid Build Coastguard Worker
3710*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS2;
3711*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS2);
3712*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color,
3713*8975f5c5SAndroid Build Coastguard Worker 0, maxSamples);
3714*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3715*8975f5c5SAndroid Build Coastguard Worker
3716*8975f5c5SAndroid Build Coastguard Worker // Draw red into the first multisampled color buffer.
3717*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
3718*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3719*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
3720*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
3721*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
3722*8975f5c5SAndroid Build Coastguard Worker
3723*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
3724*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3725*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3726*8975f5c5SAndroid Build Coastguard Worker
3727*8975f5c5SAndroid Build Coastguard Worker // Draw green into the second multisampled color buffer
3728*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS1);
3729*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
3730*8975f5c5SAndroid Build Coastguard Worker glScissor(kSize / 8, kSize / 8, 3 * kSize / 4, 3 * kSize / 4);
3731*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
3732*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3733*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3734*8975f5c5SAndroid Build Coastguard Worker
3735*8975f5c5SAndroid Build Coastguard Worker // Draw blue into the first multisampled color buffer
3736*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS2);
3737*8975f5c5SAndroid Build Coastguard Worker glScissor(kSize / 4, kSize / 4, kSize / 2, kSize / 2);
3738*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
3739*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3740*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3741*8975f5c5SAndroid Build Coastguard Worker
3742*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is red on the border, blue in the middle and green in between.
3743*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboSS;
3744*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
3745*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3746*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3747*8975f5c5SAndroid Build Coastguard Worker
3748*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3749*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red);
3750*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red);
3751*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red);
3752*8975f5c5SAndroid Build Coastguard Worker
3753*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 16, 3 * kSize / 16, GLColor::green);
3754*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(13 * kSize / 16, 3 * kSize / 16, GLColor::green);
3755*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 16, 13 * kSize / 16, GLColor::green);
3756*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(13 * kSize / 16, 13 * kSize / 16, GLColor::green);
3757*8975f5c5SAndroid Build Coastguard Worker
3758*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 8, 3 * kSize / 8, GLColor::blue);
3759*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5 * kSize / 8, 3 * kSize / 8, GLColor::blue);
3760*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(3 * kSize / 8, 5 * kSize / 8, GLColor::blue);
3761*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5 * kSize / 8, 5 * kSize / 8, GLColor::blue);
3762*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, GLColor::blue);
3763*8975f5c5SAndroid Build Coastguard Worker
3764*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3765*8975f5c5SAndroid Build Coastguard Worker }
3766*8975f5c5SAndroid Build Coastguard Worker
drawCopyThenBlendAllAttachmentsMixed(bool useRenderbuffer)3767*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureES31Test::drawCopyThenBlendAllAttachmentsMixed(bool useRenderbuffer)
3768*8975f5c5SAndroid Build Coastguard Worker {
3769*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
3770*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2"));
3771*8975f5c5SAndroid Build Coastguard Worker
3772*8975f5c5SAndroid Build Coastguard Worker GLint maxDrawBuffers = 0;
3773*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
3774*8975f5c5SAndroid Build Coastguard Worker
3775*8975f5c5SAndroid Build Coastguard Worker // At least 4 draw buffers per GLES3.0 spec.
3776*8975f5c5SAndroid Build Coastguard Worker ASSERT_GE(maxDrawBuffers, 4);
3777*8975f5c5SAndroid Build Coastguard Worker
3778*8975f5c5SAndroid Build Coastguard Worker // Maximum 8 draw buffers exposed by ANGLE.
3779*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kImplMaxDrawBuffers = 8;
3780*8975f5c5SAndroid Build Coastguard Worker maxDrawBuffers = std::min(maxDrawBuffers, kImplMaxDrawBuffers);
3781*8975f5c5SAndroid Build Coastguard Worker
3782*8975f5c5SAndroid Build Coastguard Worker // Integer formats are mixed in which have different sample count limits. A framebuffer must
3783*8975f5c5SAndroid Build Coastguard Worker // have the same sample count for all attachments.
3784*8975f5c5SAndroid Build Coastguard Worker const GLint sampleCount = std::min(mTestSampleCount, mMaxIntegerSamples);
3785*8975f5c5SAndroid Build Coastguard Worker
3786*8975f5c5SAndroid Build Coastguard Worker constexpr const char *kDecl[kImplMaxDrawBuffers] = {
3787*8975f5c5SAndroid Build Coastguard Worker "layout(location = 0) out vec4 out0;", "layout(location = 1) out ivec4 out1;",
3788*8975f5c5SAndroid Build Coastguard Worker "layout(location = 2) out uvec4 out2;", "layout(location = 3) out vec4 out3;",
3789*8975f5c5SAndroid Build Coastguard Worker "layout(location = 4) out uvec4 out4;", "layout(location = 5) out ivec4 out5;",
3790*8975f5c5SAndroid Build Coastguard Worker "layout(location = 6) out ivec4 out6;", "layout(location = 7) out vec4 out7;",
3791*8975f5c5SAndroid Build Coastguard Worker };
3792*8975f5c5SAndroid Build Coastguard Worker
3793*8975f5c5SAndroid Build Coastguard Worker constexpr GLType kGLType[kImplMaxDrawBuffers] = {
3794*8975f5c5SAndroid Build Coastguard Worker {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE}, {GL_RGBA32I, GL_RGBA_INTEGER, GL_INT},
3795*8975f5c5SAndroid Build Coastguard Worker {GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT}, {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE},
3796*8975f5c5SAndroid Build Coastguard Worker {GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT}, {GL_RGBA32I, GL_RGBA_INTEGER, GL_INT},
3797*8975f5c5SAndroid Build Coastguard Worker {GL_RGBA32I, GL_RGBA_INTEGER, GL_INT}, {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE},
3798*8975f5c5SAndroid Build Coastguard Worker };
3799*8975f5c5SAndroid Build Coastguard Worker
3800*8975f5c5SAndroid Build Coastguard Worker constexpr const char *kAssign1[kImplMaxDrawBuffers] = {
3801*8975f5c5SAndroid Build Coastguard Worker "out0 = vec4(1.0f, 0.0f, 0.0f, 1.0f);",
3802*8975f5c5SAndroid Build Coastguard Worker "out1 = ivec4(-19, 13, 123456, -654321);",
3803*8975f5c5SAndroid Build Coastguard Worker "out2 = uvec4(98765, 43210, 2, 0);",
3804*8975f5c5SAndroid Build Coastguard Worker "out3 = vec4(0.0f, 1.0f, 0.0f, 1.0f);",
3805*8975f5c5SAndroid Build Coastguard Worker "out4 = uvec4(10101010, 2345, 0, 991);",
3806*8975f5c5SAndroid Build Coastguard Worker "out5 = ivec4(615243, -948576, -222, 111);",
3807*8975f5c5SAndroid Build Coastguard Worker "out6 = ivec4(-8127931, -1392781, 246810, 1214161820);",
3808*8975f5c5SAndroid Build Coastguard Worker "out7 = vec4(0.0f, 0.0f, 1.0f, 1.0f);",
3809*8975f5c5SAndroid Build Coastguard Worker };
3810*8975f5c5SAndroid Build Coastguard Worker
3811*8975f5c5SAndroid Build Coastguard Worker constexpr const char *kAssign2[kImplMaxDrawBuffers] = {
3812*8975f5c5SAndroid Build Coastguard Worker "out0 = vec4(0.0f, 1.0f, 0.0f, 0.5f);",
3813*8975f5c5SAndroid Build Coastguard Worker "out1 = ivec4(0, 0, 0, 0);",
3814*8975f5c5SAndroid Build Coastguard Worker "out2 = uvec4(0, 0, 0, 0);",
3815*8975f5c5SAndroid Build Coastguard Worker "out3 = vec4(0.0f, 0.0f, 1.0f, 0.5f);",
3816*8975f5c5SAndroid Build Coastguard Worker "out4 = uvec4(0, 0, 0, 0);",
3817*8975f5c5SAndroid Build Coastguard Worker "out5 = ivec4(0, 0, 0, 0);",
3818*8975f5c5SAndroid Build Coastguard Worker "out6 = ivec4(0, 0, 0, 0);",
3819*8975f5c5SAndroid Build Coastguard Worker "out7 = vec4(1.0f, 0.0f, 0.0f, 0.5f);",
3820*8975f5c5SAndroid Build Coastguard Worker };
3821*8975f5c5SAndroid Build Coastguard Worker
3822*8975f5c5SAndroid Build Coastguard Worker // Generate the shaders, [0] for first draw and [1] for second.
3823*8975f5c5SAndroid Build Coastguard Worker std::stringstream fsStr[2];
3824*8975f5c5SAndroid Build Coastguard Worker for (unsigned int index = 0; index < 2; ++index)
3825*8975f5c5SAndroid Build Coastguard Worker {
3826*8975f5c5SAndroid Build Coastguard Worker fsStr[index] << R"(#version 300 es
3827*8975f5c5SAndroid Build Coastguard Worker precision highp float;
3828*8975f5c5SAndroid Build Coastguard Worker )";
3829*8975f5c5SAndroid Build Coastguard Worker
3830*8975f5c5SAndroid Build Coastguard Worker for (GLint drawBuffer = 0; drawBuffer < maxDrawBuffers; ++drawBuffer)
3831*8975f5c5SAndroid Build Coastguard Worker {
3832*8975f5c5SAndroid Build Coastguard Worker fsStr[index] << kDecl[drawBuffer] << "\n";
3833*8975f5c5SAndroid Build Coastguard Worker }
3834*8975f5c5SAndroid Build Coastguard Worker
3835*8975f5c5SAndroid Build Coastguard Worker fsStr[index] << R"(void main()
3836*8975f5c5SAndroid Build Coastguard Worker {
3837*8975f5c5SAndroid Build Coastguard Worker )";
3838*8975f5c5SAndroid Build Coastguard Worker
3839*8975f5c5SAndroid Build Coastguard Worker const char *const *assign = index == 0 ? kAssign1 : kAssign2;
3840*8975f5c5SAndroid Build Coastguard Worker for (GLint drawBuffer = 0; drawBuffer < maxDrawBuffers; ++drawBuffer)
3841*8975f5c5SAndroid Build Coastguard Worker {
3842*8975f5c5SAndroid Build Coastguard Worker fsStr[index] << assign[drawBuffer] << "\n";
3843*8975f5c5SAndroid Build Coastguard Worker }
3844*8975f5c5SAndroid Build Coastguard Worker
3845*8975f5c5SAndroid Build Coastguard Worker fsStr[index] << "}\n";
3846*8975f5c5SAndroid Build Coastguard Worker }
3847*8975f5c5SAndroid Build Coastguard Worker
3848*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
3849*8975f5c5SAndroid Build Coastguard Worker
3850*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
3851*8975f5c5SAndroid Build Coastguard Worker
3852*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into
3853*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
3854*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
3855*8975f5c5SAndroid Build Coastguard Worker
3856*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS[kImplMaxDrawBuffers];
3857*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS[kImplMaxDrawBuffers];
3858*8975f5c5SAndroid Build Coastguard Worker for (GLint drawBuffer = 0; drawBuffer < maxDrawBuffers; ++drawBuffer)
3859*8975f5c5SAndroid Build Coastguard Worker {
3860*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0 + drawBuffer,
3861*8975f5c5SAndroid Build Coastguard Worker &kGLType[drawBuffer], sampleCount, &textureMS[drawBuffer],
3862*8975f5c5SAndroid Build Coastguard Worker &renderbufferMS[drawBuffer]);
3863*8975f5c5SAndroid Build Coastguard Worker }
3864*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3865*8975f5c5SAndroid Build Coastguard Worker
3866*8975f5c5SAndroid Build Coastguard Worker // Setup programs
3867*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawProg, essl3_shaders::vs::Simple(), fsStr[0].str().c_str());
3868*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(blendProg, essl3_shaders::vs::Simple(), fsStr[1].str().c_str());
3869*8975f5c5SAndroid Build Coastguard Worker
3870*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kDrawBuffers[] = {
3871*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3,
3872*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_ATTACHMENT4, GL_COLOR_ATTACHMENT5, GL_COLOR_ATTACHMENT6, GL_COLOR_ATTACHMENT7};
3873*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(maxDrawBuffers, kDrawBuffers);
3874*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3875*8975f5c5SAndroid Build Coastguard Worker
3876*8975f5c5SAndroid Build Coastguard Worker // Draw into the multisampled color buffers.
3877*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawProg);
3878*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawProg, essl3_shaders::PositionAttrib(), 0.5f);
3879*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3880*8975f5c5SAndroid Build Coastguard Worker
3881*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy from one of them.
3882*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3883*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
3884*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
3885*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3886*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3887*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3888*8975f5c5SAndroid Build Coastguard Worker
3889*8975f5c5SAndroid Build Coastguard Worker // Blend color buffers.
3890*8975f5c5SAndroid Build Coastguard Worker glUseProgram(blendProg);
3891*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
3892*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
3893*8975f5c5SAndroid Build Coastguard Worker drawQuad(blendProg, essl3_shaders::PositionAttrib(), 0.5f);
3894*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3895*8975f5c5SAndroid Build Coastguard Worker
3896*8975f5c5SAndroid Build Coastguard Worker // Verify texture colors.
3897*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
3898*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected0(127, 127, 0, 191);
3899*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected0, 1);
3900*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected0, 1);
3901*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected0, 1);
3902*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected0, 1);
3903*8975f5c5SAndroid Build Coastguard Worker
3904*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT3);
3905*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected3(0, 127, 127, 191);
3906*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected3, 1);
3907*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected3, 1);
3908*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected3, 1);
3909*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected3, 1);
3910*8975f5c5SAndroid Build Coastguard Worker
3911*8975f5c5SAndroid Build Coastguard Worker if (maxDrawBuffers > 7)
3912*8975f5c5SAndroid Build Coastguard Worker {
3913*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT7);
3914*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected7(127, 0, 127, 191);
3915*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected7, 1);
3916*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected7, 1);
3917*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected7, 1);
3918*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected7, 1);
3919*8975f5c5SAndroid Build Coastguard Worker }
3920*8975f5c5SAndroid Build Coastguard Worker
3921*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
3922*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
3923*8975f5c5SAndroid Build Coastguard Worker
3924*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3925*8975f5c5SAndroid Build Coastguard Worker }
3926*8975f5c5SAndroid Build Coastguard Worker
3927*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, then blend with 8 mixed format attachments. The copy will make sure an implicit
3928*8975f5c5SAndroid Build Coastguard Worker // resolve happens. Regardless, the following draw should retain the data written by the first draw
3929*8975f5c5SAndroid Build Coastguard Worker // command.
TEST_P(MultisampledRenderToTextureES31Test,DrawCopyThenBlendAllAttachmentsMixed)3930*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES31Test, DrawCopyThenBlendAllAttachmentsMixed)
3931*8975f5c5SAndroid Build Coastguard Worker {
3932*8975f5c5SAndroid Build Coastguard Worker drawCopyThenBlendAllAttachmentsMixed(false);
3933*8975f5c5SAndroid Build Coastguard Worker }
3934*8975f5c5SAndroid Build Coastguard Worker
3935*8975f5c5SAndroid Build Coastguard Worker // Same as DrawCopyThenBlendAllAttachmentsMixed but with renderbuffers.
TEST_P(MultisampledRenderToTextureES31Test,RenderbufferDrawCopyThenBlendAllAttachmentsMixed)3936*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES31Test, RenderbufferDrawCopyThenBlendAllAttachmentsMixed)
3937*8975f5c5SAndroid Build Coastguard Worker {
3938*8975f5c5SAndroid Build Coastguard Worker // Linux Intel Vulkan returns 0 for GL_MAX_INTEGER_SAMPLES http://anglebug.com/42264519
3939*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
3940*8975f5c5SAndroid Build Coastguard Worker
3941*8975f5c5SAndroid Build Coastguard Worker drawCopyThenBlendAllAttachmentsMixed(true);
3942*8975f5c5SAndroid Build Coastguard Worker }
3943*8975f5c5SAndroid Build Coastguard Worker
renderbufferUnresolveColorAndDepthStencilThenTwoColors(bool withDepth,bool withStencil)3944*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureES3Test::renderbufferUnresolveColorAndDepthStencilThenTwoColors(
3945*8975f5c5SAndroid Build Coastguard Worker bool withDepth,
3946*8975f5c5SAndroid Build Coastguard Worker bool withStencil)
3947*8975f5c5SAndroid Build Coastguard Worker {
3948*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
3949*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2"));
3950*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_draw_buffers"));
3951*8975f5c5SAndroid Build Coastguard Worker
3952*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263663
3953*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan());
3954*8975f5c5SAndroid Build Coastguard Worker
3955*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
3956*8975f5c5SAndroid Build Coastguard Worker
3957*8975f5c5SAndroid Build Coastguard Worker setupCopyTexProgram();
3958*8975f5c5SAndroid Build Coastguard Worker
3959*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboColorAndDepthStencil;
3960*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboColorAndDepthStencil);
3961*8975f5c5SAndroid Build Coastguard Worker
3962*8975f5c5SAndroid Build Coastguard Worker // Create framebuffer to draw into, with both color and depth/stencil attachments.
3963*8975f5c5SAndroid Build Coastguard Worker GLTexture color1;
3964*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color1);
3965*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3966*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
3967*8975f5c5SAndroid Build Coastguard Worker color1, 0, 4);
3968*8975f5c5SAndroid Build Coastguard Worker
3969*8975f5c5SAndroid Build Coastguard Worker GLenum depthStencilFormat = GL_DEPTH24_STENCIL8;
3970*8975f5c5SAndroid Build Coastguard Worker GLenum depthStencilTarget = GL_DEPTH_STENCIL_ATTACHMENT;
3971*8975f5c5SAndroid Build Coastguard Worker
3972*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(withDepth || withStencil);
3973*8975f5c5SAndroid Build Coastguard Worker if (withDepth && !withStencil)
3974*8975f5c5SAndroid Build Coastguard Worker {
3975*8975f5c5SAndroid Build Coastguard Worker depthStencilFormat = GL_DEPTH_COMPONENT24;
3976*8975f5c5SAndroid Build Coastguard Worker depthStencilTarget = GL_DEPTH_ATTACHMENT;
3977*8975f5c5SAndroid Build Coastguard Worker }
3978*8975f5c5SAndroid Build Coastguard Worker if (!withDepth && withStencil)
3979*8975f5c5SAndroid Build Coastguard Worker {
3980*8975f5c5SAndroid Build Coastguard Worker depthStencilFormat = GL_STENCIL_INDEX8;
3981*8975f5c5SAndroid Build Coastguard Worker depthStencilTarget = GL_STENCIL_ATTACHMENT;
3982*8975f5c5SAndroid Build Coastguard Worker }
3983*8975f5c5SAndroid Build Coastguard Worker
3984*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencil;
3985*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
3986*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, depthStencilFormat, kSize, kSize);
3987*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, depthStencilTarget, GL_RENDERBUFFER, depthStencil);
3988*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3989*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3990*8975f5c5SAndroid Build Coastguard Worker
3991*8975f5c5SAndroid Build Coastguard Worker // Set viewport and clear depth/stencil
3992*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
3993*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(1);
3994*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x55);
3995*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
3996*8975f5c5SAndroid Build Coastguard Worker
3997*8975f5c5SAndroid Build Coastguard Worker // If depth is not cleared to 1, rendering would fail.
3998*8975f5c5SAndroid Build Coastguard Worker if (withDepth)
3999*8975f5c5SAndroid Build Coastguard Worker {
4000*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
4001*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
4002*8975f5c5SAndroid Build Coastguard Worker }
4003*8975f5c5SAndroid Build Coastguard Worker
4004*8975f5c5SAndroid Build Coastguard Worker // If stencil is not cleared to 0x55, rendering would fail.
4005*8975f5c5SAndroid Build Coastguard Worker if (withStencil)
4006*8975f5c5SAndroid Build Coastguard Worker {
4007*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
4008*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x55, 0xFF);
4009*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
4010*8975f5c5SAndroid Build Coastguard Worker glStencilMask(0xFF);
4011*8975f5c5SAndroid Build Coastguard Worker }
4012*8975f5c5SAndroid Build Coastguard Worker
4013*8975f5c5SAndroid Build Coastguard Worker // Set up program
4014*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
4015*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
4016*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
4017*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
4018*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
4019*8975f5c5SAndroid Build Coastguard Worker
4020*8975f5c5SAndroid Build Coastguard Worker // Draw red
4021*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
4022*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.25f);
4023*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4024*8975f5c5SAndroid Build Coastguard Worker
4025*8975f5c5SAndroid Build Coastguard Worker // Create a texture and copy into it.
4026*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
4027*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
4028*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
4029*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4030*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4031*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4032*8975f5c5SAndroid Build Coastguard Worker
4033*8975f5c5SAndroid Build Coastguard Worker // Draw again into the framebuffer, this time blending. This tests that both the color and
4034*8975f5c5SAndroid Build Coastguard Worker // depth/stencil data are preserved after the resolve incurred by the copy above.
4035*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 0.5f);
4036*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
4037*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
4038*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.0f);
4039*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4040*8975f5c5SAndroid Build Coastguard Worker
4041*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now yellow
4042*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected(127, 127, 0, 191);
4043*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
4044*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected, 1);
4045*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected, 1);
4046*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected, 1);
4047*8975f5c5SAndroid Build Coastguard Worker
4048*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is red.
4049*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize);
4050*8975f5c5SAndroid Build Coastguard Worker
4051*8975f5c5SAndroid Build Coastguard Worker // Now create a framebuffer with two color attachments and do something similar. This makes
4052*8975f5c5SAndroid Build Coastguard Worker // sure that the fact that both these framebuffers have 2 attachments does not cause confusion,
4053*8975f5c5SAndroid Build Coastguard Worker // for example by having the unresolve shader generated for the first framebuffer used for the
4054*8975f5c5SAndroid Build Coastguard Worker // second framebuffer.
4055*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboTwoColors;
4056*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboTwoColors);
4057*8975f5c5SAndroid Build Coastguard Worker
4058*8975f5c5SAndroid Build Coastguard Worker GLTexture color2;
4059*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color2);
4060*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4061*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
4062*8975f5c5SAndroid Build Coastguard Worker color2, 0, 4);
4063*8975f5c5SAndroid Build Coastguard Worker
4064*8975f5c5SAndroid Build Coastguard Worker GLTexture color3;
4065*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color3);
4066*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4067*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
4068*8975f5c5SAndroid Build Coastguard Worker color3, 0, 4);
4069*8975f5c5SAndroid Build Coastguard Worker
4070*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4071*8975f5c5SAndroid Build Coastguard Worker
4072*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
4073*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_STENCIL_TEST);
4074*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_BLEND);
4075*8975f5c5SAndroid Build Coastguard Worker
4076*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kDrawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
4077*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, kDrawBuffers);
4078*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT1);
4079*8975f5c5SAndroid Build Coastguard Worker
4080*8975f5c5SAndroid Build Coastguard Worker // Setup program
4081*8975f5c5SAndroid Build Coastguard Worker constexpr bool kBuffersEnabled[8] = {true, true};
4082*8975f5c5SAndroid Build Coastguard Worker
4083*8975f5c5SAndroid Build Coastguard Worker GLuint drawColorMRT;
4084*8975f5c5SAndroid Build Coastguard Worker setupUniformColorProgramMultiRenderTarget(kBuffersEnabled, &drawColorMRT);
4085*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColorMRT);
4086*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocationMRT =
4087*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColorMRT, angle::essl1_shaders::ColorUniform());
4088*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocationMRT, -1);
4089*8975f5c5SAndroid Build Coastguard Worker
4090*8975f5c5SAndroid Build Coastguard Worker // Draw blue
4091*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocationMRT, 0.0f, 0.0f, 1.0f, 1.0f);
4092*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColorMRT, essl1_shaders::PositionAttrib(), 0.5f);
4093*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4094*8975f5c5SAndroid Build Coastguard Worker
4095*8975f5c5SAndroid Build Coastguard Worker // Copy into texture
4096*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
4097*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0);
4098*8975f5c5SAndroid Build Coastguard Worker
4099*8975f5c5SAndroid Build Coastguard Worker // Blend.
4100*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocationMRT, 0.0f, 1.0f, 0.0f, 0.5f);
4101*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
4102*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
4103*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColorMRT, essl1_shaders::PositionAttrib(), 0.0f);
4104*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4105*8975f5c5SAndroid Build Coastguard Worker
4106*8975f5c5SAndroid Build Coastguard Worker // Verify that the texture is now cyan
4107*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected2(0, 127, 127, 191);
4108*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected2, 1);
4109*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected2, 1);
4110*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected2, 1);
4111*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected2, 1);
4112*8975f5c5SAndroid Build Coastguard Worker
4113*8975f5c5SAndroid Build Coastguard Worker // For completeness, verify that the texture used as copy target is blue.
4114*8975f5c5SAndroid Build Coastguard Worker verifyResults(texture, GLColor::blue, kSize, 0, 0, kSize, kSize);
4115*8975f5c5SAndroid Build Coastguard Worker }
4116*8975f5c5SAndroid Build Coastguard Worker
4117*8975f5c5SAndroid Build Coastguard Worker // Draw, copy, then blend once on a framebuffer with color and depth attachments, and once with two
4118*8975f5c5SAndroid Build Coastguard Worker // color attachments. Tests that unresolve is done correctly on two framebuffers with the same
4119*8975f5c5SAndroid Build Coastguard Worker // number of attachments, but differing in depth being there. Note that this test doesn't apply to
4120*8975f5c5SAndroid Build Coastguard Worker // depth/stencil textures as they are explicitly autoinvalidated between render passes.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferUnresolveColorAndDepthThenTwoColors)4121*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferUnresolveColorAndDepthThenTwoColors)
4122*8975f5c5SAndroid Build Coastguard Worker {
4123*8975f5c5SAndroid Build Coastguard Worker renderbufferUnresolveColorAndDepthStencilThenTwoColors(true, false);
4124*8975f5c5SAndroid Build Coastguard Worker }
4125*8975f5c5SAndroid Build Coastguard Worker
4126*8975f5c5SAndroid Build Coastguard Worker // Similar to RenderbufferUnresolveColorAndDepthThenTwoColors, but with stencil.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferUnresolveColorAndStencilThenTwoColors)4127*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferUnresolveColorAndStencilThenTwoColors)
4128*8975f5c5SAndroid Build Coastguard Worker {
4129*8975f5c5SAndroid Build Coastguard Worker renderbufferUnresolveColorAndDepthStencilThenTwoColors(false, true);
4130*8975f5c5SAndroid Build Coastguard Worker }
4131*8975f5c5SAndroid Build Coastguard Worker
4132*8975f5c5SAndroid Build Coastguard Worker // Similar to RenderbufferUnresolveColorAndDepthThenTwoColors, but with depth and stencil.
TEST_P(MultisampledRenderToTextureES3Test,RenderbufferUnresolveColorAndDepthStencilThenTwoColors)4133*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderbufferUnresolveColorAndDepthStencilThenTwoColors)
4134*8975f5c5SAndroid Build Coastguard Worker {
4135*8975f5c5SAndroid Build Coastguard Worker renderbufferUnresolveColorAndDepthStencilThenTwoColors(true, true);
4136*8975f5c5SAndroid Build Coastguard Worker }
4137*8975f5c5SAndroid Build Coastguard Worker
4138*8975f5c5SAndroid Build Coastguard Worker // Make sure deferred clears are flushed correctly when the framebuffer switches between
4139*8975f5c5SAndroid Build Coastguard Worker // needing unresolve and not needing it.
TEST_P(MultisampledRenderToTextureES3Test,ClearThenMaskedClearFramebufferTest)4140*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, ClearThenMaskedClearFramebufferTest)
4141*8975f5c5SAndroid Build Coastguard Worker {
4142*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
4143*8975f5c5SAndroid Build Coastguard Worker
4144*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 16;
4145*8975f5c5SAndroid Build Coastguard Worker
4146*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
4147*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
4148*8975f5c5SAndroid Build Coastguard Worker
4149*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to use as source.
4150*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthMS;
4151*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthMS);
4152*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT24, kSize, kSize);
4153*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthMS);
4154*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4155*8975f5c5SAndroid Build Coastguard Worker
4156*8975f5c5SAndroid Build Coastguard Worker GLTexture textureMS;
4157*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbufferMS;
4158*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(false, kSize, GL_COLOR_ATTACHMENT0, nullptr, mTestSampleCount,
4159*8975f5c5SAndroid Build Coastguard Worker &textureMS, &renderbufferMS);
4160*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4161*8975f5c5SAndroid Build Coastguard Worker
4162*8975f5c5SAndroid Build Coastguard Worker // Clear depth to 0.5 and color to green.
4163*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.5f);
4164*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
4165*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
4166*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4167*8975f5c5SAndroid Build Coastguard Worker
4168*8975f5c5SAndroid Build Coastguard Worker // Break the render pass.
4169*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
4170*8975f5c5SAndroid Build Coastguard Worker
4171*8975f5c5SAndroid Build Coastguard Worker // Draw red into the multisampled color buffer. An unresolve operation is needed.
4172*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
4173*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawBlue, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
4174*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
4175*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LEQUAL);
4176*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawRed, essl1_shaders::PositionAttrib(), -0.05f);
4177*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawBlue, essl1_shaders::PositionAttrib(), 0.05f);
4178*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4179*8975f5c5SAndroid Build Coastguard Worker
4180*8975f5c5SAndroid Build Coastguard Worker // Break the render pass.
4181*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
4182*8975f5c5SAndroid Build Coastguard Worker
4183*8975f5c5SAndroid Build Coastguard Worker // Clear color to transparent blue.
4184*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
4185*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
4186*8975f5c5SAndroid Build Coastguard Worker
4187*8975f5c5SAndroid Build Coastguard Worker // Clear both color and depth, with color masked.
4188*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
4189*8975f5c5SAndroid Build Coastguard Worker glColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_TRUE);
4190*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.3f);
4191*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
4192*8975f5c5SAndroid Build Coastguard Worker
4193*8975f5c5SAndroid Build Coastguard Worker // Make sure the result is blue.
4194*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kSize - 1, kSize - 1, GLColor::blue);
4195*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4196*8975f5c5SAndroid Build Coastguard Worker }
4197*8975f5c5SAndroid Build Coastguard Worker
4198*8975f5c5SAndroid Build Coastguard Worker // Make sure mid render pass clear works correctly.
TEST_P(MultisampledRenderToTextureES3Test,RenderToTextureMidRenderPassDepthClear)4199*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureES3Test, RenderToTextureMidRenderPassDepthClear)
4200*8975f5c5SAndroid Build Coastguard Worker {
4201*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
4202*8975f5c5SAndroid Build Coastguard Worker
4203*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 6;
4204*8975f5c5SAndroid Build Coastguard Worker
4205*8975f5c5SAndroid Build Coastguard Worker // Create multisampled framebuffer to draw into, with both color and depth attachments.
4206*8975f5c5SAndroid Build Coastguard Worker GLTexture colorMS;
4207*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorMS);
4208*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4209*8975f5c5SAndroid Build Coastguard Worker
4210*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencilMS;
4211*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencilMS);
4212*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kSize, kSize);
4213*8975f5c5SAndroid Build Coastguard Worker
4214*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboMS;
4215*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
4216*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
4217*8975f5c5SAndroid Build Coastguard Worker colorMS, 0, 4);
4218*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
4219*8975f5c5SAndroid Build Coastguard Worker depthStencilMS);
4220*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4221*8975f5c5SAndroid Build Coastguard Worker
4222*8975f5c5SAndroid Build Coastguard Worker // Set up texture for copy operation that breaks the render pass
4223*8975f5c5SAndroid Build Coastguard Worker GLTexture copyTex;
4224*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, copyTex);
4225*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4226*8975f5c5SAndroid Build Coastguard Worker
4227*8975f5c5SAndroid Build Coastguard Worker // First render pass: draw and then break the render pass so that we have initial data in the
4228*8975f5c5SAndroid Build Coastguard Worker // depth buffer 0.75f
4229*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
4230*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 0.0f);
4231*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.0);
4232*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x55);
4233*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
4234*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
4235*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
4236*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
4237*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(redProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
4238*8975f5c5SAndroid Build Coastguard Worker // depthValue = 1/2 * 0.5f + 1/2 = 0.75f
4239*8975f5c5SAndroid Build Coastguard Worker drawQuad(redProgram, essl1_shaders::PositionAttrib(), 0.5f);
4240*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, kSize, kSize);
4241*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4242*8975f5c5SAndroid Build Coastguard Worker
4243*8975f5c5SAndroid Build Coastguard Worker // Second render pass: set depth test to always pass and then draw. ANGLE may optimize to not
4244*8975f5c5SAndroid Build Coastguard Worker // load depth value. Depth buffer should still be 0.75f with color buffer being green.
4245*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_FALSE);
4246*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
4247*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
4248*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
4249*8975f5c5SAndroid Build Coastguard Worker drawQuad(greenProgram, essl1_shaders::PositionAttrib(), 1.0f);
4250*8975f5c5SAndroid Build Coastguard Worker
4251*8975f5c5SAndroid Build Coastguard Worker // Now do mid-renderPass clear to 0.4f
4252*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
4253*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.4f);
4254*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT);
4255*8975f5c5SAndroid Build Coastguard Worker
4256*8975f5c5SAndroid Build Coastguard Worker // Draw blue with depth value 0.5f. This should pass depth test (0.5f>=0.4f) and we see blue.
4257*8975f5c5SAndroid Build Coastguard Worker // If mid-RenderPass clear not working properly, depthBuffer should still have 0.75 and depth
4258*8975f5c5SAndroid Build Coastguard Worker // test will fail and you see Green.
4259*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GEQUAL);
4260*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
4261*8975f5c5SAndroid Build Coastguard Worker // depthValue = 1/2 * 0.0f + 1/2 = 0.5f
4262*8975f5c5SAndroid Build Coastguard Worker drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.0f);
4263*8975f5c5SAndroid Build Coastguard Worker
4264*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
4265*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4266*8975f5c5SAndroid Build Coastguard Worker }
4267*8975f5c5SAndroid Build Coastguard Worker
4268*8975f5c5SAndroid Build Coastguard Worker class MultisampledRenderToTextureWithAdvancedBlendTest : public MultisampledRenderToTextureES3Test
4269*8975f5c5SAndroid Build Coastguard Worker {
4270*8975f5c5SAndroid Build Coastguard Worker protected:
4271*8975f5c5SAndroid Build Coastguard Worker enum class InitMethod
4272*8975f5c5SAndroid Build Coastguard Worker {
4273*8975f5c5SAndroid Build Coastguard Worker Clear,
4274*8975f5c5SAndroid Build Coastguard Worker Load,
4275*8975f5c5SAndroid Build Coastguard Worker };
4276*8975f5c5SAndroid Build Coastguard Worker
4277*8975f5c5SAndroid Build Coastguard Worker void drawTestCommon(bool useRenderbuffer, InitMethod initMethod);
4278*8975f5c5SAndroid Build Coastguard Worker };
4279*8975f5c5SAndroid Build Coastguard Worker
drawTestCommon(bool useRenderbuffer,InitMethod initMethod)4280*8975f5c5SAndroid Build Coastguard Worker void MultisampledRenderToTextureWithAdvancedBlendTest::drawTestCommon(bool useRenderbuffer,
4281*8975f5c5SAndroid Build Coastguard Worker InitMethod initMethod)
4282*8975f5c5SAndroid Build Coastguard Worker {
4283*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
4284*8975f5c5SAndroid Build Coastguard Worker #extension GL_KHR_blend_equation_advanced : require
4285*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
4286*8975f5c5SAndroid Build Coastguard Worker uniform vec4 color;
4287*8975f5c5SAndroid Build Coastguard Worker layout (blend_support_multiply) out;
4288*8975f5c5SAndroid Build Coastguard Worker layout (location = 0) out vec4 outColor;
4289*8975f5c5SAndroid Build Coastguard Worker void main() {
4290*8975f5c5SAndroid Build Coastguard Worker outColor = color;
4291*8975f5c5SAndroid Build Coastguard Worker })";
4292*8975f5c5SAndroid Build Coastguard Worker
4293*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
4294*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
4295*8975f5c5SAndroid Build Coastguard Worker
4296*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, "color");
4297*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
4298*8975f5c5SAndroid Build Coastguard Worker
4299*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
4300*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
4301*8975f5c5SAndroid Build Coastguard Worker
4302*8975f5c5SAndroid Build Coastguard Worker // Set up color attachment and bind to FBO
4303*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 1;
4304*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
4305*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer;
4306*8975f5c5SAndroid Build Coastguard Worker createAndAttachColorAttachment(useRenderbuffer, kSize, GL_COLOR_ATTACHMENT0, nullptr,
4307*8975f5c5SAndroid Build Coastguard Worker mTestSampleCount, &texture, &renderbuffer);
4308*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4309*8975f5c5SAndroid Build Coastguard Worker
4310*8975f5c5SAndroid Build Coastguard Worker constexpr float kDst[4] = {1.0f, 0.25f, 0.5f, 1.0f};
4311*8975f5c5SAndroid Build Coastguard Worker constexpr float kSrc[4] = {0.5f, 1.0f, 1.0f, 1.0f};
4312*8975f5c5SAndroid Build Coastguard Worker
4313*8975f5c5SAndroid Build Coastguard Worker glClearColor(kDst[0], kDst[1], kDst[2], kDst[3]);
4314*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, kSrc[0], kSrc[1], kSrc[2], kSrc[3]);
4315*8975f5c5SAndroid Build Coastguard Worker
4316*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
4317*8975f5c5SAndroid Build Coastguard Worker glBlendEquation(GL_MULTIPLY_KHR);
4318*8975f5c5SAndroid Build Coastguard Worker
4319*8975f5c5SAndroid Build Coastguard Worker if (initMethod == InitMethod::Load)
4320*8975f5c5SAndroid Build Coastguard Worker {
4321*8975f5c5SAndroid Build Coastguard Worker const GLColor kInitColor(0xFF, 0x3F, 0x7F, 0xFF);
4322*8975f5c5SAndroid Build Coastguard Worker if (useRenderbuffer)
4323*8975f5c5SAndroid Build Coastguard Worker {
4324*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
4325*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kInitColor, 1);
4326*8975f5c5SAndroid Build Coastguard Worker }
4327*8975f5c5SAndroid Build Coastguard Worker else
4328*8975f5c5SAndroid Build Coastguard Worker {
4329*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> initData(kSize * kSize, kInitColor);
4330*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE,
4331*8975f5c5SAndroid Build Coastguard Worker initData.data());
4332*8975f5c5SAndroid Build Coastguard Worker }
4333*8975f5c5SAndroid Build Coastguard Worker }
4334*8975f5c5SAndroid Build Coastguard Worker else
4335*8975f5c5SAndroid Build Coastguard Worker {
4336*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
4337*8975f5c5SAndroid Build Coastguard Worker }
4338*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0);
4339*8975f5c5SAndroid Build Coastguard Worker
4340*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0x7F, 0x3F, 0x7F, 0xFF), 1);
4341*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4342*8975f5c5SAndroid Build Coastguard Worker }
4343*8975f5c5SAndroid Build Coastguard Worker
4344*8975f5c5SAndroid Build Coastguard Worker // Interaction between GL_EXT_multisampled_render_to_texture and advanced blend.
TEST_P(MultisampledRenderToTextureWithAdvancedBlendTest,LoadThenDraw)4345*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureWithAdvancedBlendTest, LoadThenDraw)
4346*8975f5c5SAndroid Build Coastguard Worker {
4347*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
4348*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_KHR_blend_equation_advanced"));
4349*8975f5c5SAndroid Build Coastguard Worker
4350*8975f5c5SAndroid Build Coastguard Worker drawTestCommon(false, InitMethod::Load);
4351*8975f5c5SAndroid Build Coastguard Worker }
4352*8975f5c5SAndroid Build Coastguard Worker
4353*8975f5c5SAndroid Build Coastguard Worker // Same as Draw, but with renderbuffers.
TEST_P(MultisampledRenderToTextureWithAdvancedBlendTest,RenderbufferLoadThenDraw)4354*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureWithAdvancedBlendTest, RenderbufferLoadThenDraw)
4355*8975f5c5SAndroid Build Coastguard Worker {
4356*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
4357*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_KHR_blend_equation_advanced"));
4358*8975f5c5SAndroid Build Coastguard Worker
4359*8975f5c5SAndroid Build Coastguard Worker drawTestCommon(true, InitMethod::Load);
4360*8975f5c5SAndroid Build Coastguard Worker }
4361*8975f5c5SAndroid Build Coastguard Worker
4362*8975f5c5SAndroid Build Coastguard Worker // Interaction between GL_EXT_multisampled_render_to_texture and advanced blend.
TEST_P(MultisampledRenderToTextureWithAdvancedBlendTest,ClearThenDraw)4363*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureWithAdvancedBlendTest, ClearThenDraw)
4364*8975f5c5SAndroid Build Coastguard Worker {
4365*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
4366*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_KHR_blend_equation_advanced"));
4367*8975f5c5SAndroid Build Coastguard Worker
4368*8975f5c5SAndroid Build Coastguard Worker drawTestCommon(false, InitMethod::Clear);
4369*8975f5c5SAndroid Build Coastguard Worker }
4370*8975f5c5SAndroid Build Coastguard Worker
4371*8975f5c5SAndroid Build Coastguard Worker // Same as Draw, but with renderbuffers.
TEST_P(MultisampledRenderToTextureWithAdvancedBlendTest,RenderbufferClearThenDraw)4372*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledRenderToTextureWithAdvancedBlendTest, RenderbufferClearThenDraw)
4373*8975f5c5SAndroid Build Coastguard Worker {
4374*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
4375*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_KHR_blend_equation_advanced"));
4376*8975f5c5SAndroid Build Coastguard Worker
4377*8975f5c5SAndroid Build Coastguard Worker drawTestCommon(true, InitMethod::Clear);
4378*8975f5c5SAndroid Build Coastguard Worker }
4379*8975f5c5SAndroid Build Coastguard Worker
4380*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_COMBINE_1(
4381*8975f5c5SAndroid Build Coastguard Worker MultisampledRenderToTextureTest,
4382*8975f5c5SAndroid Build Coastguard Worker PrintToStringParamName,
4383*8975f5c5SAndroid Build Coastguard Worker testing::Bool(),
4384*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES2,
4385*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES3,
4386*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES31,
4387*8975f5c5SAndroid Build Coastguard Worker ES2_METAL().enable(Feature::EnableMultisampledRenderToTextureOnNonTilers),
4388*8975f5c5SAndroid Build Coastguard Worker ES3_METAL()
4389*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::EnableMultisampledRenderToTextureOnNonTilers)
4390*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::EmulateDontCareLoadWithRandomClear),
4391*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN()
4392*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState)
4393*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState2),
4394*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::SupportsExtendedDynamicState2),
4395*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::SupportsSPIRV14),
4396*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN_SWIFTSHADER().enable(Feature::EnableMultisampledRenderToTexture),
4397*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN_SWIFTSHADER()
4398*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::EnableMultisampledRenderToTexture)
4399*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::AsyncCommandQueue));
4400*8975f5c5SAndroid Build Coastguard Worker
4401*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MultisampledRenderToTextureES3Test);
4402*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_COMBINE_1(
4403*8975f5c5SAndroid Build Coastguard Worker MultisampledRenderToTextureES3Test,
4404*8975f5c5SAndroid Build Coastguard Worker PrintToStringParamName,
4405*8975f5c5SAndroid Build Coastguard Worker testing::Bool(),
4406*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES3,
4407*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES31,
4408*8975f5c5SAndroid Build Coastguard Worker ES3_METAL()
4409*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::EnableMultisampledRenderToTextureOnNonTilers)
4410*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::EmulateDontCareLoadWithRandomClear),
4411*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN()
4412*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState)
4413*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState2),
4414*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::SupportsExtendedDynamicState2),
4415*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::SupportsSPIRV14),
4416*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN_SWIFTSHADER().enable(Feature::EnableMultisampledRenderToTexture),
4417*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN_SWIFTSHADER()
4418*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::EnableMultisampledRenderToTexture)
4419*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::AsyncCommandQueue));
4420*8975f5c5SAndroid Build Coastguard Worker
4421*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MultisampledRenderToTextureES31Test);
4422*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_COMBINE_1(
4423*8975f5c5SAndroid Build Coastguard Worker MultisampledRenderToTextureES31Test,
4424*8975f5c5SAndroid Build Coastguard Worker PrintToStringParamName,
4425*8975f5c5SAndroid Build Coastguard Worker testing::Bool(),
4426*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES31,
4427*8975f5c5SAndroid Build Coastguard Worker ES31_VULKAN()
4428*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState)
4429*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState2),
4430*8975f5c5SAndroid Build Coastguard Worker ES31_VULKAN().disable(Feature::SupportsExtendedDynamicState2),
4431*8975f5c5SAndroid Build Coastguard Worker ES31_VULKAN().disable(Feature::SupportsSPIRV14),
4432*8975f5c5SAndroid Build Coastguard Worker ES31_VULKAN_SWIFTSHADER().enable(Feature::EnableMultisampledRenderToTexture),
4433*8975f5c5SAndroid Build Coastguard Worker ES31_VULKAN_SWIFTSHADER()
4434*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::EnableMultisampledRenderToTexture)
4435*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::AsyncCommandQueue));
4436*8975f5c5SAndroid Build Coastguard Worker
4437*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MultisampledRenderToTextureWithAdvancedBlendTest);
4438*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_COMBINE_1(
4439*8975f5c5SAndroid Build Coastguard Worker MultisampledRenderToTextureWithAdvancedBlendTest,
4440*8975f5c5SAndroid Build Coastguard Worker PrintToStringParamName,
4441*8975f5c5SAndroid Build Coastguard Worker testing::Bool(),
4442*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES3,
4443*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES31,
4444*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::SupportsSPIRV14),
4445*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN_SWIFTSHADER().enable(Feature::EnableMultisampledRenderToTexture),
4446*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN_SWIFTSHADER()
4447*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::EnableMultisampledRenderToTexture)
4448*8975f5c5SAndroid Build Coastguard Worker .enable(Feature::AsyncCommandQueue));
4449*8975f5c5SAndroid Build Coastguard Worker } // namespace
4450