xref: /aosp_15_r20/external/angle/src/tests/gl_tests/ClearTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
10*8975f5c5SAndroid Build Coastguard Worker #include "util/random_utils.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "util/test_utils.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 class ClearTestBase : public ANGLETest<>
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker   protected:
ClearTestBase()21*8975f5c5SAndroid Build Coastguard Worker     ClearTestBase()
22*8975f5c5SAndroid Build Coastguard Worker     {
23*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
24*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
25*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
26*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
27*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
28*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
29*8975f5c5SAndroid Build Coastguard Worker         setConfigDepthBits(24);
30*8975f5c5SAndroid Build Coastguard Worker         setConfigStencilBits(8);
31*8975f5c5SAndroid Build Coastguard Worker     }
32*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()33*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
34*8975f5c5SAndroid Build Coastguard Worker     {
35*8975f5c5SAndroid Build Coastguard Worker         mFBOs.resize(2, 0);
36*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(2, mFBOs.data());
37*8975f5c5SAndroid Build Coastguard Worker 
38*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
39*8975f5c5SAndroid Build Coastguard Worker     }
40*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()41*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
42*8975f5c5SAndroid Build Coastguard Worker     {
43*8975f5c5SAndroid Build Coastguard Worker         if (!mFBOs.empty())
44*8975f5c5SAndroid Build Coastguard Worker         {
45*8975f5c5SAndroid Build Coastguard Worker             glDeleteFramebuffers(static_cast<GLsizei>(mFBOs.size()), mFBOs.data());
46*8975f5c5SAndroid Build Coastguard Worker         }
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker         if (!mTextures.empty())
49*8975f5c5SAndroid Build Coastguard Worker         {
50*8975f5c5SAndroid Build Coastguard Worker             glDeleteTextures(static_cast<GLsizei>(mTextures.size()), mTextures.data());
51*8975f5c5SAndroid Build Coastguard Worker         }
52*8975f5c5SAndroid Build Coastguard Worker     }
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLuint> mFBOs;
55*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLuint> mTextures;
56*8975f5c5SAndroid Build Coastguard Worker };
57*8975f5c5SAndroid Build Coastguard Worker 
58*8975f5c5SAndroid Build Coastguard Worker class ClearTest : public ClearTestBase
59*8975f5c5SAndroid Build Coastguard Worker {};
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker class ClearTestES3 : public ClearTestBase
62*8975f5c5SAndroid Build Coastguard Worker {
63*8975f5c5SAndroid Build Coastguard Worker   protected:
verifyDepth(float depthValue,uint32_t size)64*8975f5c5SAndroid Build Coastguard Worker     void verifyDepth(float depthValue, uint32_t size)
65*8975f5c5SAndroid Build Coastguard Worker     {
66*8975f5c5SAndroid Build Coastguard Worker         // Use a small shader to verify depth.
67*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(depthTestProgram, essl1_shaders::vs::Passthrough(),
68*8975f5c5SAndroid Build Coastguard Worker                          essl1_shaders::fs::Blue());
69*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(depthTestProgramFail, essl1_shaders::vs::Passthrough(),
70*8975f5c5SAndroid Build Coastguard Worker                          essl1_shaders::fs::Red());
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker         GLboolean hasDepthTest  = GL_FALSE;
73*8975f5c5SAndroid Build Coastguard Worker         GLboolean hasDepthWrite = GL_TRUE;
74*8975f5c5SAndroid Build Coastguard Worker         GLint prevDepthFunc     = GL_ALWAYS;
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(GL_DEPTH_TEST, &hasDepthTest);
77*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(GL_DEPTH_WRITEMASK, &hasDepthWrite);
78*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_DEPTH_FUNC, &prevDepthFunc);
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker         if (!hasDepthTest)
81*8975f5c5SAndroid Build Coastguard Worker         {
82*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_DEPTH_TEST);
83*8975f5c5SAndroid Build Coastguard Worker         }
84*8975f5c5SAndroid Build Coastguard Worker         if (hasDepthWrite)
85*8975f5c5SAndroid Build Coastguard Worker         {
86*8975f5c5SAndroid Build Coastguard Worker             glDepthMask(GL_FALSE);
87*8975f5c5SAndroid Build Coastguard Worker         }
88*8975f5c5SAndroid Build Coastguard Worker         glDepthFunc(GL_LESS);
89*8975f5c5SAndroid Build Coastguard Worker         drawQuad(depthTestProgram, essl1_shaders::PositionAttrib(), depthValue * 2 - 1 - 0.01f);
90*8975f5c5SAndroid Build Coastguard Worker         drawQuad(depthTestProgramFail, essl1_shaders::PositionAttrib(), depthValue * 2 - 1 + 0.01f);
91*8975f5c5SAndroid Build Coastguard Worker         if (!hasDepthTest)
92*8975f5c5SAndroid Build Coastguard Worker         {
93*8975f5c5SAndroid Build Coastguard Worker             glDisable(GL_DEPTH_TEST);
94*8975f5c5SAndroid Build Coastguard Worker         }
95*8975f5c5SAndroid Build Coastguard Worker         if (hasDepthWrite)
96*8975f5c5SAndroid Build Coastguard Worker         {
97*8975f5c5SAndroid Build Coastguard Worker             glDepthMask(GL_TRUE);
98*8975f5c5SAndroid Build Coastguard Worker         }
99*8975f5c5SAndroid Build Coastguard Worker         glDepthFunc(prevDepthFunc);
100*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor::blue, 1);
103*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(size - 1, 0, GLColor::blue, 1);
104*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, size - 1, GLColor::blue, 1);
105*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(size - 1, size - 1, GLColor::blue, 1);
106*8975f5c5SAndroid Build Coastguard Worker     }
107*8975f5c5SAndroid Build Coastguard Worker 
verifyStencil(uint32_t stencilValue,uint32_t size)108*8975f5c5SAndroid Build Coastguard Worker     void verifyStencil(uint32_t stencilValue, uint32_t size)
109*8975f5c5SAndroid Build Coastguard Worker     {
110*8975f5c5SAndroid Build Coastguard Worker         // Use another small shader to verify stencil.
111*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(stencilTestProgram, essl1_shaders::vs::Passthrough(),
112*8975f5c5SAndroid Build Coastguard Worker                          essl1_shaders::fs::Green());
113*8975f5c5SAndroid Build Coastguard Worker         GLboolean hasStencilTest   = GL_FALSE;
114*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilFunc      = GL_ALWAYS;
115*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilValue     = 0xFF;
116*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilRef       = 0xFF;
117*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilFail      = GL_KEEP;
118*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilDepthFail = GL_KEEP;
119*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilDepthPass = GL_KEEP;
120*8975f5c5SAndroid Build Coastguard Worker 
121*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(GL_STENCIL_TEST, &hasStencilTest);
122*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_FUNC, &prevStencilFunc);
123*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_VALUE_MASK, &prevStencilValue);
124*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_REF, &prevStencilRef);
125*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_FAIL, &prevStencilFail);
126*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &prevStencilDepthFail);
127*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &prevStencilDepthPass);
128*8975f5c5SAndroid Build Coastguard Worker 
129*8975f5c5SAndroid Build Coastguard Worker         if (!hasStencilTest)
130*8975f5c5SAndroid Build Coastguard Worker         {
131*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_STENCIL_TEST);
132*8975f5c5SAndroid Build Coastguard Worker         }
133*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_EQUAL, stencilValue, 0xFF);
134*8975f5c5SAndroid Build Coastguard Worker         glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
135*8975f5c5SAndroid Build Coastguard Worker         drawQuad(stencilTestProgram, essl1_shaders::PositionAttrib(), 0.0f);
136*8975f5c5SAndroid Build Coastguard Worker         if (!hasStencilTest)
137*8975f5c5SAndroid Build Coastguard Worker         {
138*8975f5c5SAndroid Build Coastguard Worker             glDisable(GL_STENCIL_TEST);
139*8975f5c5SAndroid Build Coastguard Worker         }
140*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(prevStencilFunc, prevStencilValue, prevStencilRef);
141*8975f5c5SAndroid Build Coastguard Worker         glStencilOp(prevStencilFail, prevStencilDepthFail, prevStencilDepthPass);
142*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
143*8975f5c5SAndroid Build Coastguard Worker 
144*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor::green, 1);
145*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(size - 1, 0, GLColor::green, 1);
146*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, size - 1, GLColor::green, 1);
147*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(size - 1, size - 1, GLColor::green, 1);
148*8975f5c5SAndroid Build Coastguard Worker     }
149*8975f5c5SAndroid Build Coastguard Worker };
150*8975f5c5SAndroid Build Coastguard Worker 
151*8975f5c5SAndroid Build Coastguard Worker class ClearTestES31 : public ClearTestES3
152*8975f5c5SAndroid Build Coastguard Worker {};
153*8975f5c5SAndroid Build Coastguard Worker 
154*8975f5c5SAndroid Build Coastguard Worker class ClearTestRGB : public ANGLETest<>
155*8975f5c5SAndroid Build Coastguard Worker {
156*8975f5c5SAndroid Build Coastguard Worker   protected:
ClearTestRGB()157*8975f5c5SAndroid Build Coastguard Worker     ClearTestRGB()
158*8975f5c5SAndroid Build Coastguard Worker     {
159*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
160*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
161*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
162*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
163*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
164*8975f5c5SAndroid Build Coastguard Worker     }
165*8975f5c5SAndroid Build Coastguard Worker };
166*8975f5c5SAndroid Build Coastguard Worker 
167*8975f5c5SAndroid Build Coastguard Worker class ClearTestRGB_ES3 : public ClearTestRGB
168*8975f5c5SAndroid Build Coastguard Worker {};
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker class ClearTextureEXTTest : public ANGLETest<>
171*8975f5c5SAndroid Build Coastguard Worker {
172*8975f5c5SAndroid Build Coastguard Worker   protected:
ClearTextureEXTTest()173*8975f5c5SAndroid Build Coastguard Worker     ClearTextureEXTTest()
174*8975f5c5SAndroid Build Coastguard Worker     {
175*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
176*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
177*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
178*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
179*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
180*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
181*8975f5c5SAndroid Build Coastguard Worker     }
182*8975f5c5SAndroid Build Coastguard Worker };
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker // Each int parameter can have three values: don't clear, clear, or masked clear.  The bool
185*8975f5c5SAndroid Build Coastguard Worker // parameter controls scissor.
186*8975f5c5SAndroid Build Coastguard Worker using MaskedScissoredClearVariationsTestParams =
187*8975f5c5SAndroid Build Coastguard Worker     std::tuple<angle::PlatformParameters, int, int, int, bool>;
188*8975f5c5SAndroid Build Coastguard Worker 
ParseMaskedScissoredClearVariationsTestParams(const MaskedScissoredClearVariationsTestParams & params,bool * clearColor,bool * clearDepth,bool * clearStencil,bool * maskColor,bool * maskDepth,bool * maskStencil,bool * scissor)189*8975f5c5SAndroid Build Coastguard Worker void ParseMaskedScissoredClearVariationsTestParams(
190*8975f5c5SAndroid Build Coastguard Worker     const MaskedScissoredClearVariationsTestParams &params,
191*8975f5c5SAndroid Build Coastguard Worker     bool *clearColor,
192*8975f5c5SAndroid Build Coastguard Worker     bool *clearDepth,
193*8975f5c5SAndroid Build Coastguard Worker     bool *clearStencil,
194*8975f5c5SAndroid Build Coastguard Worker     bool *maskColor,
195*8975f5c5SAndroid Build Coastguard Worker     bool *maskDepth,
196*8975f5c5SAndroid Build Coastguard Worker     bool *maskStencil,
197*8975f5c5SAndroid Build Coastguard Worker     bool *scissor)
198*8975f5c5SAndroid Build Coastguard Worker {
199*8975f5c5SAndroid Build Coastguard Worker     int colorClearInfo   = std::get<1>(params);
200*8975f5c5SAndroid Build Coastguard Worker     int depthClearInfo   = std::get<2>(params);
201*8975f5c5SAndroid Build Coastguard Worker     int stencilClearInfo = std::get<3>(params);
202*8975f5c5SAndroid Build Coastguard Worker 
203*8975f5c5SAndroid Build Coastguard Worker     *clearColor   = colorClearInfo > 0;
204*8975f5c5SAndroid Build Coastguard Worker     *clearDepth   = depthClearInfo > 0;
205*8975f5c5SAndroid Build Coastguard Worker     *clearStencil = stencilClearInfo > 0;
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker     *maskColor   = colorClearInfo > 1;
208*8975f5c5SAndroid Build Coastguard Worker     *maskDepth   = depthClearInfo > 1;
209*8975f5c5SAndroid Build Coastguard Worker     *maskStencil = stencilClearInfo > 1;
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker     *scissor = std::get<4>(params);
212*8975f5c5SAndroid Build Coastguard Worker }
213*8975f5c5SAndroid Build Coastguard Worker 
MaskedScissoredClearVariationsTestPrint(const::testing::TestParamInfo<MaskedScissoredClearVariationsTestParams> & paramsInfo)214*8975f5c5SAndroid Build Coastguard Worker std::string MaskedScissoredClearVariationsTestPrint(
215*8975f5c5SAndroid Build Coastguard Worker     const ::testing::TestParamInfo<MaskedScissoredClearVariationsTestParams> &paramsInfo)
216*8975f5c5SAndroid Build Coastguard Worker {
217*8975f5c5SAndroid Build Coastguard Worker     const MaskedScissoredClearVariationsTestParams &params = paramsInfo.param;
218*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream out;
219*8975f5c5SAndroid Build Coastguard Worker 
220*8975f5c5SAndroid Build Coastguard Worker     out << std::get<0>(params);
221*8975f5c5SAndroid Build Coastguard Worker 
222*8975f5c5SAndroid Build Coastguard Worker     bool clearColor, clearDepth, clearStencil;
223*8975f5c5SAndroid Build Coastguard Worker     bool maskColor, maskDepth, maskStencil;
224*8975f5c5SAndroid Build Coastguard Worker     bool scissor;
225*8975f5c5SAndroid Build Coastguard Worker 
226*8975f5c5SAndroid Build Coastguard Worker     ParseMaskedScissoredClearVariationsTestParams(params, &clearColor, &clearDepth, &clearStencil,
227*8975f5c5SAndroid Build Coastguard Worker                                                   &maskColor, &maskDepth, &maskStencil, &scissor);
228*8975f5c5SAndroid Build Coastguard Worker 
229*8975f5c5SAndroid Build Coastguard Worker     if (scissor || clearColor || clearDepth || clearStencil || maskColor || maskDepth ||
230*8975f5c5SAndroid Build Coastguard Worker         maskStencil)
231*8975f5c5SAndroid Build Coastguard Worker     {
232*8975f5c5SAndroid Build Coastguard Worker         out << "_";
233*8975f5c5SAndroid Build Coastguard Worker     }
234*8975f5c5SAndroid Build Coastguard Worker 
235*8975f5c5SAndroid Build Coastguard Worker     if (scissor)
236*8975f5c5SAndroid Build Coastguard Worker     {
237*8975f5c5SAndroid Build Coastguard Worker         out << "_scissored";
238*8975f5c5SAndroid Build Coastguard Worker     }
239*8975f5c5SAndroid Build Coastguard Worker 
240*8975f5c5SAndroid Build Coastguard Worker     if (clearColor || clearDepth || clearStencil)
241*8975f5c5SAndroid Build Coastguard Worker     {
242*8975f5c5SAndroid Build Coastguard Worker         out << "_clear_";
243*8975f5c5SAndroid Build Coastguard Worker         if (clearColor)
244*8975f5c5SAndroid Build Coastguard Worker         {
245*8975f5c5SAndroid Build Coastguard Worker             out << "c";
246*8975f5c5SAndroid Build Coastguard Worker         }
247*8975f5c5SAndroid Build Coastguard Worker         if (clearDepth)
248*8975f5c5SAndroid Build Coastguard Worker         {
249*8975f5c5SAndroid Build Coastguard Worker             out << "d";
250*8975f5c5SAndroid Build Coastguard Worker         }
251*8975f5c5SAndroid Build Coastguard Worker         if (clearStencil)
252*8975f5c5SAndroid Build Coastguard Worker         {
253*8975f5c5SAndroid Build Coastguard Worker             out << "s";
254*8975f5c5SAndroid Build Coastguard Worker         }
255*8975f5c5SAndroid Build Coastguard Worker     }
256*8975f5c5SAndroid Build Coastguard Worker 
257*8975f5c5SAndroid Build Coastguard Worker     if (maskColor || maskDepth || maskStencil)
258*8975f5c5SAndroid Build Coastguard Worker     {
259*8975f5c5SAndroid Build Coastguard Worker         out << "_mask_";
260*8975f5c5SAndroid Build Coastguard Worker         if (maskColor)
261*8975f5c5SAndroid Build Coastguard Worker         {
262*8975f5c5SAndroid Build Coastguard Worker             out << "c";
263*8975f5c5SAndroid Build Coastguard Worker         }
264*8975f5c5SAndroid Build Coastguard Worker         if (maskDepth)
265*8975f5c5SAndroid Build Coastguard Worker         {
266*8975f5c5SAndroid Build Coastguard Worker             out << "d";
267*8975f5c5SAndroid Build Coastguard Worker         }
268*8975f5c5SAndroid Build Coastguard Worker         if (maskStencil)
269*8975f5c5SAndroid Build Coastguard Worker         {
270*8975f5c5SAndroid Build Coastguard Worker             out << "s";
271*8975f5c5SAndroid Build Coastguard Worker         }
272*8975f5c5SAndroid Build Coastguard Worker     }
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker     return out.str();
275*8975f5c5SAndroid Build Coastguard Worker }
276*8975f5c5SAndroid Build Coastguard Worker 
277*8975f5c5SAndroid Build Coastguard Worker class MaskedScissoredClearTestBase : public ANGLETest<MaskedScissoredClearVariationsTestParams>
278*8975f5c5SAndroid Build Coastguard Worker {
279*8975f5c5SAndroid Build Coastguard Worker   protected:
MaskedScissoredClearTestBase()280*8975f5c5SAndroid Build Coastguard Worker     MaskedScissoredClearTestBase()
281*8975f5c5SAndroid Build Coastguard Worker     {
282*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
283*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
284*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
285*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
286*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
287*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
288*8975f5c5SAndroid Build Coastguard Worker         setConfigDepthBits(24);
289*8975f5c5SAndroid Build Coastguard Worker         setConfigStencilBits(8);
290*8975f5c5SAndroid Build Coastguard Worker     }
291*8975f5c5SAndroid Build Coastguard Worker 
292*8975f5c5SAndroid Build Coastguard Worker     void maskedScissoredColorDepthStencilClear(
293*8975f5c5SAndroid Build Coastguard Worker         const MaskedScissoredClearVariationsTestParams &params);
294*8975f5c5SAndroid Build Coastguard Worker 
295*8975f5c5SAndroid Build Coastguard Worker     bool mHasDepth   = true;
296*8975f5c5SAndroid Build Coastguard Worker     bool mHasStencil = true;
297*8975f5c5SAndroid Build Coastguard Worker };
298*8975f5c5SAndroid Build Coastguard Worker 
299*8975f5c5SAndroid Build Coastguard Worker class MaskedScissoredClearTest : public MaskedScissoredClearTestBase
300*8975f5c5SAndroid Build Coastguard Worker {};
301*8975f5c5SAndroid Build Coastguard Worker 
302*8975f5c5SAndroid Build Coastguard Worker // Overrides a feature to force emulation of stencil-only and depth-only formats with a packed
303*8975f5c5SAndroid Build Coastguard Worker // depth/stencil format
304*8975f5c5SAndroid Build Coastguard Worker class VulkanClearTest : public MaskedScissoredClearTestBase
305*8975f5c5SAndroid Build Coastguard Worker {
306*8975f5c5SAndroid Build Coastguard Worker   protected:
testSetUp()307*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
308*8975f5c5SAndroid Build Coastguard Worker     {
309*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mColorTexture);
310*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
311*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, nullptr);
312*8975f5c5SAndroid Build Coastguard Worker 
313*8975f5c5SAndroid Build Coastguard Worker         // Setup Color/Stencil FBO with a stencil format that's emulated with packed depth/stencil.
314*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mColorStencilFBO);
315*8975f5c5SAndroid Build Coastguard Worker 
316*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mColorTexture,
317*8975f5c5SAndroid Build Coastguard Worker                                0);
318*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, mStencilTexture);
319*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, getWindowWidth(),
320*8975f5c5SAndroid Build Coastguard Worker                               getWindowHeight());
321*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
322*8975f5c5SAndroid Build Coastguard Worker                                   mStencilTexture);
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
325*8975f5c5SAndroid Build Coastguard Worker 
326*8975f5c5SAndroid Build Coastguard Worker         // Note: GL_DEPTH_COMPONENT24 is not allowed in GLES2.
327*8975f5c5SAndroid Build Coastguard Worker         if (getClientMajorVersion() >= 3)
328*8975f5c5SAndroid Build Coastguard Worker         {
329*8975f5c5SAndroid Build Coastguard Worker             // Setup Color/Depth FBO with a depth format that's emulated with packed depth/stencil.
330*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_FRAMEBUFFER, mColorDepthFBO);
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
333*8975f5c5SAndroid Build Coastguard Worker                                    mColorTexture, 0);
334*8975f5c5SAndroid Build Coastguard Worker             glBindRenderbuffer(GL_RENDERBUFFER, mDepthTexture);
335*8975f5c5SAndroid Build Coastguard Worker             glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, getWindowWidth(),
336*8975f5c5SAndroid Build Coastguard Worker                                   getWindowHeight());
337*8975f5c5SAndroid Build Coastguard Worker             glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
338*8975f5c5SAndroid Build Coastguard Worker                                       mDepthTexture);
339*8975f5c5SAndroid Build Coastguard Worker         }
340*8975f5c5SAndroid Build Coastguard Worker 
341*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
342*8975f5c5SAndroid Build Coastguard Worker     }
343*8975f5c5SAndroid Build Coastguard Worker 
bindColorStencilFBO()344*8975f5c5SAndroid Build Coastguard Worker     void bindColorStencilFBO()
345*8975f5c5SAndroid Build Coastguard Worker     {
346*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mColorStencilFBO);
347*8975f5c5SAndroid Build Coastguard Worker         mHasDepth = false;
348*8975f5c5SAndroid Build Coastguard Worker     }
349*8975f5c5SAndroid Build Coastguard Worker 
bindColorDepthFBO()350*8975f5c5SAndroid Build Coastguard Worker     void bindColorDepthFBO()
351*8975f5c5SAndroid Build Coastguard Worker     {
352*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mColorDepthFBO);
353*8975f5c5SAndroid Build Coastguard Worker         mHasStencil = false;
354*8975f5c5SAndroid Build Coastguard Worker     }
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker   private:
357*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mColorStencilFBO;
358*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mColorDepthFBO;
359*8975f5c5SAndroid Build Coastguard Worker     GLTexture mColorTexture;
360*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer mDepthTexture;
361*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer mStencilTexture;
362*8975f5c5SAndroid Build Coastguard Worker };
363*8975f5c5SAndroid Build Coastguard Worker 
364*8975f5c5SAndroid Build Coastguard Worker // Test clearing the default framebuffer
TEST_P(ClearTest,DefaultFramebuffer)365*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, DefaultFramebuffer)
366*8975f5c5SAndroid Build Coastguard Worker {
367*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.25f, 0.5f, 0.5f, 0.5f);
368*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
369*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 64, 128, 128, 128, 1.0);
370*8975f5c5SAndroid Build Coastguard Worker }
371*8975f5c5SAndroid Build Coastguard Worker 
372*8975f5c5SAndroid Build Coastguard Worker // Test clearing the default framebuffer with scissor and mask
373*8975f5c5SAndroid Build Coastguard Worker // This forces down path that uses draw to do clear
TEST_P(ClearTest,EmptyScissor)374*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, EmptyScissor)
375*8975f5c5SAndroid Build Coastguard Worker {
376*8975f5c5SAndroid Build Coastguard Worker     // These configs have bug that fails this test.
377*8975f5c5SAndroid Build Coastguard Worker     // These configs are unmaintained so skipping.
378*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsD3D9());
379*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsIntel() && IsMac() && IsOpenGL());
380*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.25f, 0.5f, 0.5f, 1.0f);
381*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
382*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
383*8975f5c5SAndroid Build Coastguard Worker     glScissor(-10, 0, 5, 5);
384*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.5f, 0.25f, 0.75f, 0.5f);
385*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
386*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
387*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
388*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
389*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 64, 128, 128, 255, 1.0);
390*8975f5c5SAndroid Build Coastguard Worker }
391*8975f5c5SAndroid Build Coastguard Worker 
392*8975f5c5SAndroid Build Coastguard Worker // Test clearing the RGB default framebuffer and verify that the alpha channel is not cleared
TEST_P(ClearTestRGB,DefaultFramebufferRGB)393*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestRGB, DefaultFramebufferRGB)
394*8975f5c5SAndroid Build Coastguard Worker {
395*8975f5c5SAndroid Build Coastguard Worker     // Some GPUs don't support RGB format default framebuffer,
396*8975f5c5SAndroid Build Coastguard Worker     // so skip if the back buffer has alpha bits.
397*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window          = getEGLWindow();
398*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay display         = window->getDisplay();
399*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config           = window->getConfig();
400*8975f5c5SAndroid Build Coastguard Worker     EGLint backbufferAlphaBits = 0;
401*8975f5c5SAndroid Build Coastguard Worker     eglGetConfigAttrib(display, config, EGL_ALPHA_SIZE, &backbufferAlphaBits);
402*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(backbufferAlphaBits != 0);
403*8975f5c5SAndroid Build Coastguard Worker 
404*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.25f, 0.5f, 0.5f, 0.5f);
405*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
406*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 64, 128, 128, 255, 1.0);
407*8975f5c5SAndroid Build Coastguard Worker }
408*8975f5c5SAndroid Build Coastguard Worker 
409*8975f5c5SAndroid Build Coastguard Worker // Invalidate the RGB default framebuffer and verify that the alpha channel is not cleared, and
410*8975f5c5SAndroid Build Coastguard Worker // stays set after drawing.
TEST_P(ClearTestRGB_ES3,InvalidateDefaultFramebufferRGB)411*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestRGB_ES3, InvalidateDefaultFramebufferRGB)
412*8975f5c5SAndroid Build Coastguard Worker {
413*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
414*8975f5c5SAndroid Build Coastguard Worker 
415*8975f5c5SAndroid Build Coastguard Worker     // Some GPUs don't support RGB format default framebuffer,
416*8975f5c5SAndroid Build Coastguard Worker     // so skip if the back buffer has alpha bits.
417*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window          = getEGLWindow();
418*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay display         = window->getDisplay();
419*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config           = window->getConfig();
420*8975f5c5SAndroid Build Coastguard Worker     EGLint backbufferAlphaBits = 0;
421*8975f5c5SAndroid Build Coastguard Worker     eglGetConfigAttrib(display, config, EGL_ALPHA_SIZE, &backbufferAlphaBits);
422*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(backbufferAlphaBits != 0);
423*8975f5c5SAndroid Build Coastguard Worker 
424*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
425*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
426*8975f5c5SAndroid Build Coastguard Worker     // Verify that even though Alpha is cleared to 0.0 for this RGB FBO, it should be read back as
427*8975f5c5SAndroid Build Coastguard Worker     // 1.0, since the glReadPixels() is issued with GL_RGBA.
428*8975f5c5SAndroid Build Coastguard Worker     // OpenGL ES 3.2 spec:
429*8975f5c5SAndroid Build Coastguard Worker     // 16.1.3 Obtaining Pixels from the Framebuffer
430*8975f5c5SAndroid Build Coastguard Worker     // If G, B, or A values are not present in the internal format, they are taken to be zero,
431*8975f5c5SAndroid Build Coastguard Worker     // zero, and one respectively.
432*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
433*8975f5c5SAndroid Build Coastguard Worker 
434*8975f5c5SAndroid Build Coastguard Worker     const GLenum discards[] = {GL_COLOR};
435*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discards);
436*8975f5c5SAndroid Build Coastguard Worker 
437*8975f5c5SAndroid Build Coastguard Worker     // Don't explicitly clear, but draw blue (make sure alpha is not cleared)
438*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f);
439*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
440*8975f5c5SAndroid Build Coastguard Worker }
441*8975f5c5SAndroid Build Coastguard Worker 
442*8975f5c5SAndroid Build Coastguard Worker // Draw with a shader that outputs alpha=0.5. Readback and ensure that alpha=1.
TEST_P(ClearTestRGB_ES3,ShaderOutputsAlphaVerifyReadingAlphaIsOne)443*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestRGB_ES3, ShaderOutputsAlphaVerifyReadingAlphaIsOne)
444*8975f5c5SAndroid Build Coastguard Worker {
445*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
446*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
447*8975f5c5SAndroid Build Coastguard Worker 
448*8975f5c5SAndroid Build Coastguard Worker     // Some GPUs don't support RGB format default framebuffer,
449*8975f5c5SAndroid Build Coastguard Worker     // so skip if the back buffer has alpha bits.
450*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window          = getEGLWindow();
451*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay display         = window->getDisplay();
452*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config           = window->getConfig();
453*8975f5c5SAndroid Build Coastguard Worker     EGLint backbufferAlphaBits = 0;
454*8975f5c5SAndroid Build Coastguard Worker     eglGetConfigAttrib(display, config, EGL_ALPHA_SIZE, &backbufferAlphaBits);
455*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(backbufferAlphaBits != 0);
456*8975f5c5SAndroid Build Coastguard Worker 
457*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
458*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
459*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
460*8975f5c5SAndroid Build Coastguard Worker 
461*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
462*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(blueProgram, angle::essl1_shaders::ColorUniform());
463*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
464*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 0.5f);
465*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
466*8975f5c5SAndroid Build Coastguard Worker 
467*8975f5c5SAndroid Build Coastguard Worker     // Don't explicitly clear, but draw blue (make sure alpha is not cleared)
468*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f);
469*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
470*8975f5c5SAndroid Build Coastguard Worker }
471*8975f5c5SAndroid Build Coastguard Worker 
472*8975f5c5SAndroid Build Coastguard Worker // Test clearing a RGBA8 Framebuffer
TEST_P(ClearTest,RGBA8Framebuffer)473*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, RGBA8Framebuffer)
474*8975f5c5SAndroid Build Coastguard Worker {
475*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
476*8975f5c5SAndroid Build Coastguard Worker 
477*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
478*8975f5c5SAndroid Build Coastguard Worker 
479*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
480*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
481*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
482*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
483*8975f5c5SAndroid Build Coastguard Worker 
484*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
485*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 128, 128, 128, 128, 1.0);
488*8975f5c5SAndroid Build Coastguard Worker }
489*8975f5c5SAndroid Build Coastguard Worker 
490*8975f5c5SAndroid Build Coastguard Worker // Test uploading a texture and then clearing a RGBA8 Framebuffer
TEST_P(ClearTest,TextureUploadAndRGBA8Framebuffer)491*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, TextureUploadAndRGBA8Framebuffer)
492*8975f5c5SAndroid Build Coastguard Worker {
493*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
494*8975f5c5SAndroid Build Coastguard Worker 
495*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
496*8975f5c5SAndroid Build Coastguard Worker 
497*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize = 16;
498*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelData(kSize * kSize, GLColor::blue);
499*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
500*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
501*8975f5c5SAndroid Build Coastguard Worker                  pixelData.data());
502*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
503*8975f5c5SAndroid Build Coastguard Worker 
504*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 0, 0, 255, 255, 1.0);
505*8975f5c5SAndroid Build Coastguard Worker 
506*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
507*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
508*8975f5c5SAndroid Build Coastguard Worker 
509*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 128, 128, 128, 128, 1.0);
510*8975f5c5SAndroid Build Coastguard Worker }
511*8975f5c5SAndroid Build Coastguard Worker 
512*8975f5c5SAndroid Build Coastguard Worker // Test to validate that we can go from an RGBA framebuffer attachment, to an RGB one and still
513*8975f5c5SAndroid Build Coastguard Worker // have a correct behavior after.
TEST_P(ClearTest,ChangeFramebufferAttachmentFromRGBAtoRGB)514*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, ChangeFramebufferAttachmentFromRGBAtoRGB)
515*8975f5c5SAndroid Build Coastguard Worker {
516*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40096508
517*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAndroid() && IsAdreno() && IsOpenGLES());
518*8975f5c5SAndroid Build Coastguard Worker 
519*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40644765
520*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL() && IsIntel());
521*8975f5c5SAndroid Build Coastguard Worker 
522*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, angle::essl1_shaders::vs::Simple(),
523*8975f5c5SAndroid Build Coastguard Worker                      angle::essl1_shaders::fs::UniformColor());
524*8975f5c5SAndroid Build Coastguard Worker     setupQuadVertexBuffer(0.5f, 1.0f);
525*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
526*8975f5c5SAndroid Build Coastguard Worker     GLint positionLocation = glGetAttribLocation(program, angle::essl1_shaders::PositionAttrib());
527*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(positionLocation, -1);
528*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
529*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
530*8975f5c5SAndroid Build Coastguard Worker 
531*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
532*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
533*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
534*8975f5c5SAndroid Build Coastguard Worker 
535*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 1.0f, 1.0f, 1.0f, 0.5f);
536*8975f5c5SAndroid Build Coastguard Worker 
537*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
538*8975f5c5SAndroid Build Coastguard Worker 
539*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
540*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
541*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
542*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
543*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
544*8975f5c5SAndroid Build Coastguard Worker 
545*8975f5c5SAndroid Build Coastguard Worker     // Initially clear to black.
546*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
547*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
548*8975f5c5SAndroid Build Coastguard Worker 
549*8975f5c5SAndroid Build Coastguard Worker     // Clear with masked color.
550*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
551*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.5f, 0.5f, 0.5f, 0.75f);
552*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
553*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
554*8975f5c5SAndroid Build Coastguard Worker 
555*8975f5c5SAndroid Build Coastguard Worker     // So far so good, we have an RGBA framebuffer that we've cleared to 0.5 everywhere.
556*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 128, 0, 128, 192, 1.0);
557*8975f5c5SAndroid Build Coastguard Worker 
558*8975f5c5SAndroid Build Coastguard Worker     // In the Vulkan backend, RGB textures are emulated with an RGBA texture format
559*8975f5c5SAndroid Build Coastguard Worker     // underneath and we keep a special mask to know that we shouldn't touch the alpha
560*8975f5c5SAndroid Build Coastguard Worker     // channel when we have that emulated texture. This test exists to validate that
561*8975f5c5SAndroid Build Coastguard Worker     // this mask gets updated correctly when the framebuffer attachment changes.
562*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB,
563*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
564*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
565*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
566*8975f5c5SAndroid Build Coastguard Worker 
567*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
568*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
569*8975f5c5SAndroid Build Coastguard Worker 
570*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::magenta);
571*8975f5c5SAndroid Build Coastguard Worker }
572*8975f5c5SAndroid Build Coastguard Worker 
573*8975f5c5SAndroid Build Coastguard Worker // Test clearing a RGB8 Framebuffer with a color mask.
TEST_P(ClearTest,RGB8WithMaskFramebuffer)574*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, RGB8WithMaskFramebuffer)
575*8975f5c5SAndroid Build Coastguard Worker {
576*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
577*8975f5c5SAndroid Build Coastguard Worker 
578*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
579*8975f5c5SAndroid Build Coastguard Worker 
580*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
581*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB,
582*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
583*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
584*8975f5c5SAndroid Build Coastguard Worker 
585*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.2f, 0.4f, 0.6f, 0.8f);
586*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
587*8975f5c5SAndroid Build Coastguard Worker 
588*8975f5c5SAndroid Build Coastguard Worker     // Since there's no alpha, we expect to get 255 back instead of the clear value (204).
589*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 51, 102, 153, 255, 1.0);
590*8975f5c5SAndroid Build Coastguard Worker 
591*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
592*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.1f, 0.3f, 0.5f, 0.7f);
593*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
594*8975f5c5SAndroid Build Coastguard Worker 
595*8975f5c5SAndroid Build Coastguard Worker     // The blue channel was masked so its value should be unchanged.
596*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 26, 77, 153, 255, 1.0);
597*8975f5c5SAndroid Build Coastguard Worker 
598*8975f5c5SAndroid Build Coastguard Worker     // Restore default.
599*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
600*8975f5c5SAndroid Build Coastguard Worker }
601*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ClearTest,ClearIssue)602*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, ClearIssue)
603*8975f5c5SAndroid Build Coastguard Worker {
604*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
605*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LEQUAL);
606*8975f5c5SAndroid Build Coastguard Worker 
607*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0, 1.0, 0.0, 1.0);
608*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.0);
609*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
610*8975f5c5SAndroid Build Coastguard Worker 
611*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
612*8975f5c5SAndroid Build Coastguard Worker 
613*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
614*8975f5c5SAndroid Build Coastguard Worker 
615*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
616*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
617*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB565, 16, 16);
618*8975f5c5SAndroid Build Coastguard Worker 
619*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
620*8975f5c5SAndroid Build Coastguard Worker 
621*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
622*8975f5c5SAndroid Build Coastguard Worker 
623*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
624*8975f5c5SAndroid Build Coastguard Worker 
625*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
626*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(1.0f);
627*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
628*8975f5c5SAndroid Build Coastguard Worker 
629*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
630*8975f5c5SAndroid Build Coastguard Worker 
631*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
632*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, 0);
633*8975f5c5SAndroid Build Coastguard Worker 
634*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
635*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f);
636*8975f5c5SAndroid Build Coastguard Worker 
637*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
638*8975f5c5SAndroid Build Coastguard Worker }
639*8975f5c5SAndroid Build Coastguard Worker 
640*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug where "glClearDepthf"'s argument was not clamped
641*8975f5c5SAndroid Build Coastguard Worker // In GLES 2 they where declared as GLclampf and the behaviour is the same in GLES 3.2
TEST_P(ClearTest,ClearIsClamped)642*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, ClearIsClamped)
643*8975f5c5SAndroid Build Coastguard Worker {
644*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(5.0f);
645*8975f5c5SAndroid Build Coastguard Worker 
646*8975f5c5SAndroid Build Coastguard Worker     GLfloat clear_depth;
647*8975f5c5SAndroid Build Coastguard Worker     glGetFloatv(GL_DEPTH_CLEAR_VALUE, &clear_depth);
648*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(1.0f, clear_depth);
649*8975f5c5SAndroid Build Coastguard Worker }
650*8975f5c5SAndroid Build Coastguard Worker 
651*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug where "glDepthRangef"'s arguments were not clamped
652*8975f5c5SAndroid Build Coastguard Worker // In GLES 2 they where declared as GLclampf and the behaviour is the same in GLES 3.2
TEST_P(ClearTest,DepthRangefIsClamped)653*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, DepthRangefIsClamped)
654*8975f5c5SAndroid Build Coastguard Worker {
655*8975f5c5SAndroid Build Coastguard Worker     glDepthRangef(1.1f, -4.0f);
656*8975f5c5SAndroid Build Coastguard Worker 
657*8975f5c5SAndroid Build Coastguard Worker     GLfloat depth_range[2];
658*8975f5c5SAndroid Build Coastguard Worker     glGetFloatv(GL_DEPTH_RANGE, depth_range);
659*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(1.0f, depth_range[0]);
660*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, depth_range[1]);
661*8975f5c5SAndroid Build Coastguard Worker }
662*8975f5c5SAndroid Build Coastguard Worker 
663*8975f5c5SAndroid Build Coastguard Worker // Test scissored clears on Depth16
TEST_P(ClearTest,Depth16Scissored)664*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, Depth16Scissored)
665*8975f5c5SAndroid Build Coastguard Worker {
666*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
667*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
668*8975f5c5SAndroid Build Coastguard Worker     constexpr int kRenderbufferSize = 64;
669*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, kRenderbufferSize,
670*8975f5c5SAndroid Build Coastguard Worker                           kRenderbufferSize);
671*8975f5c5SAndroid Build Coastguard Worker 
672*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
673*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
674*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer);
675*8975f5c5SAndroid Build Coastguard Worker 
676*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.0f);
677*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT);
678*8975f5c5SAndroid Build Coastguard Worker 
679*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
680*8975f5c5SAndroid Build Coastguard Worker     constexpr int kNumSteps = 13;
681*8975f5c5SAndroid Build Coastguard Worker     for (int ndx = 1; ndx < kNumSteps; ndx++)
682*8975f5c5SAndroid Build Coastguard Worker     {
683*8975f5c5SAndroid Build Coastguard Worker         float perc = static_cast<float>(ndx) / static_cast<float>(kNumSteps);
684*8975f5c5SAndroid Build Coastguard Worker         glScissor(0, 0, static_cast<int>(kRenderbufferSize * perc),
685*8975f5c5SAndroid Build Coastguard Worker                   static_cast<int>(kRenderbufferSize * perc));
686*8975f5c5SAndroid Build Coastguard Worker         glClearDepthf(perc);
687*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_DEPTH_BUFFER_BIT);
688*8975f5c5SAndroid Build Coastguard Worker     }
689*8975f5c5SAndroid Build Coastguard Worker }
690*8975f5c5SAndroid Build Coastguard Worker 
691*8975f5c5SAndroid Build Coastguard Worker // Test scissored clears on Stencil8
TEST_P(ClearTest,Stencil8Scissored)692*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, Stencil8Scissored)
693*8975f5c5SAndroid Build Coastguard Worker {
694*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
695*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
696*8975f5c5SAndroid Build Coastguard Worker     constexpr int kRenderbufferSize = 64;
697*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, kRenderbufferSize, kRenderbufferSize);
698*8975f5c5SAndroid Build Coastguard Worker 
699*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
700*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
701*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuffer);
702*8975f5c5SAndroid Build Coastguard Worker 
703*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0);
704*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_STENCIL_BUFFER_BIT);
705*8975f5c5SAndroid Build Coastguard Worker 
706*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
707*8975f5c5SAndroid Build Coastguard Worker     constexpr int kNumSteps = 13;
708*8975f5c5SAndroid Build Coastguard Worker     for (int ndx = 1; ndx < kNumSteps; ndx++)
709*8975f5c5SAndroid Build Coastguard Worker     {
710*8975f5c5SAndroid Build Coastguard Worker         float perc = static_cast<float>(ndx) / static_cast<float>(kNumSteps);
711*8975f5c5SAndroid Build Coastguard Worker         glScissor(0, 0, static_cast<int>(kRenderbufferSize * perc),
712*8975f5c5SAndroid Build Coastguard Worker                   static_cast<int>(kRenderbufferSize * perc));
713*8975f5c5SAndroid Build Coastguard Worker         glClearStencil(static_cast<int>(perc * 255.0f));
714*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_STENCIL_BUFFER_BIT);
715*8975f5c5SAndroid Build Coastguard Worker     }
716*8975f5c5SAndroid Build Coastguard Worker }
717*8975f5c5SAndroid Build Coastguard Worker 
718*8975f5c5SAndroid Build Coastguard Worker // Covers a bug in the Vulkan back-end where starting a new command buffer in
719*8975f5c5SAndroid Build Coastguard Worker // the masked clear would not trigger descriptor sets to be re-bound.
TEST_P(ClearTest,MaskedClearThenDrawWithUniform)720*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, MaskedClearThenDrawWithUniform)
721*8975f5c5SAndroid Build Coastguard Worker {
722*8975f5c5SAndroid Build Coastguard Worker     // Initialize a program with a uniform.
723*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
724*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
725*8975f5c5SAndroid Build Coastguard Worker 
726*8975f5c5SAndroid Build Coastguard Worker     GLint uniLoc = glGetUniformLocation(program, essl1_shaders::ColorUniform());
727*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, uniLoc);
728*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(uniLoc, 0.0f, 1.0f, 0.0f, 1.0f);
729*8975f5c5SAndroid Build Coastguard Worker 
730*8975f5c5SAndroid Build Coastguard Worker     // Initialize position attribute.
731*8975f5c5SAndroid Build Coastguard Worker     GLint posLoc = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
732*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, posLoc);
733*8975f5c5SAndroid Build Coastguard Worker     setupQuadVertexBuffer(0.5f, 1.0f);
734*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
735*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(posLoc);
736*8975f5c5SAndroid Build Coastguard Worker 
737*8975f5c5SAndroid Build Coastguard Worker     // Initialize a simple FBO.
738*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 2;
739*8975f5c5SAndroid Build Coastguard Worker     GLTexture clearTexture;
740*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, clearTexture);
741*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
742*8975f5c5SAndroid Build Coastguard Worker 
743*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
744*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
745*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, clearTexture, 0);
746*8975f5c5SAndroid Build Coastguard Worker 
747*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
748*8975f5c5SAndroid Build Coastguard Worker 
749*8975f5c5SAndroid Build Coastguard Worker     // Clear and draw to flush out dirty bits.
750*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
751*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
752*8975f5c5SAndroid Build Coastguard Worker 
753*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
754*8975f5c5SAndroid Build Coastguard Worker 
755*8975f5c5SAndroid Build Coastguard Worker     // Flush to trigger a new serial.
756*8975f5c5SAndroid Build Coastguard Worker     glFlush();
757*8975f5c5SAndroid Build Coastguard Worker 
758*8975f5c5SAndroid Build Coastguard Worker     // Enable color mask and draw again to trigger the bug.
759*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
760*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
761*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
762*8975f5c5SAndroid Build Coastguard Worker 
763*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
764*8975f5c5SAndroid Build Coastguard Worker 
765*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
766*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
767*8975f5c5SAndroid Build Coastguard Worker }
768*8975f5c5SAndroid Build Coastguard Worker 
769*8975f5c5SAndroid Build Coastguard Worker // Clear with a mask to verify that masked clear is done properly
770*8975f5c5SAndroid Build Coastguard Worker // (can't use inline or RenderOp clear when some color channels are masked)
TEST_P(ClearTestES3,ClearPlusMaskDrawAndClear)771*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearPlusMaskDrawAndClear)
772*8975f5c5SAndroid Build Coastguard Worker {
773*8975f5c5SAndroid Build Coastguard Worker     // Initialize a program with a uniform.
774*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
775*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
776*8975f5c5SAndroid Build Coastguard Worker 
777*8975f5c5SAndroid Build Coastguard Worker     GLint uniLoc = glGetUniformLocation(program, essl1_shaders::ColorUniform());
778*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, uniLoc);
779*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(uniLoc, 0.0f, 1.0f, 0.0f, 1.0f);
780*8975f5c5SAndroid Build Coastguard Worker 
781*8975f5c5SAndroid Build Coastguard Worker     // Initialize position attribute.
782*8975f5c5SAndroid Build Coastguard Worker     GLint posLoc = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
783*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, posLoc);
784*8975f5c5SAndroid Build Coastguard Worker     setupQuadVertexBuffer(0.5f, 1.0f);
785*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
786*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(posLoc);
787*8975f5c5SAndroid Build Coastguard Worker 
788*8975f5c5SAndroid Build Coastguard Worker     // Initialize a simple FBO.
789*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 2;
790*8975f5c5SAndroid Build Coastguard Worker     GLTexture clearTexture;
791*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, clearTexture);
792*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
793*8975f5c5SAndroid Build Coastguard Worker 
794*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
795*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
796*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, clearTexture, 0);
797*8975f5c5SAndroid Build Coastguard Worker 
798*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
799*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
800*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
801*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
802*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
803*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
804*8975f5c5SAndroid Build Coastguard Worker 
805*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
806*8975f5c5SAndroid Build Coastguard Worker 
807*8975f5c5SAndroid Build Coastguard Worker     // Clear and draw to flush out dirty bits.
808*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
809*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(1.0f);
810*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
811*8975f5c5SAndroid Build Coastguard Worker 
812*8975f5c5SAndroid Build Coastguard Worker     // Draw green rectangle
813*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
814*8975f5c5SAndroid Build Coastguard Worker 
815*8975f5c5SAndroid Build Coastguard Worker     // Enable color mask and draw again to trigger the bug.
816*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
817*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
818*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
819*8975f5c5SAndroid Build Coastguard Worker 
820*8975f5c5SAndroid Build Coastguard Worker     // Draw purple-ish rectangle, green should be masked off
821*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(uniLoc, 1.0f, 0.25f, 1.0f, 1.0f);
822*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
823*8975f5c5SAndroid Build Coastguard Worker 
824*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
825*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
826*8975f5c5SAndroid Build Coastguard Worker }
827*8975f5c5SAndroid Build Coastguard Worker 
828*8975f5c5SAndroid Build Coastguard Worker // Test that clearing all buffers through glClearColor followed by a clear of a specific buffer
829*8975f5c5SAndroid Build Coastguard Worker // clears to the correct values.
TEST_P(ClearTestES3,ClearMultipleAttachmentsFollowedBySpecificOne)830*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearMultipleAttachmentsFollowedBySpecificOne)
831*8975f5c5SAndroid Build Coastguard Worker {
832*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize            = 16;
833*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kAttachmentCount = 4;
834*8975f5c5SAndroid Build Coastguard Worker     std::vector<unsigned char> pixelData(kSize * kSize * 4, 255);
835*8975f5c5SAndroid Build Coastguard Worker 
836*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
837*8975f5c5SAndroid Build Coastguard Worker 
838*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures[kAttachmentCount];
839*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[kAttachmentCount];
840*8975f5c5SAndroid Build Coastguard Worker     GLColor clearValues[kAttachmentCount];
841*8975f5c5SAndroid Build Coastguard Worker 
842*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
843*8975f5c5SAndroid Build Coastguard Worker     {
844*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[i]);
845*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
846*8975f5c5SAndroid Build Coastguard Worker                      pixelData.data());
847*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i],
848*8975f5c5SAndroid Build Coastguard Worker                                0);
849*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[i] = GL_COLOR_ATTACHMENT0 + i;
850*8975f5c5SAndroid Build Coastguard Worker 
851*8975f5c5SAndroid Build Coastguard Worker         clearValues[i].R = static_cast<GLubyte>(1 + i * 20);
852*8975f5c5SAndroid Build Coastguard Worker         clearValues[i].G = static_cast<GLubyte>(7 + i * 20);
853*8975f5c5SAndroid Build Coastguard Worker         clearValues[i].B = static_cast<GLubyte>(12 + i * 20);
854*8975f5c5SAndroid Build Coastguard Worker         clearValues[i].A = static_cast<GLubyte>(16 + i * 20);
855*8975f5c5SAndroid Build Coastguard Worker     }
856*8975f5c5SAndroid Build Coastguard Worker 
857*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(kAttachmentCount, drawBuffers);
858*8975f5c5SAndroid Build Coastguard Worker 
859*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
860*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
861*8975f5c5SAndroid Build Coastguard Worker 
862*8975f5c5SAndroid Build Coastguard Worker     // Clear all targets.
863*8975f5c5SAndroid Build Coastguard Worker     angle::Vector4 clearColor = clearValues[0].toNormalizedVector();
864*8975f5c5SAndroid Build Coastguard Worker     glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
865*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
866*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
867*8975f5c5SAndroid Build Coastguard Worker 
868*8975f5c5SAndroid Build Coastguard Worker     // Clear odd targets individually.
869*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 1; i < kAttachmentCount; i += 2)
870*8975f5c5SAndroid Build Coastguard Worker     {
871*8975f5c5SAndroid Build Coastguard Worker         clearColor = clearValues[i].toNormalizedVector();
872*8975f5c5SAndroid Build Coastguard Worker         glClearBufferfv(GL_COLOR, i, clearColor.data());
873*8975f5c5SAndroid Build Coastguard Worker     }
874*8975f5c5SAndroid Build Coastguard Worker 
875*8975f5c5SAndroid Build Coastguard Worker     // Even attachments should be cleared to color 0, while odd attachments are cleared to their
876*8975f5c5SAndroid Build Coastguard Worker     // respective color.
877*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
878*8975f5c5SAndroid Build Coastguard Worker     {
879*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0 + i);
880*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
881*8975f5c5SAndroid Build Coastguard Worker 
882*8975f5c5SAndroid Build Coastguard Worker         uint32_t clearIndex   = i % 2 == 0 ? 0 : i;
883*8975f5c5SAndroid Build Coastguard Worker         const GLColor &expect = clearValues[clearIndex];
884*8975f5c5SAndroid Build Coastguard Worker 
885*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, expect);
886*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, expect);
887*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, expect);
888*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, expect);
889*8975f5c5SAndroid Build Coastguard Worker     }
890*8975f5c5SAndroid Build Coastguard Worker }
891*8975f5c5SAndroid Build Coastguard Worker 
892*8975f5c5SAndroid Build Coastguard Worker // Test that clearing each render target individually works.  In the Vulkan backend, this should be
893*8975f5c5SAndroid Build Coastguard Worker // done in a single render pass.
TEST_P(ClearTestES3,ClearMultipleAttachmentsIndividually)894*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearMultipleAttachmentsIndividually)
895*8975f5c5SAndroid Build Coastguard Worker {
896*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40096714
897*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
898*8975f5c5SAndroid Build Coastguard Worker 
899*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize             = 16;
900*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kAttachmentCount  = 2;
901*8975f5c5SAndroid Build Coastguard Worker     constexpr float kDepthClearValue     = 0.125f;
902*8975f5c5SAndroid Build Coastguard Worker     constexpr int32_t kStencilClearValue = 0x67;
903*8975f5c5SAndroid Build Coastguard Worker     std::vector<unsigned char> pixelData(kSize * kSize * 4, 255);
904*8975f5c5SAndroid Build Coastguard Worker 
905*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
906*8975f5c5SAndroid Build Coastguard Worker 
907*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures[kAttachmentCount];
908*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
909*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[kAttachmentCount];
910*8975f5c5SAndroid Build Coastguard Worker     GLColor clearValues[kAttachmentCount];
911*8975f5c5SAndroid Build Coastguard Worker 
912*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
913*8975f5c5SAndroid Build Coastguard Worker     {
914*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[i]);
915*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
916*8975f5c5SAndroid Build Coastguard Worker                      pixelData.data());
917*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i],
918*8975f5c5SAndroid Build Coastguard Worker                                0);
919*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[i] = GL_COLOR_ATTACHMENT0 + i;
920*8975f5c5SAndroid Build Coastguard Worker 
921*8975f5c5SAndroid Build Coastguard Worker         clearValues[i].R = static_cast<GLubyte>(1 + i * 20);
922*8975f5c5SAndroid Build Coastguard Worker         clearValues[i].G = static_cast<GLubyte>(7 + i * 20);
923*8975f5c5SAndroid Build Coastguard Worker         clearValues[i].B = static_cast<GLubyte>(12 + i * 20);
924*8975f5c5SAndroid Build Coastguard Worker         clearValues[i].A = static_cast<GLubyte>(16 + i * 20);
925*8975f5c5SAndroid Build Coastguard Worker     }
926*8975f5c5SAndroid Build Coastguard Worker 
927*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
928*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
929*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
930*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
931*8975f5c5SAndroid Build Coastguard Worker 
932*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(kAttachmentCount, drawBuffers);
933*8975f5c5SAndroid Build Coastguard Worker 
934*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
935*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
936*8975f5c5SAndroid Build Coastguard Worker 
937*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
938*8975f5c5SAndroid Build Coastguard Worker     {
939*8975f5c5SAndroid Build Coastguard Worker         glClearBufferfv(GL_COLOR, i, clearValues[i].toNormalizedVector().data());
940*8975f5c5SAndroid Build Coastguard Worker     }
941*8975f5c5SAndroid Build Coastguard Worker 
942*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfv(GL_DEPTH, 0, &kDepthClearValue);
943*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_STENCIL, 0, &kStencilClearValue);
944*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
945*8975f5c5SAndroid Build Coastguard Worker 
946*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
947*8975f5c5SAndroid Build Coastguard Worker     {
948*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0 + i);
949*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
950*8975f5c5SAndroid Build Coastguard Worker 
951*8975f5c5SAndroid Build Coastguard Worker         const GLColor &expect = clearValues[i];
952*8975f5c5SAndroid Build Coastguard Worker 
953*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, expect);
954*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, expect);
955*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, expect);
956*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, expect);
957*8975f5c5SAndroid Build Coastguard Worker     }
958*8975f5c5SAndroid Build Coastguard Worker 
959*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT0);
960*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 1; i < kAttachmentCount; ++i)
961*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[i] = GL_NONE;
962*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(kAttachmentCount, drawBuffers);
963*8975f5c5SAndroid Build Coastguard Worker 
964*8975f5c5SAndroid Build Coastguard Worker     verifyDepth(kDepthClearValue, kSize);
965*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(kStencilClearValue, kSize);
966*8975f5c5SAndroid Build Coastguard Worker }
967*8975f5c5SAndroid Build Coastguard Worker 
968*8975f5c5SAndroid Build Coastguard Worker // Test that clearing multiple attachments in the presence of a color mask, scissor or both
969*8975f5c5SAndroid Build Coastguard Worker // correctly clears all the attachments.
TEST_P(ClearTestES3,MaskedScissoredClearMultipleAttachments)970*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, MaskedScissoredClearMultipleAttachments)
971*8975f5c5SAndroid Build Coastguard Worker {
972*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize            = 16;
973*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kAttachmentCount = 2;
974*8975f5c5SAndroid Build Coastguard Worker     std::vector<unsigned char> pixelData(kSize * kSize * 4, 255);
975*8975f5c5SAndroid Build Coastguard Worker 
976*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
977*8975f5c5SAndroid Build Coastguard Worker 
978*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures[kAttachmentCount];
979*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[kAttachmentCount];
980*8975f5c5SAndroid Build Coastguard Worker 
981*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
982*8975f5c5SAndroid Build Coastguard Worker     {
983*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[i]);
984*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
985*8975f5c5SAndroid Build Coastguard Worker                      pixelData.data());
986*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i],
987*8975f5c5SAndroid Build Coastguard Worker                                0);
988*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[i] = GL_COLOR_ATTACHMENT0 + i;
989*8975f5c5SAndroid Build Coastguard Worker     }
990*8975f5c5SAndroid Build Coastguard Worker 
991*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(kAttachmentCount, drawBuffers);
992*8975f5c5SAndroid Build Coastguard Worker 
993*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
994*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
995*8975f5c5SAndroid Build Coastguard Worker 
996*8975f5c5SAndroid Build Coastguard Worker     // Masked clear
997*8975f5c5SAndroid Build Coastguard Worker     GLColor clearColorMasked(31, 63, 255, 191);
998*8975f5c5SAndroid Build Coastguard Worker     angle::Vector4 clearColor = GLColor(31, 63, 127, 191).toNormalizedVector();
999*8975f5c5SAndroid Build Coastguard Worker 
1000*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
1001*8975f5c5SAndroid Build Coastguard Worker     glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
1002*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1003*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1004*8975f5c5SAndroid Build Coastguard Worker 
1005*8975f5c5SAndroid Build Coastguard Worker     // All attachments should be cleared, with the blue channel untouched
1006*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
1007*8975f5c5SAndroid Build Coastguard Worker     {
1008*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0 + i);
1009*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1010*8975f5c5SAndroid Build Coastguard Worker 
1011*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, clearColorMasked);
1012*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, clearColorMasked);
1013*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, clearColorMasked);
1014*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, clearColorMasked);
1015*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, clearColorMasked);
1016*8975f5c5SAndroid Build Coastguard Worker     }
1017*8975f5c5SAndroid Build Coastguard Worker 
1018*8975f5c5SAndroid Build Coastguard Worker     // Masked scissored clear
1019*8975f5c5SAndroid Build Coastguard Worker     GLColor clearColorMaskedScissored(63, 127, 255, 31);
1020*8975f5c5SAndroid Build Coastguard Worker     clearColor = GLColor(63, 127, 191, 31).toNormalizedVector();
1021*8975f5c5SAndroid Build Coastguard Worker 
1022*8975f5c5SAndroid Build Coastguard Worker     glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
1023*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
1024*8975f5c5SAndroid Build Coastguard Worker     glScissor(kSize / 6, kSize / 6, kSize / 3, kSize / 3);
1025*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1026*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1027*8975f5c5SAndroid Build Coastguard Worker 
1028*8975f5c5SAndroid Build Coastguard Worker     // The corners should keep the previous value while the center is cleared, except its blue
1029*8975f5c5SAndroid Build Coastguard Worker     // channel.
1030*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
1031*8975f5c5SAndroid Build Coastguard Worker     {
1032*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0 + i);
1033*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1034*8975f5c5SAndroid Build Coastguard Worker 
1035*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, clearColorMasked);
1036*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, clearColorMasked);
1037*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, clearColorMasked);
1038*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, clearColorMasked);
1039*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize / 3, 2 * kSize / 3, clearColorMasked);
1040*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(2 * kSize / 3, kSize / 3, clearColorMasked);
1041*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(2 * kSize / 3, 2 * kSize / 3, clearColorMasked);
1042*8975f5c5SAndroid Build Coastguard Worker 
1043*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize / 3, kSize / 3, clearColorMaskedScissored);
1044*8975f5c5SAndroid Build Coastguard Worker     }
1045*8975f5c5SAndroid Build Coastguard Worker 
1046*8975f5c5SAndroid Build Coastguard Worker     // Scissored clear
1047*8975f5c5SAndroid Build Coastguard Worker     GLColor clearColorScissored(127, 191, 31, 63);
1048*8975f5c5SAndroid Build Coastguard Worker     clearColor = GLColor(127, 191, 31, 63).toNormalizedVector();
1049*8975f5c5SAndroid Build Coastguard Worker 
1050*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
1051*8975f5c5SAndroid Build Coastguard Worker     glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
1052*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1053*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1054*8975f5c5SAndroid Build Coastguard Worker 
1055*8975f5c5SAndroid Build Coastguard Worker     // The corners should keep the old value while all channels of the center are cleared.
1056*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
1057*8975f5c5SAndroid Build Coastguard Worker     {
1058*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0 + i);
1059*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1060*8975f5c5SAndroid Build Coastguard Worker 
1061*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, clearColorMasked);
1062*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, clearColorMasked);
1063*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, clearColorMasked);
1064*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, clearColorMasked);
1065*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize / 3, 2 * kSize / 3, clearColorMasked);
1066*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(2 * kSize / 3, kSize / 3, clearColorMasked);
1067*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(2 * kSize / 3, 2 * kSize / 3, clearColorMasked);
1068*8975f5c5SAndroid Build Coastguard Worker 
1069*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize / 3, kSize / 3, clearColorScissored);
1070*8975f5c5SAndroid Build Coastguard Worker     }
1071*8975f5c5SAndroid Build Coastguard Worker }
1072*8975f5c5SAndroid Build Coastguard Worker 
1073*8975f5c5SAndroid Build Coastguard Worker // Test clearing multiple attachments in the presence of an indexed color mask.
TEST_P(ClearTestES3,MaskedIndexedClearMultipleAttachments)1074*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, MaskedIndexedClearMultipleAttachments)
1075*8975f5c5SAndroid Build Coastguard Worker {
1076*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_draw_buffers_indexed"));
1077*8975f5c5SAndroid Build Coastguard Worker 
1078*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize            = 16;
1079*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kAttachmentCount = 4;
1080*8975f5c5SAndroid Build Coastguard Worker     std::vector<unsigned char> pixelData(kSize * kSize * 4, 255);
1081*8975f5c5SAndroid Build Coastguard Worker 
1082*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
1083*8975f5c5SAndroid Build Coastguard Worker 
1084*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures[kAttachmentCount];
1085*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[kAttachmentCount];
1086*8975f5c5SAndroid Build Coastguard Worker 
1087*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
1088*8975f5c5SAndroid Build Coastguard Worker     {
1089*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[i]);
1090*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1091*8975f5c5SAndroid Build Coastguard Worker                      pixelData.data());
1092*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i],
1093*8975f5c5SAndroid Build Coastguard Worker                                0);
1094*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[i] = GL_COLOR_ATTACHMENT0 + i;
1095*8975f5c5SAndroid Build Coastguard Worker     }
1096*8975f5c5SAndroid Build Coastguard Worker 
1097*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(kAttachmentCount, drawBuffers);
1098*8975f5c5SAndroid Build Coastguard Worker 
1099*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1100*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
1101*8975f5c5SAndroid Build Coastguard Worker 
1102*8975f5c5SAndroid Build Coastguard Worker     // Masked clear
1103*8975f5c5SAndroid Build Coastguard Worker     GLColor clearColorMasked(31, 63, 255, 191);
1104*8975f5c5SAndroid Build Coastguard Worker     angle::Vector4 clearColor = GLColor(31, 63, 127, 191).toNormalizedVector();
1105*8975f5c5SAndroid Build Coastguard Worker 
1106*8975f5c5SAndroid Build Coastguard Worker     // Block blue channel for all attachements
1107*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
1108*8975f5c5SAndroid Build Coastguard Worker 
1109*8975f5c5SAndroid Build Coastguard Worker     // Unblock blue channel for attachments 0 and 1
1110*8975f5c5SAndroid Build Coastguard Worker     glColorMaskiOES(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
1111*8975f5c5SAndroid Build Coastguard Worker     glColorMaskiOES(1, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
1112*8975f5c5SAndroid Build Coastguard Worker 
1113*8975f5c5SAndroid Build Coastguard Worker     glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
1114*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1115*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1116*8975f5c5SAndroid Build Coastguard Worker 
1117*8975f5c5SAndroid Build Coastguard Worker     // All attachments should be cleared, with the blue channel untouched for all attachments but 1.
1118*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
1119*8975f5c5SAndroid Build Coastguard Worker     {
1120*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0 + i);
1121*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1122*8975f5c5SAndroid Build Coastguard Worker 
1123*8975f5c5SAndroid Build Coastguard Worker         const GLColor attachmentColor = (i > 1) ? clearColorMasked : clearColor;
1124*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, attachmentColor);
1125*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, attachmentColor);
1126*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, attachmentColor);
1127*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, attachmentColor);
1128*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize / 2, attachmentColor);
1129*8975f5c5SAndroid Build Coastguard Worker     }
1130*8975f5c5SAndroid Build Coastguard Worker }
1131*8975f5c5SAndroid Build Coastguard Worker 
1132*8975f5c5SAndroid Build Coastguard Worker // Test that clearing multiple attachments of different nature (float, int and uint) in the
1133*8975f5c5SAndroid Build Coastguard Worker // presence of a color mask works correctly.  In the Vulkan backend, this exercises clearWithDraw
1134*8975f5c5SAndroid Build Coastguard Worker // and the relevant internal shaders.
TEST_P(ClearTestES3,MaskedClearHeterogeneousAttachments)1135*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, MaskedClearHeterogeneousAttachments)
1136*8975f5c5SAndroid Build Coastguard Worker {
1137*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40096714
1138*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
1139*8975f5c5SAndroid Build Coastguard Worker 
1140*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize                              = 16;
1141*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kAttachmentCount                   = 3;
1142*8975f5c5SAndroid Build Coastguard Worker     constexpr float kDepthClearValue                      = 0.256f;
1143*8975f5c5SAndroid Build Coastguard Worker     constexpr int32_t kStencilClearValue                  = 0x1D;
1144*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum kAttachmentFormats[kAttachmentCount] = {
1145*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA8,
1146*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA8I,
1147*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA8UI,
1148*8975f5c5SAndroid Build Coastguard Worker     };
1149*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum kDataFormats[kAttachmentCount] = {
1150*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA,
1151*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA_INTEGER,
1152*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA_INTEGER,
1153*8975f5c5SAndroid Build Coastguard Worker     };
1154*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum kDataTypes[kAttachmentCount] = {
1155*8975f5c5SAndroid Build Coastguard Worker         GL_UNSIGNED_BYTE,
1156*8975f5c5SAndroid Build Coastguard Worker         GL_BYTE,
1157*8975f5c5SAndroid Build Coastguard Worker         GL_UNSIGNED_BYTE,
1158*8975f5c5SAndroid Build Coastguard Worker     };
1159*8975f5c5SAndroid Build Coastguard Worker 
1160*8975f5c5SAndroid Build Coastguard Worker     std::vector<unsigned char> pixelData(kSize * kSize * 4, 0);
1161*8975f5c5SAndroid Build Coastguard Worker 
1162*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
1163*8975f5c5SAndroid Build Coastguard Worker 
1164*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures[kAttachmentCount];
1165*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
1166*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[kAttachmentCount];
1167*8975f5c5SAndroid Build Coastguard Worker 
1168*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
1169*8975f5c5SAndroid Build Coastguard Worker     {
1170*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[i]);
1171*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, kAttachmentFormats[i], kSize, kSize, 0, kDataFormats[i],
1172*8975f5c5SAndroid Build Coastguard Worker                      kDataTypes[i], pixelData.data());
1173*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i],
1174*8975f5c5SAndroid Build Coastguard Worker                                0);
1175*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[i] = GL_COLOR_ATTACHMENT0 + i;
1176*8975f5c5SAndroid Build Coastguard Worker     }
1177*8975f5c5SAndroid Build Coastguard Worker 
1178*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
1179*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
1180*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1181*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
1182*8975f5c5SAndroid Build Coastguard Worker 
1183*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(kAttachmentCount, drawBuffers);
1184*8975f5c5SAndroid Build Coastguard Worker 
1185*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1186*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(0, 0, 0, 0, 0, 0);
1187*8975f5c5SAndroid Build Coastguard Worker 
1188*8975f5c5SAndroid Build Coastguard Worker     // Mask out red for all clears
1189*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
1190*8975f5c5SAndroid Build Coastguard Worker 
1191*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfv(GL_DEPTH, 0, &kDepthClearValue);
1192*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_STENCIL, 0, &kStencilClearValue);
1193*8975f5c5SAndroid Build Coastguard Worker 
1194*8975f5c5SAndroid Build Coastguard Worker     GLColor clearValuef = {25, 50, 75, 100};
1195*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfv(GL_COLOR, 0, clearValuef.toNormalizedVector().data());
1196*8975f5c5SAndroid Build Coastguard Worker 
1197*8975f5c5SAndroid Build Coastguard Worker     int clearValuei[4] = {10, -20, 30, -40};
1198*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_COLOR, 1, clearValuei);
1199*8975f5c5SAndroid Build Coastguard Worker 
1200*8975f5c5SAndroid Build Coastguard Worker     uint32_t clearValueui[4] = {50, 60, 70, 80};
1201*8975f5c5SAndroid Build Coastguard Worker     glClearBufferuiv(GL_COLOR, 2, clearValueui);
1202*8975f5c5SAndroid Build Coastguard Worker 
1203*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1204*8975f5c5SAndroid Build Coastguard Worker 
1205*8975f5c5SAndroid Build Coastguard Worker     {
1206*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0);
1207*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1208*8975f5c5SAndroid Build Coastguard Worker 
1209*8975f5c5SAndroid Build Coastguard Worker         GLColor expect = clearValuef;
1210*8975f5c5SAndroid Build Coastguard Worker         expect.R       = 0;
1211*8975f5c5SAndroid Build Coastguard Worker 
1212*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, expect);
1213*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, expect);
1214*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, expect);
1215*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, expect);
1216*8975f5c5SAndroid Build Coastguard Worker     }
1217*8975f5c5SAndroid Build Coastguard Worker 
1218*8975f5c5SAndroid Build Coastguard Worker     {
1219*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT1);
1220*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1221*8975f5c5SAndroid Build Coastguard Worker 
1222*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8I(0, 0, 0, clearValuei[1], clearValuei[2], clearValuei[3]);
1223*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8I(0, kSize - 1, 0, clearValuei[1], clearValuei[2], clearValuei[3]);
1224*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8I(kSize - 1, 0, 0, clearValuei[1], clearValuei[2], clearValuei[3]);
1225*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8I(kSize - 1, kSize - 1, 0, clearValuei[1], clearValuei[2], clearValuei[3]);
1226*8975f5c5SAndroid Build Coastguard Worker     }
1227*8975f5c5SAndroid Build Coastguard Worker 
1228*8975f5c5SAndroid Build Coastguard Worker     {
1229*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT2);
1230*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1231*8975f5c5SAndroid Build Coastguard Worker 
1232*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8UI(0, 0, 0, clearValueui[1], clearValueui[2], clearValueui[3]);
1233*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8UI(0, kSize - 1, 0, clearValueui[1], clearValueui[2], clearValueui[3]);
1234*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8UI(kSize - 1, 0, 0, clearValueui[1], clearValueui[2], clearValueui[3]);
1235*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8UI(kSize - 1, kSize - 1, 0, clearValueui[1], clearValueui[2],
1236*8975f5c5SAndroid Build Coastguard Worker                          clearValueui[3]);
1237*8975f5c5SAndroid Build Coastguard Worker     }
1238*8975f5c5SAndroid Build Coastguard Worker 
1239*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT0);
1240*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 1; i < kAttachmentCount; ++i)
1241*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[i] = GL_NONE;
1242*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(kAttachmentCount, drawBuffers);
1243*8975f5c5SAndroid Build Coastguard Worker 
1244*8975f5c5SAndroid Build Coastguard Worker     verifyDepth(kDepthClearValue, kSize);
1245*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(kStencilClearValue, kSize);
1246*8975f5c5SAndroid Build Coastguard Worker }
1247*8975f5c5SAndroid Build Coastguard Worker 
1248*8975f5c5SAndroid Build Coastguard Worker // Test that clearing multiple attachments of different nature (float, int and uint) in the
1249*8975f5c5SAndroid Build Coastguard Worker // presence of a scissor test works correctly.  In the Vulkan backend, this exercises clearWithDraw
1250*8975f5c5SAndroid Build Coastguard Worker // and the relevant internal shaders.
TEST_P(ClearTestES3,ScissoredClearHeterogeneousAttachments)1251*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ScissoredClearHeterogeneousAttachments)
1252*8975f5c5SAndroid Build Coastguard Worker {
1253*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40096714
1254*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
1255*8975f5c5SAndroid Build Coastguard Worker 
1256*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263682
1257*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && (IsOpenGL() || IsD3D11()) && IsAMD());
1258*8975f5c5SAndroid Build Coastguard Worker 
1259*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263790
1260*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows7() && IsD3D11() && IsNVIDIA());
1261*8975f5c5SAndroid Build Coastguard Worker 
1262*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize                              = 16;
1263*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kHalfSize                          = kSize / 2;
1264*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kAttachmentCount                   = 3;
1265*8975f5c5SAndroid Build Coastguard Worker     constexpr float kDepthClearValue                      = 0.256f;
1266*8975f5c5SAndroid Build Coastguard Worker     constexpr int32_t kStencilClearValue                  = 0x1D;
1267*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum kAttachmentFormats[kAttachmentCount] = {
1268*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA8,
1269*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA8I,
1270*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA8UI,
1271*8975f5c5SAndroid Build Coastguard Worker     };
1272*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum kDataFormats[kAttachmentCount] = {
1273*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA,
1274*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA_INTEGER,
1275*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA_INTEGER,
1276*8975f5c5SAndroid Build Coastguard Worker     };
1277*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum kDataTypes[kAttachmentCount] = {
1278*8975f5c5SAndroid Build Coastguard Worker         GL_UNSIGNED_BYTE,
1279*8975f5c5SAndroid Build Coastguard Worker         GL_BYTE,
1280*8975f5c5SAndroid Build Coastguard Worker         GL_UNSIGNED_BYTE,
1281*8975f5c5SAndroid Build Coastguard Worker     };
1282*8975f5c5SAndroid Build Coastguard Worker 
1283*8975f5c5SAndroid Build Coastguard Worker     std::vector<unsigned char> pixelData(kSize * kSize * 4, 0);
1284*8975f5c5SAndroid Build Coastguard Worker 
1285*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
1286*8975f5c5SAndroid Build Coastguard Worker 
1287*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures[kAttachmentCount];
1288*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
1289*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[kAttachmentCount];
1290*8975f5c5SAndroid Build Coastguard Worker 
1291*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
1292*8975f5c5SAndroid Build Coastguard Worker     {
1293*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[i]);
1294*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, kAttachmentFormats[i], kSize, kSize, 0, kDataFormats[i],
1295*8975f5c5SAndroid Build Coastguard Worker                      kDataTypes[i], pixelData.data());
1296*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i],
1297*8975f5c5SAndroid Build Coastguard Worker                                0);
1298*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[i] = GL_COLOR_ATTACHMENT0 + i;
1299*8975f5c5SAndroid Build Coastguard Worker     }
1300*8975f5c5SAndroid Build Coastguard Worker 
1301*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
1302*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
1303*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1304*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
1305*8975f5c5SAndroid Build Coastguard Worker 
1306*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(kAttachmentCount, drawBuffers);
1307*8975f5c5SAndroid Build Coastguard Worker 
1308*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1309*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(0, 0, 0, 0, 0, 0);
1310*8975f5c5SAndroid Build Coastguard Worker 
1311*8975f5c5SAndroid Build Coastguard Worker     // Enable scissor test
1312*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kHalfSize, kHalfSize);
1313*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
1314*8975f5c5SAndroid Build Coastguard Worker 
1315*8975f5c5SAndroid Build Coastguard Worker     GLColor clearValuef         = {25, 50, 75, 100};
1316*8975f5c5SAndroid Build Coastguard Worker     angle::Vector4 clearValuefv = clearValuef.toNormalizedVector();
1317*8975f5c5SAndroid Build Coastguard Worker 
1318*8975f5c5SAndroid Build Coastguard Worker     glClearColor(clearValuefv.x(), clearValuefv.y(), clearValuefv.z(), clearValuefv.w());
1319*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(kDepthClearValue);
1320*8975f5c5SAndroid Build Coastguard Worker 
1321*8975f5c5SAndroid Build Coastguard Worker     // clear stencil.
1322*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_STENCIL, 0, &kStencilClearValue);
1323*8975f5c5SAndroid Build Coastguard Worker 
1324*8975f5c5SAndroid Build Coastguard Worker     // clear float color attachment & depth together
1325*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1326*8975f5c5SAndroid Build Coastguard Worker 
1327*8975f5c5SAndroid Build Coastguard Worker     // clear integer attachment.
1328*8975f5c5SAndroid Build Coastguard Worker     int clearValuei[4] = {10, -20, 30, -40};
1329*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_COLOR, 1, clearValuei);
1330*8975f5c5SAndroid Build Coastguard Worker 
1331*8975f5c5SAndroid Build Coastguard Worker     // clear unsigned integer attachment
1332*8975f5c5SAndroid Build Coastguard Worker     uint32_t clearValueui[4] = {50, 60, 70, 80};
1333*8975f5c5SAndroid Build Coastguard Worker     glClearBufferuiv(GL_COLOR, 2, clearValueui);
1334*8975f5c5SAndroid Build Coastguard Worker 
1335*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1336*8975f5c5SAndroid Build Coastguard Worker 
1337*8975f5c5SAndroid Build Coastguard Worker     {
1338*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0);
1339*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1340*8975f5c5SAndroid Build Coastguard Worker 
1341*8975f5c5SAndroid Build Coastguard Worker         GLColor expect = clearValuef;
1342*8975f5c5SAndroid Build Coastguard Worker 
1343*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, expect);
1344*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, kHalfSize - 1, expect);
1345*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kHalfSize - 1, 0, expect);
1346*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kHalfSize - 1, kHalfSize - 1, expect);
1347*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(kHalfSize + 1, kHalfSize + 1, 0, 0, 0, 0);
1348*8975f5c5SAndroid Build Coastguard Worker     }
1349*8975f5c5SAndroid Build Coastguard Worker 
1350*8975f5c5SAndroid Build Coastguard Worker     {
1351*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT1);
1352*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1353*8975f5c5SAndroid Build Coastguard Worker 
1354*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8I(0, 0, clearValuei[0], clearValuei[1], clearValuei[2], clearValuei[3]);
1355*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8I(0, kHalfSize - 1, clearValuei[0], clearValuei[1], clearValuei[2],
1356*8975f5c5SAndroid Build Coastguard Worker                         clearValuei[3]);
1357*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8I(kHalfSize - 1, 0, clearValuei[0], clearValuei[1], clearValuei[2],
1358*8975f5c5SAndroid Build Coastguard Worker                         clearValuei[3]);
1359*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8I(kHalfSize - 1, kHalfSize - 1, clearValuei[0], clearValuei[1],
1360*8975f5c5SAndroid Build Coastguard Worker                         clearValuei[2], clearValuei[3]);
1361*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8I(kHalfSize + 1, kHalfSize + 1, 0, 0, 0, 0);
1362*8975f5c5SAndroid Build Coastguard Worker     }
1363*8975f5c5SAndroid Build Coastguard Worker 
1364*8975f5c5SAndroid Build Coastguard Worker     {
1365*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT2);
1366*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1367*8975f5c5SAndroid Build Coastguard Worker 
1368*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8UI(0, 0, clearValueui[0], clearValueui[1], clearValueui[2], clearValueui[3]);
1369*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8UI(0, kHalfSize - 1, clearValueui[0], clearValueui[1], clearValueui[2],
1370*8975f5c5SAndroid Build Coastguard Worker                          clearValueui[3]);
1371*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8UI(kHalfSize - 1, 0, clearValueui[0], clearValueui[1], clearValueui[2],
1372*8975f5c5SAndroid Build Coastguard Worker                          clearValueui[3]);
1373*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8UI(kHalfSize - 1, kHalfSize - 1, clearValueui[0], clearValueui[1],
1374*8975f5c5SAndroid Build Coastguard Worker                          clearValueui[2], clearValueui[3]);
1375*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_8UI(kHalfSize + 1, kHalfSize + 1, 0, 0, 0, 0);
1376*8975f5c5SAndroid Build Coastguard Worker     }
1377*8975f5c5SAndroid Build Coastguard Worker 
1378*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT0);
1379*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 1; i < kAttachmentCount; ++i)
1380*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[i] = GL_NONE;
1381*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(kAttachmentCount, drawBuffers);
1382*8975f5c5SAndroid Build Coastguard Worker 
1383*8975f5c5SAndroid Build Coastguard Worker     verifyDepth(kDepthClearValue, kHalfSize);
1384*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(kStencilClearValue, kHalfSize);
1385*8975f5c5SAndroid Build Coastguard Worker }
1386*8975f5c5SAndroid Build Coastguard Worker 
1387*8975f5c5SAndroid Build Coastguard Worker // This tests a bug where in a masked clear when calling "ClearBuffer", we would
1388*8975f5c5SAndroid Build Coastguard Worker // mistakenly clear every channel (including the masked-out ones)
TEST_P(ClearTestES3,MaskedClearBufferBug)1389*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, MaskedClearBufferBug)
1390*8975f5c5SAndroid Build Coastguard Worker {
1391*8975f5c5SAndroid Build Coastguard Worker     unsigned char pixelData[] = {255, 255, 255, 255};
1392*8975f5c5SAndroid Build Coastguard Worker 
1393*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
1394*8975f5c5SAndroid Build Coastguard Worker 
1395*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures[2];
1396*8975f5c5SAndroid Build Coastguard Worker 
1397*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, textures[0]);
1398*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
1399*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0);
1400*8975f5c5SAndroid Build Coastguard Worker 
1401*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, textures[1]);
1402*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
1403*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, textures[1], 0);
1404*8975f5c5SAndroid Build Coastguard Worker 
1405*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1406*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(0, 0, 255, 255, 255, 255);
1407*8975f5c5SAndroid Build Coastguard Worker 
1408*8975f5c5SAndroid Build Coastguard Worker     float clearValue[]   = {0, 0.5f, 0.5f, 1.0f};
1409*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[] = {GL_NONE, GL_COLOR_ATTACHMENT1};
1410*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(2, drawBuffers);
1411*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
1412*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfv(GL_COLOR, 1, clearValue);
1413*8975f5c5SAndroid Build Coastguard Worker 
1414*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1415*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(0, 0, 255, 255, 255, 255);
1416*8975f5c5SAndroid Build Coastguard Worker 
1417*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT1);
1418*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1419*8975f5c5SAndroid Build Coastguard Worker 
1420*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 0, 127, 255, 255, 1);
1421*8975f5c5SAndroid Build Coastguard Worker }
1422*8975f5c5SAndroid Build Coastguard Worker 
1423*8975f5c5SAndroid Build Coastguard Worker // Test that stencil clears works if reference and write mask have no common bits.  The write mask
1424*8975f5c5SAndroid Build Coastguard Worker // is the only thing that dictates which bits should be written to, and this is a regression test
1425*8975f5c5SAndroid Build Coastguard Worker // for a bug where the clear was no-oped if the (reference & writemask) == 0 instead of just
1426*8975f5c5SAndroid Build Coastguard Worker // writemask == 0.
TEST_P(ClearTestES3,ClearStencilWithNonOverlappingWriteMaskAndReferenceBits)1427*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearStencilWithNonOverlappingWriteMaskAndReferenceBits)
1428*8975f5c5SAndroid Build Coastguard Worker {
1429*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize = 16;
1430*8975f5c5SAndroid Build Coastguard Worker 
1431*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
1432*8975f5c5SAndroid Build Coastguard Worker 
1433*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures;
1434*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
1435*8975f5c5SAndroid Build Coastguard Worker 
1436*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, textures);
1437*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1438*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures, 0);
1439*8975f5c5SAndroid Build Coastguard Worker 
1440*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
1441*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
1442*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1443*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
1444*8975f5c5SAndroid Build Coastguard Worker     // Initialize the stencil buffer.
1445*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0);
1446*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0xEC);
1447*8975f5c5SAndroid Build Coastguard Worker 
1448*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1449*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(0xEC, kSize);
1450*8975f5c5SAndroid Build Coastguard Worker 
1451*8975f5c5SAndroid Build Coastguard Worker     // Clear the color buffer again to make sure there are no stale data.
1452*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.25, 0.5, 0.75, 1.0);
1453*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1454*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 63, 127, 191, 255, 1.0);
1455*8975f5c5SAndroid Build Coastguard Worker 
1456*8975f5c5SAndroid Build Coastguard Worker     // Set the stencil write mask to 0xF0
1457*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xF0);
1458*8975f5c5SAndroid Build Coastguard Worker 
1459*8975f5c5SAndroid Build Coastguard Worker     // Set the stencil reference to 0x0F.  It shouldn't matter
1460*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x55, 0x0F);
1461*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_INCR, GL_INCR, GL_INCR);
1462*8975f5c5SAndroid Build Coastguard Worker 
1463*8975f5c5SAndroid Build Coastguard Worker     // Clear stencil again.  Only the top four bits should be written.
1464*8975f5c5SAndroid Build Coastguard Worker     const GLint kStencilClearValue = 0x59;
1465*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_STENCIL, 0, &kStencilClearValue);
1466*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(0x5C, kSize);
1467*8975f5c5SAndroid Build Coastguard Worker }
1468*8975f5c5SAndroid Build Coastguard Worker 
1469*8975f5c5SAndroid Build Coastguard Worker // Regression test for a serial tracking bug.
TEST_P(ClearTestES3,BadFBOSerialBug)1470*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, BadFBOSerialBug)
1471*8975f5c5SAndroid Build Coastguard Worker {
1472*8975f5c5SAndroid Build Coastguard Worker     // First make a simple framebuffer, and clear it to green
1473*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
1474*8975f5c5SAndroid Build Coastguard Worker 
1475*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures[2];
1476*8975f5c5SAndroid Build Coastguard Worker 
1477*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, textures[0]);
1478*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
1479*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0);
1480*8975f5c5SAndroid Build Coastguard Worker 
1481*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0};
1482*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(1, drawBuffers);
1483*8975f5c5SAndroid Build Coastguard Worker 
1484*8975f5c5SAndroid Build Coastguard Worker     float clearValues1[] = {0.0f, 1.0f, 0.0f, 1.0f};
1485*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfv(GL_COLOR, 0, clearValues1);
1486*8975f5c5SAndroid Build Coastguard Worker 
1487*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1488*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1489*8975f5c5SAndroid Build Coastguard Worker 
1490*8975f5c5SAndroid Build Coastguard Worker     // Next make a second framebuffer, and draw it to red
1491*8975f5c5SAndroid Build Coastguard Worker     // (Triggers bad applied render target serial)
1492*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo2;
1493*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
1494*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1495*8975f5c5SAndroid Build Coastguard Worker 
1496*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, textures[1]);
1497*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
1498*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);
1499*8975f5c5SAndroid Build Coastguard Worker 
1500*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(1, drawBuffers);
1501*8975f5c5SAndroid Build Coastguard Worker 
1502*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
1503*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f);
1504*8975f5c5SAndroid Build Coastguard Worker 
1505*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1506*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1507*8975f5c5SAndroid Build Coastguard Worker 
1508*8975f5c5SAndroid Build Coastguard Worker     // Check that the first framebuffer is still green.
1509*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
1510*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1511*8975f5c5SAndroid Build Coastguard Worker }
1512*8975f5c5SAndroid Build Coastguard Worker 
1513*8975f5c5SAndroid Build Coastguard Worker // Test that SRGB framebuffers clear to the linearized clear color
TEST_P(ClearTestES3,SRGBClear)1514*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, SRGBClear)
1515*8975f5c5SAndroid Build Coastguard Worker {
1516*8975f5c5SAndroid Build Coastguard Worker     // First make a simple framebuffer, and clear it
1517*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
1518*8975f5c5SAndroid Build Coastguard Worker 
1519*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1520*8975f5c5SAndroid Build Coastguard Worker 
1521*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1522*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_SRGB8_ALPHA8, getWindowWidth(), getWindowHeight());
1523*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1524*8975f5c5SAndroid Build Coastguard Worker 
1525*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
1526*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1527*8975f5c5SAndroid Build Coastguard Worker 
1528*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 188, 188, 188, 128, 1.0);
1529*8975f5c5SAndroid Build Coastguard Worker }
1530*8975f5c5SAndroid Build Coastguard Worker 
1531*8975f5c5SAndroid Build Coastguard Worker // Test that framebuffers with mixed SRGB/Linear attachments clear to the correct color for each
1532*8975f5c5SAndroid Build Coastguard Worker // attachment
TEST_P(ClearTestES3,MixedSRGBClear)1533*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, MixedSRGBClear)
1534*8975f5c5SAndroid Build Coastguard Worker {
1535*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
1536*8975f5c5SAndroid Build Coastguard Worker 
1537*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures[2];
1538*8975f5c5SAndroid Build Coastguard Worker 
1539*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, textures[0]);
1540*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_SRGB8_ALPHA8, getWindowWidth(), getWindowHeight());
1541*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0);
1542*8975f5c5SAndroid Build Coastguard Worker 
1543*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, textures[1]);
1544*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
1545*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, textures[1], 0);
1546*8975f5c5SAndroid Build Coastguard Worker 
1547*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
1548*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(2, drawBuffers);
1549*8975f5c5SAndroid Build Coastguard Worker 
1550*8975f5c5SAndroid Build Coastguard Worker     // Clear both textures
1551*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
1552*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1553*8975f5c5SAndroid Build Coastguard Worker 
1554*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
1555*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, 0, 0);
1556*8975f5c5SAndroid Build Coastguard Worker 
1557*8975f5c5SAndroid Build Coastguard Worker     // Check value of texture0
1558*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0);
1559*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 188, 188, 188, 128, 1.0);
1560*8975f5c5SAndroid Build Coastguard Worker 
1561*8975f5c5SAndroid Build Coastguard Worker     // Check value of texture1
1562*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);
1563*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, 128, 128, 128, 128, 1.0);
1564*8975f5c5SAndroid Build Coastguard Worker }
1565*8975f5c5SAndroid Build Coastguard Worker 
1566*8975f5c5SAndroid Build Coastguard Worker // This test covers a D3D11 bug where calling ClearRenderTargetView sometimes wouldn't sync
1567*8975f5c5SAndroid Build Coastguard Worker // before a draw call. The test draws small quads to a larger FBO (the default back buffer).
1568*8975f5c5SAndroid Build Coastguard Worker // Before each blit to the back buffer it clears the quad to a certain color using
1569*8975f5c5SAndroid Build Coastguard Worker // ClearBufferfv to give a solid color. The sync problem goes away if we insert a call to
1570*8975f5c5SAndroid Build Coastguard Worker // flush or finish after ClearBufferfv or each draw.
TEST_P(ClearTestES3,RepeatedClear)1571*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedClear)
1572*8975f5c5SAndroid Build Coastguard Worker {
1573*8975f5c5SAndroid Build Coastguard Worker     // Fails on 431.02 driver. http://anglebug.com/40644697
1574*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsWindows() && IsNVIDIA() && IsVulkan());
1575*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsARM64() && IsWindows() && IsD3D());
1576*8975f5c5SAndroid Build Coastguard Worker 
1577*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
1578*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
1579*8975f5c5SAndroid Build Coastguard Worker         "in highp vec2 position;\n"
1580*8975f5c5SAndroid Build Coastguard Worker         "out highp vec2 v_coord;\n"
1581*8975f5c5SAndroid Build Coastguard Worker         "void main(void)\n"
1582*8975f5c5SAndroid Build Coastguard Worker         "{\n"
1583*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position, 0, 1);\n"
1584*8975f5c5SAndroid Build Coastguard Worker         "    vec2 texCoord = (position * 0.5) + 0.5;\n"
1585*8975f5c5SAndroid Build Coastguard Worker         "    v_coord = texCoord;\n"
1586*8975f5c5SAndroid Build Coastguard Worker         "}\n";
1587*8975f5c5SAndroid Build Coastguard Worker 
1588*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
1589*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
1590*8975f5c5SAndroid Build Coastguard Worker         "in highp vec2 v_coord;\n"
1591*8975f5c5SAndroid Build Coastguard Worker         "out highp vec4 color;\n"
1592*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex;\n"
1593*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
1594*8975f5c5SAndroid Build Coastguard Worker         "{\n"
1595*8975f5c5SAndroid Build Coastguard Worker         "    color = texture(tex, v_coord);\n"
1596*8975f5c5SAndroid Build Coastguard Worker         "}\n";
1597*8975f5c5SAndroid Build Coastguard Worker 
1598*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
1599*8975f5c5SAndroid Build Coastguard Worker 
1600*8975f5c5SAndroid Build Coastguard Worker     mTextures.resize(1, 0);
1601*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, mTextures.data());
1602*8975f5c5SAndroid Build Coastguard Worker 
1603*8975f5c5SAndroid Build Coastguard Worker     GLenum format           = GL_RGBA8;
1604*8975f5c5SAndroid Build Coastguard Worker     const int numRowsCols   = 3;
1605*8975f5c5SAndroid Build Coastguard Worker     const int cellSize      = 32;
1606*8975f5c5SAndroid Build Coastguard Worker     const int fboSize       = cellSize;
1607*8975f5c5SAndroid Build Coastguard Worker     const int backFBOSize   = cellSize * numRowsCols;
1608*8975f5c5SAndroid Build Coastguard Worker     const float fmtValueMin = 0.0f;
1609*8975f5c5SAndroid Build Coastguard Worker     const float fmtValueMax = 1.0f;
1610*8975f5c5SAndroid Build Coastguard Worker 
1611*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1612*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, format, fboSize, fboSize);
1613*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1614*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1615*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1616*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1617*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1618*8975f5c5SAndroid Build Coastguard Worker 
1619*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
1620*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
1621*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1622*8975f5c5SAndroid Build Coastguard Worker 
1623*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1624*8975f5c5SAndroid Build Coastguard Worker 
1625*8975f5c5SAndroid Build Coastguard Worker     // larger fbo bound -- clear to transparent black
1626*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1627*8975f5c5SAndroid Build Coastguard Worker     GLint uniLoc = glGetUniformLocation(program, "tex");
1628*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, uniLoc);
1629*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(uniLoc, 0);
1630*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1631*8975f5c5SAndroid Build Coastguard Worker 
1632*8975f5c5SAndroid Build Coastguard Worker     GLint positionLocation = glGetAttribLocation(program, "position");
1633*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, positionLocation);
1634*8975f5c5SAndroid Build Coastguard Worker 
1635*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1636*8975f5c5SAndroid Build Coastguard Worker 
1637*8975f5c5SAndroid Build Coastguard Worker     for (int cellY = 0; cellY < numRowsCols; cellY++)
1638*8975f5c5SAndroid Build Coastguard Worker     {
1639*8975f5c5SAndroid Build Coastguard Worker         for (int cellX = 0; cellX < numRowsCols; cellX++)
1640*8975f5c5SAndroid Build Coastguard Worker         {
1641*8975f5c5SAndroid Build Coastguard Worker             int seed            = cellX + cellY * numRowsCols;
1642*8975f5c5SAndroid Build Coastguard Worker             const Vector4 color = RandomVec4(seed, fmtValueMin, fmtValueMax);
1643*8975f5c5SAndroid Build Coastguard Worker 
1644*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
1645*8975f5c5SAndroid Build Coastguard Worker             glClearBufferfv(GL_COLOR, 0, color.data());
1646*8975f5c5SAndroid Build Coastguard Worker 
1647*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_FRAMEBUFFER, 0);
1648*8975f5c5SAndroid Build Coastguard Worker 
1649*8975f5c5SAndroid Build Coastguard Worker             // Method 1: Set viewport and draw full-viewport quad
1650*8975f5c5SAndroid Build Coastguard Worker             glViewport(cellX * cellSize, cellY * cellSize, cellSize, cellSize);
1651*8975f5c5SAndroid Build Coastguard Worker             drawQuad(program, "position", 0.5f);
1652*8975f5c5SAndroid Build Coastguard Worker 
1653*8975f5c5SAndroid Build Coastguard Worker             // Uncommenting the glFinish call seems to make the test pass.
1654*8975f5c5SAndroid Build Coastguard Worker             // glFinish();
1655*8975f5c5SAndroid Build Coastguard Worker         }
1656*8975f5c5SAndroid Build Coastguard Worker     }
1657*8975f5c5SAndroid Build Coastguard Worker 
1658*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelData(backFBOSize * backFBOSize);
1659*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, backFBOSize, backFBOSize, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data());
1660*8975f5c5SAndroid Build Coastguard Worker 
1661*8975f5c5SAndroid Build Coastguard Worker     for (int cellY = 0; cellY < numRowsCols; cellY++)
1662*8975f5c5SAndroid Build Coastguard Worker     {
1663*8975f5c5SAndroid Build Coastguard Worker         for (int cellX = 0; cellX < numRowsCols; cellX++)
1664*8975f5c5SAndroid Build Coastguard Worker         {
1665*8975f5c5SAndroid Build Coastguard Worker             int seed            = cellX + cellY * numRowsCols;
1666*8975f5c5SAndroid Build Coastguard Worker             const Vector4 color = RandomVec4(seed, fmtValueMin, fmtValueMax);
1667*8975f5c5SAndroid Build Coastguard Worker             GLColor expectedColor(color);
1668*8975f5c5SAndroid Build Coastguard Worker 
1669*8975f5c5SAndroid Build Coastguard Worker             int testN = cellX * cellSize + cellY * backFBOSize * cellSize + backFBOSize + 1;
1670*8975f5c5SAndroid Build Coastguard Worker             GLColor actualColor = pixelData[testN];
1671*8975f5c5SAndroid Build Coastguard Worker             EXPECT_NEAR(expectedColor.R, actualColor.R, 1);
1672*8975f5c5SAndroid Build Coastguard Worker             EXPECT_NEAR(expectedColor.G, actualColor.G, 1);
1673*8975f5c5SAndroid Build Coastguard Worker             EXPECT_NEAR(expectedColor.B, actualColor.B, 1);
1674*8975f5c5SAndroid Build Coastguard Worker             EXPECT_NEAR(expectedColor.A, actualColor.A, 1);
1675*8975f5c5SAndroid Build Coastguard Worker         }
1676*8975f5c5SAndroid Build Coastguard Worker     }
1677*8975f5c5SAndroid Build Coastguard Worker 
1678*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1679*8975f5c5SAndroid Build Coastguard Worker }
1680*8975f5c5SAndroid Build Coastguard Worker 
1681*8975f5c5SAndroid Build Coastguard Worker // Test that clearing RGB8 attachments work when verified through sampling.
TEST_P(ClearTestES3,ClearRGB8)1682*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearRGB8)
1683*8975f5c5SAndroid Build Coastguard Worker {
1684*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
1685*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
1686*8975f5c5SAndroid Build Coastguard Worker 
1687*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
1688*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
1689*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, 1, 1);
1690*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1691*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1692*8975f5c5SAndroid Build Coastguard Worker 
1693*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
1694*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1695*8975f5c5SAndroid Build Coastguard Worker 
1696*8975f5c5SAndroid Build Coastguard Worker     // Clear the texture through framebuffer.
1697*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kClearColor[] = {63, 127, 191, 55};
1698*8975f5c5SAndroid Build Coastguard Worker     glClearColor(kClearColor[0] / 255.0f, kClearColor[1] / 255.0f, kClearColor[2] / 255.0f,
1699*8975f5c5SAndroid Build Coastguard Worker                  kClearColor[3] / 255.0f);
1700*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1701*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1702*8975f5c5SAndroid Build Coastguard Worker 
1703*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
1704*8975f5c5SAndroid Build Coastguard Worker 
1705*8975f5c5SAndroid Build Coastguard Worker     // Sample from it and verify clear is done.
1706*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
1707*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1708*8975f5c5SAndroid Build Coastguard Worker     GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
1709*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLocation);
1710*8975f5c5SAndroid Build Coastguard Worker     GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
1711*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLocation);
1712*8975f5c5SAndroid Build Coastguard Worker 
1713*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(textureLocation, 0);
1714*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(lodLocation, 0);
1715*8975f5c5SAndroid Build Coastguard Worker 
1716*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
1717*8975f5c5SAndroid Build Coastguard Worker 
1718*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kClearColor[0], kClearColor[1], kClearColor[2], 255, 1);
1719*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1720*8975f5c5SAndroid Build Coastguard Worker }
1721*8975f5c5SAndroid Build Coastguard Worker 
1722*8975f5c5SAndroid Build Coastguard Worker // Test that clearing RGB8 attachments from a 2D texture array does not cause
1723*8975f5c5SAndroid Build Coastguard Worker // VUID-VkImageMemoryBarrier-oldLayout-01197
TEST_P(ClearTestES3,TextureArrayRGB8)1724*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, TextureArrayRGB8)
1725*8975f5c5SAndroid Build Coastguard Worker {
1726*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
1727*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
1728*8975f5c5SAndroid Build Coastguard Worker 
1729*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
1730*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
1731*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGB8, 1, 1, 2);
1732*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1733*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1734*8975f5c5SAndroid Build Coastguard Worker 
1735*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0);
1736*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, tex, 0, 1);
1737*8975f5c5SAndroid Build Coastguard Worker 
1738*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1739*8975f5c5SAndroid Build Coastguard Worker 
1740*8975f5c5SAndroid Build Coastguard Worker     GLenum bufs[2] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
1741*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(2, &bufs[0]);
1742*8975f5c5SAndroid Build Coastguard Worker 
1743*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 1.0, 1.0);
1744*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1745*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1746*8975f5c5SAndroid Build Coastguard Worker 
1747*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fb);
1748*8975f5c5SAndroid Build Coastguard Worker 
1749*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT0);
1750*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::magenta);
1751*8975f5c5SAndroid Build Coastguard Worker 
1752*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT1);
1753*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::magenta);
1754*8975f5c5SAndroid Build Coastguard Worker 
1755*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1756*8975f5c5SAndroid Build Coastguard Worker }
1757*8975f5c5SAndroid Build Coastguard Worker 
maskedScissoredColorDepthStencilClear(const MaskedScissoredClearVariationsTestParams & params)1758*8975f5c5SAndroid Build Coastguard Worker void MaskedScissoredClearTestBase::maskedScissoredColorDepthStencilClear(
1759*8975f5c5SAndroid Build Coastguard Worker     const MaskedScissoredClearVariationsTestParams &params)
1760*8975f5c5SAndroid Build Coastguard Worker {
1761*8975f5c5SAndroid Build Coastguard Worker     // Flaky on Android Nexus 5x and Pixel 2, possible Qualcomm driver bug.
1762*8975f5c5SAndroid Build Coastguard Worker     // TODO(jmadill): Re-enable when possible. http://anglebug.com/42261257
1763*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGLES() && IsAndroid());
1764*8975f5c5SAndroid Build Coastguard Worker 
1765*8975f5c5SAndroid Build Coastguard Worker     const int w      = getWindowWidth();
1766*8975f5c5SAndroid Build Coastguard Worker     const int h      = getWindowHeight();
1767*8975f5c5SAndroid Build Coastguard Worker     const int wthird = w / 3;
1768*8975f5c5SAndroid Build Coastguard Worker     const int hthird = h / 3;
1769*8975f5c5SAndroid Build Coastguard Worker 
1770*8975f5c5SAndroid Build Coastguard Worker     constexpr float kPreClearDepth     = 0.9f;
1771*8975f5c5SAndroid Build Coastguard Worker     constexpr float kClearDepth        = 0.5f;
1772*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kPreClearStencil = 0xFF;
1773*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kClearStencil    = 0x16;
1774*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kStencilMask     = 0x59;
1775*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kMaskedClearStencil =
1776*8975f5c5SAndroid Build Coastguard Worker         (kPreClearStencil & ~kStencilMask) | (kClearStencil & kStencilMask);
1777*8975f5c5SAndroid Build Coastguard Worker 
1778*8975f5c5SAndroid Build Coastguard Worker     bool clearColor, clearDepth, clearStencil;
1779*8975f5c5SAndroid Build Coastguard Worker     bool maskColor, maskDepth, maskStencil;
1780*8975f5c5SAndroid Build Coastguard Worker     bool scissor;
1781*8975f5c5SAndroid Build Coastguard Worker 
1782*8975f5c5SAndroid Build Coastguard Worker     ParseMaskedScissoredClearVariationsTestParams(params, &clearColor, &clearDepth, &clearStencil,
1783*8975f5c5SAndroid Build Coastguard Worker                                                   &maskColor, &maskDepth, &maskStencil, &scissor);
1784*8975f5c5SAndroid Build Coastguard Worker 
1785*8975f5c5SAndroid Build Coastguard Worker     // Clear to a random color, 0.9 depth and 0x00 stencil
1786*8975f5c5SAndroid Build Coastguard Worker     Vector4 color1(0.1f, 0.2f, 0.3f, 0.4f);
1787*8975f5c5SAndroid Build Coastguard Worker     GLColor color1RGB(color1);
1788*8975f5c5SAndroid Build Coastguard Worker 
1789*8975f5c5SAndroid Build Coastguard Worker     glClearColor(color1[0], color1[1], color1[2], color1[3]);
1790*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(kPreClearDepth);
1791*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(kPreClearStencil);
1792*8975f5c5SAndroid Build Coastguard Worker 
1793*8975f5c5SAndroid Build Coastguard Worker     if (!clearColor)
1794*8975f5c5SAndroid Build Coastguard Worker     {
1795*8975f5c5SAndroid Build Coastguard Worker         // If not asked to clear color, clear it anyway, but individually.  The clear value is
1796*8975f5c5SAndroid Build Coastguard Worker         // still used to verify that the depth/stencil clear happened correctly.  This allows
1797*8975f5c5SAndroid Build Coastguard Worker         // testing for depth/stencil-only clear implementations.
1798*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1799*8975f5c5SAndroid Build Coastguard Worker     }
1800*8975f5c5SAndroid Build Coastguard Worker 
1801*8975f5c5SAndroid Build Coastguard Worker     glClear((clearColor ? GL_COLOR_BUFFER_BIT : 0) | (clearDepth ? GL_DEPTH_BUFFER_BIT : 0) |
1802*8975f5c5SAndroid Build Coastguard Worker             (clearStencil ? GL_STENCIL_BUFFER_BIT : 0));
1803*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1804*8975f5c5SAndroid Build Coastguard Worker 
1805*8975f5c5SAndroid Build Coastguard Worker     // Verify color was cleared correctly.
1806*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, color1RGB, 1);
1807*8975f5c5SAndroid Build Coastguard Worker 
1808*8975f5c5SAndroid Build Coastguard Worker     if (scissor)
1809*8975f5c5SAndroid Build Coastguard Worker     {
1810*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_SCISSOR_TEST);
1811*8975f5c5SAndroid Build Coastguard Worker         glScissor(wthird / 2, hthird / 2, wthird, hthird);
1812*8975f5c5SAndroid Build Coastguard Worker     }
1813*8975f5c5SAndroid Build Coastguard Worker 
1814*8975f5c5SAndroid Build Coastguard Worker     // Use color and stencil masks to clear to a second color, 0.5 depth and 0x59 stencil.
1815*8975f5c5SAndroid Build Coastguard Worker     Vector4 color2(0.2f, 0.4f, 0.6f, 0.8f);
1816*8975f5c5SAndroid Build Coastguard Worker     GLColor color2RGB(color2);
1817*8975f5c5SAndroid Build Coastguard Worker     glClearColor(color2[0], color2[1], color2[2], color2[3]);
1818*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(kClearDepth);
1819*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(kClearStencil);
1820*8975f5c5SAndroid Build Coastguard Worker     if (maskColor)
1821*8975f5c5SAndroid Build Coastguard Worker     {
1822*8975f5c5SAndroid Build Coastguard Worker         glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE);
1823*8975f5c5SAndroid Build Coastguard Worker     }
1824*8975f5c5SAndroid Build Coastguard Worker     if (maskDepth)
1825*8975f5c5SAndroid Build Coastguard Worker     {
1826*8975f5c5SAndroid Build Coastguard Worker         glDepthMask(GL_FALSE);
1827*8975f5c5SAndroid Build Coastguard Worker     }
1828*8975f5c5SAndroid Build Coastguard Worker     if (maskStencil)
1829*8975f5c5SAndroid Build Coastguard Worker     {
1830*8975f5c5SAndroid Build Coastguard Worker         glStencilMask(kStencilMask);
1831*8975f5c5SAndroid Build Coastguard Worker     }
1832*8975f5c5SAndroid Build Coastguard Worker     glClear((clearColor ? GL_COLOR_BUFFER_BIT : 0) | (clearDepth ? GL_DEPTH_BUFFER_BIT : 0) |
1833*8975f5c5SAndroid Build Coastguard Worker             (clearStencil ? GL_STENCIL_BUFFER_BIT : 0));
1834*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
1835*8975f5c5SAndroid Build Coastguard Worker     glDepthMask(GL_TRUE);
1836*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xFF);
1837*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
1838*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_STENCIL_TEST);
1839*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
1840*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1841*8975f5c5SAndroid Build Coastguard Worker 
1842*8975f5c5SAndroid Build Coastguard Worker     GLColor color2MaskedRGB(color2RGB[0], color1RGB[1], color2RGB[2], color1RGB[3]);
1843*8975f5c5SAndroid Build Coastguard Worker 
1844*8975f5c5SAndroid Build Coastguard Worker     // If not clearing color, the original color should be left both in the center and corners.  If
1845*8975f5c5SAndroid Build Coastguard Worker     // using a scissor, the corners should be left to the original color, while the center is
1846*8975f5c5SAndroid Build Coastguard Worker     // possibly changed.  If using a mask, the center (and corners if not scissored), changes to
1847*8975f5c5SAndroid Build Coastguard Worker     // the masked results.
1848*8975f5c5SAndroid Build Coastguard Worker     GLColor expectedCenterColorRGB = !clearColor ? color1RGB
1849*8975f5c5SAndroid Build Coastguard Worker                                      : maskColor ? color2MaskedRGB
1850*8975f5c5SAndroid Build Coastguard Worker                                                  : color2RGB;
1851*8975f5c5SAndroid Build Coastguard Worker     GLColor expectedCornerColorRGB = scissor ? color1RGB : expectedCenterColorRGB;
1852*8975f5c5SAndroid Build Coastguard Worker 
1853*8975f5c5SAndroid Build Coastguard Worker     // Verify second clear color mask worked as expected.
1854*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(wthird, hthird, expectedCenterColorRGB, 1);
1855*8975f5c5SAndroid Build Coastguard Worker 
1856*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedCornerColorRGB, 1);
1857*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(w - 1, 0, expectedCornerColorRGB, 1);
1858*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, h - 1, expectedCornerColorRGB, 1);
1859*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(w - 1, h - 1, expectedCornerColorRGB, 1);
1860*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(wthird, 2 * hthird, expectedCornerColorRGB, 1);
1861*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(2 * wthird, hthird, expectedCornerColorRGB, 1);
1862*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(2 * wthird, 2 * hthird, expectedCornerColorRGB, 1);
1863*8975f5c5SAndroid Build Coastguard Worker 
1864*8975f5c5SAndroid Build Coastguard Worker     // If there is depth, but depth is not asked to be cleared, the depth buffer contains garbage,
1865*8975f5c5SAndroid Build Coastguard Worker     // so no particular behavior can be expected.
1866*8975f5c5SAndroid Build Coastguard Worker     if (clearDepth || !mHasDepth)
1867*8975f5c5SAndroid Build Coastguard Worker     {
1868*8975f5c5SAndroid Build Coastguard Worker         // We use a small shader to verify depth.
1869*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(depthTestProgram, essl1_shaders::vs::Passthrough(),
1870*8975f5c5SAndroid Build Coastguard Worker                          essl1_shaders::fs::Blue());
1871*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_DEPTH_TEST);
1872*8975f5c5SAndroid Build Coastguard Worker         glDepthFunc(maskDepth ? GL_GREATER : GL_EQUAL);
1873*8975f5c5SAndroid Build Coastguard Worker         // - If depth is cleared, but it's masked, kPreClearDepth should be in the depth buffer.
1874*8975f5c5SAndroid Build Coastguard Worker         // - If depth is cleared, but it's not masked, kClearDepth should be in the depth buffer.
1875*8975f5c5SAndroid Build Coastguard Worker         // - If depth is not cleared, the if above ensures there is no depth buffer at all,
1876*8975f5c5SAndroid Build Coastguard Worker         //   which means depth test will always pass.
1877*8975f5c5SAndroid Build Coastguard Worker         drawQuad(depthTestProgram, essl1_shaders::PositionAttrib(), maskDepth ? 1.0f : 0.0f);
1878*8975f5c5SAndroid Build Coastguard Worker         glDisable(GL_DEPTH_TEST);
1879*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1880*8975f5c5SAndroid Build Coastguard Worker 
1881*8975f5c5SAndroid Build Coastguard Worker         // Either way, we expect blue to be written to the center.
1882*8975f5c5SAndroid Build Coastguard Worker         expectedCenterColorRGB = GLColor::blue;
1883*8975f5c5SAndroid Build Coastguard Worker         // If there is no depth, depth test always passes so the whole image must be blue.  Same if
1884*8975f5c5SAndroid Build Coastguard Worker         // depth write is masked.
1885*8975f5c5SAndroid Build Coastguard Worker         expectedCornerColorRGB =
1886*8975f5c5SAndroid Build Coastguard Worker             mHasDepth && scissor && !maskDepth ? expectedCornerColorRGB : GLColor::blue;
1887*8975f5c5SAndroid Build Coastguard Worker 
1888*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(wthird, hthird, expectedCenterColorRGB, 1);
1889*8975f5c5SAndroid Build Coastguard Worker 
1890*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedCornerColorRGB, 1);
1891*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(w - 1, 0, expectedCornerColorRGB, 1);
1892*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, h - 1, expectedCornerColorRGB, 1);
1893*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(w - 1, h - 1, expectedCornerColorRGB, 1);
1894*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(wthird, 2 * hthird, expectedCornerColorRGB, 1);
1895*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(2 * wthird, hthird, expectedCornerColorRGB, 1);
1896*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(2 * wthird, 2 * hthird, expectedCornerColorRGB, 1);
1897*8975f5c5SAndroid Build Coastguard Worker     }
1898*8975f5c5SAndroid Build Coastguard Worker 
1899*8975f5c5SAndroid Build Coastguard Worker     // If there is stencil, but it's not asked to be cleared, there is similarly no expectation.
1900*8975f5c5SAndroid Build Coastguard Worker     if (clearStencil || !mHasStencil)
1901*8975f5c5SAndroid Build Coastguard Worker     {
1902*8975f5c5SAndroid Build Coastguard Worker         // And another small shader to verify stencil.
1903*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(stencilTestProgram, essl1_shaders::vs::Passthrough(),
1904*8975f5c5SAndroid Build Coastguard Worker                          essl1_shaders::fs::Green());
1905*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_STENCIL_TEST);
1906*8975f5c5SAndroid Build Coastguard Worker         // - If stencil is cleared, but it's masked, kMaskedClearStencil should be in the stencil
1907*8975f5c5SAndroid Build Coastguard Worker         //   buffer.
1908*8975f5c5SAndroid Build Coastguard Worker         // - If stencil is cleared, but it's not masked, kClearStencil should be in the stencil
1909*8975f5c5SAndroid Build Coastguard Worker         //   buffer.
1910*8975f5c5SAndroid Build Coastguard Worker         // - If stencil is not cleared, the if above ensures there is no stencil buffer at all,
1911*8975f5c5SAndroid Build Coastguard Worker         //   which means stencil test will always pass.
1912*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_EQUAL, maskStencil ? kMaskedClearStencil : kClearStencil, 0xFF);
1913*8975f5c5SAndroid Build Coastguard Worker         drawQuad(stencilTestProgram, essl1_shaders::PositionAttrib(), 0.0f);
1914*8975f5c5SAndroid Build Coastguard Worker         glDisable(GL_STENCIL_TEST);
1915*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1916*8975f5c5SAndroid Build Coastguard Worker 
1917*8975f5c5SAndroid Build Coastguard Worker         // Either way, we expect green to be written to the center.
1918*8975f5c5SAndroid Build Coastguard Worker         expectedCenterColorRGB = GLColor::green;
1919*8975f5c5SAndroid Build Coastguard Worker         // If there is no stencil, stencil test always passes so the whole image must be green.
1920*8975f5c5SAndroid Build Coastguard Worker         expectedCornerColorRGB = mHasStencil && scissor ? expectedCornerColorRGB : GLColor::green;
1921*8975f5c5SAndroid Build Coastguard Worker 
1922*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(wthird, hthird, expectedCenterColorRGB, 1);
1923*8975f5c5SAndroid Build Coastguard Worker 
1924*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedCornerColorRGB, 1);
1925*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(w - 1, 0, expectedCornerColorRGB, 1);
1926*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, h - 1, expectedCornerColorRGB, 1);
1927*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(w - 1, h - 1, expectedCornerColorRGB, 1);
1928*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(wthird, 2 * hthird, expectedCornerColorRGB, 1);
1929*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(2 * wthird, hthird, expectedCornerColorRGB, 1);
1930*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(2 * wthird, 2 * hthird, expectedCornerColorRGB, 1);
1931*8975f5c5SAndroid Build Coastguard Worker     }
1932*8975f5c5SAndroid Build Coastguard Worker }
1933*8975f5c5SAndroid Build Coastguard Worker 
1934*8975f5c5SAndroid Build Coastguard Worker // Tests combinations of color, depth, stencil clears with or without masks or scissor.
TEST_P(MaskedScissoredClearTest,Test)1935*8975f5c5SAndroid Build Coastguard Worker TEST_P(MaskedScissoredClearTest, Test)
1936*8975f5c5SAndroid Build Coastguard Worker {
1937*8975f5c5SAndroid Build Coastguard Worker     maskedScissoredColorDepthStencilClear(GetParam());
1938*8975f5c5SAndroid Build Coastguard Worker }
1939*8975f5c5SAndroid Build Coastguard Worker 
1940*8975f5c5SAndroid Build Coastguard Worker // Tests combinations of color, depth, stencil clears with or without masks or scissor.
1941*8975f5c5SAndroid Build Coastguard Worker //
1942*8975f5c5SAndroid Build Coastguard Worker // This uses depth/stencil attachments that are single-channel, but are emulated with a format
1943*8975f5c5SAndroid Build Coastguard Worker // that has both channels.
TEST_P(VulkanClearTest,Test)1944*8975f5c5SAndroid Build Coastguard Worker TEST_P(VulkanClearTest, Test)
1945*8975f5c5SAndroid Build Coastguard Worker {
1946*8975f5c5SAndroid Build Coastguard Worker     bool clearColor, clearDepth, clearStencil;
1947*8975f5c5SAndroid Build Coastguard Worker     bool maskColor, maskDepth, maskStencil;
1948*8975f5c5SAndroid Build Coastguard Worker     bool scissor;
1949*8975f5c5SAndroid Build Coastguard Worker 
1950*8975f5c5SAndroid Build Coastguard Worker     ParseMaskedScissoredClearVariationsTestParams(GetParam(), &clearColor, &clearDepth,
1951*8975f5c5SAndroid Build Coastguard Worker                                                   &clearStencil, &maskColor, &maskDepth,
1952*8975f5c5SAndroid Build Coastguard Worker                                                   &maskStencil, &scissor);
1953*8975f5c5SAndroid Build Coastguard Worker 
1954*8975f5c5SAndroid Build Coastguard Worker     // We only care about clearing depth xor stencil.
1955*8975f5c5SAndroid Build Coastguard Worker     if (clearDepth == clearStencil)
1956*8975f5c5SAndroid Build Coastguard Worker     {
1957*8975f5c5SAndroid Build Coastguard Worker         return;
1958*8975f5c5SAndroid Build Coastguard Worker     }
1959*8975f5c5SAndroid Build Coastguard Worker 
1960*8975f5c5SAndroid Build Coastguard Worker     if (clearDepth)
1961*8975f5c5SAndroid Build Coastguard Worker     {
1962*8975f5c5SAndroid Build Coastguard Worker         // Creating a depth-only renderbuffer is an ES3 feature.
1963*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
1964*8975f5c5SAndroid Build Coastguard Worker         bindColorDepthFBO();
1965*8975f5c5SAndroid Build Coastguard Worker     }
1966*8975f5c5SAndroid Build Coastguard Worker     else
1967*8975f5c5SAndroid Build Coastguard Worker     {
1968*8975f5c5SAndroid Build Coastguard Worker         bindColorStencilFBO();
1969*8975f5c5SAndroid Build Coastguard Worker     }
1970*8975f5c5SAndroid Build Coastguard Worker 
1971*8975f5c5SAndroid Build Coastguard Worker     maskedScissoredColorDepthStencilClear(GetParam());
1972*8975f5c5SAndroid Build Coastguard Worker }
1973*8975f5c5SAndroid Build Coastguard Worker 
1974*8975f5c5SAndroid Build Coastguard Worker // Tests that clearing a non existing attachment works.
TEST_P(ClearTest,ClearColorThenClearNonExistingDepthStencil)1975*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, ClearColorThenClearNonExistingDepthStencil)
1976*8975f5c5SAndroid Build Coastguard Worker {
1977*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
1978*8975f5c5SAndroid Build Coastguard Worker 
1979*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
1980*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
1981*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1982*8975f5c5SAndroid Build Coastguard Worker 
1983*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1984*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1985*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
1986*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1987*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1988*8975f5c5SAndroid Build Coastguard Worker 
1989*8975f5c5SAndroid Build Coastguard Worker     // Clear color.
1990*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1991*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1992*8975f5c5SAndroid Build Coastguard Worker 
1993*8975f5c5SAndroid Build Coastguard Worker     // Clear depth/stencil.
1994*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1995*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1996*8975f5c5SAndroid Build Coastguard Worker 
1997*8975f5c5SAndroid Build Coastguard Worker     // Read back color.
1998*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1999*8975f5c5SAndroid Build Coastguard Worker }
2000*8975f5c5SAndroid Build Coastguard Worker 
2001*8975f5c5SAndroid Build Coastguard Worker // Tests that clearing a non existing attachment works.
TEST_P(ClearTestES3,ClearDepthStencilThenClearNonExistingColor)2002*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearDepthStencilThenClearNonExistingColor)
2003*8975f5c5SAndroid Build Coastguard Worker {
2004*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
2005*8975f5c5SAndroid Build Coastguard Worker 
2006*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depth;
2007*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depth);
2008*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
2009*8975f5c5SAndroid Build Coastguard Worker 
2010*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2011*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2012*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depth);
2013*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2014*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2015*8975f5c5SAndroid Build Coastguard Worker 
2016*8975f5c5SAndroid Build Coastguard Worker     // Clear depth/stencil.
2017*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(1.0f);
2018*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0xAA);
2019*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2020*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2021*8975f5c5SAndroid Build Coastguard Worker 
2022*8975f5c5SAndroid Build Coastguard Worker     // Clear color.
2023*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2024*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2025*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2026*8975f5c5SAndroid Build Coastguard Worker }
2027*8975f5c5SAndroid Build Coastguard Worker 
2028*8975f5c5SAndroid Build Coastguard Worker // Test that just clearing a nonexistent drawbuffer of the default framebuffer doesn't cause an
2029*8975f5c5SAndroid Build Coastguard Worker // assert.
TEST_P(ClearTestES3,ClearBuffer1OnDefaultFramebufferNoAssert)2030*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearBuffer1OnDefaultFramebufferNoAssert)
2031*8975f5c5SAndroid Build Coastguard Worker {
2032*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLuint> testUint(4);
2033*8975f5c5SAndroid Build Coastguard Worker     glClearBufferuiv(GL_COLOR, 1, testUint.data());
2034*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLint> testInt(4);
2035*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_COLOR, 1, testInt.data());
2036*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLfloat> testFloat(4);
2037*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfv(GL_COLOR, 1, testFloat.data());
2038*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2039*8975f5c5SAndroid Build Coastguard Worker }
2040*8975f5c5SAndroid Build Coastguard Worker 
2041*8975f5c5SAndroid Build Coastguard Worker // Clears many small concentric rectangles using scissor regions.
TEST_P(ClearTest,InceptionScissorClears)2042*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, InceptionScissorClears)
2043*8975f5c5SAndroid Build Coastguard Worker {
2044*8975f5c5SAndroid Build Coastguard Worker     angle::RNG rng;
2045*8975f5c5SAndroid Build Coastguard Worker 
2046*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 16;
2047*8975f5c5SAndroid Build Coastguard Worker 
2048*8975f5c5SAndroid Build Coastguard Worker     // Create a square user FBO so we have more control over the dimensions.
2049*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2050*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2051*8975f5c5SAndroid Build Coastguard Worker 
2052*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
2053*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
2054*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
2055*8975f5c5SAndroid Build Coastguard Worker 
2056*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
2057*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2058*8975f5c5SAndroid Build Coastguard Worker 
2059*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
2060*8975f5c5SAndroid Build Coastguard Worker 
2061*8975f5c5SAndroid Build Coastguard Worker     // Draw small concentric squares using scissor.
2062*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> expectedColors;
2063*8975f5c5SAndroid Build Coastguard Worker     for (GLuint index = 0; index < (kSize - 1) / 2; index++)
2064*8975f5c5SAndroid Build Coastguard Worker     {
2065*8975f5c5SAndroid Build Coastguard Worker         // Do the first clear without the scissor.
2066*8975f5c5SAndroid Build Coastguard Worker         if (index > 0)
2067*8975f5c5SAndroid Build Coastguard Worker         {
2068*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_SCISSOR_TEST);
2069*8975f5c5SAndroid Build Coastguard Worker             glScissor(index, index, kSize - (index * 2), kSize - (index * 2));
2070*8975f5c5SAndroid Build Coastguard Worker         }
2071*8975f5c5SAndroid Build Coastguard Worker 
2072*8975f5c5SAndroid Build Coastguard Worker         GLColor color = RandomColor(&rng);
2073*8975f5c5SAndroid Build Coastguard Worker         expectedColors.push_back(color);
2074*8975f5c5SAndroid Build Coastguard Worker         Vector4 floatColor = color.toNormalizedVector();
2075*8975f5c5SAndroid Build Coastguard Worker         glClearColor(floatColor[0], floatColor[1], floatColor[2], floatColor[3]);
2076*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
2077*8975f5c5SAndroid Build Coastguard Worker     }
2078*8975f5c5SAndroid Build Coastguard Worker 
2079*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2080*8975f5c5SAndroid Build Coastguard Worker 
2081*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> actualColors(expectedColors.size());
2082*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, kSize / 2, actualColors.size(), 1, GL_RGBA, GL_UNSIGNED_BYTE,
2083*8975f5c5SAndroid Build Coastguard Worker                  actualColors.data());
2084*8975f5c5SAndroid Build Coastguard Worker 
2085*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(expectedColors, actualColors);
2086*8975f5c5SAndroid Build Coastguard Worker }
2087*8975f5c5SAndroid Build Coastguard Worker 
2088*8975f5c5SAndroid Build Coastguard Worker // Clears many small concentric rectangles using scissor regions.
TEST_P(ClearTest,DrawThenInceptionScissorClears)2089*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, DrawThenInceptionScissorClears)
2090*8975f5c5SAndroid Build Coastguard Worker {
2091*8975f5c5SAndroid Build Coastguard Worker     angle::RNG rng;
2092*8975f5c5SAndroid Build Coastguard Worker 
2093*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 16;
2094*8975f5c5SAndroid Build Coastguard Worker 
2095*8975f5c5SAndroid Build Coastguard Worker     // Create a square user FBO so we have more control over the dimensions.
2096*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2097*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2098*8975f5c5SAndroid Build Coastguard Worker 
2099*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
2100*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
2101*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
2102*8975f5c5SAndroid Build Coastguard Worker 
2103*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
2104*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2105*8975f5c5SAndroid Build Coastguard Worker 
2106*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
2107*8975f5c5SAndroid Build Coastguard Worker 
2108*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(redProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
2109*8975f5c5SAndroid Build Coastguard Worker     drawQuad(redProgram, essl1_shaders::PositionAttrib(), 0.5f);
2110*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2111*8975f5c5SAndroid Build Coastguard Worker 
2112*8975f5c5SAndroid Build Coastguard Worker     // Draw small concentric squares using scissor.
2113*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> expectedColors;
2114*8975f5c5SAndroid Build Coastguard Worker     for (GLuint index = 0; index < (kSize - 1) / 2; index++)
2115*8975f5c5SAndroid Build Coastguard Worker     {
2116*8975f5c5SAndroid Build Coastguard Worker         // Do the first clear without the scissor.
2117*8975f5c5SAndroid Build Coastguard Worker         if (index > 0)
2118*8975f5c5SAndroid Build Coastguard Worker         {
2119*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_SCISSOR_TEST);
2120*8975f5c5SAndroid Build Coastguard Worker             glScissor(index, index, kSize - (index * 2), kSize - (index * 2));
2121*8975f5c5SAndroid Build Coastguard Worker         }
2122*8975f5c5SAndroid Build Coastguard Worker 
2123*8975f5c5SAndroid Build Coastguard Worker         GLColor color = RandomColor(&rng);
2124*8975f5c5SAndroid Build Coastguard Worker         expectedColors.push_back(color);
2125*8975f5c5SAndroid Build Coastguard Worker         Vector4 floatColor = color.toNormalizedVector();
2126*8975f5c5SAndroid Build Coastguard Worker         glClearColor(floatColor[0], floatColor[1], floatColor[2], floatColor[3]);
2127*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
2128*8975f5c5SAndroid Build Coastguard Worker     }
2129*8975f5c5SAndroid Build Coastguard Worker 
2130*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2131*8975f5c5SAndroid Build Coastguard Worker 
2132*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> actualColors(expectedColors.size());
2133*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, kSize / 2, actualColors.size(), 1, GL_RGBA, GL_UNSIGNED_BYTE,
2134*8975f5c5SAndroid Build Coastguard Worker                  actualColors.data());
2135*8975f5c5SAndroid Build Coastguard Worker 
2136*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(expectedColors, actualColors);
2137*8975f5c5SAndroid Build Coastguard Worker }
2138*8975f5c5SAndroid Build Coastguard Worker 
2139*8975f5c5SAndroid Build Coastguard Worker // Test that clearBuffer with disabled non-zero drawbuffer or disabled read source doesn't cause an
2140*8975f5c5SAndroid Build Coastguard Worker // assert.
TEST_P(ClearTestES3,ClearDisabledNonZeroAttachmentNoAssert)2141*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearDisabledNonZeroAttachmentNoAssert)
2142*8975f5c5SAndroid Build Coastguard Worker {
2143*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40644728
2144*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
2145*8975f5c5SAndroid Build Coastguard Worker 
2146*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
2147*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
2148*8975f5c5SAndroid Build Coastguard Worker 
2149*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb;
2150*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb);
2151*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16);
2152*8975f5c5SAndroid Build Coastguard Worker 
2153*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, rb);
2154*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(0, nullptr);
2155*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_NONE);
2156*8975f5c5SAndroid Build Coastguard Worker 
2157*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2158*8975f5c5SAndroid Build Coastguard Worker 
2159*8975f5c5SAndroid Build Coastguard Worker     float clearColorf[4] = {0.5, 0.5, 0.5, 0.5};
2160*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfv(GL_COLOR, 1, clearColorf);
2161*8975f5c5SAndroid Build Coastguard Worker 
2162*8975f5c5SAndroid Build Coastguard Worker     GLuint clearColorui[4] = {255, 255, 255, 255};
2163*8975f5c5SAndroid Build Coastguard Worker     glClearBufferuiv(GL_COLOR, 1, clearColorui);
2164*8975f5c5SAndroid Build Coastguard Worker 
2165*8975f5c5SAndroid Build Coastguard Worker     GLint clearColori[4] = {-127, -127, -127, -127};
2166*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_COLOR, 1, clearColori);
2167*8975f5c5SAndroid Build Coastguard Worker 
2168*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2169*8975f5c5SAndroid Build Coastguard Worker }
2170*8975f5c5SAndroid Build Coastguard Worker 
2171*8975f5c5SAndroid Build Coastguard Worker // Test that having a framebuffer with maximum number of attachments and clearing color, depth and
2172*8975f5c5SAndroid Build Coastguard Worker // stencil works.
TEST_P(ClearTestES3,ClearMaxAttachments)2173*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearMaxAttachments)
2174*8975f5c5SAndroid Build Coastguard Worker {
2175*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40644728
2176*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
2177*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42263935
2178*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D11());
2179*8975f5c5SAndroid Build Coastguard Worker 
2180*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
2181*8975f5c5SAndroid Build Coastguard Worker 
2182*8975f5c5SAndroid Build Coastguard Worker     GLint maxDrawBuffers = 0;
2183*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
2184*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(maxDrawBuffers, 4);
2185*8975f5c5SAndroid Build Coastguard Worker 
2186*8975f5c5SAndroid Build Coastguard Worker     // Setup framebuffer.
2187*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
2188*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
2189*8975f5c5SAndroid Build Coastguard Worker 
2190*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLRenderbuffer> color(maxDrawBuffers);
2191*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> drawBuffers(maxDrawBuffers);
2192*8975f5c5SAndroid Build Coastguard Worker 
2193*8975f5c5SAndroid Build Coastguard Worker     for (GLint colorIndex = 0; colorIndex < maxDrawBuffers; ++colorIndex)
2194*8975f5c5SAndroid Build Coastguard Worker     {
2195*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, color[colorIndex]);
2196*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
2197*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorIndex,
2198*8975f5c5SAndroid Build Coastguard Worker                                   GL_RENDERBUFFER, color[colorIndex]);
2199*8975f5c5SAndroid Build Coastguard Worker 
2200*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[colorIndex] = GL_COLOR_ATTACHMENT0 + colorIndex;
2201*8975f5c5SAndroid Build Coastguard Worker     }
2202*8975f5c5SAndroid Build Coastguard Worker 
2203*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
2204*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
2205*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
2206*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2207*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
2208*8975f5c5SAndroid Build Coastguard Worker 
2209*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2210*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2211*8975f5c5SAndroid Build Coastguard Worker 
2212*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(maxDrawBuffers, drawBuffers.data());
2213*8975f5c5SAndroid Build Coastguard Worker 
2214*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2215*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(1.0f);
2216*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0x55);
2217*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2218*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2219*8975f5c5SAndroid Build Coastguard Worker 
2220*8975f5c5SAndroid Build Coastguard Worker     // Verify that every color attachment is cleared correctly.
2221*8975f5c5SAndroid Build Coastguard Worker     for (GLint colorIndex = 0; colorIndex < maxDrawBuffers; ++colorIndex)
2222*8975f5c5SAndroid Build Coastguard Worker     {
2223*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0 + colorIndex);
2224*8975f5c5SAndroid Build Coastguard Worker 
2225*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2226*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red);
2227*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red);
2228*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red);
2229*8975f5c5SAndroid Build Coastguard Worker     }
2230*8975f5c5SAndroid Build Coastguard Worker 
2231*8975f5c5SAndroid Build Coastguard Worker     // Verify that depth and stencil attachments are cleared correctly.
2232*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbVerify;
2233*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbVerify);
2234*8975f5c5SAndroid Build Coastguard Worker 
2235*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color[0]);
2236*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2237*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
2238*8975f5c5SAndroid Build Coastguard Worker 
2239*8975f5c5SAndroid Build Coastguard Worker     // If depth is not cleared to 1, rendering would fail.
2240*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
2241*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
2242*8975f5c5SAndroid Build Coastguard Worker 
2243*8975f5c5SAndroid Build Coastguard Worker     // If stencil is not cleared to 0x55, rendering would fail.
2244*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2245*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x55, 0xFF);
2246*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2247*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xFF);
2248*8975f5c5SAndroid Build Coastguard Worker 
2249*8975f5c5SAndroid Build Coastguard Worker     // Draw green.
2250*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2251*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.95f);
2252*8975f5c5SAndroid Build Coastguard Worker 
2253*8975f5c5SAndroid Build Coastguard Worker     // Verify that green was drawn.
2254*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2255*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
2256*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
2257*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
2258*8975f5c5SAndroid Build Coastguard Worker }
2259*8975f5c5SAndroid Build Coastguard Worker 
2260*8975f5c5SAndroid Build Coastguard Worker // Test that having a framebuffer with maximum number of attachments and clearing color, depth and
2261*8975f5c5SAndroid Build Coastguard Worker // stencil after a draw call works.
TEST_P(ClearTestES3,ClearMaxAttachmentsAfterDraw)2262*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearMaxAttachmentsAfterDraw)
2263*8975f5c5SAndroid Build Coastguard Worker {
2264*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40644728
2265*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
2266*8975f5c5SAndroid Build Coastguard Worker 
2267*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
2268*8975f5c5SAndroid Build Coastguard Worker 
2269*8975f5c5SAndroid Build Coastguard Worker     GLint maxDrawBuffers = 0;
2270*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
2271*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(maxDrawBuffers, 4);
2272*8975f5c5SAndroid Build Coastguard Worker 
2273*8975f5c5SAndroid Build Coastguard Worker     // Setup framebuffer.
2274*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
2275*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
2276*8975f5c5SAndroid Build Coastguard Worker 
2277*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLRenderbuffer> color(maxDrawBuffers);
2278*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> drawBuffers(maxDrawBuffers);
2279*8975f5c5SAndroid Build Coastguard Worker 
2280*8975f5c5SAndroid Build Coastguard Worker     for (GLint colorIndex = 0; colorIndex < maxDrawBuffers; ++colorIndex)
2281*8975f5c5SAndroid Build Coastguard Worker     {
2282*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, color[colorIndex]);
2283*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
2284*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorIndex,
2285*8975f5c5SAndroid Build Coastguard Worker                                   GL_RENDERBUFFER, color[colorIndex]);
2286*8975f5c5SAndroid Build Coastguard Worker 
2287*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[colorIndex] = GL_COLOR_ATTACHMENT0 + colorIndex;
2288*8975f5c5SAndroid Build Coastguard Worker     }
2289*8975f5c5SAndroid Build Coastguard Worker 
2290*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
2291*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
2292*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
2293*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2294*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
2295*8975f5c5SAndroid Build Coastguard Worker 
2296*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2297*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2298*8975f5c5SAndroid Build Coastguard Worker 
2299*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(maxDrawBuffers, drawBuffers.data());
2300*8975f5c5SAndroid Build Coastguard Worker 
2301*8975f5c5SAndroid Build Coastguard Worker     // Issue a draw call to render blue, depth=0 and stencil 0x3C to the attachments.
2302*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
2303*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_ALWAYS);
2304*8975f5c5SAndroid Build Coastguard Worker 
2305*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2306*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_ALWAYS, 0x3C, 0xFF);
2307*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2308*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xFF);
2309*8975f5c5SAndroid Build Coastguard Worker 
2310*8975f5c5SAndroid Build Coastguard Worker     // Generate shader for this framebuffer.
2311*8975f5c5SAndroid Build Coastguard Worker     std::stringstream strstr;
2312*8975f5c5SAndroid Build Coastguard Worker     strstr << "#version 300 es\n"
2313*8975f5c5SAndroid Build Coastguard Worker               "precision highp float;\n";
2314*8975f5c5SAndroid Build Coastguard Worker     for (GLint colorIndex = 0; colorIndex < maxDrawBuffers; ++colorIndex)
2315*8975f5c5SAndroid Build Coastguard Worker     {
2316*8975f5c5SAndroid Build Coastguard Worker         strstr << "layout(location = " << colorIndex << ") out vec4 value" << colorIndex << ";\n";
2317*8975f5c5SAndroid Build Coastguard Worker     }
2318*8975f5c5SAndroid Build Coastguard Worker     strstr << "void main()\n"
2319*8975f5c5SAndroid Build Coastguard Worker               "{\n";
2320*8975f5c5SAndroid Build Coastguard Worker     for (GLint colorIndex = 0; colorIndex < maxDrawBuffers; ++colorIndex)
2321*8975f5c5SAndroid Build Coastguard Worker     {
2322*8975f5c5SAndroid Build Coastguard Worker         strstr << "value" << colorIndex << " = vec4(0.0f, 0.0f, 1.0f, 1.0f);\n";
2323*8975f5c5SAndroid Build Coastguard Worker     }
2324*8975f5c5SAndroid Build Coastguard Worker     strstr << "}\n";
2325*8975f5c5SAndroid Build Coastguard Worker 
2326*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawMRT, essl3_shaders::vs::Simple(), strstr.str().c_str());
2327*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawMRT, essl3_shaders::PositionAttrib(), 0.0f);
2328*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2329*8975f5c5SAndroid Build Coastguard Worker 
2330*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2331*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(1.0f);
2332*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0x55);
2333*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2334*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2335*8975f5c5SAndroid Build Coastguard Worker 
2336*8975f5c5SAndroid Build Coastguard Worker     // Verify that every color attachment is cleared correctly.
2337*8975f5c5SAndroid Build Coastguard Worker     for (GLint colorIndex = 0; colorIndex < maxDrawBuffers; ++colorIndex)
2338*8975f5c5SAndroid Build Coastguard Worker     {
2339*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0 + colorIndex);
2340*8975f5c5SAndroid Build Coastguard Worker 
2341*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red) << colorIndex;
2342*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red) << colorIndex;
2343*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red) << colorIndex;
2344*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red) << colorIndex;
2345*8975f5c5SAndroid Build Coastguard Worker     }
2346*8975f5c5SAndroid Build Coastguard Worker 
2347*8975f5c5SAndroid Build Coastguard Worker     // Verify that depth and stencil attachments are cleared correctly.
2348*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbVerify;
2349*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbVerify);
2350*8975f5c5SAndroid Build Coastguard Worker 
2351*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color[0]);
2352*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2353*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
2354*8975f5c5SAndroid Build Coastguard Worker 
2355*8975f5c5SAndroid Build Coastguard Worker     // If depth is not cleared to 1, rendering would fail.
2356*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
2357*8975f5c5SAndroid Build Coastguard Worker 
2358*8975f5c5SAndroid Build Coastguard Worker     // If stencil is not cleared to 0x55, rendering would fail.
2359*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x55, 0xFF);
2360*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2361*8975f5c5SAndroid Build Coastguard Worker 
2362*8975f5c5SAndroid Build Coastguard Worker     // Draw green.
2363*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2364*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.95f);
2365*8975f5c5SAndroid Build Coastguard Worker 
2366*8975f5c5SAndroid Build Coastguard Worker     // Verify that green was drawn.
2367*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2368*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
2369*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
2370*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
2371*8975f5c5SAndroid Build Coastguard Worker }
2372*8975f5c5SAndroid Build Coastguard Worker 
2373*8975f5c5SAndroid Build Coastguard Worker // Test that mixed masked clear works after clear.
TEST_P(ClearTestES3,ClearThenMixedMaskedClear)2374*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearThenMixedMaskedClear)
2375*8975f5c5SAndroid Build Coastguard Worker {
2376*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
2377*8975f5c5SAndroid Build Coastguard Worker 
2378*8975f5c5SAndroid Build Coastguard Worker     // Setup framebuffer.
2379*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer color;
2380*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, color);
2381*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
2382*8975f5c5SAndroid Build Coastguard Worker 
2383*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
2384*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
2385*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
2386*8975f5c5SAndroid Build Coastguard Worker 
2387*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
2388*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
2389*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color);
2390*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2391*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
2392*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2393*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2394*8975f5c5SAndroid Build Coastguard Worker 
2395*8975f5c5SAndroid Build Coastguard Worker     // Clear color and depth/stencil
2396*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.1f, 1.0f, 0.0f, 0.7f);
2397*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.0f);
2398*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0x55);
2399*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2400*8975f5c5SAndroid Build Coastguard Worker 
2401*8975f5c5SAndroid Build Coastguard Worker     // Clear again, but with color and stencil masked
2402*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.2f, 0.6f, 1.0f);
2403*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(1.0f);
2404*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0x3C);
2405*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE);
2406*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xF0);
2407*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2408*8975f5c5SAndroid Build Coastguard Worker 
2409*8975f5c5SAndroid Build Coastguard Worker     // Issue a draw call to verify color, depth and stencil.
2410*8975f5c5SAndroid Build Coastguard Worker 
2411*8975f5c5SAndroid Build Coastguard Worker     // If depth is not cleared to 1, rendering would fail.
2412*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
2413*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
2414*8975f5c5SAndroid Build Coastguard Worker 
2415*8975f5c5SAndroid Build Coastguard Worker     // If stencil is not cleared to 0x35, rendering would fail.
2416*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2417*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x35, 0xFF);
2418*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2419*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xFF);
2420*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
2421*8975f5c5SAndroid Build Coastguard Worker 
2422*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2423*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
2424*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
2425*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
2426*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
2427*8975f5c5SAndroid Build Coastguard Worker 
2428*8975f5c5SAndroid Build Coastguard Worker     // Blend half-transparent blue into the color buffer.
2429*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 0.5f);
2430*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
2431*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2432*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.95f);
2433*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2434*8975f5c5SAndroid Build Coastguard Worker 
2435*8975f5c5SAndroid Build Coastguard Worker     // Verify that the color buffer is now gray
2436*8975f5c5SAndroid Build Coastguard Worker     const GLColor kExpected(127, 127, 127, 191);
2437*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
2438*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, kSize - 1, kExpected, 1);
2439*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(kSize - 1, 0, kExpected, 1);
2440*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(kSize - 1, kSize - 1, kExpected, 1);
2441*8975f5c5SAndroid Build Coastguard Worker }
2442*8975f5c5SAndroid Build Coastguard Worker 
2443*8975f5c5SAndroid Build Coastguard Worker // Test that clearing stencil after a draw call works.
TEST_P(ClearTestES3,ClearStencilAfterDraw)2444*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearStencilAfterDraw)
2445*8975f5c5SAndroid Build Coastguard Worker {
2446*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40644728
2447*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
2448*8975f5c5SAndroid Build Coastguard Worker 
2449*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
2450*8975f5c5SAndroid Build Coastguard Worker 
2451*8975f5c5SAndroid Build Coastguard Worker     GLint maxDrawBuffers = 0;
2452*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
2453*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(maxDrawBuffers, 4);
2454*8975f5c5SAndroid Build Coastguard Worker 
2455*8975f5c5SAndroid Build Coastguard Worker     // Setup framebuffer.
2456*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
2457*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
2458*8975f5c5SAndroid Build Coastguard Worker 
2459*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLRenderbuffer> color(maxDrawBuffers);
2460*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> drawBuffers(maxDrawBuffers);
2461*8975f5c5SAndroid Build Coastguard Worker 
2462*8975f5c5SAndroid Build Coastguard Worker     for (GLint colorIndex = 0; colorIndex < maxDrawBuffers; ++colorIndex)
2463*8975f5c5SAndroid Build Coastguard Worker     {
2464*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, color[colorIndex]);
2465*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
2466*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorIndex,
2467*8975f5c5SAndroid Build Coastguard Worker                                   GL_RENDERBUFFER, color[colorIndex]);
2468*8975f5c5SAndroid Build Coastguard Worker 
2469*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[colorIndex] = GL_COLOR_ATTACHMENT0 + colorIndex;
2470*8975f5c5SAndroid Build Coastguard Worker     }
2471*8975f5c5SAndroid Build Coastguard Worker 
2472*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
2473*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
2474*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSize, kSize);
2475*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2476*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
2477*8975f5c5SAndroid Build Coastguard Worker 
2478*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2479*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2480*8975f5c5SAndroid Build Coastguard Worker 
2481*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(maxDrawBuffers, drawBuffers.data());
2482*8975f5c5SAndroid Build Coastguard Worker 
2483*8975f5c5SAndroid Build Coastguard Worker     // Issue a draw call to render blue and stencil 0x3C to the attachments.
2484*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2485*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_ALWAYS, 0x3C, 0xFF);
2486*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
2487*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xFF);
2488*8975f5c5SAndroid Build Coastguard Worker 
2489*8975f5c5SAndroid Build Coastguard Worker     // Generate shader for this framebuffer.
2490*8975f5c5SAndroid Build Coastguard Worker     std::stringstream strstr;
2491*8975f5c5SAndroid Build Coastguard Worker     strstr << "#version 300 es\n"
2492*8975f5c5SAndroid Build Coastguard Worker               "precision highp float;\n";
2493*8975f5c5SAndroid Build Coastguard Worker     for (GLint colorIndex = 0; colorIndex < maxDrawBuffers; ++colorIndex)
2494*8975f5c5SAndroid Build Coastguard Worker     {
2495*8975f5c5SAndroid Build Coastguard Worker         strstr << "layout(location = " << colorIndex << ") out vec4 value" << colorIndex << ";\n";
2496*8975f5c5SAndroid Build Coastguard Worker     }
2497*8975f5c5SAndroid Build Coastguard Worker     strstr << "void main()\n"
2498*8975f5c5SAndroid Build Coastguard Worker               "{\n";
2499*8975f5c5SAndroid Build Coastguard Worker     for (GLint colorIndex = 0; colorIndex < maxDrawBuffers; ++colorIndex)
2500*8975f5c5SAndroid Build Coastguard Worker     {
2501*8975f5c5SAndroid Build Coastguard Worker         strstr << "value" << colorIndex << " = vec4(0.0f, 0.0f, 1.0f, 1.0f);\n";
2502*8975f5c5SAndroid Build Coastguard Worker     }
2503*8975f5c5SAndroid Build Coastguard Worker     strstr << "}\n";
2504*8975f5c5SAndroid Build Coastguard Worker 
2505*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawMRT, essl3_shaders::vs::Simple(), strstr.str().c_str());
2506*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawMRT, essl3_shaders::PositionAttrib(), 0.0f);
2507*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2508*8975f5c5SAndroid Build Coastguard Worker 
2509*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2510*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0x55);
2511*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2512*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2513*8975f5c5SAndroid Build Coastguard Worker 
2514*8975f5c5SAndroid Build Coastguard Worker     // Verify that every color attachment is cleared correctly.
2515*8975f5c5SAndroid Build Coastguard Worker     for (GLint colorIndex = 0; colorIndex < maxDrawBuffers; ++colorIndex)
2516*8975f5c5SAndroid Build Coastguard Worker     {
2517*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0 + colorIndex);
2518*8975f5c5SAndroid Build Coastguard Worker 
2519*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2520*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red);
2521*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red);
2522*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red);
2523*8975f5c5SAndroid Build Coastguard Worker     }
2524*8975f5c5SAndroid Build Coastguard Worker 
2525*8975f5c5SAndroid Build Coastguard Worker     // Verify that depth and stencil attachments are cleared correctly.
2526*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbVerify;
2527*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbVerify);
2528*8975f5c5SAndroid Build Coastguard Worker 
2529*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color[0]);
2530*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
2531*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
2532*8975f5c5SAndroid Build Coastguard Worker 
2533*8975f5c5SAndroid Build Coastguard Worker     // If stencil is not cleared to 0x55, rendering would fail.
2534*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x55, 0xFF);
2535*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2536*8975f5c5SAndroid Build Coastguard Worker 
2537*8975f5c5SAndroid Build Coastguard Worker     // Draw green.
2538*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2539*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.95f);
2540*8975f5c5SAndroid Build Coastguard Worker 
2541*8975f5c5SAndroid Build Coastguard Worker     // Verify that green was drawn.
2542*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2543*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
2544*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
2545*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
2546*8975f5c5SAndroid Build Coastguard Worker }
2547*8975f5c5SAndroid Build Coastguard Worker 
2548*8975f5c5SAndroid Build Coastguard Worker // Test that mid-render pass clearing of mixed used and unused color attachments works.
TEST_P(ClearTestES3,MixedRenderPassClearMixedUsedUnusedAttachments)2549*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, MixedRenderPassClearMixedUsedUnusedAttachments)
2550*8975f5c5SAndroid Build Coastguard Worker {
2551*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/40644728
2552*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
2553*8975f5c5SAndroid Build Coastguard Worker 
2554*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
2555*8975f5c5SAndroid Build Coastguard Worker 
2556*8975f5c5SAndroid Build Coastguard Worker     // Setup framebuffer.
2557*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
2558*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
2559*8975f5c5SAndroid Build Coastguard Worker 
2560*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer color[2];
2561*8975f5c5SAndroid Build Coastguard Worker 
2562*8975f5c5SAndroid Build Coastguard Worker     for (GLint colorIndex = 0; colorIndex < 2; ++colorIndex)
2563*8975f5c5SAndroid Build Coastguard Worker     {
2564*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, color[colorIndex]);
2565*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
2566*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorIndex,
2567*8975f5c5SAndroid Build Coastguard Worker                                   GL_RENDERBUFFER, color[colorIndex]);
2568*8975f5c5SAndroid Build Coastguard Worker     }
2569*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2570*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2571*8975f5c5SAndroid Build Coastguard Worker 
2572*8975f5c5SAndroid Build Coastguard Worker     // Disable color attachment 0.
2573*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[] = {GL_NONE, GL_COLOR_ATTACHMENT1};
2574*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(2, drawBuffers);
2575*8975f5c5SAndroid Build Coastguard Worker 
2576*8975f5c5SAndroid Build Coastguard Worker     // Draw into color attachment 1
2577*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
2578*8975f5c5SAndroid Build Coastguard Worker precision highp float;
2579*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 color0;
2580*8975f5c5SAndroid Build Coastguard Worker layout(location = 1) out vec4 color1;
2581*8975f5c5SAndroid Build Coastguard Worker void main()
2582*8975f5c5SAndroid Build Coastguard Worker {
2583*8975f5c5SAndroid Build Coastguard Worker     color0 = vec4(0, 0, 1, 1);
2584*8975f5c5SAndroid Build Coastguard Worker     color1 = vec4(1, 0, 0, 1);
2585*8975f5c5SAndroid Build Coastguard Worker })";
2586*8975f5c5SAndroid Build Coastguard Worker 
2587*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawMRT, essl3_shaders::vs::Simple(), kFS);
2588*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawMRT, essl3_shaders::PositionAttrib(), 0.0f);
2589*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2590*8975f5c5SAndroid Build Coastguard Worker 
2591*8975f5c5SAndroid Build Coastguard Worker     // Color attachment 0 is now uninitialized, while color attachment 1 is red.
2592*8975f5c5SAndroid Build Coastguard Worker     // Re-enable color attachment 0 and clear both attachments to green.
2593*8975f5c5SAndroid Build Coastguard Worker     drawBuffers[0] = GL_COLOR_ATTACHMENT0;
2594*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(2, drawBuffers);
2595*8975f5c5SAndroid Build Coastguard Worker 
2596*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2597*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2598*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2599*8975f5c5SAndroid Build Coastguard Worker 
2600*8975f5c5SAndroid Build Coastguard Worker     // Verify that both color attachments are now green.
2601*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT0);
2602*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2603*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT1);
2604*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2605*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2606*8975f5c5SAndroid Build Coastguard Worker }
2607*8975f5c5SAndroid Build Coastguard Worker 
2608*8975f5c5SAndroid Build Coastguard Worker // Test that draw without state change after masked clear works
TEST_P(ClearTestES3,DrawClearThenDrawWithoutStateChange)2609*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, DrawClearThenDrawWithoutStateChange)
2610*8975f5c5SAndroid Build Coastguard Worker {
2611*8975f5c5SAndroid Build Coastguard Worker     swapBuffers();
2612*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
2613*8975f5c5SAndroid Build Coastguard Worker 
2614*8975f5c5SAndroid Build Coastguard Worker     // Setup framebuffer.
2615*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer color;
2616*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, color);
2617*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
2618*8975f5c5SAndroid Build Coastguard Worker 
2619*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
2620*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
2621*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color);
2622*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2623*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2624*8975f5c5SAndroid Build Coastguard Worker 
2625*8975f5c5SAndroid Build Coastguard Worker     // Clear color initially.
2626*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
2627*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2628*8975f5c5SAndroid Build Coastguard Worker 
2629*8975f5c5SAndroid Build Coastguard Worker     // Mask color.
2630*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
2631*8975f5c5SAndroid Build Coastguard Worker 
2632*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2633*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
2634*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
2635*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
2636*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
2637*8975f5c5SAndroid Build Coastguard Worker 
2638*8975f5c5SAndroid Build Coastguard Worker     // Initialize position attribute.
2639*8975f5c5SAndroid Build Coastguard Worker     GLint posLoc = glGetAttribLocation(drawColor, essl1_shaders::PositionAttrib());
2640*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, posLoc);
2641*8975f5c5SAndroid Build Coastguard Worker     setupQuadVertexBuffer(0.5f, 1.0f);
2642*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
2643*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(posLoc);
2644*8975f5c5SAndroid Build Coastguard Worker 
2645*8975f5c5SAndroid Build Coastguard Worker     // Draw red.
2646*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
2647*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
2648*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 0.5f);
2649*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
2650*8975f5c5SAndroid Build Coastguard Worker 
2651*8975f5c5SAndroid Build Coastguard Worker     // Clear to green without any state change.
2652*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2653*8975f5c5SAndroid Build Coastguard Worker 
2654*8975f5c5SAndroid Build Coastguard Worker     // Draw red again without any state change.
2655*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
2656*8975f5c5SAndroid Build Coastguard Worker 
2657*8975f5c5SAndroid Build Coastguard Worker     // Verify that the color buffer is now red
2658*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2659*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::red);
2660*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::red);
2661*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::red);
2662*8975f5c5SAndroid Build Coastguard Worker }
2663*8975f5c5SAndroid Build Coastguard Worker 
2664*8975f5c5SAndroid Build Coastguard Worker // Test that clear stencil value is correctly masked to 8 bits.
TEST_P(ClearTest,ClearStencilMask)2665*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, ClearStencilMask)
2666*8975f5c5SAndroid Build Coastguard Worker {
2667*8975f5c5SAndroid Build Coastguard Worker     GLint stencilBits = 0;
2668*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_STENCIL_BITS, &stencilBits);
2669*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(stencilBits, 8);
2670*8975f5c5SAndroid Build Coastguard Worker 
2671*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2672*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
2673*8975f5c5SAndroid Build Coastguard Worker 
2674*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 1);
2675*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2676*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2677*8975f5c5SAndroid Build Coastguard Worker 
2678*8975f5c5SAndroid Build Coastguard Worker     // Clear stencil value must be masked to 0x42
2679*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0x142);
2680*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_STENCIL_BUFFER_BIT);
2681*8975f5c5SAndroid Build Coastguard Worker 
2682*8975f5c5SAndroid Build Coastguard Worker     // Check that the stencil test works as expected
2683*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2684*8975f5c5SAndroid Build Coastguard Worker 
2685*8975f5c5SAndroid Build Coastguard Worker     // Negative case
2686*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_NOTEQUAL, 0x42, 0xFF);
2687*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2688*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2689*8975f5c5SAndroid Build Coastguard Worker 
2690*8975f5c5SAndroid Build Coastguard Worker     // Positive case
2691*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x42, 0xFF);
2692*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2693*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2694*8975f5c5SAndroid Build Coastguard Worker 
2695*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2696*8975f5c5SAndroid Build Coastguard Worker }
2697*8975f5c5SAndroid Build Coastguard Worker 
2698*8975f5c5SAndroid Build Coastguard Worker // Test that glClearBufferiv correctly masks the clear stencil value.
TEST_P(ClearTestES3,ClearBufferivStencilMask)2699*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearBufferivStencilMask)
2700*8975f5c5SAndroid Build Coastguard Worker {
2701*8975f5c5SAndroid Build Coastguard Worker     GLint stencilBits = 0;
2702*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_STENCIL_BITS, &stencilBits);
2703*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(stencilBits, 8);
2704*8975f5c5SAndroid Build Coastguard Worker 
2705*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2706*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
2707*8975f5c5SAndroid Build Coastguard Worker 
2708*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 1);
2709*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2710*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2711*8975f5c5SAndroid Build Coastguard Worker 
2712*8975f5c5SAndroid Build Coastguard Worker     // Clear stencil value must be masked to 0x42
2713*8975f5c5SAndroid Build Coastguard Worker     const GLint kStencilClearValue = 0x142;
2714*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_STENCIL, 0, &kStencilClearValue);
2715*8975f5c5SAndroid Build Coastguard Worker 
2716*8975f5c5SAndroid Build Coastguard Worker     // Check that the stencil test works as expected
2717*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2718*8975f5c5SAndroid Build Coastguard Worker 
2719*8975f5c5SAndroid Build Coastguard Worker     // Negative case
2720*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_NOTEQUAL, 0x42, 0xFF);
2721*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2722*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2723*8975f5c5SAndroid Build Coastguard Worker 
2724*8975f5c5SAndroid Build Coastguard Worker     // Positive case
2725*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x42, 0xFF);
2726*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2727*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2728*8975f5c5SAndroid Build Coastguard Worker 
2729*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2730*8975f5c5SAndroid Build Coastguard Worker }
2731*8975f5c5SAndroid Build Coastguard Worker 
2732*8975f5c5SAndroid Build Coastguard Worker // Test that glClearBufferfi correctly masks the clear stencil value.
TEST_P(ClearTestES3,ClearBufferfiStencilMask)2733*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearBufferfiStencilMask)
2734*8975f5c5SAndroid Build Coastguard Worker {
2735*8975f5c5SAndroid Build Coastguard Worker     GLint stencilBits = 0;
2736*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_STENCIL_BITS, &stencilBits);
2737*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(stencilBits, 8);
2738*8975f5c5SAndroid Build Coastguard Worker 
2739*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2740*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
2741*8975f5c5SAndroid Build Coastguard Worker 
2742*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 1);
2743*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2744*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2745*8975f5c5SAndroid Build Coastguard Worker 
2746*8975f5c5SAndroid Build Coastguard Worker     // Clear stencil value must be masked to 0x42
2747*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfi(GL_DEPTH_STENCIL, 0, 0.5f, 0x142);
2748*8975f5c5SAndroid Build Coastguard Worker 
2749*8975f5c5SAndroid Build Coastguard Worker     // Check that the stencil test works as expected
2750*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2751*8975f5c5SAndroid Build Coastguard Worker 
2752*8975f5c5SAndroid Build Coastguard Worker     // Negative case
2753*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_NOTEQUAL, 0x42, 0xFF);
2754*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2755*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2756*8975f5c5SAndroid Build Coastguard Worker 
2757*8975f5c5SAndroid Build Coastguard Worker     // Positive case
2758*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x42, 0xFF);
2759*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
2760*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2761*8975f5c5SAndroid Build Coastguard Worker 
2762*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2763*8975f5c5SAndroid Build Coastguard Worker }
2764*8975f5c5SAndroid Build Coastguard Worker 
2765*8975f5c5SAndroid Build Coastguard Worker // Test that glClearBufferfi works when stencil attachment is not present.
TEST_P(ClearTestES3,ClearBufferfiNoStencilAttachment)2766*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearBufferfiNoStencilAttachment)
2767*8975f5c5SAndroid Build Coastguard Worker {
2768*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
2769*8975f5c5SAndroid Build Coastguard Worker 
2770*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer color;
2771*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, color);
2772*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
2773*8975f5c5SAndroid Build Coastguard Worker 
2774*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depth;
2775*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depth);
2776*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, kSize, kSize);
2777*8975f5c5SAndroid Build Coastguard Worker 
2778*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2779*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2780*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color);
2781*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth);
2782*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2783*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2784*8975f5c5SAndroid Build Coastguard Worker 
2785*8975f5c5SAndroid Build Coastguard Worker     // Clear depth/stencil with glClearBufferfi.  Note that the stencil attachment doesn't exist.
2786*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfi(GL_DEPTH_STENCIL, 0, 0.5f, 0x55);
2787*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2788*8975f5c5SAndroid Build Coastguard Worker 
2789*8975f5c5SAndroid Build Coastguard Worker     // Verify depth is cleared correctly.
2790*8975f5c5SAndroid Build Coastguard Worker     verifyDepth(0.5f, kSize);
2791*8975f5c5SAndroid Build Coastguard Worker }
2792*8975f5c5SAndroid Build Coastguard Worker 
2793*8975f5c5SAndroid Build Coastguard Worker // Test that scissored clear followed by non-scissored draw works.  Ensures that when scissor size
2794*8975f5c5SAndroid Build Coastguard Worker // is expanded, the clear operation remains limited to the scissor region.  Written to catch
2795*8975f5c5SAndroid Build Coastguard Worker // potential future bugs if loadOp=CLEAR is used in the Vulkan backend for a small render pass and
2796*8975f5c5SAndroid Build Coastguard Worker // then the render area is mistakenly enlarged.
TEST_P(ClearTest,ScissoredClearThenNonScissoredDraw)2797*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, ScissoredClearThenNonScissoredDraw)
2798*8975f5c5SAndroid Build Coastguard Worker {
2799*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
2800*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kInitialData(kSize * kSize, GLColor::red);
2801*8975f5c5SAndroid Build Coastguard Worker 
2802*8975f5c5SAndroid Build Coastguard Worker     // Setup framebuffer.  Initialize color with red.
2803*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
2804*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
2805*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2806*8975f5c5SAndroid Build Coastguard Worker                  kInitialData.data());
2807*8975f5c5SAndroid Build Coastguard Worker 
2808*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
2809*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
2810*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
2811*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2812*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2813*8975f5c5SAndroid Build Coastguard Worker 
2814*8975f5c5SAndroid Build Coastguard Worker     // Issue a scissored clear to green.
2815*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2816*8975f5c5SAndroid Build Coastguard Worker     glScissor(kSize / 2, 0, kSize / 2, kSize);
2817*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
2818*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2819*8975f5c5SAndroid Build Coastguard Worker 
2820*8975f5c5SAndroid Build Coastguard Worker     // Expand the scissor and blend blue into the framebuffer.
2821*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kSize, kSize);
2822*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
2823*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
2824*8975f5c5SAndroid Build Coastguard Worker 
2825*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawBlue, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
2826*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawBlue, essl1_shaders::PositionAttrib(), 0.5f);
2827*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2828*8975f5c5SAndroid Build Coastguard Worker 
2829*8975f5c5SAndroid Build Coastguard Worker     // Verify that the left half is magenta, and the right half is cyan.
2830*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::magenta);
2831*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize / 2 - 1, 0, GLColor::magenta);
2832*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::magenta);
2833*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize / 2 - 1, kSize - 1, GLColor::magenta);
2834*8975f5c5SAndroid Build Coastguard Worker 
2835*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize / 2, 0, GLColor::cyan);
2836*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize / 2, kSize - 1, GLColor::cyan);
2837*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::cyan);
2838*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::cyan);
2839*8975f5c5SAndroid Build Coastguard Worker }
2840*8975f5c5SAndroid Build Coastguard Worker 
2841*8975f5c5SAndroid Build Coastguard Worker // Test that clear followed by a scissored masked clear works.
TEST_P(ClearTest,ClearThenScissoredMaskedClear)2842*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, ClearThenScissoredMaskedClear)
2843*8975f5c5SAndroid Build Coastguard Worker {
2844*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 16;
2845*8975f5c5SAndroid Build Coastguard Worker 
2846*8975f5c5SAndroid Build Coastguard Worker     // Setup framebuffer
2847*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
2848*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
2849*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2850*8975f5c5SAndroid Build Coastguard Worker 
2851*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
2852*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
2853*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
2854*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2855*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2856*8975f5c5SAndroid Build Coastguard Worker 
2857*8975f5c5SAndroid Build Coastguard Worker     // Clear to red.
2858*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2859*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2860*8975f5c5SAndroid Build Coastguard Worker 
2861*8975f5c5SAndroid Build Coastguard Worker     // Mask red and clear to green with a scissor
2862*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
2863*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kSize / 2, kSize);
2864*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
2865*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
2866*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2867*8975f5c5SAndroid Build Coastguard Worker 
2868*8975f5c5SAndroid Build Coastguard Worker     // Verify that the left half is yellow, and the right half is red.
2869*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize / 2, kSize, GLColor::yellow);
2870*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kSize / 2, 0, kSize / 2, kSize, GLColor::red);
2871*8975f5c5SAndroid Build Coastguard Worker }
2872*8975f5c5SAndroid Build Coastguard Worker 
2873*8975f5c5SAndroid Build Coastguard Worker // Test that a scissored stencil clear followed by a full clear works.
TEST_P(ClearTestES3,StencilScissoredClearThenFullClear)2874*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, StencilScissoredClearThenFullClear)
2875*8975f5c5SAndroid Build Coastguard Worker {
2876*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 128;
2877*8975f5c5SAndroid Build Coastguard Worker 
2878*8975f5c5SAndroid Build Coastguard Worker     GLint stencilBits = 0;
2879*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_STENCIL_BITS, &stencilBits);
2880*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(stencilBits, 8);
2881*8975f5c5SAndroid Build Coastguard Worker 
2882*8975f5c5SAndroid Build Coastguard Worker     // Clear stencil value must be masked to 0x42
2883*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfi(GL_DEPTH_STENCIL, 0, 0.5f, 0x142);
2884*8975f5c5SAndroid Build Coastguard Worker 
2885*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
2886*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2887*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2888*8975f5c5SAndroid Build Coastguard Worker 
2889*8975f5c5SAndroid Build Coastguard Worker     // Shrink the render area.
2890*8975f5c5SAndroid Build Coastguard Worker     glScissor(kSize / 2, 0, kSize / 2, kSize);
2891*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
2892*8975f5c5SAndroid Build Coastguard Worker 
2893*8975f5c5SAndroid Build Coastguard Worker     // Clear stencil.
2894*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfi(GL_DEPTH_STENCIL, 0, 0.5f, 0x64);
2895*8975f5c5SAndroid Build Coastguard Worker 
2896*8975f5c5SAndroid Build Coastguard Worker     // Grow the render area.
2897*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kSize, kSize);
2898*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
2899*8975f5c5SAndroid Build Coastguard Worker 
2900*8975f5c5SAndroid Build Coastguard Worker     // Check that the stencil test works as expected
2901*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
2902*8975f5c5SAndroid Build Coastguard Worker 
2903*8975f5c5SAndroid Build Coastguard Worker     // Scissored region is green, outside is red (clear color)
2904*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x64, 0xFF);
2905*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
2906*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawGreen);
2907*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl3_shaders::PositionAttrib(), 0.5f);
2908*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize / 2, kSize, GLColor::red);
2909*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kSize / 2, 0, kSize / 2, kSize, GLColor::green);
2910*8975f5c5SAndroid Build Coastguard Worker 
2911*8975f5c5SAndroid Build Coastguard Worker     // Outside scissored region is blue.
2912*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x42, 0xFF);
2913*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
2914*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawBlue);
2915*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawBlue, essl3_shaders::PositionAttrib(), 0.5f);
2916*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize / 2, kSize, GLColor::blue);
2917*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kSize / 2, 0, kSize / 2, kSize, GLColor::green);
2918*8975f5c5SAndroid Build Coastguard Worker 
2919*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2920*8975f5c5SAndroid Build Coastguard Worker }
2921*8975f5c5SAndroid Build Coastguard Worker 
2922*8975f5c5SAndroid Build Coastguard Worker // This is a test that must be verified visually.
2923*8975f5c5SAndroid Build Coastguard Worker //
2924*8975f5c5SAndroid Build Coastguard Worker // Tests that clear of the default framebuffer applies to the window.
TEST_P(ClearTest,DISABLED_ClearReachesWindow)2925*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, DISABLED_ClearReachesWindow)
2926*8975f5c5SAndroid Build Coastguard Worker {
2927*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
2928*8975f5c5SAndroid Build Coastguard Worker 
2929*8975f5c5SAndroid Build Coastguard Worker     // Draw blue.
2930*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f);
2931*8975f5c5SAndroid Build Coastguard Worker     swapBuffers();
2932*8975f5c5SAndroid Build Coastguard Worker 
2933*8975f5c5SAndroid Build Coastguard Worker     // Use glClear to clear to red.  Regression test for the Vulkan backend where this clear
2934*8975f5c5SAndroid Build Coastguard Worker     // remained "deferred" and didn't make it to the window on swap.
2935*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2936*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2937*8975f5c5SAndroid Build Coastguard Worker     swapBuffers();
2938*8975f5c5SAndroid Build Coastguard Worker 
2939*8975f5c5SAndroid Build Coastguard Worker     // Wait for visual verification.
2940*8975f5c5SAndroid Build Coastguard Worker     angle::Sleep(2000);
2941*8975f5c5SAndroid Build Coastguard Worker }
2942*8975f5c5SAndroid Build Coastguard Worker 
2943*8975f5c5SAndroid Build Coastguard Worker // Tests that masked clear after a no-op framebuffer binding change with an open render pass works.
TEST_P(ClearTest,DrawThenChangeFBOBindingAndBackThenMaskedClear)2944*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTest, DrawThenChangeFBOBindingAndBackThenMaskedClear)
2945*8975f5c5SAndroid Build Coastguard Worker {
2946*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
2947*8975f5c5SAndroid Build Coastguard Worker 
2948*8975f5c5SAndroid Build Coastguard Worker     // Draw blue.
2949*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f);
2950*8975f5c5SAndroid Build Coastguard Worker 
2951*8975f5c5SAndroid Build Coastguard Worker     // Change framebuffer and back
2952*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]);
2953*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
2954*8975f5c5SAndroid Build Coastguard Worker 
2955*8975f5c5SAndroid Build Coastguard Worker     // Masked clear
2956*8975f5c5SAndroid Build Coastguard Worker     glColorMask(1, 0, 0, 1);
2957*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.5f, 0.5f, 1.0f);
2958*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2959*8975f5c5SAndroid Build Coastguard Worker 
2960*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::magenta);
2961*8975f5c5SAndroid Build Coastguard Worker }
2962*8975f5c5SAndroid Build Coastguard Worker 
2963*8975f5c5SAndroid Build Coastguard Worker // Test that clearing slices of a 3D texture and reading them back works.
TEST_P(ClearTestES3,ClearAndReadPixels3DTexture)2964*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearAndReadPixels3DTexture)
2965*8975f5c5SAndroid Build Coastguard Worker {
2966*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kWidth  = 128;
2967*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kHeight = 128;
2968*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kDepth  = 7;
2969*8975f5c5SAndroid Build Coastguard Worker 
2970*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
2971*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, texture);
2972*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, kWidth, kHeight, kDepth);
2973*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
2974*8975f5c5SAndroid Build Coastguard Worker 
2975*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kDepth> clearColors = {
2976*8975f5c5SAndroid Build Coastguard Worker         GLColor::red,  GLColor::green,   GLColor::blue,  GLColor::yellow,
2977*8975f5c5SAndroid Build Coastguard Worker         GLColor::cyan, GLColor::magenta, GLColor::white,
2978*8975f5c5SAndroid Build Coastguard Worker     };
2979*8975f5c5SAndroid Build Coastguard Worker 
2980*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
2981*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
2982*8975f5c5SAndroid Build Coastguard Worker 
2983*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = 0; z < kDepth; ++z)
2984*8975f5c5SAndroid Build Coastguard Worker     {
2985*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0, z);
2986*8975f5c5SAndroid Build Coastguard Worker         glClearBufferfv(GL_COLOR, 0, clearColors[z].toNormalizedVector().data());
2987*8975f5c5SAndroid Build Coastguard Worker     }
2988*8975f5c5SAndroid Build Coastguard Worker 
2989*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = 0; z < kDepth; ++z)
2990*8975f5c5SAndroid Build Coastguard Worker     {
2991*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0, z);
2992*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, clearColors[z]);
2993*8975f5c5SAndroid Build Coastguard Worker     }
2994*8975f5c5SAndroid Build Coastguard Worker }
2995*8975f5c5SAndroid Build Coastguard Worker 
2996*8975f5c5SAndroid Build Coastguard Worker // Test that clearing stencil with zero first byte in mask doesn't crash.
TEST_P(ClearTestES3,ClearStencilZeroFirstByteMask)2997*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearStencilZeroFirstByteMask)
2998*8975f5c5SAndroid Build Coastguard Worker {
2999*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xe7d6a900);
3000*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_STENCIL_BUFFER_BIT);
3001*8975f5c5SAndroid Build Coastguard Worker }
3002*8975f5c5SAndroid Build Coastguard Worker 
3003*8975f5c5SAndroid Build Coastguard Worker // Same test as ClearStencilZeroFirstByteMask, but using glClearBufferiv.
TEST_P(ClearTestES3,ClearBufferStencilZeroFirstByteMask)3004*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ClearBufferStencilZeroFirstByteMask)
3005*8975f5c5SAndroid Build Coastguard Worker {
3006*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xe7d6a900);
3007*8975f5c5SAndroid Build Coastguard Worker     const GLint kStencilClearValue = 0x55;
3008*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_STENCIL, 0, &kStencilClearValue);
3009*8975f5c5SAndroid Build Coastguard Worker }
3010*8975f5c5SAndroid Build Coastguard Worker 
3011*8975f5c5SAndroid Build Coastguard Worker // Test that mid render pass clear after draw sets the render pass size correctly.
TEST_P(ClearTestES3,ScissoredDrawThenFullClear)3012*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, ScissoredDrawThenFullClear)
3013*8975f5c5SAndroid Build Coastguard Worker {
3014*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth();
3015*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight();
3016*8975f5c5SAndroid Build Coastguard Worker 
3017*8975f5c5SAndroid Build Coastguard Worker     // Use viewport to imply scissor on the draw call
3018*8975f5c5SAndroid Build Coastguard Worker     glViewport(w / 4, h / 4, w / 2, h / 2);
3019*8975f5c5SAndroid Build Coastguard Worker 
3020*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
3021*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
3022*8975f5c5SAndroid Build Coastguard Worker 
3023*8975f5c5SAndroid Build Coastguard Worker     // Mid-render-pass clear without scissor or viewport change, which covers the whole framebuffer.
3024*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 1, 0, 1);
3025*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3026*8975f5c5SAndroid Build Coastguard Worker 
3027*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::yellow);
3028*8975f5c5SAndroid Build Coastguard Worker }
3029*8975f5c5SAndroid Build Coastguard Worker 
3030*8975f5c5SAndroid Build Coastguard Worker // Test that mid render pass clear after masked clear sets the render pass size correctly.
TEST_P(ClearTestES3,MaskedScissoredClearThenFullClear)3031*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, MaskedScissoredClearThenFullClear)
3032*8975f5c5SAndroid Build Coastguard Worker {
3033*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth();
3034*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight();
3035*8975f5c5SAndroid Build Coastguard Worker 
3036*8975f5c5SAndroid Build Coastguard Worker     // Use viewport to imply a small scissor on (non-existing) draw calls.  This is important to
3037*8975f5c5SAndroid Build Coastguard Worker     // make sure render area that's derived from scissor+viewport for draw calls doesn't
3038*8975f5c5SAndroid Build Coastguard Worker     // accidentally fix render area derived from scissor for clear calls.
3039*8975f5c5SAndroid Build Coastguard Worker     glViewport(w / 2, h / 2, 1, 1);
3040*8975f5c5SAndroid Build Coastguard Worker 
3041*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
3042*8975f5c5SAndroid Build Coastguard Worker     glScissor(w / 4, h / 4, w / 2, h / 2);
3043*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE);
3044*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.13, 0.38, 0.87, 0.65);
3045*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3046*8975f5c5SAndroid Build Coastguard Worker 
3047*8975f5c5SAndroid Build Coastguard Worker     // Mid-render-pass clear without scissor, which covers the whole framebuffer.
3048*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
3049*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
3050*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 1, 0, 1);
3051*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3052*8975f5c5SAndroid Build Coastguard Worker 
3053*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::yellow);
3054*8975f5c5SAndroid Build Coastguard Worker }
3055*8975f5c5SAndroid Build Coastguard Worker 
3056*8975f5c5SAndroid Build Coastguard Worker // Test that mid render pass masked clear after masked clear sets the render pass size correctly.
TEST_P(ClearTestES3,MaskedScissoredClearThenFullMaskedClear)3057*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, MaskedScissoredClearThenFullMaskedClear)
3058*8975f5c5SAndroid Build Coastguard Worker {
3059*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth();
3060*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight();
3061*8975f5c5SAndroid Build Coastguard Worker 
3062*8975f5c5SAndroid Build Coastguard Worker     // Make sure the framebuffer is initialized.
3063*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 1);
3064*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3065*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
3066*8975f5c5SAndroid Build Coastguard Worker 
3067*8975f5c5SAndroid Build Coastguard Worker     // Use viewport to imply a small scissor on (non-existing) draw calls  This is important to
3068*8975f5c5SAndroid Build Coastguard Worker     // make sure render area that's derived from scissor+viewport for draw calls doesn't
3069*8975f5c5SAndroid Build Coastguard Worker     // accidentally fix render area derived from scissor for clear calls.
3070*8975f5c5SAndroid Build Coastguard Worker     glViewport(w / 2, h / 2, 1, 1);
3071*8975f5c5SAndroid Build Coastguard Worker 
3072*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
3073*8975f5c5SAndroid Build Coastguard Worker     glScissor(w / 4, h / 4, w / 2, h / 2);
3074*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE);
3075*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 1, 0, 1);
3076*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3077*8975f5c5SAndroid Build Coastguard Worker 
3078*8975f5c5SAndroid Build Coastguard Worker     // Mid-render-pass clear without scissor, which covers the whole framebuffer.
3079*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
3080*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_TRUE);
3081*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 1, 1, 1);
3082*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3083*8975f5c5SAndroid Build Coastguard Worker 
3084*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, w / 4, h, GLColor::green);
3085*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(w / 4, 0, w / 2, h / 4, GLColor::green);
3086*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(w / 4, 3 * h / 4, w / 2, h / 4, GLColor::green);
3087*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(3 * w / 4, 0, w / 4, h, GLColor::green);
3088*8975f5c5SAndroid Build Coastguard Worker 
3089*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(w / 4, h / 4, w / 2, h / 2, GLColor::yellow);
3090*8975f5c5SAndroid Build Coastguard Worker }
3091*8975f5c5SAndroid Build Coastguard Worker 
3092*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing color to the same value works.
TEST_P(ClearTestES3,RepeatedColorClear)3093*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedColorClear)
3094*8975f5c5SAndroid Build Coastguard Worker {
3095*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 1, 0, 1);
3096*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3097*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
3098*8975f5c5SAndroid Build Coastguard Worker 
3099*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3100*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
3101*8975f5c5SAndroid Build Coastguard Worker 
3102*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3103*8975f5c5SAndroid Build Coastguard Worker }
3104*8975f5c5SAndroid Build Coastguard Worker 
3105*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing depth to the same value works.
TEST_P(ClearTestES3,RepeatedDepthClear)3106*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedDepthClear)
3107*8975f5c5SAndroid Build Coastguard Worker {
3108*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.25f);
3109*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT);
3110*8975f5c5SAndroid Build Coastguard Worker 
3111*8975f5c5SAndroid Build Coastguard Worker     verifyDepth(0.25f, 1);
3112*8975f5c5SAndroid Build Coastguard Worker 
3113*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT);
3114*8975f5c5SAndroid Build Coastguard Worker 
3115*8975f5c5SAndroid Build Coastguard Worker     verifyDepth(0.25f, 1);
3116*8975f5c5SAndroid Build Coastguard Worker 
3117*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3118*8975f5c5SAndroid Build Coastguard Worker }
3119*8975f5c5SAndroid Build Coastguard Worker 
3120*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing stencil to the same value works.
TEST_P(ClearTestES3,RepeatedStencilClear)3121*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedStencilClear)
3122*8975f5c5SAndroid Build Coastguard Worker {
3123*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0xE4);
3124*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_STENCIL_BUFFER_BIT);
3125*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(0xE4, 1);
3126*8975f5c5SAndroid Build Coastguard Worker 
3127*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_STENCIL_BUFFER_BIT);
3128*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(0xE4, 1);
3129*8975f5c5SAndroid Build Coastguard Worker 
3130*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3131*8975f5c5SAndroid Build Coastguard Worker }
3132*8975f5c5SAndroid Build Coastguard Worker 
3133*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing color to the same value works if color was written to in between with a draw
3134*8975f5c5SAndroid Build Coastguard Worker // call.
TEST_P(ClearTestES3,RepeatedColorClearWithDrawInBetween)3135*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedColorClearWithDrawInBetween)
3136*8975f5c5SAndroid Build Coastguard Worker {
3137*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
3138*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3139*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3140*8975f5c5SAndroid Build Coastguard Worker 
3141*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3142*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
3143*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
3144*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Green());
3145*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0);
3146*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
3147*8975f5c5SAndroid Build Coastguard Worker 
3148*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3149*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3150*8975f5c5SAndroid Build Coastguard Worker 
3151*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3152*8975f5c5SAndroid Build Coastguard Worker }
3153*8975f5c5SAndroid Build Coastguard Worker 
3154*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing depth to the same value works if depth was written to in between with a draw
3155*8975f5c5SAndroid Build Coastguard Worker // call.
TEST_P(ClearTestES3,RepeatedDepthClearWithDrawInBetween)3156*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedDepthClearWithDrawInBetween)
3157*8975f5c5SAndroid Build Coastguard Worker {
3158*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.25f);
3159*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT);
3160*8975f5c5SAndroid Build Coastguard Worker 
3161*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Green());
3162*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
3163*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_ALWAYS);
3164*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.75f);
3165*8975f5c5SAndroid Build Coastguard Worker 
3166*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT);
3167*8975f5c5SAndroid Build Coastguard Worker     glDepthMask(GL_FALSE);
3168*8975f5c5SAndroid Build Coastguard Worker     verifyDepth(0.25f, 1);
3169*8975f5c5SAndroid Build Coastguard Worker 
3170*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3171*8975f5c5SAndroid Build Coastguard Worker }
3172*8975f5c5SAndroid Build Coastguard Worker 
3173*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing stencil to the same value works if stencil was written to in between with a
3174*8975f5c5SAndroid Build Coastguard Worker // draw call.
TEST_P(ClearTestES3,RepeatedStencilClearWithDrawInBetween)3175*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedStencilClearWithDrawInBetween)
3176*8975f5c5SAndroid Build Coastguard Worker {
3177*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0xE4);
3178*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
3179*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_ALWAYS, 0x3C, 0xFF);
3180*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
3181*8975f5c5SAndroid Build Coastguard Worker 
3182*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_STENCIL_BUFFER_BIT);
3183*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Green());
3184*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.75f);
3185*8975f5c5SAndroid Build Coastguard Worker 
3186*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_STENCIL_BUFFER_BIT);
3187*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(0xE4, 1);
3188*8975f5c5SAndroid Build Coastguard Worker 
3189*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3190*8975f5c5SAndroid Build Coastguard Worker }
3191*8975f5c5SAndroid Build Coastguard Worker 
3192*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing color to the same value works if color was written to in between with
3193*8975f5c5SAndroid Build Coastguard Worker // glCopyTexSubImage2D.
TEST_P(ClearTestES3,RepeatedColorClearWithCopyInBetween)3194*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedColorClearWithCopyInBetween)
3195*8975f5c5SAndroid Build Coastguard Worker {
3196*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
3197*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
3198*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
3199*8975f5c5SAndroid Build Coastguard Worker 
3200*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3201*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3202*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3203*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3204*8975f5c5SAndroid Build Coastguard Worker 
3205*8975f5c5SAndroid Build Coastguard Worker     // Clear the texture
3206*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
3207*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3208*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3209*8975f5c5SAndroid Build Coastguard Worker 
3210*8975f5c5SAndroid Build Coastguard Worker     // Replace the framebuffer texture
3211*8975f5c5SAndroid Build Coastguard Worker     GLTexture color2;
3212*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color2);
3213*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
3214*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color2, 0);
3215*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3216*8975f5c5SAndroid Build Coastguard Worker 
3217*8975f5c5SAndroid Build Coastguard Worker     // Clear the new texture and copy it to the old texture
3218*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 1, 0, 1);
3219*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3220*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
3221*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, getWindowWidth(), getWindowHeight());
3222*8975f5c5SAndroid Build Coastguard Worker 
3223*8975f5c5SAndroid Build Coastguard Worker     // Attach the original texture back to the framebuffer and verify the copy.
3224*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3225*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3226*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3227*8975f5c5SAndroid Build Coastguard Worker 
3228*8975f5c5SAndroid Build Coastguard Worker     // Clear to the original value and make sure it's applied.
3229*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
3230*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3231*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3232*8975f5c5SAndroid Build Coastguard Worker 
3233*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3234*8975f5c5SAndroid Build Coastguard Worker }
3235*8975f5c5SAndroid Build Coastguard Worker 
3236*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing color to the same value works if color was written to in between with a
3237*8975f5c5SAndroid Build Coastguard Worker // blit.
TEST_P(ClearTestES3,RepeatedColorClearWithBlitInBetween)3238*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedColorClearWithBlitInBetween)
3239*8975f5c5SAndroid Build Coastguard Worker {
3240*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
3241*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
3242*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
3243*8975f5c5SAndroid Build Coastguard Worker 
3244*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3245*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3246*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3247*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3248*8975f5c5SAndroid Build Coastguard Worker 
3249*8975f5c5SAndroid Build Coastguard Worker     // Clear the texture
3250*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
3251*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3252*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3253*8975f5c5SAndroid Build Coastguard Worker 
3254*8975f5c5SAndroid Build Coastguard Worker     // Create another framebuffer as blit src
3255*8975f5c5SAndroid Build Coastguard Worker     GLTexture color2;
3256*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color2);
3257*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
3258*8975f5c5SAndroid Build Coastguard Worker 
3259*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo2;
3260*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
3261*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color2, 0);
3262*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3263*8975f5c5SAndroid Build Coastguard Worker 
3264*8975f5c5SAndroid Build Coastguard Worker     // Clear the new framebuffer and blit it to the old one
3265*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 1, 0, 1);
3266*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3267*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
3268*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
3269*8975f5c5SAndroid Build Coastguard Worker                       getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
3270*8975f5c5SAndroid Build Coastguard Worker 
3271*8975f5c5SAndroid Build Coastguard Worker     // Verify the copy is done correctly.
3272*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
3273*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3274*8975f5c5SAndroid Build Coastguard Worker 
3275*8975f5c5SAndroid Build Coastguard Worker     // Clear to the original value and make sure it's applied.
3276*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
3277*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3278*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3279*8975f5c5SAndroid Build Coastguard Worker 
3280*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3281*8975f5c5SAndroid Build Coastguard Worker }
3282*8975f5c5SAndroid Build Coastguard Worker 
3283*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing depth to the same value works if depth was written to in between with a
3284*8975f5c5SAndroid Build Coastguard Worker // blit.
TEST_P(ClearTestES3,RepeatedDepthClearWithBlitInBetween)3285*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedDepthClearWithBlitInBetween)
3286*8975f5c5SAndroid Build Coastguard Worker {
3287*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
3288*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
3289*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
3290*8975f5c5SAndroid Build Coastguard Worker 
3291*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depth;
3292*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depth);
3293*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, getWindowWidth(),
3294*8975f5c5SAndroid Build Coastguard Worker                           getWindowHeight());
3295*8975f5c5SAndroid Build Coastguard Worker 
3296*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3297*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3298*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3299*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth);
3300*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3301*8975f5c5SAndroid Build Coastguard Worker 
3302*8975f5c5SAndroid Build Coastguard Worker     // Clear depth
3303*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.25f);
3304*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
3305*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
3306*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3307*8975f5c5SAndroid Build Coastguard Worker     verifyDepth(0.25f, 1);
3308*8975f5c5SAndroid Build Coastguard Worker 
3309*8975f5c5SAndroid Build Coastguard Worker     // Create another framebuffer as blit src
3310*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depth2;
3311*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depth2);
3312*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, getWindowWidth(),
3313*8975f5c5SAndroid Build Coastguard Worker                           getWindowHeight());
3314*8975f5c5SAndroid Build Coastguard Worker 
3315*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo2;
3316*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
3317*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth2);
3318*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3319*8975f5c5SAndroid Build Coastguard Worker 
3320*8975f5c5SAndroid Build Coastguard Worker     // Clear the new framebuffer and blit it to the old one
3321*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.75f);
3322*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT);
3323*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
3324*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
3325*8975f5c5SAndroid Build Coastguard Worker                       getWindowHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
3326*8975f5c5SAndroid Build Coastguard Worker 
3327*8975f5c5SAndroid Build Coastguard Worker     // Verify the copy is done correctly.
3328*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
3329*8975f5c5SAndroid Build Coastguard Worker     verifyDepth(0.75f, 1);
3330*8975f5c5SAndroid Build Coastguard Worker 
3331*8975f5c5SAndroid Build Coastguard Worker     // Clear to the original value and make sure it's applied.
3332*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.25f);
3333*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT);
3334*8975f5c5SAndroid Build Coastguard Worker     verifyDepth(0.25f, 1);
3335*8975f5c5SAndroid Build Coastguard Worker 
3336*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3337*8975f5c5SAndroid Build Coastguard Worker }
3338*8975f5c5SAndroid Build Coastguard Worker 
3339*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing stencil to the same value works if stencil was written to in between with a
3340*8975f5c5SAndroid Build Coastguard Worker // blit.
TEST_P(ClearTestES3,RepeatedStencilClearWithBlitInBetween)3341*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedStencilClearWithBlitInBetween)
3342*8975f5c5SAndroid Build Coastguard Worker {
3343*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
3344*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
3345*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
3346*8975f5c5SAndroid Build Coastguard Worker 
3347*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer stencil;
3348*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, stencil);
3349*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, getWindowWidth(), getWindowHeight());
3350*8975f5c5SAndroid Build Coastguard Worker 
3351*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3352*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3353*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3354*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencil);
3355*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3356*8975f5c5SAndroid Build Coastguard Worker 
3357*8975f5c5SAndroid Build Coastguard Worker     // Clear stencil
3358*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0xE4);
3359*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
3360*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
3361*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3362*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(0xE4, 1);
3363*8975f5c5SAndroid Build Coastguard Worker 
3364*8975f5c5SAndroid Build Coastguard Worker     // Create another framebuffer as blit src
3365*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer stencil2;
3366*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, stencil2);
3367*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, getWindowWidth(), getWindowHeight());
3368*8975f5c5SAndroid Build Coastguard Worker 
3369*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo2;
3370*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
3371*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencil2);
3372*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3373*8975f5c5SAndroid Build Coastguard Worker 
3374*8975f5c5SAndroid Build Coastguard Worker     // Clear the new framebuffer and blit it to the old one
3375*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0x35);
3376*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_STENCIL_BUFFER_BIT);
3377*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
3378*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
3379*8975f5c5SAndroid Build Coastguard Worker                       getWindowHeight(), GL_STENCIL_BUFFER_BIT, GL_NEAREST);
3380*8975f5c5SAndroid Build Coastguard Worker 
3381*8975f5c5SAndroid Build Coastguard Worker     // Verify the copy is done correctly.
3382*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
3383*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(0x35, 1);
3384*8975f5c5SAndroid Build Coastguard Worker 
3385*8975f5c5SAndroid Build Coastguard Worker     // Clear to the original value and make sure it's applied.
3386*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0xE4);
3387*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_STENCIL_BUFFER_BIT);
3388*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(0xE4, 1);
3389*8975f5c5SAndroid Build Coastguard Worker 
3390*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3391*8975f5c5SAndroid Build Coastguard Worker }
3392*8975f5c5SAndroid Build Coastguard Worker 
3393*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing color to the same value works if color was written to in between with a
3394*8975f5c5SAndroid Build Coastguard Worker // compute shader.
TEST_P(ClearTestES31,RepeatedColorClearWithDispatchInBetween)3395*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES31, RepeatedColorClearWithDispatchInBetween)
3396*8975f5c5SAndroid Build Coastguard Worker {
3397*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
3398*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
3399*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
3400*8975f5c5SAndroid Build Coastguard Worker 
3401*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3402*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3403*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3404*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3405*8975f5c5SAndroid Build Coastguard Worker 
3406*8975f5c5SAndroid Build Coastguard Worker     // Clear the texture
3407*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
3408*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3409*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3410*8975f5c5SAndroid Build Coastguard Worker 
3411*8975f5c5SAndroid Build Coastguard Worker     // Write to the texture with a compute shader.
3412*8975f5c5SAndroid Build Coastguard Worker     constexpr char kCS[] = R"(#version 310 es
3413*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=1, local_size_y=1, local_size_z=1) in;
3414*8975f5c5SAndroid Build Coastguard Worker layout(rgba8) uniform highp writeonly image2D imageOut;
3415*8975f5c5SAndroid Build Coastguard Worker void main()
3416*8975f5c5SAndroid Build Coastguard Worker {
3417*8975f5c5SAndroid Build Coastguard Worker     imageStore(imageOut, ivec2(gl_GlobalInvocationID.xy), vec4(0, 1, 0, 1));
3418*8975f5c5SAndroid Build Coastguard Worker })";
3419*8975f5c5SAndroid Build Coastguard Worker 
3420*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_COMPUTE_PROGRAM(program, kCS);
3421*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
3422*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, color, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);
3423*8975f5c5SAndroid Build Coastguard Worker 
3424*8975f5c5SAndroid Build Coastguard Worker     glDispatchCompute(getWindowWidth(), getWindowHeight(), 1);
3425*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
3426*8975f5c5SAndroid Build Coastguard Worker 
3427*8975f5c5SAndroid Build Coastguard Worker     glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
3428*8975f5c5SAndroid Build Coastguard Worker 
3429*8975f5c5SAndroid Build Coastguard Worker     // Verify the compute shader overwrites the image correctly.
3430*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3431*8975f5c5SAndroid Build Coastguard Worker 
3432*8975f5c5SAndroid Build Coastguard Worker     // Clear to the original value and make sure it's applied.
3433*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
3434*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3435*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3436*8975f5c5SAndroid Build Coastguard Worker 
3437*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3438*8975f5c5SAndroid Build Coastguard Worker }
3439*8975f5c5SAndroid Build Coastguard Worker 
3440*8975f5c5SAndroid Build Coastguard Worker // Test that clearing a 3D image bound to a layered framebuffer works using only attachment 0.
TEST_P(ClearTestES31,Bind3DTextureAndClearUsingAttachment0)3441*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES31, Bind3DTextureAndClearUsingAttachment0)
3442*8975f5c5SAndroid Build Coastguard Worker {
3443*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_geometry_shader"));
3444*8975f5c5SAndroid Build Coastguard Worker 
3445*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize            = 16;
3446*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kAttachmentCount = 4;
3447*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelData(kSize * kSize * kAttachmentCount, GLColor::white);
3448*8975f5c5SAndroid Build Coastguard Worker 
3449*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture3D;
3450*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, texture3D);
3451*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, kSize, kSize, kAttachmentCount, 0, GL_RGBA,
3452*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, pixelData.data());
3453*8975f5c5SAndroid Build Coastguard Worker 
3454*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3455*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3456*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_LAYERS, kAttachmentCount);
3457*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture3D, 0);
3458*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3459*8975f5c5SAndroid Build Coastguard Worker 
3460*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
3461*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3462*8975f5c5SAndroid Build Coastguard Worker 
3463*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
3464*8975f5c5SAndroid Build Coastguard Worker     {
3465*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture3D, 0, i);
3466*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
3467*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3468*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
3469*8975f5c5SAndroid Build Coastguard Worker     }
3470*8975f5c5SAndroid Build Coastguard Worker }
3471*8975f5c5SAndroid Build Coastguard Worker 
3472*8975f5c5SAndroid Build Coastguard Worker // Test that clearing a 3D image bound to a layered framebuffer works using multiple attachments.
TEST_P(ClearTestES31,Bind3DTextureAndClearUsingMultipleAttachments)3473*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES31, Bind3DTextureAndClearUsingMultipleAttachments)
3474*8975f5c5SAndroid Build Coastguard Worker {
3475*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_geometry_shader"));
3476*8975f5c5SAndroid Build Coastguard Worker 
3477*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSize            = 16;
3478*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kAttachmentCount = 4;
3479*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelData(kSize * kSize * kAttachmentCount, GLColor::white);
3480*8975f5c5SAndroid Build Coastguard Worker 
3481*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture3D;
3482*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, texture3D);
3483*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, kSize, kSize, kAttachmentCount, 0, GL_RGBA,
3484*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, pixelData.data());
3485*8975f5c5SAndroid Build Coastguard Worker 
3486*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3487*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3488*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_LAYERS, kAttachmentCount);
3489*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture3D, 0);
3490*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3491*8975f5c5SAndroid Build Coastguard Worker 
3492*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
3493*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3494*8975f5c5SAndroid Build Coastguard Worker 
3495*8975f5c5SAndroid Build Coastguard Worker     const GLenum usedAttachment[kAttachmentCount] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
3496*8975f5c5SAndroid Build Coastguard Worker                                                      GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT1};
3497*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kAttachmentCount; ++i)
3498*8975f5c5SAndroid Build Coastguard Worker     {
3499*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_FRAMEBUFFER, usedAttachment[i], texture3D, 0, i);
3500*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
3501*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3502*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
3503*8975f5c5SAndroid Build Coastguard Worker     }
3504*8975f5c5SAndroid Build Coastguard Worker }
3505*8975f5c5SAndroid Build Coastguard Worker 
3506*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing depth to the same value works if depth is blit after clear, and depth is
3507*8975f5c5SAndroid Build Coastguard Worker // modified in between with a draw call.
TEST_P(ClearTestES3,RepeatedDepthClearWithBlitAfterClearAndDrawInBetween)3508*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedDepthClearWithBlitAfterClearAndDrawInBetween)
3509*8975f5c5SAndroid Build Coastguard Worker {
3510*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(0.25f);
3511*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
3512*8975f5c5SAndroid Build Coastguard Worker 
3513*8975f5c5SAndroid Build Coastguard Worker     // Make sure clear is flushed.
3514*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depth;
3515*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depth);
3516*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth(),
3517*8975f5c5SAndroid Build Coastguard Worker                           getWindowHeight());
3518*8975f5c5SAndroid Build Coastguard Worker 
3519*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3520*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
3521*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth);
3522*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
3523*8975f5c5SAndroid Build Coastguard Worker 
3524*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
3525*8975f5c5SAndroid Build Coastguard Worker                       getWindowHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
3526*8975f5c5SAndroid Build Coastguard Worker 
3527*8975f5c5SAndroid Build Coastguard Worker     // Draw to depth, and break the render pass.
3528*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
3529*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Green());
3530*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
3531*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_ALWAYS);
3532*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.75f);
3533*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3534*8975f5c5SAndroid Build Coastguard Worker 
3535*8975f5c5SAndroid Build Coastguard Worker     // Clear back to the original value
3536*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_DEPTH_BUFFER_BIT);
3537*8975f5c5SAndroid Build Coastguard Worker 
3538*8975f5c5SAndroid Build Coastguard Worker     // Blit again.
3539*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
3540*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
3541*8975f5c5SAndroid Build Coastguard Worker                       getWindowHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
3542*8975f5c5SAndroid Build Coastguard Worker 
3543*8975f5c5SAndroid Build Coastguard Worker     // Make sure the cleared value is in destination, not the modified value.
3544*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
3545*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
3546*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
3547*8975f5c5SAndroid Build Coastguard Worker 
3548*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
3549*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3550*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
3551*8975f5c5SAndroid Build Coastguard Worker     verifyDepth(0.25f, 1);
3552*8975f5c5SAndroid Build Coastguard Worker 
3553*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3554*8975f5c5SAndroid Build Coastguard Worker }
3555*8975f5c5SAndroid Build Coastguard Worker 
3556*8975f5c5SAndroid Build Coastguard Worker // Test that gaps in framebuffer attachments do not cause race
3557*8975f5c5SAndroid Build Coastguard Worker // conditions when a clear op is followed by a draw call.
TEST_P(ClearTestES3,DrawAfterClearWithGaps)3558*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, DrawAfterClearWithGaps)
3559*8975f5c5SAndroid Build Coastguard Worker {
3560*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(#version 300 es
3561*8975f5c5SAndroid Build Coastguard Worker precision highp float;
3562*8975f5c5SAndroid Build Coastguard Worker void main() {
3563*8975f5c5SAndroid Build Coastguard Worker     vec2 offset = vec2((gl_VertexID & 1) == 0 ? -1.0 : 1.0, (gl_VertexID & 2) == 0 ? -1.0 : 1.0);
3564*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(offset * 0.125 - 0.5, 0.0, 1.0);
3565*8975f5c5SAndroid Build Coastguard Worker })";
3566*8975f5c5SAndroid Build Coastguard Worker 
3567*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
3568*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
3569*8975f5c5SAndroid Build Coastguard Worker layout(location=0) out vec4 color0;
3570*8975f5c5SAndroid Build Coastguard Worker layout(location=2) out vec4 color2;
3571*8975f5c5SAndroid Build Coastguard Worker void main() {
3572*8975f5c5SAndroid Build Coastguard Worker   color0 = vec4(1, 0, 1, 1);
3573*8975f5c5SAndroid Build Coastguard Worker   color2 = vec4(1, 1, 0, 1);
3574*8975f5c5SAndroid Build Coastguard Worker })";
3575*8975f5c5SAndroid Build Coastguard Worker 
3576*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
3577*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
3578*8975f5c5SAndroid Build Coastguard Worker 
3579*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 1024;
3580*8975f5c5SAndroid Build Coastguard Worker 
3581*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb0;
3582*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb0);
3583*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
3584*8975f5c5SAndroid Build Coastguard Worker 
3585*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb2;
3586*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb2);
3587*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
3588*8975f5c5SAndroid Build Coastguard Worker 
3589*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
3590*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
3591*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb0);
3592*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_RENDERBUFFER, rb2);
3593*8975f5c5SAndroid Build Coastguard Worker 
3594*8975f5c5SAndroid Build Coastguard Worker     GLenum bufs[3] = {GL_COLOR_ATTACHMENT0, GL_NONE, GL_COLOR_ATTACHMENT2};
3595*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(3, bufs);
3596*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT2);
3597*8975f5c5SAndroid Build Coastguard Worker 
3598*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 1, 0, 1);
3599*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
3600*8975f5c5SAndroid Build Coastguard Worker 
3601*8975f5c5SAndroid Build Coastguard Worker     // Draw immediately after clear
3602*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3603*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
3604*8975f5c5SAndroid Build Coastguard Worker 
3605*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixels(kSize * kSize, GLColor::transparentBlack);
3606*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
3607*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3608*8975f5c5SAndroid Build Coastguard Worker 
3609*8975f5c5SAndroid Build Coastguard Worker     for (int y = 0; y < kSize; ++y)
3610*8975f5c5SAndroid Build Coastguard Worker     {
3611*8975f5c5SAndroid Build Coastguard Worker         for (int x = 0; x < kSize; ++x)
3612*8975f5c5SAndroid Build Coastguard Worker         {
3613*8975f5c5SAndroid Build Coastguard Worker             const GLColor color = pixels[y * kSize + x];
3614*8975f5c5SAndroid Build Coastguard Worker             if (x > 192 && x < 319 && y > 192 && y < 319)
3615*8975f5c5SAndroid Build Coastguard Worker             {
3616*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_EQ(color, GLColor::yellow) << "at " << x << ", " << y;
3617*8975f5c5SAndroid Build Coastguard Worker             }
3618*8975f5c5SAndroid Build Coastguard Worker             else if (x < 191 || x > 320 || y < 191 || y > 320)
3619*8975f5c5SAndroid Build Coastguard Worker             {
3620*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_EQ(color, GLColor::green) << "at " << x << ", " << y;
3621*8975f5c5SAndroid Build Coastguard Worker             }
3622*8975f5c5SAndroid Build Coastguard Worker         }
3623*8975f5c5SAndroid Build Coastguard Worker     }
3624*8975f5c5SAndroid Build Coastguard Worker }
3625*8975f5c5SAndroid Build Coastguard Worker 
3626*8975f5c5SAndroid Build Coastguard Worker // Test that mid render pass clears work with gaps in locations.
TEST_P(ClearTestES3,MidRenderPassClearWithGaps)3627*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, MidRenderPassClearWithGaps)
3628*8975f5c5SAndroid Build Coastguard Worker {
3629*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(#version 300 es
3630*8975f5c5SAndroid Build Coastguard Worker precision highp float;
3631*8975f5c5SAndroid Build Coastguard Worker void main() {
3632*8975f5c5SAndroid Build Coastguard Worker     // gl_VertexID    x    y
3633*8975f5c5SAndroid Build Coastguard Worker     //      0        -1   -1
3634*8975f5c5SAndroid Build Coastguard Worker     //      1         1   -1
3635*8975f5c5SAndroid Build Coastguard Worker     //      2        -1    1
3636*8975f5c5SAndroid Build Coastguard Worker     //      3         1    1
3637*8975f5c5SAndroid Build Coastguard Worker     int bit0 = gl_VertexID & 1;
3638*8975f5c5SAndroid Build Coastguard Worker     int bit1 = gl_VertexID >> 1;
3639*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, gl_VertexID % 2 == 0 ? -1 : 1, 1);
3640*8975f5c5SAndroid Build Coastguard Worker })";
3641*8975f5c5SAndroid Build Coastguard Worker 
3642*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
3643*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
3644*8975f5c5SAndroid Build Coastguard Worker layout(location=0) out vec4 color0;
3645*8975f5c5SAndroid Build Coastguard Worker layout(location=2) out vec4 color2;
3646*8975f5c5SAndroid Build Coastguard Worker uniform vec4 color0in;
3647*8975f5c5SAndroid Build Coastguard Worker uniform vec4 color1in;
3648*8975f5c5SAndroid Build Coastguard Worker void main() {
3649*8975f5c5SAndroid Build Coastguard Worker   color0 = color0in;
3650*8975f5c5SAndroid Build Coastguard Worker   color2 = color1in;
3651*8975f5c5SAndroid Build Coastguard Worker })";
3652*8975f5c5SAndroid Build Coastguard Worker 
3653*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
3654*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
3655*8975f5c5SAndroid Build Coastguard Worker 
3656*8975f5c5SAndroid Build Coastguard Worker     const GLint color0InLoc = glGetUniformLocation(program, "color0in");
3657*8975f5c5SAndroid Build Coastguard Worker     const GLint color1InLoc = glGetUniformLocation(program, "color1in");
3658*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(color0InLoc, -1);
3659*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(color1InLoc, -1);
3660*8975f5c5SAndroid Build Coastguard Worker 
3661*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 23;
3662*8975f5c5SAndroid Build Coastguard Worker 
3663*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb0;
3664*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb0);
3665*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
3666*8975f5c5SAndroid Build Coastguard Worker 
3667*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb2;
3668*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb2);
3669*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
3670*8975f5c5SAndroid Build Coastguard Worker 
3671*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
3672*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
3673*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb0);
3674*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_RENDERBUFFER, rb2);
3675*8975f5c5SAndroid Build Coastguard Worker 
3676*8975f5c5SAndroid Build Coastguard Worker     GLenum bufs[3] = {GL_COLOR_ATTACHMENT0, GL_NONE, GL_COLOR_ATTACHMENT2};
3677*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(3, bufs);
3678*8975f5c5SAndroid Build Coastguard Worker 
3679*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
3680*8975f5c5SAndroid Build Coastguard Worker 
3681*8975f5c5SAndroid Build Coastguard Worker     // Start with a draw call
3682*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(color0InLoc, 0.1, 0.2, 0.3, 0.4);
3683*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(color1InLoc, 0.05, 0.15, 0.25, 0.35);
3684*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
3685*8975f5c5SAndroid Build Coastguard Worker 
3686*8975f5c5SAndroid Build Coastguard Worker     // Clear in the middle of the render pass
3687*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 0.6);
3688*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3689*8975f5c5SAndroid Build Coastguard Worker 
3690*8975f5c5SAndroid Build Coastguard Worker     // Draw with blend, and verify results
3691*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
3692*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
3693*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(color0InLoc, 0, 1, 0, 0.5);
3694*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(color1InLoc, 0, 0, 1, 0.5);
3695*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
3696*8975f5c5SAndroid Build Coastguard Worker 
3697*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT0);
3698*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::yellow);
3699*8975f5c5SAndroid Build Coastguard Worker 
3700*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT2);
3701*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::magenta);
3702*8975f5c5SAndroid Build Coastguard Worker }
3703*8975f5c5SAndroid Build Coastguard Worker 
3704*8975f5c5SAndroid Build Coastguard Worker // Test that reclearing stencil to the same value works if stencil is blit after clear, and stencil
3705*8975f5c5SAndroid Build Coastguard Worker // is modified in between with a draw call.
TEST_P(ClearTestES3,RepeatedStencilClearWithBlitAfterClearAndDrawInBetween)3706*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTestES3, RepeatedStencilClearWithBlitAfterClearAndDrawInBetween)
3707*8975f5c5SAndroid Build Coastguard Worker {
3708*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0xE4);
3709*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
3710*8975f5c5SAndroid Build Coastguard Worker 
3711*8975f5c5SAndroid Build Coastguard Worker     // Make sure clear is flushed.
3712*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer stencil;
3713*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, stencil);
3714*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth(),
3715*8975f5c5SAndroid Build Coastguard Worker                           getWindowHeight());
3716*8975f5c5SAndroid Build Coastguard Worker 
3717*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3718*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
3719*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencil);
3720*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
3721*8975f5c5SAndroid Build Coastguard Worker 
3722*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
3723*8975f5c5SAndroid Build Coastguard Worker                       getWindowHeight(), GL_STENCIL_BUFFER_BIT, GL_NEAREST);
3724*8975f5c5SAndroid Build Coastguard Worker 
3725*8975f5c5SAndroid Build Coastguard Worker     // Draw to stencil, and break the render pass.
3726*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
3727*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Green());
3728*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
3729*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
3730*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_ALWAYS, 0x3C, 0xFF);
3731*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.75f);
3732*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3733*8975f5c5SAndroid Build Coastguard Worker 
3734*8975f5c5SAndroid Build Coastguard Worker     // Clear back to the original value
3735*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_STENCIL_BUFFER_BIT);
3736*8975f5c5SAndroid Build Coastguard Worker 
3737*8975f5c5SAndroid Build Coastguard Worker     // Blit again.
3738*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
3739*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(),
3740*8975f5c5SAndroid Build Coastguard Worker                       getWindowHeight(), GL_STENCIL_BUFFER_BIT, GL_NEAREST);
3741*8975f5c5SAndroid Build Coastguard Worker 
3742*8975f5c5SAndroid Build Coastguard Worker     // Make sure the cleared value is in destination, not the modified value.
3743*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
3744*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
3745*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
3746*8975f5c5SAndroid Build Coastguard Worker 
3747*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
3748*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3749*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
3750*8975f5c5SAndroid Build Coastguard Worker     verifyStencil(0xE4, 1);
3751*8975f5c5SAndroid Build Coastguard Worker 
3752*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3753*8975f5c5SAndroid Build Coastguard Worker }
3754*8975f5c5SAndroid Build Coastguard Worker 
3755*8975f5c5SAndroid Build Coastguard Worker // Test basic functionality of clearing a 2D texture with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,Clear2D)3756*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2D)
3757*8975f5c5SAndroid Build Coastguard Worker {
3758*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3759*8975f5c5SAndroid Build Coastguard Worker 
3760*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with no data.
3761*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
3762*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
3763*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3764*8975f5c5SAndroid Build Coastguard Worker 
3765*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3766*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3767*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
3768*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3769*8975f5c5SAndroid Build Coastguard Worker 
3770*8975f5c5SAndroid Build Coastguard Worker     // Clear the entire texture
3771*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
3772*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
3773*8975f5c5SAndroid Build Coastguard Worker 
3774*8975f5c5SAndroid Build Coastguard Worker     // Clear each corner to a different color
3775*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3776*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 8, 0, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::blue);
3777*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 8, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::cyan);
3778*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 8, 8, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::yellow);
3779*8975f5c5SAndroid Build Coastguard Worker 
3780*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 8, GLColor::transparentBlack);
3781*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 0, 8, 8, GLColor::blue);
3782*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 8, 8, 8, GLColor::cyan);
3783*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 8, 8, 8, GLColor::yellow);
3784*8975f5c5SAndroid Build Coastguard Worker }
3785*8975f5c5SAndroid Build Coastguard Worker 
3786*8975f5c5SAndroid Build Coastguard Worker // Test basic functionality of clearing a 2D RGB texture with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,Clear2DRGB)3787*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2DRGB)
3788*8975f5c5SAndroid Build Coastguard Worker {
3789*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3790*8975f5c5SAndroid Build Coastguard Worker 
3791*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with no data.
3792*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
3793*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
3794*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
3795*8975f5c5SAndroid Build Coastguard Worker 
3796*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3797*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3798*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
3799*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3800*8975f5c5SAndroid Build Coastguard Worker 
3801*8975f5c5SAndroid Build Coastguard Worker     // Clear the entire texture
3802*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGB, GL_UNSIGNED_BYTE, &GLColor::red);
3803*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
3804*8975f5c5SAndroid Build Coastguard Worker 
3805*8975f5c5SAndroid Build Coastguard Worker     // Clear each corner to a different color
3806*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 0, 8, 8, 1, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
3807*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 8, 0, 0, 8, 8, 1, GL_RGB, GL_UNSIGNED_BYTE, &GLColor::blue);
3808*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 8, 0, 8, 8, 1, GL_RGB, GL_UNSIGNED_BYTE, &GLColor::cyan);
3809*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 8, 8, 0, 8, 8, 1, GL_RGB, GL_UNSIGNED_BYTE, &GLColor::yellow);
3810*8975f5c5SAndroid Build Coastguard Worker 
3811*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 8, GLColor::black);
3812*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 0, 8, 8, GLColor::blue);
3813*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 8, 8, 8, GLColor::cyan);
3814*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 8, 8, 8, GLColor::yellow);
3815*8975f5c5SAndroid Build Coastguard Worker }
3816*8975f5c5SAndroid Build Coastguard Worker 
3817*8975f5c5SAndroid Build Coastguard Worker // Test basic functionality of clearing a part of a 2D texture with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,Clear2DSubImage)3818*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2DSubImage)
3819*8975f5c5SAndroid Build Coastguard Worker {
3820*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3821*8975f5c5SAndroid Build Coastguard Worker 
3822*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with no data.
3823*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
3824*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
3825*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3826*8975f5c5SAndroid Build Coastguard Worker 
3827*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3828*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3829*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
3830*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3831*8975f5c5SAndroid Build Coastguard Worker 
3832*8975f5c5SAndroid Build Coastguard Worker     // Clear the center to a different color
3833*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 4, 4, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::cyan);
3834*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(4, 4, 8, 8, GLColor::cyan);
3835*8975f5c5SAndroid Build Coastguard Worker }
3836*8975f5c5SAndroid Build Coastguard Worker 
3837*8975f5c5SAndroid Build Coastguard Worker // Test clearing a 2D RGBA4 texture with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,Clear2DRGBA4)3838*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2DRGBA4)
3839*8975f5c5SAndroid Build Coastguard Worker {
3840*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3841*8975f5c5SAndroid Build Coastguard Worker 
3842*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with no data.
3843*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
3844*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
3845*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, 16, 16, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4,
3846*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
3847*8975f5c5SAndroid Build Coastguard Worker 
3848*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3849*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3850*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
3851*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3852*8975f5c5SAndroid Build Coastguard Worker 
3853*8975f5c5SAndroid Build Coastguard Worker     // Clear the entire texture, then clear each corner to a different color.
3854*8975f5c5SAndroid Build Coastguard Worker     GLushort colorRed    = 0xF00F;
3855*8975f5c5SAndroid Build Coastguard Worker     GLushort colorGreen  = 0x0F0F;
3856*8975f5c5SAndroid Build Coastguard Worker     GLushort colorBlue   = 0x00FF;
3857*8975f5c5SAndroid Build Coastguard Worker     GLushort colorYellow = 0xFF0F;
3858*8975f5c5SAndroid Build Coastguard Worker 
3859*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, &colorGreen);
3860*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::green);
3861*8975f5c5SAndroid Build Coastguard Worker 
3862*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, nullptr);
3863*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 8, 0, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, &colorBlue);
3864*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 8, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, &colorRed);
3865*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 8, 8, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4,
3866*8975f5c5SAndroid Build Coastguard Worker                           &colorYellow);
3867*8975f5c5SAndroid Build Coastguard Worker 
3868*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 8, GLColor::transparentBlack);
3869*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 0, 8, 8, GLColor::blue);
3870*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 8, 8, 8, GLColor::red);
3871*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 8, 8, 8, GLColor::yellow);
3872*8975f5c5SAndroid Build Coastguard Worker }
3873*8975f5c5SAndroid Build Coastguard Worker 
3874*8975f5c5SAndroid Build Coastguard Worker // Test clearing a 2D RGB8 Snorm texture with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,Clear2DRGB8Snorm)3875*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2DRGB8Snorm)
3876*8975f5c5SAndroid Build Coastguard Worker {
3877*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3878*8975f5c5SAndroid Build Coastguard Worker 
3879*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with no data.
3880*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
3881*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
3882*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8_SNORM, 16, 16, 0, GL_RGB, GL_BYTE, nullptr);
3883*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3884*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3885*8975f5c5SAndroid Build Coastguard Worker 
3886*8975f5c5SAndroid Build Coastguard Worker     // Clear the entire texture.
3887*8975f5c5SAndroid Build Coastguard Worker     GLint colorGreenRGBSnorm = 0x007F00;
3888*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGB, GL_BYTE, &colorGreenRGBSnorm);
3889*8975f5c5SAndroid Build Coastguard Worker 
3890*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
3891*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
3892*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::green);
3893*8975f5c5SAndroid Build Coastguard Worker }
3894*8975f5c5SAndroid Build Coastguard Worker 
3895*8975f5c5SAndroid Build Coastguard Worker // Test basic functionality of clearing 2D textures with GL_EXT_clear_texture using nullptr.
TEST_P(ClearTextureEXTTest,Clear2DWithNull)3896*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2DWithNull)
3897*8975f5c5SAndroid Build Coastguard Worker {
3898*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3899*8975f5c5SAndroid Build Coastguard Worker 
3900*8975f5c5SAndroid Build Coastguard Worker     // Create two 16x16 textures with prior data.
3901*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redBlock(16 * 16, GLColor::red);
3902*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
3903*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
3904*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, redBlock.data());
3905*8975f5c5SAndroid Build Coastguard Worker 
3906*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2;
3907*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2);
3908*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, redBlock.data());
3909*8975f5c5SAndroid Build Coastguard Worker 
3910*8975f5c5SAndroid Build Coastguard Worker     // Clear the RGB texture.
3911*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3912*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3913*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
3914*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3915*8975f5c5SAndroid Build Coastguard Worker 
3916*8975f5c5SAndroid Build Coastguard Worker     GLColor outputColor;
3917*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
3918*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &outputColor);
3919*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::black);
3920*8975f5c5SAndroid Build Coastguard Worker 
3921*8975f5c5SAndroid Build Coastguard Worker     // Clear the RGBA texture.
3922*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2, 0);
3923*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3924*8975f5c5SAndroid Build Coastguard Worker 
3925*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3926*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &outputColor);
3927*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::transparentBlack);
3928*8975f5c5SAndroid Build Coastguard Worker }
3929*8975f5c5SAndroid Build Coastguard Worker 
3930*8975f5c5SAndroid Build Coastguard Worker // Test basic functionality of clearing a 2D texture while bound to another.
TEST_P(ClearTextureEXTTest,Clear2DDifferentBinding)3931*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2DDifferentBinding)
3932*8975f5c5SAndroid Build Coastguard Worker {
3933*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3934*8975f5c5SAndroid Build Coastguard Worker 
3935*8975f5c5SAndroid Build Coastguard Worker     // Create two 16x16 textures with no data.
3936*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex1;
3937*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex1);
3938*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3939*8975f5c5SAndroid Build Coastguard Worker 
3940*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2;
3941*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2);
3942*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3943*8975f5c5SAndroid Build Coastguard Worker 
3944*8975f5c5SAndroid Build Coastguard Worker     // Use clear on both textures while none are bound.
3945*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
3946*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
3947*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex2, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::blue);
3948*8975f5c5SAndroid Build Coastguard Worker 
3949*8975f5c5SAndroid Build Coastguard Worker     // Bind to one texture while clearing the other.
3950*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2);
3951*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
3952*8975f5c5SAndroid Build Coastguard Worker 
3953*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3954*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3955*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1, 0);
3956*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3957*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::green);
3958*8975f5c5SAndroid Build Coastguard Worker 
3959*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2, 0);
3960*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3961*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
3962*8975f5c5SAndroid Build Coastguard Worker }
3963*8975f5c5SAndroid Build Coastguard Worker 
3964*8975f5c5SAndroid Build Coastguard Worker // Test basic functionality of clearing 2D textures without binding to them.
TEST_P(ClearTextureEXTTest,Clear2DNoBinding)3965*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2DNoBinding)
3966*8975f5c5SAndroid Build Coastguard Worker {
3967*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3968*8975f5c5SAndroid Build Coastguard Worker 
3969*8975f5c5SAndroid Build Coastguard Worker     // Create two 16x16 textures with no data.
3970*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex1;
3971*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex1);
3972*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3973*8975f5c5SAndroid Build Coastguard Worker 
3974*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2;
3975*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2);
3976*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3977*8975f5c5SAndroid Build Coastguard Worker 
3978*8975f5c5SAndroid Build Coastguard Worker     // Use clear on both textures while bound to neither.
3979*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
3980*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
3981*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex2, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::blue);
3982*8975f5c5SAndroid Build Coastguard Worker 
3983*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3984*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3985*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1, 0);
3986*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3987*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
3988*8975f5c5SAndroid Build Coastguard Worker 
3989*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2, 0);
3990*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3991*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
3992*8975f5c5SAndroid Build Coastguard Worker }
3993*8975f5c5SAndroid Build Coastguard Worker 
3994*8975f5c5SAndroid Build Coastguard Worker // Test basic functionality of clearing a 2D texture with prior staged update.
TEST_P(ClearTextureEXTTest,Clear2DOverwritePriorContent)3995*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2DOverwritePriorContent)
3996*8975f5c5SAndroid Build Coastguard Worker {
3997*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3998*8975f5c5SAndroid Build Coastguard Worker 
3999*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with some data.
4000*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redBlock(16 * 16, GLColor::red);
4001*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4002*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4003*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, redBlock.data());
4004*8975f5c5SAndroid Build Coastguard Worker 
4005*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4006*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4007*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
4008*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4009*8975f5c5SAndroid Build Coastguard Worker 
4010*8975f5c5SAndroid Build Coastguard Worker     // Clear the entire texture.
4011*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::blue);
4012*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
4013*8975f5c5SAndroid Build Coastguard Worker }
4014*8975f5c5SAndroid Build Coastguard Worker 
4015*8975f5c5SAndroid Build Coastguard Worker // Test clearing a 2D texture using a depth of zero.
TEST_P(ClearTextureEXTTest,Clear2DWithZeroDepth)4016*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2DWithZeroDepth)
4017*8975f5c5SAndroid Build Coastguard Worker {
4018*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4019*8975f5c5SAndroid Build Coastguard Worker 
4020*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture and fully clear it.
4021*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4022*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4023*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4024*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
4025*8975f5c5SAndroid Build Coastguard Worker 
4026*8975f5c5SAndroid Build Coastguard Worker     // Clear the 2D texture using depth of zero.
4027*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 0, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::blue);
4028*8975f5c5SAndroid Build Coastguard Worker 
4029*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4030*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4031*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
4032*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4033*8975f5c5SAndroid Build Coastguard Worker 
4034*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::green);
4035*8975f5c5SAndroid Build Coastguard Worker }
4036*8975f5c5SAndroid Build Coastguard Worker 
4037*8975f5c5SAndroid Build Coastguard Worker // Test basic functionality of clearing a 2D texture defined using glTexStorage().
TEST_P(ClearTextureEXTTest,Clear2DTexStorage)4038*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2DTexStorage)
4039*8975f5c5SAndroid Build Coastguard Worker {
4040*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4041*8975f5c5SAndroid Build Coastguard Worker 
4042*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 mipmap texture.
4043*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4044*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4045*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 5, GL_RGBA8, 16, 16);
4046*8975f5c5SAndroid Build Coastguard Worker 
4047*8975f5c5SAndroid Build Coastguard Worker     // Define texture mip levels by clearing them.
4048*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4049*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
4050*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 2, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::blue);
4051*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 3, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::magenta);
4052*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4053*8975f5c5SAndroid Build Coastguard Worker 
4054*8975f5c5SAndroid Build Coastguard Worker     // Bind to framebuffer and verify.
4055*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4056*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4057*8975f5c5SAndroid Build Coastguard Worker 
4058*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
4059*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4060*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
4061*8975f5c5SAndroid Build Coastguard Worker 
4062*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 1);
4063*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4064*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 8, GLColor::green);
4065*8975f5c5SAndroid Build Coastguard Worker 
4066*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 2);
4067*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4068*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 4, 4, GLColor::blue);
4069*8975f5c5SAndroid Build Coastguard Worker 
4070*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 3);
4071*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4072*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 2, 2, GLColor::magenta);
4073*8975f5c5SAndroid Build Coastguard Worker }
4074*8975f5c5SAndroid Build Coastguard Worker 
4075*8975f5c5SAndroid Build Coastguard Worker // Test that a single full clear for the 3D texture works.
TEST_P(ClearTextureEXTTest,Clear3DSingleFull)4076*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear3DSingleFull)
4077*8975f5c5SAndroid Build Coastguard Worker {
4078*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4079*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kWidth  = 4;
4080*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kHeight = 4;
4081*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kDepth  = 4;
4082*8975f5c5SAndroid Build Coastguard Worker 
4083*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
4084*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, texture);
4085*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, kWidth, kHeight, kDepth);
4086*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
4087*8975f5c5SAndroid Build Coastguard Worker 
4088*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(texture, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::white);
4089*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4090*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4091*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = 0; z < kDepth; ++z)
4092*8975f5c5SAndroid Build Coastguard Worker     {
4093*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0, z);
4094*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::white);
4095*8975f5c5SAndroid Build Coastguard Worker     }
4096*8975f5c5SAndroid Build Coastguard Worker }
4097*8975f5c5SAndroid Build Coastguard Worker 
4098*8975f5c5SAndroid Build Coastguard Worker // Test that a simple clear for the entire texture works.
TEST_P(ClearTextureEXTTest,Clear3DWhole)4099*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear3DWhole)
4100*8975f5c5SAndroid Build Coastguard Worker {
4101*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4102*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kWidth  = 4;
4103*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kHeight = 4;
4104*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kDepth  = 4;
4105*8975f5c5SAndroid Build Coastguard Worker 
4106*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
4107*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, texture);
4108*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, kWidth, kHeight, kDepth);
4109*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
4110*8975f5c5SAndroid Build Coastguard Worker 
4111*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(texture, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::white);
4112*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4113*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4114*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = 0; z < kDepth; ++z)
4115*8975f5c5SAndroid Build Coastguard Worker     {
4116*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0, z);
4117*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::white);
4118*8975f5c5SAndroid Build Coastguard Worker     }
4119*8975f5c5SAndroid Build Coastguard Worker 
4120*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(texture, 0, 0, 0, 0, kWidth, kHeight, kDepth, GL_RGBA, GL_UNSIGNED_BYTE,
4121*8975f5c5SAndroid Build Coastguard Worker                           &GLColor::green);
4122*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = 0; z < kDepth; ++z)
4123*8975f5c5SAndroid Build Coastguard Worker     {
4124*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0, z);
4125*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
4126*8975f5c5SAndroid Build Coastguard Worker     }
4127*8975f5c5SAndroid Build Coastguard Worker }
4128*8975f5c5SAndroid Build Coastguard Worker 
4129*8975f5c5SAndroid Build Coastguard Worker // Test that clearing slices of a 3D texture and reading them back works.
TEST_P(ClearTextureEXTTest,Clear3DLayers)4130*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear3DLayers)
4131*8975f5c5SAndroid Build Coastguard Worker {
4132*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4133*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kWidth  = 128;
4134*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kHeight = 128;
4135*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kDepth  = 7;
4136*8975f5c5SAndroid Build Coastguard Worker 
4137*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
4138*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, texture);
4139*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, kWidth, kHeight, kDepth);
4140*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
4141*8975f5c5SAndroid Build Coastguard Worker 
4142*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kDepth> clearColors = {
4143*8975f5c5SAndroid Build Coastguard Worker         GLColor::red,  GLColor::green,   GLColor::blue,  GLColor::yellow,
4144*8975f5c5SAndroid Build Coastguard Worker         GLColor::cyan, GLColor::magenta, GLColor::white,
4145*8975f5c5SAndroid Build Coastguard Worker     };
4146*8975f5c5SAndroid Build Coastguard Worker 
4147*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4148*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4149*8975f5c5SAndroid Build Coastguard Worker 
4150*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(texture, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4151*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = 0; z < kDepth; ++z)
4152*8975f5c5SAndroid Build Coastguard Worker     {
4153*8975f5c5SAndroid Build Coastguard Worker         glClearTexSubImageEXT(texture, 0, 0, 0, z, kWidth, kHeight, 1, GL_RGBA, GL_UNSIGNED_BYTE,
4154*8975f5c5SAndroid Build Coastguard Worker                               &clearColors[z]);
4155*8975f5c5SAndroid Build Coastguard Worker     }
4156*8975f5c5SAndroid Build Coastguard Worker 
4157*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = 0; z < kDepth; ++z)
4158*8975f5c5SAndroid Build Coastguard Worker     {
4159*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0, z);
4160*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, clearColors[z]);
4161*8975f5c5SAndroid Build Coastguard Worker     }
4162*8975f5c5SAndroid Build Coastguard Worker }
4163*8975f5c5SAndroid Build Coastguard Worker 
4164*8975f5c5SAndroid Build Coastguard Worker // Test that clearing slices of a 3D texture with dimensions of zero does not change it.
TEST_P(ClearTextureEXTTest,Clear3DZeroDims)4165*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear3DZeroDims)
4166*8975f5c5SAndroid Build Coastguard Worker {
4167*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4168*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kWidth  = 4;
4169*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kHeight = 4;
4170*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kDepth  = 4;
4171*8975f5c5SAndroid Build Coastguard Worker 
4172*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
4173*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, texture);
4174*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, kWidth, kHeight, kDepth);
4175*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
4176*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(texture, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::white);
4177*8975f5c5SAndroid Build Coastguard Worker 
4178*8975f5c5SAndroid Build Coastguard Worker     // Dimensions of zero for clear are valid. However, they should not change the texture.
4179*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4180*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4181*8975f5c5SAndroid Build Coastguard Worker 
4182*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(texture, 0, 0, 0, 0, 0, kHeight, kDepth, GL_RGBA, GL_UNSIGNED_BYTE,
4183*8975f5c5SAndroid Build Coastguard Worker                           &GLColor::red);
4184*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4185*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(texture, 0, 0, 0, 0, kWidth, 0, kDepth, GL_RGBA, GL_UNSIGNED_BYTE,
4186*8975f5c5SAndroid Build Coastguard Worker                           &GLColor::green);
4187*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4188*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(texture, 0, 0, 0, 0, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4189*8975f5c5SAndroid Build Coastguard Worker                           &GLColor::blue);
4190*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4191*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(texture, 0, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4192*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4193*8975f5c5SAndroid Build Coastguard Worker 
4194*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = 0; z < kDepth; ++z)
4195*8975f5c5SAndroid Build Coastguard Worker     {
4196*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0, z);
4197*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::white);
4198*8975f5c5SAndroid Build Coastguard Worker     }
4199*8975f5c5SAndroid Build Coastguard Worker }
4200*8975f5c5SAndroid Build Coastguard Worker 
4201*8975f5c5SAndroid Build Coastguard Worker // Test that clearing blocks of a 3D texture and reading them back works.
TEST_P(ClearTextureEXTTest,Clear3DBlocks)4202*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear3DBlocks)
4203*8975f5c5SAndroid Build Coastguard Worker {
4204*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4205*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kWidth  = 16;
4206*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kHeight = 16;
4207*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kDepth  = 16;
4208*8975f5c5SAndroid Build Coastguard Worker 
4209*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
4210*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, texture);
4211*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, kWidth, kHeight, kDepth);
4212*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
4213*8975f5c5SAndroid Build Coastguard Worker 
4214*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, 8> clearColors = {GLColor::red,    GLColor::green, GLColor::blue,
4215*8975f5c5SAndroid Build Coastguard Worker                                           GLColor::yellow, GLColor::cyan,  GLColor::magenta,
4216*8975f5c5SAndroid Build Coastguard Worker                                           GLColor::white,  GLColor::red};
4217*8975f5c5SAndroid Build Coastguard Worker 
4218*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4219*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4220*8975f5c5SAndroid Build Coastguard Worker 
4221*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t k = 0; k < 2; ++k)
4222*8975f5c5SAndroid Build Coastguard Worker     {
4223*8975f5c5SAndroid Build Coastguard Worker         for (uint32_t j = 0; j < 2; ++j)
4224*8975f5c5SAndroid Build Coastguard Worker         {
4225*8975f5c5SAndroid Build Coastguard Worker             for (uint32_t i = 0; i < 2; ++i)
4226*8975f5c5SAndroid Build Coastguard Worker             {
4227*8975f5c5SAndroid Build Coastguard Worker                 glClearTexSubImageEXT(texture, 0, i * kWidth / 2, j * kHeight / 2, k * kDepth / 2,
4228*8975f5c5SAndroid Build Coastguard Worker                                       kWidth / 2, kHeight / 2, kDepth / 2, GL_RGBA,
4229*8975f5c5SAndroid Build Coastguard Worker                                       GL_UNSIGNED_BYTE, &clearColors[(k << 2) + (j << 1) + i]);
4230*8975f5c5SAndroid Build Coastguard Worker             }
4231*8975f5c5SAndroid Build Coastguard Worker         }
4232*8975f5c5SAndroid Build Coastguard Worker     }
4233*8975f5c5SAndroid Build Coastguard Worker 
4234*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = 0; z < kDepth / 2; ++z)
4235*8975f5c5SAndroid Build Coastguard Worker     {
4236*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0, z);
4237*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth / 2, kHeight / 2, clearColors[0]);
4238*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(kWidth / 2, 0, kWidth / 2, kHeight / 2, clearColors[1]);
4239*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, kHeight / 2, kWidth / 2, kHeight / 2, clearColors[2]);
4240*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2, clearColors[3]);
4241*8975f5c5SAndroid Build Coastguard Worker     }
4242*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = kDepth / 2; z < kDepth; ++z)
4243*8975f5c5SAndroid Build Coastguard Worker     {
4244*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0, z);
4245*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth / 2, kHeight / 2, clearColors[4]);
4246*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(kWidth / 2, 0, kWidth / 2, kHeight / 2, clearColors[5]);
4247*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, kHeight / 2, kWidth / 2, kHeight / 2, clearColors[6]);
4248*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2, clearColors[7]);
4249*8975f5c5SAndroid Build Coastguard Worker     }
4250*8975f5c5SAndroid Build Coastguard Worker }
4251*8975f5c5SAndroid Build Coastguard Worker 
4252*8975f5c5SAndroid Build Coastguard Worker // Test that clearing slices of a 3D texture and reading them back works.
TEST_P(ClearTextureEXTTest,Clear2DArray)4253*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Clear2DArray)
4254*8975f5c5SAndroid Build Coastguard Worker {
4255*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4256*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kWidth  = 64;
4257*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kHeight = 64;
4258*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kDepth  = 4;
4259*8975f5c5SAndroid Build Coastguard Worker 
4260*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
4261*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
4262*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, kWidth, kHeight, kDepth);
4263*8975f5c5SAndroid Build Coastguard Worker 
4264*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kDepth> clearColors = {GLColor::red, GLColor::green, GLColor::blue,
4265*8975f5c5SAndroid Build Coastguard Worker                                                GLColor::yellow};
4266*8975f5c5SAndroid Build Coastguard Worker 
4267*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4268*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4269*8975f5c5SAndroid Build Coastguard Worker 
4270*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(texture, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4271*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = 0; z < kDepth; ++z)
4272*8975f5c5SAndroid Build Coastguard Worker     {
4273*8975f5c5SAndroid Build Coastguard Worker         glClearTexSubImageEXT(texture, 0, 0, 0, z, kWidth, kHeight, 1, GL_RGBA, GL_UNSIGNED_BYTE,
4274*8975f5c5SAndroid Build Coastguard Worker                               &clearColors[z]);
4275*8975f5c5SAndroid Build Coastguard Worker     }
4276*8975f5c5SAndroid Build Coastguard Worker 
4277*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t z = 0; z < kDepth; ++z)
4278*8975f5c5SAndroid Build Coastguard Worker     {
4279*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0, z);
4280*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, clearColors[z]);
4281*8975f5c5SAndroid Build Coastguard Worker     }
4282*8975f5c5SAndroid Build Coastguard Worker }
4283*8975f5c5SAndroid Build Coastguard Worker 
4284*8975f5c5SAndroid Build Coastguard Worker // Test that luminance alpha textures are cleared correctly with GL_EXT_clear_texture. Regression
4285*8975f5c5SAndroid Build Coastguard Worker // test for emulated luma formats.
TEST_P(ClearTextureEXTTest,Luma)4286*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Luma)
4287*8975f5c5SAndroid Build Coastguard Worker {
4288*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4289*8975f5c5SAndroid Build Coastguard Worker 
4290*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with no data.
4291*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4292*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4293*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4294*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4295*8975f5c5SAndroid Build Coastguard Worker 
4296*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
4297*8975f5c5SAndroid Build Coastguard Worker 
4298*8975f5c5SAndroid Build Coastguard Worker     // Clear the entire texture to transparent black and test
4299*8975f5c5SAndroid Build Coastguard Worker     GLubyte luminanceClearValue = 192;
4300*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 16, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
4301*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
4302*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &luminanceClearValue);
4303*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4304*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(
4305*8975f5c5SAndroid Build Coastguard Worker         0, 0, getWindowWidth(), getWindowHeight(),
4306*8975f5c5SAndroid Build Coastguard Worker         GLColor(luminanceClearValue, luminanceClearValue, luminanceClearValue, 255));
4307*8975f5c5SAndroid Build Coastguard Worker 
4308*8975f5c5SAndroid Build Coastguard Worker     GLubyte lumaClearValue[2] = {128, 64};
4309*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 16, 16, 0, GL_LUMINANCE_ALPHA,
4310*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
4311*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, &lumaClearValue);
4312*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4313*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(
4314*8975f5c5SAndroid Build Coastguard Worker         0, 0, getWindowWidth(), getWindowHeight(),
4315*8975f5c5SAndroid Build Coastguard Worker         GLColor(lumaClearValue[0], lumaClearValue[0], lumaClearValue[0], lumaClearValue[1]));
4316*8975f5c5SAndroid Build Coastguard Worker }
4317*8975f5c5SAndroid Build Coastguard Worker 
4318*8975f5c5SAndroid Build Coastguard Worker // Test that luminance alpha float textures are cleared correctly with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,LumaAlphaFloat)4319*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, LumaAlphaFloat)
4320*8975f5c5SAndroid Build Coastguard Worker {
4321*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4322*8975f5c5SAndroid Build Coastguard Worker 
4323*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with no data.
4324*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4325*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4326*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4327*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4328*8975f5c5SAndroid Build Coastguard Worker 
4329*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
4330*8975f5c5SAndroid Build Coastguard Worker 
4331*8975f5c5SAndroid Build Coastguard Worker     GLfloat lumaClearValue[2] = {0.5, 0.25};
4332*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 16, 16, 0, GL_LUMINANCE_ALPHA, GL_FLOAT,
4333*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
4334*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_LUMINANCE_ALPHA, GL_FLOAT, &lumaClearValue);
4335*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4336*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0,
4337*8975f5c5SAndroid Build Coastguard Worker                             GLColor(lumaClearValue[0] * 255, lumaClearValue[0] * 255,
4338*8975f5c5SAndroid Build Coastguard Worker                                     lumaClearValue[0] * 255, lumaClearValue[1] * 255),
4339*8975f5c5SAndroid Build Coastguard Worker                             1);
4340*8975f5c5SAndroid Build Coastguard Worker }
4341*8975f5c5SAndroid Build Coastguard Worker 
4342*8975f5c5SAndroid Build Coastguard Worker // Test that interleaving glClearTexImageEXT and glTexSubImage2D calls produces the correct texture
4343*8975f5c5SAndroid Build Coastguard Worker // data.
TEST_P(ClearTextureEXTTest,InterleavedUploads)4344*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, InterleavedUploads)
4345*8975f5c5SAndroid Build Coastguard Worker {
4346*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4347*8975f5c5SAndroid Build Coastguard Worker 
4348*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with no data.
4349*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4350*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4351*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4352*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4353*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4354*8975f5c5SAndroid Build Coastguard Worker 
4355*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
4356*8975f5c5SAndroid Build Coastguard Worker 
4357*8975f5c5SAndroid Build Coastguard Worker     // Clear the entire texture to transparent black and test
4358*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4359*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4360*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::transparentBlack);
4361*8975f5c5SAndroid Build Coastguard Worker 
4362*8975f5c5SAndroid Build Coastguard Worker     // TexSubImage a corner
4363*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redBlock(8 * 8, GLColor::red);
4364*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGBA, GL_UNSIGNED_BYTE, redBlock.data());
4365*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4366*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
4367*8975f5c5SAndroid Build Coastguard Worker 
4368*8975f5c5SAndroid Build Coastguard Worker     // Clear and tex sub image together
4369*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 0, 8, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::blue);
4370*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGBA, GL_UNSIGNED_BYTE, redBlock.data());
4371*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4372*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
4373*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight() / 2,
4374*8975f5c5SAndroid Build Coastguard Worker                          GLColor::blue);
4375*8975f5c5SAndroid Build Coastguard Worker }
4376*8975f5c5SAndroid Build Coastguard Worker 
4377*8975f5c5SAndroid Build Coastguard Worker // Test clearing integer textures with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,IntegerTexture)4378*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, IntegerTexture)
4379*8975f5c5SAndroid Build Coastguard Worker {
4380*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
4381*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4382*8975f5c5SAndroid Build Coastguard Worker 
4383*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4384*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4385*8975f5c5SAndroid Build Coastguard Worker 
4386*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4387*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4388*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
4389*8975f5c5SAndroid Build Coastguard Worker 
4390*8975f5c5SAndroid Build Coastguard Worker     GLColor32I rgba32iTestValue(-128, 256, -512, 1024);
4391*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, 16, 16, 0, GL_RGBA_INTEGER, GL_INT, nullptr);
4392*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA_INTEGER, GL_INT, &rgba32iTestValue);
4393*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4394*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_32I_COLOR(0, 0, rgba32iTestValue);
4395*8975f5c5SAndroid Build Coastguard Worker 
4396*8975f5c5SAndroid Build Coastguard Worker     GLColor32UI rgba32uiTestValue(128, 256, 512, 1024);
4397*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32UI, 16, 16, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT,
4398*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
4399*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, &rgba32uiTestValue);
4400*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4401*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_32UI_COLOR(0, 0, rgba32uiTestValue);
4402*8975f5c5SAndroid Build Coastguard Worker }
4403*8975f5c5SAndroid Build Coastguard Worker 
4404*8975f5c5SAndroid Build Coastguard Worker // Test clearing float32 textures with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,Float32Texture)4405*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Float32Texture)
4406*8975f5c5SAndroid Build Coastguard Worker {
4407*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
4408*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4409*8975f5c5SAndroid Build Coastguard Worker 
4410*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4411*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4412*8975f5c5SAndroid Build Coastguard Worker 
4413*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4414*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4415*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
4416*8975f5c5SAndroid Build Coastguard Worker 
4417*8975f5c5SAndroid Build Coastguard Worker     GLColor32F rgba32fTestValue(0.1, 0.2, 0.3, 0.4);
4418*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 16, 0, GL_RGBA, GL_FLOAT, nullptr);
4419*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_FLOAT, &rgba32fTestValue);
4420*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4421*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_32F_EQ(0, 0, rgba32fTestValue.R, rgba32fTestValue.G, rgba32fTestValue.B,
4422*8975f5c5SAndroid Build Coastguard Worker                         rgba32fTestValue.A);
4423*8975f5c5SAndroid Build Coastguard Worker }
4424*8975f5c5SAndroid Build Coastguard Worker 
4425*8975f5c5SAndroid Build Coastguard Worker // Test clearing depth textures with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,DepthTexture)4426*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, DepthTexture)
4427*8975f5c5SAndroid Build Coastguard Worker {
4428*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
4429*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4430*8975f5c5SAndroid Build Coastguard Worker 
4431*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTex;
4432*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTex);
4433*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4434*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4435*8975f5c5SAndroid Build Coastguard Worker 
4436*8975f5c5SAndroid Build Coastguard Worker     GLTexture depthTex;
4437*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, depthTex);
4438*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 16, 16, 0, GL_DEPTH_COMPONENT,
4439*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT, nullptr);
4440*8975f5c5SAndroid Build Coastguard Worker 
4441*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4442*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4443*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
4444*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTex, 0);
4445*8975f5c5SAndroid Build Coastguard Worker 
4446*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
4447*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
4448*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
4449*8975f5c5SAndroid Build Coastguard Worker 
4450*8975f5c5SAndroid Build Coastguard Worker     const GLuint depthClearZero = 0;
4451*8975f5c5SAndroid Build Coastguard Worker     const GLuint depthClearOne  = std::numeric_limits<GLuint>::max();
4452*8975f5c5SAndroid Build Coastguard Worker 
4453*8975f5c5SAndroid Build Coastguard Worker     // Draw doesn't pass the depth test. Texture has 0.0.
4454*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(depthTex, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, &depthClearZero);
4455*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4456*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
4457*8975f5c5SAndroid Build Coastguard Worker 
4458*8975f5c5SAndroid Build Coastguard Worker     // Draw passes the depth test. Texture has 1.0.
4459*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(depthTex, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, &depthClearOne);
4460*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4461*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
4462*8975f5c5SAndroid Build Coastguard Worker 
4463*8975f5c5SAndroid Build Coastguard Worker     // Left side passes, right side fails
4464*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4465*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(depthTex, 0, 0, 0, 0, 8, 16, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
4466*8975f5c5SAndroid Build Coastguard Worker                           &depthClearZero);
4467*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(depthTex, 0, 8, 0, 0, 8, 16, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
4468*8975f5c5SAndroid Build Coastguard Worker                           &depthClearOne);
4469*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4470*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 16, GLColor::red);
4471*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 0, 8, 16, GLColor::blue);
4472*8975f5c5SAndroid Build Coastguard Worker }
4473*8975f5c5SAndroid Build Coastguard Worker 
4474*8975f5c5SAndroid Build Coastguard Worker // Test clearing float depth textures (32-bit) with GL_EXT_clear_texture
TEST_P(ClearTextureEXTTest,Depth32FTexture)4475*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Depth32FTexture)
4476*8975f5c5SAndroid Build Coastguard Worker {
4477*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
4478*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4479*8975f5c5SAndroid Build Coastguard Worker 
4480*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTex;
4481*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTex);
4482*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4483*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4484*8975f5c5SAndroid Build Coastguard Worker 
4485*8975f5c5SAndroid Build Coastguard Worker     GLTexture depthTex;
4486*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, depthTex);
4487*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 16, 16, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
4488*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
4489*8975f5c5SAndroid Build Coastguard Worker 
4490*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4491*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4492*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
4493*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTex, 0);
4494*8975f5c5SAndroid Build Coastguard Worker 
4495*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
4496*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
4497*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
4498*8975f5c5SAndroid Build Coastguard Worker 
4499*8975f5c5SAndroid Build Coastguard Worker     const GLfloat depthClearZero = 0.0;
4500*8975f5c5SAndroid Build Coastguard Worker     const GLfloat depthClearOne  = 1.0;
4501*8975f5c5SAndroid Build Coastguard Worker 
4502*8975f5c5SAndroid Build Coastguard Worker     // Draw doesn't pass the depth test. Texture has 0.0.
4503*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(depthTex, 0, GL_DEPTH_COMPONENT, GL_FLOAT, &depthClearZero);
4504*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4505*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
4506*8975f5c5SAndroid Build Coastguard Worker 
4507*8975f5c5SAndroid Build Coastguard Worker     // Draw passes the depth test. Texture has 1.0.
4508*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(depthTex, 0, GL_DEPTH_COMPONENT, GL_FLOAT, &depthClearOne);
4509*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4510*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
4511*8975f5c5SAndroid Build Coastguard Worker 
4512*8975f5c5SAndroid Build Coastguard Worker     // Left side passes, right side fails
4513*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4514*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(depthTex, 0, 0, 0, 0, 8, 16, 1, GL_DEPTH_COMPONENT, GL_FLOAT,
4515*8975f5c5SAndroid Build Coastguard Worker                           &depthClearZero);
4516*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(depthTex, 0, 8, 0, 0, 8, 16, 1, GL_DEPTH_COMPONENT, GL_FLOAT,
4517*8975f5c5SAndroid Build Coastguard Worker                           &depthClearOne);
4518*8975f5c5SAndroid Build Coastguard Worker 
4519*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4520*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 16, GLColor::red);
4521*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 0, 8, 16, GLColor::blue);
4522*8975f5c5SAndroid Build Coastguard Worker }
4523*8975f5c5SAndroid Build Coastguard Worker 
4524*8975f5c5SAndroid Build Coastguard Worker // Test clearing 16-bit depth textures with GL_EXT_clear_texture
TEST_P(ClearTextureEXTTest,Depth16Texture)4525*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Depth16Texture)
4526*8975f5c5SAndroid Build Coastguard Worker {
4527*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
4528*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4529*8975f5c5SAndroid Build Coastguard Worker 
4530*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTex;
4531*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTex);
4532*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4533*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4534*8975f5c5SAndroid Build Coastguard Worker 
4535*8975f5c5SAndroid Build Coastguard Worker     GLTexture depthTex;
4536*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, depthTex);
4537*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, 16, 16, 0, GL_DEPTH_COMPONENT,
4538*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_SHORT, nullptr);
4539*8975f5c5SAndroid Build Coastguard Worker 
4540*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4541*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4542*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
4543*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTex, 0);
4544*8975f5c5SAndroid Build Coastguard Worker 
4545*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
4546*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
4547*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
4548*8975f5c5SAndroid Build Coastguard Worker 
4549*8975f5c5SAndroid Build Coastguard Worker     const GLushort depthClearZero = 0;
4550*8975f5c5SAndroid Build Coastguard Worker     const GLushort depthClearOne  = std::numeric_limits<GLushort>::max();
4551*8975f5c5SAndroid Build Coastguard Worker 
4552*8975f5c5SAndroid Build Coastguard Worker     // Draw doesn't pass the depth test. Texture has 0.0.
4553*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(depthTex, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, &depthClearZero);
4554*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4555*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
4556*8975f5c5SAndroid Build Coastguard Worker 
4557*8975f5c5SAndroid Build Coastguard Worker     // Draw passes the depth test. Texture has 1.0.
4558*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(depthTex, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, &depthClearOne);
4559*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4560*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
4561*8975f5c5SAndroid Build Coastguard Worker 
4562*8975f5c5SAndroid Build Coastguard Worker     // Left side passes, right side fails
4563*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4564*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(depthTex, 0, 0, 0, 0, 8, 16, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
4565*8975f5c5SAndroid Build Coastguard Worker                           &depthClearZero);
4566*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(depthTex, 0, 8, 0, 0, 8, 16, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
4567*8975f5c5SAndroid Build Coastguard Worker                           &depthClearOne);
4568*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4569*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 16, GLColor::red);
4570*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 0, 8, 16, GLColor::blue);
4571*8975f5c5SAndroid Build Coastguard Worker }
4572*8975f5c5SAndroid Build Coastguard Worker 
4573*8975f5c5SAndroid Build Coastguard Worker // Test clearing stencil textures with GL_EXT_clear_texture
TEST_P(ClearTextureEXTTest,StencilTexture)4574*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, StencilTexture)
4575*8975f5c5SAndroid Build Coastguard Worker {
4576*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
4577*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4578*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_stencil8"));
4579*8975f5c5SAndroid Build Coastguard Worker 
4580*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTex;
4581*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTex);
4582*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4583*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4584*8975f5c5SAndroid Build Coastguard Worker 
4585*8975f5c5SAndroid Build Coastguard Worker     GLTexture stencilTex;
4586*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, stencilTex);
4587*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_STENCIL_INDEX8, 16, 16);
4588*8975f5c5SAndroid Build Coastguard Worker 
4589*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4590*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4591*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
4592*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, stencilTex, 0);
4593*8975f5c5SAndroid Build Coastguard Worker 
4594*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
4595*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
4596*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_LESS, 0xCC, 0xFF);
4597*8975f5c5SAndroid Build Coastguard Worker 
4598*8975f5c5SAndroid Build Coastguard Worker     const GLint stencilClearAA = 0xAA;
4599*8975f5c5SAndroid Build Coastguard Worker     const GLint stencilClearEE = 0xEE;
4600*8975f5c5SAndroid Build Coastguard Worker 
4601*8975f5c5SAndroid Build Coastguard Worker     // Draw doesn't pass the stencil test.
4602*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(stencilTex, 0, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, &stencilClearAA);
4603*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4604*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
4605*8975f5c5SAndroid Build Coastguard Worker 
4606*8975f5c5SAndroid Build Coastguard Worker     // Draw passes the stencil test.
4607*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(stencilTex, 0, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, &stencilClearEE);
4608*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4609*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
4610*8975f5c5SAndroid Build Coastguard Worker 
4611*8975f5c5SAndroid Build Coastguard Worker     // Left side passes, right side fails
4612*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4613*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(stencilTex, 0, 0, 0, 0, 8, 16, 1, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE,
4614*8975f5c5SAndroid Build Coastguard Worker                           &stencilClearAA);
4615*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(stencilTex, 0, 8, 0, 0, 8, 16, 1, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE,
4616*8975f5c5SAndroid Build Coastguard Worker                           &stencilClearEE);
4617*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4618*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 16, GLColor::red);
4619*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 0, 8, 16, GLColor::blue);
4620*8975f5c5SAndroid Build Coastguard Worker }
4621*8975f5c5SAndroid Build Coastguard Worker 
4622*8975f5c5SAndroid Build Coastguard Worker // Test clearing depth24/stencil8 textures with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,Depth24Stencil8Texture)4623*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Depth24Stencil8Texture)
4624*8975f5c5SAndroid Build Coastguard Worker {
4625*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
4626*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4627*8975f5c5SAndroid Build Coastguard Worker 
4628*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTex;
4629*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTex);
4630*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4631*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4632*8975f5c5SAndroid Build Coastguard Worker 
4633*8975f5c5SAndroid Build Coastguard Worker     GLTexture dsTex;
4634*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, dsTex);
4635*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, 16, 16);
4636*8975f5c5SAndroid Build Coastguard Worker 
4637*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4638*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4639*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
4640*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, dsTex, 0);
4641*8975f5c5SAndroid Build Coastguard Worker 
4642*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
4643*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
4644*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
4645*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
4646*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_LESS, 0xCC, 0xFF);
4647*8975f5c5SAndroid Build Coastguard Worker 
4648*8975f5c5SAndroid Build Coastguard Worker     GLuint dsValue0 = 0x000000AA;
4649*8975f5c5SAndroid Build Coastguard Worker     GLuint dsValue1 = 0x000000EE;
4650*8975f5c5SAndroid Build Coastguard Worker     GLuint dsValue2 = 0xFFFFFFAA;
4651*8975f5c5SAndroid Build Coastguard Worker     GLuint dsValue3 = 0xFFFFFFEE;
4652*8975f5c5SAndroid Build Coastguard Worker 
4653*8975f5c5SAndroid Build Coastguard Worker     // Draw doesn't pass the test.
4654*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(dsTex, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, &dsValue0);
4655*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4656*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
4657*8975f5c5SAndroid Build Coastguard Worker 
4658*8975f5c5SAndroid Build Coastguard Worker     // Draw passes the stencil test.
4659*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(dsTex, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, &dsValue3);
4660*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4661*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
4662*8975f5c5SAndroid Build Coastguard Worker 
4663*8975f5c5SAndroid Build Coastguard Worker     // Left side fails the depth test. Top side fails the stencil test.
4664*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4665*8975f5c5SAndroid Build Coastguard Worker 
4666*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(dsTex, 0, 0, 0, 0, 8, 8, 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
4667*8975f5c5SAndroid Build Coastguard Worker                           &dsValue0);
4668*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(dsTex, 0, 0, 8, 0, 8, 8, 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
4669*8975f5c5SAndroid Build Coastguard Worker                           &dsValue1);
4670*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(dsTex, 0, 8, 0, 0, 8, 8, 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
4671*8975f5c5SAndroid Build Coastguard Worker                           &dsValue2);
4672*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(dsTex, 0, 8, 8, 0, 8, 8, 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
4673*8975f5c5SAndroid Build Coastguard Worker                           &dsValue3);
4674*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4675*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 8, GLColor::red);
4676*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 16, GLColor::red);
4677*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 8, 8, 8, GLColor::blue);
4678*8975f5c5SAndroid Build Coastguard Worker }
4679*8975f5c5SAndroid Build Coastguard Worker 
4680*8975f5c5SAndroid Build Coastguard Worker // Test clearing depth32/stencil textures with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,Depth32FStencilTexture)4681*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Depth32FStencilTexture)
4682*8975f5c5SAndroid Build Coastguard Worker {
4683*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
4684*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4685*8975f5c5SAndroid Build Coastguard Worker 
4686*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTex;
4687*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTex);
4688*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4689*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4690*8975f5c5SAndroid Build Coastguard Worker 
4691*8975f5c5SAndroid Build Coastguard Worker     GLTexture dsTex;
4692*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, dsTex);
4693*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH32F_STENCIL8, 16, 16);
4694*8975f5c5SAndroid Build Coastguard Worker 
4695*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4696*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4697*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
4698*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, dsTex, 0);
4699*8975f5c5SAndroid Build Coastguard Worker 
4700*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
4701*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
4702*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
4703*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
4704*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_LESS, 0xCC, 0xFF);
4705*8975f5c5SAndroid Build Coastguard Worker 
4706*8975f5c5SAndroid Build Coastguard Worker     struct DSClearValue
4707*8975f5c5SAndroid Build Coastguard Worker     {
4708*8975f5c5SAndroid Build Coastguard Worker         GLfloat depth;
4709*8975f5c5SAndroid Build Coastguard Worker         GLuint stencil;
4710*8975f5c5SAndroid Build Coastguard Worker     };
4711*8975f5c5SAndroid Build Coastguard Worker 
4712*8975f5c5SAndroid Build Coastguard Worker     DSClearValue dsValue0 = {0, 0xAA};
4713*8975f5c5SAndroid Build Coastguard Worker     DSClearValue dsValue1 = {0, 0xEE};
4714*8975f5c5SAndroid Build Coastguard Worker     DSClearValue dsValue2 = {1, 0xAA};
4715*8975f5c5SAndroid Build Coastguard Worker     DSClearValue dsValue3 = {1, 0xEE};
4716*8975f5c5SAndroid Build Coastguard Worker 
4717*8975f5c5SAndroid Build Coastguard Worker     // Draw doesn't pass the test.
4718*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(dsTex, 0, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, &dsValue0);
4719*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4720*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
4721*8975f5c5SAndroid Build Coastguard Worker 
4722*8975f5c5SAndroid Build Coastguard Worker     // Draw passes the stencil test.
4723*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(dsTex, 0, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, &dsValue3);
4724*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4725*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
4726*8975f5c5SAndroid Build Coastguard Worker 
4727*8975f5c5SAndroid Build Coastguard Worker     // Left side fails the depth test. Top side fails the stencil test.
4728*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4729*8975f5c5SAndroid Build Coastguard Worker 
4730*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(dsTex, 0, 0, 0, 0, 8, 8, 1, GL_DEPTH_STENCIL,
4731*8975f5c5SAndroid Build Coastguard Worker                           GL_FLOAT_32_UNSIGNED_INT_24_8_REV, &dsValue0);
4732*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(dsTex, 0, 0, 8, 0, 8, 8, 1, GL_DEPTH_STENCIL,
4733*8975f5c5SAndroid Build Coastguard Worker                           GL_FLOAT_32_UNSIGNED_INT_24_8_REV, &dsValue1);
4734*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(dsTex, 0, 8, 0, 0, 8, 8, 1, GL_DEPTH_STENCIL,
4735*8975f5c5SAndroid Build Coastguard Worker                           GL_FLOAT_32_UNSIGNED_INT_24_8_REV, &dsValue2);
4736*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(dsTex, 0, 8, 8, 0, 8, 8, 1, GL_DEPTH_STENCIL,
4737*8975f5c5SAndroid Build Coastguard Worker                           GL_FLOAT_32_UNSIGNED_INT_24_8_REV, &dsValue3);
4738*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
4739*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 8, GLColor::red);
4740*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 16, GLColor::red);
4741*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 8, 8, 8, GLColor::blue);
4742*8975f5c5SAndroid Build Coastguard Worker }
4743*8975f5c5SAndroid Build Coastguard Worker 
4744*8975f5c5SAndroid Build Coastguard Worker // Test clearing different sets of cube map texture faces with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,ClearCubeFaces)4745*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, ClearCubeFaces)
4746*8975f5c5SAndroid Build Coastguard Worker {
4747*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4748*8975f5c5SAndroid Build Coastguard Worker 
4749*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with no data.
4750*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4751*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
4752*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < 6; i++)
4753*8975f5c5SAndroid Build Coastguard Worker     {
4754*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
4755*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, nullptr);
4756*8975f5c5SAndroid Build Coastguard Worker     }
4757*8975f5c5SAndroid Build Coastguard Worker 
4758*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4759*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4760*8975f5c5SAndroid Build Coastguard Worker 
4761*8975f5c5SAndroid Build Coastguard Worker     // Clear the entire texture
4762*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4763*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < 6; i++)
4764*8975f5c5SAndroid Build Coastguard Worker     {
4765*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
4766*8975f5c5SAndroid Build Coastguard Worker                                GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, tex, 0);
4767*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
4768*8975f5c5SAndroid Build Coastguard Worker     }
4769*8975f5c5SAndroid Build Coastguard Worker 
4770*8975f5c5SAndroid Build Coastguard Worker     // Clear different ranges of faces to different colors:
4771*8975f5c5SAndroid Build Coastguard Worker 
4772*8975f5c5SAndroid Build Coastguard Worker     // [0, 1] -> green
4773*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 0, 16, 16, 2, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
4774*8975f5c5SAndroid Build Coastguard Worker 
4775*8975f5c5SAndroid Build Coastguard Worker     // [1, 2] -> blue (partially overlaps previous clear)
4776*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 1, 16, 16, 2, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::blue);
4777*8975f5c5SAndroid Build Coastguard Worker 
4778*8975f5c5SAndroid Build Coastguard Worker     // [3, 5] -> cyan
4779*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 3, 16, 16, 3, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::cyan);
4780*8975f5c5SAndroid Build Coastguard Worker 
4781*8975f5c5SAndroid Build Coastguard Worker     // Test the colors
4782*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + 0,
4783*8975f5c5SAndroid Build Coastguard Worker                            tex, 0);
4784*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::green);
4785*8975f5c5SAndroid Build Coastguard Worker 
4786*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + 1,
4787*8975f5c5SAndroid Build Coastguard Worker                            tex, 0);
4788*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
4789*8975f5c5SAndroid Build Coastguard Worker 
4790*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + 2,
4791*8975f5c5SAndroid Build Coastguard Worker                            tex, 0);
4792*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
4793*8975f5c5SAndroid Build Coastguard Worker 
4794*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + 3,
4795*8975f5c5SAndroid Build Coastguard Worker                            tex, 0);
4796*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::cyan);
4797*8975f5c5SAndroid Build Coastguard Worker 
4798*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + 4,
4799*8975f5c5SAndroid Build Coastguard Worker                            tex, 0);
4800*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::cyan);
4801*8975f5c5SAndroid Build Coastguard Worker 
4802*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + 5,
4803*8975f5c5SAndroid Build Coastguard Worker                            tex, 0);
4804*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::cyan);
4805*8975f5c5SAndroid Build Coastguard Worker }
4806*8975f5c5SAndroid Build Coastguard Worker 
4807*8975f5c5SAndroid Build Coastguard Worker // Test clearing different sets of cube map array texture layer-faces with GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,ClearCubeMapArray)4808*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, ClearCubeMapArray)
4809*8975f5c5SAndroid Build Coastguard Worker {
4810*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4811*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_cube_map_array"));
4812*8975f5c5SAndroid Build Coastguard Worker 
4813*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with no data.
4814*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4815*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
4816*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 16, 16, 24, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4817*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
4818*8975f5c5SAndroid Build Coastguard Worker 
4819*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4820*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4821*8975f5c5SAndroid Build Coastguard Worker 
4822*8975f5c5SAndroid Build Coastguard Worker     // Clear the entire texture
4823*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
4824*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < 24; i++)
4825*8975f5c5SAndroid Build Coastguard Worker     {
4826*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, i);
4827*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
4828*8975f5c5SAndroid Build Coastguard Worker     }
4829*8975f5c5SAndroid Build Coastguard Worker 
4830*8975f5c5SAndroid Build Coastguard Worker     // Clear different ranges of faces to different colors:
4831*8975f5c5SAndroid Build Coastguard Worker 
4832*8975f5c5SAndroid Build Coastguard Worker     // [0, 4] -> green
4833*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 0, 16, 16, 5, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
4834*8975f5c5SAndroid Build Coastguard Worker 
4835*8975f5c5SAndroid Build Coastguard Worker     // [4, 6] -> blue (partially overlaps previous clear)
4836*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 4, 16, 16, 3, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::blue);
4837*8975f5c5SAndroid Build Coastguard Worker 
4838*8975f5c5SAndroid Build Coastguard Worker     // [12, 17] -> cyan
4839*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 12, 16, 16, 6, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::cyan);
4840*8975f5c5SAndroid Build Coastguard Worker 
4841*8975f5c5SAndroid Build Coastguard Worker     // Test the colors
4842*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < 4; i++)
4843*8975f5c5SAndroid Build Coastguard Worker     {
4844*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, i);
4845*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::green);
4846*8975f5c5SAndroid Build Coastguard Worker     }
4847*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 4; i < 7; i++)
4848*8975f5c5SAndroid Build Coastguard Worker     {
4849*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, i);
4850*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
4851*8975f5c5SAndroid Build Coastguard Worker     }
4852*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 12; i < 18; i++)
4853*8975f5c5SAndroid Build Coastguard Worker     {
4854*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, i);
4855*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::cyan);
4856*8975f5c5SAndroid Build Coastguard Worker     }
4857*8975f5c5SAndroid Build Coastguard Worker }
4858*8975f5c5SAndroid Build Coastguard Worker 
4859*8975f5c5SAndroid Build Coastguard Worker // Test clearing one level, then uploading an update to the same level and then drawing.
TEST_P(ClearTextureEXTTest,ClearOneLevelThenPartialUpdateAndDraw)4860*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, ClearOneLevelThenPartialUpdateAndDraw)
4861*8975f5c5SAndroid Build Coastguard Worker {
4862*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4863*8975f5c5SAndroid Build Coastguard Worker 
4864*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with prior data.
4865*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redBlock(16 * 16, GLColor::red);
4866*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> greenBlock(16 * 16, GLColor::green);
4867*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4868*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4869*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4870*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4871*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, redBlock.data());
4872*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, redBlock.data());
4873*8975f5c5SAndroid Build Coastguard Worker 
4874*8975f5c5SAndroid Build Coastguard Worker     // Clear one level and add another update on top of it.
4875*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::blue);
4876*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, greenBlock.data());
4877*8975f5c5SAndroid Build Coastguard Worker 
4878*8975f5c5SAndroid Build Coastguard Worker     // Draw.
4879*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
4880*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
4881*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4882*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, GLColor::green);
4883*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight(),
4884*8975f5c5SAndroid Build Coastguard Worker                          GLColor::blue);
4885*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, getWindowHeight() / 2, getWindowWidth(), getWindowHeight() / 2,
4886*8975f5c5SAndroid Build Coastguard Worker                          GLColor::blue);
4887*8975f5c5SAndroid Build Coastguard Worker }
4888*8975f5c5SAndroid Build Coastguard Worker 
4889*8975f5c5SAndroid Build Coastguard Worker // Test drawing, then partially clearing the texture and drawing again.
TEST_P(ClearTextureEXTTest,DrawThenClearPartiallyThenDraw)4890*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, DrawThenClearPartiallyThenDraw)
4891*8975f5c5SAndroid Build Coastguard Worker {
4892*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4893*8975f5c5SAndroid Build Coastguard Worker 
4894*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with prior data.
4895*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redBlock(16 * 16, GLColor::red);
4896*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4897*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4898*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4899*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4900*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, redBlock.data());
4901*8975f5c5SAndroid Build Coastguard Worker 
4902*8975f5c5SAndroid Build Coastguard Worker     // Draw.
4903*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
4904*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4905*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::red);
4906*8975f5c5SAndroid Build Coastguard Worker 
4907*8975f5c5SAndroid Build Coastguard Worker     // Clear a portion of the texture and draw again.
4908*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 0, 0, 0, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::yellow);
4909*8975f5c5SAndroid Build Coastguard Worker 
4910*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4911*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, GLColor::yellow);
4912*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight(),
4913*8975f5c5SAndroid Build Coastguard Worker                          GLColor::red);
4914*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, getWindowHeight() / 2, getWindowWidth(), getWindowHeight() / 2,
4915*8975f5c5SAndroid Build Coastguard Worker                          GLColor::red);
4916*8975f5c5SAndroid Build Coastguard Worker }
4917*8975f5c5SAndroid Build Coastguard Worker 
4918*8975f5c5SAndroid Build Coastguard Worker // Test partially clearing a mip level, applying an overlapping update and then drawing with it.
TEST_P(ClearTextureEXTTest,PartialClearThenOverlappingUploadThenDraw)4919*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, PartialClearThenOverlappingUploadThenDraw)
4920*8975f5c5SAndroid Build Coastguard Worker {
4921*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4922*8975f5c5SAndroid Build Coastguard Worker 
4923*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with prior data.
4924*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redBlock(16 * 16, GLColor::red);
4925*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> greenBlock(16 * 16, GLColor::green);
4926*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> blueBlock(16 * 16, GLColor::blue);
4927*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4928*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4929*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4930*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4931*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, blueBlock.data());
4932*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, redBlock.data());
4933*8975f5c5SAndroid Build Coastguard Worker 
4934*8975f5c5SAndroid Build Coastguard Worker     // Clear one level and add another update on top of it.
4935*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex, 1, 2, 2, 0, 4, 4, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::yellow);
4936*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, greenBlock.data());
4937*8975f5c5SAndroid Build Coastguard Worker 
4938*8975f5c5SAndroid Build Coastguard Worker     // Draw and verify.
4939*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
4940*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
4941*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4942*8975f5c5SAndroid Build Coastguard Worker 
4943*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, GLColor::green);
4944*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(getWindowWidth() / 4, getWindowWidth() / 2, getWindowWidth() / 2,
4945*8975f5c5SAndroid Build Coastguard Worker                          getWindowHeight() / 4, GLColor::yellow);
4946*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(getWindowWidth() / 2, getWindowWidth() / 4, getWindowWidth() / 4,
4947*8975f5c5SAndroid Build Coastguard Worker                          getWindowHeight() / 2, GLColor::yellow);
4948*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ((3 * getWindowWidth()) / 4, 0, getWindowWidth() / 4, getWindowHeight(),
4949*8975f5c5SAndroid Build Coastguard Worker                          GLColor::red);
4950*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, (3 * getWindowHeight()) / 4, getWindowWidth(), getWindowHeight() / 4,
4951*8975f5c5SAndroid Build Coastguard Worker                          GLColor::red);
4952*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight() / 4,
4953*8975f5c5SAndroid Build Coastguard Worker                          GLColor::red);
4954*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, getWindowHeight() / 2, getWindowWidth() / 4, getWindowHeight() / 2,
4955*8975f5c5SAndroid Build Coastguard Worker                          GLColor::red);
4956*8975f5c5SAndroid Build Coastguard Worker }
4957*8975f5c5SAndroid Build Coastguard Worker 
4958*8975f5c5SAndroid Build Coastguard Worker // Test clearing a mip level and generating mipmap based on its previous level and draw.
TEST_P(ClearTextureEXTTest,ClearLevelThenGenerateMipmapOnBaseThenDraw)4959*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, ClearLevelThenGenerateMipmapOnBaseThenDraw)
4960*8975f5c5SAndroid Build Coastguard Worker {
4961*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4962*8975f5c5SAndroid Build Coastguard Worker 
4963*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with prior data.
4964*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redBlock(16 * 16, GLColor::red);
4965*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> greenBlock(16 * 16, GLColor::green);
4966*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> blueBlock(16 * 16, GLColor::blue);
4967*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4968*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4969*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4970*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4971*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, redBlock.data());
4972*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, greenBlock.data());
4973*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, blueBlock.data());
4974*8975f5c5SAndroid Build Coastguard Worker 
4975*8975f5c5SAndroid Build Coastguard Worker     // Clear level 1 and then generate mipmap for the texture.
4976*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::yellow);
4977*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
4978*8975f5c5SAndroid Build Coastguard Worker 
4979*8975f5c5SAndroid Build Coastguard Worker     // Draw.
4980*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
4981*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4982*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::red);
4983*8975f5c5SAndroid Build Coastguard Worker }
4984*8975f5c5SAndroid Build Coastguard Worker 
4985*8975f5c5SAndroid Build Coastguard Worker // Test clearing a mip level and generating mipmap based on that level and draw.
TEST_P(ClearTextureEXTTest,ClearLevelThenGenerateMipmapOnLevelThenDraw)4986*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, ClearLevelThenGenerateMipmapOnLevelThenDraw)
4987*8975f5c5SAndroid Build Coastguard Worker {
4988*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
4989*8975f5c5SAndroid Build Coastguard Worker 
4990*8975f5c5SAndroid Build Coastguard Worker     // Create a 16x16 texture with prior data.
4991*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redBlock(16 * 16, GLColor::red);
4992*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> greenBlock(16 * 16, GLColor::green);
4993*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> blueBlock(16 * 16, GLColor::blue);
4994*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
4995*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
4996*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4997*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4998*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, redBlock.data());
4999*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, greenBlock.data());
5000*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, blueBlock.data());
5001*8975f5c5SAndroid Build Coastguard Worker 
5002*8975f5c5SAndroid Build Coastguard Worker     // Clear level 1 and then generate mipmap for the texture based on level 1.
5003*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::yellow);
5004*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5005*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
5006*8975f5c5SAndroid Build Coastguard Worker 
5007*8975f5c5SAndroid Build Coastguard Worker     // Draw.
5008*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
5009*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
5010*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::yellow);
5011*8975f5c5SAndroid Build Coastguard Worker }
5012*8975f5c5SAndroid Build Coastguard Worker 
5013*8975f5c5SAndroid Build Coastguard Worker // Test clearing a large 2D texture.
TEST_P(ClearTextureEXTTest,LargeTexture)5014*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, LargeTexture)
5015*8975f5c5SAndroid Build Coastguard Worker {
5016*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
5017*8975f5c5SAndroid Build Coastguard Worker 
5018*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kTexWidth  = 2048;
5019*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kTexHeight = 2048;
5020*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
5021*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
5022*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5023*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
5024*8975f5c5SAndroid Build Coastguard Worker 
5025*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
5026*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5027*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
5028*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5029*8975f5c5SAndroid Build Coastguard Worker 
5030*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
5031*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kTexWidth, kTexHeight, GLColor::red);
5032*8975f5c5SAndroid Build Coastguard Worker }
5033*8975f5c5SAndroid Build Coastguard Worker 
5034*8975f5c5SAndroid Build Coastguard Worker // Test that clearing works correctly after swizzling the texture components.
TEST_P(ClearTextureEXTTest,ClearDrawSwizzleClearDraw)5035*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, ClearDrawSwizzleClearDraw)
5036*8975f5c5SAndroid Build Coastguard Worker {
5037*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
5038*8975f5c5SAndroid Build Coastguard Worker 
5039*8975f5c5SAndroid Build Coastguard Worker     // Initialize texture and draw.
5040*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
5041*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
5042*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5043*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5044*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5045*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::cyan);
5046*8975f5c5SAndroid Build Coastguard Worker 
5047*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
5048*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
5049*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::cyan);
5050*8975f5c5SAndroid Build Coastguard Worker 
5051*8975f5c5SAndroid Build Coastguard Worker     // Change swizzling; left rotation of the RGB components.
5052*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_GREEN);
5053*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_BLUE);
5054*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
5055*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
5056*8975f5c5SAndroid Build Coastguard Worker 
5057*8975f5c5SAndroid Build Coastguard Worker     // Clear again and draw.
5058*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::yellow);
5059*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
5060*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::magenta);
5061*8975f5c5SAndroid Build Coastguard Worker }
5062*8975f5c5SAndroid Build Coastguard Worker 
5063*8975f5c5SAndroid Build Coastguard Worker // Test validation of GL_EXT_clear_texture.
TEST_P(ClearTextureEXTTest,Validation)5064*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, Validation)
5065*8975f5c5SAndroid Build Coastguard Worker {
5066*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
5067*8975f5c5SAndroid Build Coastguard Worker 
5068*8975f5c5SAndroid Build Coastguard Worker     // Texture 0 is invalid
5069*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(0, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
5070*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5071*8975f5c5SAndroid Build Coastguard Worker 
5072*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2D;
5073*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2D);
5074*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5075*8975f5c5SAndroid Build Coastguard Worker 
5076*8975f5c5SAndroid Build Coastguard Worker     // Out of bounds
5077*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex2D, 0, 1, 0, 0, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
5078*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5079*8975f5c5SAndroid Build Coastguard Worker 
5080*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex2D, 0, 0, 1, 0, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
5081*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5082*8975f5c5SAndroid Build Coastguard Worker 
5083*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex2D, 1, 0, 0, 0, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
5084*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5085*8975f5c5SAndroid Build Coastguard Worker 
5086*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex2D, 0, 0, 0, 1, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
5087*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5088*8975f5c5SAndroid Build Coastguard Worker 
5089*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex2D, 0, 0, 0, 0, 16, 16, 2, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
5090*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5091*8975f5c5SAndroid Build Coastguard Worker 
5092*8975f5c5SAndroid Build Coastguard Worker     // Negative offsets
5093*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(tex2D, 0, 4, 4, 0, -2, -2, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
5094*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5095*8975f5c5SAndroid Build Coastguard Worker 
5096*8975f5c5SAndroid Build Coastguard Worker     GLTexture texCube;
5097*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, texCube);
5098*8975f5c5SAndroid Build Coastguard Worker 
5099*8975f5c5SAndroid Build Coastguard Worker     // First and third cube faces are specified
5100*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 0, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
5101*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
5102*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 2, 0, GL_RGBA, 16, 16, 0, GL_RGBA,
5103*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
5104*8975f5c5SAndroid Build Coastguard Worker 
5105*8975f5c5SAndroid Build Coastguard Worker     // Unspecified cube face
5106*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(texCube, 0, 0, 0, 1, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE,
5107*8975f5c5SAndroid Build Coastguard Worker                           &GLColor::green);
5108*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5109*8975f5c5SAndroid Build Coastguard Worker 
5110*8975f5c5SAndroid Build Coastguard Worker     // Cube range with an unspecified face
5111*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(texCube, 0, 0, 0, 0, 16, 16, 3, GL_RGBA, GL_UNSIGNED_BYTE,
5112*8975f5c5SAndroid Build Coastguard Worker                           &GLColor::green);
5113*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5114*8975f5c5SAndroid Build Coastguard Worker 
5115*8975f5c5SAndroid Build Coastguard Worker     // Undefined level
5116*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex1Level;
5117*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex1Level);
5118*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5119*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex1Level, 1, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5120*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5121*8975f5c5SAndroid Build Coastguard Worker 
5122*8975f5c5SAndroid Build Coastguard Worker     // Compressed texture
5123*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2DCompressed;
5124*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2DCompressed);
5125*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 0, 128, nullptr);
5126*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(tex2DCompressed, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5127*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5128*8975f5c5SAndroid Build Coastguard Worker }
5129*8975f5c5SAndroid Build Coastguard Worker 
5130*8975f5c5SAndroid Build Coastguard Worker // Covers a driver bug that leaks color mask state into clear texture ops.
TEST_P(ClearTextureEXTTest,ClearTextureAfterMaskedClearBug)5131*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClearTextureEXTTest, ClearTextureAfterMaskedClearBug)
5132*8975f5c5SAndroid Build Coastguard Worker {
5133*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
5134*8975f5c5SAndroid Build Coastguard Worker 
5135*8975f5c5SAndroid Build Coastguard Worker     // Perform a masked clear
5136*8975f5c5SAndroid Build Coastguard Worker     {
5137*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
5138*8975f5c5SAndroid Build Coastguard Worker         glColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_TRUE);
5139*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
5140*8975f5c5SAndroid Build Coastguard Worker         glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
5141*8975f5c5SAndroid Build Coastguard Worker     }
5142*8975f5c5SAndroid Build Coastguard Worker 
5143*8975f5c5SAndroid Build Coastguard Worker     // Create a new texture with data, clear it, and sample
5144*8975f5c5SAndroid Build Coastguard Worker     {
5145*8975f5c5SAndroid Build Coastguard Worker         constexpr uint32_t kSize = 16;
5146*8975f5c5SAndroid Build Coastguard Worker         std::vector<unsigned char> pixelData(kSize * kSize * 4, 255);
5147*8975f5c5SAndroid Build Coastguard Worker 
5148*8975f5c5SAndroid Build Coastguard Worker         GLTexture tex;
5149*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, tex);
5150*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5151*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5152*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5153*8975f5c5SAndroid Build Coastguard Worker                      pixelData.data());
5154*8975f5c5SAndroid Build Coastguard Worker         glClearTexImageEXT(tex, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5155*8975f5c5SAndroid Build Coastguard Worker 
5156*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
5157*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
5158*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
5159*8975f5c5SAndroid Build Coastguard Worker     }
5160*8975f5c5SAndroid Build Coastguard Worker }
5161*8975f5c5SAndroid Build Coastguard Worker 
5162*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND(
5163*8975f5c5SAndroid Build Coastguard Worker     ClearTest,
5164*8975f5c5SAndroid Build Coastguard Worker     ES3_VULKAN().enable(Feature::ForceFallbackFormat),
5165*8975f5c5SAndroid Build Coastguard Worker     ES3_VULKAN().enable(Feature::PreferDrawClearOverVkCmdClearAttachments),
5166*8975f5c5SAndroid Build Coastguard Worker     ES2_WEBGPU());
5167*8975f5c5SAndroid Build Coastguard Worker 
5168*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ClearTestES3);
5169*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(
5170*8975f5c5SAndroid Build Coastguard Worker     ClearTestES3,
5171*8975f5c5SAndroid Build Coastguard Worker     ES3_VULKAN().enable(Feature::ForceFallbackFormat),
5172*8975f5c5SAndroid Build Coastguard Worker     ES3_VULKAN().enable(Feature::PreferDrawClearOverVkCmdClearAttachments));
5173*8975f5c5SAndroid Build Coastguard Worker 
5174*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ClearTestES31);
5175*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31_AND(
5176*8975f5c5SAndroid Build Coastguard Worker     ClearTestES31,
5177*8975f5c5SAndroid Build Coastguard Worker     ES31_VULKAN().enable(Feature::ForceFallbackFormat),
5178*8975f5c5SAndroid Build Coastguard Worker     ES31_VULKAN().enable(Feature::PreferDrawClearOverVkCmdClearAttachments));
5179*8975f5c5SAndroid Build Coastguard Worker 
5180*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_COMBINE_4(MaskedScissoredClearTest,
5181*8975f5c5SAndroid Build Coastguard Worker                                  MaskedScissoredClearVariationsTestPrint,
5182*8975f5c5SAndroid Build Coastguard Worker                                  testing::Range(0, 3),
5183*8975f5c5SAndroid Build Coastguard Worker                                  testing::Range(0, 3),
5184*8975f5c5SAndroid Build Coastguard Worker                                  testing::Range(0, 3),
5185*8975f5c5SAndroid Build Coastguard Worker                                  testing::Bool(),
5186*8975f5c5SAndroid Build Coastguard Worker                                  ANGLE_ALL_TEST_PLATFORMS_ES2,
5187*8975f5c5SAndroid Build Coastguard Worker                                  ANGLE_ALL_TEST_PLATFORMS_ES3,
5188*8975f5c5SAndroid Build Coastguard Worker                                  ES3_VULKAN()
5189*8975f5c5SAndroid Build Coastguard Worker                                      .disable(Feature::SupportsExtendedDynamicState)
5190*8975f5c5SAndroid Build Coastguard Worker                                      .disable(Feature::SupportsExtendedDynamicState2),
5191*8975f5c5SAndroid Build Coastguard Worker                                  ES3_VULKAN().disable(Feature::SupportsExtendedDynamicState2));
5192*8975f5c5SAndroid Build Coastguard Worker 
5193*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VulkanClearTest);
5194*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_COMBINE_4(VulkanClearTest,
5195*8975f5c5SAndroid Build Coastguard Worker                                  MaskedScissoredClearVariationsTestPrint,
5196*8975f5c5SAndroid Build Coastguard Worker                                  testing::Range(0, 3),
5197*8975f5c5SAndroid Build Coastguard Worker                                  testing::Range(0, 3),
5198*8975f5c5SAndroid Build Coastguard Worker                                  testing::Range(0, 3),
5199*8975f5c5SAndroid Build Coastguard Worker                                  testing::Bool(),
5200*8975f5c5SAndroid Build Coastguard Worker                                  ES2_VULKAN().enable(Feature::ForceFallbackFormat),
5201*8975f5c5SAndroid Build Coastguard Worker                                  ES2_VULKAN_SWIFTSHADER().enable(Feature::ForceFallbackFormat),
5202*8975f5c5SAndroid Build Coastguard Worker                                  ES3_VULKAN().enable(Feature::ForceFallbackFormat),
5203*8975f5c5SAndroid Build Coastguard Worker                                  ES3_VULKAN_SWIFTSHADER().enable(Feature::ForceFallbackFormat));
5204*8975f5c5SAndroid Build Coastguard Worker 
5205*8975f5c5SAndroid Build Coastguard Worker // Not all ANGLE backends support RGB backbuffers
5206*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ClearTestRGB);
5207*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(ClearTestRGB,
5208*8975f5c5SAndroid Build Coastguard Worker                        ES2_D3D11(),
5209*8975f5c5SAndroid Build Coastguard Worker                        ES3_D3D11(),
5210*8975f5c5SAndroid Build Coastguard Worker                        ES2_VULKAN(),
5211*8975f5c5SAndroid Build Coastguard Worker                        ES3_VULKAN(),
5212*8975f5c5SAndroid Build Coastguard Worker                        ES2_METAL(),
5213*8975f5c5SAndroid Build Coastguard Worker                        ES3_METAL());
5214*8975f5c5SAndroid Build Coastguard Worker 
5215*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ClearTestRGB_ES3);
5216*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(ClearTestRGB_ES3, ES3_D3D11(), ES3_VULKAN(), ES3_METAL());
5217*8975f5c5SAndroid Build Coastguard Worker 
5218*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ClearTextureEXTTest);
5219*8975f5c5SAndroid Build Coastguard Worker 
5220*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
5221