xref: /aosp_15_r20/external/angle/src/tests/gl_tests/FramebufferTest.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 // Framebuffer tests:
7*8975f5c5SAndroid Build Coastguard Worker //   Various tests related for Frambuffers.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "platform/autogen/FeaturesD3D_autogen.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "util/OSWindow.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker namespace
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker 
ExpectFramebufferCompleteOrUnsupported(GLenum binding)21*8975f5c5SAndroid Build Coastguard Worker void ExpectFramebufferCompleteOrUnsupported(GLenum binding)
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker     GLenum status = glCheckFramebufferStatus(binding);
24*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(status == GL_FRAMEBUFFER_COMPLETE || status == GL_FRAMEBUFFER_UNSUPPORTED);
25*8975f5c5SAndroid Build Coastguard Worker }
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
28*8975f5c5SAndroid Build Coastguard Worker 
29*8975f5c5SAndroid Build Coastguard Worker class FramebufferFormatsTest : public ANGLETest<>
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker   protected:
FramebufferFormatsTest()32*8975f5c5SAndroid Build Coastguard Worker     FramebufferFormatsTest() : mFramebuffer(0), mTexture(0), mRenderbuffer(0), mProgram(0)
33*8975f5c5SAndroid Build Coastguard Worker     {
34*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
35*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
36*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
37*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
38*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
39*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
40*8975f5c5SAndroid Build Coastguard Worker     }
41*8975f5c5SAndroid Build Coastguard Worker 
checkBitCount(GLuint fbo,GLenum channel,GLint minBits)42*8975f5c5SAndroid Build Coastguard Worker     void checkBitCount(GLuint fbo, GLenum channel, GLint minBits)
43*8975f5c5SAndroid Build Coastguard Worker     {
44*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker         GLint bits = 0;
47*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(channel, &bits);
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker         if (minBits == 0)
50*8975f5c5SAndroid Build Coastguard Worker         {
51*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(minBits, bits);
52*8975f5c5SAndroid Build Coastguard Worker         }
53*8975f5c5SAndroid Build Coastguard Worker         else
54*8975f5c5SAndroid Build Coastguard Worker         {
55*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GE(bits, minBits);
56*8975f5c5SAndroid Build Coastguard Worker         }
57*8975f5c5SAndroid Build Coastguard Worker     }
58*8975f5c5SAndroid Build Coastguard Worker 
testBitCounts(GLuint fbo,GLint minRedBits,GLint minGreenBits,GLint minBlueBits,GLint minAlphaBits,GLint minDepthBits,GLint minStencilBits)59*8975f5c5SAndroid Build Coastguard Worker     void testBitCounts(GLuint fbo,
60*8975f5c5SAndroid Build Coastguard Worker                        GLint minRedBits,
61*8975f5c5SAndroid Build Coastguard Worker                        GLint minGreenBits,
62*8975f5c5SAndroid Build Coastguard Worker                        GLint minBlueBits,
63*8975f5c5SAndroid Build Coastguard Worker                        GLint minAlphaBits,
64*8975f5c5SAndroid Build Coastguard Worker                        GLint minDepthBits,
65*8975f5c5SAndroid Build Coastguard Worker                        GLint minStencilBits)
66*8975f5c5SAndroid Build Coastguard Worker     {
67*8975f5c5SAndroid Build Coastguard Worker         checkBitCount(fbo, GL_RED_BITS, minRedBits);
68*8975f5c5SAndroid Build Coastguard Worker         checkBitCount(fbo, GL_GREEN_BITS, minGreenBits);
69*8975f5c5SAndroid Build Coastguard Worker         checkBitCount(fbo, GL_BLUE_BITS, minBlueBits);
70*8975f5c5SAndroid Build Coastguard Worker         checkBitCount(fbo, GL_ALPHA_BITS, minAlphaBits);
71*8975f5c5SAndroid Build Coastguard Worker         checkBitCount(fbo, GL_DEPTH_BITS, minDepthBits);
72*8975f5c5SAndroid Build Coastguard Worker         checkBitCount(fbo, GL_STENCIL_BITS, minStencilBits);
73*8975f5c5SAndroid Build Coastguard Worker     }
74*8975f5c5SAndroid Build Coastguard Worker 
testTextureFormat(GLenum internalFormat,GLint minRedBits,GLint minGreenBits,GLint minBlueBits,GLint minAlphaBits)75*8975f5c5SAndroid Build Coastguard Worker     void testTextureFormat(GLenum internalFormat,
76*8975f5c5SAndroid Build Coastguard Worker                            GLint minRedBits,
77*8975f5c5SAndroid Build Coastguard Worker                            GLint minGreenBits,
78*8975f5c5SAndroid Build Coastguard Worker                            GLint minBlueBits,
79*8975f5c5SAndroid Build Coastguard Worker                            GLint minAlphaBits)
80*8975f5c5SAndroid Build Coastguard Worker     {
81*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture);
82*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture);
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker         if (getClientMajorVersion() >= 3)
85*8975f5c5SAndroid Build Coastguard Worker         {
86*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2D(GL_TEXTURE_2D, 1, internalFormat, 1, 1);
87*8975f5c5SAndroid Build Coastguard Worker         }
88*8975f5c5SAndroid Build Coastguard Worker         else
89*8975f5c5SAndroid Build Coastguard Worker         {
90*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2DEXT(GL_TEXTURE_2D, 1, internalFormat, 1, 1);
91*8975f5c5SAndroid Build Coastguard Worker         }
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker         testBitCounts(mFramebuffer, minRedBits, minGreenBits, minBlueBits, minAlphaBits, 0, 0);
96*8975f5c5SAndroid Build Coastguard Worker     }
97*8975f5c5SAndroid Build Coastguard Worker 
testRenderbufferMultisampleFormat(int minESVersion,GLenum attachmentType,GLenum internalFormat)98*8975f5c5SAndroid Build Coastguard Worker     void testRenderbufferMultisampleFormat(int minESVersion,
99*8975f5c5SAndroid Build Coastguard Worker                                            GLenum attachmentType,
100*8975f5c5SAndroid Build Coastguard Worker                                            GLenum internalFormat)
101*8975f5c5SAndroid Build Coastguard Worker     {
102*8975f5c5SAndroid Build Coastguard Worker         int clientVersion = getClientMajorVersion();
103*8975f5c5SAndroid Build Coastguard Worker         if (clientVersion < minESVersion)
104*8975f5c5SAndroid Build Coastguard Worker         {
105*8975f5c5SAndroid Build Coastguard Worker             return;
106*8975f5c5SAndroid Build Coastguard Worker         }
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker         // Check that multisample is supported with at least two samples (minimum required is 1)
109*8975f5c5SAndroid Build Coastguard Worker         bool supports2Samples = false;
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker         if (clientVersion == 2)
112*8975f5c5SAndroid Build Coastguard Worker         {
113*8975f5c5SAndroid Build Coastguard Worker             if (IsGLExtensionEnabled("ANGLE_framebuffer_multisample"))
114*8975f5c5SAndroid Build Coastguard Worker             {
115*8975f5c5SAndroid Build Coastguard Worker                 int maxSamples;
116*8975f5c5SAndroid Build Coastguard Worker                 glGetIntegerv(GL_MAX_SAMPLES_ANGLE, &maxSamples);
117*8975f5c5SAndroid Build Coastguard Worker                 supports2Samples = maxSamples >= 2;
118*8975f5c5SAndroid Build Coastguard Worker             }
119*8975f5c5SAndroid Build Coastguard Worker         }
120*8975f5c5SAndroid Build Coastguard Worker         else
121*8975f5c5SAndroid Build Coastguard Worker         {
122*8975f5c5SAndroid Build Coastguard Worker             assert(clientVersion >= 3);
123*8975f5c5SAndroid Build Coastguard Worker             int maxSamples;
124*8975f5c5SAndroid Build Coastguard Worker             glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
125*8975f5c5SAndroid Build Coastguard Worker             supports2Samples = maxSamples >= 2;
126*8975f5c5SAndroid Build Coastguard Worker         }
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker         if (!supports2Samples)
129*8975f5c5SAndroid Build Coastguard Worker         {
130*8975f5c5SAndroid Build Coastguard Worker             return;
131*8975f5c5SAndroid Build Coastguard Worker         }
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker         glGenRenderbuffers(1, &mRenderbuffer);
134*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
137*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 2, internalFormat, 128, 128);
138*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
139*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachmentType, GL_RENDERBUFFER, mRenderbuffer);
140*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
141*8975f5c5SAndroid Build Coastguard Worker     }
142*8975f5c5SAndroid Build Coastguard Worker 
testZeroHeightRenderbuffer()143*8975f5c5SAndroid Build Coastguard Worker     void testZeroHeightRenderbuffer()
144*8975f5c5SAndroid Build Coastguard Worker     {
145*8975f5c5SAndroid Build Coastguard Worker         glGenRenderbuffers(1, &mRenderbuffer);
146*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
147*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 0);
148*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
149*8975f5c5SAndroid Build Coastguard Worker                                   mRenderbuffer);
150*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
151*8975f5c5SAndroid Build Coastguard Worker     }
152*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()153*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
154*8975f5c5SAndroid Build Coastguard Worker     {
155*8975f5c5SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFramebuffer);
156*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
157*8975f5c5SAndroid Build Coastguard Worker     }
158*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()159*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
160*8975f5c5SAndroid Build Coastguard Worker     {
161*8975f5c5SAndroid Build Coastguard Worker         if (mTexture != 0)
162*8975f5c5SAndroid Build Coastguard Worker         {
163*8975f5c5SAndroid Build Coastguard Worker             glDeleteTextures(1, &mTexture);
164*8975f5c5SAndroid Build Coastguard Worker             mTexture = 0;
165*8975f5c5SAndroid Build Coastguard Worker         }
166*8975f5c5SAndroid Build Coastguard Worker 
167*8975f5c5SAndroid Build Coastguard Worker         if (mRenderbuffer != 0)
168*8975f5c5SAndroid Build Coastguard Worker         {
169*8975f5c5SAndroid Build Coastguard Worker             glDeleteRenderbuffers(1, &mRenderbuffer);
170*8975f5c5SAndroid Build Coastguard Worker             mRenderbuffer = 0;
171*8975f5c5SAndroid Build Coastguard Worker         }
172*8975f5c5SAndroid Build Coastguard Worker 
173*8975f5c5SAndroid Build Coastguard Worker         if (mFramebuffer != 0)
174*8975f5c5SAndroid Build Coastguard Worker         {
175*8975f5c5SAndroid Build Coastguard Worker             glDeleteFramebuffers(1, &mFramebuffer);
176*8975f5c5SAndroid Build Coastguard Worker             mFramebuffer = 0;
177*8975f5c5SAndroid Build Coastguard Worker         }
178*8975f5c5SAndroid Build Coastguard Worker 
179*8975f5c5SAndroid Build Coastguard Worker         if (mProgram != 0)
180*8975f5c5SAndroid Build Coastguard Worker         {
181*8975f5c5SAndroid Build Coastguard Worker             glDeleteProgram(mProgram);
182*8975f5c5SAndroid Build Coastguard Worker             mProgram = 0;
183*8975f5c5SAndroid Build Coastguard Worker         }
184*8975f5c5SAndroid Build Coastguard Worker     }
185*8975f5c5SAndroid Build Coastguard Worker 
186*8975f5c5SAndroid Build Coastguard Worker     GLuint mFramebuffer;
187*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture;
188*8975f5c5SAndroid Build Coastguard Worker     GLuint mRenderbuffer;
189*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram;
190*8975f5c5SAndroid Build Coastguard Worker };
191*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferFormatsTest,RGBA4)192*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RGBA4)
193*8975f5c5SAndroid Build Coastguard Worker {
194*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
195*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_EXT_texture_storage"));
196*8975f5c5SAndroid Build Coastguard Worker 
197*8975f5c5SAndroid Build Coastguard Worker     testTextureFormat(GL_RGBA4, 4, 4, 4, 4);
198*8975f5c5SAndroid Build Coastguard Worker }
199*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferFormatsTest,RGB565)200*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RGB565)
201*8975f5c5SAndroid Build Coastguard Worker {
202*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
203*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_EXT_texture_storage"));
204*8975f5c5SAndroid Build Coastguard Worker 
205*8975f5c5SAndroid Build Coastguard Worker     testTextureFormat(GL_RGB565, 5, 6, 5, 0);
206*8975f5c5SAndroid Build Coastguard Worker }
207*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferFormatsTest,RGB8)208*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RGB8)
209*8975f5c5SAndroid Build Coastguard Worker {
210*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
211*8975f5c5SAndroid Build Coastguard Worker                        (!IsGLExtensionEnabled("GL_OES_rgb8_rgba8") ||
212*8975f5c5SAndroid Build Coastguard Worker                         !IsGLExtensionEnabled("GL_EXT_texture_storage")));
213*8975f5c5SAndroid Build Coastguard Worker 
214*8975f5c5SAndroid Build Coastguard Worker     testTextureFormat(GL_RGB8_OES, 8, 8, 8, 0);
215*8975f5c5SAndroid Build Coastguard Worker }
216*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferFormatsTest,BGRA8)217*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, BGRA8)
218*8975f5c5SAndroid Build Coastguard Worker {
219*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
220*8975f5c5SAndroid Build Coastguard Worker         !IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888") ||
221*8975f5c5SAndroid Build Coastguard Worker         (getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_texture_storage")));
222*8975f5c5SAndroid Build Coastguard Worker 
223*8975f5c5SAndroid Build Coastguard Worker     testTextureFormat(GL_BGRA8_EXT, 8, 8, 8, 8);
224*8975f5c5SAndroid Build Coastguard Worker }
225*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferFormatsTest,RGBA8)226*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RGBA8)
227*8975f5c5SAndroid Build Coastguard Worker {
228*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
229*8975f5c5SAndroid Build Coastguard Worker                        (!IsGLExtensionEnabled("GL_OES_rgb8_rgba8") ||
230*8975f5c5SAndroid Build Coastguard Worker                         !IsGLExtensionEnabled("GL_EXT_texture_storage")));
231*8975f5c5SAndroid Build Coastguard Worker 
232*8975f5c5SAndroid Build Coastguard Worker     testTextureFormat(GL_RGBA8_OES, 8, 8, 8, 8);
233*8975f5c5SAndroid Build Coastguard Worker }
234*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferFormatsTest,RenderbufferMultisample_DEPTH16)235*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RenderbufferMultisample_DEPTH16)
236*8975f5c5SAndroid Build Coastguard Worker {
237*8975f5c5SAndroid Build Coastguard Worker     testRenderbufferMultisampleFormat(2, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT16);
238*8975f5c5SAndroid Build Coastguard Worker }
239*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferFormatsTest,RenderbufferMultisample_DEPTH24)240*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RenderbufferMultisample_DEPTH24)
241*8975f5c5SAndroid Build Coastguard Worker {
242*8975f5c5SAndroid Build Coastguard Worker     testRenderbufferMultisampleFormat(3, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT24);
243*8975f5c5SAndroid Build Coastguard Worker }
244*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferFormatsTest,RenderbufferMultisample_DEPTH32F)245*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RenderbufferMultisample_DEPTH32F)
246*8975f5c5SAndroid Build Coastguard Worker {
247*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
248*8975f5c5SAndroid Build Coastguard Worker 
249*8975f5c5SAndroid Build Coastguard Worker     testRenderbufferMultisampleFormat(3, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT32F);
250*8975f5c5SAndroid Build Coastguard Worker }
251*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferFormatsTest,RenderbufferMultisample_DEPTH24_STENCIL8)252*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RenderbufferMultisample_DEPTH24_STENCIL8)
253*8975f5c5SAndroid Build Coastguard Worker {
254*8975f5c5SAndroid Build Coastguard Worker     testRenderbufferMultisampleFormat(3, GL_DEPTH_STENCIL_ATTACHMENT, GL_DEPTH24_STENCIL8);
255*8975f5c5SAndroid Build Coastguard Worker }
256*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferFormatsTest,RenderbufferMultisample_DEPTH32F_STENCIL8)257*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RenderbufferMultisample_DEPTH32F_STENCIL8)
258*8975f5c5SAndroid Build Coastguard Worker {
259*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
260*8975f5c5SAndroid Build Coastguard Worker 
261*8975f5c5SAndroid Build Coastguard Worker     testRenderbufferMultisampleFormat(3, GL_DEPTH_STENCIL_ATTACHMENT, GL_DEPTH32F_STENCIL8);
262*8975f5c5SAndroid Build Coastguard Worker }
263*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferFormatsTest,RenderbufferMultisample_STENCIL_INDEX8)264*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RenderbufferMultisample_STENCIL_INDEX8)
265*8975f5c5SAndroid Build Coastguard Worker {
266*8975f5c5SAndroid Build Coastguard Worker     // TODO(geofflang): Figure out how to support GLSTENCIL_INDEX8 on desktop GL
267*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsDesktopOpenGL());
268*8975f5c5SAndroid Build Coastguard Worker 
269*8975f5c5SAndroid Build Coastguard Worker     testRenderbufferMultisampleFormat(2, GL_STENCIL_ATTACHMENT, GL_STENCIL_INDEX8);
270*8975f5c5SAndroid Build Coastguard Worker }
271*8975f5c5SAndroid Build Coastguard Worker 
272*8975f5c5SAndroid Build Coastguard Worker // Test that binding an incomplete cube map is rejected by ANGLE.
TEST_P(FramebufferFormatsTest,IncompleteCubeMap)273*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, IncompleteCubeMap)
274*8975f5c5SAndroid Build Coastguard Worker {
275*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261821
276*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsFuchsia() && IsIntel() && IsVulkan());
277*8975f5c5SAndroid Build Coastguard Worker 
278*8975f5c5SAndroid Build Coastguard Worker     // First make a complete CubeMap.
279*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &mTexture);
280*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, mTexture);
281*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
282*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
283*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
284*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
285*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
286*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
287*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
288*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
289*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
290*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
291*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE,
292*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
293*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
294*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
295*8975f5c5SAndroid Build Coastguard Worker 
296*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
297*8975f5c5SAndroid Build Coastguard Worker                            mTexture, 0);
298*8975f5c5SAndroid Build Coastguard Worker 
299*8975f5c5SAndroid Build Coastguard Worker     // Verify the framebuffer is complete.
300*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
301*8975f5c5SAndroid Build Coastguard Worker 
302*8975f5c5SAndroid Build Coastguard Worker     // Make the CubeMap cube-incomplete.
303*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
304*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
305*8975f5c5SAndroid Build Coastguard Worker 
306*8975f5c5SAndroid Build Coastguard Worker     // Verify the framebuffer is incomplete.
307*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
308*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
309*8975f5c5SAndroid Build Coastguard Worker 
310*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
311*8975f5c5SAndroid Build Coastguard Worker 
312*8975f5c5SAndroid Build Coastguard Worker     // Verify drawing with the incomplete framebuffer produces a GL error
313*8975f5c5SAndroid Build Coastguard Worker     mProgram = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
314*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
315*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mProgram, essl1_shaders::PositionAttrib(), 0.5f);
316*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_FRAMEBUFFER_OPERATION);
317*8975f5c5SAndroid Build Coastguard Worker }
318*8975f5c5SAndroid Build Coastguard Worker 
319*8975f5c5SAndroid Build Coastguard Worker // Test that a renderbuffer with zero height but nonzero width is handled without crashes/asserts.
TEST_P(FramebufferFormatsTest,ZeroHeightRenderbuffer)320*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, ZeroHeightRenderbuffer)
321*8975f5c5SAndroid Build Coastguard Worker {
322*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker     testZeroHeightRenderbuffer();
325*8975f5c5SAndroid Build Coastguard Worker }
326*8975f5c5SAndroid Build Coastguard Worker 
327*8975f5c5SAndroid Build Coastguard Worker // Test to cover a bug where the read framebuffer affects the completeness of the draw framebuffer.
TEST_P(FramebufferFormatsTest,ReadDrawCompleteness)328*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, ReadDrawCompleteness)
329*8975f5c5SAndroid Build Coastguard Worker {
330*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker     GLTexture incompleteTexture;
333*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, incompleteTexture);
334*8975f5c5SAndroid Build Coastguard Worker 
335*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer incompleteFBO;
336*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, incompleteFBO);
337*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, incompleteTexture,
338*8975f5c5SAndroid Build Coastguard Worker                            0);
339*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
340*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
341*8975f5c5SAndroid Build Coastguard Worker 
342*8975f5c5SAndroid Build Coastguard Worker     GLTexture completeTexture;
343*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, completeTexture);
344*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight());
345*8975f5c5SAndroid Build Coastguard Worker 
346*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer completeFBO;
347*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, completeFBO);
348*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
349*8975f5c5SAndroid Build Coastguard Worker                            completeTexture, 0);
350*8975f5c5SAndroid Build Coastguard Worker 
351*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
352*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_READ_FRAMEBUFFER));
353*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
354*8975f5c5SAndroid Build Coastguard Worker 
355*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
356*8975f5c5SAndroid Build Coastguard Worker 
357*8975f5c5SAndroid Build Coastguard Worker     // Simple draw program.
358*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
359*8975f5c5SAndroid Build Coastguard Worker 
360*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f, 1.0f, true);
361*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
362*8975f5c5SAndroid Build Coastguard Worker 
363*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, completeFBO);
364*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
365*8975f5c5SAndroid Build Coastguard Worker }
366*8975f5c5SAndroid Build Coastguard Worker 
367*8975f5c5SAndroid Build Coastguard Worker // Test that a renderbuffer with RGBA8 format works as expected.
TEST_P(FramebufferFormatsTest,RGBA8Renderbuffer)368*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RGBA8Renderbuffer)
369*8975f5c5SAndroid Build Coastguard Worker {
370*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ARM_rgba8"));
371*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
372*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
373*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16);
374*8975f5c5SAndroid Build Coastguard Worker 
375*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
376*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
377*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
378*8975f5c5SAndroid Build Coastguard Worker 
379*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
380*8975f5c5SAndroid Build Coastguard Worker 
381*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
382*8975f5c5SAndroid Build Coastguard Worker 
383*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 1.0, 1.0, 1.0);
384*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
385*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
386*8975f5c5SAndroid Build Coastguard Worker }
387*8975f5c5SAndroid Build Coastguard Worker 
388*8975f5c5SAndroid Build Coastguard Worker // Test that a framebuffer can be attached to an RGB8 and an RGBA8 renderbuffer and work.
TEST_P(FramebufferFormatsTest,RGB8AndRGBA8Renderbuffers)389*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RGB8AndRGBA8Renderbuffers)
390*8975f5c5SAndroid Build Coastguard Worker {
391*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_rgb8_rgba8"));
392*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo1;
393*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo1);
394*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8, 16, 16);
395*8975f5c5SAndroid Build Coastguard Worker 
396*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo2;
397*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo2);
398*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16);
399*8975f5c5SAndroid Build Coastguard Worker 
400*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
401*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
402*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo1);
403*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
404*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
405*8975f5c5SAndroid Build Coastguard Worker 
406*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 1.0, 1.0, 0.1);
407*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
408*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
409*8975f5c5SAndroid Build Coastguard Worker 
410*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo2);
411*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
412*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
413*8975f5c5SAndroid Build Coastguard Worker 
414*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
415*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
416*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
417*8975f5c5SAndroid Build Coastguard Worker }
418*8975f5c5SAndroid Build Coastguard Worker 
419*8975f5c5SAndroid Build Coastguard Worker // Test that a renderbuffer with RGB565 format works as expected. This test is intended for some
420*8975f5c5SAndroid Build Coastguard Worker // back-end having no support for native RGB565 renderbuffer and thus having to emulate using RGBA
421*8975f5c5SAndroid Build Coastguard Worker // format.
TEST_P(FramebufferFormatsTest,RGB565Renderbuffer)422*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RGB565Renderbuffer)
423*8975f5c5SAndroid Build Coastguard Worker {
424*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
425*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
426*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB565, 1, 1);
427*8975f5c5SAndroid Build Coastguard Worker     // Check if GL_RGB565 is valid to render buffer.
428*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
429*8975f5c5SAndroid Build Coastguard Worker 
430*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer completeFBO;
431*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, completeFBO);
432*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
433*8975f5c5SAndroid Build Coastguard Worker 
434*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
435*8975f5c5SAndroid Build Coastguard Worker 
436*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
437*8975f5c5SAndroid Build Coastguard Worker 
438*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 0.5f);
439*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
440*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
441*8975f5c5SAndroid Build Coastguard Worker }
442*8975f5c5SAndroid Build Coastguard Worker 
443*8975f5c5SAndroid Build Coastguard Worker // Test that a renderbuffer with RGBA4 format works as expected.
TEST_P(FramebufferFormatsTest,RGBA4Renderbuffer)444*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RGBA4Renderbuffer)
445*8975f5c5SAndroid Build Coastguard Worker {
446*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
447*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
448*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 1, 1);
449*8975f5c5SAndroid Build Coastguard Worker     // Check if GL_RGBA4 is valid to render buffer.
450*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
451*8975f5c5SAndroid Build Coastguard Worker 
452*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer completeFBO;
453*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, completeFBO);
454*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
455*8975f5c5SAndroid Build Coastguard Worker 
456*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
457*8975f5c5SAndroid Build Coastguard Worker 
458*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
459*8975f5c5SAndroid Build Coastguard Worker 
460*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
461*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
462*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(255u, 0u, 0u, 255u));
463*8975f5c5SAndroid Build Coastguard Worker }
464*8975f5c5SAndroid Build Coastguard Worker 
465*8975f5c5SAndroid Build Coastguard Worker // Test that a renderbuffer with RGB5_A1 format works as expected.
TEST_P(FramebufferFormatsTest,RGB5A1Renderbuffer)466*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RGB5A1Renderbuffer)
467*8975f5c5SAndroid Build Coastguard Worker {
468*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
469*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
470*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB5_A1, 1, 1);
471*8975f5c5SAndroid Build Coastguard Worker     // Check if GL_RGB5_A1 is valid to render buffer.
472*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
473*8975f5c5SAndroid Build Coastguard Worker 
474*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer completeFBO;
475*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, completeFBO);
476*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
477*8975f5c5SAndroid Build Coastguard Worker 
478*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
479*8975f5c5SAndroid Build Coastguard Worker 
480*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
481*8975f5c5SAndroid Build Coastguard Worker 
482*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
483*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
484*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(255u, 0u, 0u, 255u));
485*8975f5c5SAndroid Build Coastguard Worker }
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker // Test that a renderbuffer with RGB8 format works as expected.
TEST_P(FramebufferFormatsTest,RGB8Renderbuffer)488*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferFormatsTest, RGB8Renderbuffer)
489*8975f5c5SAndroid Build Coastguard Worker {
490*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
491*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
492*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8, 1, 1);
493*8975f5c5SAndroid Build Coastguard Worker     // Check if GL_RGB8 is valid to render buffer.
494*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
495*8975f5c5SAndroid Build Coastguard Worker 
496*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer completeFBO;
497*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, completeFBO);
498*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
499*8975f5c5SAndroid Build Coastguard Worker 
500*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
501*8975f5c5SAndroid Build Coastguard Worker 
502*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
503*8975f5c5SAndroid Build Coastguard Worker 
504*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 0);
505*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
506*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
507*8975f5c5SAndroid Build Coastguard Worker }
508*8975f5c5SAndroid Build Coastguard Worker 
509*8975f5c5SAndroid Build Coastguard Worker class FramebufferTest_ES3 : public ANGLETest<>
510*8975f5c5SAndroid Build Coastguard Worker {
511*8975f5c5SAndroid Build Coastguard Worker   protected:
FramebufferTest_ES3()512*8975f5c5SAndroid Build Coastguard Worker     FramebufferTest_ES3()
513*8975f5c5SAndroid Build Coastguard Worker     {
514*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(kWidth);
515*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(kHeight);
516*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
517*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
518*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
519*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
520*8975f5c5SAndroid Build Coastguard Worker         setConfigDepthBits(24);
521*8975f5c5SAndroid Build Coastguard Worker         setConfigStencilBits(8);
522*8975f5c5SAndroid Build Coastguard Worker     }
523*8975f5c5SAndroid Build Coastguard Worker 
524*8975f5c5SAndroid Build Coastguard Worker     static constexpr GLsizei kWidth  = 64;
525*8975f5c5SAndroid Build Coastguard Worker     static constexpr GLsizei kHeight = 256;
526*8975f5c5SAndroid Build Coastguard Worker };
527*8975f5c5SAndroid Build Coastguard Worker 
528*8975f5c5SAndroid Build Coastguard Worker // Covers invalidating an incomplete framebuffer. This should be a no-op, but should not error.
TEST_P(FramebufferTest_ES3,InvalidateIncomplete)529*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, InvalidateIncomplete)
530*8975f5c5SAndroid Build Coastguard Worker {
531*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
532*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
533*8975f5c5SAndroid Build Coastguard Worker 
534*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
535*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
536*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
537*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
538*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
539*8975f5c5SAndroid Build Coastguard Worker 
540*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> attachments;
541*8975f5c5SAndroid Build Coastguard Worker     attachments.push_back(GL_COLOR_ATTACHMENT0);
542*8975f5c5SAndroid Build Coastguard Worker 
543*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments.data());
544*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
545*8975f5c5SAndroid Build Coastguard Worker }
546*8975f5c5SAndroid Build Coastguard Worker 
547*8975f5c5SAndroid Build Coastguard Worker // Covers sub-invalidating an incomplete framebuffer. This should be a no-op, but should not error.
TEST_P(FramebufferTest_ES3,SubInvalidateIncomplete)548*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, SubInvalidateIncomplete)
549*8975f5c5SAndroid Build Coastguard Worker {
550*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
551*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
552*8975f5c5SAndroid Build Coastguard Worker 
553*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
554*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
555*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
556*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
557*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
558*8975f5c5SAndroid Build Coastguard Worker 
559*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> attachments;
560*8975f5c5SAndroid Build Coastguard Worker     attachments.push_back(GL_COLOR_ATTACHMENT0);
561*8975f5c5SAndroid Build Coastguard Worker 
562*8975f5c5SAndroid Build Coastguard Worker     glInvalidateSubFramebuffer(GL_FRAMEBUFFER, 1, attachments.data(), 5, 5, 10, 10);
563*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
564*8975f5c5SAndroid Build Coastguard Worker }
565*8975f5c5SAndroid Build Coastguard Worker 
566*8975f5c5SAndroid Build Coastguard Worker enum class DisableDitherVsClear
567*8975f5c5SAndroid Build Coastguard Worker {
568*8975f5c5SAndroid Build Coastguard Worker     Before,
569*8975f5c5SAndroid Build Coastguard Worker     After
570*8975f5c5SAndroid Build Coastguard Worker };
571*8975f5c5SAndroid Build Coastguard Worker 
testDitherDisabledProperlyOnRGB565(GLColor gradientColor,DisableDitherVsClear disableDitherVsClear)572*8975f5c5SAndroid Build Coastguard Worker void testDitherDisabledProperlyOnRGB565(GLColor gradientColor,
573*8975f5c5SAndroid Build Coastguard Worker                                         DisableDitherVsClear disableDitherVsClear)
574*8975f5c5SAndroid Build Coastguard Worker {
575*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
576*8975f5c5SAndroid Build Coastguard Worker 
577*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kFramebufferWidth  = 4;
578*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kFramebufferHeight = 4;
579*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
580*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
581*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB565, kFramebufferWidth, kFramebufferHeight);
582*8975f5c5SAndroid Build Coastguard Worker 
583*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
584*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
585*8975f5c5SAndroid Build Coastguard Worker 
586*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = {
587*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
588*8975f5c5SAndroid Build Coastguard Worker         in highp vec4 a_position;
589*8975f5c5SAndroid Build Coastguard Worker         in mediump vec4 a_color;
590*8975f5c5SAndroid Build Coastguard Worker         out mediump vec4 v_color;
591*8975f5c5SAndroid Build Coastguard Worker         void main()
592*8975f5c5SAndroid Build Coastguard Worker         {
593*8975f5c5SAndroid Build Coastguard Worker         gl_Position = a_position;
594*8975f5c5SAndroid Build Coastguard Worker         v_color = a_color;
595*8975f5c5SAndroid Build Coastguard Worker         })",
596*8975f5c5SAndroid Build Coastguard Worker     };
597*8975f5c5SAndroid Build Coastguard Worker 
598*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = {
599*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
600*8975f5c5SAndroid Build Coastguard Worker             in mediump vec4 v_color;
601*8975f5c5SAndroid Build Coastguard Worker             layout(location = 0) out mediump vec4 o_color;
602*8975f5c5SAndroid Build Coastguard Worker             void main()
603*8975f5c5SAndroid Build Coastguard Worker             {
604*8975f5c5SAndroid Build Coastguard Worker                 o_color = v_color;
605*8975f5c5SAndroid Build Coastguard Worker             })",
606*8975f5c5SAndroid Build Coastguard Worker     };
607*8975f5c5SAndroid Build Coastguard Worker 
608*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
609*8975f5c5SAndroid Build Coastguard Worker 
610*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
611*8975f5c5SAndroid Build Coastguard Worker 
612*8975f5c5SAndroid Build Coastguard Worker     // setup quad data
613*8975f5c5SAndroid Build Coastguard Worker     // black ----> gradientColor
614*8975f5c5SAndroid Build Coastguard Worker     // **********
615*8975f5c5SAndroid Build Coastguard Worker     // *        *
616*8975f5c5SAndroid Build Coastguard Worker     // *        *
617*8975f5c5SAndroid Build Coastguard Worker     // **********
618*8975f5c5SAndroid Build Coastguard Worker     const std::vector<float> positions = {-1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f,
619*8975f5c5SAndroid Build Coastguard Worker                                           1.0f,  -1.0f, 0.0f, 1.0f, 1.0f,  1.0f, 0.0f, 1.0f};
620*8975f5c5SAndroid Build Coastguard Worker 
621*8975f5c5SAndroid Build Coastguard Worker     const std::vector<float> color0 = {0.0f,
622*8975f5c5SAndroid Build Coastguard Worker                                        0.0f,
623*8975f5c5SAndroid Build Coastguard Worker                                        0.0f,
624*8975f5c5SAndroid Build Coastguard Worker                                        0.0f,
625*8975f5c5SAndroid Build Coastguard Worker                                        0.0f,
626*8975f5c5SAndroid Build Coastguard Worker                                        0.0f,
627*8975f5c5SAndroid Build Coastguard Worker                                        0.0f,
628*8975f5c5SAndroid Build Coastguard Worker                                        0.0f,
629*8975f5c5SAndroid Build Coastguard Worker                                        gradientColor.R * 1.0f / 255.0f,
630*8975f5c5SAndroid Build Coastguard Worker                                        gradientColor.G * 1.0f / 255.0f,
631*8975f5c5SAndroid Build Coastguard Worker                                        gradientColor.B * 1.0f / 255.0f,
632*8975f5c5SAndroid Build Coastguard Worker                                        gradientColor.A * 1.0f / 255.0f,
633*8975f5c5SAndroid Build Coastguard Worker                                        gradientColor.R * 1.0f / 255.0f,
634*8975f5c5SAndroid Build Coastguard Worker                                        gradientColor.G * 1.0f / 255.0f,
635*8975f5c5SAndroid Build Coastguard Worker                                        gradientColor.B * 1.0f / 255.0f,
636*8975f5c5SAndroid Build Coastguard Worker                                        gradientColor.A * 1.0f / 255.0f};
637*8975f5c5SAndroid Build Coastguard Worker 
638*8975f5c5SAndroid Build Coastguard Worker     GLBuffer vertexBuffer;
639*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
640*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(positions[0]) * positions.size(), positions.data(),
641*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
642*8975f5c5SAndroid Build Coastguard Worker 
643*8975f5c5SAndroid Build Coastguard Worker     GLBuffer colorBuffer;
644*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
645*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(color0[0]) * color0.size(), color0.data(), GL_STATIC_DRAW);
646*8975f5c5SAndroid Build Coastguard Worker 
647*8975f5c5SAndroid Build Coastguard Worker     GLint vertexPosLocation = glGetAttribLocation(program, "a_position");
648*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(vertexPosLocation, -1);
649*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
650*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(vertexPosLocation);
651*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(vertexPosLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
652*8975f5c5SAndroid Build Coastguard Worker 
653*8975f5c5SAndroid Build Coastguard Worker     GLint vertexColorLocation = glGetAttribLocation(program, "a_color");
654*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(vertexColorLocation, -1);
655*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
656*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(vertexColorLocation);
657*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(vertexColorLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
658*8975f5c5SAndroid Build Coastguard Worker 
659*8975f5c5SAndroid Build Coastguard Worker     const std::vector<uint8_t> indices = {0, 2, 1, 1, 2, 3};
660*8975f5c5SAndroid Build Coastguard Worker 
661*8975f5c5SAndroid Build Coastguard Worker     GLBuffer indexBuffer;
662*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
663*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices[0]) * indices.size(), indices.data(),
664*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
665*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
666*8975f5c5SAndroid Build Coastguard Worker 
667*8975f5c5SAndroid Build Coastguard Worker     switch (disableDitherVsClear)
668*8975f5c5SAndroid Build Coastguard Worker     {
669*8975f5c5SAndroid Build Coastguard Worker         case DisableDitherVsClear::Before:
670*8975f5c5SAndroid Build Coastguard Worker             glDisable(GL_DITHER);
671*8975f5c5SAndroid Build Coastguard Worker             glClearColor(0.125, 0.25, 0.5, 1);
672*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
673*8975f5c5SAndroid Build Coastguard Worker             break;
674*8975f5c5SAndroid Build Coastguard Worker 
675*8975f5c5SAndroid Build Coastguard Worker         case DisableDitherVsClear::After:
676*8975f5c5SAndroid Build Coastguard Worker             glClearColor(0.125, 0.25, 0.5, 1);
677*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
678*8975f5c5SAndroid Build Coastguard Worker             glDisable(GL_DITHER);
679*8975f5c5SAndroid Build Coastguard Worker             break;
680*8975f5c5SAndroid Build Coastguard Worker     }
681*8975f5c5SAndroid Build Coastguard Worker 
682*8975f5c5SAndroid Build Coastguard Worker     // draw quad
683*8975f5c5SAndroid Build Coastguard Worker     glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_BYTE, 0);
684*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, 0);
685*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
686*8975f5c5SAndroid Build Coastguard Worker 
687*8975f5c5SAndroid Build Coastguard Worker     // validate that when disabling dithering, the color selection must be coordinate-independent
688*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> pixelData(kFramebufferWidth * kFramebufferHeight);
689*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kFramebufferWidth, kFramebufferHeight, GL_RGBA, GL_UNSIGNED_BYTE,
690*8975f5c5SAndroid Build Coastguard Worker                  pixelData.data());
691*8975f5c5SAndroid Build Coastguard Worker 
692*8975f5c5SAndroid Build Coastguard Worker     const int increasingDirectionSize = kFramebufferWidth;
693*8975f5c5SAndroid Build Coastguard Worker     const int constantDirectionSize   = kFramebufferHeight;
694*8975f5c5SAndroid Build Coastguard Worker 
695*8975f5c5SAndroid Build Coastguard Worker     for (int incrPos = 0; incrPos < increasingDirectionSize; incrPos++)
696*8975f5c5SAndroid Build Coastguard Worker     {
697*8975f5c5SAndroid Build Coastguard Worker         bool colorHasChanged = false;
698*8975f5c5SAndroid Build Coastguard Worker 
699*8975f5c5SAndroid Build Coastguard Worker         GLColor prevConstantDirectionPixel;
700*8975f5c5SAndroid Build Coastguard Worker 
701*8975f5c5SAndroid Build Coastguard Worker         for (int constPos = 0; constPos < constantDirectionSize; constPos++)
702*8975f5c5SAndroid Build Coastguard Worker         {
703*8975f5c5SAndroid Build Coastguard Worker             const int x = incrPos;
704*8975f5c5SAndroid Build Coastguard Worker             const int y = constPos;
705*8975f5c5SAndroid Build Coastguard Worker 
706*8975f5c5SAndroid Build Coastguard Worker             const int currentPixelLoc  = y * kFramebufferWidth + x;
707*8975f5c5SAndroid Build Coastguard Worker             const GLColor currentPixel = pixelData[currentPixelLoc];
708*8975f5c5SAndroid Build Coastguard Worker 
709*8975f5c5SAndroid Build Coastguard Worker             if (constPos > 0 && currentPixel != prevConstantDirectionPixel)
710*8975f5c5SAndroid Build Coastguard Worker             {
711*8975f5c5SAndroid Build Coastguard Worker                 if (colorHasChanged)
712*8975f5c5SAndroid Build Coastguard Worker                 {
713*8975f5c5SAndroid Build Coastguard Worker                     ASSERT(false);
714*8975f5c5SAndroid Build Coastguard Worker                 }
715*8975f5c5SAndroid Build Coastguard Worker                 else
716*8975f5c5SAndroid Build Coastguard Worker                 {
717*8975f5c5SAndroid Build Coastguard Worker                     colorHasChanged = true;
718*8975f5c5SAndroid Build Coastguard Worker                 }
719*8975f5c5SAndroid Build Coastguard Worker             }
720*8975f5c5SAndroid Build Coastguard Worker 
721*8975f5c5SAndroid Build Coastguard Worker             prevConstantDirectionPixel = currentPixel;
722*8975f5c5SAndroid Build Coastguard Worker         }
723*8975f5c5SAndroid Build Coastguard Worker     }
724*8975f5c5SAndroid Build Coastguard Worker }
725*8975f5c5SAndroid Build Coastguard Worker 
726*8975f5c5SAndroid Build Coastguard Worker // repro dEQP-GLES3.functional.dither.disabled.gradient_red failure
TEST_P(FramebufferTest_ES3,RGB565DisableDitheringGradientRedTest)727*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RGB565DisableDitheringGradientRedTest)
728*8975f5c5SAndroid Build Coastguard Worker {
729*8975f5c5SAndroid Build Coastguard Worker     testDitherDisabledProperlyOnRGB565(GLColor::red, DisableDitherVsClear::Before);
730*8975f5c5SAndroid Build Coastguard Worker     testDitherDisabledProperlyOnRGB565(GLColor::red, DisableDitherVsClear::After);
731*8975f5c5SAndroid Build Coastguard Worker }
732*8975f5c5SAndroid Build Coastguard Worker 
733*8975f5c5SAndroid Build Coastguard Worker // repro dEQP-GLES3.functional.dither.disabled.gradient_green failure
TEST_P(FramebufferTest_ES3,RGB565DisableDitheringGradientGreenTest)734*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RGB565DisableDitheringGradientGreenTest)
735*8975f5c5SAndroid Build Coastguard Worker {
736*8975f5c5SAndroid Build Coastguard Worker     testDitherDisabledProperlyOnRGB565(GLColor::green, DisableDitherVsClear::Before);
737*8975f5c5SAndroid Build Coastguard Worker     testDitherDisabledProperlyOnRGB565(GLColor::green, DisableDitherVsClear::After);
738*8975f5c5SAndroid Build Coastguard Worker }
739*8975f5c5SAndroid Build Coastguard Worker 
740*8975f5c5SAndroid Build Coastguard Worker // repro dEQP-GLES3.functional.dither.disabled.gradient_blue failure
TEST_P(FramebufferTest_ES3,RGB565DisableDitheringGradientBlueTest)741*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RGB565DisableDitheringGradientBlueTest)
742*8975f5c5SAndroid Build Coastguard Worker {
743*8975f5c5SAndroid Build Coastguard Worker     testDitherDisabledProperlyOnRGB565(GLColor::blue, DisableDitherVsClear::Before);
744*8975f5c5SAndroid Build Coastguard Worker     testDitherDisabledProperlyOnRGB565(GLColor::blue, DisableDitherVsClear::After);
745*8975f5c5SAndroid Build Coastguard Worker }
746*8975f5c5SAndroid Build Coastguard Worker 
747*8975f5c5SAndroid Build Coastguard Worker // repro dEQP-GLES3.functional.dither.disabled.gradient_white failure
TEST_P(FramebufferTest_ES3,RGB565DisableDitheringGradientWhiteTest)748*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RGB565DisableDitheringGradientWhiteTest)
749*8975f5c5SAndroid Build Coastguard Worker {
750*8975f5c5SAndroid Build Coastguard Worker     testDitherDisabledProperlyOnRGB565(GLColor::white, DisableDitherVsClear::Before);
751*8975f5c5SAndroid Build Coastguard Worker     testDitherDisabledProperlyOnRGB565(GLColor::white, DisableDitherVsClear::After);
752*8975f5c5SAndroid Build Coastguard Worker }
753*8975f5c5SAndroid Build Coastguard Worker 
754*8975f5c5SAndroid Build Coastguard Worker // Test that subinvalidate with no prior command works.  Regression test for the Vulkan backend that
755*8975f5c5SAndroid Build Coastguard Worker // assumed a render pass is started when sub invalidate is called.
TEST_P(FramebufferTest_ES3,SubInvalidateFirst)756*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, SubInvalidateFirst)
757*8975f5c5SAndroid Build Coastguard Worker {
758*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
759*8975f5c5SAndroid Build Coastguard Worker 
760*8975f5c5SAndroid Build Coastguard Worker     // Invalidate half of the framebuffer using swapped dimensions.
761*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 1> attachments = {GL_COLOR};
762*8975f5c5SAndroid Build Coastguard Worker     glInvalidateSubFramebuffer(GL_DRAW_FRAMEBUFFER, 1, attachments.data(), 0, 0, kHeight, kWidth);
763*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
764*8975f5c5SAndroid Build Coastguard Worker }
765*8975f5c5SAndroid Build Coastguard Worker 
766*8975f5c5SAndroid Build Coastguard Worker // Test that subinvalidate doesn't discard data outside area.  Uses swapped width/height for
767*8975f5c5SAndroid Build Coastguard Worker // invalidate which results in a partial invalidate, but also prevents bugs with Vulkan
768*8975f5c5SAndroid Build Coastguard Worker // pre-rotation.
TEST_P(FramebufferTest_ES3,SubInvalidatePartial)769*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, SubInvalidatePartial)
770*8975f5c5SAndroid Build Coastguard Worker {
771*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
772*8975f5c5SAndroid Build Coastguard Worker 
773*8975f5c5SAndroid Build Coastguard Worker     // Clear the attachment.
774*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
775*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
776*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
777*8975f5c5SAndroid Build Coastguard Worker 
778*8975f5c5SAndroid Build Coastguard Worker     // Invalidate half of the framebuffer using swapped dimensions.
779*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 1> attachments = {GL_COLOR};
780*8975f5c5SAndroid Build Coastguard Worker     glInvalidateSubFramebuffer(GL_DRAW_FRAMEBUFFER, 1, attachments.data(), 0, 0, kHeight, kWidth);
781*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
782*8975f5c5SAndroid Build Coastguard Worker 
783*8975f5c5SAndroid Build Coastguard Worker     // Make sure the other half is correct.
784*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kWidth, GLColor::red);
785*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kWidth, GLColor::red);
786*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kHeight - 1, GLColor::red);
787*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight - 1, GLColor::red);
788*8975f5c5SAndroid Build Coastguard Worker }
789*8975f5c5SAndroid Build Coastguard Worker 
790*8975f5c5SAndroid Build Coastguard Worker // Test that invalidating depth/stencil of the default framebuffer doesn't crash.
TEST_P(FramebufferTest_ES3,InvalidateDefaultFramebufferDepthStencil)791*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, InvalidateDefaultFramebufferDepthStencil)
792*8975f5c5SAndroid Build Coastguard Worker {
793*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
794*8975f5c5SAndroid Build Coastguard Worker 
795*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 2> attachments = {GL_DEPTH, GL_STENCIL};
796*8975f5c5SAndroid Build Coastguard Worker 
797*8975f5c5SAndroid Build Coastguard Worker     // Invalidate default framebuffer depth/stencil attachments
798*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 2, attachments.data());
799*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
800*8975f5c5SAndroid Build Coastguard Worker }
801*8975f5c5SAndroid Build Coastguard Worker 
802*8975f5c5SAndroid Build Coastguard Worker // Test that invalidating color of the default framebuffer doesn't crash.
TEST_P(FramebufferTest_ES3,InvalidateDefaultFramebufferColor)803*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, InvalidateDefaultFramebufferColor)
804*8975f5c5SAndroid Build Coastguard Worker {
805*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
806*8975f5c5SAndroid Build Coastguard Worker 
807*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 1> attachments = {GL_COLOR};
808*8975f5c5SAndroid Build Coastguard Worker 
809*8975f5c5SAndroid Build Coastguard Worker     // Invalidate default framebuffer color attachment.
810*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments.data());
811*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
812*8975f5c5SAndroid Build Coastguard Worker }
813*8975f5c5SAndroid Build Coastguard Worker 
814*8975f5c5SAndroid Build Coastguard Worker // Test that invalidating all attachments on the default framebuffer doesn't crash.
TEST_P(FramebufferTest_ES3,InvalidateDefaultFramebuffer)815*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, InvalidateDefaultFramebuffer)
816*8975f5c5SAndroid Build Coastguard Worker {
817*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
818*8975f5c5SAndroid Build Coastguard Worker 
819*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 3> attachments = {GL_COLOR, GL_DEPTH, GL_STENCIL};
820*8975f5c5SAndroid Build Coastguard Worker 
821*8975f5c5SAndroid Build Coastguard Worker     // Invalidate all default framebuffer attachments.
822*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 3, attachments.data());
823*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
824*8975f5c5SAndroid Build Coastguard Worker }
825*8975f5c5SAndroid Build Coastguard Worker 
826*8975f5c5SAndroid Build Coastguard Worker // Test that invalidating combined depth/stencil attachment doesn't crash.
TEST_P(FramebufferTest_ES3,InvalidateDepthStencil)827*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, InvalidateDepthStencil)
828*8975f5c5SAndroid Build Coastguard Worker {
829*8975f5c5SAndroid Build Coastguard Worker     // Create the framebuffer that will be invalidated
830*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
831*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
832*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 2, 2);
833*8975f5c5SAndroid Build Coastguard Worker 
834*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
835*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
836*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthStencil);
837*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
838*8975f5c5SAndroid Build Coastguard Worker 
839*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
840*8975f5c5SAndroid Build Coastguard Worker 
841*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 2> attachments = {GL_STENCIL_ATTACHMENT, GL_DEPTH_ATTACHMENT};
842*8975f5c5SAndroid Build Coastguard Worker 
843*8975f5c5SAndroid Build Coastguard Worker     // Invalidate both depth and stencil.
844*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 2, attachments.data());
845*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
846*8975f5c5SAndroid Build Coastguard Worker }
847*8975f5c5SAndroid Build Coastguard Worker 
848*8975f5c5SAndroid Build Coastguard Worker // Test that invalidating an FB with a stencil attachment, which
849*8975f5c5SAndroid Build Coastguard Worker // generates Validation errors, will not fail
TEST_P(FramebufferTest_ES3,InvalidateStencilAttachmentOnly)850*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, InvalidateStencilAttachmentOnly)
851*8975f5c5SAndroid Build Coastguard Worker {
852*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kBufferSize = 4096;
853*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> abdata(kBufferSize);
854*8975f5c5SAndroid Build Coastguard Worker     GLBuffer arrayBuffer;
855*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
856*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, kBufferSize, abdata.data(), GL_STATIC_DRAW);
857*8975f5c5SAndroid Build Coastguard Worker 
858*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> eabdata(kBufferSize);
859*8975f5c5SAndroid Build Coastguard Worker     GLBuffer elementArrayBuffer;
860*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, elementArrayBuffer);
861*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, kBufferSize, eabdata.data(), GL_STATIC_DRAW);
862*8975f5c5SAndroid Build Coastguard Worker 
863*8975f5c5SAndroid Build Coastguard Worker     GLTexture stencilTexture;
864*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, stencilTexture);
865*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, 32, 32);
866*8975f5c5SAndroid Build Coastguard Worker 
867*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
868*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
869*8975f5c5SAndroid Build Coastguard Worker 
870*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(0);
871*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
872*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(0, 4, GL_SHORT, GL_TRUE, 8, nullptr);
873*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementArrayBuffer);
874*8975f5c5SAndroid Build Coastguard Worker 
875*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
876*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
877*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, stencilTexture, 0);
878*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
879*8975f5c5SAndroid Build Coastguard Worker 
880*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer);
881*8975f5c5SAndroid Build Coastguard Worker     GLVertexArray vertexArray;
882*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementArrayBuffer);
883*8975f5c5SAndroid Build Coastguard Worker     glDrawElements(GL_TRIANGLE_STRIP, 26, GL_UNSIGNED_INT, nullptr);
884*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
885*8975f5c5SAndroid Build Coastguard Worker 
886*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 1> attachments = {GL_STENCIL_ATTACHMENT};
887*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments.data());
888*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
889*8975f5c5SAndroid Build Coastguard Worker }
890*8975f5c5SAndroid Build Coastguard Worker 
891*8975f5c5SAndroid Build Coastguard Worker // Test that invalidating stencil-only attachment doesn't crash.
TEST_P(FramebufferTest_ES3,InvalidateStencilOnly)892*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, InvalidateStencilOnly)
893*8975f5c5SAndroid Build Coastguard Worker {
894*8975f5c5SAndroid Build Coastguard Worker     // Create the framebuffer that will be invalidated
895*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer stencil;
896*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, stencil);
897*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 2, 2);
898*8975f5c5SAndroid Build Coastguard Worker 
899*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
900*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
901*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencil);
902*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
903*8975f5c5SAndroid Build Coastguard Worker 
904*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
905*8975f5c5SAndroid Build Coastguard Worker 
906*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 1> attachments = {GL_STENCIL_ATTACHMENT};
907*8975f5c5SAndroid Build Coastguard Worker 
908*8975f5c5SAndroid Build Coastguard Worker     // Invalidate both depth and stencil.
909*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments.data());
910*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
911*8975f5c5SAndroid Build Coastguard Worker }
912*8975f5c5SAndroid Build Coastguard Worker 
913*8975f5c5SAndroid Build Coastguard Worker // Test that invalidating stencil of a depth-only attachment doesn't crash.
TEST_P(FramebufferTest_ES3,DepthOnlyAttachmentInvalidateStencil)914*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, DepthOnlyAttachmentInvalidateStencil)
915*8975f5c5SAndroid Build Coastguard Worker {
916*8975f5c5SAndroid Build Coastguard Worker     // Create the framebuffer that will be invalidated
917*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depth;
918*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depth);
919*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 2, 2);
920*8975f5c5SAndroid Build Coastguard Worker 
921*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
922*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
923*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth);
924*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
925*8975f5c5SAndroid Build Coastguard Worker 
926*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
927*8975f5c5SAndroid Build Coastguard Worker 
928*8975f5c5SAndroid Build Coastguard Worker     // Invalidate stencil only.
929*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 2> attachments = {GL_STENCIL_ATTACHMENT, GL_DEPTH_ATTACHMENT};
930*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments.data());
931*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
932*8975f5c5SAndroid Build Coastguard Worker 
933*8975f5c5SAndroid Build Coastguard Worker     // Invalidate both depth and stencil.
934*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 2, attachments.data());
935*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
936*8975f5c5SAndroid Build Coastguard Worker }
937*8975f5c5SAndroid Build Coastguard Worker 
938*8975f5c5SAndroid Build Coastguard Worker // Test that invalidating depth of a stencil-only attachment doesn't crash.
TEST_P(FramebufferTest_ES3,StencilOnlyAttachmentInvalidateDepth)939*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, StencilOnlyAttachmentInvalidateDepth)
940*8975f5c5SAndroid Build Coastguard Worker {
941*8975f5c5SAndroid Build Coastguard Worker     // Create the framebuffer that will be invalidated
942*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depth;
943*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depth);
944*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 2, 2);
945*8975f5c5SAndroid Build Coastguard Worker 
946*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
947*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
948*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depth);
949*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
950*8975f5c5SAndroid Build Coastguard Worker 
951*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
952*8975f5c5SAndroid Build Coastguard Worker 
953*8975f5c5SAndroid Build Coastguard Worker     // Invalidate depth only.
954*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 2> attachments = {GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT};
955*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments.data());
956*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
957*8975f5c5SAndroid Build Coastguard Worker 
958*8975f5c5SAndroid Build Coastguard Worker     // Invalidate both depth and stencil.
959*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 2, attachments.data());
960*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
961*8975f5c5SAndroid Build Coastguard Worker }
962*8975f5c5SAndroid Build Coastguard Worker 
963*8975f5c5SAndroid Build Coastguard Worker // Test that a scissored draw followed by subinvalidate followed by a non-scissored draw retains the
964*8975f5c5SAndroid Build Coastguard Worker // part that is not invalidated.  Uses swapped width/height for invalidate which results in a
965*8975f5c5SAndroid Build Coastguard Worker // partial invalidate, but also prevents bugs with Vulkan pre-rotation.
TEST_P(FramebufferTest_ES3,ScissoredDrawSubInvalidateThenNonScissoredDraw)966*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ScissoredDrawSubInvalidateThenNonScissoredDraw)
967*8975f5c5SAndroid Build Coastguard Worker {
968*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
969*8975f5c5SAndroid Build Coastguard Worker 
970*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
971*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
972*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
973*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
974*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
975*8975f5c5SAndroid Build Coastguard Worker 
976*8975f5c5SAndroid Build Coastguard Worker     // Clear color to red and the depth/stencil buffer to 1.0 and 0x55
977*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
978*8975f5c5SAndroid Build Coastguard Worker     glClearDepthf(1);
979*8975f5c5SAndroid Build Coastguard Worker     glClearStencil(0x55);
980*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
981*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
982*8975f5c5SAndroid Build Coastguard Worker 
983*8975f5c5SAndroid Build Coastguard Worker     // Break rendering so the following draw call starts rendering with a scissored area.
984*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
985*8975f5c5SAndroid Build Coastguard Worker 
986*8975f5c5SAndroid Build Coastguard Worker     // Issue a scissored draw call that changes depth to 0.5 and stencil 0x3C
987*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kHeight, kWidth);
988*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
989*8975f5c5SAndroid Build Coastguard Worker 
990*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
991*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_ALWAYS);
992*8975f5c5SAndroid Build Coastguard Worker 
993*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
994*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_ALWAYS, 0x3C, 0xFF);
995*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
996*8975f5c5SAndroid Build Coastguard Worker     glStencilMask(0xFF);
997*8975f5c5SAndroid Build Coastguard Worker 
998*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
999*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0);
1000*8975f5c5SAndroid Build Coastguard Worker 
1001*8975f5c5SAndroid Build Coastguard Worker     // Invalidate the draw region (half of the framebuffer using swapped dimensions).
1002*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 3> attachments = {GL_COLOR, GL_DEPTH, GL_STENCIL};
1003*8975f5c5SAndroid Build Coastguard Worker     glInvalidateSubFramebuffer(GL_DRAW_FRAMEBUFFER, 3, attachments.data(), 0, 0, kHeight, kWidth);
1004*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1005*8975f5c5SAndroid Build Coastguard Worker 
1006*8975f5c5SAndroid Build Coastguard Worker     // Match the scissor to the framebuffer size and issue a draw call that blends blue, and expects
1007*8975f5c5SAndroid Build Coastguard Worker     // depth to be 1 and stencil to be 0x55.  This is only valid for the half that was not
1008*8975f5c5SAndroid Build Coastguard Worker     // invalidated.
1009*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kWidth, kHeight);
1010*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
1011*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_EQUAL, 0x55, 0xFF);
1012*8975f5c5SAndroid Build Coastguard Worker     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
1013*8975f5c5SAndroid Build Coastguard Worker 
1014*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
1015*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
1016*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
1017*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.95f);
1018*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1019*8975f5c5SAndroid Build Coastguard Worker 
1020*8975f5c5SAndroid Build Coastguard Worker     // Make sure the half that was not invalidated is correct.
1021*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kWidth, GLColor::magenta);
1022*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kWidth, GLColor::magenta);
1023*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kHeight - 1, GLColor::magenta);
1024*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kWidth - 1, kHeight - 1, GLColor::magenta);
1025*8975f5c5SAndroid Build Coastguard Worker }
1026*8975f5c5SAndroid Build Coastguard Worker 
1027*8975f5c5SAndroid Build Coastguard Worker // Test that the framebuffer state tracking robustly handles a depth-only attachment being set
1028*8975f5c5SAndroid Build Coastguard Worker // as a depth-stencil attachment. It is equivalent to detaching the depth-stencil attachment.
TEST_P(FramebufferTest_ES3,DepthOnlyAsDepthStencil)1029*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, DepthOnlyAsDepthStencil)
1030*8975f5c5SAndroid Build Coastguard Worker {
1031*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1032*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
1033*8975f5c5SAndroid Build Coastguard Worker 
1034*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1035*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
1036*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 4, 4);
1037*8975f5c5SAndroid Build Coastguard Worker 
1038*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
1039*8975f5c5SAndroid Build Coastguard Worker                               renderbuffer);
1040*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_NE(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1041*8975f5c5SAndroid Build Coastguard Worker }
1042*8975f5c5SAndroid Build Coastguard Worker 
1043*8975f5c5SAndroid Build Coastguard Worker // Test that the framebuffer correctly returns that it is not complete if invalid texture mip levels
1044*8975f5c5SAndroid Build Coastguard Worker // are bound
TEST_P(FramebufferTest_ES3,TextureAttachmentMipLevels)1045*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, TextureAttachmentMipLevels)
1046*8975f5c5SAndroid Build Coastguard Worker {
1047*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1048*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1049*8975f5c5SAndroid Build Coastguard Worker 
1050*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1051*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1052*8975f5c5SAndroid Build Coastguard Worker 
1053*8975f5c5SAndroid Build Coastguard Worker     // Create a complete mip chain in mips 1 to 3
1054*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1055*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1056*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1057*8975f5c5SAndroid Build Coastguard Worker 
1058*8975f5c5SAndroid Build Coastguard Worker     // Create another complete mip chain in mips 4 to 5
1059*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 4, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1060*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 5, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1061*8975f5c5SAndroid Build Coastguard Worker 
1062*8975f5c5SAndroid Build Coastguard Worker     // Create a non-complete mip chain in mip 6
1063*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 6, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1064*8975f5c5SAndroid Build Coastguard Worker 
1065*8975f5c5SAndroid Build Coastguard Worker     // Incomplete, mipLevel != baseLevel and texture is not mip complete
1066*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 1);
1067*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
1068*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
1069*8975f5c5SAndroid Build Coastguard Worker 
1070*8975f5c5SAndroid Build Coastguard Worker     // Complete, mipLevel == baseLevel
1071*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
1072*8975f5c5SAndroid Build Coastguard Worker     ExpectFramebufferCompleteOrUnsupported(GL_FRAMEBUFFER);
1073*8975f5c5SAndroid Build Coastguard Worker 
1074*8975f5c5SAndroid Build Coastguard Worker     // Complete, mipLevel != baseLevel but texture is now mip complete
1075*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 2);
1076*8975f5c5SAndroid Build Coastguard Worker     ExpectFramebufferCompleteOrUnsupported(GL_FRAMEBUFFER);
1077*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 3);
1078*8975f5c5SAndroid Build Coastguard Worker     ExpectFramebufferCompleteOrUnsupported(GL_FRAMEBUFFER);
1079*8975f5c5SAndroid Build Coastguard Worker 
1080*8975f5c5SAndroid Build Coastguard Worker     // Incomplete, attached level below the base level
1081*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 2);
1082*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 1);
1083*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
1084*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
1085*8975f5c5SAndroid Build Coastguard Worker 
1086*8975f5c5SAndroid Build Coastguard Worker     // Incomplete, attached level is beyond effective max level
1087*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 4);
1088*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
1089*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
1090*8975f5c5SAndroid Build Coastguard Worker 
1091*8975f5c5SAndroid Build Coastguard Worker     // Complete, mipLevel == baseLevel
1092*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 4);
1093*8975f5c5SAndroid Build Coastguard Worker     ExpectFramebufferCompleteOrUnsupported(GL_FRAMEBUFFER);
1094*8975f5c5SAndroid Build Coastguard Worker 
1095*8975f5c5SAndroid Build Coastguard Worker     // Complete, mipLevel != baseLevel but texture is now mip complete
1096*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 5);
1097*8975f5c5SAndroid Build Coastguard Worker     ExpectFramebufferCompleteOrUnsupported(GL_FRAMEBUFFER);
1098*8975f5c5SAndroid Build Coastguard Worker 
1099*8975f5c5SAndroid Build Coastguard Worker     // Complete, mipLevel == baseLevel
1100*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 6);
1101*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 6);
1102*8975f5c5SAndroid Build Coastguard Worker     ExpectFramebufferCompleteOrUnsupported(GL_FRAMEBUFFER);
1103*8975f5c5SAndroid Build Coastguard Worker }
1104*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferTest_ES3,TextureAttachmentMipLevelsReadBack)1105*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, TextureAttachmentMipLevelsReadBack)
1106*8975f5c5SAndroid Build Coastguard Worker {
1107*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1108*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1109*8975f5c5SAndroid Build Coastguard Worker 
1110*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1111*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1112*8975f5c5SAndroid Build Coastguard Worker 
1113*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4 * 4> mip0Data = {
1114*8975f5c5SAndroid Build Coastguard Worker         GLColor::red, GLColor::red, GLColor::red, GLColor::red, GLColor::red, GLColor::red,
1115*8975f5c5SAndroid Build Coastguard Worker         GLColor::red, GLColor::red, GLColor::red, GLColor::red, GLColor::red, GLColor::red,
1116*8975f5c5SAndroid Build Coastguard Worker         GLColor::red, GLColor::red, GLColor::red, GLColor::red};
1117*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 2 * 2> mip1Data = {GLColor::green, GLColor::green, GLColor::green,
1118*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::green};
1119*8975f5c5SAndroid Build Coastguard Worker 
1120*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, mip0Data.data());
1121*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, mip1Data.data());
1122*8975f5c5SAndroid Build Coastguard Worker 
1123*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
1124*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 1);
1125*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1126*8975f5c5SAndroid Build Coastguard Worker 
1127*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 1.0f, 1.0f);
1128*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1129*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1130*8975f5c5SAndroid Build Coastguard Worker }
1131*8975f5c5SAndroid Build Coastguard Worker 
1132*8975f5c5SAndroid Build Coastguard Worker // TextureAttachmentMipLevelsReadBackWithDraw is a copy of TextureAttachmentMipLevelsReadBack except
1133*8975f5c5SAndroid Build Coastguard Worker // for adding a draw after the last clear. The draw forces ANGLE's Vulkan backend to use the
1134*8975f5c5SAndroid Build Coastguard Worker // framebuffer that is level 1 of the texture which will trigger the mismatch use of the GL level
1135*8975f5c5SAndroid Build Coastguard Worker // and Vulkan level in referring to that rendertarget.
TEST_P(FramebufferTest_ES3,TextureAttachmentMipLevelsReadBackWithDraw)1136*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, TextureAttachmentMipLevelsReadBackWithDraw)
1137*8975f5c5SAndroid Build Coastguard Worker {
1138*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
1139*8975f5c5SAndroid Build Coastguard Worker 
1140*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1141*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1142*8975f5c5SAndroid Build Coastguard Worker 
1143*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1144*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1145*8975f5c5SAndroid Build Coastguard Worker 
1146*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 4 * 4> mip0Data = {
1147*8975f5c5SAndroid Build Coastguard Worker         GLColor::red, GLColor::red, GLColor::red, GLColor::red, GLColor::red, GLColor::red,
1148*8975f5c5SAndroid Build Coastguard Worker         GLColor::red, GLColor::red, GLColor::red, GLColor::red, GLColor::red, GLColor::red,
1149*8975f5c5SAndroid Build Coastguard Worker         GLColor::red, GLColor::red, GLColor::red, GLColor::red};
1150*8975f5c5SAndroid Build Coastguard Worker     const std::array<GLColor, 2 * 2> mip1Data = {GLColor::green, GLColor::green, GLColor::green,
1151*8975f5c5SAndroid Build Coastguard Worker                                                  GLColor::green};
1152*8975f5c5SAndroid Build Coastguard Worker 
1153*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, mip0Data.data());
1154*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, mip1Data.data());
1155*8975f5c5SAndroid Build Coastguard Worker 
1156*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
1157*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 1);
1158*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1159*8975f5c5SAndroid Build Coastguard Worker 
1160*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 1.0f, 1.0f);
1161*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1162*8975f5c5SAndroid Build Coastguard Worker 
1163*8975f5c5SAndroid Build Coastguard Worker     // This draw triggers the use of the framebuffer
1164*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
1165*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
1166*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1167*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1168*8975f5c5SAndroid Build Coastguard Worker }
1169*8975f5c5SAndroid Build Coastguard Worker 
1170*8975f5c5SAndroid Build Coastguard Worker // Test that passing an attachment COLOR_ATTACHMENTm where m is equal to MAX_COLOR_ATTACHMENTS
1171*8975f5c5SAndroid Build Coastguard Worker // generates an INVALID_OPERATION.
1172*8975f5c5SAndroid Build Coastguard Worker // OpenGL ES Version 3.0.5 (November 3, 2016), 4.4.2.4 Attaching Texture Images to a Framebuffer, p.
1173*8975f5c5SAndroid Build Coastguard Worker // 208
TEST_P(FramebufferTest_ES3,ColorAttachmentIndexOutOfBounds)1174*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ColorAttachmentIndexOutOfBounds)
1175*8975f5c5SAndroid Build Coastguard Worker {
1176*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1177*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1178*8975f5c5SAndroid Build Coastguard Worker 
1179*8975f5c5SAndroid Build Coastguard Worker     GLint maxColorAttachments = 0;
1180*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments);
1181*8975f5c5SAndroid Build Coastguard Worker     GLenum attachment = static_cast<GLenum>(maxColorAttachments + GL_COLOR_ATTACHMENT0);
1182*8975f5c5SAndroid Build Coastguard Worker 
1183*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1184*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1185*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, 1, 1);
1186*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, texture, 0);
1187*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1188*8975f5c5SAndroid Build Coastguard Worker }
1189*8975f5c5SAndroid Build Coastguard Worker 
1190*8975f5c5SAndroid Build Coastguard Worker // Check that depth-only attachments report the correct number of samples.
TEST_P(FramebufferTest_ES3,MultisampleDepthOnly)1191*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, MultisampleDepthOnly)
1192*8975f5c5SAndroid Build Coastguard Worker {
1193*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
1194*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
1195*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 32, 32);
1196*8975f5c5SAndroid Build Coastguard Worker 
1197*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1198*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1199*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer);
1200*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1201*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1202*8975f5c5SAndroid Build Coastguard Worker 
1203*8975f5c5SAndroid Build Coastguard Worker     GLint samples = 0;
1204*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_SAMPLES, &samples);
1205*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1206*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GE(samples, 2);
1207*8975f5c5SAndroid Build Coastguard Worker }
1208*8975f5c5SAndroid Build Coastguard Worker 
1209*8975f5c5SAndroid Build Coastguard Worker // Check that we only compare width and height of attachments, not depth.
TEST_P(FramebufferTest_ES3,AttachmentWith3DLayers)1210*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, AttachmentWith3DLayers)
1211*8975f5c5SAndroid Build Coastguard Worker {
1212*8975f5c5SAndroid Build Coastguard Worker     GLTexture texA;
1213*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texA);
1214*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1215*8975f5c5SAndroid Build Coastguard Worker 
1216*8975f5c5SAndroid Build Coastguard Worker     GLTexture texB;
1217*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, texB);
1218*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 4, 4, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1219*8975f5c5SAndroid Build Coastguard Worker 
1220*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1221*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1222*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texA, 0);
1223*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, texB, 0, 0);
1224*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1225*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1226*8975f5c5SAndroid Build Coastguard Worker }
1227*8975f5c5SAndroid Build Coastguard Worker 
1228*8975f5c5SAndroid Build Coastguard Worker // Check that invalid layer is detected in framebuffer completeness check.
1229*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, 3DAttachmentInvalidLayer)
1230*8975f5c5SAndroid Build Coastguard Worker {
1231*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
1232*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, tex);
1233*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 4, 4, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1234*8975f5c5SAndroid Build Coastguard Worker 
1235*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1236*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1237*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 2);
1238*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
1239*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
1240*8975f5c5SAndroid Build Coastguard Worker 
1241*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 1);
1242*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1243*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1244*8975f5c5SAndroid Build Coastguard Worker }
1245*8975f5c5SAndroid Build Coastguard Worker 
1246*8975f5c5SAndroid Build Coastguard Worker // Check that invalid layer is detected in framebuffer completeness check.
1247*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, 2DArrayInvalidLayer)
1248*8975f5c5SAndroid Build Coastguard Worker {
1249*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
1250*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
1251*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 4, 4, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1252*8975f5c5SAndroid Build Coastguard Worker 
1253*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1254*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1255*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 2);
1256*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
1257*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
1258*8975f5c5SAndroid Build Coastguard Worker 
1259*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 1);
1260*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1261*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1262*8975f5c5SAndroid Build Coastguard Worker }
1263*8975f5c5SAndroid Build Coastguard Worker 
1264*8975f5c5SAndroid Build Coastguard Worker // Test that clearing the stencil buffer when the framebuffer only has a color attachment does not
1265*8975f5c5SAndroid Build Coastguard Worker // crash.
TEST_P(FramebufferTest_ES3,ClearNonexistentStencil)1266*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ClearNonexistentStencil)
1267*8975f5c5SAndroid Build Coastguard Worker {
1268*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
1269*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1270*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
1271*8975f5c5SAndroid Build Coastguard Worker 
1272*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1273*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1274*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1275*8975f5c5SAndroid Build Coastguard Worker 
1276*8975f5c5SAndroid Build Coastguard Worker     GLint clearValue = 0;
1277*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_STENCIL, 0, &clearValue);
1278*8975f5c5SAndroid Build Coastguard Worker 
1279*8975f5c5SAndroid Build Coastguard Worker     // There's no error specified for clearing nonexistent buffers, it's simply a no-op.
1280*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1281*8975f5c5SAndroid Build Coastguard Worker }
1282*8975f5c5SAndroid Build Coastguard Worker 
1283*8975f5c5SAndroid Build Coastguard Worker // Test that clearing the depth buffer when the framebuffer only has a color attachment does not
1284*8975f5c5SAndroid Build Coastguard Worker // crash.
TEST_P(FramebufferTest_ES3,ClearNonexistentDepth)1285*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ClearNonexistentDepth)
1286*8975f5c5SAndroid Build Coastguard Worker {
1287*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
1288*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1289*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
1290*8975f5c5SAndroid Build Coastguard Worker 
1291*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1292*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1293*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1294*8975f5c5SAndroid Build Coastguard Worker 
1295*8975f5c5SAndroid Build Coastguard Worker     GLfloat clearValue = 0.0f;
1296*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfv(GL_DEPTH, 0, &clearValue);
1297*8975f5c5SAndroid Build Coastguard Worker 
1298*8975f5c5SAndroid Build Coastguard Worker     // There's no error specified for clearing nonexistent buffers, it's simply a no-op.
1299*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1300*8975f5c5SAndroid Build Coastguard Worker }
1301*8975f5c5SAndroid Build Coastguard Worker 
1302*8975f5c5SAndroid Build Coastguard Worker // Test that clearing a nonexistent color attachment does not crash.
TEST_P(FramebufferTest_ES3,ClearNonexistentColor)1303*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ClearNonexistentColor)
1304*8975f5c5SAndroid Build Coastguard Worker {
1305*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
1306*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1307*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
1308*8975f5c5SAndroid Build Coastguard Worker 
1309*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1310*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1311*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1312*8975f5c5SAndroid Build Coastguard Worker 
1313*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLfloat> clearValue = {{0.0f, 1.0f, 0.0f, 1.0f}};
1314*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfv(GL_COLOR, 1, clearValue.data());
1315*8975f5c5SAndroid Build Coastguard Worker 
1316*8975f5c5SAndroid Build Coastguard Worker     // There's no error specified for clearing nonexistent buffers, it's simply a no-op.
1317*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1318*8975f5c5SAndroid Build Coastguard Worker }
1319*8975f5c5SAndroid Build Coastguard Worker 
1320*8975f5c5SAndroid Build Coastguard Worker // Test that clearing the depth and stencil buffers when the framebuffer only has a color attachment
1321*8975f5c5SAndroid Build Coastguard Worker // does not crash.
TEST_P(FramebufferTest_ES3,ClearNonexistentDepthStencil)1322*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ClearNonexistentDepthStencil)
1323*8975f5c5SAndroid Build Coastguard Worker {
1324*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
1325*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1326*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
1327*8975f5c5SAndroid Build Coastguard Worker 
1328*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1329*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1330*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1331*8975f5c5SAndroid Build Coastguard Worker 
1332*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfi(GL_DEPTH_STENCIL, 0, 0.0f, 0);
1333*8975f5c5SAndroid Build Coastguard Worker 
1334*8975f5c5SAndroid Build Coastguard Worker     // There's no error specified for clearing nonexistent buffers, it's simply a no-op.
1335*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1336*8975f5c5SAndroid Build Coastguard Worker }
1337*8975f5c5SAndroid Build Coastguard Worker 
1338*8975f5c5SAndroid Build Coastguard Worker // Test that clearing a color attachment that has been deleted doesn't crash.
TEST_P(FramebufferTest_ES3,ClearDeletedAttachment)1339*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ClearDeletedAttachment)
1340*8975f5c5SAndroid Build Coastguard Worker {
1341*8975f5c5SAndroid Build Coastguard Worker     // An INVALID_FRAMEBUFFER_OPERATION error was seen in this test on Mac, not sure where it might
1342*8975f5c5SAndroid Build Coastguard Worker     // be originating from. http://anglebug.com/42261536
1343*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsMac() && IsOpenGL());
1344*8975f5c5SAndroid Build Coastguard Worker 
1345*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1346*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1347*8975f5c5SAndroid Build Coastguard Worker 
1348*8975f5c5SAndroid Build Coastguard Worker     // There used to be a bug where some draw buffer state used to remain set even after the
1349*8975f5c5SAndroid Build Coastguard Worker     // attachment was detached via deletion. That's why we create, attach and delete this RBO here.
1350*8975f5c5SAndroid Build Coastguard Worker     GLuint rbo = 0u;
1351*8975f5c5SAndroid Build Coastguard Worker     glGenRenderbuffers(1, &rbo);
1352*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1353*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1354*8975f5c5SAndroid Build Coastguard Worker     glDeleteRenderbuffers(1, &rbo);
1355*8975f5c5SAndroid Build Coastguard Worker 
1356*8975f5c5SAndroid Build Coastguard Worker     // There needs to be at least one color attachment to prevent early out from the clear calls.
1357*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo2;
1358*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo2);
1359*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
1360*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, rbo2);
1361*8975f5c5SAndroid Build Coastguard Worker 
1362*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1363*8975f5c5SAndroid Build Coastguard Worker 
1364*8975f5c5SAndroid Build Coastguard Worker     // There's no error specified for clearing nonexistent buffers, it's simply a no-op, so we
1365*8975f5c5SAndroid Build Coastguard Worker     // expect no GL errors below.
1366*8975f5c5SAndroid Build Coastguard Worker     std::array<GLfloat, 4> floatClearValue = {0.0f, 0.0f, 0.0f, 0.0f};
1367*8975f5c5SAndroid Build Coastguard Worker     glClearBufferfv(GL_COLOR, 0, floatClearValue.data());
1368*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1369*8975f5c5SAndroid Build Coastguard Worker     std::array<GLuint, 4> uintClearValue = {0u, 0u, 0u, 0u};
1370*8975f5c5SAndroid Build Coastguard Worker     glClearBufferuiv(GL_COLOR, 0, uintClearValue.data());
1371*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1372*8975f5c5SAndroid Build Coastguard Worker     std::array<GLint, 4> intClearValue = {0, 0, 0, 0};
1373*8975f5c5SAndroid Build Coastguard Worker     glClearBufferiv(GL_COLOR, 0, intClearValue.data());
1374*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1375*8975f5c5SAndroid Build Coastguard Worker }
1376*8975f5c5SAndroid Build Coastguard Worker 
1377*8975f5c5SAndroid Build Coastguard Worker // Test that clearing a color attachment with bound program that has
1378*8975f5c5SAndroid Build Coastguard Worker // incompatible program output doesn't crash.
TEST_P(FramebufferTest_ES3,ClearIncompatibleAttachments)1379*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ClearIncompatibleAttachments)
1380*8975f5c5SAndroid Build Coastguard Worker {
1381*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
1382*8975f5c5SAndroid Build Coastguard Worker precision highp float;
1383*8975f5c5SAndroid Build Coastguard Worker 
1384*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out uvec4 color0;
1385*8975f5c5SAndroid Build Coastguard Worker layout(location = 1) out vec4 color1;
1386*8975f5c5SAndroid Build Coastguard Worker 
1387*8975f5c5SAndroid Build Coastguard Worker void main()
1388*8975f5c5SAndroid Build Coastguard Worker {
1389*8975f5c5SAndroid Build Coastguard Worker     color0 = uvec4(0, 255, 0, 255);
1390*8975f5c5SAndroid Build Coastguard Worker     color1 = vec4(0, 1, 0, 1);
1391*8975f5c5SAndroid Build Coastguard Worker })";
1392*8975f5c5SAndroid Build Coastguard Worker 
1393*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
1394*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1395*8975f5c5SAndroid Build Coastguard Worker 
1396*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
1397*8975f5c5SAndroid Build Coastguard Worker 
1398*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo[2];
1399*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo[0]);
1400*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
1401*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo[1]);
1402*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
1403*8975f5c5SAndroid Build Coastguard Worker 
1404*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1405*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1406*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[0]);
1407*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, rbo[1]);
1408*8975f5c5SAndroid Build Coastguard Worker 
1409*8975f5c5SAndroid Build Coastguard Worker     GLenum allBufs[2] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
1410*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(2, allBufs);
1411*8975f5c5SAndroid Build Coastguard Worker 
1412*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1413*8975f5c5SAndroid Build Coastguard Worker 
1414*8975f5c5SAndroid Build Coastguard Worker     // Draw with simple program.
1415*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
1416*8975f5c5SAndroid Build Coastguard Worker 
1417*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
1418*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1419*8975f5c5SAndroid Build Coastguard Worker 
1420*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
1421*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1422*8975f5c5SAndroid Build Coastguard Worker 
1423*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1424*8975f5c5SAndroid Build Coastguard Worker }
1425*8975f5c5SAndroid Build Coastguard Worker 
1426*8975f5c5SAndroid Build Coastguard Worker // Test that resizing the color attachment is handled correctly.
TEST_P(FramebufferTest_ES3,ResizeColorAttachmentSmallToLarge)1427*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ResizeColorAttachmentSmallToLarge)
1428*8975f5c5SAndroid Build Coastguard Worker {
1429*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1430*8975f5c5SAndroid Build Coastguard Worker     GLTexture smallTexture;
1431*8975f5c5SAndroid Build Coastguard Worker     GLTexture largeTexture;
1432*8975f5c5SAndroid Build Coastguard Worker 
1433*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
1434*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
1435*8975f5c5SAndroid Build Coastguard Worker 
1436*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1437*8975f5c5SAndroid Build Coastguard Worker 
1438*8975f5c5SAndroid Build Coastguard Worker     // Bind the small texture
1439*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, smallTexture);
1440*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth() / 2, getWindowHeight() / 2, 0, GL_RGBA,
1441*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1442*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1443*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1444*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, smallTexture, 0);
1445*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1446*8975f5c5SAndroid Build Coastguard Worker 
1447*8975f5c5SAndroid Build Coastguard Worker     // Draw to FBO backed by the small texture
1448*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
1449*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
1450*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1451*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1452*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ((getWindowWidth() / 2) - 1, (getWindowHeight() / 2) - 1, GLColor::green);
1453*8975f5c5SAndroid Build Coastguard Worker 
1454*8975f5c5SAndroid Build Coastguard Worker     // Change the attachment to the larger texture that fills the window
1455*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, largeTexture);
1456*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
1457*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1458*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1459*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1460*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, largeTexture, 0);
1461*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1462*8975f5c5SAndroid Build Coastguard Worker 
1463*8975f5c5SAndroid Build Coastguard Worker     // Draw to FBO backed by the large texture
1464*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
1465*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
1466*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1467*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1468*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::blue);
1469*8975f5c5SAndroid Build Coastguard Worker }
1470*8975f5c5SAndroid Build Coastguard Worker 
1471*8975f5c5SAndroid Build Coastguard Worker // Test that resizing the color attachment is handled correctly.
TEST_P(FramebufferTest_ES3,ResizeColorAttachmentLargeToSmall)1472*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ResizeColorAttachmentLargeToSmall)
1473*8975f5c5SAndroid Build Coastguard Worker {
1474*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1475*8975f5c5SAndroid Build Coastguard Worker     GLTexture smallTexture;
1476*8975f5c5SAndroid Build Coastguard Worker     GLTexture largeTexture;
1477*8975f5c5SAndroid Build Coastguard Worker 
1478*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
1479*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
1480*8975f5c5SAndroid Build Coastguard Worker 
1481*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1482*8975f5c5SAndroid Build Coastguard Worker 
1483*8975f5c5SAndroid Build Coastguard Worker     // Bind the large texture
1484*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, largeTexture);
1485*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
1486*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1487*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1488*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1489*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, largeTexture, 0);
1490*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1491*8975f5c5SAndroid Build Coastguard Worker 
1492*8975f5c5SAndroid Build Coastguard Worker     // Draw to FBO backed by the large texture
1493*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
1494*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
1495*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1496*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1497*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::blue);
1498*8975f5c5SAndroid Build Coastguard Worker 
1499*8975f5c5SAndroid Build Coastguard Worker     // Change the attachment to the smaller texture
1500*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, smallTexture);
1501*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth() / 2, getWindowHeight() / 2, 0, GL_RGBA,
1502*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1503*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1504*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1505*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, smallTexture, 0);
1506*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1507*8975f5c5SAndroid Build Coastguard Worker 
1508*8975f5c5SAndroid Build Coastguard Worker     // Draw to FBO backed by the small texture
1509*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
1510*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
1511*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1512*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1513*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ((getWindowWidth() / 2) - 1, (getWindowHeight() / 2) - 1, GLColor::green);
1514*8975f5c5SAndroid Build Coastguard Worker }
1515*8975f5c5SAndroid Build Coastguard Worker 
1516*8975f5c5SAndroid Build Coastguard Worker // Test that resizing the texture is handled correctly.
TEST_P(FramebufferTest_ES3,ResizeTextureLargeToSmall)1517*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ResizeTextureLargeToSmall)
1518*8975f5c5SAndroid Build Coastguard Worker {
1519*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1520*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1521*8975f5c5SAndroid Build Coastguard Worker 
1522*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
1523*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
1524*8975f5c5SAndroid Build Coastguard Worker 
1525*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1526*8975f5c5SAndroid Build Coastguard Worker 
1527*8975f5c5SAndroid Build Coastguard Worker     // Allocate a large texture
1528*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1529*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
1530*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1531*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1532*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1533*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1534*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1535*8975f5c5SAndroid Build Coastguard Worker 
1536*8975f5c5SAndroid Build Coastguard Worker     // Draw to FBO backed by the large texture
1537*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
1538*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
1539*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1540*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1541*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::blue);
1542*8975f5c5SAndroid Build Coastguard Worker 
1543*8975f5c5SAndroid Build Coastguard Worker     // Shrink the texture
1544*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1545*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth() / 2, getWindowHeight() / 2, 0, GL_RGBA,
1546*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1547*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1548*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1549*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1550*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1551*8975f5c5SAndroid Build Coastguard Worker 
1552*8975f5c5SAndroid Build Coastguard Worker     // Draw to FBO backed by the small texture
1553*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
1554*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
1555*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1556*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1557*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ((getWindowWidth() / 2) - 1, (getWindowHeight() / 2) - 1, GLColor::green);
1558*8975f5c5SAndroid Build Coastguard Worker }
1559*8975f5c5SAndroid Build Coastguard Worker 
1560*8975f5c5SAndroid Build Coastguard Worker // Test that resizing the texture is handled correctly.
TEST_P(FramebufferTest_ES3,ResizeTextureSmallToLarge)1561*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ResizeTextureSmallToLarge)
1562*8975f5c5SAndroid Build Coastguard Worker {
1563*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1564*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1565*8975f5c5SAndroid Build Coastguard Worker 
1566*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
1567*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
1568*8975f5c5SAndroid Build Coastguard Worker 
1569*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1570*8975f5c5SAndroid Build Coastguard Worker 
1571*8975f5c5SAndroid Build Coastguard Worker     // Allocate a small texture
1572*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1573*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth() / 2, getWindowHeight() / 2, 0, GL_RGBA,
1574*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1575*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1576*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1577*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1578*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1579*8975f5c5SAndroid Build Coastguard Worker 
1580*8975f5c5SAndroid Build Coastguard Worker     // Draw to FBO backed by the large texture
1581*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
1582*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
1583*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1584*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1585*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ((getWindowWidth() / 2) - 1, (getWindowHeight() / 2) - 1, GLColor::blue);
1586*8975f5c5SAndroid Build Coastguard Worker 
1587*8975f5c5SAndroid Build Coastguard Worker     // Grow the texture
1588*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1589*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
1590*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
1591*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1592*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1593*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1594*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1595*8975f5c5SAndroid Build Coastguard Worker 
1596*8975f5c5SAndroid Build Coastguard Worker     // Draw to FBO backed by the small texture
1597*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
1598*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
1599*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1600*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1601*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, getWindowHeight() - 1, GLColor::green);
1602*8975f5c5SAndroid Build Coastguard Worker }
1603*8975f5c5SAndroid Build Coastguard Worker 
1604*8975f5c5SAndroid Build Coastguard Worker // Test that fewer outputs than framebuffer attachments doesn't crash.  This causes a Vulkan
1605*8975f5c5SAndroid Build Coastguard Worker // validation warning, but should not be fatal.
TEST_P(FramebufferTest_ES3,FewerShaderOutputsThanAttachments)1606*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, FewerShaderOutputsThanAttachments)
1607*8975f5c5SAndroid Build Coastguard Worker {
1608*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
1609*8975f5c5SAndroid Build Coastguard Worker precision highp float;
1610*8975f5c5SAndroid Build Coastguard Worker 
1611*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 color0;
1612*8975f5c5SAndroid Build Coastguard Worker layout(location = 1) out vec4 color1;
1613*8975f5c5SAndroid Build Coastguard Worker layout(location = 2) out vec4 color2;
1614*8975f5c5SAndroid Build Coastguard Worker 
1615*8975f5c5SAndroid Build Coastguard Worker void main()
1616*8975f5c5SAndroid Build Coastguard Worker {
1617*8975f5c5SAndroid Build Coastguard Worker     color0 = vec4(1.0, 0.0, 0.0, 1.0);
1618*8975f5c5SAndroid Build Coastguard Worker     color1 = vec4(0.0, 1.0, 0.0, 1.0);
1619*8975f5c5SAndroid Build Coastguard Worker     color2 = vec4(0.0, 0.0, 1.0, 1.0);
1620*8975f5c5SAndroid Build Coastguard Worker }
1621*8975f5c5SAndroid Build Coastguard Worker )";
1622*8975f5c5SAndroid Build Coastguard Worker 
1623*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
1624*8975f5c5SAndroid Build Coastguard Worker 
1625*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kDrawBufferCount = 4;
1626*8975f5c5SAndroid Build Coastguard Worker 
1627*8975f5c5SAndroid Build Coastguard Worker     GLint maxDrawBuffers;
1628*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
1629*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(maxDrawBuffers, kDrawBufferCount);
1630*8975f5c5SAndroid Build Coastguard Worker 
1631*8975f5c5SAndroid Build Coastguard Worker     GLTexture textures[kDrawBufferCount];
1632*8975f5c5SAndroid Build Coastguard Worker 
1633*8975f5c5SAndroid Build Coastguard Worker     for (GLint texIndex = 0; texIndex < kDrawBufferCount; ++texIndex)
1634*8975f5c5SAndroid Build Coastguard Worker     {
1635*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[texIndex]);
1636*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
1637*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, nullptr);
1638*8975f5c5SAndroid Build Coastguard Worker     }
1639*8975f5c5SAndroid Build Coastguard Worker 
1640*8975f5c5SAndroid Build Coastguard Worker     GLenum allBufs[kDrawBufferCount] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
1641*8975f5c5SAndroid Build Coastguard Worker                                         GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
1642*8975f5c5SAndroid Build Coastguard Worker 
1643*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1644*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
1645*8975f5c5SAndroid Build Coastguard Worker 
1646*8975f5c5SAndroid Build Coastguard Worker     // Enable all draw buffers.
1647*8975f5c5SAndroid Build Coastguard Worker     for (GLint texIndex = 0; texIndex < kDrawBufferCount; ++texIndex)
1648*8975f5c5SAndroid Build Coastguard Worker     {
1649*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[texIndex]);
1650*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + texIndex, GL_TEXTURE_2D,
1651*8975f5c5SAndroid Build Coastguard Worker                                textures[texIndex], 0);
1652*8975f5c5SAndroid Build Coastguard Worker     }
1653*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(kDrawBufferCount, allBufs);
1654*8975f5c5SAndroid Build Coastguard Worker 
1655*8975f5c5SAndroid Build Coastguard Worker     // Draw with simple program.
1656*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
1657*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1658*8975f5c5SAndroid Build Coastguard Worker }
1659*8975f5c5SAndroid Build Coastguard Worker 
1660*8975f5c5SAndroid Build Coastguard Worker // Test that GL_RGB9_E5 is renderable with the extension.
TEST_P(FramebufferTest_ES3,RenderSharedExponent)1661*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RenderSharedExponent)
1662*8975f5c5SAndroid Build Coastguard Worker {
1663*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_render_shared_exponent"));
1664*8975f5c5SAndroid Build Coastguard Worker 
1665*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
1666*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
1667*8975f5c5SAndroid Build Coastguard Worker     const uint32_t data = 0x80000100;  // Red
1668*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB9_E5, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, &data);
1669*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1670*8975f5c5SAndroid Build Coastguard Worker 
1671*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer readFbo;
1672*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
1673*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
1674*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1675*8975f5c5SAndroid Build Coastguard Worker 
1676*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR32F_EQ(0, 0, kFloatRed);
1677*8975f5c5SAndroid Build Coastguard Worker 
1678*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
1679*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1680*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB9_E5, 1, 1);
1681*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1682*8975f5c5SAndroid Build Coastguard Worker 
1683*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer drawFbo;
1684*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFbo);
1685*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1686*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1687*8975f5c5SAndroid Build Coastguard Worker 
1688*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0, 1.0, 0.0, 1.0);
1689*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1690*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFbo);
1691*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR32F_EQ(0, 0, kFloatGreen);
1692*8975f5c5SAndroid Build Coastguard Worker 
1693*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
1694*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1695*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1696*8975f5c5SAndroid Build Coastguard Worker 
1697*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFbo);
1698*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR32F_EQ(0, 0, kFloatRed);
1699*8975f5c5SAndroid Build Coastguard Worker }
1700*8975f5c5SAndroid Build Coastguard Worker 
1701*8975f5c5SAndroid Build Coastguard Worker // Test color write masks with GL_RGB9_E5 color buffers.
TEST_P(FramebufferTest_ES3,RenderSharedExponentWithMask)1702*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RenderSharedExponentWithMask)
1703*8975f5c5SAndroid Build Coastguard Worker {
1704*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_render_shared_exponent"));
1705*8975f5c5SAndroid Build Coastguard Worker 
1706*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
1707*8975f5c5SAndroid Build Coastguard Worker precision highp float;
1708*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 color0;
1709*8975f5c5SAndroid Build Coastguard Worker layout(location = 1) out vec4 color1;
1710*8975f5c5SAndroid Build Coastguard Worker void main()
1711*8975f5c5SAndroid Build Coastguard Worker {
1712*8975f5c5SAndroid Build Coastguard Worker     color0 = vec4(1.0, 0.0, 0.0, 1.0);
1713*8975f5c5SAndroid Build Coastguard Worker     color1 = vec4(0.0, 1.0, 0.0, 1.0);
1714*8975f5c5SAndroid Build Coastguard Worker })";
1715*8975f5c5SAndroid Build Coastguard Worker 
1716*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
1717*8975f5c5SAndroid Build Coastguard Worker 
1718*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1719*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1720*8975f5c5SAndroid Build Coastguard Worker 
1721*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb0;
1722*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb0);
1723*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB9_E5, 4, 4);
1724*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb0);
1725*8975f5c5SAndroid Build Coastguard Worker 
1726*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb1;
1727*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb1);
1728*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 4, 4);
1729*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, rb1);
1730*8975f5c5SAndroid Build Coastguard Worker 
1731*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1732*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1733*8975f5c5SAndroid Build Coastguard Worker 
1734*8975f5c5SAndroid Build Coastguard Worker     for (int mask = 0; mask < 16; mask++)
1735*8975f5c5SAndroid Build Coastguard Worker     {
1736*8975f5c5SAndroid Build Coastguard Worker         glColorMask(mask & 1, mask & 2, mask & 4, mask & 8);
1737*8975f5c5SAndroid Build Coastguard Worker         for (const bool enableSharedExponentAttachment : {false, true})
1738*8975f5c5SAndroid Build Coastguard Worker         {
1739*8975f5c5SAndroid Build Coastguard Worker             GLenum bufs[2] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
1740*8975f5c5SAndroid Build Coastguard Worker             bufs[0]        = enableSharedExponentAttachment ? GL_COLOR_ATTACHMENT0 : GL_NONE;
1741*8975f5c5SAndroid Build Coastguard Worker             glDrawBuffers(2, bufs);
1742*8975f5c5SAndroid Build Coastguard Worker 
1743*8975f5c5SAndroid Build Coastguard Worker             auto expectError = [](bool enabled, int mask) {
1744*8975f5c5SAndroid Build Coastguard Worker                 if (!enabled || mask == 0 || mask == 8 || mask == 7 || mask == 15)
1745*8975f5c5SAndroid Build Coastguard Worker                 {
1746*8975f5c5SAndroid Build Coastguard Worker                     EXPECT_GL_NO_ERROR();
1747*8975f5c5SAndroid Build Coastguard Worker                 }
1748*8975f5c5SAndroid Build Coastguard Worker                 else
1749*8975f5c5SAndroid Build Coastguard Worker                 {
1750*8975f5c5SAndroid Build Coastguard Worker                     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1751*8975f5c5SAndroid Build Coastguard Worker                 }
1752*8975f5c5SAndroid Build Coastguard Worker             };
1753*8975f5c5SAndroid Build Coastguard Worker 
1754*8975f5c5SAndroid Build Coastguard Worker             drawQuad(program, essl3_shaders::PositionAttrib(), 0.0f);
1755*8975f5c5SAndroid Build Coastguard Worker             expectError(enableSharedExponentAttachment, mask);
1756*8975f5c5SAndroid Build Coastguard Worker 
1757*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
1758*8975f5c5SAndroid Build Coastguard Worker             expectError(enableSharedExponentAttachment, mask);
1759*8975f5c5SAndroid Build Coastguard Worker 
1760*8975f5c5SAndroid Build Coastguard Worker             GLfloat clearValuef[4] = {};
1761*8975f5c5SAndroid Build Coastguard Worker             glClearBufferfv(GL_COLOR, 0, clearValuef);
1762*8975f5c5SAndroid Build Coastguard Worker             expectError(enableSharedExponentAttachment, mask);
1763*8975f5c5SAndroid Build Coastguard Worker             glClearBufferfv(GL_COLOR, 1, clearValuef);
1764*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_NO_ERROR();
1765*8975f5c5SAndroid Build Coastguard Worker         }
1766*8975f5c5SAndroid Build Coastguard Worker     }
1767*8975f5c5SAndroid Build Coastguard Worker }
1768*8975f5c5SAndroid Build Coastguard Worker 
1769*8975f5c5SAndroid Build Coastguard Worker // Test that R8_SNORM, RG8_SNORM, and RGBA8_SNORM are renderable with the extension.
TEST_P(FramebufferTest_ES3,RenderSnorm8)1770*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RenderSnorm8)
1771*8975f5c5SAndroid Build Coastguard Worker {
1772*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_render_snorm"));
1773*8975f5c5SAndroid Build Coastguard Worker 
1774*8975f5c5SAndroid Build Coastguard Worker     auto test = [&](GLenum format) {
1775*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer rbo;
1776*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1777*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, format, 4, 4);
1778*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1779*8975f5c5SAndroid Build Coastguard Worker 
1780*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
1781*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1782*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1783*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1784*8975f5c5SAndroid Build Coastguard Worker 
1785*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1786*8975f5c5SAndroid Build Coastguard Worker 
1787*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1788*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(program);
1789*8975f5c5SAndroid Build Coastguard Worker         GLint colorLocation = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
1790*8975f5c5SAndroid Build Coastguard Worker         glUniform4f(colorLocation, -1.0f, -0.5f, -0.25f, -0.125f);
1791*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
1792*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1793*8975f5c5SAndroid Build Coastguard Worker 
1794*8975f5c5SAndroid Build Coastguard Worker         if (format == GL_R8_SNORM)
1795*8975f5c5SAndroid Build Coastguard Worker         {
1796*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_8S_NEAR(0, 0, -127, 0, 0, 127, 2);
1797*8975f5c5SAndroid Build Coastguard Worker         }
1798*8975f5c5SAndroid Build Coastguard Worker         else if (format == GL_RG8_SNORM)
1799*8975f5c5SAndroid Build Coastguard Worker         {
1800*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_8S_NEAR(0, 0, -127, -64, 0, 127, 2);
1801*8975f5c5SAndroid Build Coastguard Worker         }
1802*8975f5c5SAndroid Build Coastguard Worker         else if (format == GL_RGBA8_SNORM)
1803*8975f5c5SAndroid Build Coastguard Worker         {
1804*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_8S_NEAR(0, 0, -127, -64, -32, -16, 2);
1805*8975f5c5SAndroid Build Coastguard Worker         }
1806*8975f5c5SAndroid Build Coastguard Worker     };
1807*8975f5c5SAndroid Build Coastguard Worker 
1808*8975f5c5SAndroid Build Coastguard Worker     test(GL_R8_SNORM);
1809*8975f5c5SAndroid Build Coastguard Worker     test(GL_RG8_SNORM);
1810*8975f5c5SAndroid Build Coastguard Worker     test(GL_RGBA8_SNORM);
1811*8975f5c5SAndroid Build Coastguard Worker }
1812*8975f5c5SAndroid Build Coastguard Worker 
1813*8975f5c5SAndroid Build Coastguard Worker // Test that non-trivial, e.g., reversed, blits are supported for signed normalized formats.
TEST_P(FramebufferTest_ES3,BlitReversedSnorm8)1814*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, BlitReversedSnorm8)
1815*8975f5c5SAndroid Build Coastguard Worker {
1816*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_render_snorm"));
1817*8975f5c5SAndroid Build Coastguard Worker 
1818*8975f5c5SAndroid Build Coastguard Worker     auto test = [&](GLenum format) {
1819*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer rbo1;
1820*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, rbo1);
1821*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, format, 4, 4);
1822*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1823*8975f5c5SAndroid Build Coastguard Worker 
1824*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo1;
1825*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo1);
1826*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo1);
1827*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1828*8975f5c5SAndroid Build Coastguard Worker 
1829*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
1830*8975f5c5SAndroid Build Coastguard Worker 
1831*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1832*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(program);
1833*8975f5c5SAndroid Build Coastguard Worker         GLint colorLocation = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
1834*8975f5c5SAndroid Build Coastguard Worker         glUniform4f(colorLocation, -1.0f, -0.5f, -0.25f, -0.125f);
1835*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
1836*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1837*8975f5c5SAndroid Build Coastguard Worker 
1838*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo1);
1839*8975f5c5SAndroid Build Coastguard Worker 
1840*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer rbo2;
1841*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, rbo2);
1842*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, format, 4, 4);
1843*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1844*8975f5c5SAndroid Build Coastguard Worker 
1845*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo2;
1846*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo2);
1847*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo2);
1848*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1849*8975f5c5SAndroid Build Coastguard Worker 
1850*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
1851*8975f5c5SAndroid Build Coastguard Worker 
1852*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, 4, 4, 4, 4, 0, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1853*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1854*8975f5c5SAndroid Build Coastguard Worker 
1855*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo2);
1856*8975f5c5SAndroid Build Coastguard Worker 
1857*8975f5c5SAndroid Build Coastguard Worker         if (format == GL_R8_SNORM)
1858*8975f5c5SAndroid Build Coastguard Worker         {
1859*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_8S_NEAR(0, 0, -127, 0, 0, 127, 2);
1860*8975f5c5SAndroid Build Coastguard Worker         }
1861*8975f5c5SAndroid Build Coastguard Worker         else if (format == GL_RG8_SNORM)
1862*8975f5c5SAndroid Build Coastguard Worker         {
1863*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_8S_NEAR(0, 0, -127, -64, 0, 127, 2);
1864*8975f5c5SAndroid Build Coastguard Worker         }
1865*8975f5c5SAndroid Build Coastguard Worker         else if (format == GL_RGBA8_SNORM)
1866*8975f5c5SAndroid Build Coastguard Worker         {
1867*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_8S_NEAR(0, 0, -127, -64, -32, -16, 2);
1868*8975f5c5SAndroid Build Coastguard Worker         }
1869*8975f5c5SAndroid Build Coastguard Worker     };
1870*8975f5c5SAndroid Build Coastguard Worker 
1871*8975f5c5SAndroid Build Coastguard Worker     test(GL_R8_SNORM);
1872*8975f5c5SAndroid Build Coastguard Worker     test(GL_RG8_SNORM);
1873*8975f5c5SAndroid Build Coastguard Worker     test(GL_RGBA8_SNORM);
1874*8975f5c5SAndroid Build Coastguard Worker }
1875*8975f5c5SAndroid Build Coastguard Worker 
1876*8975f5c5SAndroid Build Coastguard Worker // Test that R16_SNORM, RG16_SNORM, and RGBA16_SNORM are renderable with the extension.
TEST_P(FramebufferTest_ES3,RenderSnorm16)1877*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RenderSnorm16)
1878*8975f5c5SAndroid Build Coastguard Worker {
1879*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_render_snorm"));
1880*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_norm16"));
1881*8975f5c5SAndroid Build Coastguard Worker 
1882*8975f5c5SAndroid Build Coastguard Worker     auto test = [&](GLenum format) {
1883*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer rbo;
1884*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1885*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, format, 4, 4);
1886*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1887*8975f5c5SAndroid Build Coastguard Worker 
1888*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
1889*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1890*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1891*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1892*8975f5c5SAndroid Build Coastguard Worker 
1893*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1894*8975f5c5SAndroid Build Coastguard Worker 
1895*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1896*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(program);
1897*8975f5c5SAndroid Build Coastguard Worker         GLint colorLocation = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
1898*8975f5c5SAndroid Build Coastguard Worker         glUniform4f(colorLocation, -1.0f, -0.5f, -0.25f, -0.125f);
1899*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
1900*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1901*8975f5c5SAndroid Build Coastguard Worker 
1902*8975f5c5SAndroid Build Coastguard Worker         if (format == GL_R16_SNORM_EXT)
1903*8975f5c5SAndroid Build Coastguard Worker         {
1904*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_16S_NEAR(0, 0, -32767, 0, 0, 32767, 2);
1905*8975f5c5SAndroid Build Coastguard Worker         }
1906*8975f5c5SAndroid Build Coastguard Worker         else if (format == GL_RG16_SNORM_EXT)
1907*8975f5c5SAndroid Build Coastguard Worker         {
1908*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_16S_NEAR(0, 0, -32767, -16383, 0, 32767, 2);
1909*8975f5c5SAndroid Build Coastguard Worker         }
1910*8975f5c5SAndroid Build Coastguard Worker         else if (format == GL_RGBA16_SNORM_EXT)
1911*8975f5c5SAndroid Build Coastguard Worker         {
1912*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_16S_NEAR(0, 0, -32767, -16383, -8191, -4095, 2);
1913*8975f5c5SAndroid Build Coastguard Worker         }
1914*8975f5c5SAndroid Build Coastguard Worker     };
1915*8975f5c5SAndroid Build Coastguard Worker 
1916*8975f5c5SAndroid Build Coastguard Worker     test(GL_R16_SNORM_EXT);
1917*8975f5c5SAndroid Build Coastguard Worker     test(GL_RG16_SNORM_EXT);
1918*8975f5c5SAndroid Build Coastguard Worker     test(GL_RGBA16_SNORM_EXT);
1919*8975f5c5SAndroid Build Coastguard Worker }
1920*8975f5c5SAndroid Build Coastguard Worker 
1921*8975f5c5SAndroid Build Coastguard Worker class FramebufferTest_ES3Metal : public FramebufferTest_ES3
1922*8975f5c5SAndroid Build Coastguard Worker {};
1923*8975f5c5SAndroid Build Coastguard Worker 
1924*8975f5c5SAndroid Build Coastguard Worker // Metal, iOS has a limit of the number of bits that can be output
1925*8975f5c5SAndroid Build Coastguard Worker // to color attachments. Test we're enforcing that limit.
TEST_P(FramebufferTest_ES3Metal,TooManyBitsGeneratesFramebufferUnsupported)1926*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3Metal, TooManyBitsGeneratesFramebufferUnsupported)
1927*8975f5c5SAndroid Build Coastguard Worker {
1928*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
1929*8975f5c5SAndroid Build Coastguard Worker         !getEGLWindow()->isFeatureEnabled(Feature::LimitMaxColorTargetBitsForTesting));
1930*8975f5c5SAndroid Build Coastguard Worker 
1931*8975f5c5SAndroid Build Coastguard Worker     GLint maxDrawBuffers;
1932*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
1933*8975f5c5SAndroid Build Coastguard Worker 
1934*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1935*8975f5c5SAndroid Build Coastguard Worker 
1936*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1937*8975f5c5SAndroid Build Coastguard Worker 
1938*8975f5c5SAndroid Build Coastguard Worker     // Test maxDrawBuffers * RGBA8UI works.
1939*8975f5c5SAndroid Build Coastguard Worker     {
1940*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLTexture> textures(maxDrawBuffers);
1941*8975f5c5SAndroid Build Coastguard Worker         for (GLint i = 0; i < maxDrawBuffers; ++i)
1942*8975f5c5SAndroid Build Coastguard Worker         {
1943*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, textures[i]);
1944*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8UI, 1, 1);
1945*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1946*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1947*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D,
1948*8975f5c5SAndroid Build Coastguard Worker                                    textures[i], 0);
1949*8975f5c5SAndroid Build Coastguard Worker         }
1950*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
1951*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1952*8975f5c5SAndroid Build Coastguard Worker     }
1953*8975f5c5SAndroid Build Coastguard Worker 
1954*8975f5c5SAndroid Build Coastguard Worker     // Test maxDrawBuffers * RGBA32UI does not work.
1955*8975f5c5SAndroid Build Coastguard Worker     {
1956*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLTexture> textures(maxDrawBuffers);
1957*8975f5c5SAndroid Build Coastguard Worker         for (GLint i = 0; i < maxDrawBuffers; ++i)
1958*8975f5c5SAndroid Build Coastguard Worker         {
1959*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, textures[i]);
1960*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32UI, 1, 1);
1961*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1962*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1963*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D,
1964*8975f5c5SAndroid Build Coastguard Worker                                    textures[i], 0);
1965*8975f5c5SAndroid Build Coastguard Worker         }
1966*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
1967*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_UNSUPPORTED, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1968*8975f5c5SAndroid Build Coastguard Worker     }
1969*8975f5c5SAndroid Build Coastguard Worker }
1970*8975f5c5SAndroid Build Coastguard Worker 
1971*8975f5c5SAndroid Build Coastguard Worker // Metal, iOS has a limit of the number of bits that can be output
1972*8975f5c5SAndroid Build Coastguard Worker // to color attachments. Test we're enforcing that limit.
1973*8975f5c5SAndroid Build Coastguard Worker // This test is separate from the one above as it's possible
1974*8975f5c5SAndroid Build Coastguard Worker // glCheckFramebufferStatus might cache some calculation so we
1975*8975f5c5SAndroid Build Coastguard Worker // don't call here to ensure we get INVALID_FRAMEBUFFER_OPERATION
1976*8975f5c5SAndroid Build Coastguard Worker // when drawing.
TEST_P(FramebufferTest_ES3Metal,TooManyBitsGeneratesInvalidFramebufferOperation)1977*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3Metal, TooManyBitsGeneratesInvalidFramebufferOperation)
1978*8975f5c5SAndroid Build Coastguard Worker {
1979*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
1980*8975f5c5SAndroid Build Coastguard Worker         !getEGLWindow()->isFeatureEnabled(Feature::LimitMaxColorTargetBitsForTesting));
1981*8975f5c5SAndroid Build Coastguard Worker 
1982*8975f5c5SAndroid Build Coastguard Worker     GLint maxDrawBuffers;
1983*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
1984*8975f5c5SAndroid Build Coastguard Worker 
1985*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1986*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLTexture> textures(maxDrawBuffers);
1987*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> drawBuffers(maxDrawBuffers, GL_NONE);
1988*8975f5c5SAndroid Build Coastguard Worker 
1989*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1990*8975f5c5SAndroid Build Coastguard Worker 
1991*8975f5c5SAndroid Build Coastguard Worker     std::stringstream fs;
1992*8975f5c5SAndroid Build Coastguard Worker 
1993*8975f5c5SAndroid Build Coastguard Worker     fs << R"(#version 300 es
1994*8975f5c5SAndroid Build Coastguard Worker       precision highp float;
1995*8975f5c5SAndroid Build Coastguard Worker       out uvec4 fragColor[)"
1996*8975f5c5SAndroid Build Coastguard Worker        << maxDrawBuffers << R"(];
1997*8975f5c5SAndroid Build Coastguard Worker       void main() {
1998*8975f5c5SAndroid Build Coastguard Worker       )";
1999*8975f5c5SAndroid Build Coastguard Worker 
2000*8975f5c5SAndroid Build Coastguard Worker     for (GLint i = 0; i < maxDrawBuffers; ++i)
2001*8975f5c5SAndroid Build Coastguard Worker     {
2002*8975f5c5SAndroid Build Coastguard Worker         fs << "  fragColor[" << i << "] = uvec4(" << i << ", " << i * 2 << ", " << i * 4 << ", "
2003*8975f5c5SAndroid Build Coastguard Worker            << i * 8 << ");\n";
2004*8975f5c5SAndroid Build Coastguard Worker         drawBuffers[i] = GL_COLOR_ATTACHMENT0 + i;
2005*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[i]);
2006*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, 1, 1, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE,
2007*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
2008*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2009*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2010*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i],
2011*8975f5c5SAndroid Build Coastguard Worker                                0);
2012*8975f5c5SAndroid Build Coastguard Worker     }
2013*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2014*8975f5c5SAndroid Build Coastguard Worker 
2015*8975f5c5SAndroid Build Coastguard Worker     fs << "}";
2016*8975f5c5SAndroid Build Coastguard Worker 
2017*8975f5c5SAndroid Build Coastguard Worker     constexpr const char vs[] = R"(#version 300 es
2018*8975f5c5SAndroid Build Coastguard Worker       void main() {
2019*8975f5c5SAndroid Build Coastguard Worker         gl_Position = vec4(0, 0, 0, 1);
2020*8975f5c5SAndroid Build Coastguard Worker         gl_PointSize = 1.0;
2021*8975f5c5SAndroid Build Coastguard Worker       }
2022*8975f5c5SAndroid Build Coastguard Worker     )";
2023*8975f5c5SAndroid Build Coastguard Worker 
2024*8975f5c5SAndroid Build Coastguard Worker     GLProgram program;
2025*8975f5c5SAndroid Build Coastguard Worker     program.makeRaster(vs, fs.str().c_str());
2026*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
2027*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2028*8975f5c5SAndroid Build Coastguard Worker 
2029*8975f5c5SAndroid Build Coastguard Worker     // Validate we can draw to maxDrawBuffers attachments
2030*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(maxDrawBuffers, drawBuffers.data());
2031*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_POINTS, 0, 1);
2032*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2033*8975f5c5SAndroid Build Coastguard Worker 
2034*8975f5c5SAndroid Build Coastguard Worker     for (GLint i = 0; i < maxDrawBuffers; ++i)
2035*8975f5c5SAndroid Build Coastguard Worker     {
2036*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[i]);
2037*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32UI, 1, 1, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT,
2038*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
2039*8975f5c5SAndroid Build Coastguard Worker     }
2040*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2041*8975f5c5SAndroid Build Coastguard Worker 
2042*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_POINTS, 0, 1);
2043*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, glGetError());
2044*8975f5c5SAndroid Build Coastguard Worker }
2045*8975f5c5SAndroid Build Coastguard Worker 
2046*8975f5c5SAndroid Build Coastguard Worker class FramebufferTestWithFormatFallback : public ANGLETest<>
2047*8975f5c5SAndroid Build Coastguard Worker {
2048*8975f5c5SAndroid Build Coastguard Worker   protected:
FramebufferTestWithFormatFallback()2049*8975f5c5SAndroid Build Coastguard Worker     FramebufferTestWithFormatFallback()
2050*8975f5c5SAndroid Build Coastguard Worker     {
2051*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(16);
2052*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(16);
2053*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
2054*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
2055*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
2056*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
2057*8975f5c5SAndroid Build Coastguard Worker         setConfigDepthBits(24);
2058*8975f5c5SAndroid Build Coastguard Worker         setConfigStencilBits(8);
2059*8975f5c5SAndroid Build Coastguard Worker     }
2060*8975f5c5SAndroid Build Coastguard Worker 
2061*8975f5c5SAndroid Build Coastguard Worker     void texImageFollowedByFBORead(GLenum internalFormat, GLenum type);
2062*8975f5c5SAndroid Build Coastguard Worker     void blitCopyFollowedByFBORead(GLenum internalFormat, GLenum type);
2063*8975f5c5SAndroid Build Coastguard Worker     void copyTexImageFollowedBySampling(GLenum internalFormat, GLenum type);
2064*8975f5c5SAndroid Build Coastguard Worker     void cubeTexImageFollowedByFBORead(GLenum internalFormat, GLenum type);
2065*8975f5c5SAndroid Build Coastguard Worker     GLushort convertGLColorToUShort(GLenum internalFormat, const GLColor &color);
2066*8975f5c5SAndroid Build Coastguard Worker     static constexpr GLsizei kTexWidth  = 16;
2067*8975f5c5SAndroid Build Coastguard Worker     static constexpr GLsizei kTexHeight = 16;
2068*8975f5c5SAndroid Build Coastguard Worker     static constexpr GLsizei kMaxLevel  = 4;
2069*8975f5c5SAndroid Build Coastguard Worker };
2070*8975f5c5SAndroid Build Coastguard Worker 
convertGLColorToUShort(GLenum internalFormat,const GLColor & color)2071*8975f5c5SAndroid Build Coastguard Worker GLushort FramebufferTestWithFormatFallback::convertGLColorToUShort(GLenum internalFormat,
2072*8975f5c5SAndroid Build Coastguard Worker                                                                    const GLColor &color)
2073*8975f5c5SAndroid Build Coastguard Worker {
2074*8975f5c5SAndroid Build Coastguard Worker     GLushort r, g, b, a;
2075*8975f5c5SAndroid Build Coastguard Worker     switch (internalFormat)
2076*8975f5c5SAndroid Build Coastguard Worker     {
2077*8975f5c5SAndroid Build Coastguard Worker         case GL_RGB5_A1:
2078*8975f5c5SAndroid Build Coastguard Worker             r = (color.R >> 3) << 11;
2079*8975f5c5SAndroid Build Coastguard Worker             g = (color.G >> 3) << 6;
2080*8975f5c5SAndroid Build Coastguard Worker             b = (color.B >> 3) << 1;
2081*8975f5c5SAndroid Build Coastguard Worker             a = color.A >> 7;
2082*8975f5c5SAndroid Build Coastguard Worker             break;
2083*8975f5c5SAndroid Build Coastguard Worker         case GL_RGBA4:
2084*8975f5c5SAndroid Build Coastguard Worker             r = (color.R >> 4) << 12;
2085*8975f5c5SAndroid Build Coastguard Worker             g = (color.G >> 4) << 8;
2086*8975f5c5SAndroid Build Coastguard Worker             b = (color.B >> 4) << 4;
2087*8975f5c5SAndroid Build Coastguard Worker             a = color.A >> 4;
2088*8975f5c5SAndroid Build Coastguard Worker             break;
2089*8975f5c5SAndroid Build Coastguard Worker         default:
2090*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
2091*8975f5c5SAndroid Build Coastguard Worker             r = 0;
2092*8975f5c5SAndroid Build Coastguard Worker             g = 0;
2093*8975f5c5SAndroid Build Coastguard Worker             b = 0;
2094*8975f5c5SAndroid Build Coastguard Worker             a = 0;
2095*8975f5c5SAndroid Build Coastguard Worker             break;
2096*8975f5c5SAndroid Build Coastguard Worker     }
2097*8975f5c5SAndroid Build Coastguard Worker     return r | g | b | a;
2098*8975f5c5SAndroid Build Coastguard Worker }
2099*8975f5c5SAndroid Build Coastguard Worker 
2100*8975f5c5SAndroid Build Coastguard Worker // Test texture format fallback while it has staged updates.
texImageFollowedByFBORead(GLenum internalFormat,GLenum type)2101*8975f5c5SAndroid Build Coastguard Worker void FramebufferTestWithFormatFallback::texImageFollowedByFBORead(GLenum internalFormat,
2102*8975f5c5SAndroid Build Coastguard Worker                                                                   GLenum type)
2103*8975f5c5SAndroid Build Coastguard Worker {
2104*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
2105*8975f5c5SAndroid Build Coastguard Worker     GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
2106*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLocation);
2107*8975f5c5SAndroid Build Coastguard Worker     GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
2108*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLocation);
2109*8975f5c5SAndroid Build Coastguard Worker 
2110*8975f5c5SAndroid Build Coastguard Worker     const GLColor kColor = GLColor::blue;
2111*8975f5c5SAndroid Build Coastguard Worker 
2112*8975f5c5SAndroid Build Coastguard Worker     for (int loop = 0; loop < 4; loop++)
2113*8975f5c5SAndroid Build Coastguard Worker     {
2114*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
2115*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
2116*8975f5c5SAndroid Build Coastguard Worker         const GLushort u16Color = convertGLColorToUShort(internalFormat, kColor);
2117*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
2118*8975f5c5SAndroid Build Coastguard Worker         if (loop == 0 || loop == 2)
2119*8975f5c5SAndroid Build Coastguard Worker         {
2120*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
2121*8975f5c5SAndroid Build Coastguard Worker                          pixels.data());
2122*8975f5c5SAndroid Build Coastguard Worker         }
2123*8975f5c5SAndroid Build Coastguard Worker         else
2124*8975f5c5SAndroid Build Coastguard Worker         {
2125*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2D(GL_TEXTURE_2D, 1, internalFormat, kTexWidth, kTexHeight);
2126*8975f5c5SAndroid Build Coastguard Worker             glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexWidth, kTexHeight, GL_RGBA, type,
2127*8975f5c5SAndroid Build Coastguard Worker                             pixels.data());
2128*8975f5c5SAndroid Build Coastguard Worker         }
2129*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2130*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2131*8975f5c5SAndroid Build Coastguard Worker 
2132*8975f5c5SAndroid Build Coastguard Worker         if (loop >= 2)
2133*8975f5c5SAndroid Build Coastguard Worker         {
2134*8975f5c5SAndroid Build Coastguard Worker             // Draw quad using texture
2135*8975f5c5SAndroid Build Coastguard Worker             glUseProgram(program);
2136*8975f5c5SAndroid Build Coastguard Worker             glActiveTexture(GL_TEXTURE0);
2137*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, texture);
2138*8975f5c5SAndroid Build Coastguard Worker             glClearColor(0, 0, 0, 1);
2139*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
2140*8975f5c5SAndroid Build Coastguard Worker             glUniform1f(lodLocation, 0);
2141*8975f5c5SAndroid Build Coastguard Worker             drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2142*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 255, 255);
2143*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
2144*8975f5c5SAndroid Build Coastguard Worker         }
2145*8975f5c5SAndroid Build Coastguard Worker 
2146*8975f5c5SAndroid Build Coastguard Worker         // attach blue texture to FBO
2147*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
2148*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2149*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
2150*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2151*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(kTexWidth / 2, kTexHeight / 2, kColor.R, kColor.G, kColor.B, kColor.A);
2152*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2153*8975f5c5SAndroid Build Coastguard Worker     }
2154*8975f5c5SAndroid Build Coastguard Worker }
TEST_P(FramebufferTestWithFormatFallback,R5G5B5A1_TexImage)2155*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, R5G5B5A1_TexImage)
2156*8975f5c5SAndroid Build Coastguard Worker {
2157*8975f5c5SAndroid Build Coastguard Worker     texImageFollowedByFBORead(GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1);
2158*8975f5c5SAndroid Build Coastguard Worker }
TEST_P(FramebufferTestWithFormatFallback,R4G4B4A4_TexImage)2159*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_TexImage)
2160*8975f5c5SAndroid Build Coastguard Worker {
2161*8975f5c5SAndroid Build Coastguard Worker     texImageFollowedByFBORead(GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4);
2162*8975f5c5SAndroid Build Coastguard Worker }
2163*8975f5c5SAndroid Build Coastguard Worker 
2164*8975f5c5SAndroid Build Coastguard Worker // Test texture format fallback while it has staged updates and then do copyTexImage2D and followed
2165*8975f5c5SAndroid Build Coastguard Worker // by sampling.
copyTexImageFollowedBySampling(GLenum internalFormat,GLenum type)2166*8975f5c5SAndroid Build Coastguard Worker void FramebufferTestWithFormatFallback::copyTexImageFollowedBySampling(GLenum internalFormat,
2167*8975f5c5SAndroid Build Coastguard Worker                                                                        GLenum type)
2168*8975f5c5SAndroid Build Coastguard Worker {
2169*8975f5c5SAndroid Build Coastguard Worker     const GLColor kColor = GLColor::blue;
2170*8975f5c5SAndroid Build Coastguard Worker     // Create blue texture
2171*8975f5c5SAndroid Build Coastguard Worker     GLTexture blueTex2D;
2172*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, blueTex2D);
2173*8975f5c5SAndroid Build Coastguard Worker     const GLushort u16Color = convertGLColorToUShort(internalFormat, kColor);
2174*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLushort> bluePixels(kTexWidth * kTexHeight, u16Color);
2175*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
2176*8975f5c5SAndroid Build Coastguard Worker                  bluePixels.data());
2177*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2178*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2179*8975f5c5SAndroid Build Coastguard Worker 
2180*8975f5c5SAndroid Build Coastguard Worker     // attach blue texture to FBO and read back to verify. This should trigger format conversion
2181*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer blueFbo;
2182*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, blueFbo);
2183*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, blueTex2D, 0);
2184*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2185*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(kTexWidth / 2, kTexHeight / 2, 0, 0, 255, 255);
2186*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2187*8975f5c5SAndroid Build Coastguard Worker 
2188*8975f5c5SAndroid Build Coastguard Worker     // Create red texture
2189*8975f5c5SAndroid Build Coastguard Worker     GLTexture copyTex2D;
2190*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, copyTex2D);
2191*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLushort> redPixels(kTexWidth * kTexHeight, 0xF801);
2192*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
2193*8975f5c5SAndroid Build Coastguard Worker                  redPixels.data());
2194*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2195*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2196*8975f5c5SAndroid Build Coastguard Worker 
2197*8975f5c5SAndroid Build Coastguard Worker     // CopyTexImage from blue to red
2198*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 0, 0, kTexWidth, kTexHeight, 0);
2199*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2200*8975f5c5SAndroid Build Coastguard Worker 
2201*8975f5c5SAndroid Build Coastguard Worker     // Draw with copyTex2D
2202*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
2203*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
2204*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
2205*8975f5c5SAndroid Build Coastguard Worker     GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
2206*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLocation);
2207*8975f5c5SAndroid Build Coastguard Worker     GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
2208*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLocation);
2209*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2210*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, copyTex2D);
2211*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 1, 0, 1);
2212*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
2213*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(lodLocation, 0);
2214*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2215*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, kColor.R, kColor.G, kColor.B,
2216*8975f5c5SAndroid Build Coastguard Worker                     kColor.A);
2217*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2218*8975f5c5SAndroid Build Coastguard Worker }
TEST_P(FramebufferTestWithFormatFallback,R5G5B5A1_CopyTexImage)2219*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, R5G5B5A1_CopyTexImage)
2220*8975f5c5SAndroid Build Coastguard Worker {
2221*8975f5c5SAndroid Build Coastguard Worker     copyTexImageFollowedBySampling(GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1);
2222*8975f5c5SAndroid Build Coastguard Worker }
TEST_P(FramebufferTestWithFormatFallback,R4G4B4A4_CopyTexImage)2223*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_CopyTexImage)
2224*8975f5c5SAndroid Build Coastguard Worker {
2225*8975f5c5SAndroid Build Coastguard Worker     copyTexImageFollowedBySampling(GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4);
2226*8975f5c5SAndroid Build Coastguard Worker }
2227*8975f5c5SAndroid Build Coastguard Worker 
2228*8975f5c5SAndroid Build Coastguard Worker // Test texture format fallback while it has staged updates and then do FBO blit and followed by
2229*8975f5c5SAndroid Build Coastguard Worker // copyTexImage2D.
blitCopyFollowedByFBORead(GLenum internalFormat,GLenum type)2230*8975f5c5SAndroid Build Coastguard Worker void FramebufferTestWithFormatFallback::blitCopyFollowedByFBORead(GLenum internalFormat,
2231*8975f5c5SAndroid Build Coastguard Worker                                                                   GLenum type)
2232*8975f5c5SAndroid Build Coastguard Worker {
2233*8975f5c5SAndroid Build Coastguard Worker     for (int loop = 0; loop < 2; loop++)
2234*8975f5c5SAndroid Build Coastguard Worker     {
2235*8975f5c5SAndroid Build Coastguard Worker         // Create blue texture
2236*8975f5c5SAndroid Build Coastguard Worker         GLTexture blueTex2D;
2237*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, blueTex2D);
2238*8975f5c5SAndroid Build Coastguard Worker         GLushort u16Color = convertGLColorToUShort(internalFormat, GLColor::blue);
2239*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLushort> bluePixels(kTexWidth * kTexHeight, u16Color);
2240*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
2241*8975f5c5SAndroid Build Coastguard Worker                      bluePixels.data());
2242*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2243*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2244*8975f5c5SAndroid Build Coastguard Worker 
2245*8975f5c5SAndroid Build Coastguard Worker         // attach blue texture to FBO
2246*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer readFbo;
2247*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
2248*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, blueTex2D,
2249*8975f5c5SAndroid Build Coastguard Worker                                0);
2250*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
2251*8975f5c5SAndroid Build Coastguard Worker 
2252*8975f5c5SAndroid Build Coastguard Worker         GLTexture redTex2D;
2253*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer renderBuffer;
2254*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer drawFbo;
2255*8975f5c5SAndroid Build Coastguard Worker         if (loop == 0)
2256*8975f5c5SAndroid Build Coastguard Worker         {
2257*8975f5c5SAndroid Build Coastguard Worker             glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
2258*8975f5c5SAndroid Build Coastguard Worker             glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, kTexWidth, kTexHeight);
2259*8975f5c5SAndroid Build Coastguard Worker 
2260*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFbo);
2261*8975f5c5SAndroid Build Coastguard Worker             glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
2262*8975f5c5SAndroid Build Coastguard Worker                                       renderBuffer);
2263*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2264*8975f5c5SAndroid Build Coastguard Worker             glClearColor(1.0, 0.0, 0.0, 1.0);
2265*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
2266*8975f5c5SAndroid Build Coastguard Worker         }
2267*8975f5c5SAndroid Build Coastguard Worker         else
2268*8975f5c5SAndroid Build Coastguard Worker         {
2269*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, redTex2D);
2270*8975f5c5SAndroid Build Coastguard Worker             u16Color = convertGLColorToUShort(internalFormat, GLColor::red);
2271*8975f5c5SAndroid Build Coastguard Worker             std::vector<GLushort> redPixels(kTexWidth * kTexHeight, u16Color);
2272*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
2273*8975f5c5SAndroid Build Coastguard Worker                          redPixels.data());
2274*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2275*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2276*8975f5c5SAndroid Build Coastguard Worker 
2277*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFbo);
2278*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
2279*8975f5c5SAndroid Build Coastguard Worker                                    redTex2D, 0);
2280*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2281*8975f5c5SAndroid Build Coastguard Worker         }
2282*8975f5c5SAndroid Build Coastguard Worker 
2283*8975f5c5SAndroid Build Coastguard Worker         // Blit
2284*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
2285*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, kTexWidth, kTexHeight, 0, 0, kTexWidth, kTexHeight,
2286*8975f5c5SAndroid Build Coastguard Worker                           GL_COLOR_BUFFER_BIT, GL_NEAREST);
2287*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2288*8975f5c5SAndroid Build Coastguard Worker 
2289*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer readFbo2;
2290*8975f5c5SAndroid Build Coastguard Worker         if (loop == 0)
2291*8975f5c5SAndroid Build Coastguard Worker         {
2292*8975f5c5SAndroid Build Coastguard Worker             // CopyTexImage from renderBuffer to copyTex2D
2293*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo2);
2294*8975f5c5SAndroid Build Coastguard Worker             glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
2295*8975f5c5SAndroid Build Coastguard Worker                                       renderBuffer);
2296*8975f5c5SAndroid Build Coastguard Worker         }
2297*8975f5c5SAndroid Build Coastguard Worker         else
2298*8975f5c5SAndroid Build Coastguard Worker         {
2299*8975f5c5SAndroid Build Coastguard Worker 
2300*8975f5c5SAndroid Build Coastguard Worker             // CopyTexImage from redTex2D to copyTex2D
2301*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo2);
2302*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
2303*8975f5c5SAndroid Build Coastguard Worker                                    redTex2D, 0);
2304*8975f5c5SAndroid Build Coastguard Worker         }
2305*8975f5c5SAndroid Build Coastguard Worker         GLTexture copyTex2D;
2306*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, copyTex2D);
2307*8975f5c5SAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, kTexWidth, kTexHeight, 0);
2308*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2309*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2310*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2311*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2312*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2313*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, 0);
2314*8975f5c5SAndroid Build Coastguard Worker 
2315*8975f5c5SAndroid Build Coastguard Worker         // Read out red texture
2316*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer readFbo3;
2317*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo3);
2318*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, copyTex2D,
2319*8975f5c5SAndroid Build Coastguard Worker                                0);
2320*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
2321*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(kTexWidth / 2, kTexHeight / 2, 0, 0, 255, 255);
2322*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2323*8975f5c5SAndroid Build Coastguard Worker     }
2324*8975f5c5SAndroid Build Coastguard Worker }
TEST_P(FramebufferTestWithFormatFallback,R5G5B5A1_BlitCopyTexImage)2325*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, R5G5B5A1_BlitCopyTexImage)
2326*8975f5c5SAndroid Build Coastguard Worker {
2327*8975f5c5SAndroid Build Coastguard Worker     blitCopyFollowedByFBORead(GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1);
2328*8975f5c5SAndroid Build Coastguard Worker }
TEST_P(FramebufferTestWithFormatFallback,RGBA4444_BlitCopyTexImage)2329*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, RGBA4444_BlitCopyTexImage)
2330*8975f5c5SAndroid Build Coastguard Worker {
2331*8975f5c5SAndroid Build Coastguard Worker     blitCopyFollowedByFBORead(GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4);
2332*8975f5c5SAndroid Build Coastguard Worker }
2333*8975f5c5SAndroid Build Coastguard Worker 
2334*8975f5c5SAndroid Build Coastguard Worker // Test texture format fallback while it has staged updates, specially for cubemap target.
cubeTexImageFollowedByFBORead(GLenum internalFormat,GLenum type)2335*8975f5c5SAndroid Build Coastguard Worker void FramebufferTestWithFormatFallback::cubeTexImageFollowedByFBORead(GLenum internalFormat,
2336*8975f5c5SAndroid Build Coastguard Worker                                                                       GLenum type)
2337*8975f5c5SAndroid Build Coastguard Worker {
2338*8975f5c5SAndroid Build Coastguard Worker     const GLColor kColors[6] = {GLColor::red,  GLColor::green,  GLColor::blue,
2339*8975f5c5SAndroid Build Coastguard Worker                                 GLColor::cyan, GLColor::yellow, GLColor::magenta};
2340*8975f5c5SAndroid Build Coastguard Worker     GLTexture cubeTex2D;
2341*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTex2D);
2342*8975f5c5SAndroid Build Coastguard Worker     for (GLenum target = GL_TEXTURE_CUBE_MAP_POSITIVE_X; target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
2343*8975f5c5SAndroid Build Coastguard Worker          target++)
2344*8975f5c5SAndroid Build Coastguard Worker     {
2345*8975f5c5SAndroid Build Coastguard Worker         int j                   = target - GL_TEXTURE_CUBE_MAP_POSITIVE_X;
2346*8975f5c5SAndroid Build Coastguard Worker         const GLushort u16Color = convertGLColorToUShort(internalFormat, kColors[j]);
2347*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
2348*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(target, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
2349*8975f5c5SAndroid Build Coastguard Worker                      pixels.data());
2350*8975f5c5SAndroid Build Coastguard Worker     }
2351*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2352*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2353*8975f5c5SAndroid Build Coastguard Worker 
2354*8975f5c5SAndroid Build Coastguard Worker     // attach blue texture to FBO
2355*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2356*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2357*8975f5c5SAndroid Build Coastguard Worker     for (GLenum target = GL_TEXTURE_CUBE_MAP_POSITIVE_X; target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
2358*8975f5c5SAndroid Build Coastguard Worker          target++)
2359*8975f5c5SAndroid Build Coastguard Worker     {
2360*8975f5c5SAndroid Build Coastguard Worker         GLint j = target - GL_TEXTURE_CUBE_MAP_POSITIVE_X;
2361*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, cubeTex2D, 0);
2362*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2363*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(kTexWidth / 2, kTexHeight / 2, kColors[j]) << "face " << j;
2364*8975f5c5SAndroid Build Coastguard Worker     }
2365*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2366*8975f5c5SAndroid Build Coastguard Worker }
TEST_P(FramebufferTestWithFormatFallback,R5G5B5A1_CubeTexImage)2367*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, R5G5B5A1_CubeTexImage)
2368*8975f5c5SAndroid Build Coastguard Worker {
2369*8975f5c5SAndroid Build Coastguard Worker     cubeTexImageFollowedByFBORead(GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1);
2370*8975f5c5SAndroid Build Coastguard Worker }
TEST_P(FramebufferTestWithFormatFallback,R4G4B4A4_CubeTexImage)2371*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_CubeTexImage)
2372*8975f5c5SAndroid Build Coastguard Worker {
2373*8975f5c5SAndroid Build Coastguard Worker     cubeTexImageFollowedByFBORead(GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4);
2374*8975f5c5SAndroid Build Coastguard Worker }
2375*8975f5c5SAndroid Build Coastguard Worker 
2376*8975f5c5SAndroid Build Coastguard Worker // Tests that the out-of-range staged update is reformatted when mipmapping is enabled, but not
2377*8975f5c5SAndroid Build Coastguard Worker // before it.
TEST_P(FramebufferTestWithFormatFallback,R4G4B4A4_OutOfRangeStagedUpdateReformated)2378*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_OutOfRangeStagedUpdateReformated)
2379*8975f5c5SAndroid Build Coastguard Worker {
2380*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
2381*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
2382*8975f5c5SAndroid Build Coastguard Worker     GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
2383*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLocation);
2384*8975f5c5SAndroid Build Coastguard Worker     GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
2385*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLocation);
2386*8975f5c5SAndroid Build Coastguard Worker 
2387*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
2388*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
2389*8975f5c5SAndroid Build Coastguard Worker     GLushort u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::red);
2390*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
2391*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
2392*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_SHORT_4_4_4_4, pixels.data());
2393*8975f5c5SAndroid Build Coastguard Worker     u16Color = convertGLColorToUShort(GL_RGB5_A1, GLColor::green);
2394*8975f5c5SAndroid Build Coastguard Worker     pixels.assign(kTexWidth * kTexHeight, u16Color);
2395*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kTexWidth / 2, kTexHeight / 2, 0, GL_RGBA,
2396*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_SHORT_5_5_5_1, pixels.data());
2397*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2398*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2399*8975f5c5SAndroid Build Coastguard Worker 
2400*8975f5c5SAndroid Build Coastguard Worker     // Draw quad
2401*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2402*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
2403*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(lodLocation, 0);
2404*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2405*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255);
2406*8975f5c5SAndroid Build Coastguard Worker 
2407*8975f5c5SAndroid Build Coastguard Worker     // Now trigger format conversion
2408*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer readFbo;
2409*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
2410*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
2411*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
2412*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowWidth() / 2, 255, 0, 0, 255);
2413*8975f5c5SAndroid Build Coastguard Worker 
2414*8975f5c5SAndroid Build Coastguard Worker     // update level0 with compatible data and enable mipmap
2415*8975f5c5SAndroid Build Coastguard Worker     u16Color = convertGLColorToUShort(GL_RGB5_A1, GLColor::blue);
2416*8975f5c5SAndroid Build Coastguard Worker     pixels.assign(kTexWidth * kTexHeight, u16Color);
2417*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
2418*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_SHORT_5_5_5_1, pixels.data());
2419*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
2420*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2421*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
2422*8975f5c5SAndroid Build Coastguard Worker 
2423*8975f5c5SAndroid Build Coastguard Worker     // Draw quad with lod0 and lod1 and verify color
2424*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(lodLocation, 0);
2425*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2426*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 255, 255);
2427*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(lodLocation, 1);
2428*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2429*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 255, 255);
2430*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2431*8975f5c5SAndroid Build Coastguard Worker }
2432*8975f5c5SAndroid Build Coastguard Worker 
2433*8975f5c5SAndroid Build Coastguard Worker // Tests that the texture is reformatted when the clear is done through the draw path.
TEST_P(FramebufferTestWithFormatFallback,R4G4B4A4_MaskedClear)2434*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_MaskedClear)
2435*8975f5c5SAndroid Build Coastguard Worker {
2436*8975f5c5SAndroid Build Coastguard Worker     for (int loop = 0; loop < 2; loop++)
2437*8975f5c5SAndroid Build Coastguard Worker     {
2438*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
2439*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
2440*8975f5c5SAndroid Build Coastguard Worker         GLushort u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::red);
2441*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
2442*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
2443*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_SHORT_4_4_4_4, pixels.data());
2444*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2445*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2446*8975f5c5SAndroid Build Coastguard Worker 
2447*8975f5c5SAndroid Build Coastguard Worker         if (loop == 0)
2448*8975f5c5SAndroid Build Coastguard Worker         {
2449*8975f5c5SAndroid Build Coastguard Worker             // Draw quad
2450*8975f5c5SAndroid Build Coastguard Worker             ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(),
2451*8975f5c5SAndroid Build Coastguard Worker                              essl3_shaders::fs::Texture2DLod());
2452*8975f5c5SAndroid Build Coastguard Worker             glUseProgram(program);
2453*8975f5c5SAndroid Build Coastguard Worker             GLint textureLocation =
2454*8975f5c5SAndroid Build Coastguard Worker                 glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
2455*8975f5c5SAndroid Build Coastguard Worker             ASSERT_NE(-1, textureLocation);
2456*8975f5c5SAndroid Build Coastguard Worker             GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
2457*8975f5c5SAndroid Build Coastguard Worker             ASSERT_NE(-1, lodLocation);
2458*8975f5c5SAndroid Build Coastguard Worker             glActiveTexture(GL_TEXTURE0);
2459*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, texture);
2460*8975f5c5SAndroid Build Coastguard Worker             glClearColor(0, 0, 0, 1);
2461*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
2462*8975f5c5SAndroid Build Coastguard Worker             glUniform1f(lodLocation, 0);
2463*8975f5c5SAndroid Build Coastguard Worker             drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2464*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255);
2465*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
2466*8975f5c5SAndroid Build Coastguard Worker         }
2467*8975f5c5SAndroid Build Coastguard Worker 
2468*8975f5c5SAndroid Build Coastguard Worker         // Now trigger format conversion with masked clear
2469*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
2470*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2471*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
2472*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2473*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0, 1, 1, 1);
2474*8975f5c5SAndroid Build Coastguard Worker         glColorMask(false, true, false, false);
2475*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
2476*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(kTexWidth / 2, kTexHeight / 2, 255, 255, 0, 255);
2477*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2478*8975f5c5SAndroid Build Coastguard Worker     }
2479*8975f5c5SAndroid Build Coastguard Worker }
2480*8975f5c5SAndroid Build Coastguard Worker 
2481*8975f5c5SAndroid Build Coastguard Worker // Tests that glGenerateMipmap works when the format is converted to renderable..
TEST_P(FramebufferTestWithFormatFallback,R4G4B4A4_GenerateMipmap)2482*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_GenerateMipmap)
2483*8975f5c5SAndroid Build Coastguard Worker {
2484*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
2485*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
2486*8975f5c5SAndroid Build Coastguard Worker     GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
2487*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLocation);
2488*8975f5c5SAndroid Build Coastguard Worker     GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
2489*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLocation);
2490*8975f5c5SAndroid Build Coastguard Worker 
2491*8975f5c5SAndroid Build Coastguard Worker     for (int loop = 0; loop < 4; loop++)
2492*8975f5c5SAndroid Build Coastguard Worker     {
2493*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
2494*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
2495*8975f5c5SAndroid Build Coastguard Worker         GLushort u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::red);
2496*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
2497*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
2498*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_SHORT_4_4_4_4, pixels.data());
2499*8975f5c5SAndroid Build Coastguard Worker         u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::green);
2500*8975f5c5SAndroid Build Coastguard Worker         pixels.assign(kTexWidth * kTexHeight, u16Color);
2501*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kTexWidth / 2, kTexHeight / 2, 0, GL_RGBA,
2502*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_SHORT_5_5_5_1, pixels.data());
2503*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2504*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2505*8975f5c5SAndroid Build Coastguard Worker 
2506*8975f5c5SAndroid Build Coastguard Worker         if (loop == 0 || loop == 2)
2507*8975f5c5SAndroid Build Coastguard Worker         {
2508*8975f5c5SAndroid Build Coastguard Worker             // Draw quad
2509*8975f5c5SAndroid Build Coastguard Worker             glUniform1f(lodLocation, 0);
2510*8975f5c5SAndroid Build Coastguard Worker             drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2511*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255);
2512*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
2513*8975f5c5SAndroid Build Coastguard Worker         }
2514*8975f5c5SAndroid Build Coastguard Worker 
2515*8975f5c5SAndroid Build Coastguard Worker         if (loop > 2)
2516*8975f5c5SAndroid Build Coastguard Worker         {
2517*8975f5c5SAndroid Build Coastguard Worker             // Now trigger format conversion
2518*8975f5c5SAndroid Build Coastguard Worker             GLFramebuffer readFbo;
2519*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
2520*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
2521*8975f5c5SAndroid Build Coastguard Worker                                    texture, 0);
2522*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
2523*8975f5c5SAndroid Build Coastguard Worker         }
2524*8975f5c5SAndroid Build Coastguard Worker 
2525*8975f5c5SAndroid Build Coastguard Worker         // GenerateMipmap
2526*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
2527*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2528*8975f5c5SAndroid Build Coastguard Worker         glGenerateMipmap(GL_TEXTURE_2D);
2529*8975f5c5SAndroid Build Coastguard Worker 
2530*8975f5c5SAndroid Build Coastguard Worker         // Verify each lod
2531*8975f5c5SAndroid Build Coastguard Worker         for (int lod = 0; lod <= kMaxLevel; lod++)
2532*8975f5c5SAndroid Build Coastguard Worker         {
2533*8975f5c5SAndroid Build Coastguard Worker             glUniform1f(lodLocation, lod);
2534*8975f5c5SAndroid Build Coastguard Worker             drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2535*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255);
2536*8975f5c5SAndroid Build Coastguard Worker         }
2537*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2538*8975f5c5SAndroid Build Coastguard Worker     }
2539*8975f5c5SAndroid Build Coastguard Worker }
2540*8975f5c5SAndroid Build Coastguard Worker 
2541*8975f5c5SAndroid Build Coastguard Worker // Tests that when reformatting the image, incompatible updates don't cause a problem.
TEST_P(FramebufferTestWithFormatFallback,R4G4B4A4_InCompatibleFormat)2542*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_InCompatibleFormat)
2543*8975f5c5SAndroid Build Coastguard Worker {
2544*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
2545*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
2546*8975f5c5SAndroid Build Coastguard Worker     GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
2547*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLocation);
2548*8975f5c5SAndroid Build Coastguard Worker     GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
2549*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLocation);
2550*8975f5c5SAndroid Build Coastguard Worker 
2551*8975f5c5SAndroid Build Coastguard Worker     for (int loop = 0; loop < 4; loop++)
2552*8975f5c5SAndroid Build Coastguard Worker     {
2553*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
2554*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
2555*8975f5c5SAndroid Build Coastguard Worker         // Define a texture with lod0 and lod1 with two different effective internal formats or size
2556*8975f5c5SAndroid Build Coastguard Worker         GLushort u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::red);
2557*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
2558*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
2559*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_SHORT_4_4_4_4, pixels.data());
2560*8975f5c5SAndroid Build Coastguard Worker         if (loop < 2)
2561*8975f5c5SAndroid Build Coastguard Worker         {
2562*8975f5c5SAndroid Build Coastguard Worker             u16Color = convertGLColorToUShort(GL_RGB5_A1, GLColor::green);
2563*8975f5c5SAndroid Build Coastguard Worker             pixels.assign(kTexWidth * kTexHeight, u16Color);
2564*8975f5c5SAndroid Build Coastguard Worker             // bad effective internal format
2565*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kTexWidth / 2, kTexHeight / 2, 0, GL_RGBA,
2566*8975f5c5SAndroid Build Coastguard Worker                          GL_UNSIGNED_SHORT_5_5_5_1, pixels.data());
2567*8975f5c5SAndroid Build Coastguard Worker         }
2568*8975f5c5SAndroid Build Coastguard Worker         else
2569*8975f5c5SAndroid Build Coastguard Worker         {
2570*8975f5c5SAndroid Build Coastguard Worker             u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::green);
2571*8975f5c5SAndroid Build Coastguard Worker             pixels.assign(kTexWidth * kTexHeight, u16Color);
2572*8975f5c5SAndroid Build Coastguard Worker             // bad size
2573*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
2574*8975f5c5SAndroid Build Coastguard Worker                          GL_UNSIGNED_SHORT_4_4_4_4, pixels.data());
2575*8975f5c5SAndroid Build Coastguard Worker         }
2576*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
2577*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2578*8975f5c5SAndroid Build Coastguard Worker 
2579*8975f5c5SAndroid Build Coastguard Worker         // Now trigger format conversion and verify lod0
2580*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer readFbo;
2581*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
2582*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture,
2583*8975f5c5SAndroid Build Coastguard Worker                                0);
2584*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
2585*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(kTexWidth / 2, kTexHeight / 2, 255, 0, 0, 255);
2586*8975f5c5SAndroid Build Coastguard Worker 
2587*8975f5c5SAndroid Build Coastguard Worker         if (loop == 1 || loop == 3)
2588*8975f5c5SAndroid Build Coastguard Worker         {
2589*8975f5c5SAndroid Build Coastguard Worker             // Disable mipmap and sample from lod0 and verify
2590*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2591*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2592*8975f5c5SAndroid Build Coastguard Worker             glUniform1f(lodLocation, 0);
2593*8975f5c5SAndroid Build Coastguard Worker             drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2594*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255);
2595*8975f5c5SAndroid Build Coastguard Worker         }
2596*8975f5c5SAndroid Build Coastguard Worker     }
2597*8975f5c5SAndroid Build Coastguard Worker }
2598*8975f5c5SAndroid Build Coastguard Worker 
2599*8975f5c5SAndroid Build Coastguard Worker class FramebufferTest_ES31 : public ANGLETest<>
2600*8975f5c5SAndroid Build Coastguard Worker {
2601*8975f5c5SAndroid Build Coastguard Worker   protected:
validateSamplePass(GLQuery & query,GLint width,GLint height)2602*8975f5c5SAndroid Build Coastguard Worker     void validateSamplePass(GLQuery &query, GLint width, GLint height)
2603*8975f5c5SAndroid Build Coastguard Worker     {
2604*8975f5c5SAndroid Build Coastguard Worker         GLuint passedCount;
2605*8975f5c5SAndroid Build Coastguard Worker 
2606*8975f5c5SAndroid Build Coastguard Worker         glUniform2i(0, width - 1, height - 1);
2607*8975f5c5SAndroid Build Coastguard Worker         glBeginQuery(GL_ANY_SAMPLES_PASSED, query);
2608*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 6);
2609*8975f5c5SAndroid Build Coastguard Worker         glEndQuery(GL_ANY_SAMPLES_PASSED);
2610*8975f5c5SAndroid Build Coastguard Worker         glGetQueryObjectuiv(query, GL_QUERY_RESULT, &passedCount);
2611*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GT(static_cast<GLint>(passedCount), 0);
2612*8975f5c5SAndroid Build Coastguard Worker 
2613*8975f5c5SAndroid Build Coastguard Worker         glUniform2i(0, width - 1, height);
2614*8975f5c5SAndroid Build Coastguard Worker         glBeginQuery(GL_ANY_SAMPLES_PASSED, query);
2615*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 6);
2616*8975f5c5SAndroid Build Coastguard Worker         glEndQuery(GL_ANY_SAMPLES_PASSED);
2617*8975f5c5SAndroid Build Coastguard Worker         glGetQueryObjectuiv(query, GL_QUERY_RESULT, &passedCount);
2618*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(static_cast<GLint>(passedCount), 0);
2619*8975f5c5SAndroid Build Coastguard Worker 
2620*8975f5c5SAndroid Build Coastguard Worker         glUniform2i(0, width, height - 1);
2621*8975f5c5SAndroid Build Coastguard Worker         glBeginQuery(GL_ANY_SAMPLES_PASSED, query);
2622*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 6);
2623*8975f5c5SAndroid Build Coastguard Worker         glEndQuery(GL_ANY_SAMPLES_PASSED);
2624*8975f5c5SAndroid Build Coastguard Worker         glGetQueryObjectuiv(query, GL_QUERY_RESULT, &passedCount);
2625*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(static_cast<GLint>(passedCount), 0);
2626*8975f5c5SAndroid Build Coastguard Worker     }
2627*8975f5c5SAndroid Build Coastguard Worker 
verifyDepth(GLuint framebuffer,int width,int height,float depthValue)2628*8975f5c5SAndroid Build Coastguard Worker     void verifyDepth(GLuint framebuffer, int width, int height, float depthValue)
2629*8975f5c5SAndroid Build Coastguard Worker     {
2630*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
2631*8975f5c5SAndroid Build Coastguard Worker 
2632*8975f5c5SAndroid Build Coastguard Worker         GLint colorAttachment = GL_NONE;
2633*8975f5c5SAndroid Build Coastguard Worker         glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
2634*8975f5c5SAndroid Build Coastguard Worker                                               GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,
2635*8975f5c5SAndroid Build Coastguard Worker                                               &colorAttachment);
2636*8975f5c5SAndroid Build Coastguard Worker 
2637*8975f5c5SAndroid Build Coastguard Worker         // If no color attachment add a temp one for verification.
2638*8975f5c5SAndroid Build Coastguard Worker         GLTexture tempColor;
2639*8975f5c5SAndroid Build Coastguard Worker         if (colorAttachment == GL_NONE)
2640*8975f5c5SAndroid Build Coastguard Worker         {
2641*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, tempColor);
2642*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
2643*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tempColor,
2644*8975f5c5SAndroid Build Coastguard Worker                                    0);
2645*8975f5c5SAndroid Build Coastguard Worker         }
2646*8975f5c5SAndroid Build Coastguard Worker 
2647*8975f5c5SAndroid Build Coastguard Worker         // Use a small shader to verify depth.
2648*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(depthTestProgram, essl1_shaders::vs::Passthrough(),
2649*8975f5c5SAndroid Build Coastguard Worker                          essl1_shaders::fs::Blue());
2650*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(depthTestProgramFail, essl1_shaders::vs::Passthrough(),
2651*8975f5c5SAndroid Build Coastguard Worker                          essl1_shaders::fs::Red());
2652*8975f5c5SAndroid Build Coastguard Worker 
2653*8975f5c5SAndroid Build Coastguard Worker         GLboolean hasDepthTest   = GL_FALSE;
2654*8975f5c5SAndroid Build Coastguard Worker         GLboolean hasDepthWrite  = GL_TRUE;
2655*8975f5c5SAndroid Build Coastguard Worker         GLint prevDepthFunc      = GL_ALWAYS;
2656*8975f5c5SAndroid Build Coastguard Worker         GLboolean hasStencilTest = GL_FALSE;
2657*8975f5c5SAndroid Build Coastguard Worker 
2658*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(GL_DEPTH_TEST, &hasDepthTest);
2659*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(GL_DEPTH_WRITEMASK, &hasDepthWrite);
2660*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_DEPTH_FUNC, &prevDepthFunc);
2661*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(GL_STENCIL_TEST, &hasStencilTest);
2662*8975f5c5SAndroid Build Coastguard Worker 
2663*8975f5c5SAndroid Build Coastguard Worker         if (!hasDepthTest)
2664*8975f5c5SAndroid Build Coastguard Worker         {
2665*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_DEPTH_TEST);
2666*8975f5c5SAndroid Build Coastguard Worker         }
2667*8975f5c5SAndroid Build Coastguard Worker         if (hasDepthWrite)
2668*8975f5c5SAndroid Build Coastguard Worker         {
2669*8975f5c5SAndroid Build Coastguard Worker             glDepthMask(GL_FALSE);
2670*8975f5c5SAndroid Build Coastguard Worker         }
2671*8975f5c5SAndroid Build Coastguard Worker         if (hasStencilTest)
2672*8975f5c5SAndroid Build Coastguard Worker         {
2673*8975f5c5SAndroid Build Coastguard Worker             glDisable(GL_STENCIL_TEST);
2674*8975f5c5SAndroid Build Coastguard Worker         }
2675*8975f5c5SAndroid Build Coastguard Worker         glDepthFunc(GL_LESS);
2676*8975f5c5SAndroid Build Coastguard Worker         drawQuad(depthTestProgram, essl1_shaders::PositionAttrib(), depthValue - 0.01f);
2677*8975f5c5SAndroid Build Coastguard Worker         drawQuad(depthTestProgramFail, essl1_shaders::PositionAttrib(), depthValue + 0.01f);
2678*8975f5c5SAndroid Build Coastguard Worker         if (!hasDepthTest)
2679*8975f5c5SAndroid Build Coastguard Worker         {
2680*8975f5c5SAndroid Build Coastguard Worker             glDisable(GL_DEPTH_TEST);
2681*8975f5c5SAndroid Build Coastguard Worker         }
2682*8975f5c5SAndroid Build Coastguard Worker         if (hasDepthWrite)
2683*8975f5c5SAndroid Build Coastguard Worker         {
2684*8975f5c5SAndroid Build Coastguard Worker             glDepthMask(GL_TRUE);
2685*8975f5c5SAndroid Build Coastguard Worker         }
2686*8975f5c5SAndroid Build Coastguard Worker         glDepthFunc(prevDepthFunc);
2687*8975f5c5SAndroid Build Coastguard Worker         if (hasStencilTest)
2688*8975f5c5SAndroid Build Coastguard Worker         {
2689*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_STENCIL_TEST);
2690*8975f5c5SAndroid Build Coastguard Worker         }
2691*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2692*8975f5c5SAndroid Build Coastguard Worker 
2693*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, width, height, GLColor::blue);
2694*8975f5c5SAndroid Build Coastguard Worker 
2695*8975f5c5SAndroid Build Coastguard Worker         if (colorAttachment == GL_NONE)
2696*8975f5c5SAndroid Build Coastguard Worker         {
2697*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
2698*8975f5c5SAndroid Build Coastguard Worker         }
2699*8975f5c5SAndroid Build Coastguard Worker     }
2700*8975f5c5SAndroid Build Coastguard Worker 
verifyStencil(GLuint framebuffer,int width,int height,uint32_t stencilValue)2701*8975f5c5SAndroid Build Coastguard Worker     void verifyStencil(GLuint framebuffer, int width, int height, uint32_t stencilValue)
2702*8975f5c5SAndroid Build Coastguard Worker     {
2703*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
2704*8975f5c5SAndroid Build Coastguard Worker 
2705*8975f5c5SAndroid Build Coastguard Worker         GLint colorAttachment = GL_NONE;
2706*8975f5c5SAndroid Build Coastguard Worker         glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
2707*8975f5c5SAndroid Build Coastguard Worker                                               GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,
2708*8975f5c5SAndroid Build Coastguard Worker                                               &colorAttachment);
2709*8975f5c5SAndroid Build Coastguard Worker 
2710*8975f5c5SAndroid Build Coastguard Worker         // If no color attachment add a temp one for verification.
2711*8975f5c5SAndroid Build Coastguard Worker         GLTexture tempColor;
2712*8975f5c5SAndroid Build Coastguard Worker         if (colorAttachment == GL_NONE)
2713*8975f5c5SAndroid Build Coastguard Worker         {
2714*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, tempColor);
2715*8975f5c5SAndroid Build Coastguard Worker             glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
2716*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tempColor,
2717*8975f5c5SAndroid Build Coastguard Worker                                    0);
2718*8975f5c5SAndroid Build Coastguard Worker         }
2719*8975f5c5SAndroid Build Coastguard Worker 
2720*8975f5c5SAndroid Build Coastguard Worker         // Use another small shader to verify stencil.
2721*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(stencilTestProgram, essl1_shaders::vs::Passthrough(),
2722*8975f5c5SAndroid Build Coastguard Worker                          essl1_shaders::fs::Green());
2723*8975f5c5SAndroid Build Coastguard Worker         GLboolean hasStencilTest   = GL_FALSE;
2724*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilFunc      = GL_ALWAYS;
2725*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilValue     = 0xFF;
2726*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilRef       = 0xFF;
2727*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilFail      = GL_KEEP;
2728*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilDepthFail = GL_KEEP;
2729*8975f5c5SAndroid Build Coastguard Worker         GLint prevStencilDepthPass = GL_KEEP;
2730*8975f5c5SAndroid Build Coastguard Worker         GLboolean hasDepthTest     = GL_FALSE;
2731*8975f5c5SAndroid Build Coastguard Worker 
2732*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(GL_STENCIL_TEST, &hasStencilTest);
2733*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_FUNC, &prevStencilFunc);
2734*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_VALUE_MASK, &prevStencilValue);
2735*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_REF, &prevStencilRef);
2736*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_FAIL, &prevStencilFail);
2737*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &prevStencilDepthFail);
2738*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &prevStencilDepthPass);
2739*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(GL_DEPTH_TEST, &hasDepthTest);
2740*8975f5c5SAndroid Build Coastguard Worker 
2741*8975f5c5SAndroid Build Coastguard Worker         if (!hasStencilTest)
2742*8975f5c5SAndroid Build Coastguard Worker         {
2743*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_STENCIL_TEST);
2744*8975f5c5SAndroid Build Coastguard Worker         }
2745*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_EQUAL, stencilValue, 0xFF);
2746*8975f5c5SAndroid Build Coastguard Worker         glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
2747*8975f5c5SAndroid Build Coastguard Worker         if (hasDepthTest)
2748*8975f5c5SAndroid Build Coastguard Worker         {
2749*8975f5c5SAndroid Build Coastguard Worker             glDisable(GL_DEPTH_TEST);
2750*8975f5c5SAndroid Build Coastguard Worker         }
2751*8975f5c5SAndroid Build Coastguard Worker         drawQuad(stencilTestProgram, essl1_shaders::PositionAttrib(), 0.0f);
2752*8975f5c5SAndroid Build Coastguard Worker         if (!hasStencilTest)
2753*8975f5c5SAndroid Build Coastguard Worker         {
2754*8975f5c5SAndroid Build Coastguard Worker             glDisable(GL_STENCIL_TEST);
2755*8975f5c5SAndroid Build Coastguard Worker         }
2756*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(prevStencilFunc, prevStencilValue, prevStencilRef);
2757*8975f5c5SAndroid Build Coastguard Worker         glStencilOp(prevStencilFail, prevStencilDepthFail, prevStencilDepthPass);
2758*8975f5c5SAndroid Build Coastguard Worker         if (hasDepthTest)
2759*8975f5c5SAndroid Build Coastguard Worker         {
2760*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_DEPTH_TEST);
2761*8975f5c5SAndroid Build Coastguard Worker         }
2762*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
2763*8975f5c5SAndroid Build Coastguard Worker 
2764*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, width, height, GLColor::green);
2765*8975f5c5SAndroid Build Coastguard Worker 
2766*8975f5c5SAndroid Build Coastguard Worker         if (colorAttachment == GL_NONE)
2767*8975f5c5SAndroid Build Coastguard Worker         {
2768*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
2769*8975f5c5SAndroid Build Coastguard Worker         }
2770*8975f5c5SAndroid Build Coastguard Worker     }
2771*8975f5c5SAndroid Build Coastguard Worker 
2772*8975f5c5SAndroid Build Coastguard Worker     static constexpr char kFSWriteRedGreen[] = R"(#extension GL_EXT_draw_buffers : enable
2773*8975f5c5SAndroid Build Coastguard Worker precision highp float;
2774*8975f5c5SAndroid Build Coastguard Worker void main()
2775*8975f5c5SAndroid Build Coastguard Worker {
2776*8975f5c5SAndroid Build Coastguard Worker     gl_FragData[0] = vec4(1.0, 0.0, 0.0, 1.0);  // attachment 0: red
2777*8975f5c5SAndroid Build Coastguard Worker     gl_FragData[1] = vec4(0.0, 1.0, 0.0, 1.0);  // attachment 1: green
2778*8975f5c5SAndroid Build Coastguard Worker })";
2779*8975f5c5SAndroid Build Coastguard Worker };
2780*8975f5c5SAndroid Build Coastguard Worker 
2781*8975f5c5SAndroid Build Coastguard Worker // Test that without attachment, if either the value of FRAMEBUFFER_DEFAULT_WIDTH or
2782*8975f5c5SAndroid Build Coastguard Worker // FRAMEBUFFER_DEFAULT_HEIGHT parameters is zero, the framebuffer is incomplete.
TEST_P(FramebufferTest_ES31,IncompleteMissingAttachmentDefaultParam)2783*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, IncompleteMissingAttachmentDefaultParam)
2784*8975f5c5SAndroid Build Coastguard Worker {
2785*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFramebuffer;
2786*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
2787*8975f5c5SAndroid Build Coastguard Worker 
2788*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, 1);
2789*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, 1);
2790*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2791*8975f5c5SAndroid Build Coastguard Worker 
2792*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, 0);
2793*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, 0);
2794*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,
2795*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
2796*8975f5c5SAndroid Build Coastguard Worker 
2797*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, 1);
2798*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, 0);
2799*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,
2800*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
2801*8975f5c5SAndroid Build Coastguard Worker 
2802*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, 0);
2803*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, 1);
2804*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,
2805*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
2806*8975f5c5SAndroid Build Coastguard Worker 
2807*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2808*8975f5c5SAndroid Build Coastguard Worker }
2809*8975f5c5SAndroid Build Coastguard Worker 
2810*8975f5c5SAndroid Build Coastguard Worker // Test that the sample count of a mix of texture and renderbuffer should be same.
TEST_P(FramebufferTest_ES31,IncompleteMultisampleSampleCountMix)2811*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, IncompleteMultisampleSampleCountMix)
2812*8975f5c5SAndroid Build Coastguard Worker {
2813*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFramebuffer;
2814*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
2815*8975f5c5SAndroid Build Coastguard Worker 
2816*8975f5c5SAndroid Build Coastguard Worker     // Lookup the supported number of sample counts (rely on fact that ANGLE uses the same set of
2817*8975f5c5SAndroid Build Coastguard Worker     // sample counts for textures and renderbuffers)
2818*8975f5c5SAndroid Build Coastguard Worker     GLint numSampleCounts = 0;
2819*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLint> sampleCounts;
2820*8975f5c5SAndroid Build Coastguard Worker     GLsizei queryBufferSize = 1;
2821*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_RGBA8, GL_NUM_SAMPLE_COUNTS,
2822*8975f5c5SAndroid Build Coastguard Worker                           queryBufferSize, &numSampleCounts);
2823*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF((numSampleCounts < 2));
2824*8975f5c5SAndroid Build Coastguard Worker     sampleCounts.resize(numSampleCounts);
2825*8975f5c5SAndroid Build Coastguard Worker     queryBufferSize = numSampleCounts;
2826*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_RGBA8, GL_SAMPLES, queryBufferSize,
2827*8975f5c5SAndroid Build Coastguard Worker                           sampleCounts.data());
2828*8975f5c5SAndroid Build Coastguard Worker 
2829*8975f5c5SAndroid Build Coastguard Worker     GLTexture mTexture;
2830*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
2831*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, sampleCounts[0], GL_RGBA8, 1, 1, true);
2832*8975f5c5SAndroid Build Coastguard Worker 
2833*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer mRenderbuffer;
2834*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
2835*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, sampleCounts[1], GL_RGBA8, 1, 1);
2836*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
2837*8975f5c5SAndroid Build Coastguard Worker                            mTexture, 0);
2838*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, mRenderbuffer);
2839*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE,
2840*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
2841*8975f5c5SAndroid Build Coastguard Worker 
2842*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2843*8975f5c5SAndroid Build Coastguard Worker }
2844*8975f5c5SAndroid Build Coastguard Worker 
2845*8975f5c5SAndroid Build Coastguard Worker // Test that the sample count of texture attachments should be same.
TEST_P(FramebufferTest_ES31,IncompleteMultisampleSampleCountTex)2846*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, IncompleteMultisampleSampleCountTex)
2847*8975f5c5SAndroid Build Coastguard Worker {
2848*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFramebuffer;
2849*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
2850*8975f5c5SAndroid Build Coastguard Worker 
2851*8975f5c5SAndroid Build Coastguard Worker     // Lookup the supported number of sample counts
2852*8975f5c5SAndroid Build Coastguard Worker     GLint numSampleCounts = 0;
2853*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLint> sampleCounts;
2854*8975f5c5SAndroid Build Coastguard Worker     GLsizei queryBufferSize = 1;
2855*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_RGBA8, GL_NUM_SAMPLE_COUNTS,
2856*8975f5c5SAndroid Build Coastguard Worker                           queryBufferSize, &numSampleCounts);
2857*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF((numSampleCounts < 2));
2858*8975f5c5SAndroid Build Coastguard Worker     sampleCounts.resize(numSampleCounts);
2859*8975f5c5SAndroid Build Coastguard Worker     queryBufferSize = numSampleCounts;
2860*8975f5c5SAndroid Build Coastguard Worker     glGetInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_RGBA8, GL_SAMPLES, queryBufferSize,
2861*8975f5c5SAndroid Build Coastguard Worker                           sampleCounts.data());
2862*8975f5c5SAndroid Build Coastguard Worker 
2863*8975f5c5SAndroid Build Coastguard Worker     GLTexture mTextures[2];
2864*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTextures[0]);
2865*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, sampleCounts[0], GL_RGBA8, 1, 1, true);
2866*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTextures[1]);
2867*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, sampleCounts[1], GL_RGBA8, 1, 1, true);
2868*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
2869*8975f5c5SAndroid Build Coastguard Worker                            mTextures[0], 0);
2870*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D_MULTISAMPLE,
2871*8975f5c5SAndroid Build Coastguard Worker                            mTextures[1], 0);
2872*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE,
2873*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
2874*8975f5c5SAndroid Build Coastguard Worker 
2875*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2876*8975f5c5SAndroid Build Coastguard Worker }
2877*8975f5c5SAndroid Build Coastguard Worker 
2878*8975f5c5SAndroid Build Coastguard Worker // Test that if the attached images are a mix of renderbuffers and textures, the value of
2879*8975f5c5SAndroid Build Coastguard Worker // TEXTURE_FIXED_SAMPLE_LOCATIONS must be TRUE for all attached textures.
TEST_P(FramebufferTest_ES31,IncompleteMultisampleFixedSampleLocationsMix)2880*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, IncompleteMultisampleFixedSampleLocationsMix)
2881*8975f5c5SAndroid Build Coastguard Worker {
2882*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFramebuffer;
2883*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
2884*8975f5c5SAndroid Build Coastguard Worker 
2885*8975f5c5SAndroid Build Coastguard Worker     GLTexture mTexture;
2886*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTexture);
2887*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 1, 1, false);
2888*8975f5c5SAndroid Build Coastguard Worker 
2889*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer mRenderbuffer;
2890*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
2891*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 1, GL_RGBA8, 1, 1);
2892*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
2893*8975f5c5SAndroid Build Coastguard Worker                            mTexture, 0);
2894*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, mRenderbuffer);
2895*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE,
2896*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
2897*8975f5c5SAndroid Build Coastguard Worker 
2898*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2899*8975f5c5SAndroid Build Coastguard Worker }
2900*8975f5c5SAndroid Build Coastguard Worker 
2901*8975f5c5SAndroid Build Coastguard Worker // Test that the value of TEXTURE_FIXED_SAMPLE_LOCATIONS is the same for all attached textures.
TEST_P(FramebufferTest_ES31,IncompleteMultisampleFixedSampleLocationsTex)2902*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, IncompleteMultisampleFixedSampleLocationsTex)
2903*8975f5c5SAndroid Build Coastguard Worker {
2904*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFramebuffer;
2905*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
2906*8975f5c5SAndroid Build Coastguard Worker 
2907*8975f5c5SAndroid Build Coastguard Worker     GLTexture mTextures[2];
2908*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTextures[0]);
2909*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 1, 1, false);
2910*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
2911*8975f5c5SAndroid Build Coastguard Worker                            mTextures[0], 0);
2912*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTextures[1]);
2913*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGB8, 1, 1, true);
2914*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D_MULTISAMPLE,
2915*8975f5c5SAndroid Build Coastguard Worker                            mTextures[1], 0);
2916*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE,
2917*8975f5c5SAndroid Build Coastguard Worker                      glCheckFramebufferStatus(GL_FRAMEBUFFER));
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 // Tests that draw to Y-flipped FBO results in correct pixels.
TEST_P(FramebufferTest_ES31,BasicDrawToYFlippedFBO)2923*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, BasicDrawToYFlippedFBO)
2924*8975f5c5SAndroid Build Coastguard Worker {
2925*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
2926*8975f5c5SAndroid Build Coastguard Worker 
2927*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
2928*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
2929*8975f5c5SAndroid Build Coastguard Worker 
2930*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2931*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2932*8975f5c5SAndroid Build Coastguard Worker 
2933*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
2934*8975f5c5SAndroid Build Coastguard Worker 
2935*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
2936*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
2937*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
2938*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2939*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
2940*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2941*8975f5c5SAndroid Build Coastguard Worker 
2942*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
2943*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
2944*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
2945*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2946*8975f5c5SAndroid Build Coastguard Worker 
2947*8975f5c5SAndroid Build Coastguard Worker     // Remove the flag so that glReadPixels do not implicitly use that.
2948*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
2949*8975f5c5SAndroid Build Coastguard Worker 
2950*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
2951*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
2952*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255,
2953*8975f5c5SAndroid Build Coastguard Worker                       1.0);
2954*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
2955*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255,
2956*8975f5c5SAndroid Build Coastguard Worker                       1.0);
2957*8975f5c5SAndroid Build Coastguard Worker }
2958*8975f5c5SAndroid Build Coastguard Worker 
2959*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit
TEST_P(FramebufferTest_ES31,MultisampleResolveWithBlit)2960*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveWithBlit)
2961*8975f5c5SAndroid Build Coastguard Worker {
2962*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
2963*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
2964*8975f5c5SAndroid Build Coastguard Worker 
2965*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
2966*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
2967*8975f5c5SAndroid Build Coastguard Worker 
2968*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
2969*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
2970*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
2971*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2972*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
2973*8975f5c5SAndroid Build Coastguard Worker                            0);
2974*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2975*8975f5c5SAndroid Build Coastguard Worker 
2976*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
2977*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
2978*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
2979*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2980*8975f5c5SAndroid Build Coastguard Worker 
2981*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
2982*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
2983*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
2984*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
2985*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2986*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
2987*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
2988*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2989*8975f5c5SAndroid Build Coastguard Worker 
2990*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
2991*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
2992*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2993*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2994*8975f5c5SAndroid Build Coastguard Worker 
2995*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
2996*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
2997*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
2998*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
2999*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
3000*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
3001*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
3002*8975f5c5SAndroid Build Coastguard Worker }
3003*8975f5c5SAndroid Build Coastguard Worker 
3004*8975f5c5SAndroid Build Coastguard Worker // Test clearing a 2D multisample texture defined using glTexStorage2DMultisample().
TEST_P(FramebufferTest_ES31,ClearTextureEXT2DMS)3005*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ClearTextureEXT2DMS)
3006*8975f5c5SAndroid Build Coastguard Worker {
3007*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3008*8975f5c5SAndroid Build Coastguard Worker 
3009*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSamples = 4;
3010*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3011*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3012*8975f5c5SAndroid Build Coastguard Worker 
3013*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTexture;
3014*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
3015*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, kSamples, GL_RGBA8, 16, 16, false);
3016*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3017*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3018*8975f5c5SAndroid Build Coastguard Worker                            msaaTexture, 0);
3019*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3020*8975f5c5SAndroid Build Coastguard Worker 
3021*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(msaaTexture, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
3022*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3023*8975f5c5SAndroid Build Coastguard Worker 
3024*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample texture into.
3025*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
3026*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3027*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
3028*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3029*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3030*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
3031*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3032*8975f5c5SAndroid Build Coastguard Worker 
3033*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3034*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3035*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3036*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3037*8975f5c5SAndroid Build Coastguard Worker 
3038*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3039*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3040*8975f5c5SAndroid Build Coastguard Worker }
3041*8975f5c5SAndroid Build Coastguard Worker 
3042*8975f5c5SAndroid Build Coastguard Worker // Test clearing a 2D multisample RGB texture.
TEST_P(FramebufferTest_ES31,ClearTextureEXT2DMSRGB)3043*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ClearTextureEXT2DMSRGB)
3044*8975f5c5SAndroid Build Coastguard Worker {
3045*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3046*8975f5c5SAndroid Build Coastguard Worker 
3047*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSamples = 4;
3048*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3049*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3050*8975f5c5SAndroid Build Coastguard Worker 
3051*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTexture;
3052*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
3053*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, kSamples, GL_RGB8, 16, 16, false);
3054*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3055*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3056*8975f5c5SAndroid Build Coastguard Worker                            msaaTexture, 0);
3057*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3058*8975f5c5SAndroid Build Coastguard Worker 
3059*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(msaaTexture, 0, GL_RGB, GL_UNSIGNED_BYTE, &GLColor::blue);
3060*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3061*8975f5c5SAndroid Build Coastguard Worker 
3062*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample texture into.
3063*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
3064*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3065*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
3066*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
3067*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3068*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
3069*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3070*8975f5c5SAndroid Build Coastguard Worker 
3071*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3072*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3073*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3074*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3075*8975f5c5SAndroid Build Coastguard Worker 
3076*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3077*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
3078*8975f5c5SAndroid Build Coastguard Worker }
3079*8975f5c5SAndroid Build Coastguard Worker 
3080*8975f5c5SAndroid Build Coastguard Worker // Test clearing corners of a 2D multisample texture to different colors.
TEST_P(FramebufferTest_ES31,ClearTextureEXT2DMSBlocks)3081*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ClearTextureEXT2DMSBlocks)
3082*8975f5c5SAndroid Build Coastguard Worker {
3083*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3084*8975f5c5SAndroid Build Coastguard Worker 
3085*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSamples = 4;
3086*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3087*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3088*8975f5c5SAndroid Build Coastguard Worker 
3089*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTexture;
3090*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
3091*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, kSamples, GL_RGBA8, 16, 16, false);
3092*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3093*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3094*8975f5c5SAndroid Build Coastguard Worker                            msaaTexture, 0);
3095*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3096*8975f5c5SAndroid Build Coastguard Worker 
3097*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(msaaTexture, 0, 0, 0, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_BYTE,
3098*8975f5c5SAndroid Build Coastguard Worker                           &GLColor::red);
3099*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(msaaTexture, 0, 0, 8, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_BYTE,
3100*8975f5c5SAndroid Build Coastguard Worker                           &GLColor::green);
3101*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(msaaTexture, 0, 8, 0, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_BYTE,
3102*8975f5c5SAndroid Build Coastguard Worker                           &GLColor::blue);
3103*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(msaaTexture, 0, 8, 8, 0, 8, 8, 1, GL_RGBA, GL_UNSIGNED_BYTE,
3104*8975f5c5SAndroid Build Coastguard Worker                           &GLColor::yellow);
3105*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3106*8975f5c5SAndroid Build Coastguard Worker 
3107*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample texture into.
3108*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
3109*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3110*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
3111*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3112*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3113*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
3114*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3115*8975f5c5SAndroid Build Coastguard Worker 
3116*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3117*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3118*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3119*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3120*8975f5c5SAndroid Build Coastguard Worker 
3121*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3122*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 8, GLColor::red);
3123*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 8, 8, 8, GLColor::green);
3124*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 0, 8, 8, GLColor::blue);
3125*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 8, 8, 8, GLColor::yellow);
3126*8975f5c5SAndroid Build Coastguard Worker }
3127*8975f5c5SAndroid Build Coastguard Worker 
3128*8975f5c5SAndroid Build Coastguard Worker // Test clearing layers of a 2D texture array defined using glTexStorage3DMultisampleOES().
TEST_P(FramebufferTest_ES31,ClearTextureEXT2DArrayMS)3129*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ClearTextureEXT2DArrayMS)
3130*8975f5c5SAndroid Build Coastguard Worker {
3131*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3132*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array"));
3133*8975f5c5SAndroid Build Coastguard Worker 
3134*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSamples = 4;
3135*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kLayers  = 4;
3136*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3137*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3138*8975f5c5SAndroid Build Coastguard Worker 
3139*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTexture;
3140*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, msaaTexture);
3141*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3DMultisampleOES(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, kSamples, GL_RGBA8, 16, 16,
3142*8975f5c5SAndroid Build Coastguard Worker                                  kLayers, false);
3143*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3144*8975f5c5SAndroid Build Coastguard Worker 
3145*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kLayers> clearColors = {GLColor::red, GLColor::green, GLColor::blue,
3146*8975f5c5SAndroid Build Coastguard Worker                                                 GLColor::yellow};
3147*8975f5c5SAndroid Build Coastguard Worker 
3148*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kLayers; i++)
3149*8975f5c5SAndroid Build Coastguard Worker     {
3150*8975f5c5SAndroid Build Coastguard Worker         glClearTexSubImageEXT(msaaTexture, 0, 0, 0, i, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE,
3151*8975f5c5SAndroid Build Coastguard Worker                               &clearColors[i]);
3152*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
3153*8975f5c5SAndroid Build Coastguard Worker     }
3154*8975f5c5SAndroid Build Coastguard Worker 
3155*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve each multisample texture layer into.
3156*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3157*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
3158*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
3159*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3160*8975f5c5SAndroid Build Coastguard Worker 
3161*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < kLayers; i++)
3162*8975f5c5SAndroid Build Coastguard Worker     {
3163*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3164*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, msaaTexture, 0, i);
3165*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3166*8975f5c5SAndroid Build Coastguard Worker 
3167*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, resolveTexture);
3168*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3169*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture,
3170*8975f5c5SAndroid Build Coastguard Worker                                0);
3171*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3172*8975f5c5SAndroid Build Coastguard Worker 
3173*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3174*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3175*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3176*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
3177*8975f5c5SAndroid Build Coastguard Worker 
3178*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3179*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, clearColors[i]);
3180*8975f5c5SAndroid Build Coastguard Worker     }
3181*8975f5c5SAndroid Build Coastguard Worker }
3182*8975f5c5SAndroid Build Coastguard Worker 
3183*8975f5c5SAndroid Build Coastguard Worker // Test clearing a 2D depth/stencil multisample texture.
TEST_P(FramebufferTest_ES31,ClearTextureEXT2DMSDS)3184*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ClearTextureEXT2DMSDS)
3185*8975f5c5SAndroid Build Coastguard Worker {
3186*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3187*8975f5c5SAndroid Build Coastguard Worker 
3188*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSamples = 4;
3189*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3190*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3191*8975f5c5SAndroid Build Coastguard Worker 
3192*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTexture;
3193*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
3194*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, kSamples, GL_DEPTH24_STENCIL8, 16, 16,
3195*8975f5c5SAndroid Build Coastguard Worker                               false);
3196*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3197*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE,
3198*8975f5c5SAndroid Build Coastguard Worker                            msaaTexture, 0);
3199*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3200*8975f5c5SAndroid Build Coastguard Worker 
3201*8975f5c5SAndroid Build Coastguard Worker     GLuint dsValue = 0xFFFFFFAA;
3202*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(msaaTexture, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, &dsValue);
3203*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3204*8975f5c5SAndroid Build Coastguard Worker 
3205*8975f5c5SAndroid Build Coastguard Worker     // Create a color texture and a resolve FBO for the multisample D/S texture.
3206*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
3207*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
3208*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3209*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTexture, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
3210*8975f5c5SAndroid Build Coastguard Worker 
3211*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveDSTexture;
3212*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveDSTexture);
3213*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 16, 16, 0, GL_DEPTH_STENCIL,
3214*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_24_8, nullptr);
3215*8975f5c5SAndroid Build Coastguard Worker 
3216*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3217*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3218*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
3219*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
3220*8975f5c5SAndroid Build Coastguard Worker                            resolveDSTexture, 0);
3221*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3222*8975f5c5SAndroid Build Coastguard Worker 
3223*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3224*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3225*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
3226*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
3227*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3228*8975f5c5SAndroid Build Coastguard Worker 
3229*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3230*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3231*8975f5c5SAndroid Build Coastguard Worker 
3232*8975f5c5SAndroid Build Coastguard Worker     // Draw on this framebuffer once with enabled depth test and once with enabled stencil test.
3233*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
3234*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
3235*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
3236*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_LESS, 0xCC, 0xFF);
3237*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
3238*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
3239*8975f5c5SAndroid Build Coastguard Worker 
3240*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_STENCIL_TEST);
3241*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
3242*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
3243*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
3244*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
3245*8975f5c5SAndroid Build Coastguard Worker }
3246*8975f5c5SAndroid Build Coastguard Worker 
3247*8975f5c5SAndroid Build Coastguard Worker // Test clearing two sides of a 2D D/S multisample texture to different values.
TEST_P(FramebufferTest_ES31,ClearTextureEXT2DMSDSPartial)3248*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ClearTextureEXT2DMSDSPartial)
3249*8975f5c5SAndroid Build Coastguard Worker {
3250*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3251*8975f5c5SAndroid Build Coastguard Worker 
3252*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSamples = 4;
3253*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3254*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3255*8975f5c5SAndroid Build Coastguard Worker 
3256*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTexture;
3257*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
3258*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, kSamples, GL_DEPTH24_STENCIL8, 16, 16,
3259*8975f5c5SAndroid Build Coastguard Worker                               false);
3260*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3261*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE,
3262*8975f5c5SAndroid Build Coastguard Worker                            msaaTexture, 0);
3263*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3264*8975f5c5SAndroid Build Coastguard Worker 
3265*8975f5c5SAndroid Build Coastguard Worker     GLuint dsValue0 = 0x000000AA;
3266*8975f5c5SAndroid Build Coastguard Worker     GLuint dsValue1 = 0x000000EE;
3267*8975f5c5SAndroid Build Coastguard Worker     GLuint dsValue2 = 0xFFFFFFAA;
3268*8975f5c5SAndroid Build Coastguard Worker     GLuint dsValue3 = 0xFFFFFFEE;
3269*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(msaaTexture, 0, 0, 0, 0, 8, 8, 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
3270*8975f5c5SAndroid Build Coastguard Worker                           &dsValue0);
3271*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(msaaTexture, 0, 0, 8, 0, 8, 8, 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
3272*8975f5c5SAndroid Build Coastguard Worker                           &dsValue1);
3273*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(msaaTexture, 0, 8, 0, 0, 8, 8, 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
3274*8975f5c5SAndroid Build Coastguard Worker                           &dsValue2);
3275*8975f5c5SAndroid Build Coastguard Worker     glClearTexSubImageEXT(msaaTexture, 0, 8, 8, 0, 8, 8, 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
3276*8975f5c5SAndroid Build Coastguard Worker                           &dsValue3);
3277*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3278*8975f5c5SAndroid Build Coastguard Worker 
3279*8975f5c5SAndroid Build Coastguard Worker     // Create a color texture and a resolve FBO for the multisample D/S texture.
3280*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
3281*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
3282*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3283*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTexture, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
3284*8975f5c5SAndroid Build Coastguard Worker 
3285*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveDSTexture;
3286*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveDSTexture);
3287*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 16, 16, 0, GL_DEPTH_STENCIL,
3288*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT_24_8, nullptr);
3289*8975f5c5SAndroid Build Coastguard Worker 
3290*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3291*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3292*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
3293*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
3294*8975f5c5SAndroid Build Coastguard Worker                            resolveDSTexture, 0);
3295*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3296*8975f5c5SAndroid Build Coastguard Worker 
3297*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3298*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3299*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
3300*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
3301*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3302*8975f5c5SAndroid Build Coastguard Worker 
3303*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3304*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3305*8975f5c5SAndroid Build Coastguard Worker 
3306*8975f5c5SAndroid Build Coastguard Worker     // Draw on this framebuffer once with enabled depth test and once with enabled stencil test.
3307*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
3308*8975f5c5SAndroid Build Coastguard Worker 
3309*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_STENCIL_TEST);
3310*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
3311*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
3312*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
3313*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 16, GLColor::red);
3314*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 0, 8, 16, GLColor::blue);
3315*8975f5c5SAndroid Build Coastguard Worker 
3316*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
3317*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
3318*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_LESS, 0xCC, 0xFF);
3319*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
3320*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 8, 8, GLColor::red);
3321*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 0, 8, 16, GLColor::blue);
3322*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 8, 16, 8, GLColor::blue);
3323*8975f5c5SAndroid Build Coastguard Worker }
3324*8975f5c5SAndroid Build Coastguard Worker 
3325*8975f5c5SAndroid Build Coastguard Worker // Test clearing a 2D depth-only multisample texture.
TEST_P(FramebufferTest_ES31,ClearTextureEXT2DMSDepth)3326*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ClearTextureEXT2DMSDepth)
3327*8975f5c5SAndroid Build Coastguard Worker {
3328*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3329*8975f5c5SAndroid Build Coastguard Worker 
3330*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSamples = 4;
3331*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3332*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3333*8975f5c5SAndroid Build Coastguard Worker 
3334*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTexture;
3335*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
3336*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, kSamples, GL_DEPTH_COMPONENT32F, 16, 16,
3337*8975f5c5SAndroid Build Coastguard Worker                               false);
3338*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3339*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE,
3340*8975f5c5SAndroid Build Coastguard Worker                            msaaTexture, 0);
3341*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3342*8975f5c5SAndroid Build Coastguard Worker 
3343*8975f5c5SAndroid Build Coastguard Worker     GLfloat depthValue = 1.0f;
3344*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(msaaTexture, 0, GL_DEPTH_COMPONENT, GL_FLOAT, &depthValue);
3345*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3346*8975f5c5SAndroid Build Coastguard Worker 
3347*8975f5c5SAndroid Build Coastguard Worker     // Create a color texture and a resolve FBO for the multisample depth texture.
3348*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
3349*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
3350*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3351*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTexture, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
3352*8975f5c5SAndroid Build Coastguard Worker 
3353*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveDepthTexture;
3354*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveDepthTexture);
3355*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 16, 16, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
3356*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
3357*8975f5c5SAndroid Build Coastguard Worker 
3358*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3359*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3360*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
3361*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, resolveDepthTexture,
3362*8975f5c5SAndroid Build Coastguard Worker                            0);
3363*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3364*8975f5c5SAndroid Build Coastguard Worker 
3365*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3366*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3367*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
3368*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3369*8975f5c5SAndroid Build Coastguard Worker 
3370*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3371*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3372*8975f5c5SAndroid Build Coastguard Worker 
3373*8975f5c5SAndroid Build Coastguard Worker     // Draw on this framebuffer.
3374*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
3375*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
3376*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
3377*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
3378*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
3379*8975f5c5SAndroid Build Coastguard Worker }
3380*8975f5c5SAndroid Build Coastguard Worker 
3381*8975f5c5SAndroid Build Coastguard Worker // Test clearing a 2D stencil-only multisample texture.
TEST_P(FramebufferTest_ES31,ClearTextureEXT2DMSStencil)3382*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ClearTextureEXT2DMSStencil)
3383*8975f5c5SAndroid Build Coastguard Worker {
3384*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clear_texture"));
3385*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_stencil8"));
3386*8975f5c5SAndroid Build Coastguard Worker 
3387*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kSamples = 4;
3388*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3389*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3390*8975f5c5SAndroid Build Coastguard Worker 
3391*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTexture;
3392*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
3393*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, kSamples, GL_STENCIL_INDEX8, 16, 16,
3394*8975f5c5SAndroid Build Coastguard Worker                               false);
3395*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3396*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE,
3397*8975f5c5SAndroid Build Coastguard Worker                            msaaTexture, 0);
3398*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3399*8975f5c5SAndroid Build Coastguard Worker 
3400*8975f5c5SAndroid Build Coastguard Worker     GLint stencilValue = 0xEE;
3401*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(msaaTexture, 0, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, &stencilValue);
3402*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3403*8975f5c5SAndroid Build Coastguard Worker 
3404*8975f5c5SAndroid Build Coastguard Worker     // Create a color texture and a resolve FBO for the multisample stencil texture.
3405*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
3406*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
3407*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3408*8975f5c5SAndroid Build Coastguard Worker     glClearTexImageEXT(colorTexture, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
3409*8975f5c5SAndroid Build Coastguard Worker 
3410*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveStencilTexture;
3411*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveStencilTexture);
3412*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_STENCIL_INDEX8, 16, 16, 0, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE,
3413*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
3414*8975f5c5SAndroid Build Coastguard Worker 
3415*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3416*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3417*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
3418*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
3419*8975f5c5SAndroid Build Coastguard Worker                            resolveStencilTexture, 0);
3420*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3421*8975f5c5SAndroid Build Coastguard Worker 
3422*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3423*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3424*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
3425*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3426*8975f5c5SAndroid Build Coastguard Worker 
3427*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3428*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3429*8975f5c5SAndroid Build Coastguard Worker 
3430*8975f5c5SAndroid Build Coastguard Worker     // Draw on this framebuffer.
3431*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
3432*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_STENCIL_TEST);
3433*8975f5c5SAndroid Build Coastguard Worker     glStencilFunc(GL_LESS, 0xCC, 0xFF);
3434*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
3435*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::blue);
3436*8975f5c5SAndroid Build Coastguard Worker }
3437*8975f5c5SAndroid Build Coastguard Worker 
3438*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit to a different format
TEST_P(FramebufferTest_ES31,MultisampleResolveWithBlitDifferentFormats)3439*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveWithBlitDifferentFormats)
3440*8975f5c5SAndroid Build Coastguard Worker {
3441*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"));
3442*8975f5c5SAndroid Build Coastguard Worker 
3443*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
3444*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
3445*8975f5c5SAndroid Build Coastguard Worker 
3446*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3447*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3448*8975f5c5SAndroid Build Coastguard Worker 
3449*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
3450*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
3451*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3452*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3453*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
3454*8975f5c5SAndroid Build Coastguard Worker                            0);
3455*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3456*8975f5c5SAndroid Build Coastguard Worker 
3457*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
3458*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
3459*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3460*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3461*8975f5c5SAndroid Build Coastguard Worker 
3462*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
3463*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
3464*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3465*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
3466*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA8_EXT, kSize, kSize, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
3467*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
3468*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3469*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
3470*8975f5c5SAndroid Build Coastguard Worker 
3471*8975f5c5SAndroid Build Coastguard Worker     // Another attachment of the same format as the blit source
3472*8975f5c5SAndroid Build Coastguard Worker     // to ensure that it does not confuse the backend.
3473*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
3474*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture2);
3475*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3476*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, resolveTexture2, 0);
3477*8975f5c5SAndroid Build Coastguard Worker 
3478*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
3479*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(2, drawBuffers);
3480*8975f5c5SAndroid Build Coastguard Worker 
3481*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3482*8975f5c5SAndroid Build Coastguard Worker 
3483*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3484*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3485*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3486*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3487*8975f5c5SAndroid Build Coastguard Worker 
3488*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3489*8975f5c5SAndroid Build Coastguard Worker     for (const GLenum buffer : {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1})
3490*8975f5c5SAndroid Build Coastguard Worker     {
3491*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(buffer);
3492*8975f5c5SAndroid Build Coastguard Worker         constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
3493*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3494*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3495*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
3496*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient,
3497*8975f5c5SAndroid Build Coastguard Worker                           0, 255, 1.0);
3498*8975f5c5SAndroid Build Coastguard Worker     }
3499*8975f5c5SAndroid Build Coastguard Worker }
3500*8975f5c5SAndroid Build Coastguard Worker 
3501*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit after drawing to mulitiple FBOs.
TEST_P(FramebufferTest_ES31,MultisampleResolveWithBlitMultipleFBOs)3502*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveWithBlitMultipleFBOs)
3503*8975f5c5SAndroid Build Coastguard Worker {
3504*8975f5c5SAndroid Build Coastguard Worker     // FBO 1 -> multisample draw (red)
3505*8975f5c5SAndroid Build Coastguard Worker     // FBO 2 -> multisample draw (green)
3506*8975f5c5SAndroid Build Coastguard Worker     // Bind FBO 1 as read
3507*8975f5c5SAndroid Build Coastguard Worker     // Bind FBO 3 as draw
3508*8975f5c5SAndroid Build Coastguard Worker     // Resolve
3509*8975f5c5SAndroid Build Coastguard Worker 
3510*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
3511*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
3512*8975f5c5SAndroid Build Coastguard Worker 
3513*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBORed;
3514*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBORed);
3515*8975f5c5SAndroid Build Coastguard Worker 
3516*8975f5c5SAndroid Build Coastguard Worker     GLTexture textureRed;
3517*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureRed);
3518*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3519*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3520*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3521*8975f5c5SAndroid Build Coastguard Worker                            textureRed, 0);
3522*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3523*8975f5c5SAndroid Build Coastguard Worker 
3524*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(redProgram, essl31_shaders::vs::Simple(), essl31_shaders::fs::Red());
3525*8975f5c5SAndroid Build Coastguard Worker     drawQuad(redProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3526*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3527*8975f5c5SAndroid Build Coastguard Worker 
3528*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBOGreen;
3529*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBOGreen);
3530*8975f5c5SAndroid Build Coastguard Worker 
3531*8975f5c5SAndroid Build Coastguard Worker     GLTexture textureGreen;
3532*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureGreen);
3533*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3534*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3535*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3536*8975f5c5SAndroid Build Coastguard Worker                            textureGreen, 0);
3537*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3538*8975f5c5SAndroid Build Coastguard Worker 
3539*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl31_shaders::vs::Simple(), essl31_shaders::fs::Green());
3540*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3541*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3542*8975f5c5SAndroid Build Coastguard Worker 
3543*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
3544*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
3545*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3546*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
3547*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3548*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3549*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
3550*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3551*8975f5c5SAndroid Build Coastguard Worker 
3552*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBORed);
3553*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3554*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3555*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3556*8975f5c5SAndroid Build Coastguard Worker 
3557*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3558*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3559*8975f5c5SAndroid Build Coastguard Worker }
3560*8975f5c5SAndroid Build Coastguard Worker 
3561*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit after drawing to mulitiple FBOs.
TEST_P(FramebufferTest_ES31,MultisampleResolveWithBlitMultipleResolves)3562*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveWithBlitMultipleResolves)
3563*8975f5c5SAndroid Build Coastguard Worker {
3564*8975f5c5SAndroid Build Coastguard Worker     // Draw multisampled in FBO 1
3565*8975f5c5SAndroid Build Coastguard Worker     // Bind FBO 1 as read
3566*8975f5c5SAndroid Build Coastguard Worker     // Bind FBO 2 as draw
3567*8975f5c5SAndroid Build Coastguard Worker     // Resolve
3568*8975f5c5SAndroid Build Coastguard Worker     // Bind FBO 3 as draw
3569*8975f5c5SAndroid Build Coastguard Worker     // Resolve
3570*8975f5c5SAndroid Build Coastguard Worker 
3571*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
3572*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
3573*8975f5c5SAndroid Build Coastguard Worker 
3574*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBORed;
3575*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBORed);
3576*8975f5c5SAndroid Build Coastguard Worker 
3577*8975f5c5SAndroid Build Coastguard Worker     GLTexture textureRed;
3578*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureRed);
3579*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3580*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3581*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3582*8975f5c5SAndroid Build Coastguard Worker                            textureRed, 0);
3583*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3584*8975f5c5SAndroid Build Coastguard Worker 
3585*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(redProgram, essl31_shaders::vs::Simple(), essl31_shaders::fs::Red());
3586*8975f5c5SAndroid Build Coastguard Worker     drawQuad(redProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3587*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3588*8975f5c5SAndroid Build Coastguard Worker 
3589*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
3590*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
3591*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
3592*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
3593*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3594*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
3595*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture1, 0);
3596*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3597*8975f5c5SAndroid Build Coastguard Worker 
3598*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBORed);
3599*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
3600*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3601*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3602*8975f5c5SAndroid Build Coastguard Worker 
3603*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO1);
3604*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3605*8975f5c5SAndroid Build Coastguard Worker 
3606*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
3607*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
3608*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
3609*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture2);
3610*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3611*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
3612*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture2, 0);
3613*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3614*8975f5c5SAndroid Build Coastguard Worker 
3615*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBORed);
3616*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO2);
3617*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3618*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3619*8975f5c5SAndroid Build Coastguard Worker 
3620*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO2);
3621*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3622*8975f5c5SAndroid Build Coastguard Worker }
3623*8975f5c5SAndroid Build Coastguard Worker 
3624*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit into an FBO with different read and draw
3625*8975f5c5SAndroid Build Coastguard Worker // attachments.
TEST_P(FramebufferTest_ES31,MultisampleResolveWithBlitDifferentReadDrawBuffers)3626*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveWithBlitDifferentReadDrawBuffers)
3627*8975f5c5SAndroid Build Coastguard Worker {
3628*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
3629*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
3630*8975f5c5SAndroid Build Coastguard Worker 
3631*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3632*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3633*8975f5c5SAndroid Build Coastguard Worker 
3634*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
3635*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
3636*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3637*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3638*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
3639*8975f5c5SAndroid Build Coastguard Worker                            0);
3640*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3641*8975f5c5SAndroid Build Coastguard Worker 
3642*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
3643*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
3644*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3645*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3646*8975f5c5SAndroid Build Coastguard Worker 
3647*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
3648*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3649*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3650*8975f5c5SAndroid Build Coastguard Worker 
3651*8975f5c5SAndroid Build Coastguard Worker     // Bind both read and draw textures as separate attachments.
3652*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> blueColors(kSize * kSize, GLColor::blue);
3653*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveReadTexture;
3654*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveReadTexture);
3655*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
3656*8975f5c5SAndroid Build Coastguard Worker                  blueColors.data());
3657*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveReadTexture,
3658*8975f5c5SAndroid Build Coastguard Worker                            0);
3659*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT0);
3660*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3661*8975f5c5SAndroid Build Coastguard Worker 
3662*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveDrawTexture;
3663*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveDrawTexture);
3664*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3665*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, resolveDrawTexture,
3666*8975f5c5SAndroid Build Coastguard Worker                            0);
3667*8975f5c5SAndroid Build Coastguard Worker     // Only enable color attachment 1 to be drawn to, since the Vulkan back end (currently) only
3668*8975f5c5SAndroid Build Coastguard Worker     // supports using resolve attachments when there is a single draw attachment enabled. This
3669*8975f5c5SAndroid Build Coastguard Worker     // ensures that the read and draw images are treated separately, including their layouts.
3670*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffers[] = {GL_NONE, GL_COLOR_ATTACHMENT1};
3671*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(2, drawBuffers);
3672*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3673*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3674*8975f5c5SAndroid Build Coastguard Worker 
3675*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3676*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3677*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3678*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3679*8975f5c5SAndroid Build Coastguard Worker 
3680*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3681*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT1);
3682*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
3683*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3684*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3685*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
3686*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
3687*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
3688*8975f5c5SAndroid Build Coastguard Worker }
3689*8975f5c5SAndroid Build Coastguard Worker 
3690*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture into a mipmaped texture with blit
TEST_P(FramebufferTest_ES31,MultisampleResolveIntoMipMapWithBlit)3691*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveIntoMipMapWithBlit)
3692*8975f5c5SAndroid Build Coastguard Worker {
3693*8975f5c5SAndroid Build Coastguard Worker     // FBO 1 is attached to a 64x64 texture
3694*8975f5c5SAndroid Build Coastguard Worker     // FBO 2 attached to level 1 of a 128x128 texture
3695*8975f5c5SAndroid Build Coastguard Worker 
3696*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 64;
3697*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
3698*8975f5c5SAndroid Build Coastguard Worker 
3699*8975f5c5SAndroid Build Coastguard Worker     // Create the textures early and call glGenerateMipmap() so it doesn't break the render pass
3700*8975f5c5SAndroid Build Coastguard Worker     // between the drawQuad() and glBlitFramebuffer(), so we can test the resolve with subpass path
3701*8975f5c5SAndroid Build Coastguard Worker     // in the Vulkan back end.
3702*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
3703*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
3704*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3705*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3706*8975f5c5SAndroid Build Coastguard Worker 
3707*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
3708*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
3709*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3710*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
3711*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3712*8975f5c5SAndroid Build Coastguard Worker 
3713*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3714*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3715*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
3716*8975f5c5SAndroid Build Coastguard Worker                            0);
3717*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3718*8975f5c5SAndroid Build Coastguard Worker 
3719*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
3720*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
3721*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3722*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3723*8975f5c5SAndroid Build Coastguard Worker 
3724*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
3725*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3726*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3727*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 1);
3728*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3729*8975f5c5SAndroid Build Coastguard Worker 
3730*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3731*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3732*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3733*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3734*8975f5c5SAndroid Build Coastguard Worker 
3735*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3736*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
3737*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3738*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3739*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
3740*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
3741*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
3742*8975f5c5SAndroid Build Coastguard Worker }
3743*8975f5c5SAndroid Build Coastguard Worker 
3744*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit after drawing to multiple FBOs.
TEST_P(FramebufferTest_ES31,MultipleTextureMultisampleResolveWithBlitMultipleResolves)3745*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultipleTextureMultisampleResolveWithBlitMultipleResolves)
3746*8975f5c5SAndroid Build Coastguard Worker {
3747*8975f5c5SAndroid Build Coastguard Worker     // Attach two MSAA textures to FBO1
3748*8975f5c5SAndroid Build Coastguard Worker     // Set read buffer 0
3749*8975f5c5SAndroid Build Coastguard Worker     // Resolve into FBO2
3750*8975f5c5SAndroid Build Coastguard Worker     // Set read buffer 1
3751*8975f5c5SAndroid Build Coastguard Worker     // Resolve into FBO3
3752*8975f5c5SAndroid Build Coastguard Worker 
3753*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_draw_buffers"));
3754*8975f5c5SAndroid Build Coastguard Worker 
3755*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
3756*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
3757*8975f5c5SAndroid Build Coastguard Worker 
3758*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3759*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3760*8975f5c5SAndroid Build Coastguard Worker 
3761*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTextureRed;
3762*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTextureRed);
3763*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3764*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3765*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3766*8975f5c5SAndroid Build Coastguard Worker                            msaaTextureRed, 0);
3767*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3768*8975f5c5SAndroid Build Coastguard Worker 
3769*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTextureGreen;
3770*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTextureGreen);
3771*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3772*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3773*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D_MULTISAMPLE,
3774*8975f5c5SAndroid Build Coastguard Worker                            msaaTextureGreen, 0);
3775*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3776*8975f5c5SAndroid Build Coastguard Worker 
3777*8975f5c5SAndroid Build Coastguard Worker     // Setup program to render red into attachment 0 and green into attachment 1.
3778*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFSWriteRedGreen);
3779*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
3780*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum kDrawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
3781*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(2, kDrawBuffers);
3782*8975f5c5SAndroid Build Coastguard Worker 
3783*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
3784*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3785*8975f5c5SAndroid Build Coastguard Worker 
3786*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
3787*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
3788*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
3789*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
3790*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3791*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
3792*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture1, 0);
3793*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3794*8975f5c5SAndroid Build Coastguard Worker 
3795*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3796*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
3797*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT0);  // Red
3798*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3799*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3800*8975f5c5SAndroid Build Coastguard Worker 
3801*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO1);
3802*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3803*8975f5c5SAndroid Build Coastguard Worker 
3804*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
3805*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
3806*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
3807*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture2);
3808*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3809*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
3810*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture2, 0);
3811*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3812*8975f5c5SAndroid Build Coastguard Worker 
3813*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3814*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO2);
3815*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT1);  // Green
3816*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3817*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3818*8975f5c5SAndroid Build Coastguard Worker 
3819*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO2);
3820*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3821*8975f5c5SAndroid Build Coastguard Worker }
3822*8975f5c5SAndroid Build Coastguard Worker 
3823*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit after drawing to multiple FBOs, with color
3824*8975f5c5SAndroid Build Coastguard Worker // attachment 1 resolved first.
TEST_P(FramebufferTest_ES31,MultipleTextureMultisampleResolveWithBlitMultipleResolvesAttachment1First)3825*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31,
3826*8975f5c5SAndroid Build Coastguard Worker        MultipleTextureMultisampleResolveWithBlitMultipleResolvesAttachment1First)
3827*8975f5c5SAndroid Build Coastguard Worker {
3828*8975f5c5SAndroid Build Coastguard Worker     // Attach two MSAA textures to FBO1
3829*8975f5c5SAndroid Build Coastguard Worker     // Set read buffer 1
3830*8975f5c5SAndroid Build Coastguard Worker     // Resolve into FBO2
3831*8975f5c5SAndroid Build Coastguard Worker     // Set read buffer 0
3832*8975f5c5SAndroid Build Coastguard Worker     // Resolve into FBO3
3833*8975f5c5SAndroid Build Coastguard Worker 
3834*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_draw_buffers"));
3835*8975f5c5SAndroid Build Coastguard Worker 
3836*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
3837*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
3838*8975f5c5SAndroid Build Coastguard Worker 
3839*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3840*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3841*8975f5c5SAndroid Build Coastguard Worker 
3842*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTextureRed;
3843*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTextureRed);
3844*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3845*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3846*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3847*8975f5c5SAndroid Build Coastguard Worker                            msaaTextureRed, 0);
3848*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3849*8975f5c5SAndroid Build Coastguard Worker 
3850*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTextureGreen;
3851*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTextureGreen);
3852*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3853*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3854*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D_MULTISAMPLE,
3855*8975f5c5SAndroid Build Coastguard Worker                            msaaTextureGreen, 0);
3856*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3857*8975f5c5SAndroid Build Coastguard Worker 
3858*8975f5c5SAndroid Build Coastguard Worker     // Setup program to render red into attachment 0 and green into attachment 1.
3859*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFSWriteRedGreen);
3860*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
3861*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum kDrawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
3862*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(2, kDrawBuffers);
3863*8975f5c5SAndroid Build Coastguard Worker 
3864*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
3865*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3866*8975f5c5SAndroid Build Coastguard Worker 
3867*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
3868*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
3869*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
3870*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
3871*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3872*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
3873*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture1, 0);
3874*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3875*8975f5c5SAndroid Build Coastguard Worker 
3876*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3877*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
3878*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT1);  // Green
3879*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3880*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3881*8975f5c5SAndroid Build Coastguard Worker 
3882*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO1);
3883*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3884*8975f5c5SAndroid Build Coastguard Worker 
3885*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
3886*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
3887*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
3888*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture2);
3889*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3890*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
3891*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture2, 0);
3892*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3893*8975f5c5SAndroid Build Coastguard Worker 
3894*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3895*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO2);
3896*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT0);  // Red
3897*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3898*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3899*8975f5c5SAndroid Build Coastguard Worker 
3900*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO2);
3901*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3902*8975f5c5SAndroid Build Coastguard Worker }
3903*8975f5c5SAndroid Build Coastguard Worker 
3904*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit, then drawing multisampled again.  The latter
3905*8975f5c5SAndroid Build Coastguard Worker // should not get re-resolved automatically.
TEST_P(FramebufferTest_ES31,MultisampleResolveWithBlitThenDraw)3906*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveWithBlitThenDraw)
3907*8975f5c5SAndroid Build Coastguard Worker {
3908*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
3909*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
3910*8975f5c5SAndroid Build Coastguard Worker 
3911*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3912*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3913*8975f5c5SAndroid Build Coastguard Worker 
3914*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
3915*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
3916*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3917*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3918*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
3919*8975f5c5SAndroid Build Coastguard Worker                            0);
3920*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3921*8975f5c5SAndroid Build Coastguard Worker 
3922*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
3923*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
3924*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3925*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3926*8975f5c5SAndroid Build Coastguard Worker 
3927*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
3928*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
3929*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
3930*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
3931*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3932*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
3933*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
3934*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3935*8975f5c5SAndroid Build Coastguard Worker 
3936*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
3937*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
3938*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3939*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3940*8975f5c5SAndroid Build Coastguard Worker 
3941*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
3942*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
3943*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3944*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3945*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
3946*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
3947*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
3948*8975f5c5SAndroid Build Coastguard Worker 
3949*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
3950*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl3_shaders::vs::Passthrough(), essl3_shaders::fs::Blue());
3951*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3952*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3953*8975f5c5SAndroid Build Coastguard Worker 
3954*8975f5c5SAndroid Build Coastguard Worker     // The resolved FBO should be unaffected by the last draw call.
3955*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3956*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
3957*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
3958*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
3959*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
3960*8975f5c5SAndroid Build Coastguard Worker }
3961*8975f5c5SAndroid Build Coastguard Worker 
3962*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit, then drawing multisampled again.  The latter
3963*8975f5c5SAndroid Build Coastguard Worker // should not get re-resolved automatically.  Resoloves color attachment 1.
TEST_P(FramebufferTest_ES31,MultisampleResolveWithBlitThenDrawAttachment1)3964*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveWithBlitThenDrawAttachment1)
3965*8975f5c5SAndroid Build Coastguard Worker {
3966*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_draw_buffers"));
3967*8975f5c5SAndroid Build Coastguard Worker 
3968*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
3969*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
3970*8975f5c5SAndroid Build Coastguard Worker 
3971*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
3972*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
3973*8975f5c5SAndroid Build Coastguard Worker 
3974*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTextureRed;
3975*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTextureRed);
3976*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3977*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3978*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
3979*8975f5c5SAndroid Build Coastguard Worker                            msaaTextureRed, 0);
3980*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3981*8975f5c5SAndroid Build Coastguard Worker 
3982*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaTextureGreen;
3983*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTextureGreen);
3984*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
3985*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3986*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D_MULTISAMPLE,
3987*8975f5c5SAndroid Build Coastguard Worker                            msaaTextureGreen, 0);
3988*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3989*8975f5c5SAndroid Build Coastguard Worker 
3990*8975f5c5SAndroid Build Coastguard Worker     // Setup program to render red into attachment 0 and green into attachment 1.
3991*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFSWriteRedGreen);
3992*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
3993*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum kDrawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
3994*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(2, kDrawBuffers);
3995*8975f5c5SAndroid Build Coastguard Worker 
3996*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
3997*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3998*8975f5c5SAndroid Build Coastguard Worker 
3999*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
4000*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
4001*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
4002*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
4003*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4004*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
4005*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
4006*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4007*8975f5c5SAndroid Build Coastguard Worker 
4008*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
4009*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
4010*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT1);  // Green
4011*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
4012*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4013*8975f5c5SAndroid Build Coastguard Worker 
4014*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
4015*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
4016*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
4017*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
4018*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
4019*8975f5c5SAndroid Build Coastguard Worker 
4020*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
4021*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl3_shaders::vs::Passthrough(), essl3_shaders::fs::Blue());
4022*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
4023*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4024*8975f5c5SAndroid Build Coastguard Worker 
4025*8975f5c5SAndroid Build Coastguard Worker     // The resolved FBO should be unaffected by the last draw call.
4026*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
4027*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::green);
4028*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::green);
4029*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::green);
4030*8975f5c5SAndroid Build Coastguard Worker }
4031*8975f5c5SAndroid Build Coastguard Worker 
4032*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit, then drawing multisampled again and resolving to
4033*8975f5c5SAndroid Build Coastguard Worker // same framebuffer.
TEST_P(FramebufferTest_ES31,MultisampleResolveWithBlitThenDrawThenResolveAgain)4034*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveWithBlitThenDrawThenResolveAgain)
4035*8975f5c5SAndroid Build Coastguard Worker {
4036*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
4037*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
4038*8975f5c5SAndroid Build Coastguard Worker 
4039*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
4040*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
4041*8975f5c5SAndroid Build Coastguard Worker 
4042*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
4043*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
4044*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
4045*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4046*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
4047*8975f5c5SAndroid Build Coastguard Worker                            0);
4048*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4049*8975f5c5SAndroid Build Coastguard Worker 
4050*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
4051*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
4052*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
4053*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4054*8975f5c5SAndroid Build Coastguard Worker 
4055*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
4056*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
4057*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
4058*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
4059*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4060*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
4061*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0);
4062*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4063*8975f5c5SAndroid Build Coastguard Worker 
4064*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
4065*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
4066*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
4067*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4068*8975f5c5SAndroid Build Coastguard Worker 
4069*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
4070*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
4071*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
4072*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
4073*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
4074*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
4075*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
4076*8975f5c5SAndroid Build Coastguard Worker 
4077*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
4078*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl3_shaders::vs::Passthrough(), essl3_shaders::fs::Blue());
4079*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
4080*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4081*8975f5c5SAndroid Build Coastguard Worker 
4082*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
4083*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
4084*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
4085*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4086*8975f5c5SAndroid Build Coastguard Worker 
4087*8975f5c5SAndroid Build Coastguard Worker     // Verify that the resolve happened correctly
4088*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
4089*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
4090*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::blue);
4091*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::blue);
4092*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::blue);
4093*8975f5c5SAndroid Build Coastguard Worker }
4094*8975f5c5SAndroid Build Coastguard Worker 
4095*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit, then drawing multisampled again and resolving to
4096*8975f5c5SAndroid Build Coastguard Worker // another framebuffer.
TEST_P(FramebufferTest_ES31,MultisampleResolveWithBlitThenDrawThenResolveAgainToDifferentFBO)4097*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveWithBlitThenDrawThenResolveAgainToDifferentFBO)
4098*8975f5c5SAndroid Build Coastguard Worker {
4099*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
4100*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
4101*8975f5c5SAndroid Build Coastguard Worker 
4102*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
4103*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
4104*8975f5c5SAndroid Build Coastguard Worker 
4105*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
4106*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
4107*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false);
4108*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4109*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
4110*8975f5c5SAndroid Build Coastguard Worker                            0);
4111*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4112*8975f5c5SAndroid Build Coastguard Worker 
4113*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
4114*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
4115*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
4116*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4117*8975f5c5SAndroid Build Coastguard Worker 
4118*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
4119*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
4120*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
4121*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
4122*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4123*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
4124*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture1, 0);
4125*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4126*8975f5c5SAndroid Build Coastguard Worker 
4127*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
4128*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
4129*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
4130*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4131*8975f5c5SAndroid Build Coastguard Worker 
4132*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO1);
4133*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2;
4134*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
4135*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
4136*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
4137*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
4138*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
4139*8975f5c5SAndroid Build Coastguard Worker 
4140*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
4141*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl3_shaders::vs::Passthrough(), essl3_shaders::fs::Blue());
4142*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
4143*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4144*8975f5c5SAndroid Build Coastguard Worker 
4145*8975f5c5SAndroid Build Coastguard Worker     // Create another FBO to resolve the multisample buffer into.
4146*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
4147*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
4148*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture2);
4149*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4150*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
4151*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture2, 0);
4152*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4153*8975f5c5SAndroid Build Coastguard Worker 
4154*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
4155*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO2);
4156*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
4157*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4158*8975f5c5SAndroid Build Coastguard Worker 
4159*8975f5c5SAndroid Build Coastguard Worker     // Verify that the resolve happened to the correct FBO
4160*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO2);
4161*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
4162*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::blue);
4163*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::blue);
4164*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::blue);
4165*8975f5c5SAndroid Build Coastguard Worker 
4166*8975f5c5SAndroid Build Coastguard Worker     // The first resolve FBO should be untouched.
4167*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO1);
4168*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
4169*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0);
4170*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0);
4171*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0,
4172*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
4173*8975f5c5SAndroid Build Coastguard Worker }
4174*8975f5c5SAndroid Build Coastguard Worker 
4175*8975f5c5SAndroid Build Coastguard Worker // Test resolving a multisampled texture with blit to a non-zero level.
TEST_P(FramebufferTest_ES31,MultisampleResolveWithBlitNonZeroLevel)4176*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveWithBlitNonZeroLevel)
4177*8975f5c5SAndroid Build Coastguard Worker {
4178*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 16;
4179*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 20;
4180*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
4181*8975f5c5SAndroid Build Coastguard Worker 
4182*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
4183*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
4184*8975f5c5SAndroid Build Coastguard Worker 
4185*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
4186*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
4187*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
4188*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4189*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
4190*8975f5c5SAndroid Build Coastguard Worker                            0);
4191*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4192*8975f5c5SAndroid Build Coastguard Worker 
4193*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
4194*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
4195*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
4196*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4197*8975f5c5SAndroid Build Coastguard Worker 
4198*8975f5c5SAndroid Build Coastguard Worker     // Create a resolve FBO and texture. The multisample buffer will be resolved into level 1 of the
4199*8975f5c5SAndroid Build Coastguard Worker     // bound texture, which has the same dimensions as the multisampled texture.
4200*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
4201*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
4202*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, kWidth * 2, kHeight * 2);
4203*8975f5c5SAndroid Build Coastguard Worker 
4204*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
4205*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
4206*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 1);
4207*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4208*8975f5c5SAndroid Build Coastguard Worker 
4209*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
4210*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
4211*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
4212*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
4213*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4214*8975f5c5SAndroid Build Coastguard Worker 
4215*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
4216*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kWidthHalfPixelGradient  = 256 / kWidth / 2;
4217*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kHeightHalfPixelGradient = 256 / kHeight / 2;
4218*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kWidthHalfPixelGradient, kHeightHalfPixelGradient, 0, 255, 1.0);
4219*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kWidth - 1, 0, 255 - kWidthHalfPixelGradient, kHeightHalfPixelGradient, 0,
4220*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
4221*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, kHeight - 1, kWidthHalfPixelGradient, 255 - kHeightHalfPixelGradient, 0,
4222*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
4223*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kWidth - 1, kHeight - 1, 255 - kWidthHalfPixelGradient,
4224*8975f5c5SAndroid Build Coastguard Worker                       255 - kHeightHalfPixelGradient, 0, 255, 1.0);
4225*8975f5c5SAndroid Build Coastguard Worker }
4226*8975f5c5SAndroid Build Coastguard Worker 
4227*8975f5c5SAndroid Build Coastguard Worker // If there are no attachments, rendering will be limited to a rectangle having a lower left of
4228*8975f5c5SAndroid Build Coastguard Worker // (0, 0) and an upper right of(width, height), where width and height are the framebuffer
4229*8975f5c5SAndroid Build Coastguard Worker // object's default width and height.
TEST_P(FramebufferTest_ES31,RenderingLimitToDefaultFBOSizeWithNoAttachments)4230*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, RenderingLimitToDefaultFBOSizeWithNoAttachments)
4231*8975f5c5SAndroid Build Coastguard Worker {
4232*8975f5c5SAndroid Build Coastguard Worker     // anglebug.com/40644635
4233*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
4234*8975f5c5SAndroid Build Coastguard Worker 
4235*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS1[] = R"(#version 310 es
4236*8975f5c5SAndroid Build Coastguard Worker in layout(location = 0) highp vec2 a_position;
4237*8975f5c5SAndroid Build Coastguard Worker void main()
4238*8975f5c5SAndroid Build Coastguard Worker {
4239*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(a_position, 0.0, 1.0);
4240*8975f5c5SAndroid Build Coastguard Worker })";
4241*8975f5c5SAndroid Build Coastguard Worker 
4242*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS1[] = R"(#version 310 es
4243*8975f5c5SAndroid Build Coastguard Worker uniform layout(location = 0) highp ivec2 u_expectedSize;
4244*8975f5c5SAndroid Build Coastguard Worker out layout(location = 3) mediump vec4 f_color;
4245*8975f5c5SAndroid Build Coastguard Worker void main()
4246*8975f5c5SAndroid Build Coastguard Worker {
4247*8975f5c5SAndroid Build Coastguard Worker     if (ivec2(gl_FragCoord.xy) != u_expectedSize) discard;
4248*8975f5c5SAndroid Build Coastguard Worker     f_color = vec4(1.0, 0.5, 0.25, 1.0);
4249*8975f5c5SAndroid Build Coastguard Worker })";
4250*8975f5c5SAndroid Build Coastguard Worker 
4251*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS2[] = R"(#version 310 es
4252*8975f5c5SAndroid Build Coastguard Worker in layout(location = 0) highp vec2 a_position;
4253*8975f5c5SAndroid Build Coastguard Worker void main()
4254*8975f5c5SAndroid Build Coastguard Worker {
4255*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(a_position, 0.0, 1.0);
4256*8975f5c5SAndroid Build Coastguard Worker })";
4257*8975f5c5SAndroid Build Coastguard Worker 
4258*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS2[] = R"(#version 310 es
4259*8975f5c5SAndroid Build Coastguard Worker uniform layout(location = 0) highp ivec2 u_expectedSize;
4260*8975f5c5SAndroid Build Coastguard Worker out layout(location = 2) mediump vec4 f_color;
4261*8975f5c5SAndroid Build Coastguard Worker void main()
4262*8975f5c5SAndroid Build Coastguard Worker {
4263*8975f5c5SAndroid Build Coastguard Worker     if (ivec2(gl_FragCoord.xy) != u_expectedSize) discard;
4264*8975f5c5SAndroid Build Coastguard Worker     f_color = vec4(1.0, 0.5, 0.25, 1.0);
4265*8975f5c5SAndroid Build Coastguard Worker })";
4266*8975f5c5SAndroid Build Coastguard Worker 
4267*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program1, kVS1, kFS1);
4268*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program2, kVS2, kFS2);
4269*8975f5c5SAndroid Build Coastguard Worker 
4270*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program1);
4271*8975f5c5SAndroid Build Coastguard Worker 
4272*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFramebuffer;
4273*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
4274*8975f5c5SAndroid Build Coastguard Worker     GLuint defaultWidth  = 1;
4275*8975f5c5SAndroid Build Coastguard Worker     GLuint defaultHeight = 1;
4276*8975f5c5SAndroid Build Coastguard Worker 
4277*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, defaultWidth);
4278*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, defaultHeight);
4279*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
4280*8975f5c5SAndroid Build Coastguard Worker 
4281*8975f5c5SAndroid Build Coastguard Worker     const float data[] = {
4282*8975f5c5SAndroid Build Coastguard Worker         1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f,
4283*8975f5c5SAndroid Build Coastguard Worker     };
4284*8975f5c5SAndroid Build Coastguard Worker 
4285*8975f5c5SAndroid Build Coastguard Worker     GLQuery query;
4286*8975f5c5SAndroid Build Coastguard Worker 
4287*8975f5c5SAndroid Build Coastguard Worker     GLVertexArray vertexArray;
4288*8975f5c5SAndroid Build Coastguard Worker     glBindVertexArray(vertexArray);
4289*8975f5c5SAndroid Build Coastguard Worker 
4290*8975f5c5SAndroid Build Coastguard Worker     GLBuffer vertexBuffer;
4291*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
4292*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
4293*8975f5c5SAndroid Build Coastguard Worker 
4294*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(0);
4295*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, 0);
4296*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
4297*8975f5c5SAndroid Build Coastguard Worker 
4298*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, defaultWidth, defaultHeight);
4299*8975f5c5SAndroid Build Coastguard Worker 
4300*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program2);
4301*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, defaultWidth, defaultHeight);
4302*8975f5c5SAndroid Build Coastguard Worker 
4303*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program1);
4304*8975f5c5SAndroid Build Coastguard Worker     // If fbo has attachments, the rendering size should be the same as its attachment.
4305*8975f5c5SAndroid Build Coastguard Worker     GLTexture mTexture;
4306*8975f5c5SAndroid Build Coastguard Worker     GLuint width  = 2;
4307*8975f5c5SAndroid Build Coastguard Worker     GLuint height = 2;
4308*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture);
4309*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
4310*8975f5c5SAndroid Build Coastguard Worker 
4311*8975f5c5SAndroid Build Coastguard Worker     const GLenum bufs[] = {GL_NONE, GL_NONE, GL_NONE, GL_COLOR_ATTACHMENT3};
4312*8975f5c5SAndroid Build Coastguard Worker 
4313*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, mTexture, 0);
4314*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
4315*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(4, bufs);
4316*8975f5c5SAndroid Build Coastguard Worker 
4317*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, width, height);
4318*8975f5c5SAndroid Build Coastguard Worker 
4319*8975f5c5SAndroid Build Coastguard Worker     // If fbo's attachment has been removed, the rendering size should be the same as framebuffer
4320*8975f5c5SAndroid Build Coastguard Worker     // default size.
4321*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, 0, 0, 0);
4322*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
4323*8975f5c5SAndroid Build Coastguard Worker 
4324*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, defaultWidth, defaultHeight);
4325*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4326*8975f5c5SAndroid Build Coastguard Worker }
4327*8975f5c5SAndroid Build Coastguard Worker 
4328*8975f5c5SAndroid Build Coastguard Worker // Creating two attachmentless framebuffers should work without vvl error.
TEST_P(FramebufferTest_ES31,CreateNoAttachmentFBOWithDifferentSize)4329*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, CreateNoAttachmentFBOWithDifferentSize)
4330*8975f5c5SAndroid Build Coastguard Worker {
4331*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS1[] = R"(#version 310 es
4332*8975f5c5SAndroid Build Coastguard Worker in layout(location = 0) highp vec2 a_position;
4333*8975f5c5SAndroid Build Coastguard Worker void main()
4334*8975f5c5SAndroid Build Coastguard Worker {
4335*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(a_position, 0.0, 1.0);
4336*8975f5c5SAndroid Build Coastguard Worker })";
4337*8975f5c5SAndroid Build Coastguard Worker 
4338*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS1[] = R"(#version 310 es
4339*8975f5c5SAndroid Build Coastguard Worker uniform layout(location = 0) highp ivec2 u_expectedSize;
4340*8975f5c5SAndroid Build Coastguard Worker out layout(location = 3) mediump vec4 f_color;
4341*8975f5c5SAndroid Build Coastguard Worker void main()
4342*8975f5c5SAndroid Build Coastguard Worker {
4343*8975f5c5SAndroid Build Coastguard Worker     if (ivec2(gl_FragCoord.xy) != u_expectedSize) discard;
4344*8975f5c5SAndroid Build Coastguard Worker     f_color = vec4(1.0, 0.5, 0.25, 1.0);
4345*8975f5c5SAndroid Build Coastguard Worker })";
4346*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program1, kVS1, kFS1);
4347*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program1);
4348*8975f5c5SAndroid Build Coastguard Worker 
4349*8975f5c5SAndroid Build Coastguard Worker     GLBuffer vertexBuffer;
4350*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
4351*8975f5c5SAndroid Build Coastguard Worker     const float data[] = {
4352*8975f5c5SAndroid Build Coastguard Worker         1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f,
4353*8975f5c5SAndroid Build Coastguard Worker     };
4354*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
4355*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(0);
4356*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, 0);
4357*8975f5c5SAndroid Build Coastguard Worker 
4358*8975f5c5SAndroid Build Coastguard Worker     GLQuery query;
4359*8975f5c5SAndroid Build Coastguard Worker 
4360*8975f5c5SAndroid Build Coastguard Worker     // Test that:
4361*8975f5c5SAndroid Build Coastguard Worker     // 1. create 1st no-attachment framebuffer with size 1*1, draw, delete framebuffer
4362*8975f5c5SAndroid Build Coastguard Worker     // 2. create 2nd no-attachment framebuffer with size 2*2, draw, delete framebuffer
4363*8975f5c5SAndroid Build Coastguard Worker     // works properly
4364*8975f5c5SAndroid Build Coastguard Worker     for (int loop = 0; loop < 2; loop++)
4365*8975f5c5SAndroid Build Coastguard Worker     {
4366*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer framebuffer;
4367*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer);
4368*8975f5c5SAndroid Build Coastguard Worker         GLuint defaultWidth  = 1 << loop;
4369*8975f5c5SAndroid Build Coastguard Worker         GLuint defaultHeight = 1 << loop;
4370*8975f5c5SAndroid Build Coastguard Worker         glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, defaultWidth);
4371*8975f5c5SAndroid Build Coastguard Worker         glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, defaultHeight);
4372*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
4373*8975f5c5SAndroid Build Coastguard Worker 
4374*8975f5c5SAndroid Build Coastguard Worker         // Draw and check the FBO size
4375*8975f5c5SAndroid Build Coastguard Worker         validateSamplePass(query, defaultWidth, defaultHeight);
4376*8975f5c5SAndroid Build Coastguard Worker     }
4377*8975f5c5SAndroid Build Coastguard Worker 
4378*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4379*8975f5c5SAndroid Build Coastguard Worker 
4380*8975f5c5SAndroid Build Coastguard Worker     // Test that:
4381*8975f5c5SAndroid Build Coastguard Worker     // 1. create 1st no-attachment framebuffer with size 2*2, draw, delete framebuffer
4382*8975f5c5SAndroid Build Coastguard Worker     // 2. create 2nd no-attachment framebuffer with size 1*1, draw, delete framebuffer
4383*8975f5c5SAndroid Build Coastguard Worker     // works properly
4384*8975f5c5SAndroid Build Coastguard Worker     for (int loop = 1; loop >= 0; loop--)
4385*8975f5c5SAndroid Build Coastguard Worker     {
4386*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer framebuffer;
4387*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer);
4388*8975f5c5SAndroid Build Coastguard Worker         GLuint defaultWidth  = 1 << loop;
4389*8975f5c5SAndroid Build Coastguard Worker         GLuint defaultHeight = 1 << loop;
4390*8975f5c5SAndroid Build Coastguard Worker         glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, defaultWidth);
4391*8975f5c5SAndroid Build Coastguard Worker         glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, defaultHeight);
4392*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
4393*8975f5c5SAndroid Build Coastguard Worker 
4394*8975f5c5SAndroid Build Coastguard Worker         // Draw and check the FBO size
4395*8975f5c5SAndroid Build Coastguard Worker         validateSamplePass(query, defaultWidth, defaultHeight);
4396*8975f5c5SAndroid Build Coastguard Worker     }
4397*8975f5c5SAndroid Build Coastguard Worker 
4398*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4399*8975f5c5SAndroid Build Coastguard Worker }
4400*8975f5c5SAndroid Build Coastguard Worker 
4401*8975f5c5SAndroid Build Coastguard Worker // Altering the default width and height of attachmentless framebuffer should work fine
TEST_P(FramebufferTest_ES31,ChangeFBOSizeWithNoAttachments)4402*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ChangeFBOSizeWithNoAttachments)
4403*8975f5c5SAndroid Build Coastguard Worker {
4404*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS1[] = R"(#version 310 es
4405*8975f5c5SAndroid Build Coastguard Worker in layout(location = 0) highp vec2 a_position;
4406*8975f5c5SAndroid Build Coastguard Worker void main()
4407*8975f5c5SAndroid Build Coastguard Worker {
4408*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(a_position, 0.0, 1.0);
4409*8975f5c5SAndroid Build Coastguard Worker })";
4410*8975f5c5SAndroid Build Coastguard Worker 
4411*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS1[] = R"(#version 310 es
4412*8975f5c5SAndroid Build Coastguard Worker uniform layout(location = 0) highp ivec2 u_expectedSize;
4413*8975f5c5SAndroid Build Coastguard Worker out layout(location = 3) mediump vec4 f_color;
4414*8975f5c5SAndroid Build Coastguard Worker void main()
4415*8975f5c5SAndroid Build Coastguard Worker {
4416*8975f5c5SAndroid Build Coastguard Worker     if (ivec2(gl_FragCoord.xy) != u_expectedSize) discard;
4417*8975f5c5SAndroid Build Coastguard Worker     f_color = vec4(1.0, 0.5, 0.25, 1.0);
4418*8975f5c5SAndroid Build Coastguard Worker })";
4419*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program1, kVS1, kFS1);
4420*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program1);
4421*8975f5c5SAndroid Build Coastguard Worker 
4422*8975f5c5SAndroid Build Coastguard Worker     GLBuffer vertexBuffer;
4423*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
4424*8975f5c5SAndroid Build Coastguard Worker     const float data[] = {
4425*8975f5c5SAndroid Build Coastguard Worker         1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f,
4426*8975f5c5SAndroid Build Coastguard Worker     };
4427*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
4428*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(0);
4429*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, 0);
4430*8975f5c5SAndroid Build Coastguard Worker 
4431*8975f5c5SAndroid Build Coastguard Worker     GLQuery query;
4432*8975f5c5SAndroid Build Coastguard Worker 
4433*8975f5c5SAndroid Build Coastguard Worker     // Test that:
4434*8975f5c5SAndroid Build Coastguard Worker     // 1. create a no-attachment framebuffer with size 1*1, draw
4435*8975f5c5SAndroid Build Coastguard Worker     // 2. change the no-attachment framebuffer size to 2*2, draw
4436*8975f5c5SAndroid Build Coastguard Worker     // works properly
4437*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebufferWithVariousSizeGrow;
4438*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferWithVariousSizeGrow);
4439*8975f5c5SAndroid Build Coastguard Worker     for (int loop = 0; loop < 2; loop++)
4440*8975f5c5SAndroid Build Coastguard Worker     {
4441*8975f5c5SAndroid Build Coastguard Worker         GLuint defaultWidth  = 1 << loop;
4442*8975f5c5SAndroid Build Coastguard Worker         GLuint defaultHeight = 1 << loop;
4443*8975f5c5SAndroid Build Coastguard Worker         glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, defaultWidth);
4444*8975f5c5SAndroid Build Coastguard Worker         glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, defaultHeight);
4445*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
4446*8975f5c5SAndroid Build Coastguard Worker 
4447*8975f5c5SAndroid Build Coastguard Worker         // Draw and check the FBO size
4448*8975f5c5SAndroid Build Coastguard Worker         validateSamplePass(query, defaultWidth, defaultHeight);
4449*8975f5c5SAndroid Build Coastguard Worker     }
4450*8975f5c5SAndroid Build Coastguard Worker 
4451*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4452*8975f5c5SAndroid Build Coastguard Worker 
4453*8975f5c5SAndroid Build Coastguard Worker     // Test that:
4454*8975f5c5SAndroid Build Coastguard Worker     // 1. create a no-attachment framebuffer with size 2*2, draw
4455*8975f5c5SAndroid Build Coastguard Worker     // 2. change the no-attachment framebuffer size to 1*1, draw
4456*8975f5c5SAndroid Build Coastguard Worker     // works properly
4457*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebufferWithVariousSizeShrink;
4458*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferWithVariousSizeShrink);
4459*8975f5c5SAndroid Build Coastguard Worker     for (int loop = 1; loop >= 0; loop--)
4460*8975f5c5SAndroid Build Coastguard Worker     {
4461*8975f5c5SAndroid Build Coastguard Worker         GLuint defaultWidth  = 1 << loop;
4462*8975f5c5SAndroid Build Coastguard Worker         GLuint defaultHeight = 1 << loop;
4463*8975f5c5SAndroid Build Coastguard Worker         glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, defaultWidth);
4464*8975f5c5SAndroid Build Coastguard Worker         glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, defaultHeight);
4465*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
4466*8975f5c5SAndroid Build Coastguard Worker 
4467*8975f5c5SAndroid Build Coastguard Worker         // Draw and check the FBO size
4468*8975f5c5SAndroid Build Coastguard Worker         validateSamplePass(query, defaultWidth, defaultHeight);
4469*8975f5c5SAndroid Build Coastguard Worker     }
4470*8975f5c5SAndroid Build Coastguard Worker 
4471*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4472*8975f5c5SAndroid Build Coastguard Worker }
4473*8975f5c5SAndroid Build Coastguard Worker 
4474*8975f5c5SAndroid Build Coastguard Worker // Test that changing framebuffer attachment count and its' default width and height work properly
TEST_P(FramebufferTest_ES31,ChangeFBOSizeAndAttachmentsCount)4475*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ChangeFBOSizeAndAttachmentsCount)
4476*8975f5c5SAndroid Build Coastguard Worker {
4477*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS1[] = R"(#version 310 es
4478*8975f5c5SAndroid Build Coastguard Worker in layout(location = 0) highp vec2 a_position;
4479*8975f5c5SAndroid Build Coastguard Worker void main()
4480*8975f5c5SAndroid Build Coastguard Worker {
4481*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(a_position, 0.0, 1.0);
4482*8975f5c5SAndroid Build Coastguard Worker })";
4483*8975f5c5SAndroid Build Coastguard Worker 
4484*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS1[] = R"(#version 310 es
4485*8975f5c5SAndroid Build Coastguard Worker uniform layout(location = 0) highp ivec2 u_expectedSize;
4486*8975f5c5SAndroid Build Coastguard Worker out layout(location = 3) mediump vec4 f_color;
4487*8975f5c5SAndroid Build Coastguard Worker void main()
4488*8975f5c5SAndroid Build Coastguard Worker {
4489*8975f5c5SAndroid Build Coastguard Worker     if (ivec2(gl_FragCoord.xy) != u_expectedSize) discard;
4490*8975f5c5SAndroid Build Coastguard Worker     f_color = vec4(1.0, 0.5, 0.25, 1.0);
4491*8975f5c5SAndroid Build Coastguard Worker })";
4492*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program1, kVS1, kFS1);
4493*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program1);
4494*8975f5c5SAndroid Build Coastguard Worker 
4495*8975f5c5SAndroid Build Coastguard Worker     GLBuffer vertexBuffer;
4496*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
4497*8975f5c5SAndroid Build Coastguard Worker     const float data[] = {
4498*8975f5c5SAndroid Build Coastguard Worker         1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f,
4499*8975f5c5SAndroid Build Coastguard Worker     };
4500*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
4501*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(0);
4502*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, 0);
4503*8975f5c5SAndroid Build Coastguard Worker 
4504*8975f5c5SAndroid Build Coastguard Worker     GLQuery query;
4505*8975f5c5SAndroid Build Coastguard Worker 
4506*8975f5c5SAndroid Build Coastguard Worker     // 1. create a no-attachment framebuffer with default size 1*1, draw
4507*8975f5c5SAndroid Build Coastguard Worker     // 2. give the fbo with 1 color attachment with size 2*2, draw
4508*8975f5c5SAndroid Build Coastguard Worker     // 3. change the fbo default size to 3*3, draw
4509*8975f5c5SAndroid Build Coastguard Worker     // 4. remove the fbo attachment, draw
4510*8975f5c5SAndroid Build Coastguard Worker     // works properly
4511*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebufferWithVariousSizeAndAttachmentGrow;
4512*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferWithVariousSizeAndAttachmentGrow);
4513*8975f5c5SAndroid Build Coastguard Worker     GLuint defaultWidth  = 1;
4514*8975f5c5SAndroid Build Coastguard Worker     GLuint defaultHeight = 1;
4515*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, defaultWidth);
4516*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, defaultHeight);
4517*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
4518*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, defaultWidth, defaultHeight);
4519*8975f5c5SAndroid Build Coastguard Worker 
4520*8975f5c5SAndroid Build Coastguard Worker     GLTexture mTexture;
4521*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture);
4522*8975f5c5SAndroid Build Coastguard Worker     GLuint attachmentWidth  = 2;
4523*8975f5c5SAndroid Build Coastguard Worker     GLuint attachmentHeight = 2;
4524*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, attachmentWidth, attachmentHeight);
4525*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
4526*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
4527*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, attachmentWidth, attachmentWidth);
4528*8975f5c5SAndroid Build Coastguard Worker 
4529*8975f5c5SAndroid Build Coastguard Worker     defaultWidth  = 3;
4530*8975f5c5SAndroid Build Coastguard Worker     defaultHeight = 3;
4531*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, defaultWidth);
4532*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, defaultHeight);
4533*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
4534*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, attachmentWidth, attachmentHeight);
4535*8975f5c5SAndroid Build Coastguard Worker 
4536*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 0, 0, 0);
4537*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
4538*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, defaultWidth, defaultHeight);
4539*8975f5c5SAndroid Build Coastguard Worker 
4540*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4541*8975f5c5SAndroid Build Coastguard Worker 
4542*8975f5c5SAndroid Build Coastguard Worker     // 1. create a no-attachment framebuffer with default size 3*3, draw
4543*8975f5c5SAndroid Build Coastguard Worker     // 2. give the fbo with 1 color attachment with size 2*2, draw
4544*8975f5c5SAndroid Build Coastguard Worker     // 3. change the fbo default size to 1*1, draw
4545*8975f5c5SAndroid Build Coastguard Worker     // 4. remove the fbo attachment, draw
4546*8975f5c5SAndroid Build Coastguard Worker     // works properly
4547*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebufferWithVariousSizeAndAttachmentShrink;
4548*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferWithVariousSizeAndAttachmentShrink);
4549*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, defaultWidth);
4550*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, defaultHeight);
4551*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
4552*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, defaultWidth, defaultHeight);
4553*8975f5c5SAndroid Build Coastguard Worker 
4554*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
4555*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
4556*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, attachmentWidth, attachmentHeight);
4557*8975f5c5SAndroid Build Coastguard Worker 
4558*8975f5c5SAndroid Build Coastguard Worker     defaultWidth  = 1;
4559*8975f5c5SAndroid Build Coastguard Worker     defaultHeight = 1;
4560*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, defaultWidth);
4561*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, defaultHeight);
4562*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
4563*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, attachmentWidth, attachmentHeight);
4564*8975f5c5SAndroid Build Coastguard Worker 
4565*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 0, 0, 0);
4566*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
4567*8975f5c5SAndroid Build Coastguard Worker     validateSamplePass(query, defaultWidth, defaultHeight);
4568*8975f5c5SAndroid Build Coastguard Worker 
4569*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4570*8975f5c5SAndroid Build Coastguard Worker }
4571*8975f5c5SAndroid Build Coastguard Worker 
4572*8975f5c5SAndroid Build Coastguard Worker // Test binding two textures with different widths to an FBO and drawing to it.
TEST_P(FramebufferTest_ES31,BindTexturesOfDifferentWidthsToFBOAndDraw)4573*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, BindTexturesOfDifferentWidthsToFBOAndDraw)
4574*8975f5c5SAndroid Build Coastguard Worker {
4575*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 2;
4576*8975f5c5SAndroid Build Coastguard Worker 
4577*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
4578*8975f5c5SAndroid Build Coastguard Worker 
4579*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
4580*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
4581*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4582*8975f5c5SAndroid Build Coastguard Worker 
4583*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4584*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4585*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
4586*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4587*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4588*8975f5c5SAndroid Build Coastguard Worker 
4589*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4590*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4591*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::green);
4592*8975f5c5SAndroid Build Coastguard Worker 
4593*8975f5c5SAndroid Build Coastguard Worker     // The second texture is defined with double the width as the first.
4594*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture2;
4595*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture2);
4596*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize * 2, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4597*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
4598*8975f5c5SAndroid Build Coastguard Worker 
4599*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4600*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture2, 0);
4601*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4602*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4603*8975f5c5SAndroid Build Coastguard Worker 
4604*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4605*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4606*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize * 2, kSize, GLColor::green);
4607*8975f5c5SAndroid Build Coastguard Worker }
4608*8975f5c5SAndroid Build Coastguard Worker 
4609*8975f5c5SAndroid Build Coastguard Worker // Test binding two textures with different heights to an FBO and drawing to it.
TEST_P(FramebufferTest_ES31,BindTexturesOfDifferentHeightsToFBOAndDraw)4610*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, BindTexturesOfDifferentHeightsToFBOAndDraw)
4611*8975f5c5SAndroid Build Coastguard Worker {
4612*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 2;
4613*8975f5c5SAndroid Build Coastguard Worker 
4614*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
4615*8975f5c5SAndroid Build Coastguard Worker 
4616*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
4617*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
4618*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4619*8975f5c5SAndroid Build Coastguard Worker 
4620*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4621*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4622*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
4623*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4624*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4625*8975f5c5SAndroid Build Coastguard Worker 
4626*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4627*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4628*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::green);
4629*8975f5c5SAndroid Build Coastguard Worker 
4630*8975f5c5SAndroid Build Coastguard Worker     // The second texture is defined with double the height as the first.
4631*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture2;
4632*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture2);
4633*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4634*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
4635*8975f5c5SAndroid Build Coastguard Worker 
4636*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4637*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture2, 0);
4638*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4639*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4640*8975f5c5SAndroid Build Coastguard Worker 
4641*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4642*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4643*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize * 2, GLColor::green);
4644*8975f5c5SAndroid Build Coastguard Worker }
4645*8975f5c5SAndroid Build Coastguard Worker 
4646*8975f5c5SAndroid Build Coastguard Worker // Test binding two textures with different formats to an FBO and drawing to it.
TEST_P(FramebufferTest_ES31,BindTexturesOfDifferentFormatsToFBOAndDraw)4647*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, BindTexturesOfDifferentFormatsToFBOAndDraw)
4648*8975f5c5SAndroid Build Coastguard Worker {
4649*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 2;
4650*8975f5c5SAndroid Build Coastguard Worker 
4651*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
4652*8975f5c5SAndroid Build Coastguard Worker 
4653*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
4654*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
4655*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4656*8975f5c5SAndroid Build Coastguard Worker 
4657*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4658*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4659*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
4660*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4661*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4662*8975f5c5SAndroid Build Coastguard Worker 
4663*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4664*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4665*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::red);
4666*8975f5c5SAndroid Build Coastguard Worker 
4667*8975f5c5SAndroid Build Coastguard Worker     // The second texture is defined with R8 as its format.
4668*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture2;
4669*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture2);
4670*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, kSize, kSize, 0, GL_RED, GL_UNSIGNED_BYTE, nullptr);
4671*8975f5c5SAndroid Build Coastguard Worker 
4672*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4673*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture2, 0);
4674*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4675*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4676*8975f5c5SAndroid Build Coastguard Worker 
4677*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4678*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4679*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::red);
4680*8975f5c5SAndroid Build Coastguard Worker }
4681*8975f5c5SAndroid Build Coastguard Worker 
4682*8975f5c5SAndroid Build Coastguard Worker // Test binding two textures with different attachments to an FBO and drawing to it.
TEST_P(FramebufferTest_ES31,BindTexturesOfDifferentAttachmentsToFBOAndDraw)4683*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, BindTexturesOfDifferentAttachmentsToFBOAndDraw)
4684*8975f5c5SAndroid Build Coastguard Worker {
4685*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 2;
4686*8975f5c5SAndroid Build Coastguard Worker 
4687*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
4688*8975f5c5SAndroid Build Coastguard Worker 
4689*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
4690*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
4691*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4692*8975f5c5SAndroid Build Coastguard Worker 
4693*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4694*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4695*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
4696*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4697*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4698*8975f5c5SAndroid Build Coastguard Worker 
4699*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4700*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4701*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::green);
4702*8975f5c5SAndroid Build Coastguard Worker 
4703*8975f5c5SAndroid Build Coastguard Worker     // The second texture has an additional depth attachment.
4704*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture2;
4705*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture2);
4706*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4707*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4708*8975f5c5SAndroid Build Coastguard Worker 
4709*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4710*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture2, 0);
4711*8975f5c5SAndroid Build Coastguard Worker 
4712*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthBuffer;
4713*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
4714*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, kSize, kSize);
4715*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
4716*8975f5c5SAndroid Build Coastguard Worker 
4717*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4718*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4719*8975f5c5SAndroid Build Coastguard Worker 
4720*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4721*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4722*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::green);
4723*8975f5c5SAndroid Build Coastguard Worker }
4724*8975f5c5SAndroid Build Coastguard Worker 
4725*8975f5c5SAndroid Build Coastguard Worker // Test binding two textures with different create flags to an FBO and drawing to it.
TEST_P(FramebufferTest_ES31,BindTexturesOfDifferentCreateFlagsToFBOAndDraw)4726*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, BindTexturesOfDifferentCreateFlagsToFBOAndDraw)
4727*8975f5c5SAndroid Build Coastguard Worker {
4728*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 2;
4729*8975f5c5SAndroid Build Coastguard Worker 
4730*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
4731*8975f5c5SAndroid Build Coastguard Worker 
4732*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
4733*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
4734*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4735*8975f5c5SAndroid Build Coastguard Worker 
4736*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4737*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4738*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
4739*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4740*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4741*8975f5c5SAndroid Build Coastguard Worker 
4742*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4743*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4744*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::green);
4745*8975f5c5SAndroid Build Coastguard Worker 
4746*8975f5c5SAndroid Build Coastguard Worker     // The second texture is defined as a cubemap, changing its create flags.
4747*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture2;
4748*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, colorTexture2);
4749*8975f5c5SAndroid Build Coastguard Worker 
4750*8975f5c5SAndroid Build Coastguard Worker     for (size_t faceIndex = 0; faceIndex < 6; ++faceIndex)
4751*8975f5c5SAndroid Build Coastguard Worker     {
4752*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, 0, GL_RGBA8, kSize, kSize, 0,
4753*8975f5c5SAndroid Build Coastguard Worker                      GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
4754*8975f5c5SAndroid Build Coastguard Worker     }
4755*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4756*8975f5c5SAndroid Build Coastguard Worker 
4757*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4758*8975f5c5SAndroid Build Coastguard Worker     for (size_t faceIndex = 0; faceIndex < 6; ++faceIndex)
4759*8975f5c5SAndroid Build Coastguard Worker     {
4760*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
4761*8975f5c5SAndroid Build Coastguard Worker                                GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, colorTexture2, 0);
4762*8975f5c5SAndroid Build Coastguard Worker     }
4763*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4764*8975f5c5SAndroid Build Coastguard Worker 
4765*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4766*8975f5c5SAndroid Build Coastguard Worker 
4767*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4768*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4769*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::green);
4770*8975f5c5SAndroid Build Coastguard Worker }
4771*8975f5c5SAndroid Build Coastguard Worker 
4772*8975f5c5SAndroid Build Coastguard Worker // Test binding two textures with different usage flags to an FBO and drawing to it.
TEST_P(FramebufferTest_ES31,BindTexturesOfDifferentUsageFlagsToFBOAndDraw)4773*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, BindTexturesOfDifferentUsageFlagsToFBOAndDraw)
4774*8975f5c5SAndroid Build Coastguard Worker {
4775*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 2;
4776*8975f5c5SAndroid Build Coastguard Worker 
4777*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
4778*8975f5c5SAndroid Build Coastguard Worker 
4779*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
4780*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
4781*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
4782*8975f5c5SAndroid Build Coastguard Worker 
4783*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4784*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4785*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
4786*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4787*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4788*8975f5c5SAndroid Build Coastguard Worker 
4789*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4790*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4791*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::green);
4792*8975f5c5SAndroid Build Coastguard Worker 
4793*8975f5c5SAndroid Build Coastguard Worker     // The second texture is used in a compute shader before the original shader, adding the storage
4794*8975f5c5SAndroid Build Coastguard Worker     // bit to its usage bits.
4795*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture2;
4796*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture2);
4797*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
4798*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4799*8975f5c5SAndroid Build Coastguard Worker 
4800*8975f5c5SAndroid Build Coastguard Worker     constexpr char kCS[] = R"(#version 310 es
4801*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=1, local_size_y=1, local_size_z=1) in;
4802*8975f5c5SAndroid Build Coastguard Worker uniform vec4 data;
4803*8975f5c5SAndroid Build Coastguard Worker layout(rgba8, binding = 0) writeonly uniform highp image2D image;
4804*8975f5c5SAndroid Build Coastguard Worker 
4805*8975f5c5SAndroid Build Coastguard Worker void main()
4806*8975f5c5SAndroid Build Coastguard Worker {
4807*8975f5c5SAndroid Build Coastguard Worker     imageStore(image, ivec2(gl_LocalInvocationID.xy), data);
4808*8975f5c5SAndroid Build Coastguard Worker })";
4809*8975f5c5SAndroid Build Coastguard Worker 
4810*8975f5c5SAndroid Build Coastguard Worker     GLuint computeProgram = CompileComputeProgram(kCS);
4811*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(computeProgram, 0u);
4812*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(computeProgram);
4813*8975f5c5SAndroid Build Coastguard Worker 
4814*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, colorTexture2, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);
4815*8975f5c5SAndroid Build Coastguard Worker 
4816*8975f5c5SAndroid Build Coastguard Worker     GLint uniformLoc = glGetUniformLocation(computeProgram, "data");
4817*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(uniformLoc, -1);
4818*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(uniformLoc, 0.0f, 0.0f, 1.0f, 1.0f);
4819*8975f5c5SAndroid Build Coastguard Worker 
4820*8975f5c5SAndroid Build Coastguard Worker     glDispatchCompute(1, 1, 1);
4821*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4822*8975f5c5SAndroid Build Coastguard Worker 
4823*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
4824*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4825*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture2, 0);
4826*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4827*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4828*8975f5c5SAndroid Build Coastguard Worker 
4829*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
4830*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4831*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::green);
4832*8975f5c5SAndroid Build Coastguard Worker }
4833*8975f5c5SAndroid Build Coastguard Worker 
4834*8975f5c5SAndroid Build Coastguard Worker // Test that clear with color masks on framebuffer texture with internal format GL_RGB5_A1 works
4835*8975f5c5SAndroid Build Coastguard Worker // This is a simplified version of below two deqp tests:
4836*8975f5c5SAndroid Build Coastguard Worker // KHR-GLES31.core.draw_buffers_indexed.color_masks
4837*8975f5c5SAndroid Build Coastguard Worker // KHR-GLES32.core.draw_buffers_indexed.color_masks
TEST_P(FramebufferTest_ES31,ClearWithColorMasksRGB5A1)4838*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ClearWithColorMasksRGB5A1)
4839*8975f5c5SAndroid Build Coastguard Worker {
4840*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize  = 4;
4841*8975f5c5SAndroid Build Coastguard Worker     GLint maxDrawBuffers = 0;
4842*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
4843*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4844*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4845*8975f5c5SAndroid Build Coastguard Worker 
4846*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> bufs(maxDrawBuffers);
4847*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < maxDrawBuffers; ++i)
4848*8975f5c5SAndroid Build Coastguard Worker     {
4849*8975f5c5SAndroid Build Coastguard Worker         bufs[i] = GL_COLOR_ATTACHMENT0 + i;
4850*8975f5c5SAndroid Build Coastguard Worker     }
4851*8975f5c5SAndroid Build Coastguard Worker 
4852*8975f5c5SAndroid Build Coastguard Worker     // Specifies a list of color buffers to be drawn into
4853*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(maxDrawBuffers, &bufs[0]);
4854*8975f5c5SAndroid Build Coastguard Worker 
4855*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DITHER);
4856*8975f5c5SAndroid Build Coastguard Worker 
4857*8975f5c5SAndroid Build Coastguard Worker     // Attach textures with internal format GL_RGB5_A1 to each framebuffer color attachment
4858*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLTexture> textures(maxDrawBuffers);
4859*8975f5c5SAndroid Build Coastguard Worker     std::vector<unsigned char> pixelData(kSize * kSize * 4, 255);
4860*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < maxDrawBuffers; ++i)
4861*8975f5c5SAndroid Build Coastguard Worker     {
4862*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textures[i]);
4863*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4864*8975f5c5SAndroid Build Coastguard Worker                      pixelData.data());
4865*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i],
4866*8975f5c5SAndroid Build Coastguard Worker                                0);
4867*8975f5c5SAndroid Build Coastguard Worker     }
4868*8975f5c5SAndroid Build Coastguard Worker 
4869*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4870*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4871*8975f5c5SAndroid Build Coastguard Worker 
4872*8975f5c5SAndroid Build Coastguard Worker     // Clear all buffers with clear color (0.15f, 0.3f, 0.45f, 0.6f)
4873*8975f5c5SAndroid Build Coastguard Worker     angle::Vector4 clearColor(0.15f, 0.3f, 0.45f, 0.6f);
4874*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < maxDrawBuffers; ++i)
4875*8975f5c5SAndroid Build Coastguard Worker     {
4876*8975f5c5SAndroid Build Coastguard Worker         glClearBufferfv(GL_COLOR, i, clearColor.data());
4877*8975f5c5SAndroid Build Coastguard Worker     }
4878*8975f5c5SAndroid Build Coastguard Worker 
4879*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4880*8975f5c5SAndroid Build Coastguard Worker 
4881*8975f5c5SAndroid Build Coastguard Worker     // Set color masks
4882*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < maxDrawBuffers; ++i)
4883*8975f5c5SAndroid Build Coastguard Worker     {
4884*8975f5c5SAndroid Build Coastguard Worker         if (i % 4 == 0)
4885*8975f5c5SAndroid Build Coastguard Worker         {
4886*8975f5c5SAndroid Build Coastguard Worker             glColorMaski(i, GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE);
4887*8975f5c5SAndroid Build Coastguard Worker         }
4888*8975f5c5SAndroid Build Coastguard Worker 
4889*8975f5c5SAndroid Build Coastguard Worker         if (i % 4 == 1)
4890*8975f5c5SAndroid Build Coastguard Worker         {
4891*8975f5c5SAndroid Build Coastguard Worker             glColorMaski(i, GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE);
4892*8975f5c5SAndroid Build Coastguard Worker         }
4893*8975f5c5SAndroid Build Coastguard Worker 
4894*8975f5c5SAndroid Build Coastguard Worker         if (i % 4 == 2)
4895*8975f5c5SAndroid Build Coastguard Worker         {
4896*8975f5c5SAndroid Build Coastguard Worker             glColorMaski(i, GL_FALSE, GL_FALSE, GL_TRUE, GL_FALSE);
4897*8975f5c5SAndroid Build Coastguard Worker         }
4898*8975f5c5SAndroid Build Coastguard Worker 
4899*8975f5c5SAndroid Build Coastguard Worker         if (i % 4 == 3)
4900*8975f5c5SAndroid Build Coastguard Worker         {
4901*8975f5c5SAndroid Build Coastguard Worker             glColorMaski(i, GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
4902*8975f5c5SAndroid Build Coastguard Worker         }
4903*8975f5c5SAndroid Build Coastguard Worker     }
4904*8975f5c5SAndroid Build Coastguard Worker 
4905*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4906*8975f5c5SAndroid Build Coastguard Worker 
4907*8975f5c5SAndroid Build Coastguard Worker     // Clear buffers again with a new clear color (0.85f, 0.85f, 0.85f, 0.85f)
4908*8975f5c5SAndroid Build Coastguard Worker     // Only the channel with color mask set to GL_TRUE is cleared with the new color.
4909*8975f5c5SAndroid Build Coastguard Worker     clearColor = {0.85f, 0.85f, 0.85f, 0.85f};
4910*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < maxDrawBuffers; ++i)
4911*8975f5c5SAndroid Build Coastguard Worker     {
4912*8975f5c5SAndroid Build Coastguard Worker         glClearBufferfv(GL_COLOR, i, &clearColor[0]);
4913*8975f5c5SAndroid Build Coastguard Worker     }
4914*8975f5c5SAndroid Build Coastguard Worker 
4915*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4916*8975f5c5SAndroid Build Coastguard Worker 
4917*8975f5c5SAndroid Build Coastguard Worker     // Read and Verify
4918*8975f5c5SAndroid Build Coastguard Worker     // calculate the comparison epsilon based on the number of bits
4919*8975f5c5SAndroid Build Coastguard Worker     std::vector<int> bits        = {0, 0, 0, 0};
4920*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> epsilon = {0, 0, 0, 0};
4921*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < 4; ++i)
4922*8975f5c5SAndroid Build Coastguard Worker     {
4923*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_RED_BITS + i, bits.data() + i);
4924*8975f5c5SAndroid Build Coastguard Worker         epsilon[i] =
4925*8975f5c5SAndroid Build Coastguard Worker             std::min(255u, static_cast<unsigned int>(
4926*8975f5c5SAndroid Build Coastguard Worker                                ceil(1.0 + 255.0 * (1.0 / pow(2.0, static_cast<double>(bits[i]))))));
4927*8975f5c5SAndroid Build Coastguard Worker 
4928*8975f5c5SAndroid Build Coastguard Worker         ASSERT(epsilon[i] >= 0 && epsilon[i] <= 255u);
4929*8975f5c5SAndroid Build Coastguard Worker     }
4930*8975f5c5SAndroid Build Coastguard Worker 
4931*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> rendered(kSize * kSize, GLColor::green);
4932*8975f5c5SAndroid Build Coastguard Worker 
4933*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < maxDrawBuffers; ++i)
4934*8975f5c5SAndroid Build Coastguard Worker     {
4935*8975f5c5SAndroid Build Coastguard Worker         std::vector<uint8_t> expected = {
4936*8975f5c5SAndroid Build Coastguard Worker             static_cast<uint8_t>(0.15f * 255), static_cast<uint8_t>(0.30f * 255),
4937*8975f5c5SAndroid Build Coastguard Worker             static_cast<uint8_t>(0.45f * 255), static_cast<uint8_t>(0.60f * 255)};
4938*8975f5c5SAndroid Build Coastguard Worker         expected[i % 4] = static_cast<uint8_t>(0.85f * 255);
4939*8975f5c5SAndroid Build Coastguard Worker 
4940*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0 + i);
4941*8975f5c5SAndroid Build Coastguard Worker         glReadPixels(0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE, rendered.data());
4942*8975f5c5SAndroid Build Coastguard Worker 
4943*8975f5c5SAndroid Build Coastguard Worker         for (int y = 0; y < kSize; ++y)
4944*8975f5c5SAndroid Build Coastguard Worker         {
4945*8975f5c5SAndroid Build Coastguard Worker             for (int x = 0; x < kSize; ++x)
4946*8975f5c5SAndroid Build Coastguard Worker             {
4947*8975f5c5SAndroid Build Coastguard Worker                 GLColor readBackData = rendered[y * kSize + x];
4948*8975f5c5SAndroid Build Coastguard Worker 
4949*8975f5c5SAndroid Build Coastguard Worker                 bool exactMatch = readBackData.R == expected[0] && readBackData.G == expected[1] &&
4950*8975f5c5SAndroid Build Coastguard Worker                                   readBackData.B == expected[2] && readBackData.A == expected[3];
4951*8975f5c5SAndroid Build Coastguard Worker 
4952*8975f5c5SAndroid Build Coastguard Worker                 bool matchWithinEpsilon =
4953*8975f5c5SAndroid Build Coastguard Worker                     abs(static_cast<int>(readBackData.R) - static_cast<int>(expected[0])) <=
4954*8975f5c5SAndroid Build Coastguard Worker                         static_cast<int>(epsilon[0]) &&
4955*8975f5c5SAndroid Build Coastguard Worker                     abs(static_cast<int>(readBackData.G) - static_cast<int>(expected[1])) <=
4956*8975f5c5SAndroid Build Coastguard Worker                         static_cast<int>(epsilon[1]) &&
4957*8975f5c5SAndroid Build Coastguard Worker                     abs(static_cast<int>(readBackData.B) - static_cast<int>(expected[2])) <=
4958*8975f5c5SAndroid Build Coastguard Worker                         static_cast<int>(epsilon[2]) &&
4959*8975f5c5SAndroid Build Coastguard Worker                     abs(static_cast<int>(readBackData.A) - static_cast<int>(expected[3])) <=
4960*8975f5c5SAndroid Build Coastguard Worker                         static_cast<int>(epsilon[3]);
4961*8975f5c5SAndroid Build Coastguard Worker 
4962*8975f5c5SAndroid Build Coastguard Worker                 ASSERT(exactMatch || matchWithinEpsilon);
4963*8975f5c5SAndroid Build Coastguard Worker             }
4964*8975f5c5SAndroid Build Coastguard Worker         }
4965*8975f5c5SAndroid Build Coastguard Worker     }
4966*8975f5c5SAndroid Build Coastguard Worker 
4967*8975f5c5SAndroid Build Coastguard Worker     // Set the framebuffer color mask back to default values
4968*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < maxDrawBuffers; ++i)
4969*8975f5c5SAndroid Build Coastguard Worker     {
4970*8975f5c5SAndroid Build Coastguard Worker         glColorMaski(i, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
4971*8975f5c5SAndroid Build Coastguard Worker     }
4972*8975f5c5SAndroid Build Coastguard Worker 
4973*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4974*8975f5c5SAndroid Build Coastguard Worker }
4975*8975f5c5SAndroid Build Coastguard Worker 
clearColorMorePrecisionThanFBOFormatNoDithering(const GLint & fboInternalFormat)4976*8975f5c5SAndroid Build Coastguard Worker void clearColorMorePrecisionThanFBOFormatNoDithering(const GLint &fboInternalFormat)
4977*8975f5c5SAndroid Build Coastguard Worker {
4978*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 4;
4979*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4980*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4981*8975f5c5SAndroid Build Coastguard Worker 
4982*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DITHER);
4983*8975f5c5SAndroid Build Coastguard Worker 
4984*8975f5c5SAndroid Build Coastguard Worker     // Attach texture with internal format GL_RGB5_A1 to each framebuffer color attachment
4985*8975f5c5SAndroid Build Coastguard Worker     std::vector<unsigned char> pixelData(kSize * kSize * 4, 255);
4986*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
4987*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
4988*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, fboInternalFormat, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4989*8975f5c5SAndroid Build Coastguard Worker                  pixelData.data());
4990*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
4991*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4992*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4993*8975f5c5SAndroid Build Coastguard Worker 
4994*8975f5c5SAndroid Build Coastguard Worker     // Clear FBO color attachment with clear color (0.15f, 0.3f, 0.45f, 0.6f)
4995*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.15f, 0.3f, 0.45f, 0.6f);
4996*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4997*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4998*8975f5c5SAndroid Build Coastguard Worker 
4999*8975f5c5SAndroid Build Coastguard Worker     // Read and Verify
5000*8975f5c5SAndroid Build Coastguard Worker     // calculate the comparison epsilon based on the number of bits
5001*8975f5c5SAndroid Build Coastguard Worker     std::vector<int> bits        = {0, 0, 0, 0};
5002*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> epsilon = {0, 0, 0, 0};
5003*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < 4; ++i)
5004*8975f5c5SAndroid Build Coastguard Worker     {
5005*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_RED_BITS + i, bits.data() + i);
5006*8975f5c5SAndroid Build Coastguard Worker         epsilon[i] =
5007*8975f5c5SAndroid Build Coastguard Worker             std::min(255u, static_cast<unsigned int>(
5008*8975f5c5SAndroid Build Coastguard Worker                                ceil(1.0 + 255.0 * (1.0 / pow(2.0, static_cast<double>(bits[i]))))));
5009*8975f5c5SAndroid Build Coastguard Worker 
5010*8975f5c5SAndroid Build Coastguard Worker         ASSERT(epsilon[i] >= 0 && epsilon[i] <= 255u);
5011*8975f5c5SAndroid Build Coastguard Worker     }
5012*8975f5c5SAndroid Build Coastguard Worker 
5013*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> rendered(kSize * kSize, GLColor::green);
5014*8975f5c5SAndroid Build Coastguard Worker 
5015*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> expected = {
5016*8975f5c5SAndroid Build Coastguard Worker         static_cast<uint8_t>(0.15f * 255), static_cast<uint8_t>(0.30f * 255),
5017*8975f5c5SAndroid Build Coastguard Worker         static_cast<uint8_t>(0.45f * 255), static_cast<uint8_t>(0.60f * 255)};
5018*8975f5c5SAndroid Build Coastguard Worker 
5019*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE, rendered.data());
5020*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5021*8975f5c5SAndroid Build Coastguard Worker 
5022*8975f5c5SAndroid Build Coastguard Worker     // Every pixel should have the same rendered result color. No dithering should be applied.
5023*8975f5c5SAndroid Build Coastguard Worker     GLColor clearedResultAtFirstPixel = rendered[0];
5024*8975f5c5SAndroid Build Coastguard Worker 
5025*8975f5c5SAndroid Build Coastguard Worker     for (int y = 0; y < kSize; ++y)
5026*8975f5c5SAndroid Build Coastguard Worker     {
5027*8975f5c5SAndroid Build Coastguard Worker         for (int x = 0; x < kSize; ++x)
5028*8975f5c5SAndroid Build Coastguard Worker         {
5029*8975f5c5SAndroid Build Coastguard Worker             GLColor readBackData = rendered[y * kSize + x];
5030*8975f5c5SAndroid Build Coastguard Worker 
5031*8975f5c5SAndroid Build Coastguard Worker             // Firstly check the rendered result is rational
5032*8975f5c5SAndroid Build Coastguard Worker             bool exactMatch = readBackData.R == expected[0] && readBackData.G == expected[1] &&
5033*8975f5c5SAndroid Build Coastguard Worker                               readBackData.B == expected[2] && readBackData.A == expected[3];
5034*8975f5c5SAndroid Build Coastguard Worker 
5035*8975f5c5SAndroid Build Coastguard Worker             bool matchWithinEpsilon =
5036*8975f5c5SAndroid Build Coastguard Worker                 abs(static_cast<int>(readBackData.R) - static_cast<int>(expected[0])) <=
5037*8975f5c5SAndroid Build Coastguard Worker                     static_cast<int>(epsilon[0]) &&
5038*8975f5c5SAndroid Build Coastguard Worker                 abs(static_cast<int>(readBackData.G) - static_cast<int>(expected[1])) <=
5039*8975f5c5SAndroid Build Coastguard Worker                     static_cast<int>(epsilon[1]) &&
5040*8975f5c5SAndroid Build Coastguard Worker                 abs(static_cast<int>(readBackData.B) - static_cast<int>(expected[2])) <=
5041*8975f5c5SAndroid Build Coastguard Worker                     static_cast<int>(epsilon[2]) &&
5042*8975f5c5SAndroid Build Coastguard Worker                 abs(static_cast<int>(readBackData.A) - static_cast<int>(expected[3])) <=
5043*8975f5c5SAndroid Build Coastguard Worker                     static_cast<int>(epsilon[3]);
5044*8975f5c5SAndroid Build Coastguard Worker 
5045*8975f5c5SAndroid Build Coastguard Worker             ASSERT(exactMatch || matchWithinEpsilon);
5046*8975f5c5SAndroid Build Coastguard Worker 
5047*8975f5c5SAndroid Build Coastguard Worker             // Secondly check no dithering is applied
5048*8975f5c5SAndroid Build Coastguard Worker             bool sameClearResultAsFirstPixel = readBackData.R == clearedResultAtFirstPixel.R &&
5049*8975f5c5SAndroid Build Coastguard Worker                                                readBackData.G == clearedResultAtFirstPixel.G &&
5050*8975f5c5SAndroid Build Coastguard Worker                                                readBackData.B == clearedResultAtFirstPixel.B &&
5051*8975f5c5SAndroid Build Coastguard Worker                                                readBackData.A == clearedResultAtFirstPixel.A;
5052*8975f5c5SAndroid Build Coastguard Worker             ASSERT(sameClearResultAsFirstPixel);
5053*8975f5c5SAndroid Build Coastguard Worker         }
5054*8975f5c5SAndroid Build Coastguard Worker     }
5055*8975f5c5SAndroid Build Coastguard Worker }
5056*8975f5c5SAndroid Build Coastguard Worker 
5057*8975f5c5SAndroid Build Coastguard Worker // Verify that when clear color has more precision than FBO color attachment format can hold,
5058*8975f5c5SAndroid Build Coastguard Worker // dithering is not automatically applied.
5059*8975f5c5SAndroid Build Coastguard Worker // https://issuetracker.google.com/292282210
TEST_P(FramebufferTest_ES31,ClearColorMorePrecisionThanFBOFormatShouldNotApplyDithering)5060*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ClearColorMorePrecisionThanFBOFormatShouldNotApplyDithering)
5061*8975f5c5SAndroid Build Coastguard Worker {
5062*8975f5c5SAndroid Build Coastguard Worker     clearColorMorePrecisionThanFBOFormatNoDithering(GL_RGB5_A1);
5063*8975f5c5SAndroid Build Coastguard Worker }
5064*8975f5c5SAndroid Build Coastguard Worker 
5065*8975f5c5SAndroid Build Coastguard Worker // Validates both MESA and standard functions can be used on OpenGL ES >=3.1
TEST_P(FramebufferTest_ES31,ValidateFramebufferFlipYMesaExtension)5066*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ValidateFramebufferFlipYMesaExtension)
5067*8975f5c5SAndroid Build Coastguard Worker {
5068*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
5069*8975f5c5SAndroid Build Coastguard Worker 
5070*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFramebuffer;
5071*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
5072*8975f5c5SAndroid Build Coastguard Worker 
5073*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
5074*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5075*8975f5c5SAndroid Build Coastguard Worker 
5076*8975f5c5SAndroid Build Coastguard Worker     GLint flip_y = -1;
5077*8975f5c5SAndroid Build Coastguard Worker 
5078*8975f5c5SAndroid Build Coastguard Worker     glGetFramebufferParameterivMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y);
5079*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5080*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(flip_y, 1);
5081*8975f5c5SAndroid Build Coastguard Worker 
5082*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
5083*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5084*8975f5c5SAndroid Build Coastguard Worker 
5085*8975f5c5SAndroid Build Coastguard Worker     flip_y = -1;
5086*8975f5c5SAndroid Build Coastguard Worker     glGetFramebufferParameterivMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y);
5087*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5088*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(flip_y, 0);
5089*8975f5c5SAndroid Build Coastguard Worker 
5090*8975f5c5SAndroid Build Coastguard Worker     // Also using non-MESA functions should work.
5091*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
5092*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5093*8975f5c5SAndroid Build Coastguard Worker 
5094*8975f5c5SAndroid Build Coastguard Worker     flip_y = -1;
5095*8975f5c5SAndroid Build Coastguard Worker     glGetFramebufferParameteriv(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y);
5096*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5097*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(flip_y, 1);
5098*8975f5c5SAndroid Build Coastguard Worker 
5099*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
5100*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5101*8975f5c5SAndroid Build Coastguard Worker 
5102*8975f5c5SAndroid Build Coastguard Worker     flip_y = -1;
5103*8975f5c5SAndroid Build Coastguard Worker     glGetFramebufferParameteriv(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y);
5104*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5105*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(flip_y, 0);
5106*8975f5c5SAndroid Build Coastguard Worker }
5107*8975f5c5SAndroid Build Coastguard Worker 
5108*8975f5c5SAndroid Build Coastguard Worker class AddMockTextureNoRenderTargetTest : public ANGLETest<>
5109*8975f5c5SAndroid Build Coastguard Worker {
5110*8975f5c5SAndroid Build Coastguard Worker   public:
AddMockTextureNoRenderTargetTest()5111*8975f5c5SAndroid Build Coastguard Worker     AddMockTextureNoRenderTargetTest()
5112*8975f5c5SAndroid Build Coastguard Worker     {
5113*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(512);
5114*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(512);
5115*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
5116*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
5117*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
5118*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
5119*8975f5c5SAndroid Build Coastguard Worker     }
5120*8975f5c5SAndroid Build Coastguard Worker };
5121*8975f5c5SAndroid Build Coastguard Worker 
5122*8975f5c5SAndroid Build Coastguard Worker // Test to verify workaround succeeds when no program outputs exist http://anglebug.com/42260995
TEST_P(AddMockTextureNoRenderTargetTest,NoProgramOutputWorkaround)5123*8975f5c5SAndroid Build Coastguard Worker TEST_P(AddMockTextureNoRenderTargetTest, NoProgramOutputWorkaround)
5124*8975f5c5SAndroid Build Coastguard Worker {
5125*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = "void main() {}";
5126*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = "void main() {}";
5127*8975f5c5SAndroid Build Coastguard Worker 
5128*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawProgram, kVS, kFS);
5129*8975f5c5SAndroid Build Coastguard Worker 
5130*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawProgram);
5131*8975f5c5SAndroid Build Coastguard Worker 
5132*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
5133*8975f5c5SAndroid Build Coastguard Worker 
5134*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5135*8975f5c5SAndroid Build Coastguard Worker }
5136*8975f5c5SAndroid Build Coastguard Worker 
5137*8975f5c5SAndroid Build Coastguard Worker // Covers a bug in ANGLE's Vulkan back-end framebuffer cache which ignored depth/stencil after
5138*8975f5c5SAndroid Build Coastguard Worker // calls to DrawBuffers.
TEST_P(FramebufferTest_ES3,AttachmentStateChange)5139*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, AttachmentStateChange)
5140*8975f5c5SAndroid Build Coastguard Worker {
5141*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 2;
5142*8975f5c5SAndroid Build Coastguard Worker 
5143*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
5144*8975f5c5SAndroid Build Coastguard Worker 
5145*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
5146*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5147*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5148*8975f5c5SAndroid Build Coastguard Worker 
5149*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
5150*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5151*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
5152*8975f5c5SAndroid Build Coastguard Worker 
5153*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5154*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5155*8975f5c5SAndroid Build Coastguard Worker 
5156*8975f5c5SAndroid Build Coastguard Worker     // First draw without a depth buffer.
5157*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
5158*8975f5c5SAndroid Build Coastguard Worker 
5159*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthBuffer;
5160*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
5161*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, kSize, kSize);
5162*8975f5c5SAndroid Build Coastguard Worker 
5163*8975f5c5SAndroid Build Coastguard Worker     // Bind just a renderbuffer and draw.
5164*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
5165*8975f5c5SAndroid Build Coastguard Worker 
5166*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5167*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5168*8975f5c5SAndroid Build Coastguard Worker 
5169*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(0, nullptr);
5170*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
5171*8975f5c5SAndroid Build Coastguard Worker 
5172*8975f5c5SAndroid Build Coastguard Worker     // Re-enable color buffer and draw one final time. This previously triggered a crash.
5173*8975f5c5SAndroid Build Coastguard Worker     GLenum drawBuffs = {GL_COLOR_ATTACHMENT0};
5174*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(1, &drawBuffs);
5175*8975f5c5SAndroid Build Coastguard Worker 
5176*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
5177*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5178*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5179*8975f5c5SAndroid Build Coastguard Worker }
5180*8975f5c5SAndroid Build Coastguard Worker 
5181*8975f5c5SAndroid Build Coastguard Worker // Tests that we can support a color texture also attached to the color attachment but
5182*8975f5c5SAndroid Build Coastguard Worker // with different LOD. From GLES3.0 spec section 4.4.3.2, if min_filter is GL_NEAREST_MIPMAP_NEAREST
5183*8975f5c5SAndroid Build Coastguard Worker // and the lod is within the [base_level, max_level] range, and it is possible to sample from a LOD
5184*8975f5c5SAndroid Build Coastguard Worker // that is rendering to then it does form a feedback loop. But if it is using textureLOD to
5185*8975f5c5SAndroid Build Coastguard Worker // explicitly fetching texture on different LOD, there is no loop and should still work. Aztec_ruins
5186*8975f5c5SAndroid Build Coastguard Worker // (https://issuetracker.google.com/175584609) is doing exactly this.
TEST_P(FramebufferTest_ES3,SampleFromAttachedTextureWithDifferentLOD)5187*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, SampleFromAttachedTextureWithDifferentLOD)
5188*8975f5c5SAndroid Build Coastguard Worker {
5189*8975f5c5SAndroid Build Coastguard Worker     // TODO: https://anglebug.com/42264297
5190*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D());
5191*8975f5c5SAndroid Build Coastguard Worker 
5192*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel0Size = 4;
5193*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel1Size = kLevel0Size / 2;
5194*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel2Size = kLevel1Size / 2;
5195*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kLevel0Size * kLevel0Size> gData;
5196*8975f5c5SAndroid Build Coastguard Worker 
5197*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
5198*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5199*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5200*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5201*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, kLevel0Size, kLevel0Size);
5202*8975f5c5SAndroid Build Coastguard Worker     gData.fill(GLColor::red);
5203*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kLevel0Size, kLevel0Size, GL_RGBA, GL_UNSIGNED_BYTE,
5204*8975f5c5SAndroid Build Coastguard Worker                     gData.data());
5205*8975f5c5SAndroid Build Coastguard Worker     gData.fill(GLColor::green);
5206*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, kLevel1Size, kLevel1Size, GL_RGBA, GL_UNSIGNED_BYTE,
5207*8975f5c5SAndroid Build Coastguard Worker                     gData.data());
5208*8975f5c5SAndroid Build Coastguard Worker     gData.fill(GLColor::blue);
5209*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, kLevel2Size, kLevel2Size, GL_RGBA, GL_UNSIGNED_BYTE,
5210*8975f5c5SAndroid Build Coastguard Worker                     gData.data());
5211*8975f5c5SAndroid Build Coastguard Worker 
5212*8975f5c5SAndroid Build Coastguard Worker     // Attach level 1 to a FBO
5213*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
5214*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5215*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 1);
5216*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5217*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5218*8975f5c5SAndroid Build Coastguard Worker 
5219*8975f5c5SAndroid Build Coastguard Worker     // Render to FBO with color texture level 1 and textureLod from level 0.
5220*8975f5c5SAndroid Build Coastguard Worker     const GLenum discard[] = {GL_COLOR_ATTACHMENT0};
5221*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discard);
5222*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kLevel1Size, kLevel1Size);
5223*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kLevel1Size, kLevel1Size);
5224*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_CULL_FACE);
5225*8975f5c5SAndroid Build Coastguard Worker     glCullFace(GL_BACK);
5226*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
5227*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
5228*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
5229*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5230*8975f5c5SAndroid Build Coastguard Worker 
5231*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
5232*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
5233*8975f5c5SAndroid Build Coastguard Worker     GLint textureLoc = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
5234*8975f5c5SAndroid Build Coastguard Worker     GLint lodLoc     = glGetUniformLocation(program, essl3_shaders::LodUniform());
5235*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLoc);
5236*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLoc);
5237*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(textureLoc, 0);  // texture unit 0
5238*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(lodLoc, 0);      // with Lod=0
5239*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
5240*8975f5c5SAndroid Build Coastguard Worker 
5241*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_CULL_FACE);
5242*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
5243*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
5244*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
5245*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
5246*8975f5c5SAndroid Build Coastguard Worker 
5247*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5248*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5249*8975f5c5SAndroid Build Coastguard Worker }
5250*8975f5c5SAndroid Build Coastguard Worker 
5251*8975f5c5SAndroid Build Coastguard Worker // This extends the test SampleFromAttachedTextureWithDifferentLOD by creating two renderpasses
5252*8975f5c5SAndroid Build Coastguard Worker // without changing texture binding. This is to make sure that sample/render to the same texture
5253*8975f5c5SAndroid Build Coastguard Worker // still function properly when transition from one renderpass to another without texture binding
5254*8975f5c5SAndroid Build Coastguard Worker // change.
TEST_P(FramebufferTest_ES3,SampleFromAttachedTextureWithDifferentLODAndFBOSwitch)5255*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, SampleFromAttachedTextureWithDifferentLODAndFBOSwitch)
5256*8975f5c5SAndroid Build Coastguard Worker {
5257*8975f5c5SAndroid Build Coastguard Worker     // TODO: https://anglebug.com/42264297
5258*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D());
5259*8975f5c5SAndroid Build Coastguard Worker 
5260*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel0Size = 4;
5261*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel1Size = kLevel0Size / 2;
5262*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel2Size = kLevel1Size / 2;
5263*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kLevel0Size * kLevel0Size> gData;
5264*8975f5c5SAndroid Build Coastguard Worker 
5265*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
5266*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5267*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5268*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5269*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, kLevel0Size, kLevel0Size);
5270*8975f5c5SAndroid Build Coastguard Worker     gData.fill(GLColor::red);
5271*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kLevel0Size, kLevel0Size, GL_RGBA, GL_UNSIGNED_BYTE,
5272*8975f5c5SAndroid Build Coastguard Worker                     gData.data());
5273*8975f5c5SAndroid Build Coastguard Worker     gData.fill(GLColor::green);
5274*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, kLevel1Size, kLevel1Size, GL_RGBA, GL_UNSIGNED_BYTE,
5275*8975f5c5SAndroid Build Coastguard Worker                     gData.data());
5276*8975f5c5SAndroid Build Coastguard Worker     gData.fill(GLColor::blue);
5277*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, kLevel2Size, kLevel2Size, GL_RGBA, GL_UNSIGNED_BYTE,
5278*8975f5c5SAndroid Build Coastguard Worker                     gData.data());
5279*8975f5c5SAndroid Build Coastguard Worker 
5280*8975f5c5SAndroid Build Coastguard Worker     // Attach level 1 to two FBOs
5281*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer1;
5282*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer1);
5283*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 1);
5284*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5285*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5286*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer2;
5287*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer2);
5288*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 1);
5289*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5290*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5291*8975f5c5SAndroid Build Coastguard Worker 
5292*8975f5c5SAndroid Build Coastguard Worker     // Render to left half of FBO1 and textureLod from level 0.
5293*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer1);
5294*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kLevel1Size / 2, kLevel1Size);
5295*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kLevel1Size / 2, kLevel1Size);
5296*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
5297*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5298*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
5299*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
5300*8975f5c5SAndroid Build Coastguard Worker     GLint textureLoc = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
5301*8975f5c5SAndroid Build Coastguard Worker     GLint lodLoc     = glGetUniformLocation(program, essl3_shaders::LodUniform());
5302*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLoc);
5303*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLoc);
5304*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(textureLoc, 0);  // texture unit 0
5305*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(lodLoc, 0);      // with Lod=0
5306*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
5307*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5308*8975f5c5SAndroid Build Coastguard Worker 
5309*8975f5c5SAndroid Build Coastguard Worker     // Render to right half of FBO2 and textureLod from level 0 without trigger texture binding
5310*8975f5c5SAndroid Build Coastguard Worker     // change.
5311*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer2);
5312*8975f5c5SAndroid Build Coastguard Worker     glViewport(kLevel1Size / 2, 0, kLevel1Size / 2, kLevel1Size);
5313*8975f5c5SAndroid Build Coastguard Worker     glScissor(kLevel1Size / 2, 0, kLevel1Size / 2, kLevel1Size);
5314*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
5315*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5316*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5317*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(kLevel1Size - 1, 0, GLColor::red);
5318*8975f5c5SAndroid Build Coastguard Worker }
5319*8975f5c5SAndroid Build Coastguard Worker 
5320*8975f5c5SAndroid Build Coastguard Worker // Test render to a texture level that is excluded from [base_level, max_level]. This specific test
5321*8975f5c5SAndroid Build Coastguard Worker // renders to an immutable texture at the level that is bigger than GL_TEXTURE_MAX_LEVEL. The
5322*8975f5c5SAndroid Build Coastguard Worker // texture itself has not been initialized with any data before rendering (TexSubImage call may
5323*8975f5c5SAndroid Build Coastguard Worker // initialize a VkImage object).
TEST_P(FramebufferTest_ES3,RenderAndInvalidateImmutableTextureWithBeyondMaxLevel)5324*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RenderAndInvalidateImmutableTextureWithBeyondMaxLevel)
5325*8975f5c5SAndroid Build Coastguard Worker {
5326*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel0Size = 4;
5327*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel1Size = kLevel0Size / 2;
5328*8975f5c5SAndroid Build Coastguard Worker 
5329*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
5330*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5331*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5332*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5333*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, kLevel0Size, kLevel0Size);
5334*8975f5c5SAndroid Build Coastguard Worker     // set max_level to 0
5335*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
5336*8975f5c5SAndroid Build Coastguard Worker 
5337*8975f5c5SAndroid Build Coastguard Worker     // Attach level 1 to a FBO
5338*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
5339*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5340*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 1);
5341*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5342*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5343*8975f5c5SAndroid Build Coastguard Worker 
5344*8975f5c5SAndroid Build Coastguard Worker     // Render to FBO
5345*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5346*8975f5c5SAndroid Build Coastguard Worker     const GLenum discard[] = {GL_COLOR_ATTACHMENT0};
5347*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discard);
5348*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kLevel1Size, kLevel1Size);
5349*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kLevel1Size, kLevel1Size);
5350*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_CULL_FACE);
5351*8975f5c5SAndroid Build Coastguard Worker     glCullFace(GL_BACK);
5352*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
5353*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
5354*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
5355*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
5356*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
5357*8975f5c5SAndroid Build Coastguard Worker 
5358*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_CULL_FACE);
5359*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
5360*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
5361*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
5362*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
5363*8975f5c5SAndroid Build Coastguard Worker 
5364*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5365*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5366*8975f5c5SAndroid Build Coastguard Worker }
5367*8975f5c5SAndroid Build Coastguard Worker 
5368*8975f5c5SAndroid Build Coastguard Worker // Test render to a texture level that is excluded from [base_level, max_level]. This specific test
5369*8975f5c5SAndroid Build Coastguard Worker // renders to an immutable texture at the level that is bigger than GL_TEXTURE_MAX_LEVEL. The
5370*8975f5c5SAndroid Build Coastguard Worker // texture itself has been initialized with data before rendering.
TEST_P(FramebufferTest_ES3,RenderAndInvalidateImmutableTextureWithSubImageWithBeyondMaxLevel)5371*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RenderAndInvalidateImmutableTextureWithSubImageWithBeyondMaxLevel)
5372*8975f5c5SAndroid Build Coastguard Worker {
5373*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel0Size = 4;
5374*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel1Size = kLevel0Size / 2;
5375*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kLevel0Size * kLevel0Size> gData;
5376*8975f5c5SAndroid Build Coastguard Worker 
5377*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
5378*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5379*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5380*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5381*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, kLevel0Size, kLevel0Size);
5382*8975f5c5SAndroid Build Coastguard Worker     // set max_level to 0
5383*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
5384*8975f5c5SAndroid Build Coastguard Worker     // Initialize with TexSubImage call
5385*8975f5c5SAndroid Build Coastguard Worker     gData.fill(GLColor::blue);
5386*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kLevel0Size, kLevel0Size, GL_RGBA, GL_UNSIGNED_BYTE,
5387*8975f5c5SAndroid Build Coastguard Worker                     gData.data());
5388*8975f5c5SAndroid Build Coastguard Worker 
5389*8975f5c5SAndroid Build Coastguard Worker     // Attach level 1 to a FBO
5390*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
5391*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5392*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 1);
5393*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5394*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5395*8975f5c5SAndroid Build Coastguard Worker 
5396*8975f5c5SAndroid Build Coastguard Worker     // Render to FBO
5397*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5398*8975f5c5SAndroid Build Coastguard Worker     const GLenum discard[] = {GL_COLOR_ATTACHMENT0};
5399*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discard);
5400*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kLevel1Size, kLevel1Size);
5401*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kLevel1Size, kLevel1Size);
5402*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_CULL_FACE);
5403*8975f5c5SAndroid Build Coastguard Worker     glCullFace(GL_BACK);
5404*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
5405*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
5406*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
5407*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
5408*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
5409*8975f5c5SAndroid Build Coastguard Worker 
5410*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_CULL_FACE);
5411*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
5412*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
5413*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
5414*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
5415*8975f5c5SAndroid Build Coastguard Worker 
5416*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5417*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5418*8975f5c5SAndroid Build Coastguard Worker }
5419*8975f5c5SAndroid Build Coastguard Worker 
5420*8975f5c5SAndroid Build Coastguard Worker // Test render to a texture level that is excluded from [base_level, max_level]. This specific test
5421*8975f5c5SAndroid Build Coastguard Worker // renders to an immutable texture at the level that is smaller than GL_TEXTURE_BASE_LEVEL. The
5422*8975f5c5SAndroid Build Coastguard Worker // texture itself has been initialized with data before rendering. Filament is using it this way
TEST_P(FramebufferTest_ES3,RenderAndInvalidateImmutableTextureWithBellowBaseLevelLOD)5423*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RenderAndInvalidateImmutableTextureWithBellowBaseLevelLOD)
5424*8975f5c5SAndroid Build Coastguard Worker {
5425*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel0Size = 4;
5426*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel1Size = kLevel0Size / 2;
5427*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kLevel0Size * kLevel0Size> gData;
5428*8975f5c5SAndroid Build Coastguard Worker 
5429*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
5430*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5431*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5432*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5433*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, kLevel0Size, kLevel0Size);
5434*8975f5c5SAndroid Build Coastguard Worker     // set base_level to 1
5435*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5436*8975f5c5SAndroid Build Coastguard Worker     gData.fill(GLColor::blue);
5437*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, kLevel1Size, kLevel1Size, GL_RGBA, GL_UNSIGNED_BYTE,
5438*8975f5c5SAndroid Build Coastguard Worker                     gData.data());
5439*8975f5c5SAndroid Build Coastguard Worker 
5440*8975f5c5SAndroid Build Coastguard Worker     // Attach level 0 to a FBO
5441*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
5442*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5443*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
5444*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5445*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5446*8975f5c5SAndroid Build Coastguard Worker 
5447*8975f5c5SAndroid Build Coastguard Worker     // Render to FBO
5448*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5449*8975f5c5SAndroid Build Coastguard Worker     const GLenum discard[] = {GL_COLOR_ATTACHMENT0};
5450*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discard);
5451*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kLevel0Size, kLevel0Size);
5452*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kLevel0Size, kLevel0Size);
5453*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_CULL_FACE);
5454*8975f5c5SAndroid Build Coastguard Worker     glCullFace(GL_BACK);
5455*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
5456*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
5457*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
5458*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
5459*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
5460*8975f5c5SAndroid Build Coastguard Worker 
5461*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_CULL_FACE);
5462*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
5463*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
5464*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
5465*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
5466*8975f5c5SAndroid Build Coastguard Worker 
5467*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5468*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5469*8975f5c5SAndroid Build Coastguard Worker }
5470*8975f5c5SAndroid Build Coastguard Worker 
5471*8975f5c5SAndroid Build Coastguard Worker // Test render to a texture level that is excluded from [base_level, max_level]. This specific test
5472*8975f5c5SAndroid Build Coastguard Worker // renders to an immutable texture at the level that is bigger than GL_TEXTURE_MAX_LEVEL. The
5473*8975f5c5SAndroid Build Coastguard Worker // texture level that we render to has been initialized with data before rendering. This test if
5474*8975f5c5SAndroid Build Coastguard Worker // render to that level will get flush the level update even though it is outside [base, max]
5475*8975f5c5SAndroid Build Coastguard Worker // levels.
TEST_P(FramebufferTest_ES3,RenderImmutableTextureWithSubImageWithBeyondMaxLevel)5476*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RenderImmutableTextureWithSubImageWithBeyondMaxLevel)
5477*8975f5c5SAndroid Build Coastguard Worker {
5478*8975f5c5SAndroid Build Coastguard Worker     // Set up program to sample from specific lod level.
5479*8975f5c5SAndroid Build Coastguard Worker     GLProgram textureLodProgram;
5480*8975f5c5SAndroid Build Coastguard Worker     textureLodProgram.makeRaster(essl3_shaders::vs::Texture2DLod(),
5481*8975f5c5SAndroid Build Coastguard Worker                                  essl3_shaders::fs::Texture2DLod());
5482*8975f5c5SAndroid Build Coastguard Worker     ASSERT(textureLodProgram.valid());
5483*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(textureLodProgram);
5484*8975f5c5SAndroid Build Coastguard Worker 
5485*8975f5c5SAndroid Build Coastguard Worker     GLint textureLocation =
5486*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(textureLodProgram, essl3_shaders::Texture2DUniform());
5487*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, textureLocation);
5488*8975f5c5SAndroid Build Coastguard Worker     GLint lodLocation = glGetUniformLocation(textureLodProgram, essl3_shaders::LodUniform());
5489*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, lodLocation);
5490*8975f5c5SAndroid Build Coastguard Worker 
5491*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel0Size = 4;
5492*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel1Size = kLevel0Size / 2;
5493*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kLevel0Size * kLevel0Size> gData;
5494*8975f5c5SAndroid Build Coastguard Worker 
5495*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
5496*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5497*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5498*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5499*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, kLevel0Size, kLevel0Size);
5500*8975f5c5SAndroid Build Coastguard Worker     // Initialize level 0 with blue
5501*8975f5c5SAndroid Build Coastguard Worker     gData.fill(GLColor::blue);
5502*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kLevel0Size, kLevel0Size, GL_RGBA, GL_UNSIGNED_BYTE,
5503*8975f5c5SAndroid Build Coastguard Worker                     gData.data());
5504*8975f5c5SAndroid Build Coastguard Worker     // set max_level to 0
5505*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
5506*8975f5c5SAndroid Build Coastguard Worker     // Draw with level 0
5507*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(lodLocation, 0);
5508*8975f5c5SAndroid Build Coastguard Worker     drawQuad(textureLodProgram, essl3_shaders::PositionAttrib(), 0.5f);
5509*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
5510*8975f5c5SAndroid Build Coastguard Worker 
5511*8975f5c5SAndroid Build Coastguard Worker     // Initalize level 1 with green
5512*8975f5c5SAndroid Build Coastguard Worker     gData.fill(GLColor::green);
5513*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, kLevel1Size, kLevel1Size, GL_RGBA, GL_UNSIGNED_BYTE,
5514*8975f5c5SAndroid Build Coastguard Worker                     gData.data());
5515*8975f5c5SAndroid Build Coastguard Worker     // Attach level 1 to a FBO
5516*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
5517*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5518*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 1);
5519*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5520*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5521*8975f5c5SAndroid Build Coastguard Worker     // Render to FBO (i.e. level 1) with Red and blend with existing texture level data
5522*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5523*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kLevel1Size, kLevel1Size);
5524*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kLevel1Size, kLevel1Size);
5525*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_CULL_FACE);
5526*8975f5c5SAndroid Build Coastguard Worker     glCullFace(GL_BACK);
5527*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
5528*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
5529*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
5530*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(redProgram, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
5531*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(redProgram);
5532*8975f5c5SAndroid Build Coastguard Worker     drawQuad(redProgram, essl3_shaders::PositionAttrib(), 0.5f);
5533*8975f5c5SAndroid Build Coastguard Worker 
5534*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_CULL_FACE);
5535*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
5536*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
5537*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
5538*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
5539*8975f5c5SAndroid Build Coastguard Worker 
5540*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5541*8975f5c5SAndroid Build Coastguard Worker     // Expect to see Red + Green, which is Yellow
5542*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
5543*8975f5c5SAndroid Build Coastguard Worker }
5544*8975f5c5SAndroid Build Coastguard Worker 
5545*8975f5c5SAndroid Build Coastguard Worker // Similar to the other RenderImmutableTexture*** tests, but test on depth attachment instead of
5546*8975f5c5SAndroid Build Coastguard Worker // color attachment. This tests render to a depth texture level that is less than
5547*8975f5c5SAndroid Build Coastguard Worker // GL_TEXTURE_BASE_LEVEL and sample from it at the same time.
TEST_P(FramebufferTest_ES3,RenderSampleDepthTextureWithExcludedLevel)5548*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RenderSampleDepthTextureWithExcludedLevel)
5549*8975f5c5SAndroid Build Coastguard Worker {
5550*8975f5c5SAndroid Build Coastguard Worker     // Set up program to copy depth texture's value to color.red.
5551*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(precision mediump float;
5552*8975f5c5SAndroid Build Coastguard Worker attribute vec4 a_position;
5553*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
5554*8975f5c5SAndroid Build Coastguard Worker void main()
5555*8975f5c5SAndroid Build Coastguard Worker {
5556*8975f5c5SAndroid Build Coastguard Worker     gl_Position = a_position;
5557*8975f5c5SAndroid Build Coastguard Worker     v_texCoord = a_position.xy * 0.5 + vec2(0.5);
5558*8975f5c5SAndroid Build Coastguard Worker })";
5559*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(precision mediump float;
5560*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
5561*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D depth;
5562*8975f5c5SAndroid Build Coastguard Worker void main()
5563*8975f5c5SAndroid Build Coastguard Worker {
5564*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(texture2D(depth, v_texCoord).x, 1, 0, 1);
5565*8975f5c5SAndroid Build Coastguard Worker })";
5566*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
5567*8975f5c5SAndroid Build Coastguard Worker 
5568*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel0Size = 4;
5569*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kLevel1Size = kLevel0Size / 2;
5570*8975f5c5SAndroid Build Coastguard Worker 
5571*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
5572*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5573*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5574*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5575*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, kLevel0Size, kLevel0Size);
5576*8975f5c5SAndroid Build Coastguard Worker 
5577*8975f5c5SAndroid Build Coastguard Worker     GLTexture depthTexture;
5578*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, depthTexture);
5579*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
5580*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5581*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_DEPTH_COMPONENT32F, kLevel0Size, kLevel0Size);
5582*8975f5c5SAndroid Build Coastguard Worker     // Initialize level 1 with known depth value
5583*8975f5c5SAndroid Build Coastguard Worker     std::array<GLfloat, kLevel1Size * kLevel1Size> gData = {0.2, 0.4, 0.6, 0.8};
5584*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, kLevel1Size, kLevel1Size, GL_DEPTH_COMPONENT, GL_FLOAT,
5585*8975f5c5SAndroid Build Coastguard Worker                     gData.data());
5586*8975f5c5SAndroid Build Coastguard Worker     // set base_level and max_level to 1, exclude level 0
5587*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5588*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
5589*8975f5c5SAndroid Build Coastguard Worker 
5590*8975f5c5SAndroid Build Coastguard Worker     // Attach level 0 to a FBO
5591*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
5592*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5593*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
5594*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0);
5595*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5596*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5597*8975f5c5SAndroid Build Coastguard Worker 
5598*8975f5c5SAndroid Build Coastguard Worker     // Render to FBO (LOD 0) with depth texture LOD 1
5599*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5600*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kLevel0Size, kLevel0Size);
5601*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, kLevel0Size, kLevel0Size);
5602*8975f5c5SAndroid Build Coastguard Worker     glDepthMask(GL_TRUE);
5603*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
5604*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_ALWAYS);
5605*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
5606*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5607*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(51u, 255u, 0, 255u), 1);
5608*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(kLevel0Size - 1, 0, GLColor(102u, 255u, 0, 255u), 1);
5609*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, kLevel0Size - 1, GLColor(153u, 255u, 0, 255u), 1);
5610*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(kLevel0Size - 1, kLevel0Size - 1, GLColor(204u, 255u, 0, 255u), 1);
5611*8975f5c5SAndroid Build Coastguard Worker 
5612*8975f5c5SAndroid Build Coastguard Worker     // Now check depth value is 0.5
5613*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_LESS);
5614*8975f5c5SAndroid Build Coastguard Worker     glDepthMask(GL_FALSE);
5615*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
5616*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
5617*8975f5c5SAndroid Build Coastguard Worker     // should fail depth test
5618*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.51f);
5619*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5620*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(51u, 255u, 0, 255u), 1);
5621*8975f5c5SAndroid Build Coastguard Worker     // should pass depth test
5622*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.49f);
5623*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5624*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
5625*8975f5c5SAndroid Build Coastguard Worker }
5626*8975f5c5SAndroid Build Coastguard Worker 
5627*8975f5c5SAndroid Build Coastguard Worker // Covers a bug in ANGLE's Vulkan back-end. Our VkFramebuffer cache would in some cases forget to
5628*8975f5c5SAndroid Build Coastguard Worker // check the draw states when computing a cache key.
TEST_P(FramebufferTest_ES3,DisabledAttachmentRedefinition)5629*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, DisabledAttachmentRedefinition)
5630*8975f5c5SAndroid Build Coastguard Worker {
5631*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 2;
5632*8975f5c5SAndroid Build Coastguard Worker 
5633*8975f5c5SAndroid Build Coastguard Worker     // Make a Framebuffer with two attachments with one enabled and one disabled.
5634*8975f5c5SAndroid Build Coastguard Worker     GLTexture texA, texB;
5635*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texA);
5636*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5637*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texB);
5638*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5639*8975f5c5SAndroid Build Coastguard Worker 
5640*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
5641*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5642*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texA, 0);
5643*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, texB, 0);
5644*8975f5c5SAndroid Build Coastguard Worker 
5645*8975f5c5SAndroid Build Coastguard Worker     // Mask out the second texture.
5646*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum kOneDrawBuf = GL_COLOR_ATTACHMENT0;
5647*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(1, &kOneDrawBuf);
5648*8975f5c5SAndroid Build Coastguard Worker 
5649*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5650*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5651*8975f5c5SAndroid Build Coastguard Worker 
5652*8975f5c5SAndroid Build Coastguard Worker     // Set up a very simple shader.
5653*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
5654*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
5655*8975f5c5SAndroid Build Coastguard Worker 
5656*8975f5c5SAndroid Build Coastguard Worker     // Draw
5657*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f, 1.0f, true);
5658*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5659*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5660*8975f5c5SAndroid Build Coastguard Worker 
5661*8975f5c5SAndroid Build Coastguard Worker     // Update the masked out attachment and draw again.
5662*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redPixels(kSize * kSize, GLColor::red);
5663*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE,
5664*8975f5c5SAndroid Build Coastguard Worker                     redPixels.data());
5665*8975f5c5SAndroid Build Coastguard Worker 
5666*8975f5c5SAndroid Build Coastguard Worker     // Draw
5667*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f, 1.0f, true);
5668*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5669*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5670*8975f5c5SAndroid Build Coastguard Worker 
5671*8975f5c5SAndroid Build Coastguard Worker     glReadBuffer(GL_COLOR_ATTACHMENT1);
5672*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5673*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5674*8975f5c5SAndroid Build Coastguard Worker }
5675*8975f5c5SAndroid Build Coastguard Worker 
5676*8975f5c5SAndroid Build Coastguard Worker // Test that changing the attachment of a framebuffer then sync'ing both READ and DRAW framebuffer
5677*8975f5c5SAndroid Build Coastguard Worker // (currently possible with glInvalidateFramebuffer) updates the scissor correctly.
TEST_P(FramebufferTest_ES3,ChangeAttachmentThenInvalidateAndDraw)5678*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ChangeAttachmentThenInvalidateAndDraw)
5679*8975f5c5SAndroid Build Coastguard Worker {
5680*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSizeLarge = 32;
5681*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSizeSmall = 16;
5682*8975f5c5SAndroid Build Coastguard Worker 
5683*8975f5c5SAndroid Build Coastguard Worker     GLTexture color1;
5684*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color1);
5685*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSizeSmall, kSizeSmall, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5686*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
5687*8975f5c5SAndroid Build Coastguard Worker 
5688*8975f5c5SAndroid Build Coastguard Worker     GLTexture color2;
5689*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color2);
5690*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSizeLarge, kSizeLarge, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5691*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
5692*8975f5c5SAndroid Build Coastguard Worker 
5693*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
5694*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5695*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color1, 0);
5696*8975f5c5SAndroid Build Coastguard Worker 
5697*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
5698*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
5699*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
5700*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
5701*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
5702*8975f5c5SAndroid Build Coastguard Worker 
5703*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSizeLarge, kSizeLarge);
5704*8975f5c5SAndroid Build Coastguard Worker 
5705*8975f5c5SAndroid Build Coastguard Worker     // Draw red into the framebuffer.
5706*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
5707*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
5708*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5709*8975f5c5SAndroid Build Coastguard Worker 
5710*8975f5c5SAndroid Build Coastguard Worker     // Change the attachment, invalidate it and draw green.
5711*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color2, 0);
5712*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5713*8975f5c5SAndroid Build Coastguard Worker 
5714*8975f5c5SAndroid Build Coastguard Worker     std::array<GLenum, 1> attachments = {GL_COLOR_ATTACHMENT0};
5715*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments.data());
5716*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5717*8975f5c5SAndroid Build Coastguard Worker 
5718*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
5719*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
5720*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5721*8975f5c5SAndroid Build Coastguard Worker 
5722*8975f5c5SAndroid Build Coastguard Worker     // Validate the result.
5723*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSizeLarge, kSizeLarge, GLColor::green);
5724*8975f5c5SAndroid Build Coastguard Worker 
5725*8975f5c5SAndroid Build Coastguard Worker     // Do the same, but changing from the large to small attachment.
5726*8975f5c5SAndroid Build Coastguard Worker 
5727*8975f5c5SAndroid Build Coastguard Worker     // Draw red into the framebuffer.
5728*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
5729*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
5730*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5731*8975f5c5SAndroid Build Coastguard Worker 
5732*8975f5c5SAndroid Build Coastguard Worker     // Change the attachment, invalidate it and draw blue.
5733*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color1, 0);
5734*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5735*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments.data());
5736*8975f5c5SAndroid Build Coastguard Worker 
5737*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
5738*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
5739*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5740*8975f5c5SAndroid Build Coastguard Worker 
5741*8975f5c5SAndroid Build Coastguard Worker     // Validate the result.
5742*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kSizeSmall, kSizeSmall, GLColor::blue);
5743*8975f5c5SAndroid Build Coastguard Worker }
5744*8975f5c5SAndroid Build Coastguard Worker 
5745*8975f5c5SAndroid Build Coastguard Worker // Test Framebuffer object with two attachments that have unequal size. In OpenGLES3.0, this is
5746*8975f5c5SAndroid Build Coastguard Worker // a supported config. The common intersection area should be correctly rendered. The contents
5747*8975f5c5SAndroid Build Coastguard Worker // outside common intersection area are undefined.
TEST_P(FramebufferTest_ES3,AttachmentsWithUnequalDimensions)5748*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, AttachmentsWithUnequalDimensions)
5749*8975f5c5SAndroid Build Coastguard Worker {
5750*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsD3D());
5751*8975f5c5SAndroid Build Coastguard Worker 
5752*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSizeLarge = 32;
5753*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSizeSmall = 16;
5754*8975f5c5SAndroid Build Coastguard Worker 
5755*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
5756*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5757*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSizeLarge, kSizeSmall, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5758*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
5759*8975f5c5SAndroid Build Coastguard Worker 
5760*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer color;
5761*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, color);
5762*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSizeSmall, kSizeLarge);
5763*8975f5c5SAndroid Build Coastguard Worker 
5764*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depth;
5765*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depth);
5766*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, kSizeSmall, kSizeLarge);
5767*8975f5c5SAndroid Build Coastguard Worker 
5768*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer stencil;
5769*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, stencil);
5770*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kSizeSmall, kSizeLarge);
5771*8975f5c5SAndroid Build Coastguard Worker 
5772*8975f5c5SAndroid Build Coastguard Worker     struct
5773*8975f5c5SAndroid Build Coastguard Worker     {
5774*8975f5c5SAndroid Build Coastguard Worker         GLenum attachment;
5775*8975f5c5SAndroid Build Coastguard Worker         GLuint renderbuffer;
5776*8975f5c5SAndroid Build Coastguard Worker     } attachment2[4] = {{GL_COLOR_ATTACHMENT1, 0},
5777*8975f5c5SAndroid Build Coastguard Worker                         {GL_COLOR_ATTACHMENT1, color},
5778*8975f5c5SAndroid Build Coastguard Worker                         {GL_DEPTH_ATTACHMENT, depth},
5779*8975f5c5SAndroid Build Coastguard Worker                         {GL_STENCIL_ATTACHMENT, stencil}};
5780*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < 4; i++)
5781*8975f5c5SAndroid Build Coastguard Worker     {
5782*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
5783*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5784*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture,
5785*8975f5c5SAndroid Build Coastguard Worker                                0);
5786*8975f5c5SAndroid Build Coastguard Worker         if (attachment2[i].renderbuffer)
5787*8975f5c5SAndroid Build Coastguard Worker         {
5788*8975f5c5SAndroid Build Coastguard Worker             glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment2[i].attachment, GL_RENDERBUFFER,
5789*8975f5c5SAndroid Build Coastguard Worker                                       attachment2[i].renderbuffer);
5790*8975f5c5SAndroid Build Coastguard Worker         }
5791*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
5792*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5793*8975f5c5SAndroid Build Coastguard Worker 
5794*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
5795*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(drawColor);
5796*8975f5c5SAndroid Build Coastguard Worker         GLint colorUniformLocation =
5797*8975f5c5SAndroid Build Coastguard Worker             glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
5798*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(colorUniformLocation, -1);
5799*8975f5c5SAndroid Build Coastguard Worker 
5800*8975f5c5SAndroid Build Coastguard Worker         glViewport(0, 0, kSizeLarge, kSizeLarge);
5801*8975f5c5SAndroid Build Coastguard Worker         const GLenum discard[] = {GL_COLOR_ATTACHMENT0};
5802*8975f5c5SAndroid Build Coastguard Worker         glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discard);
5803*8975f5c5SAndroid Build Coastguard Worker 
5804*8975f5c5SAndroid Build Coastguard Worker         // Draw red into the framebuffer.
5805*8975f5c5SAndroid Build Coastguard Worker         glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
5806*8975f5c5SAndroid Build Coastguard Worker         drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
5807*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
5808*8975f5c5SAndroid Build Coastguard Worker 
5809*8975f5c5SAndroid Build Coastguard Worker         // Validate the result. The intersected common area should be red now
5810*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kSizeSmall, kSizeSmall, GLColor::red);
5811*8975f5c5SAndroid Build Coastguard Worker     }
5812*8975f5c5SAndroid Build Coastguard Worker }
5813*8975f5c5SAndroid Build Coastguard Worker 
5814*8975f5c5SAndroid Build Coastguard Worker // Validates only MESA functions can be used on OpenGL ES <3.1
TEST_P(FramebufferTest_ES3,ValidateFramebufferFlipYMesaExtension)5815*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ValidateFramebufferFlipYMesaExtension)
5816*8975f5c5SAndroid Build Coastguard Worker {
5817*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
5818*8975f5c5SAndroid Build Coastguard Worker 
5819*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFramebuffer;
5820*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
5821*8975f5c5SAndroid Build Coastguard Worker 
5822*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1);
5823*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5824*8975f5c5SAndroid Build Coastguard Worker 
5825*8975f5c5SAndroid Build Coastguard Worker     GLint flip_y = -1;
5826*8975f5c5SAndroid Build Coastguard Worker 
5827*8975f5c5SAndroid Build Coastguard Worker     glGetFramebufferParameterivMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y);
5828*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5829*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(flip_y, 1);
5830*8975f5c5SAndroid Build Coastguard Worker 
5831*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
5832*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5833*8975f5c5SAndroid Build Coastguard Worker 
5834*8975f5c5SAndroid Build Coastguard Worker     flip_y = -1;
5835*8975f5c5SAndroid Build Coastguard Worker     glGetFramebufferParameterivMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y);
5836*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5837*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(flip_y, 0);
5838*8975f5c5SAndroid Build Coastguard Worker 
5839*8975f5c5SAndroid Build Coastguard Worker     // Using non-MESA function should fail.
5840*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0);
5841*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_OPERATION);
5842*8975f5c5SAndroid Build Coastguard Worker 
5843*8975f5c5SAndroid Build Coastguard Worker     glGetFramebufferParameteriv(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y);
5844*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_OPERATION);
5845*8975f5c5SAndroid Build Coastguard Worker }
5846*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(FramebufferTest_ES3,FramebufferFlipYMesaExtensionIncorrectPname)5847*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, FramebufferFlipYMesaExtensionIncorrectPname)
5848*8975f5c5SAndroid Build Coastguard Worker {
5849*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
5850*8975f5c5SAndroid Build Coastguard Worker 
5851*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFramebuffer;
5852*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
5853*8975f5c5SAndroid Build Coastguard Worker 
5854*8975f5c5SAndroid Build Coastguard Worker     glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, 1);
5855*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_ENUM);
5856*8975f5c5SAndroid Build Coastguard Worker }
5857*8975f5c5SAndroid Build Coastguard Worker 
5858*8975f5c5SAndroid Build Coastguard Worker class FramebufferTest : public ANGLETest<>
5859*8975f5c5SAndroid Build Coastguard Worker {};
5860*8975f5c5SAndroid Build Coastguard Worker 
5861*8975f5c5SAndroid Build Coastguard Worker template <typename T>
FillTexture2D(GLuint texture,GLsizei width,GLsizei height,const T & onePixelData,GLint level,GLint internalFormat,GLenum format,GLenum type)5862*8975f5c5SAndroid Build Coastguard Worker void FillTexture2D(GLuint texture,
5863*8975f5c5SAndroid Build Coastguard Worker                    GLsizei width,
5864*8975f5c5SAndroid Build Coastguard Worker                    GLsizei height,
5865*8975f5c5SAndroid Build Coastguard Worker                    const T &onePixelData,
5866*8975f5c5SAndroid Build Coastguard Worker                    GLint level,
5867*8975f5c5SAndroid Build Coastguard Worker                    GLint internalFormat,
5868*8975f5c5SAndroid Build Coastguard Worker                    GLenum format,
5869*8975f5c5SAndroid Build Coastguard Worker                    GLenum type)
5870*8975f5c5SAndroid Build Coastguard Worker {
5871*8975f5c5SAndroid Build Coastguard Worker     std::vector<T> allPixelsData(width * height, onePixelData);
5872*8975f5c5SAndroid Build Coastguard Worker 
5873*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
5874*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, level, internalFormat, width, height, 0, format, type,
5875*8975f5c5SAndroid Build Coastguard Worker                  allPixelsData.data());
5876*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5877*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5878*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
5879*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
5880*8975f5c5SAndroid Build Coastguard Worker }
5881*8975f5c5SAndroid Build Coastguard Worker 
5882*8975f5c5SAndroid Build Coastguard Worker // Multi-context uses of textures should not cause rendering feedback loops.
TEST_P(FramebufferTest,MultiContextNoRenderingFeedbackLoops)5883*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest, MultiContextNoRenderingFeedbackLoops)
5884*8975f5c5SAndroid Build Coastguard Worker {
5885*8975f5c5SAndroid Build Coastguard Worker     constexpr char kTextureVS[] =
5886*8975f5c5SAndroid Build Coastguard Worker         R"(attribute vec4 a_position;
5887*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
5888*8975f5c5SAndroid Build Coastguard Worker void main() {
5889*8975f5c5SAndroid Build Coastguard Worker     gl_Position = a_position;
5890*8975f5c5SAndroid Build Coastguard Worker     v_texCoord = (a_position.xy * 0.5) + 0.5;
5891*8975f5c5SAndroid Build Coastguard Worker })";
5892*8975f5c5SAndroid Build Coastguard Worker 
5893*8975f5c5SAndroid Build Coastguard Worker     constexpr char kTextureFS[] =
5894*8975f5c5SAndroid Build Coastguard Worker         R"(precision mediump float;
5895*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
5896*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D u_texture;
5897*8975f5c5SAndroid Build Coastguard Worker void main() {
5898*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = texture2D(u_texture, v_texCoord).rgba;
5899*8975f5c5SAndroid Build Coastguard Worker })";
5900*8975f5c5SAndroid Build Coastguard Worker 
5901*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(textureProgram, kTextureVS, kTextureFS);
5902*8975f5c5SAndroid Build Coastguard Worker 
5903*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(textureProgram);
5904*8975f5c5SAndroid Build Coastguard Worker     GLint uniformLoc = glGetUniformLocation(textureProgram, "u_texture");
5905*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, uniformLoc);
5906*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(uniformLoc, 0);
5907*8975f5c5SAndroid Build Coastguard Worker 
5908*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
5909*8975f5c5SAndroid Build Coastguard Worker     FillTexture2D(texture, 1, 1, GLColor::red, 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE);
5910*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
5911*8975f5c5SAndroid Build Coastguard Worker     // Note that _texture_ is still bound to GL_TEXTURE_2D in this context at this point.
5912*8975f5c5SAndroid Build Coastguard Worker 
5913*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window          = getEGLWindow();
5914*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay display         = window->getDisplay();
5915*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config           = window->getConfig();
5916*8975f5c5SAndroid Build Coastguard Worker     EGLSurface surface         = window->getSurface();
5917*8975f5c5SAndroid Build Coastguard Worker     EGLint contextAttributes[] = {
5918*8975f5c5SAndroid Build Coastguard Worker         EGL_CONTEXT_MAJOR_VERSION_KHR,
5919*8975f5c5SAndroid Build Coastguard Worker         GetParam().majorVersion,
5920*8975f5c5SAndroid Build Coastguard Worker         EGL_CONTEXT_MINOR_VERSION_KHR,
5921*8975f5c5SAndroid Build Coastguard Worker         GetParam().minorVersion,
5922*8975f5c5SAndroid Build Coastguard Worker         EGL_NONE,
5923*8975f5c5SAndroid Build Coastguard Worker     };
5924*8975f5c5SAndroid Build Coastguard Worker     EGLContext context1 = eglGetCurrentContext();
5925*8975f5c5SAndroid Build Coastguard Worker     // Create context2, sharing resources with context1.
5926*8975f5c5SAndroid Build Coastguard Worker     EGLContext context2 = eglCreateContext(display, config, context1, contextAttributes);
5927*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(context2, EGL_NO_CONTEXT);
5928*8975f5c5SAndroid Build Coastguard Worker     eglMakeCurrent(display, surface, surface, context2);
5929*8975f5c5SAndroid Build Coastguard Worker 
5930*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
5931*8975f5c5SAndroid Build Coastguard Worker         R"(attribute vec4 a_position;
5932*8975f5c5SAndroid Build Coastguard Worker void main() {
5933*8975f5c5SAndroid Build Coastguard Worker     gl_Position = a_position;
5934*8975f5c5SAndroid Build Coastguard Worker })";
5935*8975f5c5SAndroid Build Coastguard Worker 
5936*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
5937*8975f5c5SAndroid Build Coastguard Worker         R"(precision mediump float;
5938*8975f5c5SAndroid Build Coastguard Worker void main() {
5939*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
5940*8975f5c5SAndroid Build Coastguard Worker })";
5941*8975f5c5SAndroid Build Coastguard Worker 
5942*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
5943*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
5944*8975f5c5SAndroid Build Coastguard Worker 
5945*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5946*8975f5c5SAndroid Build Coastguard Worker 
5947*8975f5c5SAndroid Build Coastguard Worker     // Render to the texture in context2.
5948*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
5949*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5950*8975f5c5SAndroid Build Coastguard Worker     // Texture is still a valid name in context2.
5951*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
5952*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5953*8975f5c5SAndroid Build Coastguard Worker     // There is no rendering feedback loop at this point.
5954*8975f5c5SAndroid Build Coastguard Worker 
5955*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
5956*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
5957*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5958*8975f5c5SAndroid Build Coastguard Worker 
5959*8975f5c5SAndroid Build Coastguard Worker     // If draw is no-op'ed, texture will not be filled appropriately.
5960*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "a_position", 0.5f, 1.0f, true);
5961*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5962*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5963*8975f5c5SAndroid Build Coastguard Worker 
5964*8975f5c5SAndroid Build Coastguard Worker     // Make context1 current again.
5965*8975f5c5SAndroid Build Coastguard Worker     eglMakeCurrent(display, surface, surface, context1);
5966*8975f5c5SAndroid Build Coastguard Worker 
5967*8975f5c5SAndroid Build Coastguard Worker     // Render texture to screen.
5968*8975f5c5SAndroid Build Coastguard Worker     drawQuad(textureProgram, "a_position", 0.5f, 1.0f, true);
5969*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5970*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5971*8975f5c5SAndroid Build Coastguard Worker 
5972*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(display, context2);
5973*8975f5c5SAndroid Build Coastguard Worker }
5974*8975f5c5SAndroid Build Coastguard Worker 
5975*8975f5c5SAndroid Build Coastguard Worker // Ensure cube-incomplete attachments cause incomplete Framebuffers.
TEST_P(FramebufferTest,IncompleteCubeMap)5976*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest, IncompleteCubeMap)
5977*8975f5c5SAndroid Build Coastguard Worker {
5978*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kSize = 2;
5979*8975f5c5SAndroid Build Coastguard Worker 
5980*8975f5c5SAndroid Build Coastguard Worker     GLTexture srcTex;
5981*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, srcTex);
5982*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA,
5983*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_BYTE, nullptr);
5984*8975f5c5SAndroid Build Coastguard Worker 
5985*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
5986*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5987*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
5988*8975f5c5SAndroid Build Coastguard Worker                            srcTex, 0);
5989*8975f5c5SAndroid Build Coastguard Worker 
5990*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5991*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(glCheckFramebufferStatus(GL_FRAMEBUFFER),
5992*8975f5c5SAndroid Build Coastguard Worker                      GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT);
5993*8975f5c5SAndroid Build Coastguard Worker }
5994*8975f5c5SAndroid Build Coastguard Worker 
5995*8975f5c5SAndroid Build Coastguard Worker // Test FBOs with different sizes are drawn correctly
TEST_P(FramebufferTest,BindAndDrawDifferentSizedFBOs)5996*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest, BindAndDrawDifferentSizedFBOs)
5997*8975f5c5SAndroid Build Coastguard Worker {
5998*8975f5c5SAndroid Build Coastguard Worker     // 1. Create FBO 1 with dimensions 16x16
5999*8975f5c5SAndroid Build Coastguard Worker     // 2. Draw red into FBO 1 (note, FramebufferVk::syncState is called)
6000*8975f5c5SAndroid Build Coastguard Worker     // 3. Create FBO 2 with dimensions 8x8
6001*8975f5c5SAndroid Build Coastguard Worker     // 4. Draw green into FBO 2 (note, FramebufferVk::syncState is called)
6002*8975f5c5SAndroid Build Coastguard Worker     // 5. Bind FBO 1 (note, it's not dirty)
6003*8975f5c5SAndroid Build Coastguard Worker     // 6. Draw blue into FBO 1
6004*8975f5c5SAndroid Build Coastguard Worker     // 7. Verify FBO 1 is entirely blue
6005*8975f5c5SAndroid Build Coastguard Worker 
6006*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer smallFbo;
6007*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer largeFbo;
6008*8975f5c5SAndroid Build Coastguard Worker     GLTexture smallTexture;
6009*8975f5c5SAndroid Build Coastguard Worker     GLTexture largeTexture;
6010*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kLargeWidth  = 16;
6011*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kLargeHeight = 16;
6012*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSmallWidth  = 8;
6013*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSmallHeight = 8;
6014*8975f5c5SAndroid Build Coastguard Worker 
6015*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(redProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
6016*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
6017*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
6018*8975f5c5SAndroid Build Coastguard Worker 
6019*8975f5c5SAndroid Build Coastguard Worker     // 1. Create FBO 1 with dimensions 16x16
6020*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, largeFbo);
6021*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, largeTexture);
6022*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kLargeWidth, kLargeHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6023*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
6024*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6025*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6026*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, largeTexture, 0);
6027*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6028*8975f5c5SAndroid Build Coastguard Worker 
6029*8975f5c5SAndroid Build Coastguard Worker     // 2. Draw red into FBO 1 (note, FramebufferVk::syncState is called)
6030*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(redProgram);
6031*8975f5c5SAndroid Build Coastguard Worker     drawQuad(redProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
6032*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6033*8975f5c5SAndroid Build Coastguard Worker 
6034*8975f5c5SAndroid Build Coastguard Worker     // 3. Create FBO 2 with dimensions 8x8
6035*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, smallFbo);
6036*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, smallTexture);
6037*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSmallWidth, kSmallHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6038*8975f5c5SAndroid Build Coastguard Worker                  nullptr);
6039*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6040*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6041*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, smallTexture, 0);
6042*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6043*8975f5c5SAndroid Build Coastguard Worker 
6044*8975f5c5SAndroid Build Coastguard Worker     // 4. Draw green into FBO 2 (note, FramebufferVk::syncState is called)
6045*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(greenProgram);
6046*8975f5c5SAndroid Build Coastguard Worker     drawQuad(greenProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
6047*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6048*8975f5c5SAndroid Build Coastguard Worker 
6049*8975f5c5SAndroid Build Coastguard Worker     // 5. Bind FBO 1 (note, it's not dirty)
6050*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, largeFbo);
6051*8975f5c5SAndroid Build Coastguard Worker 
6052*8975f5c5SAndroid Build Coastguard Worker     // 6. Draw blue into FBO 1
6053*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(blueProgram);
6054*8975f5c5SAndroid Build Coastguard Worker     drawQuad(blueProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
6055*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6056*8975f5c5SAndroid Build Coastguard Worker 
6057*8975f5c5SAndroid Build Coastguard Worker     // 7. Verify FBO 1 is entirely blue
6058*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kLargeWidth, kLargeHeight, GLColor::blue);
6059*8975f5c5SAndroid Build Coastguard Worker }
6060*8975f5c5SAndroid Build Coastguard Worker 
6061*8975f5c5SAndroid Build Coastguard Worker // Test FBOs with same attachments. Destroy one framebuffer should not affect the other framebuffer
6062*8975f5c5SAndroid Build Coastguard Worker // (chromium:1351170).
TEST_P(FramebufferTest_ES3,TwoFramebuffersWithSameAttachments)6063*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, TwoFramebuffersWithSameAttachments)
6064*8975f5c5SAndroid Build Coastguard Worker {
6065*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(redProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
6066*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(redProgram);
6067*8975f5c5SAndroid Build Coastguard Worker 
6068*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb;
6069*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb);
6070*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
6071*8975f5c5SAndroid Build Coastguard Worker 
6072*8975f5c5SAndroid Build Coastguard Worker     GLuint fbs[2];
6073*8975f5c5SAndroid Build Coastguard Worker     glGenFramebuffers(2, fbs);
6074*8975f5c5SAndroid Build Coastguard Worker     // Create fbos[0]
6075*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbs[0]);
6076*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
6077*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6078*8975f5c5SAndroid Build Coastguard Worker     const GLenum colorAttachment0 = {GL_COLOR_ATTACHMENT0};
6079*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, &colorAttachment0);
6080*8975f5c5SAndroid Build Coastguard Worker     // Create fbos[1] with same attachment as fbos[0]
6081*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbs[1]);
6082*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
6083*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6084*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, &colorAttachment0);
6085*8975f5c5SAndroid Build Coastguard Worker     // Destroy fbos[0]
6086*8975f5c5SAndroid Build Coastguard Worker     glDeleteFramebuffers(1, &fbs[0]);
6087*8975f5c5SAndroid Build Coastguard Worker     // fbos[1] should still work, not crash.
6088*8975f5c5SAndroid Build Coastguard Worker     GLuint data;
6089*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &data);
6090*8975f5c5SAndroid Build Coastguard Worker     drawQuad(redProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
6091*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6092*8975f5c5SAndroid Build Coastguard Worker }
6093*8975f5c5SAndroid Build Coastguard Worker 
6094*8975f5c5SAndroid Build Coastguard Worker // Regression test based on a fuzzer failure.  A crash was encountered in the following situation:
6095*8975f5c5SAndroid Build Coastguard Worker //
6096*8975f5c5SAndroid Build Coastguard Worker // - Texture bound as sampler with MAX_LEVEL 0
6097*8975f5c5SAndroid Build Coastguard Worker // - Framebuffer bound to level 0
6098*8975f5c5SAndroid Build Coastguard Worker // - Draw
6099*8975f5c5SAndroid Build Coastguard Worker // - Texture MAX_LEVEL changed to 1
6100*8975f5c5SAndroid Build Coastguard Worker // - Framebuffer bound to level 1
6101*8975f5c5SAndroid Build Coastguard Worker // - Draw
6102*8975f5c5SAndroid Build Coastguard Worker //
6103*8975f5c5SAndroid Build Coastguard Worker // Notes: Removing the first half removed the crash.  MIN_FILTERING of LINEAR vs
6104*8975f5c5SAndroid Build Coastguard Worker // LINEAR_MIPMAP_LINEAR did not make any changes.
TEST_P(FramebufferTest_ES3,FramebufferBindToNewLevelAfterMaxIncreaseShouldntCrash)6105*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, FramebufferBindToNewLevelAfterMaxIncreaseShouldntCrash)
6106*8975f5c5SAndroid Build Coastguard Worker {
6107*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(precision mediump float;
6108*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D u_tex0;
6109*8975f5c5SAndroid Build Coastguard Worker void main() {
6110*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = texture2D(u_tex0, vec2(0));
6111*8975f5c5SAndroid Build Coastguard Worker })";
6112*8975f5c5SAndroid Build Coastguard Worker 
6113*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), kFS);
6114*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
6115*8975f5c5SAndroid Build Coastguard Worker 
6116*8975f5c5SAndroid Build Coastguard Worker     GLTexture mutTex;
6117*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mutTex);
6118*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 10, 10, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
6119*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 5, 5, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
6120*8975f5c5SAndroid Build Coastguard Worker 
6121*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
6122*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
6123*8975f5c5SAndroid Build Coastguard Worker 
6124*8975f5c5SAndroid Build Coastguard Worker     // Attempt a draw with level 0 (feedback loop)
6125*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
6126*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
6127*8975f5c5SAndroid Build Coastguard Worker 
6128*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mutTex, 0);
6129*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_POINTS, 0, 1);
6130*8975f5c5SAndroid Build Coastguard Worker 
6131*8975f5c5SAndroid Build Coastguard Worker     // Attempt another draw with level 1.
6132*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
6133*8975f5c5SAndroid Build Coastguard Worker 
6134*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mutTex, 1);
6135*8975f5c5SAndroid Build Coastguard Worker 
6136*8975f5c5SAndroid Build Coastguard Worker     // This shouldn't crash.
6137*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_POINTS, 0, 1);
6138*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6139*8975f5c5SAndroid Build Coastguard Worker }
6140*8975f5c5SAndroid Build Coastguard Worker 
6141*8975f5c5SAndroid Build Coastguard Worker // Modify renderbuffer attachment samples after bind
TEST_P(FramebufferTest_ES3,BindRenderbufferThenModifySamples)6142*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, BindRenderbufferThenModifySamples)
6143*8975f5c5SAndroid Build Coastguard Worker {
6144*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
6145*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
6146*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
6147*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
6148*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
6149*8975f5c5SAndroid Build Coastguard Worker 
6150*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
6151*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6152*8975f5c5SAndroid Build Coastguard Worker 
6153*8975f5c5SAndroid Build Coastguard Worker     GLsizei size = 16;
6154*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, size, size);
6155*8975f5c5SAndroid Build Coastguard Worker 
6156*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer color;
6157*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, color);
6158*8975f5c5SAndroid Build Coastguard Worker 
6159*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, size, size);
6160*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color);
6161*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, size, size);
6162*8975f5c5SAndroid Build Coastguard Worker 
6163*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 1, 0, 0, 1);
6164*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
6165*8975f5c5SAndroid Build Coastguard Worker 
6166*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6167*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6168*8975f5c5SAndroid Build Coastguard Worker }
6169*8975f5c5SAndroid Build Coastguard Worker 
6170*8975f5c5SAndroid Build Coastguard Worker // Modify renderbuffer attachment size after bind
TEST_P(FramebufferTest_ES3,BindRenderbufferThenModifySize)6171*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, BindRenderbufferThenModifySize)
6172*8975f5c5SAndroid Build Coastguard Worker {
6173*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
6174*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
6175*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
6176*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
6177*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
6178*8975f5c5SAndroid Build Coastguard Worker 
6179*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
6180*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6181*8975f5c5SAndroid Build Coastguard Worker 
6182*8975f5c5SAndroid Build Coastguard Worker     GLsizei size = 16;
6183*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, size, size);
6184*8975f5c5SAndroid Build Coastguard Worker 
6185*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer color;
6186*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, color);
6187*8975f5c5SAndroid Build Coastguard Worker 
6188*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, size, size);
6189*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color);
6190*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, size / 2, size * 2);
6191*8975f5c5SAndroid Build Coastguard Worker 
6192*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 1, 0, 0, 1);
6193*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
6194*8975f5c5SAndroid Build Coastguard Worker 
6195*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6196*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6197*8975f5c5SAndroid Build Coastguard Worker }
6198*8975f5c5SAndroid Build Coastguard Worker 
6199*8975f5c5SAndroid Build Coastguard Worker // Tests redefining a layered framebuffer attachment.
TEST_P(FramebufferTest_ES3,RedefineLayerAttachment)6200*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, RedefineLayerAttachment)
6201*8975f5c5SAndroid Build Coastguard Worker {
6202*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
6203*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_3D, texture);
6204*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> imgData(20480, 0);
6205*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_R8, 8, 8, 8, 0, GL_RED, GL_UNSIGNED_BYTE, imgData.data());
6206*8975f5c5SAndroid Build Coastguard Worker 
6207*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
6208*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6209*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0, 8);
6210*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_3D);
6211*8975f5c5SAndroid Build Coastguard Worker 
6212*8975f5c5SAndroid Build Coastguard Worker     glTexImage3D(GL_TEXTURE_3D, 0, GL_R8UI, 16, 16, 16, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE,
6213*8975f5c5SAndroid Build Coastguard Worker                  imgData.data());
6214*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 2, 2, 15, 16, 16);
6215*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6216*8975f5c5SAndroid Build Coastguard Worker }
6217*8975f5c5SAndroid Build Coastguard Worker 
6218*8975f5c5SAndroid Build Coastguard Worker // Covers a bug when changing a base level of a texture bound to a FBO.
TEST_P(FramebufferTest_ES3,ReattachToInvalidBaseLevel)6219*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, ReattachToInvalidBaseLevel)
6220*8975f5c5SAndroid Build Coastguard Worker {
6221*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(testProgram, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
6222*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(testProgram);
6223*8975f5c5SAndroid Build Coastguard Worker 
6224*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
6225*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
6226*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
6227*8975f5c5SAndroid Build Coastguard Worker 
6228*8975f5c5SAndroid Build Coastguard Worker     for (int mip = 0; mip <= 2; ++mip)
6229*8975f5c5SAndroid Build Coastguard Worker     {
6230*8975f5c5SAndroid Build Coastguard Worker         int size = 10 >> mip;
6231*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, mip, GL_RGBA8, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6232*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
6233*8975f5c5SAndroid Build Coastguard Worker     }
6234*8975f5c5SAndroid Build Coastguard Worker 
6235*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
6236*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
6237*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 1);
6238*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6239*8975f5c5SAndroid Build Coastguard Worker 
6240*8975f5c5SAndroid Build Coastguard Worker     // Set base level 1 and draw.
6241*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
6242*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_POINTS, 0, 1);
6243*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6244*8975f5c5SAndroid Build Coastguard Worker     // Set base level 0. The FBO is incomplete because the FBO attachment binds to level 1.
6245*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
6246*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_POINTS, 0, 1);
6247*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_FRAMEBUFFER_OPERATION);
6248*8975f5c5SAndroid Build Coastguard Worker }
6249*8975f5c5SAndroid Build Coastguard Worker 
6250*8975f5c5SAndroid Build Coastguard Worker // Ensure that clear color is correctly applied after invalidate
TEST_P(FramebufferTest_ES3,InvalidateClearDraw)6251*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, InvalidateClearDraw)
6252*8975f5c5SAndroid Build Coastguard Worker {
6253*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kSize = 2;
6254*8975f5c5SAndroid Build Coastguard Worker 
6255*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
6256*8975f5c5SAndroid Build Coastguard Worker 
6257*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
6258*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
6259*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
6260*8975f5c5SAndroid Build Coastguard Worker 
6261*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
6262*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6263*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
6264*8975f5c5SAndroid Build Coastguard Worker 
6265*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6266*8975f5c5SAndroid Build Coastguard Worker 
6267*8975f5c5SAndroid Build Coastguard Worker     // Clear the image, and make sure the clear is flushed outside the render pass.
6268*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
6269*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6270*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6271*8975f5c5SAndroid Build Coastguard Worker 
6272*8975f5c5SAndroid Build Coastguard Worker     // Invalidate it such that the contents are marked as undefined. Note that
6273*8975f5c5SAndroid Build Coastguard Worker     // regardless of the marking, the image is cleared nevertheless.
6274*8975f5c5SAndroid Build Coastguard Worker     const GLenum discards[] = {GL_COLOR_ATTACHMENT0};
6275*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discards);
6276*8975f5c5SAndroid Build Coastguard Worker 
6277*8975f5c5SAndroid Build Coastguard Worker     // Clear it again to the same color, and make sure the clear is flushed outside the render pass,
6278*8975f5c5SAndroid Build Coastguard Worker     // which may be optimized out.
6279*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6280*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6281*8975f5c5SAndroid Build Coastguard Worker 
6282*8975f5c5SAndroid Build Coastguard Worker     // Draw with blend.  If the second clear is dropped and the image continues to be marked as
6283*8975f5c5SAndroid Build Coastguard Worker     // invalidated, loadOp=DONT_CARE would be used instead of loadOp=LOAD.
6284*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
6285*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
6286*8975f5c5SAndroid Build Coastguard Worker 
6287*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
6288*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::magenta);
6289*8975f5c5SAndroid Build Coastguard Worker }
6290*8975f5c5SAndroid Build Coastguard Worker 
6291*8975f5c5SAndroid Build Coastguard Worker // Produces VUID-VkImageMemoryBarrier-oldLayout-01197 VVL error with a "Render pass closed due to
6292*8975f5c5SAndroid Build Coastguard Worker // framebuffer change" command buffer label. As seen in Black Desert Mobile.
6293*8975f5c5SAndroid Build Coastguard Worker // The application draws 2 passes to produce the issue. First pass draws to a depth only frame
6294*8975f5c5SAndroid Build Coastguard Worker // buffer, the second one to a different color+depth frame buffer. The second pass samples the first
6295*8975f5c5SAndroid Build Coastguard Worker // passes frame buffer in two draw calls. First draw call samples it in the fragment stage, second
6296*8975f5c5SAndroid Build Coastguard Worker // in the the vertex stage.
TEST_P(FramebufferTest_ES3,FramebufferChangeTest)6297*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, FramebufferChangeTest)
6298*8975f5c5SAndroid Build Coastguard Worker {
6299*8975f5c5SAndroid Build Coastguard Worker     // Init depth frame buffer
6300*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer depthFramebuffer;
6301*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, depthFramebuffer);
6302*8975f5c5SAndroid Build Coastguard Worker 
6303*8975f5c5SAndroid Build Coastguard Worker     GLTexture depthAttachment;
6304*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, depthAttachment);
6305*8975f5c5SAndroid Build Coastguard Worker     // When using a color attachment instead, the issue does not occur.
6306*8975f5c5SAndroid Build Coastguard Worker     // The issue seems to occur for all GL_DEPTH_COMPONENT formats.
6307*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, kWidth, kHeight, 0, GL_DEPTH_COMPONENT,
6308*8975f5c5SAndroid Build Coastguard Worker                  GL_UNSIGNED_INT, nullptr);
6309*8975f5c5SAndroid Build Coastguard Worker 
6310*8975f5c5SAndroid Build Coastguard Worker     // If filtering the depth attachment to GL_NEAREST is not set, the issue does not occur.
6311*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6312*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6313*8975f5c5SAndroid Build Coastguard Worker 
6314*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthAttachment, 0);
6315*8975f5c5SAndroid Build Coastguard Worker 
6316*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
6317*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6318*8975f5c5SAndroid Build Coastguard Worker 
6319*8975f5c5SAndroid Build Coastguard Worker     // Depth only pass
6320*8975f5c5SAndroid Build Coastguard Worker     {
6321*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
6322*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(program);
6323*8975f5c5SAndroid Build Coastguard Worker 
6324*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_DEPTH_BUFFER_BIT);
6325*8975f5c5SAndroid Build Coastguard Worker 
6326*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 6);
6327*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
6328*8975f5c5SAndroid Build Coastguard Worker     }
6329*8975f5c5SAndroid Build Coastguard Worker 
6330*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
6331*8975f5c5SAndroid Build Coastguard Worker 
6332*8975f5c5SAndroid Build Coastguard Worker     // Color pass
6333*8975f5c5SAndroid Build Coastguard Worker     // The depth texture from the first pass is sampled from in both draw calls.
6334*8975f5c5SAndroid Build Coastguard Worker     // Skipping any of the two depth texture binds makes the issue not occur.
6335*8975f5c5SAndroid Build Coastguard Worker     // Changing the order of the draw calls makes the issue not occur.
6336*8975f5c5SAndroid Build Coastguard Worker     // This pass does not need to draw into a frame buffer.
6337*8975f5c5SAndroid Build Coastguard Worker 
6338*8975f5c5SAndroid Build Coastguard Worker     // Draw 1
6339*8975f5c5SAndroid Build Coastguard Worker     // The depth texture from the first pass is sampled from in the frament stage.
6340*8975f5c5SAndroid Build Coastguard Worker     {
6341*8975f5c5SAndroid Build Coastguard Worker         constexpr char kFS[] = {
6342*8975f5c5SAndroid Build Coastguard Worker             R"(#version 300 es
6343*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
6344*8975f5c5SAndroid Build Coastguard Worker 
6345*8975f5c5SAndroid Build Coastguard Worker uniform mediump sampler2D samp;
6346*8975f5c5SAndroid Build Coastguard Worker 
6347*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out highp vec4 color;
6348*8975f5c5SAndroid Build Coastguard Worker 
6349*8975f5c5SAndroid Build Coastguard Worker void main()
6350*8975f5c5SAndroid Build Coastguard Worker {
6351*8975f5c5SAndroid Build Coastguard Worker     color = texture(samp, vec2(0));
6352*8975f5c5SAndroid Build Coastguard Worker })",
6353*8975f5c5SAndroid Build Coastguard Worker         };
6354*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
6355*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(program);
6356*8975f5c5SAndroid Build Coastguard Worker 
6357*8975f5c5SAndroid Build Coastguard Worker         GLint textureLoc = glGetUniformLocation(program, "samp");
6358*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(textureLoc, 1);
6359*8975f5c5SAndroid Build Coastguard Worker 
6360*8975f5c5SAndroid Build Coastguard Worker         // Skipping this bind makes the issue not occur
6361*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE1);
6362*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, depthAttachment);
6363*8975f5c5SAndroid Build Coastguard Worker 
6364*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 6);
6365*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
6366*8975f5c5SAndroid Build Coastguard Worker     }
6367*8975f5c5SAndroid Build Coastguard Worker 
6368*8975f5c5SAndroid Build Coastguard Worker     // Draw 2
6369*8975f5c5SAndroid Build Coastguard Worker     // Here the depth attachment from the first pass is used in the vertex stage. The VVL error
6370*8975f5c5SAndroid Build Coastguard Worker     // occurs in this draw. The sampler has to be attached to the vertex stage, otherwise the issue
6371*8975f5c5SAndroid Build Coastguard Worker     // does not occur.
6372*8975f5c5SAndroid Build Coastguard Worker     {
6373*8975f5c5SAndroid Build Coastguard Worker         constexpr char kVS[] = {
6374*8975f5c5SAndroid Build Coastguard Worker             R"(#version 300 es
6375*8975f5c5SAndroid Build Coastguard Worker 
6376*8975f5c5SAndroid Build Coastguard Worker uniform mediump sampler2D samp;
6377*8975f5c5SAndroid Build Coastguard Worker 
6378*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) in mediump vec4 pos;
6379*8975f5c5SAndroid Build Coastguard Worker 
6380*8975f5c5SAndroid Build Coastguard Worker void main()
6381*8975f5c5SAndroid Build Coastguard Worker {
6382*8975f5c5SAndroid Build Coastguard Worker     gl_Position = pos + texture(samp, vec2(0));
6383*8975f5c5SAndroid Build Coastguard Worker })",
6384*8975f5c5SAndroid Build Coastguard Worker         };
6385*8975f5c5SAndroid Build Coastguard Worker 
6386*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(program, kVS, essl3_shaders::fs::Red());
6387*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(program);
6388*8975f5c5SAndroid Build Coastguard Worker 
6389*8975f5c5SAndroid Build Coastguard Worker         GLint textureLoc = glGetUniformLocation(program, "samp");
6390*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(textureLoc, 2);
6391*8975f5c5SAndroid Build Coastguard Worker 
6392*8975f5c5SAndroid Build Coastguard Worker         // Skipping this bind makes the issue not occur
6393*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE2);
6394*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, depthAttachment);
6395*8975f5c5SAndroid Build Coastguard Worker 
6396*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 6);
6397*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
6398*8975f5c5SAndroid Build Coastguard Worker     }
6399*8975f5c5SAndroid Build Coastguard Worker }
6400*8975f5c5SAndroid Build Coastguard Worker 
6401*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug in the Vulkan backend where the application produces a conditional
6402*8975f5c5SAndroid Build Coastguard Worker // framebuffer feedback loop which results in VUID-VkDescriptorImageInfo-imageLayout-00344 and
6403*8975f5c5SAndroid Build Coastguard Worker // VUID-vkCmdDraw-None-02699 (or VUID-vkCmdDrawIndexed-None-02699 when a different draw call is
6404*8975f5c5SAndroid Build Coastguard Worker // used). The application samples from the frame buffer it renders to depending on a uniform
6405*8975f5c5SAndroid Build Coastguard Worker // condition.
TEST_P(FramebufferTest_ES3,FramebufferConditionalFeedbackLoop)6406*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, FramebufferConditionalFeedbackLoop)
6407*8975f5c5SAndroid Build Coastguard Worker {
6408*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorAttachment;
6409*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorAttachment);
6410*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight);
6411*8975f5c5SAndroid Build Coastguard Worker 
6412*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE13);
6413*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorAttachment);
6414*8975f5c5SAndroid Build Coastguard Worker 
6415*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6416*8975f5c5SAndroid Build Coastguard Worker 
6417*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
6418*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
6419*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorAttachment, 0);
6420*8975f5c5SAndroid Build Coastguard Worker 
6421*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6422*8975f5c5SAndroid Build Coastguard Worker 
6423*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
6424*8975f5c5SAndroid Build Coastguard Worker 
6425*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = {
6426*8975f5c5SAndroid Build Coastguard Worker         R"(#version 300 es
6427*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
6428*8975f5c5SAndroid Build Coastguard Worker 
6429*8975f5c5SAndroid Build Coastguard Worker uniform mediump sampler2D samp;
6430*8975f5c5SAndroid Build Coastguard Worker uniform vec4 sampleCondition;
6431*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
6432*8975f5c5SAndroid Build Coastguard Worker 
6433*8975f5c5SAndroid Build Coastguard Worker void main()
6434*8975f5c5SAndroid Build Coastguard Worker {
6435*8975f5c5SAndroid Build Coastguard Worker     if (sampleCondition.x > 0.0)
6436*8975f5c5SAndroid Build Coastguard Worker     {
6437*8975f5c5SAndroid Build Coastguard Worker         color = texture(samp, vec2(0.0));
6438*8975f5c5SAndroid Build Coastguard Worker     }
6439*8975f5c5SAndroid Build Coastguard Worker })",
6440*8975f5c5SAndroid Build Coastguard Worker     };
6441*8975f5c5SAndroid Build Coastguard Worker 
6442*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
6443*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
6444*8975f5c5SAndroid Build Coastguard Worker 
6445*8975f5c5SAndroid Build Coastguard Worker     GLint textureLoc = glGetUniformLocation(program, "samp");
6446*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(textureLoc, 13);
6447*8975f5c5SAndroid Build Coastguard Worker 
6448*8975f5c5SAndroid Build Coastguard Worker     // This draw is required for the issue to occur. The application does multiple draws to
6449*8975f5c5SAndroid Build Coastguard Worker     // different framebuffers at this point, but drawing without a framebuffer bound also does
6450*8975f5c5SAndroid Build Coastguard Worker     // reproduce it.
6451*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
6452*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6453*8975f5c5SAndroid Build Coastguard Worker 
6454*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
6455*8975f5c5SAndroid Build Coastguard Worker 
6456*8975f5c5SAndroid Build Coastguard Worker     // This draw triggers the issue.
6457*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
6458*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6459*8975f5c5SAndroid Build Coastguard Worker }
6460*8975f5c5SAndroid Build Coastguard Worker 
6461*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug in the Vulkan backend where sampling from a
6462*8975f5c5SAndroid Build Coastguard Worker // texture previously involved in a framebuffer feedback loop would produce
6463*8975f5c5SAndroid Build Coastguard Worker // VUID-VkDescriptorImageInfo-imageLayout-00344 and VUID-vkCmdDraw-None-02699
6464*8975f5c5SAndroid Build Coastguard Worker // because of an incorrect cached descriptor set.
TEST_P(FramebufferTest_ES3,FeedbackLoopTextureBindings)6465*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, FeedbackLoopTextureBindings)
6466*8975f5c5SAndroid Build Coastguard Worker {
6467*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(#version 300 es
6468*8975f5c5SAndroid Build Coastguard Worker precision highp float;
6469*8975f5c5SAndroid Build Coastguard Worker out vec2 texCoord;
6470*8975f5c5SAndroid Build Coastguard Worker const vec2 kVertices[4] = vec2[4](vec2(-1, -1), vec2(1, -1), vec2(-1, 1), vec2(1, 1));
6471*8975f5c5SAndroid Build Coastguard Worker void main()
6472*8975f5c5SAndroid Build Coastguard Worker {
6473*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(kVertices[gl_VertexID], 0.0, 1.0);
6474*8975f5c5SAndroid Build Coastguard Worker     texCoord = (kVertices[gl_VertexID] * 0.5) + 0.5;
6475*8975f5c5SAndroid Build Coastguard Worker })";
6476*8975f5c5SAndroid Build Coastguard Worker 
6477*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
6478*8975f5c5SAndroid Build Coastguard Worker precision highp float;
6479*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D sampler;
6480*8975f5c5SAndroid Build Coastguard Worker uniform int sampleCondition;
6481*8975f5c5SAndroid Build Coastguard Worker in vec2 texCoord;
6482*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
6483*8975f5c5SAndroid Build Coastguard Worker const vec4 kGreen = vec4(0, 1, 0, 1);
6484*8975f5c5SAndroid Build Coastguard Worker void main()
6485*8975f5c5SAndroid Build Coastguard Worker {
6486*8975f5c5SAndroid Build Coastguard Worker     if (sampleCondition == 0) {
6487*8975f5c5SAndroid Build Coastguard Worker         colorOut = kGreen;
6488*8975f5c5SAndroid Build Coastguard Worker     } else {
6489*8975f5c5SAndroid Build Coastguard Worker         colorOut = texture(sampler, texCoord);
6490*8975f5c5SAndroid Build Coastguard Worker     }
6491*8975f5c5SAndroid Build Coastguard Worker })";
6492*8975f5c5SAndroid Build Coastguard Worker 
6493*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
6494*8975f5c5SAndroid Build Coastguard Worker     GLint sampleCondition = glGetUniformLocation(program, "sampleCondition");
6495*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
6496*8975f5c5SAndroid Build Coastguard Worker 
6497*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
6498*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
6499*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
6500*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
6501*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
6502*8975f5c5SAndroid Build Coastguard Worker 
6503*8975f5c5SAndroid Build Coastguard Worker     // Render to tex with tex bound but not sampled
6504*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
6505*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
6506*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
6507*8975f5c5SAndroid Build Coastguard Worker     const GLenum buffers[]{GL_COLOR_ATTACHMENT0};
6508*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(1, buffers);
6509*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(sampleCondition, 0);
6510*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
6511*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6512*8975f5c5SAndroid Build Coastguard Worker 
6513*8975f5c5SAndroid Build Coastguard Worker     // Render to default framebuffer with tex bound and sampled
6514*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
6515*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(sampleCondition, 1);
6516*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
6517*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6518*8975f5c5SAndroid Build Coastguard Worker }
6519*8975f5c5SAndroid Build Coastguard Worker 
6520*8975f5c5SAndroid Build Coastguard Worker // Tests change of framebuffer dimensions vs gl_FragCoord.
TEST_P(FramebufferTest_ES3,FramebufferDimensionsChangeAndFragCoord)6521*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, FramebufferDimensionsChangeAndFragCoord)
6522*8975f5c5SAndroid Build Coastguard Worker {
6523*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(#version 300 es
6524*8975f5c5SAndroid Build Coastguard Worker precision highp float;
6525*8975f5c5SAndroid Build Coastguard Worker uniform float height;
6526*8975f5c5SAndroid Build Coastguard Worker void main()
6527*8975f5c5SAndroid Build Coastguard Worker {
6528*8975f5c5SAndroid Build Coastguard Worker     // gl_VertexID    x    y
6529*8975f5c5SAndroid Build Coastguard Worker     //      0        -1   -1
6530*8975f5c5SAndroid Build Coastguard Worker     //      1         1   -1
6531*8975f5c5SAndroid Build Coastguard Worker     //      2        -1    1
6532*8975f5c5SAndroid Build Coastguard Worker     //      3         1    1
6533*8975f5c5SAndroid Build Coastguard Worker     int bit0 = gl_VertexID & 1;
6534*8975f5c5SAndroid Build Coastguard Worker     int bit1 = gl_VertexID >> 1;
6535*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, gl_VertexID % 2 == 0 ? -1 : 1, 1);
6536*8975f5c5SAndroid Build Coastguard Worker })";
6537*8975f5c5SAndroid Build Coastguard Worker 
6538*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
6539*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
6540*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
6541*8975f5c5SAndroid Build Coastguard Worker void main()
6542*8975f5c5SAndroid Build Coastguard Worker {
6543*8975f5c5SAndroid Build Coastguard Worker     float red = gl_FragCoord.x < 10. ? 1.0 : 0.0;
6544*8975f5c5SAndroid Build Coastguard Worker     float green = gl_FragCoord.y < 25. ? 1.0 : 0.0;
6545*8975f5c5SAndroid Build Coastguard Worker     colorOut = vec4(red, green, 0, 1);
6546*8975f5c5SAndroid Build Coastguard Worker })";
6547*8975f5c5SAndroid Build Coastguard Worker 
6548*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
6549*8975f5c5SAndroid Build Coastguard Worker 
6550*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kWidth1       = 99;
6551*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kHeight1      = 142;
6552*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kWidth2       = 75;
6553*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kHeight2      = 167;
6554*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kRenderSplitX = 10;
6555*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kRenderSplitY = 25;
6556*8975f5c5SAndroid Build Coastguard Worker 
6557*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, std::max(kWidth1, kWidth2), std::max(kHeight1, kHeight2));
6558*8975f5c5SAndroid Build Coastguard Worker 
6559*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex1, tex2;
6560*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex1);
6561*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth1, kHeight1);
6562*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2);
6563*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth2, kHeight2);
6564*8975f5c5SAndroid Build Coastguard Worker 
6565*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
6566*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6567*8975f5c5SAndroid Build Coastguard Worker 
6568*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1, 0);
6569*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6570*8975f5c5SAndroid Build Coastguard Worker 
6571*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
6572*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
6573*8975f5c5SAndroid Build Coastguard Worker 
6574*8975f5c5SAndroid Build Coastguard Worker     // Verify results
6575*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kRenderSplitX, kRenderSplitY, GLColor::yellow);
6576*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, kRenderSplitY, kRenderSplitX, kHeight1 - kRenderSplitY, GLColor::red);
6577*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kRenderSplitX, 0, kWidth1 - kRenderSplitX, kRenderSplitY, GLColor::green);
6578*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kRenderSplitX, kRenderSplitY, kWidth1 - kRenderSplitX,
6579*8975f5c5SAndroid Build Coastguard Worker                          kHeight1 - kRenderSplitY, GLColor::black);
6580*8975f5c5SAndroid Build Coastguard Worker 
6581*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2, 0);
6582*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6583*8975f5c5SAndroid Build Coastguard Worker 
6584*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
6585*8975f5c5SAndroid Build Coastguard Worker 
6586*8975f5c5SAndroid Build Coastguard Worker     // Verify results
6587*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kRenderSplitX, kRenderSplitY, GLColor::yellow);
6588*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, kRenderSplitY, kRenderSplitX, kHeight2 - kRenderSplitY, GLColor::red);
6589*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kRenderSplitX, 0, kWidth2 - kRenderSplitX, kRenderSplitY, GLColor::green);
6590*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kRenderSplitX, kRenderSplitY, kWidth2 - kRenderSplitX,
6591*8975f5c5SAndroid Build Coastguard Worker                          kHeight2 - kRenderSplitY, GLColor::black);
6592*8975f5c5SAndroid Build Coastguard Worker 
6593*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6594*8975f5c5SAndroid Build Coastguard Worker }
6595*8975f5c5SAndroid Build Coastguard Worker 
6596*8975f5c5SAndroid Build Coastguard Worker // Tests change of surface dimensions vs gl_FragCoord.
TEST_P(FramebufferTest_ES3,SurfaceDimensionsChangeAndFragCoord)6597*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, SurfaceDimensionsChangeAndFragCoord)
6598*8975f5c5SAndroid Build Coastguard Worker {
6599*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(#version 300 es
6600*8975f5c5SAndroid Build Coastguard Worker precision highp float;
6601*8975f5c5SAndroid Build Coastguard Worker uniform float height;
6602*8975f5c5SAndroid Build Coastguard Worker void main()
6603*8975f5c5SAndroid Build Coastguard Worker {
6604*8975f5c5SAndroid Build Coastguard Worker     // gl_VertexID    x    y
6605*8975f5c5SAndroid Build Coastguard Worker     //      0        -1   -1
6606*8975f5c5SAndroid Build Coastguard Worker     //      1         1   -1
6607*8975f5c5SAndroid Build Coastguard Worker     //      2        -1    1
6608*8975f5c5SAndroid Build Coastguard Worker     //      3         1    1
6609*8975f5c5SAndroid Build Coastguard Worker     int bit0 = gl_VertexID & 1;
6610*8975f5c5SAndroid Build Coastguard Worker     int bit1 = gl_VertexID >> 1;
6611*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, gl_VertexID % 2 == 0 ? -1 : 1, 1);
6612*8975f5c5SAndroid Build Coastguard Worker })";
6613*8975f5c5SAndroid Build Coastguard Worker 
6614*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
6615*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
6616*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
6617*8975f5c5SAndroid Build Coastguard Worker void main()
6618*8975f5c5SAndroid Build Coastguard Worker {
6619*8975f5c5SAndroid Build Coastguard Worker     float red = gl_FragCoord.x < 10. ? 1.0 : 0.0;
6620*8975f5c5SAndroid Build Coastguard Worker     float green = gl_FragCoord.y < 25. ? 1.0 : 0.0;
6621*8975f5c5SAndroid Build Coastguard Worker     colorOut = vec4(red, green, 0, 1);
6622*8975f5c5SAndroid Build Coastguard Worker })";
6623*8975f5c5SAndroid Build Coastguard Worker 
6624*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
6625*8975f5c5SAndroid Build Coastguard Worker 
6626*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kWidth1       = 99;
6627*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kHeight1      = 142;
6628*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kWidth2       = 75;
6629*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kHeight2      = 167;
6630*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kRenderSplitX = 10;
6631*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kRenderSplitY = 25;
6632*8975f5c5SAndroid Build Coastguard Worker 
6633*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, std::max(kWidth1, kWidth2), std::max(kHeight1, kHeight2));
6634*8975f5c5SAndroid Build Coastguard Worker 
6635*8975f5c5SAndroid Build Coastguard Worker     const bool isSwappedDimensions =
6636*8975f5c5SAndroid Build Coastguard Worker         getEGLWindow()->isFeatureEnabled(Feature::EmulatedPrerotation90) ||
6637*8975f5c5SAndroid Build Coastguard Worker         getEGLWindow()->isFeatureEnabled(Feature::EmulatedPrerotation270);
6638*8975f5c5SAndroid Build Coastguard Worker 
6639*8975f5c5SAndroid Build Coastguard Worker     auto resizeWindow = [this, isSwappedDimensions](GLuint width, GLuint height) {
6640*8975f5c5SAndroid Build Coastguard Worker         if (isSwappedDimensions)
6641*8975f5c5SAndroid Build Coastguard Worker         {
6642*8975f5c5SAndroid Build Coastguard Worker             getOSWindow()->resize(height, width);
6643*8975f5c5SAndroid Build Coastguard Worker         }
6644*8975f5c5SAndroid Build Coastguard Worker         else
6645*8975f5c5SAndroid Build Coastguard Worker         {
6646*8975f5c5SAndroid Build Coastguard Worker             getOSWindow()->resize(width, height);
6647*8975f5c5SAndroid Build Coastguard Worker         }
6648*8975f5c5SAndroid Build Coastguard Worker         swapBuffers();
6649*8975f5c5SAndroid Build Coastguard Worker     };
6650*8975f5c5SAndroid Build Coastguard Worker 
6651*8975f5c5SAndroid Build Coastguard Worker     resizeWindow(kWidth1, kHeight1);
6652*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
6653*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
6654*8975f5c5SAndroid Build Coastguard Worker 
6655*8975f5c5SAndroid Build Coastguard Worker     // Verify results
6656*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kRenderSplitX, kRenderSplitY, GLColor::yellow);
6657*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, kRenderSplitY, kRenderSplitX, kHeight1 - kRenderSplitY, GLColor::red);
6658*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kRenderSplitX, 0, kWidth1 - kRenderSplitX, kRenderSplitY, GLColor::green);
6659*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kRenderSplitX, kRenderSplitY, kWidth1 - kRenderSplitX,
6660*8975f5c5SAndroid Build Coastguard Worker                          kHeight1 - kRenderSplitY, GLColor::black);
6661*8975f5c5SAndroid Build Coastguard Worker 
6662*8975f5c5SAndroid Build Coastguard Worker     resizeWindow(kWidth2, kHeight2);
6663*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
6664*8975f5c5SAndroid Build Coastguard Worker 
6665*8975f5c5SAndroid Build Coastguard Worker     // Verify results
6666*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kRenderSplitX, kRenderSplitY, GLColor::yellow);
6667*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, kRenderSplitY, kRenderSplitX, kHeight2 - kRenderSplitY, GLColor::red);
6668*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kRenderSplitX, 0, kWidth2 - kRenderSplitX, kRenderSplitY, GLColor::green);
6669*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(kRenderSplitX, kRenderSplitY, kWidth2 - kRenderSplitX,
6670*8975f5c5SAndroid Build Coastguard Worker                          kHeight2 - kRenderSplitY, GLColor::black);
6671*8975f5c5SAndroid Build Coastguard Worker 
6672*8975f5c5SAndroid Build Coastguard Worker     // Reset window to original dimensions
6673*8975f5c5SAndroid Build Coastguard Worker     resizeWindow(kWidth, kHeight);
6674*8975f5c5SAndroid Build Coastguard Worker 
6675*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6676*8975f5c5SAndroid Build Coastguard Worker }
6677*8975f5c5SAndroid Build Coastguard Worker 
6678*8975f5c5SAndroid Build Coastguard Worker // Tests blits between draw and read surfaces with different pre-rotation values.
TEST_P(FramebufferTest_ES3,BlitWithDifferentPreRotations)6679*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, BlitWithDifferentPreRotations)
6680*8975f5c5SAndroid Build Coastguard Worker {
6681*8975f5c5SAndroid Build Coastguard Worker     // TODO(anglebug.com/42266059): Untriaged bot failures with non-Vulkan backends
6682*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsVulkan());
6683*8975f5c5SAndroid Build Coastguard Worker 
6684*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6685*8975f5c5SAndroid Build Coastguard Worker     ASSERT(window);
6686*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config   = window->getConfig();
6687*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = window->getContext();
6688*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay dpy     = window->getDisplay();
6689*8975f5c5SAndroid Build Coastguard Worker     EGLint surfaceType = 0;
6690*8975f5c5SAndroid Build Coastguard Worker 
6691*8975f5c5SAndroid Build Coastguard Worker     // Skip if pbuffer surface is not supported
6692*8975f5c5SAndroid Build Coastguard Worker     eglGetConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType);
6693*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF((surfaceType & EGL_PBUFFER_BIT) == 0);
6694*8975f5c5SAndroid Build Coastguard Worker 
6695*8975f5c5SAndroid Build Coastguard Worker     const EGLint surfaceWidth        = static_cast<EGLint>(getWindowWidth());
6696*8975f5c5SAndroid Build Coastguard Worker     const EGLint surfaceHeight       = static_cast<EGLint>(getWindowHeight());
6697*8975f5c5SAndroid Build Coastguard Worker     const EGLint pBufferAttributes[] = {
6698*8975f5c5SAndroid Build Coastguard Worker         EGL_WIDTH, surfaceWidth, EGL_HEIGHT, surfaceHeight, EGL_NONE,
6699*8975f5c5SAndroid Build Coastguard Worker     };
6700*8975f5c5SAndroid Build Coastguard Worker 
6701*8975f5c5SAndroid Build Coastguard Worker     // Create Pbuffer surface
6702*8975f5c5SAndroid Build Coastguard Worker     EGLSurface pbufferSurface = eglCreatePbufferSurface(dpy, config, pBufferAttributes);
6703*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(pbufferSurface, EGL_NO_SURFACE);
6704*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6705*8975f5c5SAndroid Build Coastguard Worker 
6706*8975f5c5SAndroid Build Coastguard Worker     EGLSurface windowSurface = window->getSurface();
6707*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(windowSurface, EGL_NO_SURFACE);
6708*8975f5c5SAndroid Build Coastguard Worker 
6709*8975f5c5SAndroid Build Coastguard Worker     // Clear window surface with red color
6710*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglMakeCurrent(dpy, windowSurface, windowSurface, context));
6711*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6712*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1, 0, 0, 1);
6713*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6714*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, surfaceWidth, surfaceHeight, GLColor::red);
6715*8975f5c5SAndroid Build Coastguard Worker 
6716*8975f5c5SAndroid Build Coastguard Worker     // Blit from window surface to pbuffer surface and expect red color
6717*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglMakeCurrent(dpy, pbufferSurface, windowSurface, context));
6718*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6719*8975f5c5SAndroid Build Coastguard Worker 
6720*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, surfaceWidth, surfaceHeight, 0, 0, surfaceWidth, surfaceHeight,
6721*8975f5c5SAndroid Build Coastguard Worker                       GL_COLOR_BUFFER_BIT, GL_NEAREST);
6722*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6723*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, surfaceWidth, surfaceHeight, GLColor::red);
6724*8975f5c5SAndroid Build Coastguard Worker 
6725*8975f5c5SAndroid Build Coastguard Worker     // Clear pbuffer surface with blue color
6726*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglMakeCurrent(dpy, pbufferSurface, pbufferSurface, context));
6727*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6728*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 1, 1);
6729*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6730*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, surfaceWidth, surfaceHeight, GLColor::blue);
6731*8975f5c5SAndroid Build Coastguard Worker 
6732*8975f5c5SAndroid Build Coastguard Worker     // Blit from pbuffer surface to window surface and expect blue color
6733*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglMakeCurrent(dpy, windowSurface, pbufferSurface, context));
6734*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6735*8975f5c5SAndroid Build Coastguard Worker 
6736*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, surfaceWidth, surfaceHeight, 0, 0, surfaceWidth, surfaceHeight,
6737*8975f5c5SAndroid Build Coastguard Worker                       GL_COLOR_BUFFER_BIT, GL_NEAREST);
6738*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6739*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, surfaceWidth, surfaceHeight, GLColor::blue);
6740*8975f5c5SAndroid Build Coastguard Worker 
6741*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglMakeCurrent(dpy, windowSurface, windowSurface, context));
6742*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6743*8975f5c5SAndroid Build Coastguard Worker 
6744*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglDestroySurface(dpy, pbufferSurface));
6745*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6746*8975f5c5SAndroid Build Coastguard Worker }
6747*8975f5c5SAndroid Build Coastguard Worker 
6748*8975f5c5SAndroid Build Coastguard Worker // Tests draw to surfaces with different pre-rotation values.
TEST_P(FramebufferTest_ES3,DrawWithDifferentPreRotations)6749*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES3, DrawWithDifferentPreRotations)
6750*8975f5c5SAndroid Build Coastguard Worker {
6751*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6752*8975f5c5SAndroid Build Coastguard Worker     ASSERT(window);
6753*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config   = window->getConfig();
6754*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = window->getContext();
6755*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay dpy     = window->getDisplay();
6756*8975f5c5SAndroid Build Coastguard Worker     EGLint surfaceType = 0;
6757*8975f5c5SAndroid Build Coastguard Worker 
6758*8975f5c5SAndroid Build Coastguard Worker     // Skip if pbuffer surface is not supported
6759*8975f5c5SAndroid Build Coastguard Worker     eglGetConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType);
6760*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF((surfaceType & EGL_PBUFFER_BIT) == 0);
6761*8975f5c5SAndroid Build Coastguard Worker 
6762*8975f5c5SAndroid Build Coastguard Worker     const EGLint surfaceWidth        = static_cast<EGLint>(getWindowWidth());
6763*8975f5c5SAndroid Build Coastguard Worker     const EGLint surfaceHeight       = static_cast<EGLint>(getWindowHeight());
6764*8975f5c5SAndroid Build Coastguard Worker     const EGLint pBufferAttributes[] = {
6765*8975f5c5SAndroid Build Coastguard Worker         EGL_WIDTH, surfaceWidth, EGL_HEIGHT, surfaceHeight, EGL_NONE,
6766*8975f5c5SAndroid Build Coastguard Worker     };
6767*8975f5c5SAndroid Build Coastguard Worker 
6768*8975f5c5SAndroid Build Coastguard Worker     // Create Pbuffer surface
6769*8975f5c5SAndroid Build Coastguard Worker     EGLSurface pbufferSurface = eglCreatePbufferSurface(dpy, config, pBufferAttributes);
6770*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(pbufferSurface, EGL_NO_SURFACE);
6771*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6772*8975f5c5SAndroid Build Coastguard Worker 
6773*8975f5c5SAndroid Build Coastguard Worker     EGLSurface windowSurface = window->getSurface();
6774*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(windowSurface, EGL_NO_SURFACE);
6775*8975f5c5SAndroid Build Coastguard Worker 
6776*8975f5c5SAndroid Build Coastguard Worker     constexpr char kCheckered2FS[] = R"(precision highp float;
6777*8975f5c5SAndroid Build Coastguard Worker varying vec4 v_position;
6778*8975f5c5SAndroid Build Coastguard Worker 
6779*8975f5c5SAndroid Build Coastguard Worker void main()
6780*8975f5c5SAndroid Build Coastguard Worker {
6781*8975f5c5SAndroid Build Coastguard Worker     bool isLeft = v_position.x < 0.0;
6782*8975f5c5SAndroid Build Coastguard Worker     bool isTop = v_position.y < 0.0;
6783*8975f5c5SAndroid Build Coastguard Worker     if (isLeft)
6784*8975f5c5SAndroid Build Coastguard Worker     {
6785*8975f5c5SAndroid Build Coastguard Worker         if (isTop)
6786*8975f5c5SAndroid Build Coastguard Worker         {
6787*8975f5c5SAndroid Build Coastguard Worker             gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
6788*8975f5c5SAndroid Build Coastguard Worker         }
6789*8975f5c5SAndroid Build Coastguard Worker         else
6790*8975f5c5SAndroid Build Coastguard Worker         {
6791*8975f5c5SAndroid Build Coastguard Worker             gl_FragColor = vec4(0.0, 1.0, 1.0, 1.0);
6792*8975f5c5SAndroid Build Coastguard Worker         }
6793*8975f5c5SAndroid Build Coastguard Worker     }
6794*8975f5c5SAndroid Build Coastguard Worker     else
6795*8975f5c5SAndroid Build Coastguard Worker     {
6796*8975f5c5SAndroid Build Coastguard Worker         if (isTop)
6797*8975f5c5SAndroid Build Coastguard Worker         {
6798*8975f5c5SAndroid Build Coastguard Worker             gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);
6799*8975f5c5SAndroid Build Coastguard Worker         }
6800*8975f5c5SAndroid Build Coastguard Worker         else
6801*8975f5c5SAndroid Build Coastguard Worker         {
6802*8975f5c5SAndroid Build Coastguard Worker             gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
6803*8975f5c5SAndroid Build Coastguard Worker         }
6804*8975f5c5SAndroid Build Coastguard Worker     }
6805*8975f5c5SAndroid Build Coastguard Worker })";
6806*8975f5c5SAndroid Build Coastguard Worker 
6807*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(checkerProgram, essl1_shaders::vs::Passthrough(),
6808*8975f5c5SAndroid Build Coastguard Worker                      essl1_shaders::fs::Checkered());
6809*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(checkerProgram2, essl1_shaders::vs::Passthrough(), kCheckered2FS);
6810*8975f5c5SAndroid Build Coastguard Worker 
6811*8975f5c5SAndroid Build Coastguard Worker     // The test does the following:
6812*8975f5c5SAndroid Build Coastguard Worker     //
6813*8975f5c5SAndroid Build Coastguard Worker     // 1. draw checkered to window (rotated)
6814*8975f5c5SAndroid Build Coastguard Worker     // 2. draw checkered to pbuffer (not rotated)
6815*8975f5c5SAndroid Build Coastguard Worker     // 3. verify rendering to window, draw checkered2, verify again
6816*8975f5c5SAndroid Build Coastguard Worker     // 4. verify rendering to pbuffer, draw checkered2, verify again
6817*8975f5c5SAndroid Build Coastguard Worker     //
6818*8975f5c5SAndroid Build Coastguard Worker     // Step 2 ensures that the correct state is used after a change to the bound surface (from
6819*8975f5c5SAndroid Build Coastguard Worker     // rotated to not). Step 3 ensures the same from not rotated to rotated.  Step 4 is a redundant
6820*8975f5c5SAndroid Build Coastguard Worker     // check.
6821*8975f5c5SAndroid Build Coastguard Worker 
6822*8975f5c5SAndroid Build Coastguard Worker     // Step 1
6823*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglMakeCurrent(dpy, windowSurface, windowSurface, context));
6824*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6825*8975f5c5SAndroid Build Coastguard Worker 
6826*8975f5c5SAndroid Build Coastguard Worker     drawQuad(checkerProgram, essl1_shaders::PositionAttrib(), 0);
6827*8975f5c5SAndroid Build Coastguard Worker 
6828*8975f5c5SAndroid Build Coastguard Worker     // Step 2
6829*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglMakeCurrent(dpy, pbufferSurface, windowSurface, context));
6830*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6831*8975f5c5SAndroid Build Coastguard Worker 
6832*8975f5c5SAndroid Build Coastguard Worker     drawQuad(checkerProgram, essl1_shaders::PositionAttrib(), 0);
6833*8975f5c5SAndroid Build Coastguard Worker 
6834*8975f5c5SAndroid Build Coastguard Worker     // Step 3
6835*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglMakeCurrent(dpy, windowSurface, windowSurface, context));
6836*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6837*8975f5c5SAndroid Build Coastguard Worker 
6838*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6839*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, surfaceHeight - 1, GLColor::green);
6840*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(surfaceWidth - 1, 0, GLColor::blue);
6841*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(surfaceWidth - 1, surfaceHeight - 1, GLColor::yellow);
6842*8975f5c5SAndroid Build Coastguard Worker 
6843*8975f5c5SAndroid Build Coastguard Worker     drawQuad(checkerProgram2, essl1_shaders::PositionAttrib(), 0);
6844*8975f5c5SAndroid Build Coastguard Worker 
6845*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
6846*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, surfaceHeight - 1, GLColor::cyan);
6847*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(surfaceWidth - 1, 0, GLColor::magenta);
6848*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(surfaceWidth - 1, surfaceHeight - 1, GLColor::white);
6849*8975f5c5SAndroid Build Coastguard Worker 
6850*8975f5c5SAndroid Build Coastguard Worker     // Step 4
6851*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglMakeCurrent(dpy, pbufferSurface, pbufferSurface, context));
6852*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6853*8975f5c5SAndroid Build Coastguard Worker 
6854*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6855*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, surfaceHeight - 1, GLColor::green);
6856*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(surfaceWidth - 1, 0, GLColor::blue);
6857*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(surfaceWidth - 1, surfaceHeight - 1, GLColor::yellow);
6858*8975f5c5SAndroid Build Coastguard Worker 
6859*8975f5c5SAndroid Build Coastguard Worker     drawQuad(checkerProgram2, essl1_shaders::PositionAttrib(), 0);
6860*8975f5c5SAndroid Build Coastguard Worker 
6861*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
6862*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, surfaceHeight - 1, GLColor::cyan);
6863*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(surfaceWidth - 1, 0, GLColor::magenta);
6864*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(surfaceWidth - 1, surfaceHeight - 1, GLColor::white);
6865*8975f5c5SAndroid Build Coastguard Worker 
6866*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglMakeCurrent(dpy, windowSurface, windowSurface, context));
6867*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6868*8975f5c5SAndroid Build Coastguard Worker 
6869*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglDestroySurface(dpy, pbufferSurface));
6870*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6871*8975f5c5SAndroid Build Coastguard Worker }
6872*8975f5c5SAndroid Build Coastguard Worker 
6873*8975f5c5SAndroid Build Coastguard Worker class FramebufferExtensionsTest : public FramebufferTest
6874*8975f5c5SAndroid Build Coastguard Worker {
6875*8975f5c5SAndroid Build Coastguard Worker   protected:
FramebufferExtensionsTest()6876*8975f5c5SAndroid Build Coastguard Worker     FramebufferExtensionsTest() { setExtensionsEnabled(false); }
6877*8975f5c5SAndroid Build Coastguard Worker 
checkParameter(GLenum expectedComponentType)6878*8975f5c5SAndroid Build Coastguard Worker     void checkParameter(GLenum expectedComponentType)
6879*8975f5c5SAndroid Build Coastguard Worker     {
6880*8975f5c5SAndroid Build Coastguard Worker         GLint componentType = 0;
6881*8975f5c5SAndroid Build Coastguard Worker         glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
6882*8975f5c5SAndroid Build Coastguard Worker                                               GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT,
6883*8975f5c5SAndroid Build Coastguard Worker                                               &componentType);
6884*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(componentType, static_cast<GLint>(expectedComponentType));
6885*8975f5c5SAndroid Build Coastguard Worker         if (expectedComponentType)
6886*8975f5c5SAndroid Build Coastguard Worker         {
6887*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_NO_ERROR();
6888*8975f5c5SAndroid Build Coastguard Worker         }
6889*8975f5c5SAndroid Build Coastguard Worker         else
6890*8975f5c5SAndroid Build Coastguard Worker         {
6891*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_ERROR(GL_INVALID_ENUM);
6892*8975f5c5SAndroid Build Coastguard Worker         }
6893*8975f5c5SAndroid Build Coastguard Worker     }
6894*8975f5c5SAndroid Build Coastguard Worker 
checkTexture(GLenum format,GLenum type,GLenum expectedComponentType)6895*8975f5c5SAndroid Build Coastguard Worker     void checkTexture(GLenum format, GLenum type, GLenum expectedComponentType)
6896*8975f5c5SAndroid Build Coastguard Worker     {
6897*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
6898*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
6899*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, format, 8, 8, 0, format, type, nullptr);
6900*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
6901*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
6902*8975f5c5SAndroid Build Coastguard Worker         checkParameter(expectedComponentType);
6903*8975f5c5SAndroid Build Coastguard Worker     }
6904*8975f5c5SAndroid Build Coastguard Worker 
checkRenderbuffer(GLenum format,GLenum expectedComponentType)6905*8975f5c5SAndroid Build Coastguard Worker     void checkRenderbuffer(GLenum format, GLenum expectedComponentType)
6906*8975f5c5SAndroid Build Coastguard Worker     {
6907*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer renderbuffer;
6908*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
6909*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, format, 8, 8);
6910*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
6911*8975f5c5SAndroid Build Coastguard Worker                                   renderbuffer);
6912*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
6913*8975f5c5SAndroid Build Coastguard Worker         checkParameter(expectedComponentType);
6914*8975f5c5SAndroid Build Coastguard Worker     }
6915*8975f5c5SAndroid Build Coastguard Worker 
test(const char * extensionName,GLenum format,bool supportsRenderbuffer)6916*8975f5c5SAndroid Build Coastguard Worker     void test(const char *extensionName, GLenum format, bool supportsRenderbuffer)
6917*8975f5c5SAndroid Build Coastguard Worker     {
6918*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
6919*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6920*8975f5c5SAndroid Build Coastguard Worker         checkTexture(GL_RGBA, GL_UNSIGNED_BYTE, 0);
6921*8975f5c5SAndroid Build Coastguard Worker         checkRenderbuffer(GL_RGB565, 0);
6922*8975f5c5SAndroid Build Coastguard Worker 
6923*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled(extensionName));
6924*8975f5c5SAndroid Build Coastguard Worker 
6925*8975f5c5SAndroid Build Coastguard Worker         checkTexture(GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED_EXT);
6926*8975f5c5SAndroid Build Coastguard Worker         checkRenderbuffer(GL_RGB565, GL_UNSIGNED_NORMALIZED_EXT);
6927*8975f5c5SAndroid Build Coastguard Worker 
6928*8975f5c5SAndroid Build Coastguard Worker         if (supportsRenderbuffer)
6929*8975f5c5SAndroid Build Coastguard Worker             checkRenderbuffer(format, GL_FLOAT);
6930*8975f5c5SAndroid Build Coastguard Worker     }
6931*8975f5c5SAndroid Build Coastguard Worker };
6932*8975f5c5SAndroid Build Coastguard Worker 
6933*8975f5c5SAndroid Build Coastguard Worker // Tests that GL_EXT_color_buffer_half_float enables component type state queries on
6934*8975f5c5SAndroid Build Coastguard Worker // framebuffer attachments.
TEST_P(FramebufferExtensionsTest,ColorBufferHalfFloat)6935*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferExtensionsTest, ColorBufferHalfFloat)
6936*8975f5c5SAndroid Build Coastguard Worker {
6937*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_OES_texture_half_float"));
6938*8975f5c5SAndroid Build Coastguard Worker     test("GL_EXT_color_buffer_half_float", GL_RGBA16F_EXT, true);
6939*8975f5c5SAndroid Build Coastguard Worker }
6940*8975f5c5SAndroid Build Coastguard Worker 
6941*8975f5c5SAndroid Build Coastguard Worker // Tests that GL_CHROMIUM_color_buffer_float_rgb enables component type state queries on
6942*8975f5c5SAndroid Build Coastguard Worker // framebuffer attachments.
TEST_P(FramebufferExtensionsTest,ColorBufferFloatRgb)6943*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferExtensionsTest, ColorBufferFloatRgb)
6944*8975f5c5SAndroid Build Coastguard Worker {
6945*8975f5c5SAndroid Build Coastguard Worker     test("GL_CHROMIUM_color_buffer_float_rgb", GL_RGB32F_EXT, false);
6946*8975f5c5SAndroid Build Coastguard Worker }
6947*8975f5c5SAndroid Build Coastguard Worker 
6948*8975f5c5SAndroid Build Coastguard Worker // Tests that GL_CHROMIUM_color_buffer_float_rgba enables component type state queries on
6949*8975f5c5SAndroid Build Coastguard Worker // framebuffer attachments.
TEST_P(FramebufferExtensionsTest,ColorBufferFloatRgba)6950*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferExtensionsTest, ColorBufferFloatRgba)
6951*8975f5c5SAndroid Build Coastguard Worker {
6952*8975f5c5SAndroid Build Coastguard Worker     test("GL_CHROMIUM_color_buffer_float_rgba", GL_RGBA32F_EXT, true);
6953*8975f5c5SAndroid Build Coastguard Worker }
6954*8975f5c5SAndroid Build Coastguard Worker 
6955*8975f5c5SAndroid Build Coastguard Worker class DefaultFramebufferTest : public ANGLETest<>
6956*8975f5c5SAndroid Build Coastguard Worker {
6957*8975f5c5SAndroid Build Coastguard Worker   protected:
DefaultFramebufferTest()6958*8975f5c5SAndroid Build Coastguard Worker     DefaultFramebufferTest()
6959*8975f5c5SAndroid Build Coastguard Worker     {
6960*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(kWidth);
6961*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(kHeight);
6962*8975f5c5SAndroid Build Coastguard Worker     }
6963*8975f5c5SAndroid Build Coastguard Worker 
6964*8975f5c5SAndroid Build Coastguard Worker     static constexpr GLsizei kWidth  = 16;
6965*8975f5c5SAndroid Build Coastguard Worker     static constexpr GLsizei kHeight = 16;
6966*8975f5c5SAndroid Build Coastguard Worker };
6967*8975f5c5SAndroid Build Coastguard Worker 
6968*8975f5c5SAndroid Build Coastguard Worker // glReadPixel from default FBO with format and type retrieved from
6969*8975f5c5SAndroid Build Coastguard Worker // GL_IMPLEMENTATION_COLOR_READ_FORMAT and GL_IMPLEMENTATION_COLOR_READ_TYPE
6970*8975f5c5SAndroid Build Coastguard Worker // should work
TEST_P(DefaultFramebufferTest,ReadFromDefaultFBOOnDefaultEGLWindowSurface)6971*8975f5c5SAndroid Build Coastguard Worker TEST_P(DefaultFramebufferTest, ReadFromDefaultFBOOnDefaultEGLWindowSurface)
6972*8975f5c5SAndroid Build Coastguard Worker {
6973*8975f5c5SAndroid Build Coastguard Worker     // Bind the default framebuffer
6974*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
6975*8975f5c5SAndroid Build Coastguard Worker 
6976*8975f5c5SAndroid Build Coastguard Worker     // Create shader programs
6977*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6978*8975f5c5SAndroid Build Coastguard Worker 
6979*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS1[] = R"(#version 300 es
6980*8975f5c5SAndroid Build Coastguard Worker in highp vec2 a_position;
6981*8975f5c5SAndroid Build Coastguard Worker in highp vec2 a_texcoord;
6982*8975f5c5SAndroid Build Coastguard Worker out highp vec2 texcoord;
6983*8975f5c5SAndroid Build Coastguard Worker void main()
6984*8975f5c5SAndroid Build Coastguard Worker {
6985*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(a_position, 0.0, 1.0);
6986*8975f5c5SAndroid Build Coastguard Worker     texcoord = a_texcoord;
6987*8975f5c5SAndroid Build Coastguard Worker })";
6988*8975f5c5SAndroid Build Coastguard Worker 
6989*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS1[] = R"(#version 300 es
6990*8975f5c5SAndroid Build Coastguard Worker precision highp float;
6991*8975f5c5SAndroid Build Coastguard Worker in highp vec2 texcoord;
6992*8975f5c5SAndroid Build Coastguard Worker out highp vec4 fragColor;
6993*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2D texSampler;
6994*8975f5c5SAndroid Build Coastguard Worker 
6995*8975f5c5SAndroid Build Coastguard Worker void main()
6996*8975f5c5SAndroid Build Coastguard Worker {
6997*8975f5c5SAndroid Build Coastguard Worker     fragColor = texture(texSampler, texcoord);
6998*8975f5c5SAndroid Build Coastguard Worker })";
6999*8975f5c5SAndroid Build Coastguard Worker 
7000*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS1, kFS1);
7001*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
7002*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7003*8975f5c5SAndroid Build Coastguard Worker 
7004*8975f5c5SAndroid Build Coastguard Worker     // Create Vertex data
7005*8975f5c5SAndroid Build Coastguard Worker     const std::vector<float> positions = {-1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f};
7006*8975f5c5SAndroid Build Coastguard Worker     GLBuffer vertexBuffer;
7007*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
7008*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(positions[0]) * positions.size(), positions.data(),
7009*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
7010*8975f5c5SAndroid Build Coastguard Worker     GLint vertexPosLocation = glGetAttribLocation(program, "a_position");
7011*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(vertexPosLocation, -1);
7012*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
7013*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(vertexPosLocation);
7014*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(vertexPosLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
7015*8975f5c5SAndroid Build Coastguard Worker 
7016*8975f5c5SAndroid Build Coastguard Worker     const std::vector<float> texcoords = {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f};
7017*8975f5c5SAndroid Build Coastguard Worker     GLBuffer texcoordBuffer;
7018*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, texcoordBuffer);
7019*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords[0]) * texcoords.size(), texcoords.data(),
7020*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
7021*8975f5c5SAndroid Build Coastguard Worker     GLint texCoordLocation = glGetAttribLocation(program, "a_texcoord");
7022*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(texCoordLocation, -1);
7023*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, texcoordBuffer);
7024*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(texCoordLocation);
7025*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(texCoordLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
7026*8975f5c5SAndroid Build Coastguard Worker 
7027*8975f5c5SAndroid Build Coastguard Worker     const std::vector<uint16_t> quadIndices = {0, 1, 2, 2, 1, 3};
7028*8975f5c5SAndroid Build Coastguard Worker     GLBuffer indexBuffer;
7029*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
7030*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quadIndices[0]) * quadIndices.size(),
7031*8975f5c5SAndroid Build Coastguard Worker                  quadIndices.data(), GL_STATIC_DRAW);
7032*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7033*8975f5c5SAndroid Build Coastguard Worker 
7034*8975f5c5SAndroid Build Coastguard Worker     // Create Texture
7035*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
7036*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
7037*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7038*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7039*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
7040*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
7041*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
7042*8975f5c5SAndroid Build Coastguard Worker 
7043*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> texData;
7044*8975f5c5SAndroid Build Coastguard Worker 
7045*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t width               = 4;
7046*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t height              = 4;
7047*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t bytePerColorChannel = 4;
7048*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t texColorPerChannel = 125;
7049*8975f5c5SAndroid Build Coastguard Worker 
7050*8975f5c5SAndroid Build Coastguard Worker     texData.resize(width * height * bytePerColorChannel);
7051*8975f5c5SAndroid Build Coastguard Worker 
7052*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < width * height; ++i)
7053*8975f5c5SAndroid Build Coastguard Worker     {
7054*8975f5c5SAndroid Build Coastguard Worker         texData.push_back(texColorPerChannel);
7055*8975f5c5SAndroid Build Coastguard Worker         texData.push_back(texColorPerChannel);
7056*8975f5c5SAndroid Build Coastguard Worker         texData.push_back(texColorPerChannel);
7057*8975f5c5SAndroid Build Coastguard Worker         texData.push_back(texColorPerChannel);
7058*8975f5c5SAndroid Build Coastguard Worker     }
7059*8975f5c5SAndroid Build Coastguard Worker 
7060*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
7061*8975f5c5SAndroid Build Coastguard Worker                  texData.data());
7062*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7063*8975f5c5SAndroid Build Coastguard Worker 
7064*8975f5c5SAndroid Build Coastguard Worker     // Initialize uniform values
7065*8975f5c5SAndroid Build Coastguard Worker     GLint uniformTextureSamplerLocation = glGetUniformLocation(program, "texSampler");
7066*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(uniformTextureSamplerLocation, 0);
7067*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7068*8975f5c5SAndroid Build Coastguard Worker 
7069*8975f5c5SAndroid Build Coastguard Worker     // Disable Dither
7070*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DITHER);
7071*8975f5c5SAndroid Build Coastguard Worker 
7072*8975f5c5SAndroid Build Coastguard Worker     // Draw quad
7073*8975f5c5SAndroid Build Coastguard Worker     glDrawElements(GL_TRIANGLES, quadIndices.size(), GL_UNSIGNED_BYTE, 0);
7074*8975f5c5SAndroid Build Coastguard Worker 
7075*8975f5c5SAndroid Build Coastguard Worker     // Get glReadPixel format and type
7076*8975f5c5SAndroid Build Coastguard Worker     GLint readFormat;
7077*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &readFormat);
7078*8975f5c5SAndroid Build Coastguard Worker 
7079*8975f5c5SAndroid Build Coastguard Worker     GLint readType;
7080*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &readType);
7081*8975f5c5SAndroid Build Coastguard Worker 
7082*8975f5c5SAndroid Build Coastguard Worker     // Read Pixel with glReadPixel
7083*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> renderResult;
7084*8975f5c5SAndroid Build Coastguard Worker     renderResult.resize(width * height * 4);
7085*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, width, height, readFormat, readType, renderResult.data());
7086*8975f5c5SAndroid Build Coastguard Worker 
7087*8975f5c5SAndroid Build Coastguard Worker     // glReadPixel with format and type retrieved from
7088*8975f5c5SAndroid Build Coastguard Worker     // GL_IMPLEMENTATION_COLOR_READ_FORMAT &
7089*8975f5c5SAndroid Build Coastguard Worker     // GL_IMPLEMENTATION_COLOR_READ_TYPE
7090*8975f5c5SAndroid Build Coastguard Worker     // should not trigger errors
7091*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7092*8975f5c5SAndroid Build Coastguard Worker }
7093*8975f5c5SAndroid Build Coastguard Worker 
7094*8975f5c5SAndroid Build Coastguard Worker // Test resolving the same framebuffer into two different ones
TEST_P(FramebufferTest_ES31,MultisampleResolveMultipleTimes)7095*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveMultipleTimes)
7096*8975f5c5SAndroid Build Coastguard Worker {
7097*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 16;
7098*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 20;
7099*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
7100*8975f5c5SAndroid Build Coastguard Worker 
7101*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
7102*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7103*8975f5c5SAndroid Build Coastguard Worker 
7104*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
7105*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
7106*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
7107*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7108*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
7109*8975f5c5SAndroid Build Coastguard Worker                            0);
7110*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7111*8975f5c5SAndroid Build Coastguard Worker 
7112*8975f5c5SAndroid Build Coastguard Worker     // Create two resolve FBOs and textures. Use different texture levels and layers.
7113*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
7114*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
7115*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, kWidth * 2, kHeight * 2);
7116*8975f5c5SAndroid Build Coastguard Worker 
7117*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
7118*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
7119*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture1, 1);
7120*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7121*8975f5c5SAndroid Build Coastguard Worker 
7122*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
7123*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, resolveTexture2);
7124*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 4, GL_RGBA8, kWidth * 4, kHeight * 4, 5);
7125*8975f5c5SAndroid Build Coastguard Worker 
7126*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
7127*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
7128*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, resolveTexture2, 2, 3);
7129*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7130*8975f5c5SAndroid Build Coastguard Worker 
7131*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7132*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
7133*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
7134*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
7135*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7136*8975f5c5SAndroid Build Coastguard Worker 
7137*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
7138*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
7139*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
7140*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7141*8975f5c5SAndroid Build Coastguard Worker 
7142*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO2);
7143*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
7144*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
7145*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7146*8975f5c5SAndroid Build Coastguard Worker 
7147*8975f5c5SAndroid Build Coastguard Worker     auto verify = [](GLuint fbo) {
7148*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
7149*8975f5c5SAndroid Build Coastguard Worker         constexpr uint8_t kWidthHalfPixelGradient  = 256 / kWidth / 2;
7150*8975f5c5SAndroid Build Coastguard Worker         constexpr uint8_t kHeightHalfPixelGradient = 256 / kHeight / 2;
7151*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(0, 0, kWidthHalfPixelGradient, kHeightHalfPixelGradient, 0, 255, 1.0);
7152*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(kWidth - 1, 0, 255 - kWidthHalfPixelGradient, kHeightHalfPixelGradient, 0,
7153*8975f5c5SAndroid Build Coastguard Worker                           255, 1.0);
7154*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(0, kHeight - 1, kWidthHalfPixelGradient, 255 - kHeightHalfPixelGradient,
7155*8975f5c5SAndroid Build Coastguard Worker                           0, 255, 1.0);
7156*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(kWidth - 1, kHeight - 1, 255 - kWidthHalfPixelGradient,
7157*8975f5c5SAndroid Build Coastguard Worker                           255 - kHeightHalfPixelGradient, 0, 255, 1.0);
7158*8975f5c5SAndroid Build Coastguard Worker     };
7159*8975f5c5SAndroid Build Coastguard Worker 
7160*8975f5c5SAndroid Build Coastguard Worker     verify(resolveFBO1);
7161*8975f5c5SAndroid Build Coastguard Worker     verify(resolveFBO2);
7162*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7163*8975f5c5SAndroid Build Coastguard Worker }
7164*8975f5c5SAndroid Build Coastguard Worker 
7165*8975f5c5SAndroid Build Coastguard Worker // Test resolving the same depth/stencil attachment into two different framebuffers
TEST_P(FramebufferTest_ES31,MultisampleDepthStencilResolveMultipleTimes)7166*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleDepthStencilResolveMultipleTimes)
7167*8975f5c5SAndroid Build Coastguard Worker {
7168*8975f5c5SAndroid Build Coastguard Worker     enum class DepthStencilResolve
7169*8975f5c5SAndroid Build Coastguard Worker     {
7170*8975f5c5SAndroid Build Coastguard Worker         Simultaneous,
7171*8975f5c5SAndroid Build Coastguard Worker         SeparateAspectsButSameFramebuffer,
7172*8975f5c5SAndroid Build Coastguard Worker         SeparateAspectsDifferentFramebuffers,
7173*8975f5c5SAndroid Build Coastguard Worker     };
7174*8975f5c5SAndroid Build Coastguard Worker 
7175*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 24;
7176*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 12;
7177*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
7178*8975f5c5SAndroid Build Coastguard Worker 
7179*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
7180*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7181*8975f5c5SAndroid Build Coastguard Worker 
7182*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
7183*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
7184*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kWidth, kHeight);
7185*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
7186*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
7187*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7188*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7189*8975f5c5SAndroid Build Coastguard Worker 
7190*8975f5c5SAndroid Build Coastguard Worker     // Create two resolve FBOs and textures. Use different texture levels and layers.
7191*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
7192*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
7193*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 4, GL_DEPTH24_STENCIL8, kWidth * 4, kHeight * 4);
7194*8975f5c5SAndroid Build Coastguard Worker 
7195*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
7196*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
7197*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
7198*8975f5c5SAndroid Build Coastguard Worker                            resolveTexture1, 2);
7199*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7200*8975f5c5SAndroid Build Coastguard Worker 
7201*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
7202*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture2);
7203*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_DEPTH24_STENCIL8, kWidth * 2, kHeight * 2);
7204*8975f5c5SAndroid Build Coastguard Worker 
7205*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
7206*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
7207*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
7208*8975f5c5SAndroid Build Coastguard Worker                            resolveTexture2, 1);
7209*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7210*8975f5c5SAndroid Build Coastguard Worker 
7211*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(red, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Red());
7212*8975f5c5SAndroid Build Coastguard Worker 
7213*8975f5c5SAndroid Build Coastguard Worker     auto runTest = [&](float depth, int stencil, DepthStencilResolve resolve) {
7214*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_DEPTH_TEST);
7215*8975f5c5SAndroid Build Coastguard Worker         glDepthFunc(GL_ALWAYS);
7216*8975f5c5SAndroid Build Coastguard Worker         glDepthMask(GL_TRUE);
7217*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_STENCIL_TEST);
7218*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_ALWAYS, stencil, 0xFF);
7219*8975f5c5SAndroid Build Coastguard Worker         glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
7220*8975f5c5SAndroid Build Coastguard Worker         glStencilMask(0xFF);
7221*8975f5c5SAndroid Build Coastguard Worker 
7222*8975f5c5SAndroid Build Coastguard Worker         // Initialize the depth/stencil image
7223*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7224*8975f5c5SAndroid Build Coastguard Worker         drawQuad(red, essl1_shaders::PositionAttrib(), depth);
7225*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7226*8975f5c5SAndroid Build Coastguard Worker 
7227*8975f5c5SAndroid Build Coastguard Worker         // Resolve depth and stencil, then verify the results
7228*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
7229*8975f5c5SAndroid Build Coastguard Worker         switch (resolve)
7230*8975f5c5SAndroid Build Coastguard Worker         {
7231*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::Simultaneous:
7232*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7233*8975f5c5SAndroid Build Coastguard Worker                                   GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7234*8975f5c5SAndroid Build Coastguard Worker                 break;
7235*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsButSameFramebuffer:
7236*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
7237*8975f5c5SAndroid Build Coastguard Worker                                   GL_NEAREST);
7238*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7239*8975f5c5SAndroid Build Coastguard Worker                                   GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7240*8975f5c5SAndroid Build Coastguard Worker                 break;
7241*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsDifferentFramebuffers:
7242*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
7243*8975f5c5SAndroid Build Coastguard Worker                                   GL_NEAREST);
7244*8975f5c5SAndroid Build Coastguard Worker                 break;
7245*8975f5c5SAndroid Build Coastguard Worker         }
7246*8975f5c5SAndroid Build Coastguard Worker 
7247*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO2);
7248*8975f5c5SAndroid Build Coastguard Worker         switch (resolve)
7249*8975f5c5SAndroid Build Coastguard Worker         {
7250*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::Simultaneous:
7251*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7252*8975f5c5SAndroid Build Coastguard Worker                                   GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7253*8975f5c5SAndroid Build Coastguard Worker                 break;
7254*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsButSameFramebuffer:
7255*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
7256*8975f5c5SAndroid Build Coastguard Worker                                   GL_NEAREST);
7257*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7258*8975f5c5SAndroid Build Coastguard Worker                                   GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7259*8975f5c5SAndroid Build Coastguard Worker                 break;
7260*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsDifferentFramebuffers:
7261*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7262*8975f5c5SAndroid Build Coastguard Worker                                   GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7263*8975f5c5SAndroid Build Coastguard Worker                 break;
7264*8975f5c5SAndroid Build Coastguard Worker         }
7265*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7266*8975f5c5SAndroid Build Coastguard Worker 
7267*8975f5c5SAndroid Build Coastguard Worker         verifyDepth(resolveFBO1, kWidth, kHeight, depth);
7268*8975f5c5SAndroid Build Coastguard Worker         if (resolve != DepthStencilResolve::SeparateAspectsDifferentFramebuffers)
7269*8975f5c5SAndroid Build Coastguard Worker         {
7270*8975f5c5SAndroid Build Coastguard Worker             verifyStencil(resolveFBO1, kWidth, kHeight, stencil);
7271*8975f5c5SAndroid Build Coastguard Worker             verifyDepth(resolveFBO2, kWidth, kHeight, depth);
7272*8975f5c5SAndroid Build Coastguard Worker         }
7273*8975f5c5SAndroid Build Coastguard Worker         verifyStencil(resolveFBO2, kWidth, kHeight, stencil);
7274*8975f5c5SAndroid Build Coastguard Worker     };
7275*8975f5c5SAndroid Build Coastguard Worker 
7276*8975f5c5SAndroid Build Coastguard Worker     runTest(0.8f, 0x55, DepthStencilResolve::Simultaneous);
7277*8975f5c5SAndroid Build Coastguard Worker     runTest(0.2f, 0x3A, DepthStencilResolve::SeparateAspectsButSameFramebuffer);
7278*8975f5c5SAndroid Build Coastguard Worker     runTest(0.5f, 0x98, DepthStencilResolve::SeparateAspectsDifferentFramebuffers);
7279*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7280*8975f5c5SAndroid Build Coastguard Worker }
7281*8975f5c5SAndroid Build Coastguard Worker 
7282*8975f5c5SAndroid Build Coastguard Worker // Test resolving the same framebuffer into two different ones with a draw in between
TEST_P(FramebufferTest_ES31,MultisampleResolveMultipleTimesWithDrawInBetween)7283*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveMultipleTimesWithDrawInBetween)
7284*8975f5c5SAndroid Build Coastguard Worker {
7285*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 16;
7286*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 20;
7287*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
7288*8975f5c5SAndroid Build Coastguard Worker 
7289*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
7290*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7291*8975f5c5SAndroid Build Coastguard Worker 
7292*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
7293*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
7294*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
7295*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7296*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texture,
7297*8975f5c5SAndroid Build Coastguard Worker                            0);
7298*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7299*8975f5c5SAndroid Build Coastguard Worker 
7300*8975f5c5SAndroid Build Coastguard Worker     // Create two resolve FBOs and textures. Use different texture levels and layers.
7301*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
7302*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
7303*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, kWidth * 2, kHeight * 2);
7304*8975f5c5SAndroid Build Coastguard Worker 
7305*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
7306*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
7307*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture1, 1);
7308*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7309*8975f5c5SAndroid Build Coastguard Worker 
7310*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
7311*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, resolveTexture2);
7312*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 4, GL_RGBA8, kWidth * 4, kHeight * 4, 5);
7313*8975f5c5SAndroid Build Coastguard Worker 
7314*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
7315*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
7316*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, resolveTexture2, 2, 3);
7317*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7318*8975f5c5SAndroid Build Coastguard Worker 
7319*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7320*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(),
7321*8975f5c5SAndroid Build Coastguard Worker                      essl31_shaders::fs::RedGreenGradient());
7322*8975f5c5SAndroid Build Coastguard Worker     drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
7323*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7324*8975f5c5SAndroid Build Coastguard Worker 
7325*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
7326*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
7327*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
7328*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7329*8975f5c5SAndroid Build Coastguard Worker 
7330*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
7331*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(redProgram, essl31_shaders::vs::Passthrough(), essl31_shaders::fs::Red());
7332*8975f5c5SAndroid Build Coastguard Worker     drawQuad(redProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
7333*8975f5c5SAndroid Build Coastguard Worker 
7334*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO2);
7335*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
7336*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
7337*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7338*8975f5c5SAndroid Build Coastguard Worker 
7339*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO1);
7340*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kWidthHalfPixelGradient  = 256 / kWidth / 2;
7341*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kHeightHalfPixelGradient = 256 / kHeight / 2;
7342*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kWidthHalfPixelGradient, kHeightHalfPixelGradient, 0, 255, 1.0);
7343*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kWidth - 1, 0, 255 - kWidthHalfPixelGradient, kHeightHalfPixelGradient, 0,
7344*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
7345*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, kHeight - 1, kWidthHalfPixelGradient, 255 - kHeightHalfPixelGradient, 0,
7346*8975f5c5SAndroid Build Coastguard Worker                       255, 1.0);
7347*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(kWidth - 1, kHeight - 1, 255 - kWidthHalfPixelGradient,
7348*8975f5c5SAndroid Build Coastguard Worker                       255 - kHeightHalfPixelGradient, 0, 255, 1.0);
7349*8975f5c5SAndroid Build Coastguard Worker 
7350*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO2);
7351*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::red);
7352*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7353*8975f5c5SAndroid Build Coastguard Worker }
7354*8975f5c5SAndroid Build Coastguard Worker 
7355*8975f5c5SAndroid Build Coastguard Worker // Test resolving the same depth/stencil framebuffer into two different ones with a draw in between
TEST_P(FramebufferTest_ES31,MultisampleDepthStencilResolveMultipleTimesWithDrawInBetween)7356*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleDepthStencilResolveMultipleTimesWithDrawInBetween)
7357*8975f5c5SAndroid Build Coastguard Worker {
7358*8975f5c5SAndroid Build Coastguard Worker     enum class DepthStencilResolve
7359*8975f5c5SAndroid Build Coastguard Worker     {
7360*8975f5c5SAndroid Build Coastguard Worker         Simultaneous,
7361*8975f5c5SAndroid Build Coastguard Worker         SeparateAspectsButSameFramebuffer,
7362*8975f5c5SAndroid Build Coastguard Worker         SeparateAspectsDifferentFramebuffers,
7363*8975f5c5SAndroid Build Coastguard Worker     };
7364*8975f5c5SAndroid Build Coastguard Worker 
7365*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 16;
7366*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 20;
7367*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
7368*8975f5c5SAndroid Build Coastguard Worker 
7369*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
7370*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7371*8975f5c5SAndroid Build Coastguard Worker 
7372*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
7373*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
7374*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kWidth, kHeight);
7375*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
7376*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
7377*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7378*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7379*8975f5c5SAndroid Build Coastguard Worker 
7380*8975f5c5SAndroid Build Coastguard Worker     // Create two resolve FBOs and textures. Use different texture levels and layers.
7381*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
7382*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
7383*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 4, GL_DEPTH24_STENCIL8, kWidth * 4, kHeight * 4);
7384*8975f5c5SAndroid Build Coastguard Worker 
7385*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
7386*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
7387*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
7388*8975f5c5SAndroid Build Coastguard Worker                            resolveTexture1, 2);
7389*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7390*8975f5c5SAndroid Build Coastguard Worker 
7391*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
7392*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture2);
7393*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_DEPTH24_STENCIL8, kWidth * 2, kHeight * 2);
7394*8975f5c5SAndroid Build Coastguard Worker 
7395*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
7396*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
7397*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
7398*8975f5c5SAndroid Build Coastguard Worker                            resolveTexture2, 1);
7399*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7400*8975f5c5SAndroid Build Coastguard Worker 
7401*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(red, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Red());
7402*8975f5c5SAndroid Build Coastguard Worker 
7403*8975f5c5SAndroid Build Coastguard Worker     auto runTest = [&](float depth1, int stencil1, float depth2, int stencil2,
7404*8975f5c5SAndroid Build Coastguard Worker                        DepthStencilResolve resolve) {
7405*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_DEPTH_TEST);
7406*8975f5c5SAndroid Build Coastguard Worker         glDepthFunc(GL_ALWAYS);
7407*8975f5c5SAndroid Build Coastguard Worker         glDepthMask(GL_TRUE);
7408*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_STENCIL_TEST);
7409*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_ALWAYS, stencil1, 0xFF);
7410*8975f5c5SAndroid Build Coastguard Worker         glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
7411*8975f5c5SAndroid Build Coastguard Worker         glStencilMask(0xFF);
7412*8975f5c5SAndroid Build Coastguard Worker 
7413*8975f5c5SAndroid Build Coastguard Worker         // Initialize the depth/stencil image
7414*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7415*8975f5c5SAndroid Build Coastguard Worker         drawQuad(red, essl1_shaders::PositionAttrib(), depth1);
7416*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7417*8975f5c5SAndroid Build Coastguard Worker 
7418*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
7419*8975f5c5SAndroid Build Coastguard Worker         switch (resolve)
7420*8975f5c5SAndroid Build Coastguard Worker         {
7421*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::Simultaneous:
7422*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7423*8975f5c5SAndroid Build Coastguard Worker                                   GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7424*8975f5c5SAndroid Build Coastguard Worker                 break;
7425*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsButSameFramebuffer:
7426*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
7427*8975f5c5SAndroid Build Coastguard Worker                                   GL_NEAREST);
7428*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7429*8975f5c5SAndroid Build Coastguard Worker                                   GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7430*8975f5c5SAndroid Build Coastguard Worker                 break;
7431*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsDifferentFramebuffers:
7432*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
7433*8975f5c5SAndroid Build Coastguard Worker                                   GL_NEAREST);
7434*8975f5c5SAndroid Build Coastguard Worker                 break;
7435*8975f5c5SAndroid Build Coastguard Worker         }
7436*8975f5c5SAndroid Build Coastguard Worker 
7437*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
7438*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_ALWAYS, stencil2, 0xFF);
7439*8975f5c5SAndroid Build Coastguard Worker         drawQuad(red, essl1_shaders::PositionAttrib(), depth2);
7440*8975f5c5SAndroid Build Coastguard Worker 
7441*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO2);
7442*8975f5c5SAndroid Build Coastguard Worker         switch (resolve)
7443*8975f5c5SAndroid Build Coastguard Worker         {
7444*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::Simultaneous:
7445*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7446*8975f5c5SAndroid Build Coastguard Worker                                   GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7447*8975f5c5SAndroid Build Coastguard Worker                 break;
7448*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsButSameFramebuffer:
7449*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
7450*8975f5c5SAndroid Build Coastguard Worker                                   GL_NEAREST);
7451*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7452*8975f5c5SAndroid Build Coastguard Worker                                   GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7453*8975f5c5SAndroid Build Coastguard Worker                 break;
7454*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsDifferentFramebuffers:
7455*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7456*8975f5c5SAndroid Build Coastguard Worker                                   GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7457*8975f5c5SAndroid Build Coastguard Worker                 break;
7458*8975f5c5SAndroid Build Coastguard Worker         }
7459*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7460*8975f5c5SAndroid Build Coastguard Worker 
7461*8975f5c5SAndroid Build Coastguard Worker         verifyDepth(resolveFBO1, kWidth, kHeight, depth1);
7462*8975f5c5SAndroid Build Coastguard Worker         if (resolve != DepthStencilResolve::SeparateAspectsDifferentFramebuffers)
7463*8975f5c5SAndroid Build Coastguard Worker         {
7464*8975f5c5SAndroid Build Coastguard Worker             verifyStencil(resolveFBO1, kWidth, kHeight, stencil1);
7465*8975f5c5SAndroid Build Coastguard Worker             verifyDepth(resolveFBO2, kWidth, kHeight, depth2);
7466*8975f5c5SAndroid Build Coastguard Worker         }
7467*8975f5c5SAndroid Build Coastguard Worker         verifyStencil(resolveFBO2, kWidth, kHeight, stencil2);
7468*8975f5c5SAndroid Build Coastguard Worker     };
7469*8975f5c5SAndroid Build Coastguard Worker 
7470*8975f5c5SAndroid Build Coastguard Worker     runTest(0.4f, 0x3F, 0.1f, 0xA2, DepthStencilResolve::Simultaneous);
7471*8975f5c5SAndroid Build Coastguard Worker     runTest(0.9f, 0x2B, 0.3f, 0xDD, DepthStencilResolve::SeparateAspectsButSameFramebuffer);
7472*8975f5c5SAndroid Build Coastguard Worker     runTest(0.5f, 0x6C, 0.6f, 0x7E, DepthStencilResolve::SeparateAspectsDifferentFramebuffers);
7473*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7474*8975f5c5SAndroid Build Coastguard Worker }
7475*8975f5c5SAndroid Build Coastguard Worker 
7476*8975f5c5SAndroid Build Coastguard Worker // Test resolving different attachments of an FBO to separate FBOs
TEST_P(FramebufferTest_ES31,MultisampleResolveBothAttachments)7477*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, MultisampleResolveBothAttachments)
7478*8975f5c5SAndroid Build Coastguard Worker {
7479*8975f5c5SAndroid Build Coastguard Worker     enum class Invalidate
7480*8975f5c5SAndroid Build Coastguard Worker     {
7481*8975f5c5SAndroid Build Coastguard Worker         None,
7482*8975f5c5SAndroid Build Coastguard Worker         AfterEachResolve,
7483*8975f5c5SAndroid Build Coastguard Worker         AllAtEnd,
7484*8975f5c5SAndroid Build Coastguard Worker     };
7485*8975f5c5SAndroid Build Coastguard Worker 
7486*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
7487*8975f5c5SAndroid Build Coastguard Worker precision highp float;
7488*8975f5c5SAndroid Build Coastguard Worker 
7489*8975f5c5SAndroid Build Coastguard Worker uniform vec4 value0;
7490*8975f5c5SAndroid Build Coastguard Worker uniform vec4 value2;
7491*8975f5c5SAndroid Build Coastguard Worker 
7492*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 color0;
7493*8975f5c5SAndroid Build Coastguard Worker layout(location = 2) out vec4 color2;
7494*8975f5c5SAndroid Build Coastguard Worker 
7495*8975f5c5SAndroid Build Coastguard Worker void main()
7496*8975f5c5SAndroid Build Coastguard Worker {
7497*8975f5c5SAndroid Build Coastguard Worker     color0 = value0;
7498*8975f5c5SAndroid Build Coastguard Worker     color2 = value2;
7499*8975f5c5SAndroid Build Coastguard Worker })";
7500*8975f5c5SAndroid Build Coastguard Worker 
7501*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
7502*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
7503*8975f5c5SAndroid Build Coastguard Worker     const GLint color0Loc = glGetUniformLocation(program, "value0");
7504*8975f5c5SAndroid Build Coastguard Worker     const GLint color1Loc = glGetUniformLocation(program, "value2");
7505*8975f5c5SAndroid Build Coastguard Worker 
7506*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 16;
7507*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 20;
7508*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
7509*8975f5c5SAndroid Build Coastguard Worker 
7510*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaa0, msaa1;
7511*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaa0);
7512*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
7513*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaa1);
7514*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
7515*8975f5c5SAndroid Build Coastguard Worker 
7516*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
7517*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7518*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, msaa0,
7519*8975f5c5SAndroid Build Coastguard Worker                            0);
7520*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D_MULTISAMPLE, msaa1,
7521*8975f5c5SAndroid Build Coastguard Worker                            0);
7522*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7523*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7524*8975f5c5SAndroid Build Coastguard Worker 
7525*8975f5c5SAndroid Build Coastguard Worker     GLenum bufs[3] = {GL_COLOR_ATTACHMENT0, GL_NONE, GL_COLOR_ATTACHMENT2};
7526*8975f5c5SAndroid Build Coastguard Worker     glDrawBuffers(3, bufs);
7527*8975f5c5SAndroid Build Coastguard Worker 
7528*8975f5c5SAndroid Build Coastguard Worker     // Create two resolve FBOs and textures. Use different texture levels and layers.
7529*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
7530*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
7531*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, kWidth * 2, kHeight * 2);
7532*8975f5c5SAndroid Build Coastguard Worker 
7533*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
7534*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
7535*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture1, 1);
7536*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7537*8975f5c5SAndroid Build Coastguard Worker 
7538*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
7539*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, resolveTexture2);
7540*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 4, GL_RGBA8, kWidth * 4, kHeight * 4, 5);
7541*8975f5c5SAndroid Build Coastguard Worker 
7542*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
7543*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
7544*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, resolveTexture2, 2, 3);
7545*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7546*8975f5c5SAndroid Build Coastguard Worker 
7547*8975f5c5SAndroid Build Coastguard Worker     auto test = [&](GLColor color0, GLColor color1, Invalidate invalidate) {
7548*8975f5c5SAndroid Build Coastguard Worker         const GLenum discards[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT2};
7549*8975f5c5SAndroid Build Coastguard Worker 
7550*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7551*8975f5c5SAndroid Build Coastguard Worker         glUniform4fv(color0Loc, 1, color0.toNormalizedVector().data());
7552*8975f5c5SAndroid Build Coastguard Worker         glUniform4fv(color1Loc, 1, color1.toNormalizedVector().data());
7553*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
7554*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7555*8975f5c5SAndroid Build Coastguard Worker 
7556*8975f5c5SAndroid Build Coastguard Worker         // Resolve the first attachment
7557*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
7558*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT0);
7559*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
7560*8975f5c5SAndroid Build Coastguard Worker                           GL_NEAREST);
7561*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7562*8975f5c5SAndroid Build Coastguard Worker 
7563*8975f5c5SAndroid Build Coastguard Worker         if (invalidate == Invalidate::AfterEachResolve)
7564*8975f5c5SAndroid Build Coastguard Worker         {
7565*8975f5c5SAndroid Build Coastguard Worker             glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, discards);
7566*8975f5c5SAndroid Build Coastguard Worker         }
7567*8975f5c5SAndroid Build Coastguard Worker 
7568*8975f5c5SAndroid Build Coastguard Worker         // Resolve the second attachment
7569*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO2);
7570*8975f5c5SAndroid Build Coastguard Worker         glReadBuffer(GL_COLOR_ATTACHMENT2);
7571*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
7572*8975f5c5SAndroid Build Coastguard Worker                           GL_NEAREST);
7573*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7574*8975f5c5SAndroid Build Coastguard Worker 
7575*8975f5c5SAndroid Build Coastguard Worker         if (invalidate == Invalidate::AfterEachResolve)
7576*8975f5c5SAndroid Build Coastguard Worker         {
7577*8975f5c5SAndroid Build Coastguard Worker             glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, discards + 1);
7578*8975f5c5SAndroid Build Coastguard Worker         }
7579*8975f5c5SAndroid Build Coastguard Worker         else if (invalidate == Invalidate::AllAtEnd)
7580*8975f5c5SAndroid Build Coastguard Worker         {
7581*8975f5c5SAndroid Build Coastguard Worker             glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 2, discards);
7582*8975f5c5SAndroid Build Coastguard Worker         }
7583*8975f5c5SAndroid Build Coastguard Worker 
7584*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO1);
7585*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, color0);
7586*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO2);
7587*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, color1);
7588*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7589*8975f5c5SAndroid Build Coastguard Worker     };
7590*8975f5c5SAndroid Build Coastguard Worker 
7591*8975f5c5SAndroid Build Coastguard Worker     test(GLColor::red, GLColor::green, Invalidate::None);
7592*8975f5c5SAndroid Build Coastguard Worker     test(GLColor::blue, GLColor::yellow, Invalidate::AfterEachResolve);
7593*8975f5c5SAndroid Build Coastguard Worker     test(GLColor::cyan, GLColor::magenta, Invalidate::AllAtEnd);
7594*8975f5c5SAndroid Build Coastguard Worker }
7595*8975f5c5SAndroid Build Coastguard Worker 
7596*8975f5c5SAndroid Build Coastguard Worker // Test resolving a framebuffer once, then drawing to it again without a resolve.  Makes sure there
7597*8975f5c5SAndroid Build Coastguard Worker // is no caching bug that would make the second render pass resolve into the old resolve target
7598*8975f5c5SAndroid Build Coastguard Worker // again.
TEST_P(FramebufferTest_ES31,ResolveThenDrawWithoutResolve)7599*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ResolveThenDrawWithoutResolve)
7600*8975f5c5SAndroid Build Coastguard Worker {
7601*8975f5c5SAndroid Build Coastguard Worker     enum class Invalidate
7602*8975f5c5SAndroid Build Coastguard Worker     {
7603*8975f5c5SAndroid Build Coastguard Worker         None,
7604*8975f5c5SAndroid Build Coastguard Worker         AfterFirstResolve,
7605*8975f5c5SAndroid Build Coastguard Worker         AfterEachResolve,
7606*8975f5c5SAndroid Build Coastguard Worker         AtEnd,
7607*8975f5c5SAndroid Build Coastguard Worker     };
7608*8975f5c5SAndroid Build Coastguard Worker 
7609*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
7610*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
7611*8975f5c5SAndroid Build Coastguard Worker     GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
7612*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorLoc, -1);
7613*8975f5c5SAndroid Build Coastguard Worker 
7614*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 16;
7615*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 20;
7616*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
7617*8975f5c5SAndroid Build Coastguard Worker 
7618*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaa;
7619*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaa);
7620*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
7621*8975f5c5SAndroid Build Coastguard Worker 
7622*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
7623*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7624*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, msaa,
7625*8975f5c5SAndroid Build Coastguard Worker                            0);
7626*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7627*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7628*8975f5c5SAndroid Build Coastguard Worker 
7629*8975f5c5SAndroid Build Coastguard Worker     // Create the resolve FBO and texture.
7630*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
7631*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
7632*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, kWidth * 2 + 1, kHeight * 2 + 1);
7633*8975f5c5SAndroid Build Coastguard Worker 
7634*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
7635*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
7636*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 1);
7637*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7638*8975f5c5SAndroid Build Coastguard Worker 
7639*8975f5c5SAndroid Build Coastguard Worker     auto test = [&](GLColor color1, GLColor color2, Invalidate invalidate) {
7640*8975f5c5SAndroid Build Coastguard Worker         const GLenum discards[] = {GL_COLOR_ATTACHMENT0};
7641*8975f5c5SAndroid Build Coastguard Worker 
7642*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7643*8975f5c5SAndroid Build Coastguard Worker         glUniform4fv(colorLoc, 1, color1.toNormalizedVector().data());
7644*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
7645*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7646*8975f5c5SAndroid Build Coastguard Worker 
7647*8975f5c5SAndroid Build Coastguard Worker         // Resolve
7648*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
7649*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
7650*8975f5c5SAndroid Build Coastguard Worker                           GL_NEAREST);
7651*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7652*8975f5c5SAndroid Build Coastguard Worker 
7653*8975f5c5SAndroid Build Coastguard Worker         if (invalidate == Invalidate::AfterEachResolve ||
7654*8975f5c5SAndroid Build Coastguard Worker             invalidate == Invalidate::AfterFirstResolve)
7655*8975f5c5SAndroid Build Coastguard Worker         {
7656*8975f5c5SAndroid Build Coastguard Worker             glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, discards);
7657*8975f5c5SAndroid Build Coastguard Worker         }
7658*8975f5c5SAndroid Build Coastguard Worker 
7659*8975f5c5SAndroid Build Coastguard Worker         // Draw again, but don't resolve.
7660*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
7661*8975f5c5SAndroid Build Coastguard Worker         glUniform4fv(colorLoc, 1, color2.toNormalizedVector().data());
7662*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
7663*8975f5c5SAndroid Build Coastguard Worker 
7664*8975f5c5SAndroid Build Coastguard Worker         const bool invalidateAtEnd =
7665*8975f5c5SAndroid Build Coastguard Worker             invalidate == Invalidate::AfterEachResolve || invalidate == Invalidate::AtEnd;
7666*8975f5c5SAndroid Build Coastguard Worker         if (invalidateAtEnd)
7667*8975f5c5SAndroid Build Coastguard Worker         {
7668*8975f5c5SAndroid Build Coastguard Worker             glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, discards);
7669*8975f5c5SAndroid Build Coastguard Worker         }
7670*8975f5c5SAndroid Build Coastguard Worker 
7671*8975f5c5SAndroid Build Coastguard Worker         // Make sure the render pass is flushed so if there's a caching bug and the old render pass
7672*8975f5c5SAndroid Build Coastguard Worker         // with resolve is used for the second render pass, the contents of the resolve attachment
7673*8975f5c5SAndroid Build Coastguard Worker         // is wrong.  Can't rely on glReadPixels doing that because of potential use of
7674*8975f5c5SAndroid Build Coastguard Worker         // VK_EXT_host_image_copy.
7675*8975f5c5SAndroid Build Coastguard Worker         glFinish();
7676*8975f5c5SAndroid Build Coastguard Worker 
7677*8975f5c5SAndroid Build Coastguard Worker         // Verify the contents of the resolve attachment
7678*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
7679*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, color1);
7680*8975f5c5SAndroid Build Coastguard Worker 
7681*8975f5c5SAndroid Build Coastguard Worker         if (!invalidateAtEnd)
7682*8975f5c5SAndroid Build Coastguard Worker         {
7683*8975f5c5SAndroid Build Coastguard Worker             // For completeness, make sure the second draw succeeded.
7684*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
7685*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
7686*8975f5c5SAndroid Build Coastguard Worker             glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
7687*8975f5c5SAndroid Build Coastguard Worker                               GL_NEAREST);
7688*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
7689*8975f5c5SAndroid Build Coastguard Worker 
7690*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
7691*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, color2);
7692*8975f5c5SAndroid Build Coastguard Worker         }
7693*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7694*8975f5c5SAndroid Build Coastguard Worker     };
7695*8975f5c5SAndroid Build Coastguard Worker 
7696*8975f5c5SAndroid Build Coastguard Worker     test(GLColor::red, GLColor::green, Invalidate::None);
7697*8975f5c5SAndroid Build Coastguard Worker     test(GLColor::blue, GLColor::yellow, Invalidate::AfterFirstResolve);
7698*8975f5c5SAndroid Build Coastguard Worker     test(GLColor::cyan, GLColor::magenta, Invalidate::AfterEachResolve);
7699*8975f5c5SAndroid Build Coastguard Worker     test(GLColor::white, GLColor::red, Invalidate::AtEnd);
7700*8975f5c5SAndroid Build Coastguard Worker }
7701*8975f5c5SAndroid Build Coastguard Worker 
7702*8975f5c5SAndroid Build Coastguard Worker // Test resolving a depth/stencil framebuffer once, then drawing to it again without a resolve.
7703*8975f5c5SAndroid Build Coastguard Worker // Makes sure there is no caching bug that would make the second render pass resolve into the old
7704*8975f5c5SAndroid Build Coastguard Worker // resolve target again.
TEST_P(FramebufferTest_ES31,DepthStencilResolveThenDrawWithoutResolve)7705*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, DepthStencilResolveThenDrawWithoutResolve)
7706*8975f5c5SAndroid Build Coastguard Worker {
7707*8975f5c5SAndroid Build Coastguard Worker     enum class Invalidate
7708*8975f5c5SAndroid Build Coastguard Worker     {
7709*8975f5c5SAndroid Build Coastguard Worker         None,
7710*8975f5c5SAndroid Build Coastguard Worker         AfterFirstResolve,
7711*8975f5c5SAndroid Build Coastguard Worker         AfterEachResolve,
7712*8975f5c5SAndroid Build Coastguard Worker         AtEnd,
7713*8975f5c5SAndroid Build Coastguard Worker     };
7714*8975f5c5SAndroid Build Coastguard Worker     enum class DepthStencilResolve
7715*8975f5c5SAndroid Build Coastguard Worker     {
7716*8975f5c5SAndroid Build Coastguard Worker         Simultaneous,
7717*8975f5c5SAndroid Build Coastguard Worker         SeparateAspects,
7718*8975f5c5SAndroid Build Coastguard Worker     };
7719*8975f5c5SAndroid Build Coastguard Worker 
7720*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(red, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Red());
7721*8975f5c5SAndroid Build Coastguard Worker 
7722*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 16;
7723*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 20;
7724*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
7725*8975f5c5SAndroid Build Coastguard Worker 
7726*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
7727*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7728*8975f5c5SAndroid Build Coastguard Worker 
7729*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
7730*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
7731*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kWidth, kHeight);
7732*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
7733*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
7734*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7735*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7736*8975f5c5SAndroid Build Coastguard Worker 
7737*8975f5c5SAndroid Build Coastguard Worker     // Create the resolve FBO and texture. Use different texture levels and layers.
7738*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
7739*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
7740*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 4, GL_DEPTH24_STENCIL8, kWidth * 4, kHeight * 4);
7741*8975f5c5SAndroid Build Coastguard Worker 
7742*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
7743*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
7744*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
7745*8975f5c5SAndroid Build Coastguard Worker                            resolveTexture, 2);
7746*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7747*8975f5c5SAndroid Build Coastguard Worker 
7748*8975f5c5SAndroid Build Coastguard Worker     auto test = [&](float depth1, int stencil1, float depth2, int stencil2,
7749*8975f5c5SAndroid Build Coastguard Worker                     DepthStencilResolve resolve, Invalidate invalidate) {
7750*8975f5c5SAndroid Build Coastguard Worker         const GLenum discards[] = {GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT,
7751*8975f5c5SAndroid Build Coastguard Worker                                    GL_DEPTH_STENCIL_ATTACHMENT};
7752*8975f5c5SAndroid Build Coastguard Worker 
7753*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_DEPTH_TEST);
7754*8975f5c5SAndroid Build Coastguard Worker         glDepthFunc(GL_ALWAYS);
7755*8975f5c5SAndroid Build Coastguard Worker         glDepthMask(GL_TRUE);
7756*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_STENCIL_TEST);
7757*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_ALWAYS, stencil1, 0xFF);
7758*8975f5c5SAndroid Build Coastguard Worker         glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
7759*8975f5c5SAndroid Build Coastguard Worker         glStencilMask(0xFF);
7760*8975f5c5SAndroid Build Coastguard Worker 
7761*8975f5c5SAndroid Build Coastguard Worker         // First draw
7762*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7763*8975f5c5SAndroid Build Coastguard Worker         drawQuad(red, essl1_shaders::PositionAttrib(), depth1);
7764*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7765*8975f5c5SAndroid Build Coastguard Worker 
7766*8975f5c5SAndroid Build Coastguard Worker         // Resolve
7767*8975f5c5SAndroid Build Coastguard Worker         const bool invalidateAfterFirstResolve = invalidate == Invalidate::AfterEachResolve ||
7768*8975f5c5SAndroid Build Coastguard Worker                                                  invalidate == Invalidate::AfterFirstResolve;
7769*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
7770*8975f5c5SAndroid Build Coastguard Worker         switch (resolve)
7771*8975f5c5SAndroid Build Coastguard Worker         {
7772*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::Simultaneous:
7773*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7774*8975f5c5SAndroid Build Coastguard Worker                                   GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7775*8975f5c5SAndroid Build Coastguard Worker                 if (invalidateAfterFirstResolve)
7776*8975f5c5SAndroid Build Coastguard Worker                 {
7777*8975f5c5SAndroid Build Coastguard Worker                     glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, &discards[2]);
7778*8975f5c5SAndroid Build Coastguard Worker                 }
7779*8975f5c5SAndroid Build Coastguard Worker                 break;
7780*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspects:
7781*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
7782*8975f5c5SAndroid Build Coastguard Worker                                   GL_NEAREST);
7783*8975f5c5SAndroid Build Coastguard Worker                 if (invalidateAfterFirstResolve)
7784*8975f5c5SAndroid Build Coastguard Worker                 {
7785*8975f5c5SAndroid Build Coastguard Worker                     glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, &discards[0]);
7786*8975f5c5SAndroid Build Coastguard Worker                 }
7787*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7788*8975f5c5SAndroid Build Coastguard Worker                                   GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7789*8975f5c5SAndroid Build Coastguard Worker                 if (invalidateAfterFirstResolve)
7790*8975f5c5SAndroid Build Coastguard Worker                 {
7791*8975f5c5SAndroid Build Coastguard Worker                     glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, &discards[1]);
7792*8975f5c5SAndroid Build Coastguard Worker                 }
7793*8975f5c5SAndroid Build Coastguard Worker                 break;
7794*8975f5c5SAndroid Build Coastguard Worker         }
7795*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7796*8975f5c5SAndroid Build Coastguard Worker 
7797*8975f5c5SAndroid Build Coastguard Worker         // Draw again, but don't resolve.
7798*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
7799*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_ALWAYS, stencil2, 0xFF);
7800*8975f5c5SAndroid Build Coastguard Worker         drawQuad(red, essl1_shaders::PositionAttrib(), depth2);
7801*8975f5c5SAndroid Build Coastguard Worker 
7802*8975f5c5SAndroid Build Coastguard Worker         const bool invalidateAtEnd =
7803*8975f5c5SAndroid Build Coastguard Worker             invalidate == Invalidate::AfterEachResolve || invalidate == Invalidate::AtEnd;
7804*8975f5c5SAndroid Build Coastguard Worker         if (invalidateAtEnd)
7805*8975f5c5SAndroid Build Coastguard Worker         {
7806*8975f5c5SAndroid Build Coastguard Worker             glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, &discards[2]);
7807*8975f5c5SAndroid Build Coastguard Worker         }
7808*8975f5c5SAndroid Build Coastguard Worker 
7809*8975f5c5SAndroid Build Coastguard Worker         // Make sure the render pass is flushed so if there's a caching bug and the old render pass
7810*8975f5c5SAndroid Build Coastguard Worker         // with resolve is used for the second render pass, the contents of the resolve attachment
7811*8975f5c5SAndroid Build Coastguard Worker         // is wrong.  Can't rely on glReadPixels doing that because of potential use of
7812*8975f5c5SAndroid Build Coastguard Worker         // VK_EXT_host_image_copy.
7813*8975f5c5SAndroid Build Coastguard Worker         glFinish();
7814*8975f5c5SAndroid Build Coastguard Worker 
7815*8975f5c5SAndroid Build Coastguard Worker         // Verify the contents of the resolve attachment
7816*8975f5c5SAndroid Build Coastguard Worker         verifyDepth(resolveFBO, kWidth, kHeight, depth1);
7817*8975f5c5SAndroid Build Coastguard Worker         verifyStencil(resolveFBO, kWidth, kHeight, stencil1);
7818*8975f5c5SAndroid Build Coastguard Worker 
7819*8975f5c5SAndroid Build Coastguard Worker         if (!invalidateAtEnd)
7820*8975f5c5SAndroid Build Coastguard Worker         {
7821*8975f5c5SAndroid Build Coastguard Worker             // For completeness, make sure the second draw succeeded.
7822*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
7823*8975f5c5SAndroid Build Coastguard Worker             glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
7824*8975f5c5SAndroid Build Coastguard Worker             glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
7825*8975f5c5SAndroid Build Coastguard Worker                               GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
7826*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
7827*8975f5c5SAndroid Build Coastguard Worker 
7828*8975f5c5SAndroid Build Coastguard Worker             verifyDepth(resolveFBO, kWidth, kHeight, depth2);
7829*8975f5c5SAndroid Build Coastguard Worker             verifyStencil(resolveFBO, kWidth, kHeight, stencil2);
7830*8975f5c5SAndroid Build Coastguard Worker         }
7831*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7832*8975f5c5SAndroid Build Coastguard Worker     };
7833*8975f5c5SAndroid Build Coastguard Worker 
7834*8975f5c5SAndroid Build Coastguard Worker     test(0.4f, 0x3F, 0.1f, 0xA2, DepthStencilResolve::Simultaneous, Invalidate::None);
7835*8975f5c5SAndroid Build Coastguard Worker     test(0.9f, 0x2B, 0.3f, 0xDD, DepthStencilResolve::Simultaneous, Invalidate::AfterFirstResolve);
7836*8975f5c5SAndroid Build Coastguard Worker     test(0.5f, 0x6C, 0.6f, 0x7E, DepthStencilResolve::Simultaneous, Invalidate::AfterEachResolve);
7837*8975f5c5SAndroid Build Coastguard Worker     test(0.1f, 0x78, 0.4f, 0x34, DepthStencilResolve::Simultaneous, Invalidate::AtEnd);
7838*8975f5c5SAndroid Build Coastguard Worker     test(0.6f, 0x7E, 0.5f, 0x6C, DepthStencilResolve::SeparateAspects, Invalidate::None);
7839*8975f5c5SAndroid Build Coastguard Worker     test(0.1f, 0xA2, 0.9f, 0x2B, DepthStencilResolve::SeparateAspects,
7840*8975f5c5SAndroid Build Coastguard Worker          Invalidate::AfterFirstResolve);
7841*8975f5c5SAndroid Build Coastguard Worker     test(0.4f, 0x3F, 0.3f, 0xDD, DepthStencilResolve::SeparateAspects,
7842*8975f5c5SAndroid Build Coastguard Worker          Invalidate::AfterEachResolve);
7843*8975f5c5SAndroid Build Coastguard Worker     test(0.9f, 0xF0, 0.7f, 0x8A, DepthStencilResolve::SeparateAspects, Invalidate::AtEnd);
7844*8975f5c5SAndroid Build Coastguard Worker }
7845*8975f5c5SAndroid Build Coastguard Worker 
7846*8975f5c5SAndroid Build Coastguard Worker // Test resolving a framebuffer once, then drawing to it again without a complete resolve, and then
7847*8975f5c5SAndroid Build Coastguard Worker // drawing again with a resolve to same or another framebuffer.
TEST_P(FramebufferTest_ES31,ResolveThenDrawWithoutResolveThenDrawWithResolve)7848*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ResolveThenDrawWithoutResolveThenDrawWithResolve)
7849*8975f5c5SAndroid Build Coastguard Worker {
7850*8975f5c5SAndroid Build Coastguard Worker     enum class SecondResolve
7851*8975f5c5SAndroid Build Coastguard Worker     {
7852*8975f5c5SAndroid Build Coastguard Worker         SameFramebuffer,
7853*8975f5c5SAndroid Build Coastguard Worker         AnotherFramebuffer,
7854*8975f5c5SAndroid Build Coastguard Worker     };
7855*8975f5c5SAndroid Build Coastguard Worker 
7856*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
7857*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
7858*8975f5c5SAndroid Build Coastguard Worker     GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
7859*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorLoc, -1);
7860*8975f5c5SAndroid Build Coastguard Worker 
7861*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 36;
7862*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 12;
7863*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
7864*8975f5c5SAndroid Build Coastguard Worker 
7865*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaa;
7866*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaa);
7867*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
7868*8975f5c5SAndroid Build Coastguard Worker 
7869*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
7870*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7871*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, msaa,
7872*8975f5c5SAndroid Build Coastguard Worker                            0);
7873*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7874*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7875*8975f5c5SAndroid Build Coastguard Worker 
7876*8975f5c5SAndroid Build Coastguard Worker     // Create two resolve FBOs and textures. Use different texture levels and layers.
7877*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
7878*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
7879*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, kWidth * 4, kHeight * 4);
7880*8975f5c5SAndroid Build Coastguard Worker 
7881*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
7882*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
7883*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture1, 2);
7884*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7885*8975f5c5SAndroid Build Coastguard Worker 
7886*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
7887*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, resolveTexture2);
7888*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, kWidth, kHeight, 5);
7889*8975f5c5SAndroid Build Coastguard Worker 
7890*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
7891*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
7892*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, resolveTexture2, 0, 4);
7893*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7894*8975f5c5SAndroid Build Coastguard Worker 
7895*8975f5c5SAndroid Build Coastguard Worker     auto test = [&](GLColor color1, GLColor color2, GLColor color3, SecondResolve secondResolve) {
7896*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7897*8975f5c5SAndroid Build Coastguard Worker         glUniform4fv(colorLoc, 1, color1.toNormalizedVector().data());
7898*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
7899*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7900*8975f5c5SAndroid Build Coastguard Worker 
7901*8975f5c5SAndroid Build Coastguard Worker         // Resolve
7902*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
7903*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
7904*8975f5c5SAndroid Build Coastguard Worker                           GL_NEAREST);
7905*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7906*8975f5c5SAndroid Build Coastguard Worker 
7907*8975f5c5SAndroid Build Coastguard Worker         // Draw again, but don't resolve.
7908*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
7909*8975f5c5SAndroid Build Coastguard Worker         glUniform4fv(colorLoc, 1, color2.toNormalizedVector().data());
7910*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
7911*8975f5c5SAndroid Build Coastguard Worker 
7912*8975f5c5SAndroid Build Coastguard Worker         // Make sure the render pass is flushed.
7913*8975f5c5SAndroid Build Coastguard Worker         glFinish();
7914*8975f5c5SAndroid Build Coastguard Worker 
7915*8975f5c5SAndroid Build Coastguard Worker         // Verify the contents of the resolve attachment
7916*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO1);
7917*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, color1);
7918*8975f5c5SAndroid Build Coastguard Worker 
7919*8975f5c5SAndroid Build Coastguard Worker         // Draw and resolve again
7920*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_BLEND);
7921*8975f5c5SAndroid Build Coastguard Worker         glBlendFunc(GL_ONE, GL_ONE);
7922*8975f5c5SAndroid Build Coastguard Worker         glUniform4fv(colorLoc, 1, color3.toNormalizedVector().data());
7923*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
7924*8975f5c5SAndroid Build Coastguard Worker         glDisable(GL_BLEND);
7925*8975f5c5SAndroid Build Coastguard Worker 
7926*8975f5c5SAndroid Build Coastguard Worker         GLint fboToResolve =
7927*8975f5c5SAndroid Build Coastguard Worker             secondResolve == SecondResolve::SameFramebuffer ? resolveFBO1 : resolveFBO2;
7928*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboToResolve);
7929*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO);
7930*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
7931*8975f5c5SAndroid Build Coastguard Worker                           GL_NEAREST);
7932*8975f5c5SAndroid Build Coastguard Worker 
7933*8975f5c5SAndroid Build Coastguard Worker         const GLColor blendedColor = GLColor(
7934*8975f5c5SAndroid Build Coastguard Worker             std::clamp(color2.R + color3.R, 0, 255), std::clamp(color2.G + color3.G, 0, 255),
7935*8975f5c5SAndroid Build Coastguard Worker             std::clamp(color2.B + color3.B, 0, 255), std::clamp(color2.A + color3.A, 0, 255));
7936*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fboToResolve);
7937*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, blendedColor);
7938*8975f5c5SAndroid Build Coastguard Worker     };
7939*8975f5c5SAndroid Build Coastguard Worker 
7940*8975f5c5SAndroid Build Coastguard Worker     test(GLColor::red, GLColor::green, GLColor::blue, SecondResolve::SameFramebuffer);
7941*8975f5c5SAndroid Build Coastguard Worker     test(GLColor::cyan, GLColor(180, 0, 0, 190), GLColor(100, 255, 0, 80),
7942*8975f5c5SAndroid Build Coastguard Worker          SecondResolve::AnotherFramebuffer);
7943*8975f5c5SAndroid Build Coastguard Worker }
7944*8975f5c5SAndroid Build Coastguard Worker 
7945*8975f5c5SAndroid Build Coastguard Worker // Test resolving a depth/stencil framebuffer once, then drawing to it again without a complete
7946*8975f5c5SAndroid Build Coastguard Worker // resolve, and then drawing again with a resolve to same or another framebuffer.
TEST_P(FramebufferTest_ES31,DepthStencilResolveThenDrawWithoutResolveThenDrawWithResolve)7947*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, DepthStencilResolveThenDrawWithoutResolveThenDrawWithResolve)
7948*8975f5c5SAndroid Build Coastguard Worker {
7949*8975f5c5SAndroid Build Coastguard Worker     enum class SecondResolve
7950*8975f5c5SAndroid Build Coastguard Worker     {
7951*8975f5c5SAndroid Build Coastguard Worker         SameFramebuffer,
7952*8975f5c5SAndroid Build Coastguard Worker         AnotherFramebuffer,
7953*8975f5c5SAndroid Build Coastguard Worker     };
7954*8975f5c5SAndroid Build Coastguard Worker     enum class DepthStencilResolve
7955*8975f5c5SAndroid Build Coastguard Worker     {
7956*8975f5c5SAndroid Build Coastguard Worker         Simultaneous,
7957*8975f5c5SAndroid Build Coastguard Worker         SeparateAspectsButSameFramebuffer,
7958*8975f5c5SAndroid Build Coastguard Worker         SeparateAspectsDifferentFramebuffers,
7959*8975f5c5SAndroid Build Coastguard Worker     };
7960*8975f5c5SAndroid Build Coastguard Worker 
7961*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 24;
7962*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 12;
7963*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
7964*8975f5c5SAndroid Build Coastguard Worker 
7965*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
7966*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7967*8975f5c5SAndroid Build Coastguard Worker 
7968*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil;
7969*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
7970*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kWidth, kHeight);
7971*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
7972*8975f5c5SAndroid Build Coastguard Worker                               depthStencil);
7973*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7974*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7975*8975f5c5SAndroid Build Coastguard Worker 
7976*8975f5c5SAndroid Build Coastguard Worker     // Create two resolve FBOs and textures. Use different texture levels and layers.
7977*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
7978*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
7979*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 4, GL_DEPTH24_STENCIL8, kWidth * 4, kHeight * 4);
7980*8975f5c5SAndroid Build Coastguard Worker 
7981*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
7982*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
7983*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
7984*8975f5c5SAndroid Build Coastguard Worker                            resolveTexture1, 2);
7985*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7986*8975f5c5SAndroid Build Coastguard Worker 
7987*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
7988*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture2);
7989*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_DEPTH24_STENCIL8, kWidth * 2, kHeight * 2);
7990*8975f5c5SAndroid Build Coastguard Worker 
7991*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
7992*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
7993*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
7994*8975f5c5SAndroid Build Coastguard Worker                            resolveTexture2, 1);
7995*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7996*8975f5c5SAndroid Build Coastguard Worker 
7997*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(red, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Red());
7998*8975f5c5SAndroid Build Coastguard Worker 
7999*8975f5c5SAndroid Build Coastguard Worker     auto runTest = [&](float depth1, int stencil1, float depth2, int stencil2,
8000*8975f5c5SAndroid Build Coastguard Worker                        DepthStencilResolve resolve, SecondResolve secondResolve) {
8001*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_DEPTH_TEST);
8002*8975f5c5SAndroid Build Coastguard Worker         glDepthFunc(GL_ALWAYS);
8003*8975f5c5SAndroid Build Coastguard Worker         glDepthMask(GL_TRUE);
8004*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_STENCIL_TEST);
8005*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_ALWAYS, stencil1, 0xFF);
8006*8975f5c5SAndroid Build Coastguard Worker         glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
8007*8975f5c5SAndroid Build Coastguard Worker         glStencilMask(0xFF);
8008*8975f5c5SAndroid Build Coastguard Worker 
8009*8975f5c5SAndroid Build Coastguard Worker         // Initialize the depth/stencil image
8010*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8011*8975f5c5SAndroid Build Coastguard Worker         drawQuad(red, essl1_shaders::PositionAttrib(), depth1);
8012*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
8013*8975f5c5SAndroid Build Coastguard Worker 
8014*8975f5c5SAndroid Build Coastguard Worker         // Resolve depth and stencil, then verify the results
8015*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
8016*8975f5c5SAndroid Build Coastguard Worker         switch (resolve)
8017*8975f5c5SAndroid Build Coastguard Worker         {
8018*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::Simultaneous:
8019*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
8020*8975f5c5SAndroid Build Coastguard Worker                                   GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
8021*8975f5c5SAndroid Build Coastguard Worker                 break;
8022*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsButSameFramebuffer:
8023*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
8024*8975f5c5SAndroid Build Coastguard Worker                                   GL_NEAREST);
8025*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
8026*8975f5c5SAndroid Build Coastguard Worker                                   GL_STENCIL_BUFFER_BIT, GL_NEAREST);
8027*8975f5c5SAndroid Build Coastguard Worker                 break;
8028*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsDifferentFramebuffers:
8029*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
8030*8975f5c5SAndroid Build Coastguard Worker                                   GL_NEAREST);
8031*8975f5c5SAndroid Build Coastguard Worker                 break;
8032*8975f5c5SAndroid Build Coastguard Worker         }
8033*8975f5c5SAndroid Build Coastguard Worker 
8034*8975f5c5SAndroid Build Coastguard Worker         // Draw again, but don't resolve.
8035*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFBO);
8036*8975f5c5SAndroid Build Coastguard Worker         drawQuad(red, essl31_shaders::PositionAttrib(), 0);
8037*8975f5c5SAndroid Build Coastguard Worker 
8038*8975f5c5SAndroid Build Coastguard Worker         // Make sure the render pass is flushed.
8039*8975f5c5SAndroid Build Coastguard Worker         glFinish();
8040*8975f5c5SAndroid Build Coastguard Worker 
8041*8975f5c5SAndroid Build Coastguard Worker         // Draw and resolve again
8042*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_ALWAYS, stencil2, 0xFF);
8043*8975f5c5SAndroid Build Coastguard Worker         drawQuad(red, essl31_shaders::PositionAttrib(), depth2);
8044*8975f5c5SAndroid Build Coastguard Worker 
8045*8975f5c5SAndroid Build Coastguard Worker         GLint fboToResolve =
8046*8975f5c5SAndroid Build Coastguard Worker             secondResolve == SecondResolve::SameFramebuffer ? resolveFBO1 : resolveFBO2;
8047*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboToResolve);
8048*8975f5c5SAndroid Build Coastguard Worker         switch (resolve)
8049*8975f5c5SAndroid Build Coastguard Worker         {
8050*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::Simultaneous:
8051*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
8052*8975f5c5SAndroid Build Coastguard Worker                                   GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
8053*8975f5c5SAndroid Build Coastguard Worker                 break;
8054*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsButSameFramebuffer:
8055*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
8056*8975f5c5SAndroid Build Coastguard Worker                                   GL_NEAREST);
8057*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
8058*8975f5c5SAndroid Build Coastguard Worker                                   GL_STENCIL_BUFFER_BIT, GL_NEAREST);
8059*8975f5c5SAndroid Build Coastguard Worker                 break;
8060*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspectsDifferentFramebuffers:
8061*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
8062*8975f5c5SAndroid Build Coastguard Worker                                   GL_STENCIL_BUFFER_BIT, GL_NEAREST);
8063*8975f5c5SAndroid Build Coastguard Worker                 break;
8064*8975f5c5SAndroid Build Coastguard Worker         }
8065*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
8066*8975f5c5SAndroid Build Coastguard Worker 
8067*8975f5c5SAndroid Build Coastguard Worker         if (secondResolve == SecondResolve::SameFramebuffer)
8068*8975f5c5SAndroid Build Coastguard Worker         {
8069*8975f5c5SAndroid Build Coastguard Worker             verifyDepth(resolveFBO1, kWidth, kHeight,
8070*8975f5c5SAndroid Build Coastguard Worker                         resolve == DepthStencilResolve::SeparateAspectsDifferentFramebuffers
8071*8975f5c5SAndroid Build Coastguard Worker                             ? depth1
8072*8975f5c5SAndroid Build Coastguard Worker                             : depth2);
8073*8975f5c5SAndroid Build Coastguard Worker             verifyStencil(resolveFBO1, kWidth, kHeight, stencil2);
8074*8975f5c5SAndroid Build Coastguard Worker         }
8075*8975f5c5SAndroid Build Coastguard Worker         else
8076*8975f5c5SAndroid Build Coastguard Worker         {
8077*8975f5c5SAndroid Build Coastguard Worker             verifyDepth(resolveFBO1, kWidth, kHeight, depth1);
8078*8975f5c5SAndroid Build Coastguard Worker             if (resolve != DepthStencilResolve::SeparateAspectsDifferentFramebuffers)
8079*8975f5c5SAndroid Build Coastguard Worker             {
8080*8975f5c5SAndroid Build Coastguard Worker                 verifyStencil(resolveFBO1, kWidth, kHeight, stencil1);
8081*8975f5c5SAndroid Build Coastguard Worker                 verifyDepth(resolveFBO2, kWidth, kHeight, depth2);
8082*8975f5c5SAndroid Build Coastguard Worker             }
8083*8975f5c5SAndroid Build Coastguard Worker             verifyStencil(resolveFBO2, kWidth, kHeight, stencil2);
8084*8975f5c5SAndroid Build Coastguard Worker         }
8085*8975f5c5SAndroid Build Coastguard Worker     };
8086*8975f5c5SAndroid Build Coastguard Worker 
8087*8975f5c5SAndroid Build Coastguard Worker     runTest(0.4f, 0x3F, 0.1f, 0xA2, DepthStencilResolve::Simultaneous,
8088*8975f5c5SAndroid Build Coastguard Worker             SecondResolve::SameFramebuffer);
8089*8975f5c5SAndroid Build Coastguard Worker     runTest(0.9f, 0x2B, 0.3f, 0xDD, DepthStencilResolve::Simultaneous,
8090*8975f5c5SAndroid Build Coastguard Worker             SecondResolve::AnotherFramebuffer);
8091*8975f5c5SAndroid Build Coastguard Worker     runTest(0.6f, 0x7E, 0.6f, 0x7E, DepthStencilResolve::SeparateAspectsButSameFramebuffer,
8092*8975f5c5SAndroid Build Coastguard Worker             SecondResolve::SameFramebuffer);
8093*8975f5c5SAndroid Build Coastguard Worker     runTest(0.1f, 0xA2, 0.4f, 0x34, DepthStencilResolve::SeparateAspectsButSameFramebuffer,
8094*8975f5c5SAndroid Build Coastguard Worker             SecondResolve::AnotherFramebuffer);
8095*8975f5c5SAndroid Build Coastguard Worker     runTest(0.4f, 0x3F, 0.5f, 0x6C, DepthStencilResolve::SeparateAspectsDifferentFramebuffers,
8096*8975f5c5SAndroid Build Coastguard Worker             SecondResolve::SameFramebuffer);
8097*8975f5c5SAndroid Build Coastguard Worker     runTest(0.9f, 0xF0, 0.9f, 0x2B, DepthStencilResolve::SeparateAspectsDifferentFramebuffers,
8098*8975f5c5SAndroid Build Coastguard Worker             SecondResolve::AnotherFramebuffer);
8099*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8100*8975f5c5SAndroid Build Coastguard Worker }
8101*8975f5c5SAndroid Build Coastguard Worker 
8102*8975f5c5SAndroid Build Coastguard Worker // Test resolving a framebuffer once, then changing its attachment (with the same format) and
8103*8975f5c5SAndroid Build Coastguard Worker // draw+resolving again.  Makes sure the wrong framebuffer or render pass is not picked from a
8104*8975f5c5SAndroid Build Coastguard Worker // cache.
TEST_P(FramebufferTest_ES31,ResolveThenChangeAttachmentThenResolveAgain)8105*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ResolveThenChangeAttachmentThenResolveAgain)
8106*8975f5c5SAndroid Build Coastguard Worker {
8107*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
8108*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
8109*8975f5c5SAndroid Build Coastguard Worker     GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
8110*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorLoc, -1);
8111*8975f5c5SAndroid Build Coastguard Worker 
8112*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 36;
8113*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 20;
8114*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
8115*8975f5c5SAndroid Build Coastguard Worker 
8116*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaa0, msaa1;
8117*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaa0);
8118*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
8119*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaa1);
8120*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
8121*8975f5c5SAndroid Build Coastguard Worker 
8122*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
8123*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8124*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, msaa0,
8125*8975f5c5SAndroid Build Coastguard Worker                            0);
8126*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8127*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8128*8975f5c5SAndroid Build Coastguard Worker 
8129*8975f5c5SAndroid Build Coastguard Worker     // Create the resolve FBO and texture.
8130*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
8131*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
8132*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, kWidth * 2 + 1, kHeight * 2 + 1);
8133*8975f5c5SAndroid Build Coastguard Worker 
8134*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
8135*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
8136*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 1);
8137*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8138*8975f5c5SAndroid Build Coastguard Worker 
8139*8975f5c5SAndroid Build Coastguard Worker     // Draw and resolve once
8140*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8141*8975f5c5SAndroid Build Coastguard Worker     glUniform4fv(colorLoc, 1, GLColor::green.toNormalizedVector().data());
8142*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
8143*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8144*8975f5c5SAndroid Build Coastguard Worker 
8145*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
8146*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
8147*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
8148*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8149*8975f5c5SAndroid Build Coastguard Worker 
8150*8975f5c5SAndroid Build Coastguard Worker     // Change the framebuffer attachment to another texture
8151*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8152*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, msaa1,
8153*8975f5c5SAndroid Build Coastguard Worker                            0);
8154*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8155*8975f5c5SAndroid Build Coastguard Worker 
8156*8975f5c5SAndroid Build Coastguard Worker     // Draw and resolve again
8157*8975f5c5SAndroid Build Coastguard Worker     glUniform4fv(colorLoc, 1, GLColor::blue.toNormalizedVector().data());
8158*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
8159*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8160*8975f5c5SAndroid Build Coastguard Worker 
8161*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
8162*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
8163*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
8164*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8165*8975f5c5SAndroid Build Coastguard Worker 
8166*8975f5c5SAndroid Build Coastguard Worker     // Verify results
8167*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
8168*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::blue);
8169*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8170*8975f5c5SAndroid Build Coastguard Worker }
8171*8975f5c5SAndroid Build Coastguard Worker 
8172*8975f5c5SAndroid Build Coastguard Worker // Test resolving a depth/stencil framebuffer once, then changing its attachment (with the same
8173*8975f5c5SAndroid Build Coastguard Worker // format) and draw+resolving again.  Makes sure the wrong framebuffer or render pass is not picked
8174*8975f5c5SAndroid Build Coastguard Worker // from a cache.
TEST_P(FramebufferTest_ES31,DepthStencilResolveThenChangeAttachmentThenResolveAgain)8175*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, DepthStencilResolveThenChangeAttachmentThenResolveAgain)
8176*8975f5c5SAndroid Build Coastguard Worker {
8177*8975f5c5SAndroid Build Coastguard Worker     enum class DepthStencilResolve
8178*8975f5c5SAndroid Build Coastguard Worker     {
8179*8975f5c5SAndroid Build Coastguard Worker         Simultaneous,
8180*8975f5c5SAndroid Build Coastguard Worker         SeparateAspects,
8181*8975f5c5SAndroid Build Coastguard Worker     };
8182*8975f5c5SAndroid Build Coastguard Worker 
8183*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 24;
8184*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 12;
8185*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
8186*8975f5c5SAndroid Build Coastguard Worker 
8187*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
8188*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8189*8975f5c5SAndroid Build Coastguard Worker 
8190*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer depthStencil, depth, stencil;
8191*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
8192*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, kWidth, kHeight);
8193*8975f5c5SAndroid Build Coastguard Worker 
8194*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, depth);
8195*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, kWidth, kHeight);
8196*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, stencil);
8197*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_STENCIL_INDEX8, kWidth, kHeight);
8198*8975f5c5SAndroid Build Coastguard Worker 
8199*8975f5c5SAndroid Build Coastguard Worker     // Create two resolve FBOs and textures. Use different texture levels and layers.
8200*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
8201*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
8202*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 4, GL_DEPTH24_STENCIL8, kWidth * 4, kHeight * 4);
8203*8975f5c5SAndroid Build Coastguard Worker 
8204*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
8205*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
8206*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
8207*8975f5c5SAndroid Build Coastguard Worker                            resolveTexture1, 2);
8208*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8209*8975f5c5SAndroid Build Coastguard Worker 
8210*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
8211*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture2);
8212*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_DEPTH_COMPONENT16, kWidth * 2, kHeight * 2);
8213*8975f5c5SAndroid Build Coastguard Worker 
8214*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
8215*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
8216*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, resolveTexture2, 1);
8217*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8218*8975f5c5SAndroid Build Coastguard Worker 
8219*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture3;
8220*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture3);
8221*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_STENCIL_INDEX8, kWidth * 2, kHeight * 2);
8222*8975f5c5SAndroid Build Coastguard Worker 
8223*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO3;
8224*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO3);
8225*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, resolveTexture3,
8226*8975f5c5SAndroid Build Coastguard Worker                            1);
8227*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8228*8975f5c5SAndroid Build Coastguard Worker 
8229*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(red, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Red());
8230*8975f5c5SAndroid Build Coastguard Worker 
8231*8975f5c5SAndroid Build Coastguard Worker     auto runTest = [&](float depth1, int stencil1, float depth2, int stencil2,
8232*8975f5c5SAndroid Build Coastguard Worker                        DepthStencilResolve resolve) {
8233*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_DEPTH_TEST);
8234*8975f5c5SAndroid Build Coastguard Worker         glDepthFunc(GL_ALWAYS);
8235*8975f5c5SAndroid Build Coastguard Worker         glDepthMask(GL_TRUE);
8236*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_STENCIL_TEST);
8237*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_ALWAYS, stencil1, 0xFF);
8238*8975f5c5SAndroid Build Coastguard Worker         glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
8239*8975f5c5SAndroid Build Coastguard Worker         glStencilMask(0xFF);
8240*8975f5c5SAndroid Build Coastguard Worker 
8241*8975f5c5SAndroid Build Coastguard Worker         // Initialize the depth/stencil image
8242*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8243*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
8244*8975f5c5SAndroid Build Coastguard Worker                                   depthStencil);
8245*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8246*8975f5c5SAndroid Build Coastguard Worker 
8247*8975f5c5SAndroid Build Coastguard Worker         drawQuad(red, essl1_shaders::PositionAttrib(), depth1);
8248*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
8249*8975f5c5SAndroid Build Coastguard Worker 
8250*8975f5c5SAndroid Build Coastguard Worker         // Resolve depth and stencil
8251*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
8252*8975f5c5SAndroid Build Coastguard Worker         switch (resolve)
8253*8975f5c5SAndroid Build Coastguard Worker         {
8254*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::Simultaneous:
8255*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
8256*8975f5c5SAndroid Build Coastguard Worker                                   GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
8257*8975f5c5SAndroid Build Coastguard Worker                 break;
8258*8975f5c5SAndroid Build Coastguard Worker             case DepthStencilResolve::SeparateAspects:
8259*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
8260*8975f5c5SAndroid Build Coastguard Worker                                   GL_NEAREST);
8261*8975f5c5SAndroid Build Coastguard Worker                 glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight,
8262*8975f5c5SAndroid Build Coastguard Worker                                   GL_STENCIL_BUFFER_BIT, GL_NEAREST);
8263*8975f5c5SAndroid Build Coastguard Worker                 break;
8264*8975f5c5SAndroid Build Coastguard Worker         }
8265*8975f5c5SAndroid Build Coastguard Worker 
8266*8975f5c5SAndroid Build Coastguard Worker         // Change the framebuffer and draw/resolve again
8267*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8268*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
8269*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth);
8270*8975f5c5SAndroid Build Coastguard Worker         drawQuad(red, essl1_shaders::PositionAttrib(), depth2);
8271*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8272*8975f5c5SAndroid Build Coastguard Worker 
8273*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO2);
8274*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_DEPTH_BUFFER_BIT,
8275*8975f5c5SAndroid Build Coastguard Worker                           GL_NEAREST);
8276*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
8277*8975f5c5SAndroid Build Coastguard Worker 
8278*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8279*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
8280*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencil);
8281*8975f5c5SAndroid Build Coastguard Worker         glStencilFunc(GL_ALWAYS, stencil2, 0xFF);
8282*8975f5c5SAndroid Build Coastguard Worker         drawQuad(red, essl1_shaders::PositionAttrib(), 0);
8283*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8284*8975f5c5SAndroid Build Coastguard Worker 
8285*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO3);
8286*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_STENCIL_BUFFER_BIT,
8287*8975f5c5SAndroid Build Coastguard Worker                           GL_NEAREST);
8288*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
8289*8975f5c5SAndroid Build Coastguard Worker 
8290*8975f5c5SAndroid Build Coastguard Worker         verifyDepth(resolveFBO1, kWidth, kHeight, depth1);
8291*8975f5c5SAndroid Build Coastguard Worker         verifyStencil(resolveFBO1, kWidth, kHeight, stencil1);
8292*8975f5c5SAndroid Build Coastguard Worker         verifyDepth(resolveFBO2, kWidth, kHeight, depth2);
8293*8975f5c5SAndroid Build Coastguard Worker         verifyStencil(resolveFBO3, kWidth, kHeight, stencil2);
8294*8975f5c5SAndroid Build Coastguard Worker     };
8295*8975f5c5SAndroid Build Coastguard Worker 
8296*8975f5c5SAndroid Build Coastguard Worker     runTest(0.1f, 0x78, 0.4f, 0x34, DepthStencilResolve::Simultaneous);
8297*8975f5c5SAndroid Build Coastguard Worker     runTest(0.6f, 0x7E, 0.5f, 0x6C, DepthStencilResolve::SeparateAspects);
8298*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8299*8975f5c5SAndroid Build Coastguard Worker }
8300*8975f5c5SAndroid Build Coastguard Worker 
8301*8975f5c5SAndroid Build Coastguard Worker // Similar to ResolveThenChangeAttachmentThenResolveAgain, but the attachment format is also changed
TEST_P(FramebufferTest_ES31,ResolveThenChangeAttachmentFormatThenResolveAgain)8302*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ResolveThenChangeAttachmentFormatThenResolveAgain)
8303*8975f5c5SAndroid Build Coastguard Worker {
8304*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
8305*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
8306*8975f5c5SAndroid Build Coastguard Worker     GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
8307*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorLoc, -1);
8308*8975f5c5SAndroid Build Coastguard Worker 
8309*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 32;
8310*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 24;
8311*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
8312*8975f5c5SAndroid Build Coastguard Worker 
8313*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaa0, msaa1;
8314*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaa0);
8315*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
8316*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaa1);
8317*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGB565, kWidth, kHeight, false);
8318*8975f5c5SAndroid Build Coastguard Worker 
8319*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
8320*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8321*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, msaa0,
8322*8975f5c5SAndroid Build Coastguard Worker                            0);
8323*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8324*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8325*8975f5c5SAndroid Build Coastguard Worker 
8326*8975f5c5SAndroid Build Coastguard Worker     // Create two resolve FBOs and textures. Use different texture levels and layers.
8327*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture1;
8328*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture1);
8329*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, kWidth * 4, kHeight * 4);
8330*8975f5c5SAndroid Build Coastguard Worker 
8331*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO1;
8332*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO1);
8333*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture1, 2);
8334*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8335*8975f5c5SAndroid Build Coastguard Worker 
8336*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture2;
8337*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture2);
8338*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGB565, kWidth * 4, kHeight * 4);
8339*8975f5c5SAndroid Build Coastguard Worker 
8340*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO2;
8341*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO2);
8342*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture2, 2);
8343*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8344*8975f5c5SAndroid Build Coastguard Worker 
8345*8975f5c5SAndroid Build Coastguard Worker     // Draw and resolve once
8346*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8347*8975f5c5SAndroid Build Coastguard Worker     glUniform4fv(colorLoc, 1, GLColor::blue.toNormalizedVector().data());
8348*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
8349*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8350*8975f5c5SAndroid Build Coastguard Worker 
8351*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO1);
8352*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
8353*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
8354*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8355*8975f5c5SAndroid Build Coastguard Worker 
8356*8975f5c5SAndroid Build Coastguard Worker     // Change the framebuffer attachment to another texture with a different format
8357*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8358*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, msaa1,
8359*8975f5c5SAndroid Build Coastguard Worker                            0);
8360*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8361*8975f5c5SAndroid Build Coastguard Worker 
8362*8975f5c5SAndroid Build Coastguard Worker     // Draw and resolve again
8363*8975f5c5SAndroid Build Coastguard Worker     glUniform4fv(colorLoc, 1, GLColor::yellow.toNormalizedVector().data());
8364*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
8365*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8366*8975f5c5SAndroid Build Coastguard Worker 
8367*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO2);
8368*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
8369*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
8370*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8371*8975f5c5SAndroid Build Coastguard Worker 
8372*8975f5c5SAndroid Build Coastguard Worker     // Verify results
8373*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO1);
8374*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::blue);
8375*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8376*8975f5c5SAndroid Build Coastguard Worker 
8377*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO2);
8378*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::yellow);
8379*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8380*8975f5c5SAndroid Build Coastguard Worker }
8381*8975f5c5SAndroid Build Coastguard Worker 
8382*8975f5c5SAndroid Build Coastguard Worker // Draw and resolve once, use the resolve attachment as a storage image, then draw and resolve
8383*8975f5c5SAndroid Build Coastguard Worker // again.  The storage image usage may recreate the image internally, and this test makes sure the
8384*8975f5c5SAndroid Build Coastguard Worker // wrong framebuffer or render pass is not picked from a cache.
TEST_P(FramebufferTest_ES31,ResolveThenUseAsStorageImageThenResolveAgain)8385*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, ResolveThenUseAsStorageImageThenResolveAgain)
8386*8975f5c5SAndroid Build Coastguard Worker {
8387*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
8388*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
8389*8975f5c5SAndroid Build Coastguard Worker     GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
8390*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorLoc, -1);
8391*8975f5c5SAndroid Build Coastguard Worker 
8392*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 36;
8393*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 20;
8394*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
8395*8975f5c5SAndroid Build Coastguard Worker 
8396*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaa0, msaa1;
8397*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaa0);
8398*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
8399*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaa1);
8400*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
8401*8975f5c5SAndroid Build Coastguard Worker 
8402*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
8403*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8404*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, msaa0,
8405*8975f5c5SAndroid Build Coastguard Worker                            0);
8406*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8407*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8408*8975f5c5SAndroid Build Coastguard Worker 
8409*8975f5c5SAndroid Build Coastguard Worker     // Create the resolve FBO and texture.
8410*8975f5c5SAndroid Build Coastguard Worker     GLTexture resolveTexture;
8411*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, resolveTexture);
8412*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, kWidth * 2, kHeight * 2);
8413*8975f5c5SAndroid Build Coastguard Worker 
8414*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer resolveFBO;
8415*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO);
8416*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 1);
8417*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8418*8975f5c5SAndroid Build Coastguard Worker 
8419*8975f5c5SAndroid Build Coastguard Worker     // Draw and resolve once
8420*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8421*8975f5c5SAndroid Build Coastguard Worker     glUniform4fv(colorLoc, 1, GLColor::green.toNormalizedVector().data());
8422*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
8423*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8424*8975f5c5SAndroid Build Coastguard Worker 
8425*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
8426*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
8427*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
8428*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8429*8975f5c5SAndroid Build Coastguard Worker 
8430*8975f5c5SAndroid Build Coastguard Worker     // Use the resolve attachment as a storage image.  A different level is used to be able to
8431*8975f5c5SAndroid Build Coastguard Worker     // verify the compute shader results.
8432*8975f5c5SAndroid Build Coastguard Worker     constexpr char kCS[] = R"(#version 310 es
8433*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=1, local_size_y=1, local_size_z=1) in;
8434*8975f5c5SAndroid Build Coastguard Worker layout(rgba8, binding = 0) writeonly uniform highp image2D image;
8435*8975f5c5SAndroid Build Coastguard Worker void main()
8436*8975f5c5SAndroid Build Coastguard Worker {
8437*8975f5c5SAndroid Build Coastguard Worker     imageStore(image, ivec2(gl_GlobalInvocationID.xy), vec4(1, 1, 0, 1));
8438*8975f5c5SAndroid Build Coastguard Worker })";
8439*8975f5c5SAndroid Build Coastguard Worker 
8440*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_COMPUTE_PROGRAM(csProgram, kCS);
8441*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(csProgram);
8442*8975f5c5SAndroid Build Coastguard Worker     glBindImageTexture(0, resolveTexture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);
8443*8975f5c5SAndroid Build Coastguard Worker     glDispatchCompute(kWidth * 2, kHeight * 2, 1);
8444*8975f5c5SAndroid Build Coastguard Worker 
8445*8975f5c5SAndroid Build Coastguard Worker     // Draw and resolve again
8446*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8447*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
8448*8975f5c5SAndroid Build Coastguard Worker     glUniform4fv(colorLoc, 1, GLColor::blue.toNormalizedVector().data());
8449*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
8450*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
8451*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true);
8452*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8453*8975f5c5SAndroid Build Coastguard Worker 
8454*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO);
8455*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
8456*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
8457*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8458*8975f5c5SAndroid Build Coastguard Worker 
8459*8975f5c5SAndroid Build Coastguard Worker     // Verify resolve results
8460*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
8461*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::cyan);
8462*8975f5c5SAndroid Build Coastguard Worker 
8463*8975f5c5SAndroid Build Coastguard Worker     // For completeness, verify compute shader write results
8464*8975f5c5SAndroid Build Coastguard Worker     glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
8465*8975f5c5SAndroid Build Coastguard Worker 
8466*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture,
8467*8975f5c5SAndroid Build Coastguard Worker                            0);
8468*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO);
8469*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth * 2, kHeight * 2, GLColor::yellow);
8470*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8471*8975f5c5SAndroid Build Coastguard Worker }
8472*8975f5c5SAndroid Build Coastguard Worker 
8473*8975f5c5SAndroid Build Coastguard Worker // Test that invalidation tracking works when glBlitFramebuffer resolves into an invalidated
8474*8975f5c5SAndroid Build Coastguard Worker // framebuffer.
TEST_P(FramebufferTest_ES31,InvalidateThenResolve)8475*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferTest_ES31, InvalidateThenResolve)
8476*8975f5c5SAndroid Build Coastguard Worker {
8477*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
8478*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
8479*8975f5c5SAndroid Build Coastguard Worker     GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
8480*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorLoc, -1);
8481*8975f5c5SAndroid Build Coastguard Worker 
8482*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 36;
8483*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 20;
8484*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
8485*8975f5c5SAndroid Build Coastguard Worker 
8486*8975f5c5SAndroid Build Coastguard Worker     GLTexture color;
8487*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, color);
8488*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight);
8489*8975f5c5SAndroid Build Coastguard Worker 
8490*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer FBO;
8491*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, FBO);
8492*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
8493*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8494*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8495*8975f5c5SAndroid Build Coastguard Worker 
8496*8975f5c5SAndroid Build Coastguard Worker     // Initialize the single-sampled image but discard it right away.
8497*8975f5c5SAndroid Build Coastguard Worker     glUniform4fv(colorLoc, 1, GLColor::green.toNormalizedVector().data());
8498*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
8499*8975f5c5SAndroid Build Coastguard Worker     const GLenum discard[] = {GL_COLOR_ATTACHMENT0};
8500*8975f5c5SAndroid Build Coastguard Worker     glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discard);
8501*8975f5c5SAndroid Build Coastguard Worker 
8502*8975f5c5SAndroid Build Coastguard Worker     GLTexture msaaColor;
8503*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaColor);
8504*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kWidth, kHeight, false);
8505*8975f5c5SAndroid Build Coastguard Worker 
8506*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer msaaFBO;
8507*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
8508*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
8509*8975f5c5SAndroid Build Coastguard Worker                            msaaColor, 0);
8510*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8511*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
8512*8975f5c5SAndroid Build Coastguard Worker 
8513*8975f5c5SAndroid Build Coastguard Worker     // Draw into the MSAA image
8514*8975f5c5SAndroid Build Coastguard Worker     glUniform4fv(colorLoc, 1, GLColor::red.toNormalizedVector().data());
8515*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
8516*8975f5c5SAndroid Build Coastguard Worker 
8517*8975f5c5SAndroid Build Coastguard Worker     // Resolve into the single-sampled image
8518*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FBO);
8519*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
8520*8975f5c5SAndroid Build Coastguard Worker                       GL_NEAREST);
8521*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8522*8975f5c5SAndroid Build Coastguard Worker 
8523*8975f5c5SAndroid Build Coastguard Worker     // At this point, the contents of the single-sampled image must be considered well-defined (not
8524*8975f5c5SAndroid Build Coastguard Worker     // invalidated).  Blend transparent blue in it for verification.
8525*8975f5c5SAndroid Build Coastguard Worker 
8526*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
8527*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
8528*8975f5c5SAndroid Build Coastguard Worker 
8529*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorLoc, 0, 0, 1, 0);
8530*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
8531*8975f5c5SAndroid Build Coastguard Worker 
8532*8975f5c5SAndroid Build Coastguard Worker     // Verify resolve results
8533*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, FBO);
8534*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::magenta);
8535*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
8536*8975f5c5SAndroid Build Coastguard Worker }
8537*8975f5c5SAndroid Build Coastguard Worker 
8538*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND(AddMockTextureNoRenderTargetTest,
8539*8975f5c5SAndroid Build Coastguard Worker                                ES2_D3D9().enable(Feature::AddMockTextureNoRenderTarget),
8540*8975f5c5SAndroid Build Coastguard Worker                                ES2_D3D11().enable(Feature::AddMockTextureNoRenderTarget));
8541*8975f5c5SAndroid Build Coastguard Worker 
8542*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(FramebufferTest);
8543*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(FramebufferExtensionsTest);
8544*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(FramebufferFormatsTest);
8545*8975f5c5SAndroid Build Coastguard Worker 
8546*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferTest_ES3);
8547*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(FramebufferTest_ES3,
8548*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(Feature::EmulatedPrerotation90),
8549*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(Feature::EmulatedPrerotation180),
8550*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(Feature::EmulatedPrerotation270));
8551*8975f5c5SAndroid Build Coastguard Worker 
8552*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferTest_ES3Metal);
8553*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(FramebufferTest_ES3Metal,
8554*8975f5c5SAndroid Build Coastguard Worker                        ES3_METAL().enable(Feature::LimitMaxColorTargetBitsForTesting));
8555*8975f5c5SAndroid Build Coastguard Worker 
8556*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferTest_ES31);
8557*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31_AND(FramebufferTest_ES31,
8558*8975f5c5SAndroid Build Coastguard Worker                                 ES31_VULKAN().disable(Feature::SupportsImagelessFramebuffer));
8559*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(FramebufferTestWithFormatFallback);
8560*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(DefaultFramebufferTest);
8561