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 // StateChangeTest:
7*8975f5c5SAndroid Build Coastguard Worker // Specifically designed for an ANGLE implementation of GL, these tests validate that
8*8975f5c5SAndroid Build Coastguard Worker // ANGLE's dirty bits systems don't get confused by certain sequences of state changes.
9*8975f5c5SAndroid Build Coastguard Worker //
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "util/random_utils.h"
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Worker #include <thread>
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
18*8975f5c5SAndroid Build Coastguard Worker
19*8975f5c5SAndroid Build Coastguard Worker namespace
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker
22*8975f5c5SAndroid Build Coastguard Worker class StateChangeTest : public ANGLETest<>
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker protected:
StateChangeTest()25*8975f5c5SAndroid Build Coastguard Worker StateChangeTest()
26*8975f5c5SAndroid Build Coastguard Worker {
27*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(64);
28*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(64);
29*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
30*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
31*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
32*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
33*8975f5c5SAndroid Build Coastguard Worker setConfigDepthBits(24);
34*8975f5c5SAndroid Build Coastguard Worker setConfigStencilBits(8);
35*8975f5c5SAndroid Build Coastguard Worker
36*8975f5c5SAndroid Build Coastguard Worker // Enable the no error extension to avoid syncing the FBO state on validation.
37*8975f5c5SAndroid Build Coastguard Worker setNoErrorEnabled(true);
38*8975f5c5SAndroid Build Coastguard Worker }
39*8975f5c5SAndroid Build Coastguard Worker
testSetUp()40*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mFramebuffer);
43*8975f5c5SAndroid Build Coastguard Worker glGenTextures(2, mTextures.data());
44*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &mRenderbuffer);
45*8975f5c5SAndroid Build Coastguard Worker
46*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
47*8975f5c5SAndroid Build Coastguard Worker }
48*8975f5c5SAndroid Build Coastguard Worker
testTearDown()49*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override
50*8975f5c5SAndroid Build Coastguard Worker {
51*8975f5c5SAndroid Build Coastguard Worker if (mFramebuffer != 0)
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mFramebuffer);
54*8975f5c5SAndroid Build Coastguard Worker mFramebuffer = 0;
55*8975f5c5SAndroid Build Coastguard Worker }
56*8975f5c5SAndroid Build Coastguard Worker
57*8975f5c5SAndroid Build Coastguard Worker if (!mTextures.empty())
58*8975f5c5SAndroid Build Coastguard Worker {
59*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(static_cast<GLsizei>(mTextures.size()), mTextures.data());
60*8975f5c5SAndroid Build Coastguard Worker mTextures.clear();
61*8975f5c5SAndroid Build Coastguard Worker }
62*8975f5c5SAndroid Build Coastguard Worker
63*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &mRenderbuffer);
64*8975f5c5SAndroid Build Coastguard Worker }
65*8975f5c5SAndroid Build Coastguard Worker
66*8975f5c5SAndroid Build Coastguard Worker GLuint mFramebuffer = 0;
67*8975f5c5SAndroid Build Coastguard Worker GLuint mRenderbuffer = 0;
68*8975f5c5SAndroid Build Coastguard Worker std::vector<GLuint> mTextures = {0, 0};
69*8975f5c5SAndroid Build Coastguard Worker };
70*8975f5c5SAndroid Build Coastguard Worker
71*8975f5c5SAndroid Build Coastguard Worker class StateChangeTestES3 : public StateChangeTest
72*8975f5c5SAndroid Build Coastguard Worker {
73*8975f5c5SAndroid Build Coastguard Worker protected:
StateChangeTestES3()74*8975f5c5SAndroid Build Coastguard Worker StateChangeTestES3() {}
75*8975f5c5SAndroid Build Coastguard Worker };
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker class StateChangeTestES31 : public StateChangeTest
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker protected:
StateChangeTestES31()80*8975f5c5SAndroid Build Coastguard Worker StateChangeTestES31() {}
81*8975f5c5SAndroid Build Coastguard Worker };
82*8975f5c5SAndroid Build Coastguard Worker
83*8975f5c5SAndroid Build Coastguard Worker // Ensure that CopyTexImage2D syncs framebuffer changes.
TEST_P(StateChangeTest,CopyTexImage2DSync)84*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, CopyTexImage2DSync)
85*8975f5c5SAndroid Build Coastguard Worker {
86*8975f5c5SAndroid Build Coastguard Worker // TODO(geofflang): Fix on Linux AMD drivers (http://anglebug.com/42260302)
87*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
88*8975f5c5SAndroid Build Coastguard Worker
89*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
90*8975f5c5SAndroid Build Coastguard Worker
91*8975f5c5SAndroid Build Coastguard Worker // Init first texture to red
92*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
93*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
94*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
95*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
96*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
97*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
98*8975f5c5SAndroid Build Coastguard Worker
99*8975f5c5SAndroid Build Coastguard Worker // Init second texture to green
100*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
101*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
102*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);
103*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
104*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
105*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
106*8975f5c5SAndroid Build Coastguard Worker
107*8975f5c5SAndroid Build Coastguard Worker // Copy in the red texture to the green one.
108*8975f5c5SAndroid Build Coastguard Worker // CopyTexImage should sync the framebuffer attachment change.
109*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
110*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 16, 16, 0);
111*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);
112*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
113*8975f5c5SAndroid Build Coastguard Worker
114*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
115*8975f5c5SAndroid Build Coastguard Worker }
116*8975f5c5SAndroid Build Coastguard Worker
117*8975f5c5SAndroid Build Coastguard Worker // Ensure that CopyTexSubImage2D syncs framebuffer changes.
TEST_P(StateChangeTest,CopyTexSubImage2DSync)118*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, CopyTexSubImage2DSync)
119*8975f5c5SAndroid Build Coastguard Worker {
120*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
121*8975f5c5SAndroid Build Coastguard Worker
122*8975f5c5SAndroid Build Coastguard Worker // Init first texture to red
123*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
124*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
125*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
126*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
127*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
128*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
129*8975f5c5SAndroid Build Coastguard Worker
130*8975f5c5SAndroid Build Coastguard Worker // Init second texture to green
131*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
132*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
133*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);
134*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
135*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
136*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
137*8975f5c5SAndroid Build Coastguard Worker
138*8975f5c5SAndroid Build Coastguard Worker // Copy in the red texture to the green one.
139*8975f5c5SAndroid Build Coastguard Worker // CopyTexImage should sync the framebuffer attachment change.
140*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
141*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 16, 16);
142*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);
143*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
144*8975f5c5SAndroid Build Coastguard Worker
145*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
146*8975f5c5SAndroid Build Coastguard Worker }
147*8975f5c5SAndroid Build Coastguard Worker
148*8975f5c5SAndroid Build Coastguard Worker // Test that Framebuffer completeness caching works when color attachments change.
TEST_P(StateChangeTest,FramebufferIncompleteColorAttachment)149*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, FramebufferIncompleteColorAttachment)
150*8975f5c5SAndroid Build Coastguard Worker {
151*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
152*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
153*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
154*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
155*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
156*8975f5c5SAndroid Build Coastguard Worker
157*8975f5c5SAndroid Build Coastguard Worker // Change the texture at color attachment 0 to be non-color-renderable.
158*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 16, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
159*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
160*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
161*8975f5c5SAndroid Build Coastguard Worker
162*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
163*8975f5c5SAndroid Build Coastguard Worker }
164*8975f5c5SAndroid Build Coastguard Worker
165*8975f5c5SAndroid Build Coastguard Worker // Test that caching works when color attachments change with TexStorage.
TEST_P(StateChangeTest,FramebufferIncompleteWithTexStorage)166*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, FramebufferIncompleteWithTexStorage)
167*8975f5c5SAndroid Build Coastguard Worker {
168*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
169*8975f5c5SAndroid Build Coastguard Worker
170*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
171*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
172*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
173*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
174*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
175*8975f5c5SAndroid Build Coastguard Worker
176*8975f5c5SAndroid Build Coastguard Worker // Change the texture at color attachment 0 to be non-color-renderable.
177*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_ALPHA8_EXT, 16, 16);
178*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
179*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
180*8975f5c5SAndroid Build Coastguard Worker
181*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
182*8975f5c5SAndroid Build Coastguard Worker }
183*8975f5c5SAndroid Build Coastguard Worker
184*8975f5c5SAndroid Build Coastguard Worker // Test that caching works when color attachments change with CompressedTexImage2D.
TEST_P(StateChangeTestES3,FramebufferIncompleteWithCompressedTex)185*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, FramebufferIncompleteWithCompressedTex)
186*8975f5c5SAndroid Build Coastguard Worker {
187*8975f5c5SAndroid Build Coastguard Worker // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/42262497
188*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsMac() && IsDesktopOpenGL());
189*8975f5c5SAndroid Build Coastguard Worker
190*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
191*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
192*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
193*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
194*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
195*8975f5c5SAndroid Build Coastguard Worker
196*8975f5c5SAndroid Build Coastguard Worker // Change the texture at color attachment 0 to be non-color-renderable.
197*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 0, 128, nullptr);
198*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
199*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
200*8975f5c5SAndroid Build Coastguard Worker
201*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
202*8975f5c5SAndroid Build Coastguard Worker }
203*8975f5c5SAndroid Build Coastguard Worker
204*8975f5c5SAndroid Build Coastguard Worker // Test that caching works when color attachments are deleted.
TEST_P(StateChangeTestES3,FramebufferIncompleteWhenAttachmentDeleted)205*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, FramebufferIncompleteWhenAttachmentDeleted)
206*8975f5c5SAndroid Build Coastguard Worker {
207*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
208*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
209*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
210*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
211*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
212*8975f5c5SAndroid Build Coastguard Worker
213*8975f5c5SAndroid Build Coastguard Worker // Delete the texture at color attachment 0.
214*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mTextures[0]);
215*8975f5c5SAndroid Build Coastguard Worker mTextures[0] = 0;
216*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,
217*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
218*8975f5c5SAndroid Build Coastguard Worker
219*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
220*8975f5c5SAndroid Build Coastguard Worker }
221*8975f5c5SAndroid Build Coastguard Worker
222*8975f5c5SAndroid Build Coastguard Worker // Test that Framebuffer completeness caching works when depth attachments change.
TEST_P(StateChangeTest,FramebufferIncompleteDepthAttachment)223*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, FramebufferIncompleteDepthAttachment)
224*8975f5c5SAndroid Build Coastguard Worker {
225*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
226*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
227*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
228*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
229*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
230*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 16, 16);
231*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mRenderbuffer);
232*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
233*8975f5c5SAndroid Build Coastguard Worker
234*8975f5c5SAndroid Build Coastguard Worker // Change the texture at color attachment 0 to be non-depth-renderable.
235*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16);
236*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
237*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
238*8975f5c5SAndroid Build Coastguard Worker
239*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
240*8975f5c5SAndroid Build Coastguard Worker }
241*8975f5c5SAndroid Build Coastguard Worker
242*8975f5c5SAndroid Build Coastguard Worker // Test that Framebuffer completeness caching works when stencil attachments change.
TEST_P(StateChangeTest,FramebufferIncompleteStencilAttachment)243*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, FramebufferIncompleteStencilAttachment)
244*8975f5c5SAndroid Build Coastguard Worker {
245*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
246*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
247*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
248*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
249*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
250*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 16, 16);
251*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
252*8975f5c5SAndroid Build Coastguard Worker mRenderbuffer);
253*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
254*8975f5c5SAndroid Build Coastguard Worker
255*8975f5c5SAndroid Build Coastguard Worker // Change the texture at the stencil attachment to be non-stencil-renderable.
256*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16);
257*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
258*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
259*8975f5c5SAndroid Build Coastguard Worker
260*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
261*8975f5c5SAndroid Build Coastguard Worker }
262*8975f5c5SAndroid Build Coastguard Worker
263*8975f5c5SAndroid Build Coastguard Worker // Test that Framebuffer completeness caching works when depth-stencil attachments change.
TEST_P(StateChangeTestES3,FramebufferIncompleteDepthStencilAttachment)264*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, FramebufferIncompleteDepthStencilAttachment)
265*8975f5c5SAndroid Build Coastguard Worker {
266*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
267*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
268*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
269*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
270*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
271*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 16, 16);
272*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
273*8975f5c5SAndroid Build Coastguard Worker mRenderbuffer);
274*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
275*8975f5c5SAndroid Build Coastguard Worker
276*8975f5c5SAndroid Build Coastguard Worker // Change the texture the depth-stencil attachment to be non-depth-stencil-renderable.
277*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16);
278*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
279*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
280*8975f5c5SAndroid Build Coastguard Worker
281*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
282*8975f5c5SAndroid Build Coastguard Worker }
283*8975f5c5SAndroid Build Coastguard Worker
284*8975f5c5SAndroid Build Coastguard Worker // Test that enabling GL_SAMPLE_ALPHA_TO_COVERAGE doesn't generate errors.
TEST_P(StateChangeTest,AlphaToCoverageEnable)285*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, AlphaToCoverageEnable)
286*8975f5c5SAndroid Build Coastguard Worker {
287*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
288*8975f5c5SAndroid Build Coastguard Worker
289*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
290*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
291*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
292*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
293*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
294*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
295*8975f5c5SAndroid Build Coastguard Worker
296*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
297*8975f5c5SAndroid Build Coastguard Worker
298*8975f5c5SAndroid Build Coastguard Worker // We don't actually care that this does anything, just that it can be enabled without causing
299*8975f5c5SAndroid Build Coastguard Worker // an error.
300*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
301*8975f5c5SAndroid Build Coastguard Worker
302*8975f5c5SAndroid Build Coastguard Worker glUseProgram(greenProgram);
303*8975f5c5SAndroid Build Coastguard Worker drawQuad(greenProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
304*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
305*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
306*8975f5c5SAndroid Build Coastguard Worker }
307*8975f5c5SAndroid Build Coastguard Worker
308*8975f5c5SAndroid Build Coastguard Worker const char kSimpleAttributeVS[] = R"(attribute vec2 position;
309*8975f5c5SAndroid Build Coastguard Worker attribute vec4 testAttrib;
310*8975f5c5SAndroid Build Coastguard Worker varying vec4 testVarying;
311*8975f5c5SAndroid Build Coastguard Worker void main()
312*8975f5c5SAndroid Build Coastguard Worker {
313*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
314*8975f5c5SAndroid Build Coastguard Worker testVarying = testAttrib;
315*8975f5c5SAndroid Build Coastguard Worker })";
316*8975f5c5SAndroid Build Coastguard Worker
317*8975f5c5SAndroid Build Coastguard Worker const char kSimpleAttributeFS[] = R"(precision mediump float;
318*8975f5c5SAndroid Build Coastguard Worker varying vec4 testVarying;
319*8975f5c5SAndroid Build Coastguard Worker void main()
320*8975f5c5SAndroid Build Coastguard Worker {
321*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = testVarying;
322*8975f5c5SAndroid Build Coastguard Worker })";
323*8975f5c5SAndroid Build Coastguard Worker
324*8975f5c5SAndroid Build Coastguard Worker // Tests that using a buffered attribute, then disabling it and using current value, works.
TEST_P(StateChangeTest,DisablingBufferedVertexAttribute)325*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, DisablingBufferedVertexAttribute)
326*8975f5c5SAndroid Build Coastguard Worker {
327*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kSimpleAttributeVS, kSimpleAttributeFS);
328*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
329*8975f5c5SAndroid Build Coastguard Worker GLint attribLoc = glGetAttribLocation(program, "testAttrib");
330*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, "position");
331*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, attribLoc);
332*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
333*8975f5c5SAndroid Build Coastguard Worker
334*8975f5c5SAndroid Build Coastguard Worker // Set up the buffered attribute.
335*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> red(6, GLColor::red);
336*8975f5c5SAndroid Build Coastguard Worker GLBuffer attribBuffer;
337*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, attribBuffer);
338*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, red.size() * sizeof(GLColor), red.data(), GL_STATIC_DRAW);
339*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(attribLoc);
340*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(attribLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
341*8975f5c5SAndroid Build Coastguard Worker
342*8975f5c5SAndroid Build Coastguard Worker // Also set the current value to green now.
343*8975f5c5SAndroid Build Coastguard Worker glVertexAttrib4f(attribLoc, 0.0f, 1.0f, 0.0f, 1.0f);
344*8975f5c5SAndroid Build Coastguard Worker
345*8975f5c5SAndroid Build Coastguard Worker // Set up the position attribute as well.
346*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(0.5f, 1.0f);
347*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
348*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
349*8975f5c5SAndroid Build Coastguard Worker
350*8975f5c5SAndroid Build Coastguard Worker // Draw with the buffered attribute. Verify red.
351*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
352*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
353*8975f5c5SAndroid Build Coastguard Worker
354*8975f5c5SAndroid Build Coastguard Worker // Draw with the disabled "current value attribute". Verify green.
355*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(attribLoc);
356*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
357*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
358*8975f5c5SAndroid Build Coastguard Worker
359*8975f5c5SAndroid Build Coastguard Worker // Verify setting buffer data on the disabled buffer doesn't change anything.
360*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> blue(128, GLColor::blue);
361*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, attribBuffer);
362*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, blue.size() * sizeof(GLColor), blue.data(), GL_STATIC_DRAW);
363*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
364*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
365*8975f5c5SAndroid Build Coastguard Worker }
366*8975f5c5SAndroid Build Coastguard Worker
367*8975f5c5SAndroid Build Coastguard Worker // Tests that setting value for a subset of default attributes doesn't affect others.
TEST_P(StateChangeTest,SetCurrentAttribute)368*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, SetCurrentAttribute)
369*8975f5c5SAndroid Build Coastguard Worker {
370*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(attribute vec4 position;
371*8975f5c5SAndroid Build Coastguard Worker attribute mat4 testAttrib; // Note that this generates 4 attributes
372*8975f5c5SAndroid Build Coastguard Worker varying vec4 testVarying;
373*8975f5c5SAndroid Build Coastguard Worker void main (void)
374*8975f5c5SAndroid Build Coastguard Worker {
375*8975f5c5SAndroid Build Coastguard Worker gl_Position = position;
376*8975f5c5SAndroid Build Coastguard Worker
377*8975f5c5SAndroid Build Coastguard Worker testVarying = position.y < 0.0 ?
378*8975f5c5SAndroid Build Coastguard Worker position.x < 0.0 ? testAttrib[0] : testAttrib[1] :
379*8975f5c5SAndroid Build Coastguard Worker position.x < 0.0 ? testAttrib[2] : testAttrib[3];
380*8975f5c5SAndroid Build Coastguard Worker })";
381*8975f5c5SAndroid Build Coastguard Worker
382*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kSimpleAttributeFS);
383*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
384*8975f5c5SAndroid Build Coastguard Worker GLint attribLoc = glGetAttribLocation(program, "testAttrib");
385*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, "position");
386*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, attribLoc);
387*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
388*8975f5c5SAndroid Build Coastguard Worker
389*8975f5c5SAndroid Build Coastguard Worker // Set the current value of two of the test attributes, while leaving the other two as default.
390*8975f5c5SAndroid Build Coastguard Worker glVertexAttrib4f(attribLoc + 1, 0.0f, 1.0f, 0.0f, 1.0f);
391*8975f5c5SAndroid Build Coastguard Worker glVertexAttrib4f(attribLoc + 2, 0.0f, 0.0f, 1.0f, 1.0f);
392*8975f5c5SAndroid Build Coastguard Worker
393*8975f5c5SAndroid Build Coastguard Worker // Set up the position attribute.
394*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(0.5f, 1.0f);
395*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
396*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
397*8975f5c5SAndroid Build Coastguard Worker
398*8975f5c5SAndroid Build Coastguard Worker // Draw and verify the four section in the output:
399*8975f5c5SAndroid Build Coastguard Worker //
400*8975f5c5SAndroid Build Coastguard Worker // +---------------+
401*8975f5c5SAndroid Build Coastguard Worker // | Black | Green |
402*8975f5c5SAndroid Build Coastguard Worker // +-------+-------+
403*8975f5c5SAndroid Build Coastguard Worker // | Blue | Black |
404*8975f5c5SAndroid Build Coastguard Worker // +---------------+
405*8975f5c5SAndroid Build Coastguard Worker //
406*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
407*8975f5c5SAndroid Build Coastguard Worker
408*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
409*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
410*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kPixelTolerance = 5u;
411*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor::black, kPixelTolerance);
412*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(w - 1, 0, GLColor::green, kPixelTolerance);
413*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, h - 1, GLColor::blue, kPixelTolerance);
414*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(w - 1, h - 1, GLColor::black, kPixelTolerance);
415*8975f5c5SAndroid Build Coastguard Worker }
416*8975f5c5SAndroid Build Coastguard Worker
417*8975f5c5SAndroid Build Coastguard Worker // Tests that drawing with transform feedback paused, then lines without transform feedback works
418*8975f5c5SAndroid Build Coastguard Worker // without Vulkan validation errors.
TEST_P(StateChangeTestES3,DrawPausedXfbThenNonXfbLines)419*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, DrawPausedXfbThenNonXfbLines)
420*8975f5c5SAndroid Build Coastguard Worker {
421*8975f5c5SAndroid Build Coastguard Worker // glTransformFeedbackVaryings for program2 returns GL_INVALID_OPERATION on both Linux and
422*8975f5c5SAndroid Build Coastguard Worker // windows. http://anglebug.com/42262893
423*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsIntel() && IsOpenGL());
424*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263928
425*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
426*8975f5c5SAndroid Build Coastguard Worker
427*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> tfVaryings = {"gl_Position"};
428*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(program1, essl1_shaders::vs::Simple(),
429*8975f5c5SAndroid Build Coastguard Worker essl1_shaders::fs::Blue(), tfVaryings, GL_SEPARATE_ATTRIBS);
430*8975f5c5SAndroid Build Coastguard Worker
431*8975f5c5SAndroid Build Coastguard Worker GLBuffer xfbBuffer;
432*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfbBuffer);
433*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 6 * sizeof(float[4]), nullptr, GL_STATIC_DRAW);
434*8975f5c5SAndroid Build Coastguard Worker
435*8975f5c5SAndroid Build Coastguard Worker GLTransformFeedback xfb;
436*8975f5c5SAndroid Build Coastguard Worker glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, xfb);
437*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, xfbBuffer);
438*8975f5c5SAndroid Build Coastguard Worker
439*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program1);
440*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_TRIANGLES);
441*8975f5c5SAndroid Build Coastguard Worker glPauseTransformFeedback();
442*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
443*8975f5c5SAndroid Build Coastguard Worker
444*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program2, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
445*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program2);
446*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINES, 0, 6);
447*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
448*8975f5c5SAndroid Build Coastguard Worker
449*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
450*8975f5c5SAndroid Build Coastguard Worker }
451*8975f5c5SAndroid Build Coastguard Worker
452*8975f5c5SAndroid Build Coastguard Worker // Tests that vertex attribute value is preserved across context switches.
TEST_P(StateChangeTest,MultiContextVertexAttribute)453*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, MultiContextVertexAttribute)
454*8975f5c5SAndroid Build Coastguard Worker {
455*8975f5c5SAndroid Build Coastguard Worker EGLWindow *window = getEGLWindow();
456*8975f5c5SAndroid Build Coastguard Worker EGLDisplay display = window->getDisplay();
457*8975f5c5SAndroid Build Coastguard Worker EGLConfig config = window->getConfig();
458*8975f5c5SAndroid Build Coastguard Worker EGLSurface surface = window->getSurface();
459*8975f5c5SAndroid Build Coastguard Worker EGLContext context1 = window->getContext();
460*8975f5c5SAndroid Build Coastguard Worker
461*8975f5c5SAndroid Build Coastguard Worker // Set up program in primary context
462*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program1, kSimpleAttributeVS, kSimpleAttributeFS);
463*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program1);
464*8975f5c5SAndroid Build Coastguard Worker GLint attribLoc = glGetAttribLocation(program1, "testAttrib");
465*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program1, "position");
466*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, attribLoc);
467*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
468*8975f5c5SAndroid Build Coastguard Worker
469*8975f5c5SAndroid Build Coastguard Worker // Set up the position attribute in primary context
470*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(0.5f, 1.0f);
471*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
472*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
473*8975f5c5SAndroid Build Coastguard Worker
474*8975f5c5SAndroid Build Coastguard Worker // Set primary context attribute to green and draw quad
475*8975f5c5SAndroid Build Coastguard Worker glVertexAttrib4f(attribLoc, 0.0f, 1.0f, 0.0f, 1.0f);
476*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
477*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
478*8975f5c5SAndroid Build Coastguard Worker
479*8975f5c5SAndroid Build Coastguard Worker // Set up and switch to secondary context
480*8975f5c5SAndroid Build Coastguard Worker EGLint contextAttributes[] = {
481*8975f5c5SAndroid Build Coastguard Worker EGL_CONTEXT_MAJOR_VERSION_KHR,
482*8975f5c5SAndroid Build Coastguard Worker GetParam().majorVersion,
483*8975f5c5SAndroid Build Coastguard Worker EGL_CONTEXT_MINOR_VERSION_KHR,
484*8975f5c5SAndroid Build Coastguard Worker GetParam().minorVersion,
485*8975f5c5SAndroid Build Coastguard Worker EGL_NONE,
486*8975f5c5SAndroid Build Coastguard Worker };
487*8975f5c5SAndroid Build Coastguard Worker EGLContext context2 = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttributes);
488*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(context2, EGL_NO_CONTEXT);
489*8975f5c5SAndroid Build Coastguard Worker eglMakeCurrent(display, surface, surface, context2);
490*8975f5c5SAndroid Build Coastguard Worker
491*8975f5c5SAndroid Build Coastguard Worker // Set up program in secondary context
492*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program2, kSimpleAttributeVS, kSimpleAttributeFS);
493*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program2);
494*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(attribLoc, glGetAttribLocation(program2, "testAttrib"));
495*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(positionLoc, glGetAttribLocation(program2, "position"));
496*8975f5c5SAndroid Build Coastguard Worker
497*8975f5c5SAndroid Build Coastguard Worker // Set up the position attribute in secondary context
498*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(0.5f, 1.0f);
499*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
500*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
501*8975f5c5SAndroid Build Coastguard Worker
502*8975f5c5SAndroid Build Coastguard Worker // attribLoc current value should be default - (0,0,0,1)
503*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
504*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
505*8975f5c5SAndroid Build Coastguard Worker
506*8975f5c5SAndroid Build Coastguard Worker // Restore primary context
507*8975f5c5SAndroid Build Coastguard Worker eglMakeCurrent(display, surface, surface, context1);
508*8975f5c5SAndroid Build Coastguard Worker // ReadPixels to ensure context is switched
509*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
510*8975f5c5SAndroid Build Coastguard Worker
511*8975f5c5SAndroid Build Coastguard Worker // Switch to secondary context second time
512*8975f5c5SAndroid Build Coastguard Worker eglMakeCurrent(display, surface, surface, context2);
513*8975f5c5SAndroid Build Coastguard Worker // Check that it still draws black
514*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
515*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
516*8975f5c5SAndroid Build Coastguard Worker
517*8975f5c5SAndroid Build Coastguard Worker // Restore primary context second time
518*8975f5c5SAndroid Build Coastguard Worker eglMakeCurrent(display, surface, surface, context1);
519*8975f5c5SAndroid Build Coastguard Worker // Check if it still draws green
520*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
521*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
522*8975f5c5SAndroid Build Coastguard Worker
523*8975f5c5SAndroid Build Coastguard Worker // Clean up
524*8975f5c5SAndroid Build Coastguard Worker eglDestroyContext(display, context2);
525*8975f5c5SAndroid Build Coastguard Worker }
526*8975f5c5SAndroid Build Coastguard Worker
527*8975f5c5SAndroid Build Coastguard Worker // Ensure that CopyTexSubImage3D syncs framebuffer changes.
TEST_P(StateChangeTestES3,CopyTexSubImage3DSync)528*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, CopyTexSubImage3DSync)
529*8975f5c5SAndroid Build Coastguard Worker {
530*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
531*8975f5c5SAndroid Build Coastguard Worker
532*8975f5c5SAndroid Build Coastguard Worker // Init first texture to red
533*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_3D, mTextures[0]);
534*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 16, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
535*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextures[0], 0, 0);
536*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
537*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
538*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
539*8975f5c5SAndroid Build Coastguard Worker
540*8975f5c5SAndroid Build Coastguard Worker // Init second texture to green
541*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_3D, mTextures[1]);
542*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 16, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
543*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextures[1], 0, 0);
544*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
545*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
546*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
547*8975f5c5SAndroid Build Coastguard Worker
548*8975f5c5SAndroid Build Coastguard Worker // Copy in the red texture to the green one.
549*8975f5c5SAndroid Build Coastguard Worker // CopyTexImage should sync the framebuffer attachment change.
550*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextures[0], 0, 0);
551*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 16, 16);
552*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextures[1], 0, 0);
553*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
554*8975f5c5SAndroid Build Coastguard Worker
555*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
556*8975f5c5SAndroid Build Coastguard Worker }
557*8975f5c5SAndroid Build Coastguard Worker
558*8975f5c5SAndroid Build Coastguard Worker // Ensure that BlitFramebuffer syncs framebuffer changes.
TEST_P(StateChangeTestES3,BlitFramebufferSync)559*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, BlitFramebufferSync)
560*8975f5c5SAndroid Build Coastguard Worker {
561*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
562*8975f5c5SAndroid Build Coastguard Worker
563*8975f5c5SAndroid Build Coastguard Worker // Init first texture to red
564*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
565*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
566*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
567*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
568*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
569*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
570*8975f5c5SAndroid Build Coastguard Worker
571*8975f5c5SAndroid Build Coastguard Worker // Init second texture to green
572*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
573*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
574*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);
575*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
576*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
577*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
578*8975f5c5SAndroid Build Coastguard Worker
579*8975f5c5SAndroid Build Coastguard Worker // Change to the red textures and blit.
580*8975f5c5SAndroid Build Coastguard Worker // BlitFramebuffer should sync the framebuffer attachment change.
581*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
582*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0],
583*8975f5c5SAndroid Build Coastguard Worker 0);
584*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
585*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
586*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
587*8975f5c5SAndroid Build Coastguard Worker
588*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
589*8975f5c5SAndroid Build Coastguard Worker }
590*8975f5c5SAndroid Build Coastguard Worker
591*8975f5c5SAndroid Build Coastguard Worker // Ensure that ReadBuffer and DrawBuffers sync framebuffer changes.
TEST_P(StateChangeTestES3,ReadBufferAndDrawBuffersSync)592*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, ReadBufferAndDrawBuffersSync)
593*8975f5c5SAndroid Build Coastguard Worker {
594*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
595*8975f5c5SAndroid Build Coastguard Worker
596*8975f5c5SAndroid Build Coastguard Worker // Initialize two FBO attachments
597*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
598*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
599*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
600*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
601*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
602*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, mTextures[1], 0);
603*8975f5c5SAndroid Build Coastguard Worker
604*8975f5c5SAndroid Build Coastguard Worker // Clear first attachment to red
605*8975f5c5SAndroid Build Coastguard Worker GLenum bufs1[] = {GL_COLOR_ATTACHMENT0, GL_NONE};
606*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, bufs1);
607*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
608*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
609*8975f5c5SAndroid Build Coastguard Worker
610*8975f5c5SAndroid Build Coastguard Worker // Clear second texture to green
611*8975f5c5SAndroid Build Coastguard Worker GLenum bufs2[] = {GL_NONE, GL_COLOR_ATTACHMENT1};
612*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, bufs2);
613*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
614*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
615*8975f5c5SAndroid Build Coastguard Worker
616*8975f5c5SAndroid Build Coastguard Worker // Verify first attachment is red and second is green
617*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT1);
618*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
619*8975f5c5SAndroid Build Coastguard Worker
620*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
621*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
622*8975f5c5SAndroid Build Coastguard Worker
623*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
624*8975f5c5SAndroid Build Coastguard Worker }
625*8975f5c5SAndroid Build Coastguard Worker
626*8975f5c5SAndroid Build Coastguard Worker // Tests calling invalidate on incomplete framebuffers after switching attachments.
627*8975f5c5SAndroid Build Coastguard Worker // Adapted partially from WebGL 2 test "renderbuffers/invalidate-framebuffer"
TEST_P(StateChangeTestES3,IncompleteRenderbufferAttachmentInvalidateSync)628*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, IncompleteRenderbufferAttachmentInvalidateSync)
629*8975f5c5SAndroid Build Coastguard Worker {
630*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
631*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
632*8975f5c5SAndroid Build Coastguard Worker GLint samples = 0;
633*8975f5c5SAndroid Build Coastguard Worker glGetInternalformativ(GL_RENDERBUFFER, GL_RGBA8, GL_SAMPLES, 1, &samples);
634*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mRenderbuffer);
635*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
636*8975f5c5SAndroid Build Coastguard Worker
637*8975f5c5SAndroid Build Coastguard Worker // invalidate the framebuffer when the attachment is incomplete: no storage allocated to the
638*8975f5c5SAndroid Build Coastguard Worker // attached renderbuffer
639*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
640*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
641*8975f5c5SAndroid Build Coastguard Worker GLenum attachments1[] = {GL_COLOR_ATTACHMENT0};
642*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments1);
643*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
644*8975f5c5SAndroid Build Coastguard Worker
645*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, static_cast<GLsizei>(samples), GL_RGBA8,
646*8975f5c5SAndroid Build Coastguard Worker getWindowWidth(), getWindowHeight());
647*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
648*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
649*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
650*8975f5c5SAndroid Build Coastguard Worker
651*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuf;
652*8975f5c5SAndroid Build Coastguard Worker
653*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
654*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuf);
655*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
656*8975f5c5SAndroid Build Coastguard Worker
657*8975f5c5SAndroid Build Coastguard Worker // invalidate the framebuffer when the attachment is incomplete: no storage allocated to the
658*8975f5c5SAndroid Build Coastguard Worker // attached renderbuffer
659*8975f5c5SAndroid Build Coastguard Worker // Note: the bug will only repro *without* a call to checkStatus before the invalidate.
660*8975f5c5SAndroid Build Coastguard Worker GLenum attachments2[] = {GL_DEPTH_ATTACHMENT};
661*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments2);
662*8975f5c5SAndroid Build Coastguard Worker
663*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, static_cast<GLsizei>(samples),
664*8975f5c5SAndroid Build Coastguard Worker GL_DEPTH_COMPONENT16, getWindowWidth(), getWindowHeight());
665*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
666*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT);
667*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
668*8975f5c5SAndroid Build Coastguard Worker }
669*8975f5c5SAndroid Build Coastguard Worker
670*8975f5c5SAndroid Build Coastguard Worker class StateChangeRenderTest : public StateChangeTest
671*8975f5c5SAndroid Build Coastguard Worker {
672*8975f5c5SAndroid Build Coastguard Worker protected:
StateChangeRenderTest()673*8975f5c5SAndroid Build Coastguard Worker StateChangeRenderTest() : mProgram(0), mRenderbuffer(0) {}
674*8975f5c5SAndroid Build Coastguard Worker
testSetUp()675*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
676*8975f5c5SAndroid Build Coastguard Worker {
677*8975f5c5SAndroid Build Coastguard Worker StateChangeTest::testSetUp();
678*8975f5c5SAndroid Build Coastguard Worker
679*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] =
680*8975f5c5SAndroid Build Coastguard Worker "attribute vec2 position;\n"
681*8975f5c5SAndroid Build Coastguard Worker "void main() {\n"
682*8975f5c5SAndroid Build Coastguard Worker " gl_Position = vec4(position, 0, 1);\n"
683*8975f5c5SAndroid Build Coastguard Worker "}";
684*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
685*8975f5c5SAndroid Build Coastguard Worker "uniform highp vec4 uniformColor;\n"
686*8975f5c5SAndroid Build Coastguard Worker "void main() {\n"
687*8975f5c5SAndroid Build Coastguard Worker " gl_FragColor = uniformColor;\n"
688*8975f5c5SAndroid Build Coastguard Worker "}";
689*8975f5c5SAndroid Build Coastguard Worker
690*8975f5c5SAndroid Build Coastguard Worker mProgram = CompileProgram(kVS, kFS);
691*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(0u, mProgram);
692*8975f5c5SAndroid Build Coastguard Worker
693*8975f5c5SAndroid Build Coastguard Worker glGenRenderbuffers(1, &mRenderbuffer);
694*8975f5c5SAndroid Build Coastguard Worker }
695*8975f5c5SAndroid Build Coastguard Worker
testTearDown()696*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override
697*8975f5c5SAndroid Build Coastguard Worker {
698*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mProgram);
699*8975f5c5SAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &mRenderbuffer);
700*8975f5c5SAndroid Build Coastguard Worker
701*8975f5c5SAndroid Build Coastguard Worker StateChangeTest::testTearDown();
702*8975f5c5SAndroid Build Coastguard Worker }
703*8975f5c5SAndroid Build Coastguard Worker
setUniformColor(const GLColor & color)704*8975f5c5SAndroid Build Coastguard Worker void setUniformColor(const GLColor &color)
705*8975f5c5SAndroid Build Coastguard Worker {
706*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
707*8975f5c5SAndroid Build Coastguard Worker const Vector4 &normalizedColor = color.toNormalizedVector();
708*8975f5c5SAndroid Build Coastguard Worker GLint uniformLocation = glGetUniformLocation(mProgram, "uniformColor");
709*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, uniformLocation);
710*8975f5c5SAndroid Build Coastguard Worker glUniform4fv(uniformLocation, 1, normalizedColor.data());
711*8975f5c5SAndroid Build Coastguard Worker }
712*8975f5c5SAndroid Build Coastguard Worker
713*8975f5c5SAndroid Build Coastguard Worker GLuint mProgram;
714*8975f5c5SAndroid Build Coastguard Worker GLuint mRenderbuffer;
715*8975f5c5SAndroid Build Coastguard Worker };
716*8975f5c5SAndroid Build Coastguard Worker
717*8975f5c5SAndroid Build Coastguard Worker // Test that re-creating a currently attached texture works as expected.
TEST_P(StateChangeRenderTest,RecreateTexture)718*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeRenderTest, RecreateTexture)
719*8975f5c5SAndroid Build Coastguard Worker {
720*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
721*8975f5c5SAndroid Build Coastguard Worker
722*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
723*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
724*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
725*8975f5c5SAndroid Build Coastguard Worker
726*8975f5c5SAndroid Build Coastguard Worker // Explictly check FBO status sync in some versions of ANGLE no_error skips FBO checks.
727*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
728*8975f5c5SAndroid Build Coastguard Worker
729*8975f5c5SAndroid Build Coastguard Worker // Draw with red to the FBO.
730*8975f5c5SAndroid Build Coastguard Worker GLColor red(255, 0, 0, 255);
731*8975f5c5SAndroid Build Coastguard Worker setUniformColor(red);
732*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
733*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, red);
734*8975f5c5SAndroid Build Coastguard Worker
735*8975f5c5SAndroid Build Coastguard Worker // Recreate the texture with green.
736*8975f5c5SAndroid Build Coastguard Worker GLColor green(0, 255, 0, 255);
737*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> greenPixels(32 * 32, green);
738*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE,
739*8975f5c5SAndroid Build Coastguard Worker greenPixels.data());
740*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, green);
741*8975f5c5SAndroid Build Coastguard Worker
742*8975f5c5SAndroid Build Coastguard Worker // Explictly check FBO status sync in some versions of ANGLE no_error skips FBO checks.
743*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
744*8975f5c5SAndroid Build Coastguard Worker
745*8975f5c5SAndroid Build Coastguard Worker // Verify drawing blue gives blue. This covers the FBO sync with D3D dirty bits.
746*8975f5c5SAndroid Build Coastguard Worker GLColor blue(0, 0, 255, 255);
747*8975f5c5SAndroid Build Coastguard Worker setUniformColor(blue);
748*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
749*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, blue);
750*8975f5c5SAndroid Build Coastguard Worker
751*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
752*8975f5c5SAndroid Build Coastguard Worker }
753*8975f5c5SAndroid Build Coastguard Worker
754*8975f5c5SAndroid Build Coastguard Worker // Test that re-creating a currently attached renderbuffer works as expected.
TEST_P(StateChangeRenderTest,RecreateRenderbuffer)755*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeRenderTest, RecreateRenderbuffer)
756*8975f5c5SAndroid Build Coastguard Worker {
757*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
758*8975f5c5SAndroid Build Coastguard Worker
759*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
760*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16);
761*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mRenderbuffer);
762*8975f5c5SAndroid Build Coastguard Worker
763*8975f5c5SAndroid Build Coastguard Worker // Explictly check FBO status sync in some versions of ANGLE no_error skips FBO checks.
764*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
765*8975f5c5SAndroid Build Coastguard Worker
766*8975f5c5SAndroid Build Coastguard Worker // Draw with red to the FBO.
767*8975f5c5SAndroid Build Coastguard Worker setUniformColor(GLColor::red);
768*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
769*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
770*8975f5c5SAndroid Build Coastguard Worker
771*8975f5c5SAndroid Build Coastguard Worker // Recreate the renderbuffer and clear to green.
772*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 32, 32);
773*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
774*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
775*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
776*8975f5c5SAndroid Build Coastguard Worker
777*8975f5c5SAndroid Build Coastguard Worker // Explictly check FBO status sync in some versions of ANGLE no_error skips FBO checks.
778*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
779*8975f5c5SAndroid Build Coastguard Worker
780*8975f5c5SAndroid Build Coastguard Worker // Verify drawing blue gives blue. This covers the FBO sync with D3D dirty bits.
781*8975f5c5SAndroid Build Coastguard Worker setUniformColor(GLColor::blue);
782*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
783*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
784*8975f5c5SAndroid Build Coastguard Worker
785*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
786*8975f5c5SAndroid Build Coastguard Worker }
787*8975f5c5SAndroid Build Coastguard Worker
788*8975f5c5SAndroid Build Coastguard Worker // Test that recreating a texture with GenerateMipmaps signals the FBO is dirty.
TEST_P(StateChangeRenderTest,GenerateMipmap)789*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeRenderTest, GenerateMipmap)
790*8975f5c5SAndroid Build Coastguard Worker {
791*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
792*8975f5c5SAndroid Build Coastguard Worker
793*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
794*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
795*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
796*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
797*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
798*8975f5c5SAndroid Build Coastguard Worker
799*8975f5c5SAndroid Build Coastguard Worker // Explictly check FBO status sync in some versions of ANGLE no_error skips FBO checks.
800*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
801*8975f5c5SAndroid Build Coastguard Worker
802*8975f5c5SAndroid Build Coastguard Worker // Draw once to set the RenderTarget in D3D11
803*8975f5c5SAndroid Build Coastguard Worker GLColor red(255, 0, 0, 255);
804*8975f5c5SAndroid Build Coastguard Worker setUniformColor(red);
805*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
806*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, red);
807*8975f5c5SAndroid Build Coastguard Worker
808*8975f5c5SAndroid Build Coastguard Worker // This may trigger the texture to be re-created internally.
809*8975f5c5SAndroid Build Coastguard Worker glGenerateMipmap(GL_TEXTURE_2D);
810*8975f5c5SAndroid Build Coastguard Worker
811*8975f5c5SAndroid Build Coastguard Worker // Explictly check FBO status sync in some versions of ANGLE no_error skips FBO checks.
812*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
813*8975f5c5SAndroid Build Coastguard Worker
814*8975f5c5SAndroid Build Coastguard Worker // Now ensure we don't have a stale render target.
815*8975f5c5SAndroid Build Coastguard Worker GLColor blue(0, 0, 255, 255);
816*8975f5c5SAndroid Build Coastguard Worker setUniformColor(blue);
817*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
818*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, blue);
819*8975f5c5SAndroid Build Coastguard Worker
820*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
821*8975f5c5SAndroid Build Coastguard Worker }
822*8975f5c5SAndroid Build Coastguard Worker
823*8975f5c5SAndroid Build Coastguard Worker // Tests that gl_DepthRange syncs correctly after a change.
TEST_P(StateChangeRenderTest,DepthRangeUpdates)824*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeRenderTest, DepthRangeUpdates)
825*8975f5c5SAndroid Build Coastguard Worker {
826*8975f5c5SAndroid Build Coastguard Worker constexpr char kFragCoordShader[] = R"(void main()
827*8975f5c5SAndroid Build Coastguard Worker {
828*8975f5c5SAndroid Build Coastguard Worker if (gl_DepthRange.near == 0.2)
829*8975f5c5SAndroid Build Coastguard Worker {
830*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(1, 0, 0, 1);
831*8975f5c5SAndroid Build Coastguard Worker }
832*8975f5c5SAndroid Build Coastguard Worker else if (gl_DepthRange.near == 0.5)
833*8975f5c5SAndroid Build Coastguard Worker {
834*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(0, 1, 0, 1);
835*8975f5c5SAndroid Build Coastguard Worker }
836*8975f5c5SAndroid Build Coastguard Worker else
837*8975f5c5SAndroid Build Coastguard Worker {
838*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(0, 0, 1, 1);
839*8975f5c5SAndroid Build Coastguard Worker }
840*8975f5c5SAndroid Build Coastguard Worker })";
841*8975f5c5SAndroid Build Coastguard Worker
842*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFragCoordShader);
843*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
844*8975f5c5SAndroid Build Coastguard Worker
845*8975f5c5SAndroid Build Coastguard Worker const auto &quadVertices = GetQuadVertices();
846*8975f5c5SAndroid Build Coastguard Worker
847*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0, glGetAttribLocation(program, essl1_shaders::PositionAttrib()));
848*8975f5c5SAndroid Build Coastguard Worker
849*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
850*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
851*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, quadVertices.size() * sizeof(quadVertices[0]),
852*8975f5c5SAndroid Build Coastguard Worker quadVertices.data(), GL_STATIC_DRAW);
853*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(0u, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
854*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(0u);
855*8975f5c5SAndroid Build Coastguard Worker
856*8975f5c5SAndroid Build Coastguard Worker // First, clear.
857*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
858*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
859*8975f5c5SAndroid Build Coastguard Worker
860*8975f5c5SAndroid Build Coastguard Worker // Draw to left half viewport with a first depth range.
861*8975f5c5SAndroid Build Coastguard Worker glDepthRangef(0.2f, 1.0f);
862*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, getWindowWidth() / 2, getWindowHeight());
863*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
864*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
865*8975f5c5SAndroid Build Coastguard Worker
866*8975f5c5SAndroid Build Coastguard Worker // Draw to right half viewport with a second depth range.
867*8975f5c5SAndroid Build Coastguard Worker glDepthRangef(0.5f, 1.0f);
868*8975f5c5SAndroid Build Coastguard Worker glViewport(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
869*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
870*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
871*8975f5c5SAndroid Build Coastguard Worker
872*8975f5c5SAndroid Build Coastguard Worker // Verify left half of the framebuffer is red and right half is green.
873*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth() / 2, getWindowHeight(), GLColor::red);
874*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight(),
875*8975f5c5SAndroid Build Coastguard Worker GLColor::green);
876*8975f5c5SAndroid Build Coastguard Worker }
877*8975f5c5SAndroid Build Coastguard Worker
878*8975f5c5SAndroid Build Coastguard Worker class StateChangeRenderTestES3 : public StateChangeRenderTest
879*8975f5c5SAndroid Build Coastguard Worker {};
880*8975f5c5SAndroid Build Coastguard Worker
TEST_P(StateChangeRenderTestES3,InvalidateNonCurrentFramebuffer)881*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeRenderTestES3, InvalidateNonCurrentFramebuffer)
882*8975f5c5SAndroid Build Coastguard Worker {
883*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
884*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
885*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
886*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
887*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0);
888*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
889*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
890*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
891*8975f5c5SAndroid Build Coastguard Worker
892*8975f5c5SAndroid Build Coastguard Worker // Draw with red to the FBO.
893*8975f5c5SAndroid Build Coastguard Worker GLColor red(255, 0, 0, 255);
894*8975f5c5SAndroid Build Coastguard Worker setUniformColor(red);
895*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
896*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, red);
897*8975f5c5SAndroid Build Coastguard Worker
898*8975f5c5SAndroid Build Coastguard Worker // Go back to default framebuffer, draw green
899*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
900*8975f5c5SAndroid Build Coastguard Worker GLColor green(0, 255, 0, 255);
901*8975f5c5SAndroid Build Coastguard Worker setUniformColor(green);
902*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
903*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, green);
904*8975f5c5SAndroid Build Coastguard Worker
905*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
906*8975f5c5SAndroid Build Coastguard Worker
907*8975f5c5SAndroid Build Coastguard Worker // Invalidate color buffer of FBO
908*8975f5c5SAndroid Build Coastguard Worker GLenum attachments1[] = {GL_COLOR_ATTACHMENT0};
909*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments1);
910*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
911*8975f5c5SAndroid Build Coastguard Worker
912*8975f5c5SAndroid Build Coastguard Worker // Verify drawing blue gives blue.
913*8975f5c5SAndroid Build Coastguard Worker GLColor blue(0, 0, 255, 255);
914*8975f5c5SAndroid Build Coastguard Worker setUniformColor(blue);
915*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
916*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, blue);
917*8975f5c5SAndroid Build Coastguard Worker }
918*8975f5c5SAndroid Build Coastguard Worker
919*8975f5c5SAndroid Build Coastguard Worker // Tests that D3D11 dirty bit updates don't forget about BufferSubData attrib updates.
TEST_P(StateChangeTest,VertexBufferUpdatedAfterDraw)920*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, VertexBufferUpdatedAfterDraw)
921*8975f5c5SAndroid Build Coastguard Worker {
922*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] =
923*8975f5c5SAndroid Build Coastguard Worker "attribute vec2 position;\n"
924*8975f5c5SAndroid Build Coastguard Worker "attribute vec4 color;\n"
925*8975f5c5SAndroid Build Coastguard Worker "varying vec4 outcolor;\n"
926*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
927*8975f5c5SAndroid Build Coastguard Worker "{\n"
928*8975f5c5SAndroid Build Coastguard Worker " gl_Position = vec4(position, 0, 1);\n"
929*8975f5c5SAndroid Build Coastguard Worker " outcolor = color;\n"
930*8975f5c5SAndroid Build Coastguard Worker "}";
931*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
932*8975f5c5SAndroid Build Coastguard Worker "varying mediump vec4 outcolor;\n"
933*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
934*8975f5c5SAndroid Build Coastguard Worker "{\n"
935*8975f5c5SAndroid Build Coastguard Worker " gl_FragColor = outcolor;\n"
936*8975f5c5SAndroid Build Coastguard Worker "}";
937*8975f5c5SAndroid Build Coastguard Worker
938*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
939*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
940*8975f5c5SAndroid Build Coastguard Worker
941*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetAttribLocation(program, "color");
942*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
943*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, "position");
944*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
945*8975f5c5SAndroid Build Coastguard Worker
946*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(0.5f, 1.0f);
947*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
948*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
949*8975f5c5SAndroid Build Coastguard Worker
950*8975f5c5SAndroid Build Coastguard Worker GLBuffer colorBuf;
951*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorBuf);
952*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
953*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
954*8975f5c5SAndroid Build Coastguard Worker
955*8975f5c5SAndroid Build Coastguard Worker // Fill with green.
956*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> colorData(6, GLColor::green);
957*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, colorData.size() * sizeof(GLColor), colorData.data(),
958*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
959*8975f5c5SAndroid Build Coastguard Worker
960*8975f5c5SAndroid Build Coastguard Worker // Draw, expect green.
961*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
962*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
963*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
964*8975f5c5SAndroid Build Coastguard Worker
965*8975f5c5SAndroid Build Coastguard Worker // Update buffer with red.
966*8975f5c5SAndroid Build Coastguard Worker std::fill(colorData.begin(), colorData.end(), GLColor::red);
967*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_ARRAY_BUFFER, 0, colorData.size() * sizeof(GLColor), colorData.data());
968*8975f5c5SAndroid Build Coastguard Worker
969*8975f5c5SAndroid Build Coastguard Worker // Draw, expect red.
970*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
971*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
972*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
973*8975f5c5SAndroid Build Coastguard Worker }
974*8975f5c5SAndroid Build Coastguard Worker
975*8975f5c5SAndroid Build Coastguard Worker // Tests that drawing after flush without any state change works.
TEST_P(StateChangeTestES3,DrawAfterFlushWithNoStateChange)976*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, DrawAfterFlushWithNoStateChange)
977*8975f5c5SAndroid Build Coastguard Worker {
978*8975f5c5SAndroid Build Coastguard Worker // Draw (0.125, 0.25, 0.5, 0.5) once, using additive blend
979*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
980*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
981*8975f5c5SAndroid Build Coastguard Worker
982*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
983*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
984*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
985*8975f5c5SAndroid Build Coastguard Worker
986*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(drawColor, essl1_shaders::PositionAttrib());
987*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
988*8975f5c5SAndroid Build Coastguard Worker
989*8975f5c5SAndroid Build Coastguard Worker // Setup VAO
990*8975f5c5SAndroid Build Coastguard Worker const auto &quadVertices = GetQuadVertices();
991*8975f5c5SAndroid Build Coastguard Worker
992*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
993*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
994*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(Vector3) * 6, quadVertices.data(), GL_STATIC_DRAW);
995*8975f5c5SAndroid Build Coastguard Worker
996*8975f5c5SAndroid Build Coastguard Worker GLVertexArray vertexArray;
997*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(vertexArray);
998*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
999*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
1000*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
1001*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1002*8975f5c5SAndroid Build Coastguard Worker
1003*8975f5c5SAndroid Build Coastguard Worker // Clear and draw
1004*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
1005*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1006*8975f5c5SAndroid Build Coastguard Worker
1007*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
1008*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
1009*8975f5c5SAndroid Build Coastguard Worker
1010*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.125f, 0.25f, 0.5f, 0.5f);
1011*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
1012*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1013*8975f5c5SAndroid Build Coastguard Worker
1014*8975f5c5SAndroid Build Coastguard Worker // Make sure the work is submitted.
1015*8975f5c5SAndroid Build Coastguard Worker glFinish();
1016*8975f5c5SAndroid Build Coastguard Worker
1017*8975f5c5SAndroid Build Coastguard Worker // Draw again with no state change
1018*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
1019*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1020*8975f5c5SAndroid Build Coastguard Worker
1021*8975f5c5SAndroid Build Coastguard Worker // Make sure the pixels have the correct colors.
1022*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight() - 1;
1023*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth() - 1;
1024*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpected(63, 127, 255, 255);
1025*8975f5c5SAndroid Build Coastguard Worker
1026*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpected, 1);
1027*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(w - 1, 0, kExpected, 1);
1028*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, h - 1, kExpected, 1);
1029*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(w - 1, h - 1, kExpected, 1);
1030*8975f5c5SAndroid Build Coastguard Worker }
1031*8975f5c5SAndroid Build Coastguard Worker
1032*8975f5c5SAndroid Build Coastguard Worker // Test that switching VAOs keeps the disabled "current value" attributes up-to-date.
TEST_P(StateChangeTestES3,VertexArrayObjectAndDisabledAttributes)1033*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, VertexArrayObjectAndDisabledAttributes)
1034*8975f5c5SAndroid Build Coastguard Worker {
1035*8975f5c5SAndroid Build Coastguard Worker constexpr char kSingleVS[] = "attribute vec4 position; void main() { gl_Position = position; }";
1036*8975f5c5SAndroid Build Coastguard Worker constexpr char kSingleFS[] = "void main() { gl_FragColor = vec4(1, 0, 0, 1); }";
1037*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(singleProgram, kSingleVS, kSingleFS);
1038*8975f5c5SAndroid Build Coastguard Worker
1039*8975f5c5SAndroid Build Coastguard Worker constexpr char kDualVS[] =
1040*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
1041*8975f5c5SAndroid Build Coastguard Worker "in vec4 position;\n"
1042*8975f5c5SAndroid Build Coastguard Worker "in vec4 color;\n"
1043*8975f5c5SAndroid Build Coastguard Worker "out vec4 varyColor;\n"
1044*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
1045*8975f5c5SAndroid Build Coastguard Worker "{\n"
1046*8975f5c5SAndroid Build Coastguard Worker " gl_Position = position;\n"
1047*8975f5c5SAndroid Build Coastguard Worker " varyColor = color;\n"
1048*8975f5c5SAndroid Build Coastguard Worker "}";
1049*8975f5c5SAndroid Build Coastguard Worker constexpr char kDualFS[] =
1050*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
1051*8975f5c5SAndroid Build Coastguard Worker "precision mediump float;\n"
1052*8975f5c5SAndroid Build Coastguard Worker "in vec4 varyColor;\n"
1053*8975f5c5SAndroid Build Coastguard Worker "out vec4 colorOut;\n"
1054*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
1055*8975f5c5SAndroid Build Coastguard Worker "{\n"
1056*8975f5c5SAndroid Build Coastguard Worker " colorOut = varyColor;\n"
1057*8975f5c5SAndroid Build Coastguard Worker "}";
1058*8975f5c5SAndroid Build Coastguard Worker
1059*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(dualProgram, kDualVS, kDualFS);
1060*8975f5c5SAndroid Build Coastguard Worker
1061*8975f5c5SAndroid Build Coastguard Worker // Force consistent attribute locations
1062*8975f5c5SAndroid Build Coastguard Worker constexpr GLint positionLocation = 0;
1063*8975f5c5SAndroid Build Coastguard Worker constexpr GLint colorLocation = 1;
1064*8975f5c5SAndroid Build Coastguard Worker
1065*8975f5c5SAndroid Build Coastguard Worker glBindAttribLocation(singleProgram, positionLocation, "position");
1066*8975f5c5SAndroid Build Coastguard Worker glBindAttribLocation(dualProgram, positionLocation, "position");
1067*8975f5c5SAndroid Build Coastguard Worker glBindAttribLocation(dualProgram, colorLocation, "color");
1068*8975f5c5SAndroid Build Coastguard Worker
1069*8975f5c5SAndroid Build Coastguard Worker {
1070*8975f5c5SAndroid Build Coastguard Worker glLinkProgram(singleProgram);
1071*8975f5c5SAndroid Build Coastguard Worker GLint linkStatus;
1072*8975f5c5SAndroid Build Coastguard Worker glGetProgramiv(singleProgram, GL_LINK_STATUS, &linkStatus);
1073*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(linkStatus, 0);
1074*8975f5c5SAndroid Build Coastguard Worker }
1075*8975f5c5SAndroid Build Coastguard Worker
1076*8975f5c5SAndroid Build Coastguard Worker {
1077*8975f5c5SAndroid Build Coastguard Worker glLinkProgram(dualProgram);
1078*8975f5c5SAndroid Build Coastguard Worker GLint linkStatus;
1079*8975f5c5SAndroid Build Coastguard Worker glGetProgramiv(dualProgram, GL_LINK_STATUS, &linkStatus);
1080*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(linkStatus, 0);
1081*8975f5c5SAndroid Build Coastguard Worker }
1082*8975f5c5SAndroid Build Coastguard Worker
1083*8975f5c5SAndroid Build Coastguard Worker glUseProgram(singleProgram);
1084*8975f5c5SAndroid Build Coastguard Worker
1085*8975f5c5SAndroid Build Coastguard Worker // Initialize position vertex buffer.
1086*8975f5c5SAndroid Build Coastguard Worker const auto &quadVertices = GetQuadVertices();
1087*8975f5c5SAndroid Build Coastguard Worker
1088*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
1089*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
1090*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(Vector3) * 6, quadVertices.data(), GL_STATIC_DRAW);
1091*8975f5c5SAndroid Build Coastguard Worker
1092*8975f5c5SAndroid Build Coastguard Worker // Initialize a VAO. Draw with single program.
1093*8975f5c5SAndroid Build Coastguard Worker GLVertexArray vertexArray;
1094*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(vertexArray);
1095*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
1096*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
1097*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
1098*8975f5c5SAndroid Build Coastguard Worker
1099*8975f5c5SAndroid Build Coastguard Worker // Should draw red.
1100*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
1101*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1102*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1103*8975f5c5SAndroid Build Coastguard Worker
1104*8975f5c5SAndroid Build Coastguard Worker // Draw with a green buffer attribute, without the VAO.
1105*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(0);
1106*8975f5c5SAndroid Build Coastguard Worker glUseProgram(dualProgram);
1107*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
1108*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
1109*8975f5c5SAndroid Build Coastguard Worker
1110*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> greenColors(6, GLColor::green);
1111*8975f5c5SAndroid Build Coastguard Worker GLBuffer greenBuffer;
1112*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, greenBuffer);
1113*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(GLColor) * 6, greenColors.data(), GL_STATIC_DRAW);
1114*8975f5c5SAndroid Build Coastguard Worker
1115*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLocation, 4, GL_UNSIGNED_BYTE, GL_FALSE, 4, nullptr);
1116*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLocation);
1117*8975f5c5SAndroid Build Coastguard Worker
1118*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
1119*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1120*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1121*8975f5c5SAndroid Build Coastguard Worker
1122*8975f5c5SAndroid Build Coastguard Worker // Re-bind VAO and try to draw with different program, without changing state.
1123*8975f5c5SAndroid Build Coastguard Worker // Should draw black since current value is not initialized.
1124*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(vertexArray);
1125*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
1126*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1127*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
1128*8975f5c5SAndroid Build Coastguard Worker }
1129*8975f5c5SAndroid Build Coastguard Worker
1130*8975f5c5SAndroid Build Coastguard Worker const char kSamplerMetadataVertexShader0[] = R"(#version 300 es
1131*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
1132*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
1133*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D texture;
1134*8975f5c5SAndroid Build Coastguard Worker void main()
1135*8975f5c5SAndroid Build Coastguard Worker {
1136*8975f5c5SAndroid Build Coastguard Worker vec2 size = vec2(textureSize(texture, 0));
1137*8975f5c5SAndroid Build Coastguard Worker color = size.x != 0.0 ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 0.0);
1138*8975f5c5SAndroid Build Coastguard Worker vec2 pos = vec2(0.0);
1139*8975f5c5SAndroid Build Coastguard Worker switch (gl_VertexID) {
1140*8975f5c5SAndroid Build Coastguard Worker case 0: pos = vec2(-1.0, -1.0); break;
1141*8975f5c5SAndroid Build Coastguard Worker case 1: pos = vec2(3.0, -1.0); break;
1142*8975f5c5SAndroid Build Coastguard Worker case 2: pos = vec2(-1.0, 3.0); break;
1143*8975f5c5SAndroid Build Coastguard Worker };
1144*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(pos, 0.0, 1.0);
1145*8975f5c5SAndroid Build Coastguard Worker })";
1146*8975f5c5SAndroid Build Coastguard Worker
1147*8975f5c5SAndroid Build Coastguard Worker const char kSamplerMetadataVertexShader1[] = R"(#version 300 es
1148*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
1149*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
1150*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D texture1;
1151*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D texture2;
1152*8975f5c5SAndroid Build Coastguard Worker void main()
1153*8975f5c5SAndroid Build Coastguard Worker {
1154*8975f5c5SAndroid Build Coastguard Worker vec2 size1 = vec2(textureSize(texture1, 0));
1155*8975f5c5SAndroid Build Coastguard Worker vec2 size2 = vec2(textureSize(texture2, 0));
1156*8975f5c5SAndroid Build Coastguard Worker color = size1.x * size2.x != 0.0 ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 0.0);
1157*8975f5c5SAndroid Build Coastguard Worker vec2 pos = vec2(0.0);
1158*8975f5c5SAndroid Build Coastguard Worker switch (gl_VertexID) {
1159*8975f5c5SAndroid Build Coastguard Worker case 0: pos = vec2(-1.0, -1.0); break;
1160*8975f5c5SAndroid Build Coastguard Worker case 1: pos = vec2(3.0, -1.0); break;
1161*8975f5c5SAndroid Build Coastguard Worker case 2: pos = vec2(-1.0, 3.0); break;
1162*8975f5c5SAndroid Build Coastguard Worker };
1163*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(pos, 0.0, 1.0);
1164*8975f5c5SAndroid Build Coastguard Worker })";
1165*8975f5c5SAndroid Build Coastguard Worker
1166*8975f5c5SAndroid Build Coastguard Worker const char kSamplerMetadataFragmentShader[] = R"(#version 300 es
1167*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
1168*8975f5c5SAndroid Build Coastguard Worker in vec4 color;
1169*8975f5c5SAndroid Build Coastguard Worker out vec4 result;
1170*8975f5c5SAndroid Build Coastguard Worker void main()
1171*8975f5c5SAndroid Build Coastguard Worker {
1172*8975f5c5SAndroid Build Coastguard Worker result = color;
1173*8975f5c5SAndroid Build Coastguard Worker })";
1174*8975f5c5SAndroid Build Coastguard Worker
1175*8975f5c5SAndroid Build Coastguard Worker // Tests that changing an active program invalidates the sampler metadata properly.
TEST_P(StateChangeTestES3,SamplerMetadataUpdateOnSetProgram)1176*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, SamplerMetadataUpdateOnSetProgram)
1177*8975f5c5SAndroid Build Coastguard Worker {
1178*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40096654
1179*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
1180*8975f5c5SAndroid Build Coastguard Worker GLVertexArray vertexArray;
1181*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(vertexArray);
1182*8975f5c5SAndroid Build Coastguard Worker
1183*8975f5c5SAndroid Build Coastguard Worker // Create a simple framebuffer.
1184*8975f5c5SAndroid Build Coastguard Worker GLTexture texture1, texture2;
1185*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
1186*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture1);
1187*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1188*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE1);
1189*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture2);
1190*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1191*8975f5c5SAndroid Build Coastguard Worker
1192*8975f5c5SAndroid Build Coastguard Worker // Create 2 shader programs differing only in the number of active samplers.
1193*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program1, kSamplerMetadataVertexShader0, kSamplerMetadataFragmentShader);
1194*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program1);
1195*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(program1, "texture"), 0);
1196*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program2, kSamplerMetadataVertexShader1, kSamplerMetadataFragmentShader);
1197*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program2);
1198*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(program2, "texture1"), 0);
1199*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(program2, "texture2"), 0);
1200*8975f5c5SAndroid Build Coastguard Worker
1201*8975f5c5SAndroid Build Coastguard Worker // Draw a solid green color to the framebuffer.
1202*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program1);
1203*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
1204*8975f5c5SAndroid Build Coastguard Worker // Test that our first program is good.
1205*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1206*8975f5c5SAndroid Build Coastguard Worker
1207*8975f5c5SAndroid Build Coastguard Worker // Bind a different program that uses more samplers.
1208*8975f5c5SAndroid Build Coastguard Worker // Draw another quad that depends on the sampler metadata.
1209*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program2);
1210*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
1211*8975f5c5SAndroid Build Coastguard Worker // Flush via ReadPixels and check that it's still green.
1212*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1213*8975f5c5SAndroid Build Coastguard Worker
1214*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1215*8975f5c5SAndroid Build Coastguard Worker }
1216*8975f5c5SAndroid Build Coastguard Worker
1217*8975f5c5SAndroid Build Coastguard Worker // Tests that redefining Buffer storage syncs with the Transform Feedback object.
TEST_P(StateChangeTestES3,RedefineTransformFeedbackBuffer)1218*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, RedefineTransformFeedbackBuffer)
1219*8975f5c5SAndroid Build Coastguard Worker {
1220*8975f5c5SAndroid Build Coastguard Worker // Create the most simple program possible - simple a passthrough for a float attribute.
1221*8975f5c5SAndroid Build Coastguard Worker constexpr char kVertexShader[] = R"(#version 300 es
1222*8975f5c5SAndroid Build Coastguard Worker in float valueIn;
1223*8975f5c5SAndroid Build Coastguard Worker out float valueOut;
1224*8975f5c5SAndroid Build Coastguard Worker void main()
1225*8975f5c5SAndroid Build Coastguard Worker {
1226*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(0, 0, 0, 0);
1227*8975f5c5SAndroid Build Coastguard Worker valueOut = valueIn;
1228*8975f5c5SAndroid Build Coastguard Worker })";
1229*8975f5c5SAndroid Build Coastguard Worker
1230*8975f5c5SAndroid Build Coastguard Worker constexpr char kFragmentShader[] = R"(#version 300 es
1231*8975f5c5SAndroid Build Coastguard Worker out mediump float unused;
1232*8975f5c5SAndroid Build Coastguard Worker void main()
1233*8975f5c5SAndroid Build Coastguard Worker {
1234*8975f5c5SAndroid Build Coastguard Worker unused = 1.0;
1235*8975f5c5SAndroid Build Coastguard Worker })";
1236*8975f5c5SAndroid Build Coastguard Worker
1237*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> tfVaryings = {"valueOut"};
1238*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(program, kVertexShader, kFragmentShader, tfVaryings,
1239*8975f5c5SAndroid Build Coastguard Worker GL_SEPARATE_ATTRIBS);
1240*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
1241*8975f5c5SAndroid Build Coastguard Worker
1242*8975f5c5SAndroid Build Coastguard Worker GLint attribLoc = glGetAttribLocation(program, "valueIn");
1243*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, attribLoc);
1244*8975f5c5SAndroid Build Coastguard Worker
1245*8975f5c5SAndroid Build Coastguard Worker // Disable rasterization - we're not interested in the framebuffer.
1246*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_RASTERIZER_DISCARD);
1247*8975f5c5SAndroid Build Coastguard Worker
1248*8975f5c5SAndroid Build Coastguard Worker // Initialize a float vertex buffer with 1.0.
1249*8975f5c5SAndroid Build Coastguard Worker std::vector<GLfloat> data1(16, 1.0);
1250*8975f5c5SAndroid Build Coastguard Worker GLsizei size1 = static_cast<GLsizei>(sizeof(GLfloat) * data1.size());
1251*8975f5c5SAndroid Build Coastguard Worker
1252*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
1253*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
1254*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, size1, data1.data(), GL_STATIC_DRAW);
1255*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(attribLoc, 1, GL_FLOAT, GL_FALSE, 0, nullptr);
1256*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(attribLoc);
1257*8975f5c5SAndroid Build Coastguard Worker
1258*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1259*8975f5c5SAndroid Build Coastguard Worker
1260*8975f5c5SAndroid Build Coastguard Worker // Initialize a same-sized XFB buffer.
1261*8975f5c5SAndroid Build Coastguard Worker GLBuffer xfbBuffer;
1262*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfbBuffer);
1263*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, size1, nullptr, GL_STATIC_DRAW);
1264*8975f5c5SAndroid Build Coastguard Worker
1265*8975f5c5SAndroid Build Coastguard Worker // Draw with XFB enabled.
1266*8975f5c5SAndroid Build Coastguard Worker GLTransformFeedback xfb;
1267*8975f5c5SAndroid Build Coastguard Worker glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, xfb);
1268*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, xfbBuffer);
1269*8975f5c5SAndroid Build Coastguard Worker
1270*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_POINTS);
1271*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 16);
1272*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
1273*8975f5c5SAndroid Build Coastguard Worker
1274*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1275*8975f5c5SAndroid Build Coastguard Worker
1276*8975f5c5SAndroid Build Coastguard Worker // Verify the XFB stage caught the 1.0 attribute values.
1277*8975f5c5SAndroid Build Coastguard Worker void *mapped1 = glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, size1, GL_MAP_READ_BIT);
1278*8975f5c5SAndroid Build Coastguard Worker GLfloat *asFloat1 = reinterpret_cast<GLfloat *>(mapped1);
1279*8975f5c5SAndroid Build Coastguard Worker std::vector<GLfloat> actualData1(asFloat1, asFloat1 + data1.size());
1280*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(data1, actualData1);
1281*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
1282*8975f5c5SAndroid Build Coastguard Worker
1283*8975f5c5SAndroid Build Coastguard Worker // Now, reinitialize the XFB buffer to a larger size, and draw with 2.0.
1284*8975f5c5SAndroid Build Coastguard Worker std::vector<GLfloat> data2(128, 2.0);
1285*8975f5c5SAndroid Build Coastguard Worker const GLsizei size2 = static_cast<GLsizei>(sizeof(GLfloat) * data2.size());
1286*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, size2, data2.data(), GL_STATIC_DRAW);
1287*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, size2, nullptr, GL_STATIC_DRAW);
1288*8975f5c5SAndroid Build Coastguard Worker
1289*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_POINTS);
1290*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 128);
1291*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
1292*8975f5c5SAndroid Build Coastguard Worker
1293*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1294*8975f5c5SAndroid Build Coastguard Worker
1295*8975f5c5SAndroid Build Coastguard Worker // Verify the XFB stage caught the 2.0 attribute values.
1296*8975f5c5SAndroid Build Coastguard Worker void *mapped2 = glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, size2, GL_MAP_READ_BIT);
1297*8975f5c5SAndroid Build Coastguard Worker GLfloat *asFloat2 = reinterpret_cast<GLfloat *>(mapped2);
1298*8975f5c5SAndroid Build Coastguard Worker std::vector<GLfloat> actualData2(asFloat2, asFloat2 + data2.size());
1299*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(data2, actualData2);
1300*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
1301*8975f5c5SAndroid Build Coastguard Worker }
1302*8975f5c5SAndroid Build Coastguard Worker
1303*8975f5c5SAndroid Build Coastguard Worker // Variations:
1304*8975f5c5SAndroid Build Coastguard Worker //
1305*8975f5c5SAndroid Build Coastguard Worker // - bool: whether to use WebGL compatibility mode.
1306*8975f5c5SAndroid Build Coastguard Worker using StateChangeTestWebGL2Params = std::tuple<angle::PlatformParameters, bool>;
1307*8975f5c5SAndroid Build Coastguard Worker
StateChangeTestWebGL2Print(const::testing::TestParamInfo<StateChangeTestWebGL2Params> & paramsInfo)1308*8975f5c5SAndroid Build Coastguard Worker std::string StateChangeTestWebGL2Print(
1309*8975f5c5SAndroid Build Coastguard Worker const ::testing::TestParamInfo<StateChangeTestWebGL2Params> ¶msInfo)
1310*8975f5c5SAndroid Build Coastguard Worker {
1311*8975f5c5SAndroid Build Coastguard Worker const StateChangeTestWebGL2Params ¶ms = paramsInfo.param;
1312*8975f5c5SAndroid Build Coastguard Worker std::ostringstream out;
1313*8975f5c5SAndroid Build Coastguard Worker
1314*8975f5c5SAndroid Build Coastguard Worker out << std::get<0>(params);
1315*8975f5c5SAndroid Build Coastguard Worker
1316*8975f5c5SAndroid Build Coastguard Worker if (std::get<1>(params))
1317*8975f5c5SAndroid Build Coastguard Worker {
1318*8975f5c5SAndroid Build Coastguard Worker out << "__WebGLCompatibility";
1319*8975f5c5SAndroid Build Coastguard Worker }
1320*8975f5c5SAndroid Build Coastguard Worker
1321*8975f5c5SAndroid Build Coastguard Worker return out.str();
1322*8975f5c5SAndroid Build Coastguard Worker }
1323*8975f5c5SAndroid Build Coastguard Worker
1324*8975f5c5SAndroid Build Coastguard Worker // State change test verifying both ES3 and WebGL2 specific behaviors.
1325*8975f5c5SAndroid Build Coastguard Worker // Test is parameterized to allow execution with and without WebGL validation.
1326*8975f5c5SAndroid Build Coastguard Worker // Note that this can not inherit from StateChangeTest due to the need to use ANGLETestWithParam.
1327*8975f5c5SAndroid Build Coastguard Worker class StateChangeTestWebGL2 : public ANGLETest<StateChangeTestWebGL2Params>
1328*8975f5c5SAndroid Build Coastguard Worker {
1329*8975f5c5SAndroid Build Coastguard Worker protected:
StateChangeTestWebGL2()1330*8975f5c5SAndroid Build Coastguard Worker StateChangeTestWebGL2()
1331*8975f5c5SAndroid Build Coastguard Worker {
1332*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(kWidth);
1333*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(kHeight);
1334*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
1335*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
1336*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
1337*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
1338*8975f5c5SAndroid Build Coastguard Worker if (testing::get<1>(GetParam()))
1339*8975f5c5SAndroid Build Coastguard Worker setWebGLCompatibilityEnabled(true);
1340*8975f5c5SAndroid Build Coastguard Worker }
1341*8975f5c5SAndroid Build Coastguard Worker
1342*8975f5c5SAndroid Build Coastguard Worker struct TestResources
1343*8975f5c5SAndroid Build Coastguard Worker {
1344*8975f5c5SAndroid Build Coastguard Worker GLTexture colorTexture;
1345*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
1346*8975f5c5SAndroid Build Coastguard Worker };
1347*8975f5c5SAndroid Build Coastguard Worker
setupResources(TestResources & resources)1348*8975f5c5SAndroid Build Coastguard Worker void setupResources(TestResources &resources)
1349*8975f5c5SAndroid Build Coastguard Worker {
1350*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, resources.colorTexture);
1351*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight);
1352*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1353*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1354*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1355*8975f5c5SAndroid Build Coastguard Worker
1356*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, resources.framebuffer);
1357*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1358*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
1359*8975f5c5SAndroid Build Coastguard Worker resources.colorTexture, 0);
1360*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1361*8975f5c5SAndroid Build Coastguard Worker }
1362*8975f5c5SAndroid Build Coastguard Worker
1363*8975f5c5SAndroid Build Coastguard Worker // Use a larger window/framebuffer size than 1x1 (though not much larger) to
1364*8975f5c5SAndroid Build Coastguard Worker // increase the chances that random garbage will appear.
1365*8975f5c5SAndroid Build Coastguard Worker static constexpr GLsizei kWidth = 4;
1366*8975f5c5SAndroid Build Coastguard Worker static constexpr GLsizei kHeight = 4;
1367*8975f5c5SAndroid Build Coastguard Worker };
1368*8975f5c5SAndroid Build Coastguard Worker
1369*8975f5c5SAndroid Build Coastguard Worker // Note: tested multiple other combinations:
1370*8975f5c5SAndroid Build Coastguard Worker //
1371*8975f5c5SAndroid Build Coastguard Worker // - Clearing/drawing to the framebuffer after invalidating, without using a
1372*8975f5c5SAndroid Build Coastguard Worker // secondary FBO
1373*8975f5c5SAndroid Build Coastguard Worker // - Clearing the framebuffer after invalidating, using a secondary FBO
1374*8975f5c5SAndroid Build Coastguard Worker // - Invalidating after clearing/drawing to the FBO, to verify WebGL's behavior
1375*8975f5c5SAndroid Build Coastguard Worker // that after invalidation, the framebuffer is either unmodified, or cleared
1376*8975f5c5SAndroid Build Coastguard Worker // to transparent black
1377*8975f5c5SAndroid Build Coastguard Worker //
1378*8975f5c5SAndroid Build Coastguard Worker // This combination, drawing after invalidating plus copying from the drawn-to
1379*8975f5c5SAndroid Build Coastguard Worker // texture, was the only one which provoked the original bug in the Metal
1380*8975f5c5SAndroid Build Coastguard Worker // backend with the following command line arguments:
1381*8975f5c5SAndroid Build Coastguard Worker //
1382*8975f5c5SAndroid Build Coastguard Worker // MTL_DEBUG_LAYER=1 MTL_DEBUG_LAYER_VALIDATE_LOAD_ACTIONS=1 \
1383*8975f5c5SAndroid Build Coastguard Worker // MTL_DEBUG_LAYER_VALIDATE_STORE_ACTIONS=1 \
1384*8975f5c5SAndroid Build Coastguard Worker // MTL_DEBUG_LAYER_VALIDATE_UNRETAINED_RESOURCES=4 \
1385*8975f5c5SAndroid Build Coastguard Worker // angle_end2end_tests ...
1386*8975f5c5SAndroid Build Coastguard Worker //
1387*8975f5c5SAndroid Build Coastguard Worker // See anglebug.com/42265402.
1388*8975f5c5SAndroid Build Coastguard Worker
TEST_P(StateChangeTestWebGL2,InvalidateThenDrawFBO)1389*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestWebGL2, InvalidateThenDrawFBO)
1390*8975f5c5SAndroid Build Coastguard Worker {
1391*8975f5c5SAndroid Build Coastguard Worker GLint origFramebuffer = 0;
1392*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &origFramebuffer);
1393*8975f5c5SAndroid Build Coastguard Worker
1394*8975f5c5SAndroid Build Coastguard Worker TestResources resources;
1395*8975f5c5SAndroid Build Coastguard Worker setupResources(resources);
1396*8975f5c5SAndroid Build Coastguard Worker
1397*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawGreen, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
1398*8975f5c5SAndroid Build Coastguard Worker
1399*8975f5c5SAndroid Build Coastguard Worker const GLenum attachment = GL_COLOR_ATTACHMENT0;
1400*8975f5c5SAndroid Build Coastguard Worker
1401*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, resources.framebuffer);
1402*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1403*8975f5c5SAndroid Build Coastguard Worker
1404*8975f5c5SAndroid Build Coastguard Worker // Clear to red to start.
1405*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1406*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1407*8975f5c5SAndroid Build Coastguard Worker
1408*8975f5c5SAndroid Build Coastguard Worker // Invalidate framebuffer.
1409*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, &attachment);
1410*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1411*8975f5c5SAndroid Build Coastguard Worker
1412*8975f5c5SAndroid Build Coastguard Worker // Draw green.
1413*8975f5c5SAndroid Build Coastguard Worker // Important to use a vertex buffer because WebGL doesn't support client-side arrays.
1414*8975f5c5SAndroid Build Coastguard Worker constexpr bool useVertexBuffer = true;
1415*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawGreen, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, useVertexBuffer);
1416*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1417*8975f5c5SAndroid Build Coastguard Worker
1418*8975f5c5SAndroid Build Coastguard Worker // Bind original framebuffer.
1419*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, origFramebuffer);
1420*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, resources.framebuffer);
1421*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
1422*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
1423*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1424*8975f5c5SAndroid Build Coastguard Worker
1425*8975f5c5SAndroid Build Coastguard Worker // Blit from user's framebuffer to the window.
1426*8975f5c5SAndroid Build Coastguard Worker //
1427*8975f5c5SAndroid Build Coastguard Worker // This step is crucial to catch bugs in the Metal backend's use of no-op load/store actions.
1428*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT,
1429*8975f5c5SAndroid Build Coastguard Worker GL_NEAREST);
1430*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1431*8975f5c5SAndroid Build Coastguard Worker
1432*8975f5c5SAndroid Build Coastguard Worker // Verify results.
1433*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, origFramebuffer);
1434*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1435*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::green);
1436*8975f5c5SAndroid Build Coastguard Worker }
1437*8975f5c5SAndroid Build Coastguard Worker
1438*8975f5c5SAndroid Build Coastguard Worker // Simple state change tests for line loop drawing. There is some very specific handling of line
1439*8975f5c5SAndroid Build Coastguard Worker // line loops in Vulkan and we need to test switching between drawElements and drawArrays calls to
1440*8975f5c5SAndroid Build Coastguard Worker // validate every edge cases.
1441*8975f5c5SAndroid Build Coastguard Worker class LineLoopStateChangeTest : public StateChangeTest
1442*8975f5c5SAndroid Build Coastguard Worker {
1443*8975f5c5SAndroid Build Coastguard Worker protected:
LineLoopStateChangeTest()1444*8975f5c5SAndroid Build Coastguard Worker LineLoopStateChangeTest()
1445*8975f5c5SAndroid Build Coastguard Worker {
1446*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(32);
1447*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(32);
1448*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
1449*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
1450*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
1451*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
1452*8975f5c5SAndroid Build Coastguard Worker }
1453*8975f5c5SAndroid Build Coastguard Worker
validateSquareAndHourglass() const1454*8975f5c5SAndroid Build Coastguard Worker void validateSquareAndHourglass() const
1455*8975f5c5SAndroid Build Coastguard Worker {
1456*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1457*8975f5c5SAndroid Build Coastguard Worker
1458*8975f5c5SAndroid Build Coastguard Worker int quarterWidth = getWindowWidth() / 4;
1459*8975f5c5SAndroid Build Coastguard Worker int quarterHeight = getWindowHeight() / 4;
1460*8975f5c5SAndroid Build Coastguard Worker
1461*8975f5c5SAndroid Build Coastguard Worker // Bottom left
1462*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth, quarterHeight, GLColor::blue);
1463*8975f5c5SAndroid Build Coastguard Worker
1464*8975f5c5SAndroid Build Coastguard Worker // Top left
1465*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth, (quarterHeight * 3), GLColor::blue);
1466*8975f5c5SAndroid Build Coastguard Worker
1467*8975f5c5SAndroid Build Coastguard Worker // Top right
1468*8975f5c5SAndroid Build Coastguard Worker // The last pixel isn't filled on a line loop so we check the pixel right before.
1469*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ((quarterWidth * 3), (quarterHeight * 3) - 1, GLColor::blue);
1470*8975f5c5SAndroid Build Coastguard Worker
1471*8975f5c5SAndroid Build Coastguard Worker // dead center to validate the hourglass.
1472*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ((quarterWidth * 2), quarterHeight * 2, GLColor::blue);
1473*8975f5c5SAndroid Build Coastguard Worker
1474*8975f5c5SAndroid Build Coastguard Worker // Verify line is closed between the 2 last vertices
1475*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ((quarterWidth * 2), quarterHeight, GLColor::blue);
1476*8975f5c5SAndroid Build Coastguard Worker }
1477*8975f5c5SAndroid Build Coastguard Worker };
1478*8975f5c5SAndroid Build Coastguard Worker
1479*8975f5c5SAndroid Build Coastguard Worker // Draw an hourglass with a drawElements call followed by a square with drawArrays.
TEST_P(LineLoopStateChangeTest,DrawElementsThenDrawArrays)1480*8975f5c5SAndroid Build Coastguard Worker TEST_P(LineLoopStateChangeTest, DrawElementsThenDrawArrays)
1481*8975f5c5SAndroid Build Coastguard Worker {
1482*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
1483*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
1484*8975f5c5SAndroid Build Coastguard Worker
1485*8975f5c5SAndroid Build Coastguard Worker // We expect to draw a square with these 4 vertices with a drawArray call.
1486*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector3> vertices;
1487*8975f5c5SAndroid Build Coastguard Worker CreatePixelCenterWindowCoords({{8, 8}, {8, 24}, {24, 24}, {24, 8}}, getWindowWidth(),
1488*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), &vertices);
1489*8975f5c5SAndroid Build Coastguard Worker
1490*8975f5c5SAndroid Build Coastguard Worker // If we use these indices to draw however, we should be drawing an hourglass.
1491*8975f5c5SAndroid Build Coastguard Worker auto indices = std::vector<GLushort>{0, 2, 1, 3};
1492*8975f5c5SAndroid Build Coastguard Worker
1493*8975f5c5SAndroid Build Coastguard Worker GLint mPositionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
1494*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, mPositionLocation);
1495*8975f5c5SAndroid Build Coastguard Worker
1496*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
1497*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
1498*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
1499*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1500*8975f5c5SAndroid Build Coastguard Worker
1501*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
1502*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
1503*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLushort), &indices[0],
1504*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1505*8975f5c5SAndroid Build Coastguard Worker
1506*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(mPositionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
1507*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(mPositionLocation);
1508*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1509*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, nullptr); // hourglass
1510*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINE_LOOP, 0, 4); // square
1511*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(mPositionLocation);
1512*8975f5c5SAndroid Build Coastguard Worker
1513*8975f5c5SAndroid Build Coastguard Worker validateSquareAndHourglass();
1514*8975f5c5SAndroid Build Coastguard Worker }
1515*8975f5c5SAndroid Build Coastguard Worker
1516*8975f5c5SAndroid Build Coastguard Worker // Draw line loop using a drawArrays followed by an hourglass with drawElements.
TEST_P(LineLoopStateChangeTest,DrawArraysThenDrawElements)1517*8975f5c5SAndroid Build Coastguard Worker TEST_P(LineLoopStateChangeTest, DrawArraysThenDrawElements)
1518*8975f5c5SAndroid Build Coastguard Worker {
1519*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40644657: Seems to fail on older drivers and pass on newer.
1520*8975f5c5SAndroid Build Coastguard Worker // Tested failing on 18.3.3 and passing on 18.9.2.
1521*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAMD() && IsVulkan() && IsWindows());
1522*8975f5c5SAndroid Build Coastguard Worker
1523*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
1524*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
1525*8975f5c5SAndroid Build Coastguard Worker
1526*8975f5c5SAndroid Build Coastguard Worker // We expect to draw a square with these 4 vertices with a drawArray call.
1527*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector3> vertices;
1528*8975f5c5SAndroid Build Coastguard Worker CreatePixelCenterWindowCoords({{8, 8}, {8, 24}, {24, 24}, {24, 8}}, getWindowWidth(),
1529*8975f5c5SAndroid Build Coastguard Worker getWindowHeight(), &vertices);
1530*8975f5c5SAndroid Build Coastguard Worker
1531*8975f5c5SAndroid Build Coastguard Worker // If we use these indices to draw however, we should be drawing an hourglass.
1532*8975f5c5SAndroid Build Coastguard Worker auto indices = std::vector<GLushort>{0, 2, 1, 3};
1533*8975f5c5SAndroid Build Coastguard Worker
1534*8975f5c5SAndroid Build Coastguard Worker GLint mPositionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
1535*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, mPositionLocation);
1536*8975f5c5SAndroid Build Coastguard Worker
1537*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
1538*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
1539*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
1540*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1541*8975f5c5SAndroid Build Coastguard Worker
1542*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
1543*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
1544*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLushort), &indices[0],
1545*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1546*8975f5c5SAndroid Build Coastguard Worker
1547*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(mPositionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
1548*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(mPositionLocation);
1549*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1550*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINE_LOOP, 0, 4); // square
1551*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, nullptr); // hourglass
1552*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(mPositionLocation);
1553*8975f5c5SAndroid Build Coastguard Worker
1554*8975f5c5SAndroid Build Coastguard Worker validateSquareAndHourglass();
1555*8975f5c5SAndroid Build Coastguard Worker }
1556*8975f5c5SAndroid Build Coastguard Worker
1557*8975f5c5SAndroid Build Coastguard Worker // Draw a triangle with a drawElements call and a non-zero offset and draw the same
1558*8975f5c5SAndroid Build Coastguard Worker // triangle with the same offset again followed by a line loop with drawElements.
TEST_P(LineLoopStateChangeTest,DrawElementsThenDrawElements)1559*8975f5c5SAndroid Build Coastguard Worker TEST_P(LineLoopStateChangeTest, DrawElementsThenDrawElements)
1560*8975f5c5SAndroid Build Coastguard Worker {
1561*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
1562*8975f5c5SAndroid Build Coastguard Worker
1563*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
1564*8975f5c5SAndroid Build Coastguard Worker
1565*8975f5c5SAndroid Build Coastguard Worker // Background Red color
1566*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1567*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1568*8975f5c5SAndroid Build Coastguard Worker
1569*8975f5c5SAndroid Build Coastguard Worker // We expect to draw a triangle with the last three points on the bottom right,
1570*8975f5c5SAndroid Build Coastguard Worker // draw with LineLoop, and then draw a triangle with the same non-zero offset.
1571*8975f5c5SAndroid Build Coastguard Worker auto vertices = std::vector<Vector3>{
1572*8975f5c5SAndroid Build Coastguard Worker {-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, -1.0f, 0.0f}, {-1.0f, -1.0f, 0.0f}};
1573*8975f5c5SAndroid Build Coastguard Worker
1574*8975f5c5SAndroid Build Coastguard Worker auto indices = std::vector<GLushort>{0, 1, 2, 1, 2, 3};
1575*8975f5c5SAndroid Build Coastguard Worker
1576*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
1577*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
1578*8975f5c5SAndroid Build Coastguard Worker
1579*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
1580*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
1581*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLushort), &indices[0],
1582*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1583*8975f5c5SAndroid Build Coastguard Worker
1584*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
1585*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
1586*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
1587*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1588*8975f5c5SAndroid Build Coastguard Worker
1589*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
1590*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
1591*8975f5c5SAndroid Build Coastguard Worker
1592*8975f5c5SAndroid Build Coastguard Worker // Draw a triangle with a non-zero offset on the bottom right.
1593*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, (void *)(3 * sizeof(GLushort)));
1594*8975f5c5SAndroid Build Coastguard Worker
1595*8975f5c5SAndroid Build Coastguard Worker // Draw with LineLoop.
1596*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_LINE_LOOP, 3, GL_UNSIGNED_SHORT, nullptr);
1597*8975f5c5SAndroid Build Coastguard Worker
1598*8975f5c5SAndroid Build Coastguard Worker // Draw the triangle again with the same offset.
1599*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, (void *)(3 * sizeof(GLushort)));
1600*8975f5c5SAndroid Build Coastguard Worker
1601*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(positionLocation);
1602*8975f5c5SAndroid Build Coastguard Worker
1603*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1604*8975f5c5SAndroid Build Coastguard Worker
1605*8975f5c5SAndroid Build Coastguard Worker int quarterWidth = getWindowWidth() / 4;
1606*8975f5c5SAndroid Build Coastguard Worker int quarterHeight = getWindowHeight() / 4;
1607*8975f5c5SAndroid Build Coastguard Worker
1608*8975f5c5SAndroid Build Coastguard Worker // Validate the top left point's color.
1609*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, getWindowHeight() - 1, GLColor::blue);
1610*8975f5c5SAndroid Build Coastguard Worker
1611*8975f5c5SAndroid Build Coastguard Worker // Validate the triangle is drawn on the bottom right.
1612*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight, GLColor::blue);
1613*8975f5c5SAndroid Build Coastguard Worker
1614*8975f5c5SAndroid Build Coastguard Worker // Validate the triangle is NOT on the top left part.
1615*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight * 3, GLColor::red);
1616*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth, quarterHeight * 2, GLColor::red);
1617*8975f5c5SAndroid Build Coastguard Worker }
1618*8975f5c5SAndroid Build Coastguard Worker
1619*8975f5c5SAndroid Build Coastguard Worker // Simple state change tests, primarily focused on basic object lifetime and dependency management
1620*8975f5c5SAndroid Build Coastguard Worker // with back-ends that don't support that automatically (i.e. Vulkan).
1621*8975f5c5SAndroid Build Coastguard Worker class SimpleStateChangeTest : public ANGLETest<>
1622*8975f5c5SAndroid Build Coastguard Worker {
1623*8975f5c5SAndroid Build Coastguard Worker protected:
1624*8975f5c5SAndroid Build Coastguard Worker static constexpr int kWindowSize = 64;
1625*8975f5c5SAndroid Build Coastguard Worker
SimpleStateChangeTest()1626*8975f5c5SAndroid Build Coastguard Worker SimpleStateChangeTest()
1627*8975f5c5SAndroid Build Coastguard Worker {
1628*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(kWindowSize);
1629*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(kWindowSize);
1630*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
1631*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
1632*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
1633*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
1634*8975f5c5SAndroid Build Coastguard Worker }
1635*8975f5c5SAndroid Build Coastguard Worker
1636*8975f5c5SAndroid Build Coastguard Worker void simpleDrawWithBuffer(GLBuffer *buffer);
1637*8975f5c5SAndroid Build Coastguard Worker void simpleDrawWithColor(const GLColor &color);
1638*8975f5c5SAndroid Build Coastguard Worker
1639*8975f5c5SAndroid Build Coastguard Worker using UpdateFunc = std::function<void(GLenum, GLTexture *, GLint, GLint, const GLColor &)>;
1640*8975f5c5SAndroid Build Coastguard Worker void updateTextureBoundToFramebufferHelper(UpdateFunc updateFunc);
1641*8975f5c5SAndroid Build Coastguard Worker void bindTextureToFbo(GLFramebuffer &fbo, GLTexture &texture);
1642*8975f5c5SAndroid Build Coastguard Worker void drawToFboWithCulling(const GLenum frontFace, bool earlyFrontFaceDirty);
1643*8975f5c5SAndroid Build Coastguard Worker };
1644*8975f5c5SAndroid Build Coastguard Worker
1645*8975f5c5SAndroid Build Coastguard Worker class SimpleStateChangeTestES3 : public SimpleStateChangeTest
1646*8975f5c5SAndroid Build Coastguard Worker {
1647*8975f5c5SAndroid Build Coastguard Worker protected:
blendAndVerifyColor(const GLColor32F blendColor,const GLColor expectedColor)1648*8975f5c5SAndroid Build Coastguard Worker void blendAndVerifyColor(const GLColor32F blendColor, const GLColor expectedColor)
1649*8975f5c5SAndroid Build Coastguard Worker {
1650*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
1651*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1652*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1653*8975f5c5SAndroid Build Coastguard Worker
1654*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1655*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
1656*8975f5c5SAndroid Build Coastguard Worker
1657*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
1658*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
1659*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
1660*8975f5c5SAndroid Build Coastguard Worker
1661*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, blendColor.R, blendColor.G, blendColor.B, blendColor.A);
1662*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1663*8975f5c5SAndroid Build Coastguard Worker
1664*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
1665*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1666*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedColor, 1);
1667*8975f5c5SAndroid Build Coastguard Worker }
1668*8975f5c5SAndroid Build Coastguard Worker };
1669*8975f5c5SAndroid Build Coastguard Worker
1670*8975f5c5SAndroid Build Coastguard Worker class SimpleStateChangeTestES31 : public SimpleStateChangeTestES3
1671*8975f5c5SAndroid Build Coastguard Worker {};
1672*8975f5c5SAndroid Build Coastguard Worker
1673*8975f5c5SAndroid Build Coastguard Worker class SimpleStateChangeTestComputeES31 : public SimpleStateChangeTest
1674*8975f5c5SAndroid Build Coastguard Worker {
1675*8975f5c5SAndroid Build Coastguard Worker protected:
testSetUp()1676*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
1677*8975f5c5SAndroid Build Coastguard Worker {
1678*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mFramebuffer);
1679*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mTexture);
1680*8975f5c5SAndroid Build Coastguard Worker
1681*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTexture);
1682*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
1683*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1684*8975f5c5SAndroid Build Coastguard Worker
1685*8975f5c5SAndroid Build Coastguard Worker constexpr char kCS[] = R"(#version 310 es
1686*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=2, local_size_y=2) in;
1687*8975f5c5SAndroid Build Coastguard Worker layout (rgba8, binding = 0) readonly uniform highp image2D srcImage;
1688*8975f5c5SAndroid Build Coastguard Worker layout (rgba8, binding = 1) writeonly uniform highp image2D dstImage;
1689*8975f5c5SAndroid Build Coastguard Worker void main()
1690*8975f5c5SAndroid Build Coastguard Worker {
1691*8975f5c5SAndroid Build Coastguard Worker imageStore(dstImage, ivec2(gl_LocalInvocationID.xy),
1692*8975f5c5SAndroid Build Coastguard Worker imageLoad(srcImage, ivec2(gl_LocalInvocationID.xy)));
1693*8975f5c5SAndroid Build Coastguard Worker })";
1694*8975f5c5SAndroid Build Coastguard Worker
1695*8975f5c5SAndroid Build Coastguard Worker mProgram = CompileComputeProgram(kCS);
1696*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(mProgram, 0u);
1697*8975f5c5SAndroid Build Coastguard Worker
1698*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(1, mTexture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);
1699*8975f5c5SAndroid Build Coastguard Worker
1700*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebuffer);
1701*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture,
1702*8975f5c5SAndroid Build Coastguard Worker 0);
1703*8975f5c5SAndroid Build Coastguard Worker
1704*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1705*8975f5c5SAndroid Build Coastguard Worker }
1706*8975f5c5SAndroid Build Coastguard Worker
testTearDown()1707*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override
1708*8975f5c5SAndroid Build Coastguard Worker {
1709*8975f5c5SAndroid Build Coastguard Worker if (mFramebuffer != 0)
1710*8975f5c5SAndroid Build Coastguard Worker {
1711*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mFramebuffer);
1712*8975f5c5SAndroid Build Coastguard Worker mFramebuffer = 0;
1713*8975f5c5SAndroid Build Coastguard Worker }
1714*8975f5c5SAndroid Build Coastguard Worker
1715*8975f5c5SAndroid Build Coastguard Worker if (mTexture != 0)
1716*8975f5c5SAndroid Build Coastguard Worker {
1717*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mTexture);
1718*8975f5c5SAndroid Build Coastguard Worker mTexture = 0;
1719*8975f5c5SAndroid Build Coastguard Worker }
1720*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mProgram);
1721*8975f5c5SAndroid Build Coastguard Worker }
1722*8975f5c5SAndroid Build Coastguard Worker
1723*8975f5c5SAndroid Build Coastguard Worker GLuint mProgram;
1724*8975f5c5SAndroid Build Coastguard Worker GLuint mFramebuffer = 0;
1725*8975f5c5SAndroid Build Coastguard Worker GLuint mTexture = 0;
1726*8975f5c5SAndroid Build Coastguard Worker };
1727*8975f5c5SAndroid Build Coastguard Worker
1728*8975f5c5SAndroid Build Coastguard Worker class ImageES31PPO
1729*8975f5c5SAndroid Build Coastguard Worker {
1730*8975f5c5SAndroid Build Coastguard Worker protected:
ImageES31PPO()1731*8975f5c5SAndroid Build Coastguard Worker ImageES31PPO() : mComputeProg(0), mPipeline(0) {}
1732*8975f5c5SAndroid Build Coastguard Worker
bindProgramPipeline(const GLchar * computeString)1733*8975f5c5SAndroid Build Coastguard Worker void bindProgramPipeline(const GLchar *computeString)
1734*8975f5c5SAndroid Build Coastguard Worker {
1735*8975f5c5SAndroid Build Coastguard Worker mComputeProg = glCreateShaderProgramv(GL_COMPUTE_SHADER, 1, &computeString);
1736*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(mComputeProg, 0u);
1737*8975f5c5SAndroid Build Coastguard Worker
1738*8975f5c5SAndroid Build Coastguard Worker // Generate a program pipeline and attach the programs to their respective stages
1739*8975f5c5SAndroid Build Coastguard Worker glGenProgramPipelines(1, &mPipeline);
1740*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1741*8975f5c5SAndroid Build Coastguard Worker glUseProgramStages(mPipeline, GL_COMPUTE_SHADER_BIT, mComputeProg);
1742*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1743*8975f5c5SAndroid Build Coastguard Worker glBindProgramPipeline(mPipeline);
1744*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1745*8975f5c5SAndroid Build Coastguard Worker glActiveShaderProgram(mPipeline, mComputeProg);
1746*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1747*8975f5c5SAndroid Build Coastguard Worker }
1748*8975f5c5SAndroid Build Coastguard Worker
1749*8975f5c5SAndroid Build Coastguard Worker GLuint mComputeProg;
1750*8975f5c5SAndroid Build Coastguard Worker GLuint mPipeline;
1751*8975f5c5SAndroid Build Coastguard Worker };
1752*8975f5c5SAndroid Build Coastguard Worker
1753*8975f5c5SAndroid Build Coastguard Worker class SimpleStateChangeTestComputeES31PPO : public ImageES31PPO, public SimpleStateChangeTest
1754*8975f5c5SAndroid Build Coastguard Worker {
1755*8975f5c5SAndroid Build Coastguard Worker protected:
SimpleStateChangeTestComputeES31PPO()1756*8975f5c5SAndroid Build Coastguard Worker SimpleStateChangeTestComputeES31PPO() : ImageES31PPO(), SimpleStateChangeTest() {}
1757*8975f5c5SAndroid Build Coastguard Worker
testTearDown()1758*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override
1759*8975f5c5SAndroid Build Coastguard Worker {
1760*8975f5c5SAndroid Build Coastguard Worker if (mFramebuffer != 0)
1761*8975f5c5SAndroid Build Coastguard Worker {
1762*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mFramebuffer);
1763*8975f5c5SAndroid Build Coastguard Worker mFramebuffer = 0;
1764*8975f5c5SAndroid Build Coastguard Worker }
1765*8975f5c5SAndroid Build Coastguard Worker
1766*8975f5c5SAndroid Build Coastguard Worker if (mTexture != 0)
1767*8975f5c5SAndroid Build Coastguard Worker {
1768*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mTexture);
1769*8975f5c5SAndroid Build Coastguard Worker mTexture = 0;
1770*8975f5c5SAndroid Build Coastguard Worker }
1771*8975f5c5SAndroid Build Coastguard Worker glDeleteProgramPipelines(1, &mPipeline);
1772*8975f5c5SAndroid Build Coastguard Worker }
1773*8975f5c5SAndroid Build Coastguard Worker
1774*8975f5c5SAndroid Build Coastguard Worker GLuint mFramebuffer = 0;
1775*8975f5c5SAndroid Build Coastguard Worker GLuint mTexture = 0;
1776*8975f5c5SAndroid Build Coastguard Worker };
1777*8975f5c5SAndroid Build Coastguard Worker
1778*8975f5c5SAndroid Build Coastguard Worker constexpr char kSimpleVertexShader[] = R"(attribute vec2 position;
1779*8975f5c5SAndroid Build Coastguard Worker attribute vec4 color;
1780*8975f5c5SAndroid Build Coastguard Worker varying vec4 vColor;
1781*8975f5c5SAndroid Build Coastguard Worker void main()
1782*8975f5c5SAndroid Build Coastguard Worker {
1783*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
1784*8975f5c5SAndroid Build Coastguard Worker vColor = color;
1785*8975f5c5SAndroid Build Coastguard Worker }
1786*8975f5c5SAndroid Build Coastguard Worker )";
1787*8975f5c5SAndroid Build Coastguard Worker
1788*8975f5c5SAndroid Build Coastguard Worker constexpr char kSimpleVertexShaderForPoints[] = R"(attribute vec2 position;
1789*8975f5c5SAndroid Build Coastguard Worker attribute vec4 color;
1790*8975f5c5SAndroid Build Coastguard Worker varying vec4 vColor;
1791*8975f5c5SAndroid Build Coastguard Worker void main()
1792*8975f5c5SAndroid Build Coastguard Worker {
1793*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
1794*8975f5c5SAndroid Build Coastguard Worker gl_PointSize = 1.0;
1795*8975f5c5SAndroid Build Coastguard Worker vColor = color;
1796*8975f5c5SAndroid Build Coastguard Worker }
1797*8975f5c5SAndroid Build Coastguard Worker )";
1798*8975f5c5SAndroid Build Coastguard Worker
1799*8975f5c5SAndroid Build Coastguard Worker constexpr char kZeroVertexShaderForPoints[] = R"(void main()
1800*8975f5c5SAndroid Build Coastguard Worker {
1801*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(0);
1802*8975f5c5SAndroid Build Coastguard Worker gl_PointSize = 1.0;
1803*8975f5c5SAndroid Build Coastguard Worker }
1804*8975f5c5SAndroid Build Coastguard Worker )";
1805*8975f5c5SAndroid Build Coastguard Worker
1806*8975f5c5SAndroid Build Coastguard Worker constexpr char kSimpleFragmentShader[] = R"(precision mediump float;
1807*8975f5c5SAndroid Build Coastguard Worker varying vec4 vColor;
1808*8975f5c5SAndroid Build Coastguard Worker void main()
1809*8975f5c5SAndroid Build Coastguard Worker {
1810*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vColor;
1811*8975f5c5SAndroid Build Coastguard Worker }
1812*8975f5c5SAndroid Build Coastguard Worker )";
1813*8975f5c5SAndroid Build Coastguard Worker
simpleDrawWithBuffer(GLBuffer * buffer)1814*8975f5c5SAndroid Build Coastguard Worker void SimpleStateChangeTest::simpleDrawWithBuffer(GLBuffer *buffer)
1815*8975f5c5SAndroid Build Coastguard Worker {
1816*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kSimpleVertexShader, kSimpleFragmentShader);
1817*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
1818*8975f5c5SAndroid Build Coastguard Worker
1819*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetAttribLocation(program, "color");
1820*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
1821*8975f5c5SAndroid Build Coastguard Worker
1822*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, *buffer);
1823*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
1824*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
1825*8975f5c5SAndroid Build Coastguard Worker
1826*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.5f, 1.0f, true);
1827*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1828*8975f5c5SAndroid Build Coastguard Worker }
1829*8975f5c5SAndroid Build Coastguard Worker
simpleDrawWithColor(const GLColor & color)1830*8975f5c5SAndroid Build Coastguard Worker void SimpleStateChangeTest::simpleDrawWithColor(const GLColor &color)
1831*8975f5c5SAndroid Build Coastguard Worker {
1832*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> colors(6, color);
1833*8975f5c5SAndroid Build Coastguard Worker GLBuffer colorBuffer;
1834*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
1835*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, colors.size() * sizeof(GLColor), colors.data(), GL_STATIC_DRAW);
1836*8975f5c5SAndroid Build Coastguard Worker simpleDrawWithBuffer(&colorBuffer);
1837*8975f5c5SAndroid Build Coastguard Worker }
1838*8975f5c5SAndroid Build Coastguard Worker
1839*8975f5c5SAndroid Build Coastguard Worker // Test that we can do a drawElements call successfully after making a drawArrays call in the same
1840*8975f5c5SAndroid Build Coastguard Worker // frame.
TEST_P(SimpleStateChangeTest,DrawArraysThenDrawElements)1841*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DrawArraysThenDrawElements)
1842*8975f5c5SAndroid Build Coastguard Worker {
1843*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40644706
1844*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsIntel() && IsLinux() && IsOpenGLES());
1845*8975f5c5SAndroid Build Coastguard Worker
1846*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
1847*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
1848*8975f5c5SAndroid Build Coastguard Worker
1849*8975f5c5SAndroid Build Coastguard Worker // We expect to draw a triangle with the first 3 points to the left, then another triangle with
1850*8975f5c5SAndroid Build Coastguard Worker // the last 3 vertices using a drawElements call.
1851*8975f5c5SAndroid Build Coastguard Worker auto vertices = std::vector<Vector3>{{-1.0f, -1.0f, 0.0f},
1852*8975f5c5SAndroid Build Coastguard Worker {-1.0f, 1.0f, 0.0f},
1853*8975f5c5SAndroid Build Coastguard Worker {0.0f, 0.0f, 0.0f},
1854*8975f5c5SAndroid Build Coastguard Worker {1.0f, 1.0f, 0.0f},
1855*8975f5c5SAndroid Build Coastguard Worker {1.0f, -1.0f, 0.0f}};
1856*8975f5c5SAndroid Build Coastguard Worker
1857*8975f5c5SAndroid Build Coastguard Worker // If we use these indices to draw we'll be using the last 2 vertex only to draw.
1858*8975f5c5SAndroid Build Coastguard Worker auto indices = std::vector<GLushort>{2, 3, 4};
1859*8975f5c5SAndroid Build Coastguard Worker
1860*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
1861*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
1862*8975f5c5SAndroid Build Coastguard Worker
1863*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
1864*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
1865*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
1866*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1867*8975f5c5SAndroid Build Coastguard Worker
1868*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
1869*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
1870*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLushort), &indices[0],
1871*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1872*8975f5c5SAndroid Build Coastguard Worker
1873*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
1874*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
1875*8975f5c5SAndroid Build Coastguard Worker
1876*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 10; i++)
1877*8975f5c5SAndroid Build Coastguard Worker {
1878*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1879*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3); // triangle to the left
1880*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, nullptr); // triangle to the right
1881*8975f5c5SAndroid Build Coastguard Worker glFinish();
1882*8975f5c5SAndroid Build Coastguard Worker }
1883*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(positionLocation);
1884*8975f5c5SAndroid Build Coastguard Worker
1885*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1886*8975f5c5SAndroid Build Coastguard Worker
1887*8975f5c5SAndroid Build Coastguard Worker int quarterWidth = getWindowWidth() / 4;
1888*8975f5c5SAndroid Build Coastguard Worker int halfHeight = getWindowHeight() / 2;
1889*8975f5c5SAndroid Build Coastguard Worker
1890*8975f5c5SAndroid Build Coastguard Worker // Validate triangle to the left
1891*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth, halfHeight, GLColor::blue);
1892*8975f5c5SAndroid Build Coastguard Worker
1893*8975f5c5SAndroid Build Coastguard Worker // Validate triangle to the right
1894*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ((quarterWidth * 3), halfHeight, GLColor::blue);
1895*8975f5c5SAndroid Build Coastguard Worker }
1896*8975f5c5SAndroid Build Coastguard Worker
1897*8975f5c5SAndroid Build Coastguard Worker // Draw a triangle with drawElements and a non-zero offset and draw the same
1898*8975f5c5SAndroid Build Coastguard Worker // triangle with the same offset followed by binding the same element buffer.
TEST_P(SimpleStateChangeTest,DrawElementsThenDrawElements)1899*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DrawElementsThenDrawElements)
1900*8975f5c5SAndroid Build Coastguard Worker {
1901*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
1902*8975f5c5SAndroid Build Coastguard Worker
1903*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
1904*8975f5c5SAndroid Build Coastguard Worker
1905*8975f5c5SAndroid Build Coastguard Worker // Background Red color
1906*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1907*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1908*8975f5c5SAndroid Build Coastguard Worker
1909*8975f5c5SAndroid Build Coastguard Worker // We expect to draw the triangle with the last three points on the bottom right, and
1910*8975f5c5SAndroid Build Coastguard Worker // rebind the same element buffer and draw with the same indices.
1911*8975f5c5SAndroid Build Coastguard Worker auto vertices = std::vector<Vector3>{
1912*8975f5c5SAndroid Build Coastguard Worker {-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, -1.0f, 0.0f}, {-1.0f, -1.0f, 0.0f}};
1913*8975f5c5SAndroid Build Coastguard Worker
1914*8975f5c5SAndroid Build Coastguard Worker auto indices = std::vector<GLushort>{0, 1, 2, 1, 2, 3};
1915*8975f5c5SAndroid Build Coastguard Worker
1916*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
1917*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
1918*8975f5c5SAndroid Build Coastguard Worker
1919*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
1920*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
1921*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLushort), &indices[0],
1922*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1923*8975f5c5SAndroid Build Coastguard Worker
1924*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
1925*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
1926*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
1927*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1928*8975f5c5SAndroid Build Coastguard Worker
1929*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
1930*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
1931*8975f5c5SAndroid Build Coastguard Worker
1932*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, (void *)(3 * sizeof(GLushort)));
1933*8975f5c5SAndroid Build Coastguard Worker
1934*8975f5c5SAndroid Build Coastguard Worker // Rebind the same element buffer.
1935*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
1936*8975f5c5SAndroid Build Coastguard Worker
1937*8975f5c5SAndroid Build Coastguard Worker // Draw the triangle again with the same offset.
1938*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, (void *)(3 * sizeof(GLushort)));
1939*8975f5c5SAndroid Build Coastguard Worker
1940*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(positionLocation);
1941*8975f5c5SAndroid Build Coastguard Worker
1942*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1943*8975f5c5SAndroid Build Coastguard Worker
1944*8975f5c5SAndroid Build Coastguard Worker int quarterWidth = getWindowWidth() / 4;
1945*8975f5c5SAndroid Build Coastguard Worker int quarterHeight = getWindowHeight() / 4;
1946*8975f5c5SAndroid Build Coastguard Worker
1947*8975f5c5SAndroid Build Coastguard Worker // Validate the triangle is drawn on the bottom right.
1948*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight, GLColor::blue);
1949*8975f5c5SAndroid Build Coastguard Worker
1950*8975f5c5SAndroid Build Coastguard Worker // Validate the triangle is NOT on the top left part.
1951*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight * 3, GLColor::red);
1952*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth, quarterHeight * 2, GLColor::red);
1953*8975f5c5SAndroid Build Coastguard Worker }
1954*8975f5c5SAndroid Build Coastguard Worker
1955*8975f5c5SAndroid Build Coastguard Worker // Draw a triangle with drawElements then change the index buffer and draw again.
TEST_P(SimpleStateChangeTest,DrawElementsThenDrawElementsNewIndexBuffer)1956*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DrawElementsThenDrawElementsNewIndexBuffer)
1957*8975f5c5SAndroid Build Coastguard Worker {
1958*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1959*8975f5c5SAndroid Build Coastguard Worker
1960*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
1961*8975f5c5SAndroid Build Coastguard Worker
1962*8975f5c5SAndroid Build Coastguard Worker // Background Red color
1963*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
1964*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1965*8975f5c5SAndroid Build Coastguard Worker
1966*8975f5c5SAndroid Build Coastguard Worker // We expect to draw the triangle with the last three points on the bottom right, and
1967*8975f5c5SAndroid Build Coastguard Worker // rebind the same element buffer and draw with the same indices.
1968*8975f5c5SAndroid Build Coastguard Worker auto vertices = std::vector<Vector3>{
1969*8975f5c5SAndroid Build Coastguard Worker {-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, -1.0f, 0.0f}, {-1.0f, -1.0f, 0.0f}};
1970*8975f5c5SAndroid Build Coastguard Worker
1971*8975f5c5SAndroid Build Coastguard Worker auto indices8 = std::vector<GLubyte>{0, 1, 2, 1, 2, 3};
1972*8975f5c5SAndroid Build Coastguard Worker
1973*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
1974*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
1975*8975f5c5SAndroid Build Coastguard Worker
1976*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
1977*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
1978*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
1979*8975f5c5SAndroid Build Coastguard Worker
1980*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 1.0f, 1.0f, 1.0f);
1981*8975f5c5SAndroid Build Coastguard Worker
1982*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer8;
1983*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer8);
1984*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices8.size() * sizeof(GLubyte), &indices8[0],
1985*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1986*8975f5c5SAndroid Build Coastguard Worker
1987*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
1988*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
1989*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
1990*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
1991*8975f5c5SAndroid Build Coastguard Worker
1992*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
1993*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
1994*8975f5c5SAndroid Build Coastguard Worker
1995*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, (void *)(0 * sizeof(GLubyte)));
1996*8975f5c5SAndroid Build Coastguard Worker
1997*8975f5c5SAndroid Build Coastguard Worker auto indices2nd8 = std::vector<GLubyte>{2, 3, 0, 0, 1, 2};
1998*8975f5c5SAndroid Build Coastguard Worker
1999*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices2nd8.size() * sizeof(GLubyte), &indices2nd8[0],
2000*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2001*8975f5c5SAndroid Build Coastguard Worker
2002*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
2003*8975f5c5SAndroid Build Coastguard Worker
2004*8975f5c5SAndroid Build Coastguard Worker // Draw the triangle again with the same offset.
2005*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, (void *)(0 * sizeof(GLubyte)));
2006*8975f5c5SAndroid Build Coastguard Worker
2007*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(positionLocation);
2008*8975f5c5SAndroid Build Coastguard Worker
2009*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2010*8975f5c5SAndroid Build Coastguard Worker
2011*8975f5c5SAndroid Build Coastguard Worker int quarterWidth = getWindowWidth() / 4;
2012*8975f5c5SAndroid Build Coastguard Worker int quarterHeight = getWindowHeight() / 4;
2013*8975f5c5SAndroid Build Coastguard Worker
2014*8975f5c5SAndroid Build Coastguard Worker // Validate the triangle is drawn on the bottom left.
2015*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight, GLColor::blue);
2016*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth, quarterHeight * 2, GLColor::blue);
2017*8975f5c5SAndroid Build Coastguard Worker
2018*8975f5c5SAndroid Build Coastguard Worker // Validate the triangle is NOT on the top right part.
2019*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight * 3, GLColor::white);
2020*8975f5c5SAndroid Build Coastguard Worker }
2021*8975f5c5SAndroid Build Coastguard Worker
2022*8975f5c5SAndroid Build Coastguard Worker // Draw a triangle with drawElements then change the indices and draw again.
TEST_P(SimpleStateChangeTest,DrawElementsThenDrawElementsNewIndices)2023*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DrawElementsThenDrawElementsNewIndices)
2024*8975f5c5SAndroid Build Coastguard Worker {
2025*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2026*8975f5c5SAndroid Build Coastguard Worker
2027*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2028*8975f5c5SAndroid Build Coastguard Worker
2029*8975f5c5SAndroid Build Coastguard Worker // Background Red color
2030*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2031*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2032*8975f5c5SAndroid Build Coastguard Worker
2033*8975f5c5SAndroid Build Coastguard Worker // We expect to draw the triangle with the last three points on the bottom right, and
2034*8975f5c5SAndroid Build Coastguard Worker // rebind the same element buffer and draw with the same indices.
2035*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector3> vertices = {
2036*8975f5c5SAndroid Build Coastguard Worker {-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, -1.0f, 0.0f}, {-1.0f, -1.0f, 0.0f}};
2037*8975f5c5SAndroid Build Coastguard Worker
2038*8975f5c5SAndroid Build Coastguard Worker std::vector<GLubyte> indices8 = {0, 1, 2, 2, 3, 0};
2039*8975f5c5SAndroid Build Coastguard Worker
2040*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
2041*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
2042*8975f5c5SAndroid Build Coastguard Worker
2043*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2044*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
2045*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2046*8975f5c5SAndroid Build Coastguard Worker
2047*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 1.0f, 1.0f, 1.0f);
2048*8975f5c5SAndroid Build Coastguard Worker
2049*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer8;
2050*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer8);
2051*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices8.size() * sizeof(GLubyte), &indices8[0],
2052*8975f5c5SAndroid Build Coastguard Worker GL_DYNAMIC_DRAW);
2053*8975f5c5SAndroid Build Coastguard Worker
2054*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
2055*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
2056*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
2057*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2058*8975f5c5SAndroid Build Coastguard Worker
2059*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
2060*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
2061*8975f5c5SAndroid Build Coastguard Worker
2062*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, (void *)(0 * sizeof(GLubyte)));
2063*8975f5c5SAndroid Build Coastguard Worker
2064*8975f5c5SAndroid Build Coastguard Worker std::vector<GLubyte> newIndices8 = {2, 3, 0};
2065*8975f5c5SAndroid Build Coastguard Worker
2066*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, newIndices8.size() * sizeof(GLubyte),
2067*8975f5c5SAndroid Build Coastguard Worker &newIndices8[0]);
2068*8975f5c5SAndroid Build Coastguard Worker
2069*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
2070*8975f5c5SAndroid Build Coastguard Worker
2071*8975f5c5SAndroid Build Coastguard Worker // Draw the triangle again with the same offset.
2072*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, (void *)(0 * sizeof(GLubyte)));
2073*8975f5c5SAndroid Build Coastguard Worker
2074*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(positionLocation);
2075*8975f5c5SAndroid Build Coastguard Worker
2076*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2077*8975f5c5SAndroid Build Coastguard Worker
2078*8975f5c5SAndroid Build Coastguard Worker int quarterWidth = getWindowWidth() / 4;
2079*8975f5c5SAndroid Build Coastguard Worker int quarterHeight = getWindowHeight() / 4;
2080*8975f5c5SAndroid Build Coastguard Worker
2081*8975f5c5SAndroid Build Coastguard Worker // Validate the triangle is drawn on the bottom left.
2082*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight, GLColor::blue);
2083*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth, quarterHeight * 2, GLColor::blue);
2084*8975f5c5SAndroid Build Coastguard Worker
2085*8975f5c5SAndroid Build Coastguard Worker // Validate the triangle is NOT on the top right part.
2086*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight * 3, GLColor::white);
2087*8975f5c5SAndroid Build Coastguard Worker }
2088*8975f5c5SAndroid Build Coastguard Worker
2089*8975f5c5SAndroid Build Coastguard Worker // Draw a triangle with drawElements then change the indices and draw again. Similar to
2090*8975f5c5SAndroid Build Coastguard Worker // DrawElementsThenDrawElementsNewIndices, but changes the whole index buffer (not just half). This
2091*8975f5c5SAndroid Build Coastguard Worker // triggers a different path in the Vulkan backend based on the fact that the majority of the buffer
2092*8975f5c5SAndroid Build Coastguard Worker // is being updated.
TEST_P(SimpleStateChangeTest,DrawElementsThenDrawElementsWholeNewIndices)2093*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DrawElementsThenDrawElementsWholeNewIndices)
2094*8975f5c5SAndroid Build Coastguard Worker {
2095*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2096*8975f5c5SAndroid Build Coastguard Worker
2097*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2098*8975f5c5SAndroid Build Coastguard Worker
2099*8975f5c5SAndroid Build Coastguard Worker // Background Red color
2100*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2101*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2102*8975f5c5SAndroid Build Coastguard Worker
2103*8975f5c5SAndroid Build Coastguard Worker // We expect to draw the triangle with the last three points on the bottom right, and
2104*8975f5c5SAndroid Build Coastguard Worker // rebind the same element buffer and draw with the same indices.
2105*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector3> vertices = {
2106*8975f5c5SAndroid Build Coastguard Worker {-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, -1.0f, 0.0f}, {-1.0f, -1.0f, 0.0f}};
2107*8975f5c5SAndroid Build Coastguard Worker
2108*8975f5c5SAndroid Build Coastguard Worker std::vector<GLubyte> indices8 = {0, 1, 2, 2, 3, 0};
2109*8975f5c5SAndroid Build Coastguard Worker
2110*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
2111*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
2112*8975f5c5SAndroid Build Coastguard Worker
2113*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2114*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
2115*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2116*8975f5c5SAndroid Build Coastguard Worker
2117*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 1.0f, 1.0f, 1.0f);
2118*8975f5c5SAndroid Build Coastguard Worker
2119*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer8;
2120*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer8);
2121*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices8.size() * sizeof(GLubyte), &indices8[0],
2122*8975f5c5SAndroid Build Coastguard Worker GL_DYNAMIC_DRAW);
2123*8975f5c5SAndroid Build Coastguard Worker
2124*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
2125*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
2126*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
2127*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2128*8975f5c5SAndroid Build Coastguard Worker
2129*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
2130*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
2131*8975f5c5SAndroid Build Coastguard Worker
2132*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, (void *)(0 * sizeof(GLubyte)));
2133*8975f5c5SAndroid Build Coastguard Worker
2134*8975f5c5SAndroid Build Coastguard Worker std::vector<GLubyte> newIndices8 = {2, 3, 0, 0, 0, 0};
2135*8975f5c5SAndroid Build Coastguard Worker
2136*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, newIndices8.size() * sizeof(GLubyte),
2137*8975f5c5SAndroid Build Coastguard Worker &newIndices8[0]);
2138*8975f5c5SAndroid Build Coastguard Worker
2139*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
2140*8975f5c5SAndroid Build Coastguard Worker
2141*8975f5c5SAndroid Build Coastguard Worker // Draw the triangle again with the same offset.
2142*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, (void *)(0 * sizeof(GLubyte)));
2143*8975f5c5SAndroid Build Coastguard Worker
2144*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(positionLocation);
2145*8975f5c5SAndroid Build Coastguard Worker
2146*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2147*8975f5c5SAndroid Build Coastguard Worker
2148*8975f5c5SAndroid Build Coastguard Worker int quarterWidth = getWindowWidth() / 4;
2149*8975f5c5SAndroid Build Coastguard Worker int quarterHeight = getWindowHeight() / 4;
2150*8975f5c5SAndroid Build Coastguard Worker
2151*8975f5c5SAndroid Build Coastguard Worker // Validate the triangle is drawn on the bottom left.
2152*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight, GLColor::blue);
2153*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth, quarterHeight * 2, GLColor::blue);
2154*8975f5c5SAndroid Build Coastguard Worker
2155*8975f5c5SAndroid Build Coastguard Worker // Validate the triangle is NOT on the top right part.
2156*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight * 3, GLColor::white);
2157*8975f5c5SAndroid Build Coastguard Worker }
2158*8975f5c5SAndroid Build Coastguard Worker
2159*8975f5c5SAndroid Build Coastguard Worker // Draw a triangle with drawElements and a non-zero offset and draw the same
2160*8975f5c5SAndroid Build Coastguard Worker // triangle with the same offset followed by binding a USHORT element buffer.
TEST_P(SimpleStateChangeTest,DrawElementsUBYTEX2ThenDrawElementsUSHORT)2161*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DrawElementsUBYTEX2ThenDrawElementsUSHORT)
2162*8975f5c5SAndroid Build Coastguard Worker {
2163*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
2164*8975f5c5SAndroid Build Coastguard Worker
2165*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2166*8975f5c5SAndroid Build Coastguard Worker
2167*8975f5c5SAndroid Build Coastguard Worker // Background Red color
2168*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2169*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2170*8975f5c5SAndroid Build Coastguard Worker
2171*8975f5c5SAndroid Build Coastguard Worker // We expect to draw the triangle with the last three points on the bottom right, and
2172*8975f5c5SAndroid Build Coastguard Worker // rebind the same element buffer and draw with the same indices.
2173*8975f5c5SAndroid Build Coastguard Worker auto vertices = std::vector<Vector3>{
2174*8975f5c5SAndroid Build Coastguard Worker {-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, -1.0f, 0.0f}, {-1.0f, -1.0f, 0.0f}};
2175*8975f5c5SAndroid Build Coastguard Worker
2176*8975f5c5SAndroid Build Coastguard Worker auto indices8 = std::vector<GLubyte>{0, 1, 2, 1, 2, 3};
2177*8975f5c5SAndroid Build Coastguard Worker
2178*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
2179*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
2180*8975f5c5SAndroid Build Coastguard Worker
2181*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
2182*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
2183*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
2184*8975f5c5SAndroid Build Coastguard Worker
2185*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 1.0f, 1.0f, 1.0f);
2186*8975f5c5SAndroid Build Coastguard Worker
2187*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer8;
2188*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer8);
2189*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices8.size() * sizeof(GLubyte), &indices8[0],
2190*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2191*8975f5c5SAndroid Build Coastguard Worker
2192*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
2193*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
2194*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
2195*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2196*8975f5c5SAndroid Build Coastguard Worker
2197*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
2198*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
2199*8975f5c5SAndroid Build Coastguard Worker
2200*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, (void *)(0 * sizeof(GLubyte)));
2201*8975f5c5SAndroid Build Coastguard Worker
2202*8975f5c5SAndroid Build Coastguard Worker auto indices2nd8 = std::vector<GLubyte>{2, 3, 0, 0, 1, 2};
2203*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer2nd8;
2204*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer2nd8);
2205*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices2nd8.size() * sizeof(GLubyte), &indices2nd8[0],
2206*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2207*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
2208*8975f5c5SAndroid Build Coastguard Worker
2209*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, (void *)(0 * sizeof(GLubyte)));
2210*8975f5c5SAndroid Build Coastguard Worker
2211*8975f5c5SAndroid Build Coastguard Worker // Bind the 16bit element buffer.
2212*8975f5c5SAndroid Build Coastguard Worker auto indices16 = std::vector<GLushort>{0, 1, 3, 1, 2, 3};
2213*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer16;
2214*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer16);
2215*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices16.size() * sizeof(GLushort), &indices16[0],
2216*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2217*8975f5c5SAndroid Build Coastguard Worker
2218*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer16);
2219*8975f5c5SAndroid Build Coastguard Worker
2220*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
2221*8975f5c5SAndroid Build Coastguard Worker
2222*8975f5c5SAndroid Build Coastguard Worker // Draw the triangle again with the same offset.
2223*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, (void *)(0 * sizeof(GLushort)));
2224*8975f5c5SAndroid Build Coastguard Worker
2225*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(positionLocation);
2226*8975f5c5SAndroid Build Coastguard Worker
2227*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2228*8975f5c5SAndroid Build Coastguard Worker
2229*8975f5c5SAndroid Build Coastguard Worker int quarterWidth = getWindowWidth() / 4;
2230*8975f5c5SAndroid Build Coastguard Worker int quarterHeight = getWindowHeight() / 4;
2231*8975f5c5SAndroid Build Coastguard Worker
2232*8975f5c5SAndroid Build Coastguard Worker // Validate green triangle is drawn on the bottom.
2233*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight, GLColor::green);
2234*8975f5c5SAndroid Build Coastguard Worker
2235*8975f5c5SAndroid Build Coastguard Worker // Validate white triangle is drawn on the right.
2236*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 3, quarterHeight * 2, GLColor::white);
2237*8975f5c5SAndroid Build Coastguard Worker
2238*8975f5c5SAndroid Build Coastguard Worker // Validate blue triangle is on the top left part.
2239*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth * 2, quarterHeight * 3, GLColor::blue);
2240*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(quarterWidth, quarterHeight * 2, GLColor::blue);
2241*8975f5c5SAndroid Build Coastguard Worker }
2242*8975f5c5SAndroid Build Coastguard Worker
2243*8975f5c5SAndroid Build Coastguard Worker // Draw a points use multiple unaligned vertex buffer with same data,
2244*8975f5c5SAndroid Build Coastguard Worker // verify all the rendering results are the same.
TEST_P(SimpleStateChangeTest,DrawRepeatUnalignedVboChange)2245*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DrawRepeatUnalignedVboChange)
2246*8975f5c5SAndroid Build Coastguard Worker {
2247*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263089
2248*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(isSwiftshader() && (IsWindows() || IsLinux()));
2249*8975f5c5SAndroid Build Coastguard Worker
2250*8975f5c5SAndroid Build Coastguard Worker const int kRepeat = 2;
2251*8975f5c5SAndroid Build Coastguard Worker
2252*8975f5c5SAndroid Build Coastguard Worker // set up VBO, colorVBO is unaligned
2253*8975f5c5SAndroid Build Coastguard Worker GLBuffer positionBuffer;
2254*8975f5c5SAndroid Build Coastguard Worker constexpr size_t posOffset = 0;
2255*8975f5c5SAndroid Build Coastguard Worker const GLfloat posData[] = {0.5f, 0.5f};
2256*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
2257*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(posData), posData, GL_STATIC_DRAW);
2258*8975f5c5SAndroid Build Coastguard Worker
2259*8975f5c5SAndroid Build Coastguard Worker GLBuffer colorBuffers[kRepeat];
2260*8975f5c5SAndroid Build Coastguard Worker constexpr size_t colorOffset = 1;
2261*8975f5c5SAndroid Build Coastguard Worker const GLfloat colorData[] = {0.515f, 0.515f, 0.515f, 1.0f};
2262*8975f5c5SAndroid Build Coastguard Worker constexpr size_t colorBufferSize = colorOffset + sizeof(colorData);
2263*8975f5c5SAndroid Build Coastguard Worker uint8_t colorDataUnaligned[colorBufferSize] = {0};
2264*8975f5c5SAndroid Build Coastguard Worker memcpy(reinterpret_cast<void *>(colorDataUnaligned + colorOffset), colorData,
2265*8975f5c5SAndroid Build Coastguard Worker sizeof(colorData));
2266*8975f5c5SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kRepeat; i++)
2267*8975f5c5SAndroid Build Coastguard Worker {
2268*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorBuffers[i]);
2269*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, colorBufferSize, colorDataUnaligned, GL_STATIC_DRAW);
2270*8975f5c5SAndroid Build Coastguard Worker }
2271*8975f5c5SAndroid Build Coastguard Worker
2272*8975f5c5SAndroid Build Coastguard Worker // set up frame buffer
2273*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
2274*8975f5c5SAndroid Build Coastguard Worker GLTexture framebufferTexture;
2275*8975f5c5SAndroid Build Coastguard Worker bindTextureToFbo(framebuffer, framebufferTexture);
2276*8975f5c5SAndroid Build Coastguard Worker
2277*8975f5c5SAndroid Build Coastguard Worker // set up program
2278*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kSimpleVertexShaderForPoints, kSimpleFragmentShader);
2279*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2280*8975f5c5SAndroid Build Coastguard Worker GLuint colorAttrLocation = glGetAttribLocation(program, "color");
2281*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorAttrLocation);
2282*8975f5c5SAndroid Build Coastguard Worker GLuint posAttrLocation = glGetAttribLocation(program, "position");
2283*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(posAttrLocation);
2284*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2285*8975f5c5SAndroid Build Coastguard Worker
2286*8975f5c5SAndroid Build Coastguard Worker // draw and get drawing results
2287*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kRenderSize = kWindowSize * kWindowSize;
2288*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, kRenderSize> pixelBufs[kRepeat];
2289*8975f5c5SAndroid Build Coastguard Worker
2290*8975f5c5SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kRepeat; i++)
2291*8975f5c5SAndroid Build Coastguard Worker {
2292*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2293*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2294*8975f5c5SAndroid Build Coastguard Worker
2295*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
2296*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(posAttrLocation, 2, GL_FLOAT, GL_FALSE, 0,
2297*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<const void *>(posOffset));
2298*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorBuffers[i]);
2299*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorAttrLocation, 4, GL_FLOAT, GL_FALSE, 0,
2300*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<const void *>(colorOffset));
2301*8975f5c5SAndroid Build Coastguard Worker
2302*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 1);
2303*8975f5c5SAndroid Build Coastguard Worker
2304*8975f5c5SAndroid Build Coastguard Worker // read drawing results
2305*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, kWindowSize, kWindowSize, GL_RGBA, GL_UNSIGNED_BYTE,
2306*8975f5c5SAndroid Build Coastguard Worker pixelBufs[i].data());
2307*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2308*8975f5c5SAndroid Build Coastguard Worker }
2309*8975f5c5SAndroid Build Coastguard Worker
2310*8975f5c5SAndroid Build Coastguard Worker // verify something is drawn
2311*8975f5c5SAndroid Build Coastguard Worker static_assert(kRepeat >= 2, "More than one repetition required");
2312*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, kRenderSize> pixelAllBlack{0};
2313*8975f5c5SAndroid Build Coastguard Worker EXPECT_NE(pixelBufs[0], pixelAllBlack);
2314*8975f5c5SAndroid Build Coastguard Worker // verify drawing results are all identical
2315*8975f5c5SAndroid Build Coastguard Worker for (uint32_t i = 1; i < kRepeat; i++)
2316*8975f5c5SAndroid Build Coastguard Worker {
2317*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(pixelBufs[i - 1], pixelBufs[i]);
2318*8975f5c5SAndroid Build Coastguard Worker }
2319*8975f5c5SAndroid Build Coastguard Worker }
2320*8975f5c5SAndroid Build Coastguard Worker
2321*8975f5c5SAndroid Build Coastguard Worker // Handles deleting a Buffer when it's being used.
TEST_P(SimpleStateChangeTest,DeleteBufferInUse)2322*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DeleteBufferInUse)
2323*8975f5c5SAndroid Build Coastguard Worker {
2324*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> colorData(6, GLColor::red);
2325*8975f5c5SAndroid Build Coastguard Worker
2326*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
2327*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, buffer);
2328*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(GLColor) * colorData.size(), colorData.data(),
2329*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2330*8975f5c5SAndroid Build Coastguard Worker
2331*8975f5c5SAndroid Build Coastguard Worker simpleDrawWithBuffer(&buffer);
2332*8975f5c5SAndroid Build Coastguard Worker
2333*8975f5c5SAndroid Build Coastguard Worker buffer.reset();
2334*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2335*8975f5c5SAndroid Build Coastguard Worker }
2336*8975f5c5SAndroid Build Coastguard Worker
2337*8975f5c5SAndroid Build Coastguard Worker // Tests that resizing a Buffer during a draw works as expected.
TEST_P(SimpleStateChangeTest,RedefineBufferInUse)2338*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, RedefineBufferInUse)
2339*8975f5c5SAndroid Build Coastguard Worker {
2340*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> redColorData(6, GLColor::red);
2341*8975f5c5SAndroid Build Coastguard Worker
2342*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
2343*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, buffer);
2344*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(GLColor) * redColorData.size(), redColorData.data(),
2345*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2346*8975f5c5SAndroid Build Coastguard Worker
2347*8975f5c5SAndroid Build Coastguard Worker // Trigger a pull from the buffer.
2348*8975f5c5SAndroid Build Coastguard Worker simpleDrawWithBuffer(&buffer);
2349*8975f5c5SAndroid Build Coastguard Worker
2350*8975f5c5SAndroid Build Coastguard Worker // Redefine the buffer that's in-flight.
2351*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> greenColorData(1024, GLColor::green);
2352*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(GLColor) * greenColorData.size(), greenColorData.data(),
2353*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2354*8975f5c5SAndroid Build Coastguard Worker
2355*8975f5c5SAndroid Build Coastguard Worker // Trigger the flush and verify the first draw worked.
2356*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2357*8975f5c5SAndroid Build Coastguard Worker
2358*8975f5c5SAndroid Build Coastguard Worker // Draw again and verify the new data is correct.
2359*8975f5c5SAndroid Build Coastguard Worker simpleDrawWithBuffer(&buffer);
2360*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2361*8975f5c5SAndroid Build Coastguard Worker }
2362*8975f5c5SAndroid Build Coastguard Worker
2363*8975f5c5SAndroid Build Coastguard Worker // Tests updating a buffer's contents while in use, without redefining it.
TEST_P(SimpleStateChangeTest,UpdateBufferInUse)2364*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, UpdateBufferInUse)
2365*8975f5c5SAndroid Build Coastguard Worker {
2366*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> redColorData(6, GLColor::red);
2367*8975f5c5SAndroid Build Coastguard Worker
2368*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
2369*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, buffer);
2370*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(GLColor) * redColorData.size(), redColorData.data(),
2371*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2372*8975f5c5SAndroid Build Coastguard Worker
2373*8975f5c5SAndroid Build Coastguard Worker // Trigger a pull from the buffer.
2374*8975f5c5SAndroid Build Coastguard Worker simpleDrawWithBuffer(&buffer);
2375*8975f5c5SAndroid Build Coastguard Worker
2376*8975f5c5SAndroid Build Coastguard Worker // Update the buffer that's in-flight.
2377*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> greenColorData(6, GLColor::green);
2378*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLColor) * greenColorData.size(),
2379*8975f5c5SAndroid Build Coastguard Worker greenColorData.data());
2380*8975f5c5SAndroid Build Coastguard Worker
2381*8975f5c5SAndroid Build Coastguard Worker // Trigger the flush and verify the first draw worked.
2382*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2383*8975f5c5SAndroid Build Coastguard Worker
2384*8975f5c5SAndroid Build Coastguard Worker // Draw again and verify the new data is correct.
2385*8975f5c5SAndroid Build Coastguard Worker simpleDrawWithBuffer(&buffer);
2386*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2387*8975f5c5SAndroid Build Coastguard Worker }
2388*8975f5c5SAndroid Build Coastguard Worker
2389*8975f5c5SAndroid Build Coastguard Worker // Tests that deleting an in-flight Texture does not immediately delete the resource.
TEST_P(SimpleStateChangeTest,DeleteTextureInUse)2390*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DeleteTextureInUse)
2391*8975f5c5SAndroid Build Coastguard Worker {
2392*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colors = {
2393*8975f5c5SAndroid Build Coastguard Worker {GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
2394*8975f5c5SAndroid Build Coastguard Worker
2395*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
2396*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
2397*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
2398*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2399*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2400*8975f5c5SAndroid Build Coastguard Worker
2401*8975f5c5SAndroid Build Coastguard Worker draw2DTexturedQuad(0.5f, 1.0f, true);
2402*8975f5c5SAndroid Build Coastguard Worker tex.reset();
2403*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2404*8975f5c5SAndroid Build Coastguard Worker
2405*8975f5c5SAndroid Build Coastguard Worker int w = getWindowWidth() - 2;
2406*8975f5c5SAndroid Build Coastguard Worker int h = getWindowHeight() - 2;
2407*8975f5c5SAndroid Build Coastguard Worker
2408*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2409*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w, 0, GLColor::green);
2410*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, h, GLColor::blue);
2411*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w, h, GLColor::yellow);
2412*8975f5c5SAndroid Build Coastguard Worker }
2413*8975f5c5SAndroid Build Coastguard Worker
2414*8975f5c5SAndroid Build Coastguard Worker // Tests that modifying a texture parameter in-flight does not cause problems.
TEST_P(SimpleStateChangeTest,ChangeTextureFilterModeBetweenTwoDraws)2415*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, ChangeTextureFilterModeBetweenTwoDraws)
2416*8975f5c5SAndroid Build Coastguard Worker {
2417*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colors = {
2418*8975f5c5SAndroid Build Coastguard Worker {GLColor::black, GLColor::white, GLColor::black, GLColor::white}};
2419*8975f5c5SAndroid Build Coastguard Worker
2420*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
2421*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
2422*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
2423*8975f5c5SAndroid Build Coastguard Worker
2424*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
2425*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2426*8975f5c5SAndroid Build Coastguard Worker
2427*8975f5c5SAndroid Build Coastguard Worker // Draw to the left side of the window only with NEAREST.
2428*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, getWindowWidth() / 2, getWindowHeight());
2429*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2430*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2431*8975f5c5SAndroid Build Coastguard Worker draw2DTexturedQuad(0.5f, 1.0f, true);
2432*8975f5c5SAndroid Build Coastguard Worker
2433*8975f5c5SAndroid Build Coastguard Worker // Draw to the right side of the window only with LINEAR.
2434*8975f5c5SAndroid Build Coastguard Worker glViewport(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
2435*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2436*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2437*8975f5c5SAndroid Build Coastguard Worker draw2DTexturedQuad(0.5f, 1.0f, true);
2438*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2439*8975f5c5SAndroid Build Coastguard Worker
2440*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, getWindowWidth(), getWindowHeight());
2441*8975f5c5SAndroid Build Coastguard Worker
2442*8975f5c5SAndroid Build Coastguard Worker // The first half (left) should be only black followed by plain white.
2443*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
2444*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::black);
2445*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ((getWindowWidth() / 2) - 3, 0, GLColor::white);
2446*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ((getWindowWidth() / 2) - 4, 0, GLColor::white);
2447*8975f5c5SAndroid Build Coastguard Worker
2448*8975f5c5SAndroid Build Coastguard Worker // The second half (right) should be a gradient so we shouldn't find plain black/white in the
2449*8975f5c5SAndroid Build Coastguard Worker // middle.
2450*8975f5c5SAndroid Build Coastguard Worker EXPECT_NE(angle::ReadColor((getWindowWidth() / 4) * 3, 0), GLColor::black);
2451*8975f5c5SAndroid Build Coastguard Worker EXPECT_NE(angle::ReadColor((getWindowWidth() / 4) * 3, 0), GLColor::white);
2452*8975f5c5SAndroid Build Coastguard Worker }
2453*8975f5c5SAndroid Build Coastguard Worker
2454*8975f5c5SAndroid Build Coastguard Worker // Tests that bind the same texture all the time between different draw calls.
TEST_P(SimpleStateChangeTest,RebindTextureDrawAgain)2455*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, RebindTextureDrawAgain)
2456*8975f5c5SAndroid Build Coastguard Worker {
2457*8975f5c5SAndroid Build Coastguard Worker GLuint program = get2DTexturedQuadProgram();
2458*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2459*8975f5c5SAndroid Build Coastguard Worker
2460*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colors = {{GLColor::cyan, GLColor::cyan, GLColor::cyan, GLColor::cyan}};
2461*8975f5c5SAndroid Build Coastguard Worker
2462*8975f5c5SAndroid Build Coastguard Worker // Setup the texture
2463*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
2464*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
2465*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
2466*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2467*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2468*8975f5c5SAndroid Build Coastguard Worker
2469*8975f5c5SAndroid Build Coastguard Worker // Setup the vertex array to draw a quad.
2470*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, "position");
2471*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(1.0f, 1.0f);
2472*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
2473*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
2474*8975f5c5SAndroid Build Coastguard Worker
2475*8975f5c5SAndroid Build Coastguard Worker // Draw quad
2476*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
2477*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2478*8975f5c5SAndroid Build Coastguard Worker
2479*8975f5c5SAndroid Build Coastguard Worker // Bind again
2480*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
2481*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2482*8975f5c5SAndroid Build Coastguard Worker
2483*8975f5c5SAndroid Build Coastguard Worker // Draw again, should still work.
2484*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
2485*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2486*8975f5c5SAndroid Build Coastguard Worker
2487*8975f5c5SAndroid Build Coastguard Worker // Validate whole surface is filled with cyan.
2488*8975f5c5SAndroid Build Coastguard Worker int h = getWindowHeight() - 1;
2489*8975f5c5SAndroid Build Coastguard Worker int w = getWindowWidth() - 1;
2490*8975f5c5SAndroid Build Coastguard Worker
2491*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::cyan);
2492*8975f5c5SAndroid Build Coastguard Worker }
2493*8975f5c5SAndroid Build Coastguard Worker
2494*8975f5c5SAndroid Build Coastguard Worker // Tests that we can draw with a texture, modify the texture with a texSubImage, and then draw again
2495*8975f5c5SAndroid Build Coastguard Worker // correctly.
TEST_P(SimpleStateChangeTest,DrawWithTextureTexSubImageThenDrawAgain)2496*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DrawWithTextureTexSubImageThenDrawAgain)
2497*8975f5c5SAndroid Build Coastguard Worker {
2498*8975f5c5SAndroid Build Coastguard Worker GLuint program = get2DTexturedQuadProgram();
2499*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(0u, program);
2500*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2501*8975f5c5SAndroid Build Coastguard Worker
2502*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colors = {{GLColor::red, GLColor::red, GLColor::red, GLColor::red}};
2503*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> subColors = {
2504*8975f5c5SAndroid Build Coastguard Worker {GLColor::green, GLColor::green, GLColor::green, GLColor::green}};
2505*8975f5c5SAndroid Build Coastguard Worker
2506*8975f5c5SAndroid Build Coastguard Worker // Setup the texture
2507*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
2508*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
2509*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
2510*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2511*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2512*8975f5c5SAndroid Build Coastguard Worker
2513*8975f5c5SAndroid Build Coastguard Worker // Setup the vertex array to draw a quad.
2514*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, "position");
2515*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(1.0f, 1.0f);
2516*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
2517*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
2518*8975f5c5SAndroid Build Coastguard Worker
2519*8975f5c5SAndroid Build Coastguard Worker // Draw quad
2520*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
2521*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2522*8975f5c5SAndroid Build Coastguard Worker
2523*8975f5c5SAndroid Build Coastguard Worker // Update bottom-half of texture with green.
2524*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 1, GL_RGBA, GL_UNSIGNED_BYTE, subColors.data());
2525*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2526*8975f5c5SAndroid Build Coastguard Worker
2527*8975f5c5SAndroid Build Coastguard Worker // Draw again, should still work.
2528*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
2529*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2530*8975f5c5SAndroid Build Coastguard Worker
2531*8975f5c5SAndroid Build Coastguard Worker // Validate first half of the screen is red and the bottom is green.
2532*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
2533*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, getWindowHeight() / 4 * 3, GLColor::red);
2534*8975f5c5SAndroid Build Coastguard Worker }
2535*8975f5c5SAndroid Build Coastguard Worker
2536*8975f5c5SAndroid Build Coastguard Worker // Test that we can alternate between textures between different draws.
TEST_P(SimpleStateChangeTest,DrawTextureAThenTextureBThenTextureA)2537*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DrawTextureAThenTextureBThenTextureA)
2538*8975f5c5SAndroid Build Coastguard Worker {
2539*8975f5c5SAndroid Build Coastguard Worker GLuint program = get2DTexturedQuadProgram();
2540*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2541*8975f5c5SAndroid Build Coastguard Worker
2542*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colorsTex1 = {
2543*8975f5c5SAndroid Build Coastguard Worker {GLColor::cyan, GLColor::cyan, GLColor::cyan, GLColor::cyan}};
2544*8975f5c5SAndroid Build Coastguard Worker
2545*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colorsTex2 = {
2546*8975f5c5SAndroid Build Coastguard Worker {GLColor::magenta, GLColor::magenta, GLColor::magenta, GLColor::magenta}};
2547*8975f5c5SAndroid Build Coastguard Worker
2548*8975f5c5SAndroid Build Coastguard Worker // Setup the texture
2549*8975f5c5SAndroid Build Coastguard Worker GLTexture tex1;
2550*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex1);
2551*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colorsTex1.data());
2552*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2553*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2554*8975f5c5SAndroid Build Coastguard Worker
2555*8975f5c5SAndroid Build Coastguard Worker GLTexture tex2;
2556*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex2);
2557*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colorsTex2.data());
2558*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2559*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2560*8975f5c5SAndroid Build Coastguard Worker
2561*8975f5c5SAndroid Build Coastguard Worker // Setup the vertex array to draw a quad.
2562*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, "position");
2563*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(1.0f, 1.0f);
2564*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
2565*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
2566*8975f5c5SAndroid Build Coastguard Worker
2567*8975f5c5SAndroid Build Coastguard Worker // Draw quad
2568*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex1);
2569*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
2570*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2571*8975f5c5SAndroid Build Coastguard Worker
2572*8975f5c5SAndroid Build Coastguard Worker // Bind again, draw again
2573*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex2);
2574*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
2575*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2576*8975f5c5SAndroid Build Coastguard Worker
2577*8975f5c5SAndroid Build Coastguard Worker // Bind again, draw again
2578*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex1);
2579*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
2580*8975f5c5SAndroid Build Coastguard Worker
2581*8975f5c5SAndroid Build Coastguard Worker // Validate whole surface is filled with cyan.
2582*8975f5c5SAndroid Build Coastguard Worker int h = getWindowHeight() - 1;
2583*8975f5c5SAndroid Build Coastguard Worker int w = getWindowWidth() - 1;
2584*8975f5c5SAndroid Build Coastguard Worker
2585*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::cyan);
2586*8975f5c5SAndroid Build Coastguard Worker }
2587*8975f5c5SAndroid Build Coastguard Worker
2588*8975f5c5SAndroid Build Coastguard Worker // Tests that redefining an in-flight Texture does not affect the in-flight resource.
TEST_P(SimpleStateChangeTest,RedefineTextureInUse)2589*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, RedefineTextureInUse)
2590*8975f5c5SAndroid Build Coastguard Worker {
2591*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colors = {
2592*8975f5c5SAndroid Build Coastguard Worker {GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
2593*8975f5c5SAndroid Build Coastguard Worker
2594*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
2595*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
2596*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
2597*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2598*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2599*8975f5c5SAndroid Build Coastguard Worker
2600*8975f5c5SAndroid Build Coastguard Worker // Draw with the first texture.
2601*8975f5c5SAndroid Build Coastguard Worker draw2DTexturedQuad(0.5f, 1.0f, true);
2602*8975f5c5SAndroid Build Coastguard Worker
2603*8975f5c5SAndroid Build Coastguard Worker // Redefine the in-flight texture.
2604*8975f5c5SAndroid Build Coastguard Worker constexpr int kBigSize = 32;
2605*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> bigColors;
2606*8975f5c5SAndroid Build Coastguard Worker for (int y = 0; y < kBigSize; ++y)
2607*8975f5c5SAndroid Build Coastguard Worker {
2608*8975f5c5SAndroid Build Coastguard Worker for (int x = 0; x < kBigSize; ++x)
2609*8975f5c5SAndroid Build Coastguard Worker {
2610*8975f5c5SAndroid Build Coastguard Worker bool xComp = x < kBigSize / 2;
2611*8975f5c5SAndroid Build Coastguard Worker bool yComp = y < kBigSize / 2;
2612*8975f5c5SAndroid Build Coastguard Worker if (yComp)
2613*8975f5c5SAndroid Build Coastguard Worker {
2614*8975f5c5SAndroid Build Coastguard Worker bigColors.push_back(xComp ? GLColor::cyan : GLColor::magenta);
2615*8975f5c5SAndroid Build Coastguard Worker }
2616*8975f5c5SAndroid Build Coastguard Worker else
2617*8975f5c5SAndroid Build Coastguard Worker {
2618*8975f5c5SAndroid Build Coastguard Worker bigColors.push_back(xComp ? GLColor::yellow : GLColor::white);
2619*8975f5c5SAndroid Build Coastguard Worker }
2620*8975f5c5SAndroid Build Coastguard Worker }
2621*8975f5c5SAndroid Build Coastguard Worker }
2622*8975f5c5SAndroid Build Coastguard Worker
2623*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, bigColors.data());
2624*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2625*8975f5c5SAndroid Build Coastguard Worker
2626*8975f5c5SAndroid Build Coastguard Worker // Verify the first draw had the correct data via ReadPixels.
2627*8975f5c5SAndroid Build Coastguard Worker int w = getWindowWidth() - 2;
2628*8975f5c5SAndroid Build Coastguard Worker int h = getWindowHeight() - 2;
2629*8975f5c5SAndroid Build Coastguard Worker
2630*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2631*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w, 0, GLColor::green);
2632*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, h, GLColor::blue);
2633*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w, h, GLColor::yellow);
2634*8975f5c5SAndroid Build Coastguard Worker
2635*8975f5c5SAndroid Build Coastguard Worker // Draw and verify with the redefined data.
2636*8975f5c5SAndroid Build Coastguard Worker draw2DTexturedQuad(0.5f, 1.0f, true);
2637*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2638*8975f5c5SAndroid Build Coastguard Worker
2639*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
2640*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w, 0, GLColor::magenta);
2641*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, h, GLColor::yellow);
2642*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w, h, GLColor::white);
2643*8975f5c5SAndroid Build Coastguard Worker }
2644*8975f5c5SAndroid Build Coastguard Worker
2645*8975f5c5SAndroid Build Coastguard Worker // Test updating a Texture's contents while in use by GL works as expected.
TEST_P(SimpleStateChangeTest,UpdateTextureInUse)2646*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, UpdateTextureInUse)
2647*8975f5c5SAndroid Build Coastguard Worker {
2648*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> rgby = {{GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
2649*8975f5c5SAndroid Build Coastguard Worker
2650*8975f5c5SAndroid Build Coastguard Worker // Set up 2D quad resources.
2651*8975f5c5SAndroid Build Coastguard Worker GLuint program = get2DTexturedQuadProgram();
2652*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2653*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0, glGetAttribLocation(program, "position"));
2654*8975f5c5SAndroid Build Coastguard Worker
2655*8975f5c5SAndroid Build Coastguard Worker const auto &quadVerts = GetQuadVertices();
2656*8975f5c5SAndroid Build Coastguard Worker
2657*8975f5c5SAndroid Build Coastguard Worker GLBuffer vbo;
2658*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vbo);
2659*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, quadVerts.size() * sizeof(quadVerts[0]), quadVerts.data(),
2660*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
2661*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
2662*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(0);
2663*8975f5c5SAndroid Build Coastguard Worker
2664*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
2665*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
2666*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgby.data());
2667*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2668*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2669*8975f5c5SAndroid Build Coastguard Worker
2670*8975f5c5SAndroid Build Coastguard Worker // Draw RGBY to the Framebuffer. The texture is now in-use by GL.
2671*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth() - 2;
2672*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight() - 2;
2673*8975f5c5SAndroid Build Coastguard Worker const int w2 = w >> 1;
2674*8975f5c5SAndroid Build Coastguard Worker
2675*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, w2, h);
2676*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
2677*8975f5c5SAndroid Build Coastguard Worker
2678*8975f5c5SAndroid Build Coastguard Worker // Update the texture to be YBGR, while the Texture is in-use. Should not affect the draw.
2679*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> ybgr = {{GLColor::yellow, GLColor::blue, GLColor::green, GLColor::red}};
2680*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, ybgr.data());
2681*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2682*8975f5c5SAndroid Build Coastguard Worker
2683*8975f5c5SAndroid Build Coastguard Worker // Draw again to the Framebuffer. The second draw call should use the updated YBGR data.
2684*8975f5c5SAndroid Build Coastguard Worker glViewport(w2, 0, w2, h);
2685*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
2686*8975f5c5SAndroid Build Coastguard Worker
2687*8975f5c5SAndroid Build Coastguard Worker // Check the Framebuffer. Both draws should have completed.
2688*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2689*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w2 - 1, 0, GLColor::green);
2690*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, h - 1, GLColor::blue);
2691*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w2 - 1, h - 1, GLColor::yellow);
2692*8975f5c5SAndroid Build Coastguard Worker
2693*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w2 + 1, 0, GLColor::yellow);
2694*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w - 1, 0, GLColor::blue);
2695*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w2 + 1, h - 1, GLColor::green);
2696*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w - 1, h - 1, GLColor::red);
2697*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2698*8975f5c5SAndroid Build Coastguard Worker }
2699*8975f5c5SAndroid Build Coastguard Worker
updateTextureBoundToFramebufferHelper(UpdateFunc updateFunc)2700*8975f5c5SAndroid Build Coastguard Worker void SimpleStateChangeTest::updateTextureBoundToFramebufferHelper(UpdateFunc updateFunc)
2701*8975f5c5SAndroid Build Coastguard Worker {
2702*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
2703*8975f5c5SAndroid Build Coastguard Worker
2704*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> red(4, GLColor::red);
2705*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> green(4, GLColor::green);
2706*8975f5c5SAndroid Build Coastguard Worker
2707*8975f5c5SAndroid Build Coastguard Worker GLTexture renderTarget;
2708*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, renderTarget);
2709*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, red.data());
2710*8975f5c5SAndroid Build Coastguard Worker
2711*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
2712*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
2713*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTarget,
2714*8975f5c5SAndroid Build Coastguard Worker 0);
2715*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2716*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, 2, 2);
2717*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2718*8975f5c5SAndroid Build Coastguard Worker
2719*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
2720*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
2721*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, red.data());
2722*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2723*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2724*8975f5c5SAndroid Build Coastguard Worker
2725*8975f5c5SAndroid Build Coastguard Worker // Draw once to flush dirty state bits.
2726*8975f5c5SAndroid Build Coastguard Worker draw2DTexturedQuad(0.5f, 1.0f, true);
2727*8975f5c5SAndroid Build Coastguard Worker
2728*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2729*8975f5c5SAndroid Build Coastguard Worker
2730*8975f5c5SAndroid Build Coastguard Worker // Update the (0, 1) pixel to be blue
2731*8975f5c5SAndroid Build Coastguard Worker updateFunc(GL_TEXTURE_2D, &renderTarget, 0, 1, GLColor::blue);
2732*8975f5c5SAndroid Build Coastguard Worker
2733*8975f5c5SAndroid Build Coastguard Worker // Draw green to the right half of the Framebuffer.
2734*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
2735*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, green.data());
2736*8975f5c5SAndroid Build Coastguard Worker glViewport(1, 0, 1, 2);
2737*8975f5c5SAndroid Build Coastguard Worker draw2DTexturedQuad(0.5f, 1.0f, true);
2738*8975f5c5SAndroid Build Coastguard Worker
2739*8975f5c5SAndroid Build Coastguard Worker // Update the (1, 1) pixel to be yellow
2740*8975f5c5SAndroid Build Coastguard Worker updateFunc(GL_TEXTURE_2D, &renderTarget, 1, 1, GLColor::yellow);
2741*8975f5c5SAndroid Build Coastguard Worker
2742*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2743*8975f5c5SAndroid Build Coastguard Worker
2744*8975f5c5SAndroid Build Coastguard Worker // Verify we have a quad with the right colors in the FBO.
2745*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> expected = {
2746*8975f5c5SAndroid Build Coastguard Worker {GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
2747*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> actual(4);
2748*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
2749*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, actual.data());
2750*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expected, actual);
2751*8975f5c5SAndroid Build Coastguard Worker }
2752*8975f5c5SAndroid Build Coastguard Worker
2753*8975f5c5SAndroid Build Coastguard Worker // Tests that TexSubImage updates are flushed before rendering.
TEST_P(SimpleStateChangeTest,TexSubImageOnTextureBoundToFrambuffer)2754*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, TexSubImageOnTextureBoundToFrambuffer)
2755*8975f5c5SAndroid Build Coastguard Worker {
2756*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40096654
2757*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
2758*8975f5c5SAndroid Build Coastguard Worker auto updateFunc = [](GLenum textureBinding, GLTexture *tex, GLint x, GLint y,
2759*8975f5c5SAndroid Build Coastguard Worker const GLColor &color) {
2760*8975f5c5SAndroid Build Coastguard Worker glBindTexture(textureBinding, *tex);
2761*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(textureBinding, 0, x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, color.data());
2762*8975f5c5SAndroid Build Coastguard Worker };
2763*8975f5c5SAndroid Build Coastguard Worker
2764*8975f5c5SAndroid Build Coastguard Worker updateTextureBoundToFramebufferHelper(updateFunc);
2765*8975f5c5SAndroid Build Coastguard Worker }
2766*8975f5c5SAndroid Build Coastguard Worker
2767*8975f5c5SAndroid Build Coastguard Worker // Tests that CopyTexSubImage updates are flushed before rendering.
TEST_P(SimpleStateChangeTest,CopyTexSubImageOnTextureBoundToFrambuffer)2768*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, CopyTexSubImageOnTextureBoundToFrambuffer)
2769*8975f5c5SAndroid Build Coastguard Worker {
2770*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit"));
2771*8975f5c5SAndroid Build Coastguard Worker
2772*8975f5c5SAndroid Build Coastguard Worker GLTexture copySource;
2773*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, copySource);
2774*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2775*8975f5c5SAndroid Build Coastguard Worker
2776*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer copyFBO;
2777*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, copyFBO);
2778*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, copySource, 0);
2779*8975f5c5SAndroid Build Coastguard Worker
2780*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2781*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
2782*8975f5c5SAndroid Build Coastguard Worker
2783*8975f5c5SAndroid Build Coastguard Worker auto updateFunc = [©Source](GLenum textureBinding, GLTexture *tex, GLint x, GLint y,
2784*8975f5c5SAndroid Build Coastguard Worker const GLColor &color) {
2785*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, copySource);
2786*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, color.data());
2787*8975f5c5SAndroid Build Coastguard Worker
2788*8975f5c5SAndroid Build Coastguard Worker glBindTexture(textureBinding, *tex);
2789*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage2D(textureBinding, 0, x, y, 0, 0, 1, 1);
2790*8975f5c5SAndroid Build Coastguard Worker };
2791*8975f5c5SAndroid Build Coastguard Worker
2792*8975f5c5SAndroid Build Coastguard Worker updateTextureBoundToFramebufferHelper(updateFunc);
2793*8975f5c5SAndroid Build Coastguard Worker }
2794*8975f5c5SAndroid Build Coastguard Worker
2795*8975f5c5SAndroid Build Coastguard Worker // Tests that the read framebuffer doesn't affect what the draw call thinks the attachments are
2796*8975f5c5SAndroid Build Coastguard Worker // (which is what the draw framebuffer dictates) when a command is issued with the GL_FRAMEBUFFER
2797*8975f5c5SAndroid Build Coastguard Worker // target.
TEST_P(SimpleStateChangeTestES3,ReadFramebufferDrawFramebufferDifferentAttachments)2798*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, ReadFramebufferDrawFramebufferDifferentAttachments)
2799*8975f5c5SAndroid Build Coastguard Worker {
2800*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40096654
2801*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
2802*8975f5c5SAndroid Build Coastguard Worker
2803*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer drawColorBuffer;
2804*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, drawColorBuffer);
2805*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
2806*8975f5c5SAndroid Build Coastguard Worker
2807*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer drawDepthBuffer;
2808*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, drawDepthBuffer);
2809*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 1, 1);
2810*8975f5c5SAndroid Build Coastguard Worker
2811*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer readColorBuffer;
2812*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, readColorBuffer);
2813*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
2814*8975f5c5SAndroid Build Coastguard Worker
2815*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
2816*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
2817*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
2818*8975f5c5SAndroid Build Coastguard Worker drawColorBuffer);
2819*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
2820*8975f5c5SAndroid Build Coastguard Worker drawDepthBuffer);
2821*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2822*8975f5c5SAndroid Build Coastguard Worker
2823*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer readFBO;
2824*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, readFBO);
2825*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
2826*8975f5c5SAndroid Build Coastguard Worker readColorBuffer);
2827*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
2828*8975f5c5SAndroid Build Coastguard Worker
2829*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2830*8975f5c5SAndroid Build Coastguard Worker
2831*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(1.0f);
2832*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
2833*8975f5c5SAndroid Build Coastguard Worker
2834*8975f5c5SAndroid Build Coastguard Worker // A handful of non-draw calls can sync framebuffer state, such as discard, invalidate,
2835*8975f5c5SAndroid Build Coastguard Worker // invalidateSub and multisamplefv.
2836*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachment = GL_COLOR_ATTACHMENT0;
2837*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, &invalidateAttachment);
2838*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2839*8975f5c5SAndroid Build Coastguard Worker
2840*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
2841*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_EQUAL);
2842*8975f5c5SAndroid Build Coastguard Worker
2843*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
2844*8975f5c5SAndroid Build Coastguard Worker
2845*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 1.0f);
2846*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2847*8975f5c5SAndroid Build Coastguard Worker
2848*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO);
2849*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
2850*8975f5c5SAndroid Build Coastguard Worker }
2851*8975f5c5SAndroid Build Coastguard Worker
2852*8975f5c5SAndroid Build Coastguard Worker // Tests that invalidate then copy then blend works.
TEST_P(SimpleStateChangeTestES3,InvalidateThenCopyThenBlend)2853*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, InvalidateThenCopyThenBlend)
2854*8975f5c5SAndroid Build Coastguard Worker {
2855*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer as the source of copy
2856*8975f5c5SAndroid Build Coastguard Worker const GLColor kSrcData = GLColor::cyan;
2857*8975f5c5SAndroid Build Coastguard Worker GLTexture copySrc;
2858*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, copySrc);
2859*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &kSrcData);
2860*8975f5c5SAndroid Build Coastguard Worker
2861*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer readFBO;
2862*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, readFBO);
2863*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, copySrc, 0);
2864*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
2865*8975f5c5SAndroid Build Coastguard Worker
2866*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer that will be invalidated
2867*8975f5c5SAndroid Build Coastguard Worker GLTexture renderTarget;
2868*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, renderTarget);
2869*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2870*8975f5c5SAndroid Build Coastguard Worker
2871*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
2872*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
2873*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTarget,
2874*8975f5c5SAndroid Build Coastguard Worker 0);
2875*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2876*8975f5c5SAndroid Build Coastguard Worker
2877*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2878*8975f5c5SAndroid Build Coastguard Worker
2879*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer and invalidate it.
2880*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
2881*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2882*8975f5c5SAndroid Build Coastguard Worker
2883*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachment = GL_COLOR_ATTACHMENT0;
2884*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, &invalidateAttachment);
2885*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2886*8975f5c5SAndroid Build Coastguard Worker
2887*8975f5c5SAndroid Build Coastguard Worker // Copy into the framebuffer's texture. The framebuffer should now be cyan.
2888*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
2889*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2890*8975f5c5SAndroid Build Coastguard Worker
2891*8975f5c5SAndroid Build Coastguard Worker // Blend into the framebuffer, then verify that the framebuffer should have had cyan.
2892*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO);
2893*8975f5c5SAndroid Build Coastguard Worker blendAndVerifyColor(GLColor32F(1.0f, 0.0f, 0.0f, 0.5f), GLColor(127, 127, 127, 191));
2894*8975f5c5SAndroid Build Coastguard Worker }
2895*8975f5c5SAndroid Build Coastguard Worker
2896*8975f5c5SAndroid Build Coastguard Worker // Tests that invalidate then blit then blend works.
TEST_P(SimpleStateChangeTestES3,InvalidateThenBlitThenBlend)2897*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, InvalidateThenBlitThenBlend)
2898*8975f5c5SAndroid Build Coastguard Worker {
2899*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer as the source of blit
2900*8975f5c5SAndroid Build Coastguard Worker const GLColor kSrcData = GLColor::cyan;
2901*8975f5c5SAndroid Build Coastguard Worker GLTexture blitSrc;
2902*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, blitSrc);
2903*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &kSrcData);
2904*8975f5c5SAndroid Build Coastguard Worker
2905*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer readFBO;
2906*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, readFBO);
2907*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, blitSrc, 0);
2908*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
2909*8975f5c5SAndroid Build Coastguard Worker
2910*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer that will be invalidated
2911*8975f5c5SAndroid Build Coastguard Worker GLTexture renderTarget;
2912*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, renderTarget);
2913*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2914*8975f5c5SAndroid Build Coastguard Worker
2915*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
2916*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
2917*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTarget,
2918*8975f5c5SAndroid Build Coastguard Worker 0);
2919*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2920*8975f5c5SAndroid Build Coastguard Worker
2921*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2922*8975f5c5SAndroid Build Coastguard Worker
2923*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer and invalidate it.
2924*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
2925*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2926*8975f5c5SAndroid Build Coastguard Worker
2927*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachment = GL_COLOR_ATTACHMENT0;
2928*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, &invalidateAttachment);
2929*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2930*8975f5c5SAndroid Build Coastguard Worker
2931*8975f5c5SAndroid Build Coastguard Worker // Blit into the framebuffer. The framebuffer should now be cyan.
2932*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2933*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2934*8975f5c5SAndroid Build Coastguard Worker
2935*8975f5c5SAndroid Build Coastguard Worker // Blend into the framebuffer, then verify that the framebuffer should have had cyan.
2936*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO);
2937*8975f5c5SAndroid Build Coastguard Worker blendAndVerifyColor(GLColor32F(1.0f, 0.0f, 0.0f, 0.5f), GLColor(127, 127, 127, 191));
2938*8975f5c5SAndroid Build Coastguard Worker }
2939*8975f5c5SAndroid Build Coastguard Worker
2940*8975f5c5SAndroid Build Coastguard Worker // Tests that invalidate then generate mipmaps works
TEST_P(SimpleStateChangeTestES3,InvalidateThenGenerateMipmapsThenBlend)2941*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, InvalidateThenGenerateMipmapsThenBlend)
2942*8975f5c5SAndroid Build Coastguard Worker {
2943*8975f5c5SAndroid Build Coastguard Worker // Create a texture on which generate mipmaps would be called
2944*8975f5c5SAndroid Build Coastguard Worker const GLColor kMip0Data[4] = {GLColor::cyan, GLColor::cyan, GLColor::cyan, GLColor::cyan};
2945*8975f5c5SAndroid Build Coastguard Worker const GLColor kMip1Data = GLColor::blue;
2946*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2947*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2948*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, kMip0Data);
2949*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &kMip1Data);
2950*8975f5c5SAndroid Build Coastguard Worker
2951*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer that will be invalidated
2952*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
2953*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
2954*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 1);
2955*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2956*8975f5c5SAndroid Build Coastguard Worker
2957*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2958*8975f5c5SAndroid Build Coastguard Worker
2959*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer and invalidate it.
2960*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
2961*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2962*8975f5c5SAndroid Build Coastguard Worker
2963*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachment = GL_COLOR_ATTACHMENT0;
2964*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, &invalidateAttachment);
2965*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2966*8975f5c5SAndroid Build Coastguard Worker
2967*8975f5c5SAndroid Build Coastguard Worker // Generate mipmaps
2968*8975f5c5SAndroid Build Coastguard Worker glGenerateMipmap(GL_TEXTURE_2D);
2969*8975f5c5SAndroid Build Coastguard Worker
2970*8975f5c5SAndroid Build Coastguard Worker // Blend into the framebuffer, then verify that the framebuffer should have had cyan.
2971*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO);
2972*8975f5c5SAndroid Build Coastguard Worker blendAndVerifyColor(GLColor32F(1.0f, 0.0f, 0.0f, 0.5f), GLColor(127, 127, 127, 191));
2973*8975f5c5SAndroid Build Coastguard Worker }
2974*8975f5c5SAndroid Build Coastguard Worker
2975*8975f5c5SAndroid Build Coastguard Worker // Tests that invalidate then upload works
TEST_P(SimpleStateChangeTestES3,InvalidateThenUploadThenBlend)2976*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, InvalidateThenUploadThenBlend)
2977*8975f5c5SAndroid Build Coastguard Worker {
2978*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263445
2979*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
2980*8975f5c5SAndroid Build Coastguard Worker
2981*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer that will be invalidated
2982*8975f5c5SAndroid Build Coastguard Worker GLTexture renderTarget;
2983*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, renderTarget);
2984*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2985*8975f5c5SAndroid Build Coastguard Worker
2986*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
2987*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
2988*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTarget,
2989*8975f5c5SAndroid Build Coastguard Worker 0);
2990*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
2991*8975f5c5SAndroid Build Coastguard Worker
2992*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2993*8975f5c5SAndroid Build Coastguard Worker
2994*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer and invalidate it.
2995*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
2996*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
2997*8975f5c5SAndroid Build Coastguard Worker
2998*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachment = GL_COLOR_ATTACHMENT0;
2999*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, &invalidateAttachment);
3000*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3001*8975f5c5SAndroid Build Coastguard Worker
3002*8975f5c5SAndroid Build Coastguard Worker // Upload data to it
3003*8975f5c5SAndroid Build Coastguard Worker const GLColor kUploadColor = GLColor::cyan;
3004*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &kUploadColor);
3005*8975f5c5SAndroid Build Coastguard Worker
3006*8975f5c5SAndroid Build Coastguard Worker // Blend into the framebuffer, then verify that the framebuffer should have had cyan.
3007*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO);
3008*8975f5c5SAndroid Build Coastguard Worker blendAndVerifyColor(GLColor32F(1.0f, 0.0f, 0.0f, 0.5f), GLColor(127, 127, 127, 191));
3009*8975f5c5SAndroid Build Coastguard Worker }
3010*8975f5c5SAndroid Build Coastguard Worker
3011*8975f5c5SAndroid Build Coastguard Worker // Tests that invalidate then sub upload works
TEST_P(SimpleStateChangeTestES3,InvalidateThenSubUploadThenBlend)3012*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, InvalidateThenSubUploadThenBlend)
3013*8975f5c5SAndroid Build Coastguard Worker {
3014*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263445
3015*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
3016*8975f5c5SAndroid Build Coastguard Worker
3017*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer that will be invalidated
3018*8975f5c5SAndroid Build Coastguard Worker GLTexture renderTarget;
3019*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, renderTarget);
3020*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3021*8975f5c5SAndroid Build Coastguard Worker
3022*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
3023*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
3024*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTarget,
3025*8975f5c5SAndroid Build Coastguard Worker 0);
3026*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
3027*8975f5c5SAndroid Build Coastguard Worker
3028*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3029*8975f5c5SAndroid Build Coastguard Worker
3030*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer and invalidate it.
3031*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
3032*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3033*8975f5c5SAndroid Build Coastguard Worker
3034*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachment = GL_COLOR_ATTACHMENT0;
3035*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, &invalidateAttachment);
3036*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3037*8975f5c5SAndroid Build Coastguard Worker
3038*8975f5c5SAndroid Build Coastguard Worker // Upload data to it
3039*8975f5c5SAndroid Build Coastguard Worker const GLColor kUploadColor = GLColor::cyan;
3040*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &kUploadColor);
3041*8975f5c5SAndroid Build Coastguard Worker
3042*8975f5c5SAndroid Build Coastguard Worker // Blend into the framebuffer, then verify that the framebuffer should have had cyan.
3043*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO);
3044*8975f5c5SAndroid Build Coastguard Worker blendAndVerifyColor(GLColor32F(1.0f, 0.0f, 0.0f, 0.5f), GLColor(127, 127, 127, 191));
3045*8975f5c5SAndroid Build Coastguard Worker }
3046*8975f5c5SAndroid Build Coastguard Worker
3047*8975f5c5SAndroid Build Coastguard Worker // Tests that invalidate then compute write works
TEST_P(SimpleStateChangeTestES31,InvalidateThenStorageWriteThenBlend)3048*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, InvalidateThenStorageWriteThenBlend)
3049*8975f5c5SAndroid Build Coastguard Worker {
3050*8975f5c5SAndroid Build Coastguard Worker // Fails on AMD OpenGL Windows. This configuration isn't maintained.
3051*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsOpenGL());
3052*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263927
3053*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
3054*8975f5c5SAndroid Build Coastguard Worker
3055*8975f5c5SAndroid Build Coastguard Worker constexpr char kCS[] = R"(#version 310 es
3056*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=1, local_size_y=1) in;
3057*8975f5c5SAndroid Build Coastguard Worker layout (rgba8, binding = 1) writeonly uniform highp image2D dstImage;
3058*8975f5c5SAndroid Build Coastguard Worker void main()
3059*8975f5c5SAndroid Build Coastguard Worker {
3060*8975f5c5SAndroid Build Coastguard Worker imageStore(dstImage, ivec2(gl_GlobalInvocationID.xy), vec4(0.0f, 1.0f, 1.0f, 1.0f));
3061*8975f5c5SAndroid Build Coastguard Worker })";
3062*8975f5c5SAndroid Build Coastguard Worker
3063*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_COMPUTE_PROGRAM(program, kCS);
3064*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
3065*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3066*8975f5c5SAndroid Build Coastguard Worker
3067*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer texture
3068*8975f5c5SAndroid Build Coastguard Worker GLTexture renderTarget;
3069*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, renderTarget);
3070*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
3071*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(1, renderTarget, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);
3072*8975f5c5SAndroid Build Coastguard Worker
3073*8975f5c5SAndroid Build Coastguard Worker // Write to the texture with compute once. In the Vulkan backend, this will make sure the image
3074*8975f5c5SAndroid Build Coastguard Worker // is already created with STORAGE usage and avoids recreate later.
3075*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
3076*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3077*8975f5c5SAndroid Build Coastguard Worker
3078*8975f5c5SAndroid Build Coastguard Worker // Needs explicit barrier between compute shader write to FBO access.
3079*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
3080*8975f5c5SAndroid Build Coastguard Worker
3081*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer that will be invalidated
3082*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
3083*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
3084*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTarget,
3085*8975f5c5SAndroid Build Coastguard Worker 0);
3086*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
3087*8975f5c5SAndroid Build Coastguard Worker
3088*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3089*8975f5c5SAndroid Build Coastguard Worker
3090*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer and invalidate it.
3091*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
3092*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3093*8975f5c5SAndroid Build Coastguard Worker
3094*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachment = GL_COLOR_ATTACHMENT0;
3095*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, &invalidateAttachment);
3096*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3097*8975f5c5SAndroid Build Coastguard Worker
3098*8975f5c5SAndroid Build Coastguard Worker // Issue a memory barrier before writing to the image again.
3099*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
3100*8975f5c5SAndroid Build Coastguard Worker
3101*8975f5c5SAndroid Build Coastguard Worker // Write to it with a compute shader
3102*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
3103*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3104*8975f5c5SAndroid Build Coastguard Worker
3105*8975f5c5SAndroid Build Coastguard Worker // Needs explicit barrier between compute shader write to FBO access.
3106*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
3107*8975f5c5SAndroid Build Coastguard Worker
3108*8975f5c5SAndroid Build Coastguard Worker // Blend into the framebuffer, then verify that the framebuffer should have had cyan.
3109*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO);
3110*8975f5c5SAndroid Build Coastguard Worker blendAndVerifyColor(GLColor32F(1.0f, 0.0f, 0.0f, 0.5f), GLColor(127, 127, 127, 191));
3111*8975f5c5SAndroid Build Coastguard Worker }
3112*8975f5c5SAndroid Build Coastguard Worker
3113*8975f5c5SAndroid Build Coastguard Worker // Tests that invalidate then compute write works inside PPO
TEST_P(SimpleStateChangeTestES31,InvalidateThenStorageWriteThenBlendPpo)3114*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, InvalidateThenStorageWriteThenBlendPpo)
3115*8975f5c5SAndroid Build Coastguard Worker {
3116*8975f5c5SAndroid Build Coastguard Worker // Fails on AMD OpenGL Windows. This configuration isn't maintained.
3117*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsOpenGL());
3118*8975f5c5SAndroid Build Coastguard Worker // PPOs are only supported in the Vulkan backend
3119*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!isVulkanRenderer());
3120*8975f5c5SAndroid Build Coastguard Worker
3121*8975f5c5SAndroid Build Coastguard Worker constexpr char kCS[] = R"(#version 310 es
3122*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=1, local_size_y=1) in;
3123*8975f5c5SAndroid Build Coastguard Worker layout (rgba8, binding = 1) writeonly uniform highp image2D dstImage;
3124*8975f5c5SAndroid Build Coastguard Worker void main()
3125*8975f5c5SAndroid Build Coastguard Worker {
3126*8975f5c5SAndroid Build Coastguard Worker imageStore(dstImage, ivec2(gl_GlobalInvocationID.xy), vec4(0.0f, 1.0f, 1.0f, 1.0f));
3127*8975f5c5SAndroid Build Coastguard Worker })";
3128*8975f5c5SAndroid Build Coastguard Worker
3129*8975f5c5SAndroid Build Coastguard Worker GLProgramPipeline pipeline;
3130*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_COMPUTE_PROGRAM(program, kCS);
3131*8975f5c5SAndroid Build Coastguard Worker glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
3132*8975f5c5SAndroid Build Coastguard Worker glUseProgramStages(pipeline, GL_COMPUTE_SHADER_BIT, program);
3133*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3134*8975f5c5SAndroid Build Coastguard Worker glBindProgramPipeline(pipeline);
3135*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3136*8975f5c5SAndroid Build Coastguard Worker glUseProgram(0);
3137*8975f5c5SAndroid Build Coastguard Worker
3138*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer texture
3139*8975f5c5SAndroid Build Coastguard Worker GLTexture renderTarget;
3140*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, renderTarget);
3141*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
3142*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(1, renderTarget, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);
3143*8975f5c5SAndroid Build Coastguard Worker
3144*8975f5c5SAndroid Build Coastguard Worker // Write to the texture with compute once. In the Vulkan backend, this will make sure the image
3145*8975f5c5SAndroid Build Coastguard Worker // is already created with STORAGE usage and avoids recreate later.
3146*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
3147*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3148*8975f5c5SAndroid Build Coastguard Worker
3149*8975f5c5SAndroid Build Coastguard Worker // Needs explicit barrier between compute shader write to FBO access.
3150*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
3151*8975f5c5SAndroid Build Coastguard Worker
3152*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer that will be invalidated
3153*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
3154*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
3155*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTarget,
3156*8975f5c5SAndroid Build Coastguard Worker 0);
3157*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
3158*8975f5c5SAndroid Build Coastguard Worker
3159*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3160*8975f5c5SAndroid Build Coastguard Worker
3161*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer and invalidate it.
3162*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
3163*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3164*8975f5c5SAndroid Build Coastguard Worker
3165*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachment = GL_COLOR_ATTACHMENT0;
3166*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, &invalidateAttachment);
3167*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3168*8975f5c5SAndroid Build Coastguard Worker
3169*8975f5c5SAndroid Build Coastguard Worker // Issue a memory barrier before writing to the image again.
3170*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
3171*8975f5c5SAndroid Build Coastguard Worker
3172*8975f5c5SAndroid Build Coastguard Worker // Write to it with a compute shader
3173*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
3174*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3175*8975f5c5SAndroid Build Coastguard Worker
3176*8975f5c5SAndroid Build Coastguard Worker // Needs explicit barrier between compute shader write to FBO access.
3177*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
3178*8975f5c5SAndroid Build Coastguard Worker
3179*8975f5c5SAndroid Build Coastguard Worker // Blend into the framebuffer, then verify that the framebuffer should have had cyan.
3180*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO);
3181*8975f5c5SAndroid Build Coastguard Worker blendAndVerifyColor(GLColor32F(1.0f, 0.0f, 0.0f, 0.5f), GLColor(127, 127, 127, 191));
3182*8975f5c5SAndroid Build Coastguard Worker }
3183*8975f5c5SAndroid Build Coastguard Worker
3184*8975f5c5SAndroid Build Coastguard Worker // Tests that sub-invalidate then draw works.
TEST_P(SimpleStateChangeTestES3,SubInvalidateThenDraw)3185*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, SubInvalidateThenDraw)
3186*8975f5c5SAndroid Build Coastguard Worker {
3187*8975f5c5SAndroid Build Coastguard Worker // Fails on AMD OpenGL Windows. This configuration isn't maintained.
3188*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsOpenGL());
3189*8975f5c5SAndroid Build Coastguard Worker
3190*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer that will be invalidated
3191*8975f5c5SAndroid Build Coastguard Worker GLTexture renderTarget;
3192*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, renderTarget);
3193*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3194*8975f5c5SAndroid Build Coastguard Worker
3195*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
3196*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
3197*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTarget,
3198*8975f5c5SAndroid Build Coastguard Worker 0);
3199*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
3200*8975f5c5SAndroid Build Coastguard Worker
3201*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3202*8975f5c5SAndroid Build Coastguard Worker
3203*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer.
3204*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
3205*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3206*8975f5c5SAndroid Build Coastguard Worker
3207*8975f5c5SAndroid Build Coastguard Worker // Draw into a quarter of the framebuffer, then invalidate that same region.
3208*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3209*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
3210*8975f5c5SAndroid Build Coastguard Worker glScissor(1, 1, 1, 1);
3211*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
3212*8975f5c5SAndroid Build Coastguard Worker
3213*8975f5c5SAndroid Build Coastguard Worker // Only invalidate a quarter of the framebuffer.
3214*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachment = GL_COLOR_ATTACHMENT0;
3215*8975f5c5SAndroid Build Coastguard Worker glInvalidateSubFramebuffer(GL_DRAW_FRAMEBUFFER, 1, &invalidateAttachment, 1, 1, 1, 1);
3216*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3217*8975f5c5SAndroid Build Coastguard Worker
3218*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
3219*8975f5c5SAndroid Build Coastguard Worker
3220*8975f5c5SAndroid Build Coastguard Worker // Blend into the framebuffer, then verify that the framebuffer should have had cyan.
3221*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO);
3222*8975f5c5SAndroid Build Coastguard Worker blendAndVerifyColor(GLColor32F(0.0f, 0.0f, 1.0f, 0.5f), GLColor(127, 127, 127, 191));
3223*8975f5c5SAndroid Build Coastguard Worker }
3224*8975f5c5SAndroid Build Coastguard Worker
3225*8975f5c5SAndroid Build Coastguard Worker // Tests that mid-render-pass invalidate then clear works for color buffers. This test ensures that
3226*8975f5c5SAndroid Build Coastguard Worker // the invalidate is undone on draw.
TEST_P(SimpleStateChangeTestES3,ColorInvalidateThenClear)3227*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, ColorInvalidateThenClear)
3228*8975f5c5SAndroid Build Coastguard Worker {
3229*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer that will be invalidated
3230*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
3231*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
3232*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
3233*8975f5c5SAndroid Build Coastguard Worker
3234*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
3235*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3236*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3237*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3238*8975f5c5SAndroid Build Coastguard Worker
3239*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3240*8975f5c5SAndroid Build Coastguard Worker
3241*8975f5c5SAndroid Build Coastguard Worker // Initialize the framebuffer with a draw call.
3242*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3243*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
3244*8975f5c5SAndroid Build Coastguard Worker
3245*8975f5c5SAndroid Build Coastguard Worker // Invalidate it.
3246*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachment = GL_COLOR_ATTACHMENT0;
3247*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, &invalidateAttachment);
3248*8975f5c5SAndroid Build Coastguard Worker
3249*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer.
3250*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
3251*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3252*8975f5c5SAndroid Build Coastguard Worker
3253*8975f5c5SAndroid Build Coastguard Worker // Expect the clear color, ensuring that invalidate wasn't applied after clear.
3254*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3255*8975f5c5SAndroid Build Coastguard Worker }
3256*8975f5c5SAndroid Build Coastguard Worker
3257*8975f5c5SAndroid Build Coastguard Worker // Tests that mid-render-pass invalidate then clear works for depth buffers. This test ensures that
3258*8975f5c5SAndroid Build Coastguard Worker // the invalidate is undone on draw.
TEST_P(SimpleStateChangeTestES3,DepthInvalidateThenClear)3259*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, DepthInvalidateThenClear)
3260*8975f5c5SAndroid Build Coastguard Worker {
3261*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer that will be invalidated
3262*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
3263*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
3264*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
3265*8975f5c5SAndroid Build Coastguard Worker
3266*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depth;
3267*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depth);
3268*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 2, 2);
3269*8975f5c5SAndroid Build Coastguard Worker
3270*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
3271*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3272*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
3273*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth);
3274*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3275*8975f5c5SAndroid Build Coastguard Worker
3276*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3277*8975f5c5SAndroid Build Coastguard Worker
3278*8975f5c5SAndroid Build Coastguard Worker // Initialize the framebuffer with a draw call.
3279*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
3280*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3281*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
3282*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
3283*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
3284*8975f5c5SAndroid Build Coastguard Worker
3285*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
3286*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
3287*8975f5c5SAndroid Build Coastguard Worker
3288*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
3289*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.0f);
3290*8975f5c5SAndroid Build Coastguard Worker
3291*8975f5c5SAndroid Build Coastguard Worker // Invalidate depth.
3292*8975f5c5SAndroid Build Coastguard Worker GLenum invalidateAttachment = GL_DEPTH_ATTACHMENT;
3293*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, &invalidateAttachment);
3294*8975f5c5SAndroid Build Coastguard Worker
3295*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer.
3296*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.8f);
3297*8975f5c5SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT);
3298*8975f5c5SAndroid Build Coastguard Worker
3299*8975f5c5SAndroid Build Coastguard Worker // Expect the draw color. This breaks the render pass. Later, the test ensures that invalidate
3300*8975f5c5SAndroid Build Coastguard Worker // of depth wasn't applied after clear.
3301*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3302*8975f5c5SAndroid Build Coastguard Worker
3303*8975f5c5SAndroid Build Coastguard Worker // Blend with depth test and make sure depth is as expected.
3304*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
3305*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
3306*8975f5c5SAndroid Build Coastguard Worker
3307*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
3308*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
3309*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.59f);
3310*8975f5c5SAndroid Build Coastguard Worker
3311*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
3312*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0f, 0.0f, 1.0f, 1.0f);
3313*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.61f);
3314*8975f5c5SAndroid Build Coastguard Worker
3315*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
3316*8975f5c5SAndroid Build Coastguard Worker }
3317*8975f5c5SAndroid Build Coastguard Worker
3318*8975f5c5SAndroid Build Coastguard Worker // Invalidate an RGB framebuffer and verify that the alpha channel is not destroyed and remains
3319*8975f5c5SAndroid Build Coastguard Worker // valid after a draw call.
TEST_P(SimpleStateChangeTestES3,InvalidateRGBThenDraw)3320*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, InvalidateRGBThenDraw)
3321*8975f5c5SAndroid Build Coastguard Worker {
3322*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
3323*8975f5c5SAndroid Build Coastguard Worker
3324*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3325*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
3326*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB,
3327*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
3328*8975f5c5SAndroid Build Coastguard Worker
3329*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
3330*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3331*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
3332*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3333*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3334*8975f5c5SAndroid Build Coastguard Worker
3335*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
3336*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3337*8975f5c5SAndroid Build Coastguard Worker // Verify that clearing alpha is ineffective on an RGB format.
3338*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
3339*8975f5c5SAndroid Build Coastguard Worker
3340*8975f5c5SAndroid Build Coastguard Worker // Invalidate the framebuffer contents.
3341*8975f5c5SAndroid Build Coastguard Worker const GLenum discards[] = {GL_COLOR_ATTACHMENT0};
3342*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discards);
3343*8975f5c5SAndroid Build Coastguard Worker
3344*8975f5c5SAndroid Build Coastguard Worker // Without an explicit clear, draw blue and make sure alpha is unaffected. If RGB is emulated
3345*8975f5c5SAndroid Build Coastguard Worker // with RGBA, the previous invalidate shouldn't affect the alpha value.
3346*8975f5c5SAndroid Build Coastguard Worker drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f);
3347*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
3348*8975f5c5SAndroid Build Coastguard Worker }
3349*8975f5c5SAndroid Build Coastguard Worker
3350*8975f5c5SAndroid Build Coastguard Worker // Invalidate an RGB framebuffer and verify that the alpha channel is not destroyed, even if the
3351*8975f5c5SAndroid Build Coastguard Worker // color channels may be garbage.
TEST_P(SimpleStateChangeTestES3,DrawAndInvalidateRGBThenVerifyAlpha)3352*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, DrawAndInvalidateRGBThenVerifyAlpha)
3353*8975f5c5SAndroid Build Coastguard Worker {
3354*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
3355*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
3356*8975f5c5SAndroid Build Coastguard Worker GLint uniformLocation = glGetUniformLocation(drawColor, essl1_shaders::ColorUniform());
3357*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(uniformLocation, -1);
3358*8975f5c5SAndroid Build Coastguard Worker
3359*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
3360*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
3361*8975f5c5SAndroid Build Coastguard Worker
3362*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3363*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
3364*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
3365*8975f5c5SAndroid Build Coastguard Worker
3366*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
3367*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3368*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
3369*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3370*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3371*8975f5c5SAndroid Build Coastguard Worker
3372*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
3373*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3374*8975f5c5SAndroid Build Coastguard Worker
3375*8975f5c5SAndroid Build Coastguard Worker glUniform4f(uniformLocation, 0.1f, 0.2f, 0.3f, 0.4f);
3376*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
3377*8975f5c5SAndroid Build Coastguard Worker
3378*8975f5c5SAndroid Build Coastguard Worker // Invalidate the framebuffer contents.
3379*8975f5c5SAndroid Build Coastguard Worker const GLenum discards[] = {GL_COLOR_ATTACHMENT0};
3380*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discards);
3381*8975f5c5SAndroid Build Coastguard Worker
3382*8975f5c5SAndroid Build Coastguard Worker // Read back the contents of the framebuffer. The color channels are invalid, but as an RGB
3383*8975f5c5SAndroid Build Coastguard Worker // format, readback should always return 1 in alpha.
3384*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> readback(w * h);
3385*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, readback.data());
3386*8975f5c5SAndroid Build Coastguard Worker for (int y = 0; y < h; ++y)
3387*8975f5c5SAndroid Build Coastguard Worker {
3388*8975f5c5SAndroid Build Coastguard Worker for (int x = 0; x < w; ++x)
3389*8975f5c5SAndroid Build Coastguard Worker {
3390*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(readback[y * w + x].A, 255) << x << " " << y;
3391*8975f5c5SAndroid Build Coastguard Worker }
3392*8975f5c5SAndroid Build Coastguard Worker }
3393*8975f5c5SAndroid Build Coastguard Worker }
3394*8975f5c5SAndroid Build Coastguard Worker
3395*8975f5c5SAndroid Build Coastguard Worker // Tests deleting a Framebuffer that is in use.
TEST_P(SimpleStateChangeTest,DeleteFramebufferInUse)3396*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DeleteFramebufferInUse)
3397*8975f5c5SAndroid Build Coastguard Worker {
3398*8975f5c5SAndroid Build Coastguard Worker constexpr int kSize = 16;
3399*8975f5c5SAndroid Build Coastguard Worker
3400*8975f5c5SAndroid Build Coastguard Worker // Create a simple framebuffer.
3401*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3402*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
3403*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3404*8975f5c5SAndroid Build Coastguard Worker
3405*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
3406*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
3407*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
3408*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
3409*8975f5c5SAndroid Build Coastguard Worker
3410*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
3411*8975f5c5SAndroid Build Coastguard Worker
3412*8975f5c5SAndroid Build Coastguard Worker // Draw a solid red color to the framebuffer.
3413*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3414*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3415*8975f5c5SAndroid Build Coastguard Worker
3416*8975f5c5SAndroid Build Coastguard Worker // Delete the framebuffer while the call is in flight.
3417*8975f5c5SAndroid Build Coastguard Worker framebuffer.reset();
3418*8975f5c5SAndroid Build Coastguard Worker
3419*8975f5c5SAndroid Build Coastguard Worker // Make a new framebuffer so we can read back the texture.
3420*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
3421*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
3422*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
3423*8975f5c5SAndroid Build Coastguard Worker
3424*8975f5c5SAndroid Build Coastguard Worker // Flush via ReadPixels and check red was drawn.
3425*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3426*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3427*8975f5c5SAndroid Build Coastguard Worker }
3428*8975f5c5SAndroid Build Coastguard Worker
3429*8975f5c5SAndroid Build Coastguard Worker // This test was made to reproduce a specific issue with our Vulkan backend where were releasing
3430*8975f5c5SAndroid Build Coastguard Worker // buffers too early. The test has 2 textures, we first create a texture and update it with
3431*8975f5c5SAndroid Build Coastguard Worker // multiple updates, but we don't use it right away, we instead draw using another texture
3432*8975f5c5SAndroid Build Coastguard Worker // then we bind the first texture and draw with it.
TEST_P(SimpleStateChangeTest,DynamicAllocationOfMemoryForTextures)3433*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DynamicAllocationOfMemoryForTextures)
3434*8975f5c5SAndroid Build Coastguard Worker {
3435*8975f5c5SAndroid Build Coastguard Worker constexpr int kSize = 64;
3436*8975f5c5SAndroid Build Coastguard Worker
3437*8975f5c5SAndroid Build Coastguard Worker GLuint program = get2DTexturedQuadProgram();
3438*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
3439*8975f5c5SAndroid Build Coastguard Worker
3440*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> greenPixels(kSize * kSize, GLColor::green);
3441*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> redPixels(kSize * kSize, GLColor::red);
3442*8975f5c5SAndroid Build Coastguard Worker GLTexture texture1;
3443*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture1);
3444*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3445*8975f5c5SAndroid Build Coastguard Worker
3446*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 100; i++)
3447*8975f5c5SAndroid Build Coastguard Worker {
3448*8975f5c5SAndroid Build Coastguard Worker // We do this a lot of time to make sure we use multiple buffers in the vulkan backend.
3449*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE,
3450*8975f5c5SAndroid Build Coastguard Worker greenPixels.data());
3451*8975f5c5SAndroid Build Coastguard Worker }
3452*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
3453*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3454*8975f5c5SAndroid Build Coastguard Worker
3455*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3456*8975f5c5SAndroid Build Coastguard Worker
3457*8975f5c5SAndroid Build Coastguard Worker GLTexture texture2;
3458*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture2);
3459*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, redPixels.data());
3460*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
3461*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3462*8975f5c5SAndroid Build Coastguard Worker
3463*8975f5c5SAndroid Build Coastguard Worker // Setup the vertex array to draw a quad.
3464*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, "position");
3465*8975f5c5SAndroid Build Coastguard Worker setupQuadVertexBuffer(1.0f, 1.0f);
3466*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
3467*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
3468*8975f5c5SAndroid Build Coastguard Worker
3469*8975f5c5SAndroid Build Coastguard Worker // Draw quad with texture 2 while texture 1 has "staged" changes that have not been flushed yet.
3470*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture2);
3471*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
3472*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3473*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3474*8975f5c5SAndroid Build Coastguard Worker
3475*8975f5c5SAndroid Build Coastguard Worker // If we now try to draw with texture1, we should trigger the issue.
3476*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture1);
3477*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
3478*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3479*8975f5c5SAndroid Build Coastguard Worker
3480*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3481*8975f5c5SAndroid Build Coastguard Worker }
3482*8975f5c5SAndroid Build Coastguard Worker
3483*8975f5c5SAndroid Build Coastguard Worker // Tests deleting a Framebuffer that is in use.
TEST_P(SimpleStateChangeTest,RedefineFramebufferInUse)3484*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, RedefineFramebufferInUse)
3485*8975f5c5SAndroid Build Coastguard Worker {
3486*8975f5c5SAndroid Build Coastguard Worker constexpr int kSize = 16;
3487*8975f5c5SAndroid Build Coastguard Worker
3488*8975f5c5SAndroid Build Coastguard Worker // Create a simple framebuffer.
3489*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3490*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
3491*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3492*8975f5c5SAndroid Build Coastguard Worker
3493*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
3494*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
3495*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
3496*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
3497*8975f5c5SAndroid Build Coastguard Worker
3498*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
3499*8975f5c5SAndroid Build Coastguard Worker
3500*8975f5c5SAndroid Build Coastguard Worker // Draw red to the framebuffer.
3501*8975f5c5SAndroid Build Coastguard Worker simpleDrawWithColor(GLColor::red);
3502*8975f5c5SAndroid Build Coastguard Worker
3503*8975f5c5SAndroid Build Coastguard Worker // Change the framebuffer while the call is in flight to a new texture.
3504*8975f5c5SAndroid Build Coastguard Worker GLTexture otherTexture;
3505*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, otherTexture);
3506*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3507*8975f5c5SAndroid Build Coastguard Worker
3508*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, otherTexture, 0);
3509*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
3510*8975f5c5SAndroid Build Coastguard Worker
3511*8975f5c5SAndroid Build Coastguard Worker // Draw green to the framebuffer. Verify the color.
3512*8975f5c5SAndroid Build Coastguard Worker simpleDrawWithColor(GLColor::green);
3513*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3514*8975f5c5SAndroid Build Coastguard Worker
3515*8975f5c5SAndroid Build Coastguard Worker // Make a new framebuffer so we can read back the first texture and verify red.
3516*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
3517*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
3518*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
3519*8975f5c5SAndroid Build Coastguard Worker
3520*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3521*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3522*8975f5c5SAndroid Build Coastguard Worker }
3523*8975f5c5SAndroid Build Coastguard Worker
3524*8975f5c5SAndroid Build Coastguard Worker // Tests that redefining a Framebuffer Texture Attachment works as expected.
TEST_P(SimpleStateChangeTest,RedefineFramebufferTexture)3525*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, RedefineFramebufferTexture)
3526*8975f5c5SAndroid Build Coastguard Worker {
3527*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
3528*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
3529*8975f5c5SAndroid Build Coastguard Worker
3530*8975f5c5SAndroid Build Coastguard Worker // Bind a simple 8x8 texture to the framebuffer, draw red.
3531*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
3532*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
3533*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3534*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
3535*8975f5c5SAndroid Build Coastguard Worker
3536*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, 8, 8);
3537*8975f5c5SAndroid Build Coastguard Worker simpleDrawWithColor(GLColor::red);
3538*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3539*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red) << "first draw should be red";
3540*8975f5c5SAndroid Build Coastguard Worker
3541*8975f5c5SAndroid Build Coastguard Worker // Redefine the texture to 32x32, draw green. Verify we get what we expect.
3542*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3543*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, 32, 32);
3544*8975f5c5SAndroid Build Coastguard Worker simpleDrawWithColor(GLColor::green);
3545*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3546*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green) << "second draw should be green";
3547*8975f5c5SAndroid Build Coastguard Worker }
3548*8975f5c5SAndroid Build Coastguard Worker
3549*8975f5c5SAndroid Build Coastguard Worker // Trips a bug in the Vulkan back-end where a Texture wouldn't transition correctly.
TEST_P(SimpleStateChangeTest,DrawAndClearTextureRepeatedly)3550*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DrawAndClearTextureRepeatedly)
3551*8975f5c5SAndroid Build Coastguard Worker {
3552*8975f5c5SAndroid Build Coastguard Worker // Fails on 431.02 driver. http://anglebug.com/40644697
3553*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsNVIDIA() && IsVulkan());
3554*8975f5c5SAndroid Build Coastguard Worker
3555*8975f5c5SAndroid Build Coastguard Worker // Fails on AMD OpenGL Windows. This configuration isn't maintained.
3556*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsOpenGL());
3557*8975f5c5SAndroid Build Coastguard Worker
3558*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
3559*8975f5c5SAndroid Build Coastguard Worker
3560*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
3561*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
3562*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
3563*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3564*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3565*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3566*8975f5c5SAndroid Build Coastguard Worker
3567*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
3568*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3569*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
3570*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3571*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3572*8975f5c5SAndroid Build Coastguard Worker
3573*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
3574*8975f5c5SAndroid Build Coastguard Worker
3575*8975f5c5SAndroid Build Coastguard Worker GLint uniLoc = glGetUniformLocation(program, essl1_shaders::Texture2DUniform());
3576*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, uniLoc);
3577*8975f5c5SAndroid Build Coastguard Worker glUniform1i(uniLoc, 0);
3578*8975f5c5SAndroid Build Coastguard Worker
3579*8975f5c5SAndroid Build Coastguard Worker const int numRowsCols = 2;
3580*8975f5c5SAndroid Build Coastguard Worker const int cellSize = getWindowWidth() / 2;
3581*8975f5c5SAndroid Build Coastguard Worker
3582*8975f5c5SAndroid Build Coastguard Worker for (int cellY = 0; cellY < numRowsCols; cellY++)
3583*8975f5c5SAndroid Build Coastguard Worker {
3584*8975f5c5SAndroid Build Coastguard Worker for (int cellX = 0; cellX < numRowsCols; cellX++)
3585*8975f5c5SAndroid Build Coastguard Worker {
3586*8975f5c5SAndroid Build Coastguard Worker int seed = cellX + cellY * numRowsCols;
3587*8975f5c5SAndroid Build Coastguard Worker const Vector4 color = RandomVec4(seed, 0.0f, 1.0f);
3588*8975f5c5SAndroid Build Coastguard Worker
3589*8975f5c5SAndroid Build Coastguard Worker // Set the texture to a constant color using glClear and a user FBO.
3590*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3591*8975f5c5SAndroid Build Coastguard Worker glClearColor(color[0], color[1], color[2], color[3]);
3592*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3593*8975f5c5SAndroid Build Coastguard Worker
3594*8975f5c5SAndroid Build Coastguard Worker // Draw a small colored quad to the default FBO using the viewport.
3595*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
3596*8975f5c5SAndroid Build Coastguard Worker glViewport(cellX * cellSize, cellY * cellSize, cellSize, cellSize);
3597*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
3598*8975f5c5SAndroid Build Coastguard Worker }
3599*8975f5c5SAndroid Build Coastguard Worker }
3600*8975f5c5SAndroid Build Coastguard Worker
3601*8975f5c5SAndroid Build Coastguard Worker // Verify the colored quads were drawn correctly despite no flushing.
3602*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> pixelData(getWindowWidth() * getWindowHeight());
3603*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
3604*8975f5c5SAndroid Build Coastguard Worker pixelData.data());
3605*8975f5c5SAndroid Build Coastguard Worker
3606*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3607*8975f5c5SAndroid Build Coastguard Worker
3608*8975f5c5SAndroid Build Coastguard Worker for (int cellY = 0; cellY < numRowsCols; cellY++)
3609*8975f5c5SAndroid Build Coastguard Worker {
3610*8975f5c5SAndroid Build Coastguard Worker for (int cellX = 0; cellX < numRowsCols; cellX++)
3611*8975f5c5SAndroid Build Coastguard Worker {
3612*8975f5c5SAndroid Build Coastguard Worker int seed = cellX + cellY * numRowsCols;
3613*8975f5c5SAndroid Build Coastguard Worker const Vector4 color = RandomVec4(seed, 0.0f, 1.0f);
3614*8975f5c5SAndroid Build Coastguard Worker
3615*8975f5c5SAndroid Build Coastguard Worker GLColor expectedColor(color);
3616*8975f5c5SAndroid Build Coastguard Worker
3617*8975f5c5SAndroid Build Coastguard Worker int testN =
3618*8975f5c5SAndroid Build Coastguard Worker cellX * cellSize + cellY * getWindowWidth() * cellSize + getWindowWidth() + 1;
3619*8975f5c5SAndroid Build Coastguard Worker GLColor actualColor = pixelData[testN];
3620*8975f5c5SAndroid Build Coastguard Worker EXPECT_COLOR_NEAR(expectedColor, actualColor, 1);
3621*8975f5c5SAndroid Build Coastguard Worker }
3622*8975f5c5SAndroid Build Coastguard Worker }
3623*8975f5c5SAndroid Build Coastguard Worker }
3624*8975f5c5SAndroid Build Coastguard Worker
3625*8975f5c5SAndroid Build Coastguard Worker // Test that clear followed by rebind of framebuffer attachment works (with noop clear in between).
TEST_P(SimpleStateChangeTestES3,ClearThenNoopClearThenRebindAttachment)3626*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, ClearThenNoopClearThenRebindAttachment)
3627*8975f5c5SAndroid Build Coastguard Worker {
3628*8975f5c5SAndroid Build Coastguard Worker // Create a texture with red
3629*8975f5c5SAndroid Build Coastguard Worker const GLColor kInitColor1 = GLColor::red;
3630*8975f5c5SAndroid Build Coastguard Worker GLTexture texture1;
3631*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture1);
3632*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &kInitColor1);
3633*8975f5c5SAndroid Build Coastguard Worker
3634*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer to be cleared
3635*8975f5c5SAndroid Build Coastguard Worker GLTexture texture2;
3636*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture2);
3637*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3638*8975f5c5SAndroid Build Coastguard Worker
3639*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
3640*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
3641*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture2, 0);
3642*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3643*8975f5c5SAndroid Build Coastguard Worker
3644*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3645*8975f5c5SAndroid Build Coastguard Worker
3646*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer to green
3647*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
3648*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3649*8975f5c5SAndroid Build Coastguard Worker
3650*8975f5c5SAndroid Build Coastguard Worker // Clear again, but in a way that would be a no-op. In the Vulkan backend, this will result in
3651*8975f5c5SAndroid Build Coastguard Worker // a framebuffer sync state, which extracts deferred clears. However, as the clear is actually
3652*8975f5c5SAndroid Build Coastguard Worker // a noop, the deferred clears will remain unflushed.
3653*8975f5c5SAndroid Build Coastguard Worker glClear(0);
3654*8975f5c5SAndroid Build Coastguard Worker
3655*8975f5c5SAndroid Build Coastguard Worker // Change framebuffer's attachment to the other texture.
3656*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture1, 0);
3657*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3658*8975f5c5SAndroid Build Coastguard Worker
3659*8975f5c5SAndroid Build Coastguard Worker // A bogus draw to make sure the render pass is cleared in the Vulkan backend.
3660*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
3661*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
3662*8975f5c5SAndroid Build Coastguard Worker
3663*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
3664*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ZERO, GL_ONE);
3665*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5);
3666*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3667*8975f5c5SAndroid Build Coastguard Worker
3668*8975f5c5SAndroid Build Coastguard Worker // Expect red, which is the original contents of texture1. If the clear is mistakenly applied
3669*8975f5c5SAndroid Build Coastguard Worker // to the new attachment, green will be read back.
3670*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, kInitColor1);
3671*8975f5c5SAndroid Build Coastguard Worker
3672*8975f5c5SAndroid Build Coastguard Worker // Attach back to texture2. It should be cleared to green.
3673*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture2, 0);
3674*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3675*8975f5c5SAndroid Build Coastguard Worker }
3676*8975f5c5SAndroid Build Coastguard Worker
3677*8975f5c5SAndroid Build Coastguard Worker // Test that clear followed by rebind of framebuffer attachment works (with 0-sized scissor clear in
3678*8975f5c5SAndroid Build Coastguard Worker // between).
TEST_P(SimpleStateChangeTestES3,ClearThenZeroSizeScissoredClearThenRebindAttachment)3679*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, ClearThenZeroSizeScissoredClearThenRebindAttachment)
3680*8975f5c5SAndroid Build Coastguard Worker {
3681*8975f5c5SAndroid Build Coastguard Worker // Create a texture with red
3682*8975f5c5SAndroid Build Coastguard Worker const GLColor kInitColor1 = GLColor::red;
3683*8975f5c5SAndroid Build Coastguard Worker GLTexture texture1;
3684*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture1);
3685*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &kInitColor1);
3686*8975f5c5SAndroid Build Coastguard Worker
3687*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer to be cleared
3688*8975f5c5SAndroid Build Coastguard Worker GLTexture texture2;
3689*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture2);
3690*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3691*8975f5c5SAndroid Build Coastguard Worker
3692*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
3693*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
3694*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture2, 0);
3695*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3696*8975f5c5SAndroid Build Coastguard Worker
3697*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3698*8975f5c5SAndroid Build Coastguard Worker
3699*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer to green
3700*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
3701*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3702*8975f5c5SAndroid Build Coastguard Worker
3703*8975f5c5SAndroid Build Coastguard Worker // Clear again, but in a way that would be a no-op. In the Vulkan backend, this will result in
3704*8975f5c5SAndroid Build Coastguard Worker // a framebuffer sync state, which extracts deferred clears. However, as the clear is actually
3705*8975f5c5SAndroid Build Coastguard Worker // a noop, the deferred clears will remain unflushed.
3706*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
3707*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, 0, 0);
3708*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3709*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
3710*8975f5c5SAndroid Build Coastguard Worker
3711*8975f5c5SAndroid Build Coastguard Worker // Change framebuffer's attachment to the other texture.
3712*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture1, 0);
3713*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3714*8975f5c5SAndroid Build Coastguard Worker
3715*8975f5c5SAndroid Build Coastguard Worker // A bogus draw to make sure the render pass is cleared in the Vulkan backend.
3716*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
3717*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
3718*8975f5c5SAndroid Build Coastguard Worker
3719*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
3720*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ZERO, GL_ONE);
3721*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5);
3722*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3723*8975f5c5SAndroid Build Coastguard Worker
3724*8975f5c5SAndroid Build Coastguard Worker // Expect red, which is the original contents of texture1. If the clear is mistakenly applied
3725*8975f5c5SAndroid Build Coastguard Worker // to the new attachment, green will be read back.
3726*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, kInitColor1);
3727*8975f5c5SAndroid Build Coastguard Worker
3728*8975f5c5SAndroid Build Coastguard Worker // Attach back to texture2. It should be cleared to green.
3729*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture2, 0);
3730*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3731*8975f5c5SAndroid Build Coastguard Worker }
3732*8975f5c5SAndroid Build Coastguard Worker
3733*8975f5c5SAndroid Build Coastguard Worker // Test that clear followed by rebind of framebuffer attachment works (with noop blit in between).
TEST_P(SimpleStateChangeTestES3,ClearThenNoopBlitThenRebindAttachment)3734*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, ClearThenNoopBlitThenRebindAttachment)
3735*8975f5c5SAndroid Build Coastguard Worker {
3736*8975f5c5SAndroid Build Coastguard Worker // Create a texture with red
3737*8975f5c5SAndroid Build Coastguard Worker const GLColor kInitColor1 = GLColor::red;
3738*8975f5c5SAndroid Build Coastguard Worker GLTexture texture1;
3739*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture1);
3740*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &kInitColor1);
3741*8975f5c5SAndroid Build Coastguard Worker
3742*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer to be cleared
3743*8975f5c5SAndroid Build Coastguard Worker GLTexture texture2;
3744*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture2);
3745*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3746*8975f5c5SAndroid Build Coastguard Worker
3747*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
3748*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
3749*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture2, 0);
3750*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3751*8975f5c5SAndroid Build Coastguard Worker
3752*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3753*8975f5c5SAndroid Build Coastguard Worker
3754*8975f5c5SAndroid Build Coastguard Worker // Clear the framebuffer to green
3755*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
3756*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3757*8975f5c5SAndroid Build Coastguard Worker
3758*8975f5c5SAndroid Build Coastguard Worker // Issue noop blit. In the Vulkan backend, this will result in a framebuffer sync state, which
3759*8975f5c5SAndroid Build Coastguard Worker // extracts deferred clears. However, as the blit is actually a noop, the deferred clears will
3760*8975f5c5SAndroid Build Coastguard Worker // remain unflushed.
3761*8975f5c5SAndroid Build Coastguard Worker GLTexture blitSrc;
3762*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, blitSrc);
3763*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
3764*8975f5c5SAndroid Build Coastguard Worker
3765*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer readFBO;
3766*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, readFBO);
3767*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, blitSrc, 0);
3768*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
3769*8975f5c5SAndroid Build Coastguard Worker
3770*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
3771*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3772*8975f5c5SAndroid Build Coastguard Worker
3773*8975f5c5SAndroid Build Coastguard Worker // Change framebuffer's attachment to the other texture.
3774*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture1, 0);
3775*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3776*8975f5c5SAndroid Build Coastguard Worker
3777*8975f5c5SAndroid Build Coastguard Worker // A bogus draw to make sure the render pass is cleared in the Vulkan backend.
3778*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
3779*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
3780*8975f5c5SAndroid Build Coastguard Worker
3781*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
3782*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ZERO, GL_ONE);
3783*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5);
3784*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
3785*8975f5c5SAndroid Build Coastguard Worker
3786*8975f5c5SAndroid Build Coastguard Worker // Expect red, which is the original contents of texture1. If the clear is mistakenly applied
3787*8975f5c5SAndroid Build Coastguard Worker // to the new attachment, green will be read back.
3788*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO);
3789*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, kInitColor1);
3790*8975f5c5SAndroid Build Coastguard Worker
3791*8975f5c5SAndroid Build Coastguard Worker // Attach back to texture2. It should be cleared to green.
3792*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture2, 0);
3793*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3794*8975f5c5SAndroid Build Coastguard Worker }
3795*8975f5c5SAndroid Build Coastguard Worker
3796*8975f5c5SAndroid Build Coastguard Worker // Validates disabling cull face really disables it.
TEST_P(SimpleStateChangeTest,EnableAndDisableCullFace)3797*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, EnableAndDisableCullFace)
3798*8975f5c5SAndroid Build Coastguard Worker {
3799*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3800*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
3801*8975f5c5SAndroid Build Coastguard Worker
3802*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3803*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_CULL_FACE);
3804*8975f5c5SAndroid Build Coastguard Worker
3805*8975f5c5SAndroid Build Coastguard Worker glCullFace(GL_FRONT);
3806*8975f5c5SAndroid Build Coastguard Worker
3807*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f, 1.0f, true);
3808*8975f5c5SAndroid Build Coastguard Worker
3809*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3810*8975f5c5SAndroid Build Coastguard Worker
3811*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
3812*8975f5c5SAndroid Build Coastguard Worker
3813*8975f5c5SAndroid Build Coastguard Worker // Disable cull face and redraw, then make sure we have the quad drawn.
3814*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_CULL_FACE);
3815*8975f5c5SAndroid Build Coastguard Worker
3816*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f, 1.0f, true);
3817*8975f5c5SAndroid Build Coastguard Worker
3818*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3819*8975f5c5SAndroid Build Coastguard Worker
3820*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3821*8975f5c5SAndroid Build Coastguard Worker }
3822*8975f5c5SAndroid Build Coastguard Worker
TEST_P(SimpleStateChangeTest,ScissorTest)3823*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, ScissorTest)
3824*8975f5c5SAndroid Build Coastguard Worker {
3825*8975f5c5SAndroid Build Coastguard Worker // This test validates this order of state changes:
3826*8975f5c5SAndroid Build Coastguard Worker // 1- Set scissor but don't enable it, validate its not used.
3827*8975f5c5SAndroid Build Coastguard Worker // 2- Enable it and validate its working.
3828*8975f5c5SAndroid Build Coastguard Worker // 3- Disable the scissor validate its not used anymore.
3829*8975f5c5SAndroid Build Coastguard Worker
3830*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3831*8975f5c5SAndroid Build Coastguard Worker
3832*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3833*8975f5c5SAndroid Build Coastguard Worker
3834*8975f5c5SAndroid Build Coastguard Worker // Set the scissor region, but don't enable it yet.
3835*8975f5c5SAndroid Build Coastguard Worker glScissor(getWindowWidth() / 4, getWindowHeight() / 4, getWindowWidth() / 2,
3836*8975f5c5SAndroid Build Coastguard Worker getWindowHeight() / 2);
3837*8975f5c5SAndroid Build Coastguard Worker
3838*8975f5c5SAndroid Build Coastguard Worker // Fill the whole screen with a quad.
3839*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f, 1.0f, true);
3840*8975f5c5SAndroid Build Coastguard Worker
3841*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3842*8975f5c5SAndroid Build Coastguard Worker
3843*8975f5c5SAndroid Build Coastguard Worker // Test outside, scissor isnt enabled so its red.
3844*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3845*8975f5c5SAndroid Build Coastguard Worker
3846*8975f5c5SAndroid Build Coastguard Worker // Test inside, red of the fragment shader.
3847*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3848*8975f5c5SAndroid Build Coastguard Worker
3849*8975f5c5SAndroid Build Coastguard Worker // Clear everything and start over with the test enabled.
3850*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3851*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
3852*8975f5c5SAndroid Build Coastguard Worker
3853*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f, 1.0f, true);
3854*8975f5c5SAndroid Build Coastguard Worker
3855*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3856*8975f5c5SAndroid Build Coastguard Worker
3857*8975f5c5SAndroid Build Coastguard Worker // Test outside the scissor test, pitch black.
3858*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
3859*8975f5c5SAndroid Build Coastguard Worker
3860*8975f5c5SAndroid Build Coastguard Worker // Test inside, red of the fragment shader.
3861*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3862*8975f5c5SAndroid Build Coastguard Worker
3863*8975f5c5SAndroid Build Coastguard Worker // Now disable the scissor test, do it again, and verify the region isn't used
3864*8975f5c5SAndroid Build Coastguard Worker // for the scissor test.
3865*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
3866*8975f5c5SAndroid Build Coastguard Worker
3867*8975f5c5SAndroid Build Coastguard Worker // Clear everything and start over with the test enabled.
3868*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3869*8975f5c5SAndroid Build Coastguard Worker
3870*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f, 1.0f, true);
3871*8975f5c5SAndroid Build Coastguard Worker
3872*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3873*8975f5c5SAndroid Build Coastguard Worker
3874*8975f5c5SAndroid Build Coastguard Worker // Test outside, scissor isnt enabled so its red.
3875*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3876*8975f5c5SAndroid Build Coastguard Worker
3877*8975f5c5SAndroid Build Coastguard Worker // Test inside, red of the fragment shader.
3878*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
3879*8975f5c5SAndroid Build Coastguard Worker }
3880*8975f5c5SAndroid Build Coastguard Worker
3881*8975f5c5SAndroid Build Coastguard Worker // This test validates we are able to change the valid of a uniform dynamically.
TEST_P(SimpleStateChangeTest,UniformUpdateTest)3882*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, UniformUpdateTest)
3883*8975f5c5SAndroid Build Coastguard Worker {
3884*8975f5c5SAndroid Build Coastguard Worker constexpr char kPositionUniformVertexShader[] = R"(
3885*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
3886*8975f5c5SAndroid Build Coastguard Worker attribute vec2 position;
3887*8975f5c5SAndroid Build Coastguard Worker uniform vec2 uniPosModifier;
3888*8975f5c5SAndroid Build Coastguard Worker void main()
3889*8975f5c5SAndroid Build Coastguard Worker {
3890*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position + uniPosModifier, 0, 1);
3891*8975f5c5SAndroid Build Coastguard Worker })";
3892*8975f5c5SAndroid Build Coastguard Worker
3893*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kPositionUniformVertexShader, essl1_shaders::fs::UniformColor());
3894*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
3895*8975f5c5SAndroid Build Coastguard Worker
3896*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
3897*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3898*8975f5c5SAndroid Build Coastguard Worker
3899*8975f5c5SAndroid Build Coastguard Worker GLint posUniformLocation = glGetUniformLocation(program, "uniPosModifier");
3900*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(posUniformLocation, -1);
3901*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation = glGetUniformLocation(program, essl1_shaders::ColorUniform());
3902*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
3903*8975f5c5SAndroid Build Coastguard Worker
3904*8975f5c5SAndroid Build Coastguard Worker // draw a red quad to the left side.
3905*8975f5c5SAndroid Build Coastguard Worker glUniform2f(posUniformLocation, -0.5, 0.0);
3906*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 1.0, 0.0, 0.0, 1.0);
3907*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.0f, 0.5f, true);
3908*8975f5c5SAndroid Build Coastguard Worker
3909*8975f5c5SAndroid Build Coastguard Worker // draw a green quad to the right side.
3910*8975f5c5SAndroid Build Coastguard Worker glUniform2f(posUniformLocation, 0.5, 0.0);
3911*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0.0, 1.0, 0.0, 1.0);
3912*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.0f, 0.5f, true);
3913*8975f5c5SAndroid Build Coastguard Worker
3914*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3915*8975f5c5SAndroid Build Coastguard Worker
3916*8975f5c5SAndroid Build Coastguard Worker // Test the center of the left quad. Should be red.
3917*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 2, GLColor::red);
3918*8975f5c5SAndroid Build Coastguard Worker
3919*8975f5c5SAndroid Build Coastguard Worker // Test the center of the right quad. Should be green.
3920*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4 * 3, getWindowHeight() / 2, GLColor::green);
3921*8975f5c5SAndroid Build Coastguard Worker }
3922*8975f5c5SAndroid Build Coastguard Worker
3923*8975f5c5SAndroid Build Coastguard Worker // Tests that changing the storage of a Renderbuffer currently in use by GL works as expected.
TEST_P(SimpleStateChangeTest,RedefineRenderbufferInUse)3924*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, RedefineRenderbufferInUse)
3925*8975f5c5SAndroid Build Coastguard Worker {
3926*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer;
3927*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
3928*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16);
3929*8975f5c5SAndroid Build Coastguard Worker
3930*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
3931*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
3932*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
3933*8975f5c5SAndroid Build Coastguard Worker
3934*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3935*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
3936*8975f5c5SAndroid Build Coastguard Worker
3937*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kSimpleVertexShader, kSimpleFragmentShader);
3938*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetAttribLocation(program, "color");
3939*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
3940*8975f5c5SAndroid Build Coastguard Worker
3941*8975f5c5SAndroid Build Coastguard Worker // Set up and draw red to the left half the screen.
3942*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> redData(6, GLColor::red);
3943*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBufferRed;
3944*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBufferRed);
3945*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, redData.size() * sizeof(GLColor), redData.data(), GL_STATIC_DRAW);
3946*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
3947*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
3948*8975f5c5SAndroid Build Coastguard Worker
3949*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, 16, 16);
3950*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.5f, 1.0f, true);
3951*8975f5c5SAndroid Build Coastguard Worker
3952*8975f5c5SAndroid Build Coastguard Worker // Immediately redefine the Renderbuffer.
3953*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 64, 64);
3954*8975f5c5SAndroid Build Coastguard Worker
3955*8975f5c5SAndroid Build Coastguard Worker // Set up and draw green to the right half of the screen.
3956*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> greenData(6, GLColor::green);
3957*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBufferGreen;
3958*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBufferGreen);
3959*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, greenData.size() * sizeof(GLColor), greenData.data(),
3960*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
3961*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
3962*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
3963*8975f5c5SAndroid Build Coastguard Worker
3964*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, 64, 64);
3965*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.5f, 1.0f, true);
3966*8975f5c5SAndroid Build Coastguard Worker
3967*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3968*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
3969*8975f5c5SAndroid Build Coastguard Worker }
3970*8975f5c5SAndroid Build Coastguard Worker
3971*8975f5c5SAndroid Build Coastguard Worker // Validate that we can draw -> change frame buffer size -> draw and we'll be rendering
3972*8975f5c5SAndroid Build Coastguard Worker // at the full size of the new framebuffer.
TEST_P(SimpleStateChangeTest,ChangeFramebufferSizeBetweenTwoDraws)3973*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, ChangeFramebufferSizeBetweenTwoDraws)
3974*8975f5c5SAndroid Build Coastguard Worker {
3975*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kSmallTextureSize = 2;
3976*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kBigTextureSize = 4;
3977*8975f5c5SAndroid Build Coastguard Worker
3978*8975f5c5SAndroid Build Coastguard Worker // Create 2 textures, one of 2x2 and the other 4x4
3979*8975f5c5SAndroid Build Coastguard Worker GLTexture texture1;
3980*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture1);
3981*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSmallTextureSize, kSmallTextureSize, 0, GL_RGBA,
3982*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
3983*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3984*8975f5c5SAndroid Build Coastguard Worker
3985*8975f5c5SAndroid Build Coastguard Worker GLTexture texture2;
3986*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture2);
3987*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kBigTextureSize, kBigTextureSize, 0, GL_RGBA,
3988*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
3989*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3990*8975f5c5SAndroid Build Coastguard Worker
3991*8975f5c5SAndroid Build Coastguard Worker // A framebuffer for each texture to draw on.
3992*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer1;
3993*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer1);
3994*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture1, 0);
3995*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3996*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
3997*8975f5c5SAndroid Build Coastguard Worker
3998*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer2;
3999*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer2);
4000*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture2, 0);
4001*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4002*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
4003*8975f5c5SAndroid Build Coastguard Worker
4004*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
4005*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
4006*8975f5c5SAndroid Build Coastguard Worker GLint uniformLocation = glGetUniformLocation(program, essl1_shaders::ColorUniform());
4007*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(uniformLocation, -1);
4008*8975f5c5SAndroid Build Coastguard Worker
4009*8975f5c5SAndroid Build Coastguard Worker // Bind to the first framebuffer for drawing.
4010*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer1);
4011*8975f5c5SAndroid Build Coastguard Worker
4012*8975f5c5SAndroid Build Coastguard Worker // Set a scissor, that will trigger setting the internal scissor state in Vulkan to
4013*8975f5c5SAndroid Build Coastguard Worker // (0,0,framebuffer.width, framebuffer.height) size since the scissor isn't enabled.
4014*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, 16, 16);
4015*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4016*8975f5c5SAndroid Build Coastguard Worker
4017*8975f5c5SAndroid Build Coastguard Worker // Set color to red.
4018*8975f5c5SAndroid Build Coastguard Worker glUniform4f(uniformLocation, 1.0f, 0.0f, 0.0f, 1.0f);
4019*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSmallTextureSize, kSmallTextureSize);
4020*8975f5c5SAndroid Build Coastguard Worker
4021*8975f5c5SAndroid Build Coastguard Worker // Draw a full sized red quad
4022*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 1.0f, 1.0f, true);
4023*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4024*8975f5c5SAndroid Build Coastguard Worker
4025*8975f5c5SAndroid Build Coastguard Worker // Bind to the second (bigger) framebuffer
4026*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer2);
4027*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kBigTextureSize, kBigTextureSize);
4028*8975f5c5SAndroid Build Coastguard Worker
4029*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4030*8975f5c5SAndroid Build Coastguard Worker
4031*8975f5c5SAndroid Build Coastguard Worker // Set color to green.
4032*8975f5c5SAndroid Build Coastguard Worker glUniform4f(uniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);
4033*8975f5c5SAndroid Build Coastguard Worker
4034*8975f5c5SAndroid Build Coastguard Worker // Draw again and we should fill everything with green and expect everything to be green.
4035*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 1.0f, 1.0f, true);
4036*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4037*8975f5c5SAndroid Build Coastguard Worker
4038*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kBigTextureSize, kBigTextureSize, GLColor::green);
4039*8975f5c5SAndroid Build Coastguard Worker }
4040*8975f5c5SAndroid Build Coastguard Worker
4041*8975f5c5SAndroid Build Coastguard Worker // Tries to relink a program in use and use it again to draw something else.
TEST_P(SimpleStateChangeTest,RelinkProgram)4042*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, RelinkProgram)
4043*8975f5c5SAndroid Build Coastguard Worker {
4044*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40644706
4045*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsIntel() && IsLinux() && IsOpenGLES());
4046*8975f5c5SAndroid Build Coastguard Worker const GLuint program = glCreateProgram();
4047*8975f5c5SAndroid Build Coastguard Worker
4048*8975f5c5SAndroid Build Coastguard Worker GLuint vs = CompileShader(GL_VERTEX_SHADER, essl1_shaders::vs::Simple());
4049*8975f5c5SAndroid Build Coastguard Worker GLuint blueFs = CompileShader(GL_FRAGMENT_SHADER, essl1_shaders::fs::Blue());
4050*8975f5c5SAndroid Build Coastguard Worker GLuint redFs = CompileShader(GL_FRAGMENT_SHADER, essl1_shaders::fs::Red());
4051*8975f5c5SAndroid Build Coastguard Worker
4052*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, vs);
4053*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, blueFs);
4054*8975f5c5SAndroid Build Coastguard Worker
4055*8975f5c5SAndroid Build Coastguard Worker glLinkProgram(program);
4056*8975f5c5SAndroid Build Coastguard Worker CheckLinkStatusAndReturnProgram(program, true);
4057*8975f5c5SAndroid Build Coastguard Worker
4058*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
4059*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector3> vertices = {{-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, -1.0f, 0.0f},
4060*8975f5c5SAndroid Build Coastguard Worker {-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {-1.0, 1.0f, 0.0f}};
4061*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
4062*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
4063*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
4064*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
4065*8975f5c5SAndroid Build Coastguard Worker const GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
4066*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
4067*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
4068*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
4069*8975f5c5SAndroid Build Coastguard Worker
4070*8975f5c5SAndroid Build Coastguard Worker // Draw a blue triangle to the right
4071*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
4072*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
4073*8975f5c5SAndroid Build Coastguard Worker
4074*8975f5c5SAndroid Build Coastguard Worker // Relink to draw red to the left
4075*8975f5c5SAndroid Build Coastguard Worker glDetachShader(program, blueFs);
4076*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, redFs);
4077*8975f5c5SAndroid Build Coastguard Worker
4078*8975f5c5SAndroid Build Coastguard Worker glLinkProgram(program);
4079*8975f5c5SAndroid Build Coastguard Worker CheckLinkStatusAndReturnProgram(program, true);
4080*8975f5c5SAndroid Build Coastguard Worker
4081*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 3, 3);
4082*8975f5c5SAndroid Build Coastguard Worker
4083*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4084*8975f5c5SAndroid Build Coastguard Worker
4085*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(positionLocation);
4086*8975f5c5SAndroid Build Coastguard Worker
4087*8975f5c5SAndroid Build Coastguard Worker // Verify we drew red and green in the right places.
4088*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, 0, GLColor::blue);
4089*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, getWindowHeight() / 2, GLColor::red);
4090*8975f5c5SAndroid Build Coastguard Worker
4091*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(vs);
4092*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(blueFs);
4093*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(redFs);
4094*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(program);
4095*8975f5c5SAndroid Build Coastguard Worker }
4096*8975f5c5SAndroid Build Coastguard Worker
4097*8975f5c5SAndroid Build Coastguard Worker // Creates a program that uses uniforms and then immediately release it and then use it. Should be
4098*8975f5c5SAndroid Build Coastguard Worker // valid.
TEST_P(SimpleStateChangeTest,ReleaseShaderInUseThatReadsFromUniforms)4099*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, ReleaseShaderInUseThatReadsFromUniforms)
4100*8975f5c5SAndroid Build Coastguard Worker {
4101*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
4102*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
4103*8975f5c5SAndroid Build Coastguard Worker
4104*8975f5c5SAndroid Build Coastguard Worker const GLint uniformLoc = glGetUniformLocation(program, essl1_shaders::ColorUniform());
4105*8975f5c5SAndroid Build Coastguard Worker EXPECT_NE(-1, uniformLoc);
4106*8975f5c5SAndroid Build Coastguard Worker
4107*8975f5c5SAndroid Build Coastguard Worker // Set color to red.
4108*8975f5c5SAndroid Build Coastguard Worker glUniform4f(uniformLoc, 1.0f, 0.0f, 0.0f, 1.0f);
4109*8975f5c5SAndroid Build Coastguard Worker
4110*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
4111*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector3> vertices = {{-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, -1.0f, 0.0f}};
4112*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
4113*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
4114*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
4115*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
4116*8975f5c5SAndroid Build Coastguard Worker const GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
4117*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
4118*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
4119*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
4120*8975f5c5SAndroid Build Coastguard Worker
4121*8975f5c5SAndroid Build Coastguard Worker // Release program while its in use.
4122*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(program);
4123*8975f5c5SAndroid Build Coastguard Worker
4124*8975f5c5SAndroid Build Coastguard Worker // Draw a red triangle
4125*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
4126*8975f5c5SAndroid Build Coastguard Worker
4127*8975f5c5SAndroid Build Coastguard Worker // Set color to green
4128*8975f5c5SAndroid Build Coastguard Worker glUniform4f(uniformLoc, 1.0f, 0.0f, 0.0f, 1.0f);
4129*8975f5c5SAndroid Build Coastguard Worker
4130*8975f5c5SAndroid Build Coastguard Worker // Draw a green triangle
4131*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
4132*8975f5c5SAndroid Build Coastguard Worker
4133*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4134*8975f5c5SAndroid Build Coastguard Worker
4135*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(positionLocation);
4136*8975f5c5SAndroid Build Coastguard Worker
4137*8975f5c5SAndroid Build Coastguard Worker glUseProgram(0);
4138*8975f5c5SAndroid Build Coastguard Worker
4139*8975f5c5SAndroid Build Coastguard Worker // Verify we drew red in the end since thats the last draw.
4140*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, 0, GLColor::red);
4141*8975f5c5SAndroid Build Coastguard Worker }
4142*8975f5c5SAndroid Build Coastguard Worker
4143*8975f5c5SAndroid Build Coastguard Worker // Tests that sampler sync isn't masked by program textures.
TEST_P(SimpleStateChangeTestES3,SamplerSyncNotTiedToProgram)4144*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, SamplerSyncNotTiedToProgram)
4145*8975f5c5SAndroid Build Coastguard Worker {
4146*8975f5c5SAndroid Build Coastguard Worker // Create a sampler with NEAREST filtering.
4147*8975f5c5SAndroid Build Coastguard Worker GLSampler sampler;
4148*8975f5c5SAndroid Build Coastguard Worker glBindSampler(0, sampler);
4149*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(sampler, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
4150*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4151*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4152*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4153*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4154*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4155*8975f5c5SAndroid Build Coastguard Worker
4156*8975f5c5SAndroid Build Coastguard Worker // Draw with a program that uses no textures.
4157*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program1, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
4158*8975f5c5SAndroid Build Coastguard Worker drawQuad(program1, essl1_shaders::PositionAttrib(), 0.5f);
4159*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4160*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
4161*8975f5c5SAndroid Build Coastguard Worker
4162*8975f5c5SAndroid Build Coastguard Worker // Create a simple texture with four colors and linear filtering.
4163*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 2;
4164*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> pixels = {
4165*8975f5c5SAndroid Build Coastguard Worker {GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
4166*8975f5c5SAndroid Build Coastguard Worker GLTexture redTex;
4167*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, redTex);
4168*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4169*8975f5c5SAndroid Build Coastguard Worker pixels.data());
4170*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
4171*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4172*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4173*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4174*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4175*8975f5c5SAndroid Build Coastguard Worker
4176*8975f5c5SAndroid Build Coastguard Worker // Create a program that uses the texture.
4177*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(attribute vec4 position;
4178*8975f5c5SAndroid Build Coastguard Worker varying vec2 texCoord;
4179*8975f5c5SAndroid Build Coastguard Worker void main()
4180*8975f5c5SAndroid Build Coastguard Worker {
4181*8975f5c5SAndroid Build Coastguard Worker gl_Position = position;
4182*8975f5c5SAndroid Build Coastguard Worker texCoord = position.xy * 0.5 + vec2(0.5);
4183*8975f5c5SAndroid Build Coastguard Worker })";
4184*8975f5c5SAndroid Build Coastguard Worker
4185*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision mediump float;
4186*8975f5c5SAndroid Build Coastguard Worker varying vec2 texCoord;
4187*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
4188*8975f5c5SAndroid Build Coastguard Worker void main()
4189*8975f5c5SAndroid Build Coastguard Worker {
4190*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = texture2D(tex, texCoord);
4191*8975f5c5SAndroid Build Coastguard Worker })";
4192*8975f5c5SAndroid Build Coastguard Worker
4193*8975f5c5SAndroid Build Coastguard Worker // Draw. The sampler should override the clamp wrap mode with nearest.
4194*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program2, kVS, kFS);
4195*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0, glGetUniformLocation(program2, "tex"));
4196*8975f5c5SAndroid Build Coastguard Worker drawQuad(program2, "position", 0.5f);
4197*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4198*8975f5c5SAndroid Build Coastguard Worker
4199*8975f5c5SAndroid Build Coastguard Worker constexpr int kHalfSize = kWindowSize / 2;
4200*8975f5c5SAndroid Build Coastguard Worker
4201*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kHalfSize, kHalfSize, GLColor::red);
4202*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(kHalfSize, 0, kHalfSize, kHalfSize, GLColor::green);
4203*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, kHalfSize, kHalfSize, kHalfSize, GLColor::blue);
4204*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(kHalfSize, kHalfSize, kHalfSize, kHalfSize, GLColor::yellow);
4205*8975f5c5SAndroid Build Coastguard Worker }
4206*8975f5c5SAndroid Build Coastguard Worker
4207*8975f5c5SAndroid Build Coastguard Worker // Tests different samplers can be used with same texture obj on different tex units.
TEST_P(SimpleStateChangeTestES3,MultipleSamplersWithSingleTextureObject)4208*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, MultipleSamplersWithSingleTextureObject)
4209*8975f5c5SAndroid Build Coastguard Worker {
4210*8975f5c5SAndroid Build Coastguard Worker // Test overview - Create two separate sampler objects, initially with the same
4211*8975f5c5SAndroid Build Coastguard Worker // sampling args (NEAREST). Bind the same texture object to separate texture units.
4212*8975f5c5SAndroid Build Coastguard Worker // FS samples from two samplers and blends result.
4213*8975f5c5SAndroid Build Coastguard Worker // Bind separate sampler objects to the same texture units as the texture object.
4214*8975f5c5SAndroid Build Coastguard Worker // Render & verify initial results
4215*8975f5c5SAndroid Build Coastguard Worker // Next modify sampler0 to have LINEAR filtering instead of NEAREST
4216*8975f5c5SAndroid Build Coastguard Worker // Render and save results
4217*8975f5c5SAndroid Build Coastguard Worker // Now restore sampler0 to NEAREST filtering and make sampler1 LINEAR
4218*8975f5c5SAndroid Build Coastguard Worker // Render and verify results are the same as previous
4219*8975f5c5SAndroid Build Coastguard Worker
4220*8975f5c5SAndroid Build Coastguard Worker // Create 2 samplers with NEAREST filtering.
4221*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kNumSamplers = 2;
4222*8975f5c5SAndroid Build Coastguard Worker // We create/bind an extra sampler w/o bound tex object for testing purposes
4223*8975f5c5SAndroid Build Coastguard Worker GLSampler samplers[kNumSamplers + 1];
4224*8975f5c5SAndroid Build Coastguard Worker // Set samplers to initially have same state w/ NEAREST filter mode
4225*8975f5c5SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kNumSamplers + 1; ++i)
4226*8975f5c5SAndroid Build Coastguard Worker {
4227*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[i], GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
4228*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[i], GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4229*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[i], GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4230*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[i], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4231*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[i], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4232*8975f5c5SAndroid Build Coastguard Worker glSamplerParameterf(samplers[i], GL_TEXTURE_MAX_LOD, 1000);
4233*8975f5c5SAndroid Build Coastguard Worker glSamplerParameterf(samplers[i], GL_TEXTURE_MIN_LOD, -1000);
4234*8975f5c5SAndroid Build Coastguard Worker glBindSampler(i, samplers[i]);
4235*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4236*8975f5c5SAndroid Build Coastguard Worker }
4237*8975f5c5SAndroid Build Coastguard Worker
4238*8975f5c5SAndroid Build Coastguard Worker // Create a simple texture with four colors
4239*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 2;
4240*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> pixels = {
4241*8975f5c5SAndroid Build Coastguard Worker {GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
4242*8975f5c5SAndroid Build Coastguard Worker GLTexture rgbyTex;
4243*8975f5c5SAndroid Build Coastguard Worker // Bind same texture object to tex units 0 & 1
4244*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
4245*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, rgbyTex);
4246*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE1);
4247*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, rgbyTex);
4248*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
4249*8975f5c5SAndroid Build Coastguard Worker pixels.data());
4250*8975f5c5SAndroid Build Coastguard Worker
4251*8975f5c5SAndroid Build Coastguard Worker // Create a program that uses the texture with 2 separate samplers.
4252*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision mediump float;
4253*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
4254*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D samp1;
4255*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D samp2;
4256*8975f5c5SAndroid Build Coastguard Worker void main()
4257*8975f5c5SAndroid Build Coastguard Worker {
4258*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = mix(texture2D(samp1, v_texCoord), texture2D(samp2, v_texCoord), 0.5);
4259*8975f5c5SAndroid Build Coastguard Worker })";
4260*8975f5c5SAndroid Build Coastguard Worker
4261*8975f5c5SAndroid Build Coastguard Worker // Create program and bind samplers to tex units 0 & 1
4262*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), kFS);
4263*8975f5c5SAndroid Build Coastguard Worker GLint s1loc = glGetUniformLocation(program, "samp1");
4264*8975f5c5SAndroid Build Coastguard Worker GLint s2loc = glGetUniformLocation(program, "samp2");
4265*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
4266*8975f5c5SAndroid Build Coastguard Worker glUniform1i(s1loc, 0);
4267*8975f5c5SAndroid Build Coastguard Worker glUniform1i(s2loc, 1);
4268*8975f5c5SAndroid Build Coastguard Worker // Draw. This first draw is a confidence check and not really necessary for the test
4269*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.5f);
4270*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4271*8975f5c5SAndroid Build Coastguard Worker
4272*8975f5c5SAndroid Build Coastguard Worker constexpr int kHalfSize = kWindowSize / 2;
4273*8975f5c5SAndroid Build Coastguard Worker
4274*8975f5c5SAndroid Build Coastguard Worker // When rendering w/ NEAREST, colors are all maxed out so should still be solid
4275*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kHalfSize, kHalfSize, GLColor::red);
4276*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(kHalfSize, 0, kHalfSize, kHalfSize, GLColor::green);
4277*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, kHalfSize, kHalfSize, kHalfSize, GLColor::blue);
4278*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(kHalfSize, kHalfSize, kHalfSize, kHalfSize, GLColor::yellow);
4279*8975f5c5SAndroid Build Coastguard Worker
4280*8975f5c5SAndroid Build Coastguard Worker // Make first sampler use linear filtering
4281*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[0], GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4282*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[0], GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4283*8975f5c5SAndroid Build Coastguard Worker
4284*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.5f);
4285*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4286*8975f5c5SAndroid Build Coastguard Worker // Capture rendered pixel color with s0 linear
4287*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> s0LinearColors(kWindowSize * kWindowSize);
4288*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, kWindowSize, kWindowSize, GL_RGBA, GL_UNSIGNED_BYTE, s0LinearColors.data());
4289*8975f5c5SAndroid Build Coastguard Worker
4290*8975f5c5SAndroid Build Coastguard Worker // Now restore first sampler & update second sampler
4291*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[0], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4292*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[0], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4293*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[1], GL_TEXTURE_MIN_FILTER, GL_LINEAR);
4294*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[1], GL_TEXTURE_MAG_FILTER, GL_LINEAR);
4295*8975f5c5SAndroid Build Coastguard Worker
4296*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.5f);
4297*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4298*8975f5c5SAndroid Build Coastguard Worker // Capture rendered pixel color w/ s1 linear
4299*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> s1LinearColors(kWindowSize * kWindowSize);
4300*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, kWindowSize, kWindowSize, GL_RGBA, GL_UNSIGNED_BYTE, s1LinearColors.data());
4301*8975f5c5SAndroid Build Coastguard Worker // Results should be the same regardless of if s0 or s1 is linear
4302*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(s0LinearColors, s1LinearColors);
4303*8975f5c5SAndroid Build Coastguard Worker }
4304*8975f5c5SAndroid Build Coastguard Worker
4305*8975f5c5SAndroid Build Coastguard Worker // Tests that rendering works as expected with multiple VAOs.
TEST_P(SimpleStateChangeTestES31,MultipleVertexArrayObjectRendering)4306*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, MultipleVertexArrayObjectRendering)
4307*8975f5c5SAndroid Build Coastguard Worker {
4308*8975f5c5SAndroid Build Coastguard Worker constexpr char kVertexShader[] = R"(attribute vec4 a_position;
4309*8975f5c5SAndroid Build Coastguard Worker attribute vec4 a_color;
4310*8975f5c5SAndroid Build Coastguard Worker varying vec4 v_color;
4311*8975f5c5SAndroid Build Coastguard Worker void main()
4312*8975f5c5SAndroid Build Coastguard Worker {
4313*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
4314*8975f5c5SAndroid Build Coastguard Worker v_color = a_color;
4315*8975f5c5SAndroid Build Coastguard Worker })";
4316*8975f5c5SAndroid Build Coastguard Worker
4317*8975f5c5SAndroid Build Coastguard Worker constexpr char kFragmentShader[] = R"(precision mediump float;
4318*8975f5c5SAndroid Build Coastguard Worker varying vec4 v_color;
4319*8975f5c5SAndroid Build Coastguard Worker void main()
4320*8975f5c5SAndroid Build Coastguard Worker {
4321*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = v_color;
4322*8975f5c5SAndroid Build Coastguard Worker })";
4323*8975f5c5SAndroid Build Coastguard Worker
4324*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(mProgram, kVertexShader, kFragmentShader);
4325*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(mProgram, "a_position");
4326*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
4327*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetAttribLocation(mProgram, "a_color");
4328*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
4329*8975f5c5SAndroid Build Coastguard Worker
4330*8975f5c5SAndroid Build Coastguard Worker GLVertexArray VAOS[2];
4331*8975f5c5SAndroid Build Coastguard Worker GLBuffer positionBuffer;
4332*8975f5c5SAndroid Build Coastguard Worker GLBuffer colorBuffer;
4333*8975f5c5SAndroid Build Coastguard Worker const auto quadVertices = GetQuadVertices();
4334*8975f5c5SAndroid Build Coastguard Worker
4335*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(VAOS[0]);
4336*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
4337*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, quadVertices.size() * sizeof(Vector3), quadVertices.data(),
4338*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
4339*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
4340*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_BYTE, GL_FALSE, 0, 0);
4341*8975f5c5SAndroid Build Coastguard Worker
4342*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
4343*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor32F> blueColor(6, kFloatBlue);
4344*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, blueColor.size() * sizeof(GLColor32F), blueColor.data(),
4345*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
4346*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
4347*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 4, GL_BYTE, GL_FALSE, 0, 0);
4348*8975f5c5SAndroid Build Coastguard Worker
4349*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(0);
4350*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
4351*8975f5c5SAndroid Build Coastguard Worker
4352*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(VAOS[1]);
4353*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
4354*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, quadVertices.size() * sizeof(Vector3), quadVertices.data(),
4355*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
4356*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
4357*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, 0);
4358*8975f5c5SAndroid Build Coastguard Worker
4359*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
4360*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor32F> greenColor(6, kFloatGreen);
4361*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, greenColor.size() * sizeof(GLColor32F), greenColor.data(),
4362*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
4363*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
4364*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 4, GL_FLOAT, GL_FALSE, 0, 0);
4365*8975f5c5SAndroid Build Coastguard Worker
4366*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(0);
4367*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
4368*8975f5c5SAndroid Build Coastguard Worker
4369*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
4370*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4371*8975f5c5SAndroid Build Coastguard Worker
4372*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(VAOS[1]);
4373*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
4374*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4375*8975f5c5SAndroid Build Coastguard Worker
4376*8975f5c5SAndroid Build Coastguard Worker // This drawing should not affect the next drawing.
4377*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(VAOS[0]);
4378*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
4379*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4380*8975f5c5SAndroid Build Coastguard Worker
4381*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(VAOS[1]);
4382*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
4383*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4384*8975f5c5SAndroid Build Coastguard Worker
4385*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4386*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, getWindowHeight() / 2, GLColor::green);
4387*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::green);
4388*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
4389*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, 0, GLColor::green);
4390*8975f5c5SAndroid Build Coastguard Worker
4391*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
4392*8975f5c5SAndroid Build Coastguard Worker }
4393*8975f5c5SAndroid Build Coastguard Worker
4394*8975f5c5SAndroid Build Coastguard Worker // Tests that consecutive identical draw calls that write to an image in the fragment shader work
4395*8975f5c5SAndroid Build Coastguard Worker // correctly. This requires a memory barrier in between the draw calls which should not be
4396*8975f5c5SAndroid Build Coastguard Worker // reordered w.r.t the calls.
TEST_P(SimpleStateChangeTestES31,DrawWithImageTextureThenDrawAgain)4397*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, DrawWithImageTextureThenDrawAgain)
4398*8975f5c5SAndroid Build Coastguard Worker {
4399*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42264124
4400*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsD3D11());
4401*8975f5c5SAndroid Build Coastguard Worker
4402*8975f5c5SAndroid Build Coastguard Worker GLint maxFragmentImageUniforms;
4403*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_FRAGMENT_IMAGE_UNIFORMS, &maxFragmentImageUniforms);
4404*8975f5c5SAndroid Build Coastguard Worker
4405*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(maxFragmentImageUniforms < 1);
4406*8975f5c5SAndroid Build Coastguard Worker
4407*8975f5c5SAndroid Build Coastguard Worker // The test uses a GL_R32F framebuffer.
4408*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_float"));
4409*8975f5c5SAndroid Build Coastguard Worker
4410*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 1;
4411*8975f5c5SAndroid Build Coastguard Worker
4412*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
4413*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
4414*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
4415*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4416*8975f5c5SAndroid Build Coastguard Worker
4417*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
4418*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4419*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
4420*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4421*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4422*8975f5c5SAndroid Build Coastguard Worker
4423*8975f5c5SAndroid Build Coastguard Worker const float kInitialValue = 0.125f;
4424*8975f5c5SAndroid Build Coastguard Worker
4425*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
4426*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
4427*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, kSize, kSize);
4428*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_RED, GL_FLOAT, &kInitialValue);
4429*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4430*8975f5c5SAndroid Build Coastguard Worker
4431*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer readbackFbo;
4432*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, readbackFbo);
4433*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
4434*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
4435*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4436*8975f5c5SAndroid Build Coastguard Worker
4437*8975f5c5SAndroid Build Coastguard Worker // Create a program that outputs to the image in the fragment shader.
4438*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 310 es
4439*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
4440*8975f5c5SAndroid Build Coastguard Worker layout(r32f, binding = 0) uniform highp image2D dst;
4441*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
4442*8975f5c5SAndroid Build Coastguard Worker void main()
4443*8975f5c5SAndroid Build Coastguard Worker {
4444*8975f5c5SAndroid Build Coastguard Worker vec4 result = imageLoad(dst, ivec2(gl_FragCoord.xy));
4445*8975f5c5SAndroid Build Coastguard Worker colorOut = result;
4446*8975f5c5SAndroid Build Coastguard Worker
4447*8975f5c5SAndroid Build Coastguard Worker result.x += 0.193;
4448*8975f5c5SAndroid Build Coastguard Worker imageStore(dst, ivec2(gl_FragCoord.xy), result);
4449*8975f5c5SAndroid Build Coastguard Worker })";
4450*8975f5c5SAndroid Build Coastguard Worker
4451*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kFS);
4452*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
4453*8975f5c5SAndroid Build Coastguard Worker
4454*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, essl31_shaders::PositionAttrib());
4455*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
4456*8975f5c5SAndroid Build Coastguard Worker
4457*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(0, texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
4458*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4459*8975f5c5SAndroid Build Coastguard Worker
4460*8975f5c5SAndroid Build Coastguard Worker // Setup the draw so that there's no state change between the draw calls.
4461*8975f5c5SAndroid Build Coastguard Worker const std::array<Vector3, 6> &quadVertices = GetQuadVertices();
4462*8975f5c5SAndroid Build Coastguard Worker const size_t posBufferSize = quadVertices.size() * sizeof(Vector3);
4463*8975f5c5SAndroid Build Coastguard Worker
4464*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
4465*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
4466*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, posBufferSize, quadVertices.data(), GL_STATIC_DRAW);
4467*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
4468*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
4469*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4470*8975f5c5SAndroid Build Coastguard Worker
4471*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4472*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
4473*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4474*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4475*8975f5c5SAndroid Build Coastguard Worker
4476*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
4477*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4478*8975f5c5SAndroid Build Coastguard Worker
4479*8975f5c5SAndroid Build Coastguard Worker // Verify the output of the two draw calls through the image is correct
4480*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR32F_NEAR(0, 0, GLColor32F(kInitialValue + 0.193f * 2, 0.0f, 0.0f, 1.0f),
4481*8975f5c5SAndroid Build Coastguard Worker 0.001f);
4482*8975f5c5SAndroid Build Coastguard Worker
4483*8975f5c5SAndroid Build Coastguard Worker // Verify the output of rendering as well
4484*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
4485*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(81, 0, 0, 255), 1);
4486*8975f5c5SAndroid Build Coastguard Worker }
4487*8975f5c5SAndroid Build Coastguard Worker
4488*8975f5c5SAndroid Build Coastguard Worker // Tests that sampling from a texture in one draw call followed by writing to its image in another
4489*8975f5c5SAndroid Build Coastguard Worker // draw call works correctly. This requires a barrier in between the draw calls.
TEST_P(SimpleStateChangeTestES31,DrawWithTextureThenDrawWithImage)4490*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, DrawWithTextureThenDrawWithImage)
4491*8975f5c5SAndroid Build Coastguard Worker {
4492*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42264124
4493*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsD3D11());
4494*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42264222
4495*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsDesktopOpenGL());
4496*8975f5c5SAndroid Build Coastguard Worker
4497*8975f5c5SAndroid Build Coastguard Worker GLint maxFragmentImageUniforms;
4498*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_FRAGMENT_IMAGE_UNIFORMS, &maxFragmentImageUniforms);
4499*8975f5c5SAndroid Build Coastguard Worker
4500*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(maxFragmentImageUniforms < 1);
4501*8975f5c5SAndroid Build Coastguard Worker
4502*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 1;
4503*8975f5c5SAndroid Build Coastguard Worker
4504*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
4505*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
4506*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
4507*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4508*8975f5c5SAndroid Build Coastguard Worker
4509*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
4510*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4511*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
4512*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4513*8975f5c5SAndroid Build Coastguard Worker
4514*8975f5c5SAndroid Build Coastguard Worker const GLColor kInitialColor = GLColor::red;
4515*8975f5c5SAndroid Build Coastguard Worker
4516*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
4517*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
4518*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
4519*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE,
4520*8975f5c5SAndroid Build Coastguard Worker &kInitialColor);
4521*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4522*8975f5c5SAndroid Build Coastguard Worker
4523*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer readbackFbo;
4524*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, readbackFbo);
4525*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
4526*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4527*8975f5c5SAndroid Build Coastguard Worker
4528*8975f5c5SAndroid Build Coastguard Worker // Create a program that samples from the texture in the fragment shader.
4529*8975f5c5SAndroid Build Coastguard Worker constexpr char kFSSample[] = R"(#version 310 es
4530*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
4531*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
4532*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
4533*8975f5c5SAndroid Build Coastguard Worker void main()
4534*8975f5c5SAndroid Build Coastguard Worker {
4535*8975f5c5SAndroid Build Coastguard Worker colorOut = texture(tex, vec2(0));
4536*8975f5c5SAndroid Build Coastguard Worker })";
4537*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(sampleProgram, essl31_shaders::vs::Simple(), kFSSample);
4538*8975f5c5SAndroid Build Coastguard Worker
4539*8975f5c5SAndroid Build Coastguard Worker // Create a program that outputs to the image in the fragment shader.
4540*8975f5c5SAndroid Build Coastguard Worker constexpr char kFSWrite[] = R"(#version 310 es
4541*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
4542*8975f5c5SAndroid Build Coastguard Worker layout(rgba8, binding = 0) uniform highp writeonly image2D dst;
4543*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
4544*8975f5c5SAndroid Build Coastguard Worker void main()
4545*8975f5c5SAndroid Build Coastguard Worker {
4546*8975f5c5SAndroid Build Coastguard Worker colorOut = vec4(0, 0, 1.0, 0);
4547*8975f5c5SAndroid Build Coastguard Worker imageStore(dst, ivec2(gl_FragCoord.xy), vec4(0.0, 1.0, 0.0, 1.0));
4548*8975f5c5SAndroid Build Coastguard Worker })";
4549*8975f5c5SAndroid Build Coastguard Worker
4550*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(writeProgram, essl31_shaders::vs::Simple(), kFSWrite);
4551*8975f5c5SAndroid Build Coastguard Worker
4552*8975f5c5SAndroid Build Coastguard Worker glUseProgram(sampleProgram);
4553*8975f5c5SAndroid Build Coastguard Worker GLint positionLocSample = glGetAttribLocation(sampleProgram, essl31_shaders::PositionAttrib());
4554*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocSample);
4555*8975f5c5SAndroid Build Coastguard Worker
4556*8975f5c5SAndroid Build Coastguard Worker glUseProgram(writeProgram);
4557*8975f5c5SAndroid Build Coastguard Worker GLint positionLocWrite = glGetAttribLocation(writeProgram, essl31_shaders::PositionAttrib());
4558*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocWrite);
4559*8975f5c5SAndroid Build Coastguard Worker
4560*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(0, texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8);
4561*8975f5c5SAndroid Build Coastguard Worker
4562*8975f5c5SAndroid Build Coastguard Worker // Setup the draw so that there's no state change between the draw calls.
4563*8975f5c5SAndroid Build Coastguard Worker const std::array<Vector3, 6> &quadVertices = GetQuadVertices();
4564*8975f5c5SAndroid Build Coastguard Worker const size_t posBufferSize = quadVertices.size() * sizeof(Vector3);
4565*8975f5c5SAndroid Build Coastguard Worker
4566*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
4567*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
4568*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, posBufferSize, quadVertices.data(), GL_STATIC_DRAW);
4569*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocSample, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
4570*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocWrite, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
4571*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocSample);
4572*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocWrite);
4573*8975f5c5SAndroid Build Coastguard Worker
4574*8975f5c5SAndroid Build Coastguard Worker glUseProgram(sampleProgram);
4575*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4576*8975f5c5SAndroid Build Coastguard Worker
4577*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
4578*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
4579*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
4580*8975f5c5SAndroid Build Coastguard Worker
4581*8975f5c5SAndroid Build Coastguard Worker glUseProgram(writeProgram);
4582*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4583*8975f5c5SAndroid Build Coastguard Worker
4584*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
4585*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4586*8975f5c5SAndroid Build Coastguard Worker
4587*8975f5c5SAndroid Build Coastguard Worker // Verify the output of the two draw calls through the image is correct
4588*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
4589*8975f5c5SAndroid Build Coastguard Worker
4590*8975f5c5SAndroid Build Coastguard Worker // Verify the output of rendering as well
4591*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
4592*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::magenta);
4593*8975f5c5SAndroid Build Coastguard Worker }
4594*8975f5c5SAndroid Build Coastguard Worker
4595*8975f5c5SAndroid Build Coastguard Worker // Tests that reading from a ubo in one draw call followed by writing to it as SSBO in another draw
4596*8975f5c5SAndroid Build Coastguard Worker // call works correctly. This requires a barrier in between the draw calls.
TEST_P(SimpleStateChangeTestES31,DrawWithUBOThenDrawWithSSBO)4597*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, DrawWithUBOThenDrawWithSSBO)
4598*8975f5c5SAndroid Build Coastguard Worker {
4599*8975f5c5SAndroid Build Coastguard Worker GLint maxFragmentShaderStorageBlocks;
4600*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, &maxFragmentShaderStorageBlocks);
4601*8975f5c5SAndroid Build Coastguard Worker
4602*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(maxFragmentShaderStorageBlocks < 1);
4603*8975f5c5SAndroid Build Coastguard Worker
4604*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 1;
4605*8975f5c5SAndroid Build Coastguard Worker
4606*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
4607*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
4608*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
4609*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4610*8975f5c5SAndroid Build Coastguard Worker
4611*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
4612*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4613*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
4614*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4615*8975f5c5SAndroid Build Coastguard Worker
4616*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<float, 4> kBufferInitValue = {0.125f, 0.25f, 0.5f, 1.0f};
4617*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
4618*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_UNIFORM_BUFFER, buffer);
4619*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_UNIFORM_BUFFER, sizeof(kBufferInitValue), kBufferInitValue.data(),
4620*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
4621*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer);
4622*8975f5c5SAndroid Build Coastguard Worker
4623*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
4624*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffer);
4625*8975f5c5SAndroid Build Coastguard Worker
4626*8975f5c5SAndroid Build Coastguard Worker // Create a program that reads from the ubo in the fragment shader.
4627*8975f5c5SAndroid Build Coastguard Worker constexpr char kFSRead[] = R"(#version 310 es
4628*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
4629*8975f5c5SAndroid Build Coastguard Worker uniform block { vec4 vec; } b;
4630*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
4631*8975f5c5SAndroid Build Coastguard Worker void main()
4632*8975f5c5SAndroid Build Coastguard Worker {
4633*8975f5c5SAndroid Build Coastguard Worker colorOut = b.vec;
4634*8975f5c5SAndroid Build Coastguard Worker })";
4635*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(readProgram, essl31_shaders::vs::Simple(), kFSRead);
4636*8975f5c5SAndroid Build Coastguard Worker
4637*8975f5c5SAndroid Build Coastguard Worker // Create a program that outputs to the image in the fragment shader.
4638*8975f5c5SAndroid Build Coastguard Worker constexpr char kFSWrite[] = R"(#version 310 es
4639*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
4640*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, std430) buffer Output {
4641*8975f5c5SAndroid Build Coastguard Worker vec4 vec;
4642*8975f5c5SAndroid Build Coastguard Worker } b;
4643*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
4644*8975f5c5SAndroid Build Coastguard Worker void main()
4645*8975f5c5SAndroid Build Coastguard Worker {
4646*8975f5c5SAndroid Build Coastguard Worker b.vec = vec4(0.7, 0.6, 0.4, 0.3);
4647*8975f5c5SAndroid Build Coastguard Worker colorOut = vec4(0.125, 0.125, 0.125, 0);
4648*8975f5c5SAndroid Build Coastguard Worker })";
4649*8975f5c5SAndroid Build Coastguard Worker
4650*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(writeProgram, essl31_shaders::vs::Simple(), kFSWrite);
4651*8975f5c5SAndroid Build Coastguard Worker
4652*8975f5c5SAndroid Build Coastguard Worker glUseProgram(readProgram);
4653*8975f5c5SAndroid Build Coastguard Worker GLint positionLocRead = glGetAttribLocation(readProgram, essl31_shaders::PositionAttrib());
4654*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocRead);
4655*8975f5c5SAndroid Build Coastguard Worker
4656*8975f5c5SAndroid Build Coastguard Worker glUseProgram(writeProgram);
4657*8975f5c5SAndroid Build Coastguard Worker GLint positionLocWrite = glGetAttribLocation(writeProgram, essl31_shaders::PositionAttrib());
4658*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocWrite);
4659*8975f5c5SAndroid Build Coastguard Worker
4660*8975f5c5SAndroid Build Coastguard Worker // Setup the draw so that there's no state change between the draw calls.
4661*8975f5c5SAndroid Build Coastguard Worker const std::array<Vector3, 6> &quadVertices = GetQuadVertices();
4662*8975f5c5SAndroid Build Coastguard Worker const size_t posBufferSize = quadVertices.size() * sizeof(Vector3);
4663*8975f5c5SAndroid Build Coastguard Worker
4664*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
4665*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
4666*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, posBufferSize, quadVertices.data(), GL_STATIC_DRAW);
4667*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocRead, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
4668*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocWrite, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
4669*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocRead);
4670*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocWrite);
4671*8975f5c5SAndroid Build Coastguard Worker
4672*8975f5c5SAndroid Build Coastguard Worker glUseProgram(readProgram);
4673*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4674*8975f5c5SAndroid Build Coastguard Worker
4675*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
4676*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
4677*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
4678*8975f5c5SAndroid Build Coastguard Worker
4679*8975f5c5SAndroid Build Coastguard Worker glUseProgram(writeProgram);
4680*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4681*8975f5c5SAndroid Build Coastguard Worker
4682*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
4683*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4684*8975f5c5SAndroid Build Coastguard Worker
4685*8975f5c5SAndroid Build Coastguard Worker // Verify the output of rendering
4686*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(63, 95, 159, 255), 1);
4687*8975f5c5SAndroid Build Coastguard Worker
4688*8975f5c5SAndroid Build Coastguard Worker // Verify the output from the second draw call
4689*8975f5c5SAndroid Build Coastguard Worker const float *ptr = reinterpret_cast<const float *>(
4690*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(kBufferInitValue), GL_MAP_READ_BIT));
4691*8975f5c5SAndroid Build Coastguard Worker
4692*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(ptr[0], 0.7f, 0.001);
4693*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(ptr[1], 0.6f, 0.001);
4694*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(ptr[2], 0.4f, 0.001);
4695*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(ptr[3], 0.3f, 0.001);
4696*8975f5c5SAndroid Build Coastguard Worker
4697*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
4698*8975f5c5SAndroid Build Coastguard Worker }
4699*8975f5c5SAndroid Build Coastguard Worker
4700*8975f5c5SAndroid Build Coastguard Worker // Tests that writing to an SSBO in the fragment shader before and after a change to the drawbuffers
4701*8975f5c5SAndroid Build Coastguard Worker // still works
TEST_P(SimpleStateChangeTestES31,FragWriteSSBOThenChangeDrawbuffersThenWriteSSBO)4702*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, FragWriteSSBOThenChangeDrawbuffersThenWriteSSBO)
4703*8975f5c5SAndroid Build Coastguard Worker {
4704*8975f5c5SAndroid Build Coastguard Worker GLint maxFragmentShaderStorageBlocks;
4705*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, &maxFragmentShaderStorageBlocks);
4706*8975f5c5SAndroid Build Coastguard Worker
4707*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(maxFragmentShaderStorageBlocks < 1);
4708*8975f5c5SAndroid Build Coastguard Worker
4709*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 1;
4710*8975f5c5SAndroid Build Coastguard Worker
4711*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
4712*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
4713*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
4714*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4715*8975f5c5SAndroid Build Coastguard Worker
4716*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
4717*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4718*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
4719*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4720*8975f5c5SAndroid Build Coastguard Worker
4721*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<float, 4> kBufferInitValue = {0.125f, 0.25f, 0.5f, 1.0f};
4722*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
4723*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
4724*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(kBufferInitValue), kBufferInitValue.data(),
4725*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
4726*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffer);
4727*8975f5c5SAndroid Build Coastguard Worker
4728*8975f5c5SAndroid Build Coastguard Worker // Create a program that writes to the SSBO in the fragment shader.
4729*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 310 es
4730*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
4731*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, std430) buffer Output {
4732*8975f5c5SAndroid Build Coastguard Worker vec4 value;
4733*8975f5c5SAndroid Build Coastguard Worker } b;
4734*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
4735*8975f5c5SAndroid Build Coastguard Worker uniform vec4 value;
4736*8975f5c5SAndroid Build Coastguard Worker void main()
4737*8975f5c5SAndroid Build Coastguard Worker {
4738*8975f5c5SAndroid Build Coastguard Worker b.value = value;
4739*8975f5c5SAndroid Build Coastguard Worker colorOut = vec4(1, 1, 1, 0);
4740*8975f5c5SAndroid Build Coastguard Worker })";
4741*8975f5c5SAndroid Build Coastguard Worker
4742*8975f5c5SAndroid Build Coastguard Worker GLuint vs = CompileShader(GL_VERTEX_SHADER, essl31_shaders::vs::Simple());
4743*8975f5c5SAndroid Build Coastguard Worker GLuint fs = CompileShader(GL_FRAGMENT_SHADER, kFS);
4744*8975f5c5SAndroid Build Coastguard Worker
4745*8975f5c5SAndroid Build Coastguard Worker const GLuint program = glCreateProgram();
4746*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, vs);
4747*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, fs);
4748*8975f5c5SAndroid Build Coastguard Worker glLinkProgram(program);
4749*8975f5c5SAndroid Build Coastguard Worker CheckLinkStatusAndReturnProgram(program, true);
4750*8975f5c5SAndroid Build Coastguard Worker
4751*8975f5c5SAndroid Build Coastguard Worker // Detach the shaders, so any draw-time shader rewriting won't be able to use them.
4752*8975f5c5SAndroid Build Coastguard Worker glDetachShader(program, vs);
4753*8975f5c5SAndroid Build Coastguard Worker glDetachShader(program, fs);
4754*8975f5c5SAndroid Build Coastguard Worker
4755*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
4756*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, essl31_shaders::PositionAttrib());
4757*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
4758*8975f5c5SAndroid Build Coastguard Worker GLint valueLoc = glGetUniformLocation(program, "value");
4759*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, valueLoc);
4760*8975f5c5SAndroid Build Coastguard Worker
4761*8975f5c5SAndroid Build Coastguard Worker const std::array<Vector3, 6> &quadVertices = GetQuadVertices();
4762*8975f5c5SAndroid Build Coastguard Worker const size_t posBufferSize = quadVertices.size() * sizeof(Vector3);
4763*8975f5c5SAndroid Build Coastguard Worker
4764*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
4765*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
4766*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, posBufferSize, quadVertices.data(), GL_STATIC_DRAW);
4767*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
4768*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
4769*8975f5c5SAndroid Build Coastguard Worker
4770*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
4771*8975f5c5SAndroid Build Coastguard Worker constexpr float kValue1[4] = {0.1f, 0.2f, 0.3f, 0.4f};
4772*8975f5c5SAndroid Build Coastguard Worker
4773*8975f5c5SAndroid Build Coastguard Worker glUniform4fv(valueLoc, 1, kValue1);
4774*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4775*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
4776*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4777*8975f5c5SAndroid Build Coastguard Worker
4778*8975f5c5SAndroid Build Coastguard Worker // Verify that the program wrote the SSBO correctly.
4779*8975f5c5SAndroid Build Coastguard Worker const float *ptr = reinterpret_cast<const float *>(
4780*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(kBufferInitValue), GL_MAP_READ_BIT));
4781*8975f5c5SAndroid Build Coastguard Worker
4782*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i)
4783*8975f5c5SAndroid Build Coastguard Worker {
4784*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(ptr[i], kValue1[i], 0.001);
4785*8975f5c5SAndroid Build Coastguard Worker }
4786*8975f5c5SAndroid Build Coastguard Worker
4787*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
4788*8975f5c5SAndroid Build Coastguard Worker
4789*8975f5c5SAndroid Build Coastguard Worker GLenum drawBuffers[] = {GL_NONE};
4790*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(1, drawBuffers);
4791*8975f5c5SAndroid Build Coastguard Worker
4792*8975f5c5SAndroid Build Coastguard Worker constexpr float kValue2[4] = {0.5f, 0.6f, 0.7f, 0.9f};
4793*8975f5c5SAndroid Build Coastguard Worker glUniform4fv(valueLoc, 1, kValue2);
4794*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4795*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
4796*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4797*8975f5c5SAndroid Build Coastguard Worker // Verify that the program wrote the SSBO correctly.
4798*8975f5c5SAndroid Build Coastguard Worker ptr = reinterpret_cast<const float *>(
4799*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(kBufferInitValue), GL_MAP_READ_BIT));
4800*8975f5c5SAndroid Build Coastguard Worker
4801*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i)
4802*8975f5c5SAndroid Build Coastguard Worker {
4803*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(ptr[i], kValue2[i], 0.001);
4804*8975f5c5SAndroid Build Coastguard Worker }
4805*8975f5c5SAndroid Build Coastguard Worker
4806*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
4807*8975f5c5SAndroid Build Coastguard Worker }
4808*8975f5c5SAndroid Build Coastguard Worker
4809*8975f5c5SAndroid Build Coastguard Worker // Tests that writing to an SSBO in the vertex shader before and after a change to the drawbuffers
4810*8975f5c5SAndroid Build Coastguard Worker // still works
TEST_P(SimpleStateChangeTestES31,VertWriteSSBOThenChangeDrawbuffersThenWriteSSBO)4811*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, VertWriteSSBOThenChangeDrawbuffersThenWriteSSBO)
4812*8975f5c5SAndroid Build Coastguard Worker {
4813*8975f5c5SAndroid Build Coastguard Worker GLint maxVertexShaderStorageBlocks;
4814*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS, &maxVertexShaderStorageBlocks);
4815*8975f5c5SAndroid Build Coastguard Worker
4816*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(maxVertexShaderStorageBlocks < 1);
4817*8975f5c5SAndroid Build Coastguard Worker
4818*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 1;
4819*8975f5c5SAndroid Build Coastguard Worker
4820*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
4821*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
4822*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
4823*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4824*8975f5c5SAndroid Build Coastguard Worker
4825*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
4826*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4827*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
4828*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4829*8975f5c5SAndroid Build Coastguard Worker
4830*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<float, 4> kBufferInitValue = {0.125f, 0.25f, 0.5f, 1.0f};
4831*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
4832*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
4833*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(kBufferInitValue), kBufferInitValue.data(),
4834*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
4835*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffer);
4836*8975f5c5SAndroid Build Coastguard Worker
4837*8975f5c5SAndroid Build Coastguard Worker // Create a program that writes to the SSBO in the vertex shader.
4838*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 310 es
4839*8975f5c5SAndroid Build Coastguard Worker in vec4 a_position;
4840*8975f5c5SAndroid Build Coastguard Worker uniform vec4 value;
4841*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, std430) buffer Output {
4842*8975f5c5SAndroid Build Coastguard Worker vec4 value;
4843*8975f5c5SAndroid Build Coastguard Worker } b;
4844*8975f5c5SAndroid Build Coastguard Worker void main()
4845*8975f5c5SAndroid Build Coastguard Worker {
4846*8975f5c5SAndroid Build Coastguard Worker b.value = value;
4847*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
4848*8975f5c5SAndroid Build Coastguard Worker })";
4849*8975f5c5SAndroid Build Coastguard Worker
4850*8975f5c5SAndroid Build Coastguard Worker GLuint vs = CompileShader(GL_VERTEX_SHADER, kVS);
4851*8975f5c5SAndroid Build Coastguard Worker GLuint fs = CompileShader(GL_FRAGMENT_SHADER, essl31_shaders::fs::Green());
4852*8975f5c5SAndroid Build Coastguard Worker
4853*8975f5c5SAndroid Build Coastguard Worker const GLuint program = glCreateProgram();
4854*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, vs);
4855*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, fs);
4856*8975f5c5SAndroid Build Coastguard Worker glLinkProgram(program);
4857*8975f5c5SAndroid Build Coastguard Worker CheckLinkStatusAndReturnProgram(program, true);
4858*8975f5c5SAndroid Build Coastguard Worker
4859*8975f5c5SAndroid Build Coastguard Worker // Detach the shaders, so any draw-time shader rewriting won't be able to use them.
4860*8975f5c5SAndroid Build Coastguard Worker glDetachShader(program, vs);
4861*8975f5c5SAndroid Build Coastguard Worker glDetachShader(program, fs);
4862*8975f5c5SAndroid Build Coastguard Worker
4863*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
4864*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, essl31_shaders::PositionAttrib());
4865*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
4866*8975f5c5SAndroid Build Coastguard Worker GLint valueLoc = glGetUniformLocation(program, "value");
4867*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, valueLoc);
4868*8975f5c5SAndroid Build Coastguard Worker
4869*8975f5c5SAndroid Build Coastguard Worker const std::array<Vector3, 6> &quadVertices = GetQuadVertices();
4870*8975f5c5SAndroid Build Coastguard Worker const size_t posBufferSize = quadVertices.size() * sizeof(Vector3);
4871*8975f5c5SAndroid Build Coastguard Worker
4872*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
4873*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
4874*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, posBufferSize, quadVertices.data(), GL_STATIC_DRAW);
4875*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
4876*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
4877*8975f5c5SAndroid Build Coastguard Worker
4878*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
4879*8975f5c5SAndroid Build Coastguard Worker constexpr float kValue1[4] = {0.1f, 0.2f, 0.3f, 0.4f};
4880*8975f5c5SAndroid Build Coastguard Worker
4881*8975f5c5SAndroid Build Coastguard Worker glUniform4fv(valueLoc, 1, kValue1);
4882*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4883*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
4884*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4885*8975f5c5SAndroid Build Coastguard Worker
4886*8975f5c5SAndroid Build Coastguard Worker // Verify that the program wrote the SSBO correctly.
4887*8975f5c5SAndroid Build Coastguard Worker const float *ptr = reinterpret_cast<const float *>(
4888*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(kBufferInitValue), GL_MAP_READ_BIT));
4889*8975f5c5SAndroid Build Coastguard Worker
4890*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i)
4891*8975f5c5SAndroid Build Coastguard Worker {
4892*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(ptr[i], kValue1[i], 0.001);
4893*8975f5c5SAndroid Build Coastguard Worker }
4894*8975f5c5SAndroid Build Coastguard Worker
4895*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
4896*8975f5c5SAndroid Build Coastguard Worker
4897*8975f5c5SAndroid Build Coastguard Worker GLenum drawBuffers[] = {GL_NONE};
4898*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(1, drawBuffers);
4899*8975f5c5SAndroid Build Coastguard Worker
4900*8975f5c5SAndroid Build Coastguard Worker constexpr float kValue2[4] = {0.5f, 0.6f, 0.7f, 0.9f};
4901*8975f5c5SAndroid Build Coastguard Worker glUniform4fv(valueLoc, 1, kValue2);
4902*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
4903*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
4904*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4905*8975f5c5SAndroid Build Coastguard Worker // Verify that the program wrote the SSBO correctly.
4906*8975f5c5SAndroid Build Coastguard Worker ptr = reinterpret_cast<const float *>(
4907*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(kBufferInitValue), GL_MAP_READ_BIT));
4908*8975f5c5SAndroid Build Coastguard Worker
4909*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i)
4910*8975f5c5SAndroid Build Coastguard Worker {
4911*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(ptr[i], kValue2[i], 0.001);
4912*8975f5c5SAndroid Build Coastguard Worker }
4913*8975f5c5SAndroid Build Coastguard Worker
4914*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
4915*8975f5c5SAndroid Build Coastguard Worker }
4916*8975f5c5SAndroid Build Coastguard Worker
4917*8975f5c5SAndroid Build Coastguard Worker // Tests that rendering to a texture in one draw call followed by sampling from it in a dispatch
4918*8975f5c5SAndroid Build Coastguard Worker // call works correctly. This requires an implicit barrier in between the calls.
TEST_P(SimpleStateChangeTestES31,DrawThenSampleWithCompute)4919*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, DrawThenSampleWithCompute)
4920*8975f5c5SAndroid Build Coastguard Worker {
4921*8975f5c5SAndroid Build Coastguard Worker // TODO(anglebug.com/42264185): Test is failing since it was introduced on Linux AMD GLES
4922*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && IsAMD() && IsLinux());
4923*8975f5c5SAndroid Build Coastguard Worker
4924*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 1;
4925*8975f5c5SAndroid Build Coastguard Worker const GLColor kInitColor(111, 222, 33, 44);
4926*8975f5c5SAndroid Build Coastguard Worker
4927*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
4928*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
4929*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
4930*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4931*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4932*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE, &kInitColor);
4933*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4934*8975f5c5SAndroid Build Coastguard Worker
4935*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
4936*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4937*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
4938*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4939*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4940*8975f5c5SAndroid Build Coastguard Worker
4941*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<float, 4> kBufferInitValue = {0.123f, 0.456f, 0.789f, 0.852f};
4942*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
4943*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
4944*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(kBufferInitValue), kBufferInitValue.data(),
4945*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
4946*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffer);
4947*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4948*8975f5c5SAndroid Build Coastguard Worker
4949*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawProgram, essl31_shaders::vs::Simple(), essl31_shaders::fs::Red());
4950*8975f5c5SAndroid Build Coastguard Worker
4951*8975f5c5SAndroid Build Coastguard Worker constexpr char kCS[] = R"(#version 310 es
4952*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=1, local_size_y=1) in;
4953*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
4954*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, std430) buffer Output {
4955*8975f5c5SAndroid Build Coastguard Worker vec4 vec;
4956*8975f5c5SAndroid Build Coastguard Worker } b;
4957*8975f5c5SAndroid Build Coastguard Worker void main()
4958*8975f5c5SAndroid Build Coastguard Worker {
4959*8975f5c5SAndroid Build Coastguard Worker b.vec = texelFetch(tex, ivec2(gl_LocalInvocationID.xy), 0);
4960*8975f5c5SAndroid Build Coastguard Worker })";
4961*8975f5c5SAndroid Build Coastguard Worker
4962*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_COMPUTE_PROGRAM(readProgram, kCS);
4963*8975f5c5SAndroid Build Coastguard Worker glUseProgram(readProgram);
4964*8975f5c5SAndroid Build Coastguard Worker
4965*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
4966*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(readProgram, "tex"), 0);
4967*8975f5c5SAndroid Build Coastguard Worker
4968*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawProgram, essl31_shaders::PositionAttrib(), 0.5f);
4969*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4970*8975f5c5SAndroid Build Coastguard Worker
4971*8975f5c5SAndroid Build Coastguard Worker glUseProgram(readProgram);
4972*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
4973*8975f5c5SAndroid Build Coastguard Worker
4974*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
4975*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
4976*8975f5c5SAndroid Build Coastguard Worker
4977*8975f5c5SAndroid Build Coastguard Worker // Verify the output of rendering
4978*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
4979*8975f5c5SAndroid Build Coastguard Worker
4980*8975f5c5SAndroid Build Coastguard Worker // Verify the output from the compute shader
4981*8975f5c5SAndroid Build Coastguard Worker const float *ptr = reinterpret_cast<const float *>(
4982*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(kBufferInitValue), GL_MAP_READ_BIT));
4983*8975f5c5SAndroid Build Coastguard Worker
4984*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(ptr[0], 1.0f);
4985*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(ptr[1], 0.0f);
4986*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(ptr[2], 0.0f);
4987*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(ptr[3], 1.0f);
4988*8975f5c5SAndroid Build Coastguard Worker
4989*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
4990*8975f5c5SAndroid Build Coastguard Worker }
4991*8975f5c5SAndroid Build Coastguard Worker
4992*8975f5c5SAndroid Build Coastguard Worker // Tests that clearing a texture followed by sampling from it in a dispatch call works correctly.
4993*8975f5c5SAndroid Build Coastguard Worker // In the Vulkan backend, the clear is deferred and should be flushed correctly.
TEST_P(SimpleStateChangeTestES31,ClearThenSampleWithCompute)4994*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, ClearThenSampleWithCompute)
4995*8975f5c5SAndroid Build Coastguard Worker {
4996*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42264223
4997*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsDesktopOpenGL());
4998*8975f5c5SAndroid Build Coastguard Worker
4999*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 1;
5000*8975f5c5SAndroid Build Coastguard Worker
5001*8975f5c5SAndroid Build Coastguard Worker GLTexture color;
5002*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, color);
5003*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
5004*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5005*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5006*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSize, kSize, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
5007*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5008*8975f5c5SAndroid Build Coastguard Worker
5009*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
5010*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5011*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
5012*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5013*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5014*8975f5c5SAndroid Build Coastguard Worker
5015*8975f5c5SAndroid Build Coastguard Worker // Make sure the update to the texture is effective.
5016*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5017*8975f5c5SAndroid Build Coastguard Worker
5018*8975f5c5SAndroid Build Coastguard Worker // Clear the texture through the framebuffer
5019*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 1.0f, 0, 1.0f);
5020*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
5021*8975f5c5SAndroid Build Coastguard Worker
5022*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<float, 4> kBufferInitValue = {0.123f, 0.456f, 0.789f, 0.852f};
5023*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
5024*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
5025*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(kBufferInitValue), kBufferInitValue.data(),
5026*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
5027*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffer);
5028*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5029*8975f5c5SAndroid Build Coastguard Worker
5030*8975f5c5SAndroid Build Coastguard Worker constexpr char kCS[] = R"(#version 310 es
5031*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=1, local_size_y=1) in;
5032*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
5033*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, std430) buffer Output {
5034*8975f5c5SAndroid Build Coastguard Worker vec4 vec;
5035*8975f5c5SAndroid Build Coastguard Worker } b;
5036*8975f5c5SAndroid Build Coastguard Worker void main()
5037*8975f5c5SAndroid Build Coastguard Worker {
5038*8975f5c5SAndroid Build Coastguard Worker b.vec = texelFetch(tex, ivec2(gl_LocalInvocationID.xy), 0);
5039*8975f5c5SAndroid Build Coastguard Worker })";
5040*8975f5c5SAndroid Build Coastguard Worker
5041*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_COMPUTE_PROGRAM(readProgram, kCS);
5042*8975f5c5SAndroid Build Coastguard Worker glUseProgram(readProgram);
5043*8975f5c5SAndroid Build Coastguard Worker
5044*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
5045*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(readProgram, "tex"), 0);
5046*8975f5c5SAndroid Build Coastguard Worker
5047*8975f5c5SAndroid Build Coastguard Worker glUseProgram(readProgram);
5048*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5049*8975f5c5SAndroid Build Coastguard Worker
5050*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
5051*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5052*8975f5c5SAndroid Build Coastguard Worker
5053*8975f5c5SAndroid Build Coastguard Worker // Verify the clear
5054*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5055*8975f5c5SAndroid Build Coastguard Worker
5056*8975f5c5SAndroid Build Coastguard Worker // Verify the output from the compute shader
5057*8975f5c5SAndroid Build Coastguard Worker const float *ptr = reinterpret_cast<const float *>(
5058*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(kBufferInitValue), GL_MAP_READ_BIT));
5059*8975f5c5SAndroid Build Coastguard Worker
5060*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(ptr[0], 0.0f);
5061*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(ptr[1], 1.0f);
5062*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(ptr[2], 0.0f);
5063*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(ptr[3], 1.0f);
5064*8975f5c5SAndroid Build Coastguard Worker
5065*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
5066*8975f5c5SAndroid Build Coastguard Worker }
5067*8975f5c5SAndroid Build Coastguard Worker
5068*8975f5c5SAndroid Build Coastguard Worker // Tests that writing to a buffer with transform feedback in one draw call followed by reading from
5069*8975f5c5SAndroid Build Coastguard Worker // it in a dispatch call works correctly. This requires an implicit barrier in between the calls.
TEST_P(SimpleStateChangeTestES31,TransformFeedbackThenReadWithCompute)5070*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, TransformFeedbackThenReadWithCompute)
5071*8975f5c5SAndroid Build Coastguard Worker {
5072*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42264223
5073*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAMD() && IsVulkan());
5074*8975f5c5SAndroid Build Coastguard Worker
5075*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kBufferSize = sizeof(float) * 4 * 6;
5076*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
5077*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffer);
5078*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, kBufferSize, nullptr, GL_STATIC_DRAW);
5079*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffer);
5080*8975f5c5SAndroid Build Coastguard Worker
5081*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> tfVaryings = {"gl_Position"};
5082*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(program, essl3_shaders::vs::Simple(),
5083*8975f5c5SAndroid Build Coastguard Worker essl3_shaders::fs::Green(), tfVaryings,
5084*8975f5c5SAndroid Build Coastguard Worker GL_INTERLEAVED_ATTRIBS);
5085*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
5086*8975f5c5SAndroid Build Coastguard Worker
5087*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_TRIANGLES);
5088*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.0f);
5089*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
5090*8975f5c5SAndroid Build Coastguard Worker
5091*8975f5c5SAndroid Build Coastguard Worker constexpr char kCS[] = R"(#version 310 es
5092*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=1, local_size_y=1) in;
5093*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0) uniform Input
5094*8975f5c5SAndroid Build Coastguard Worker {
5095*8975f5c5SAndroid Build Coastguard Worker vec4 data[3];
5096*8975f5c5SAndroid Build Coastguard Worker };
5097*8975f5c5SAndroid Build Coastguard Worker layout(binding = 0, std430) buffer Output {
5098*8975f5c5SAndroid Build Coastguard Worker bool pass;
5099*8975f5c5SAndroid Build Coastguard Worker };
5100*8975f5c5SAndroid Build Coastguard Worker void main()
5101*8975f5c5SAndroid Build Coastguard Worker {
5102*8975f5c5SAndroid Build Coastguard Worker pass = data[0] == vec4(-1, 1, 0, 1) &&
5103*8975f5c5SAndroid Build Coastguard Worker data[1] == vec4(-1, -1, 0, 1) &&
5104*8975f5c5SAndroid Build Coastguard Worker data[2] == vec4(1, -1, 0, 1);
5105*8975f5c5SAndroid Build Coastguard Worker })";
5106*8975f5c5SAndroid Build Coastguard Worker
5107*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_COMPUTE_PROGRAM(readProgram, kCS);
5108*8975f5c5SAndroid Build Coastguard Worker glUseProgram(readProgram);
5109*8975f5c5SAndroid Build Coastguard Worker
5110*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer);
5111*8975f5c5SAndroid Build Coastguard Worker
5112*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kResultSize = sizeof(uint32_t);
5113*8975f5c5SAndroid Build Coastguard Worker GLBuffer resultBuffer;
5114*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_SHADER_STORAGE_BUFFER, resultBuffer);
5115*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_SHADER_STORAGE_BUFFER, kResultSize, nullptr, GL_STATIC_DRAW);
5116*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, resultBuffer);
5117*8975f5c5SAndroid Build Coastguard Worker
5118*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5119*8975f5c5SAndroid Build Coastguard Worker
5120*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
5121*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5122*8975f5c5SAndroid Build Coastguard Worker
5123*8975f5c5SAndroid Build Coastguard Worker // Verify the output of rendering
5124*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5125*8975f5c5SAndroid Build Coastguard Worker
5126*8975f5c5SAndroid Build Coastguard Worker // Verify the output from the compute shader
5127*8975f5c5SAndroid Build Coastguard Worker const uint32_t *ptr = reinterpret_cast<const uint32_t *>(
5128*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, kResultSize, GL_MAP_READ_BIT));
5129*8975f5c5SAndroid Build Coastguard Worker
5130*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(ptr[0], 1u);
5131*8975f5c5SAndroid Build Coastguard Worker
5132*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
5133*8975f5c5SAndroid Build Coastguard Worker }
5134*8975f5c5SAndroid Build Coastguard Worker
5135*8975f5c5SAndroid Build Coastguard Worker // Tests that deleting an in-flight image texture does not immediately delete the resource.
TEST_P(SimpleStateChangeTestComputeES31,DeleteImageTextureInUse)5136*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestComputeES31, DeleteImageTextureInUse)
5137*8975f5c5SAndroid Build Coastguard Worker {
5138*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colors = {
5139*8975f5c5SAndroid Build Coastguard Worker {GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
5140*8975f5c5SAndroid Build Coastguard Worker GLTexture texRead;
5141*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texRead);
5142*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
5143*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
5144*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5145*8975f5c5SAndroid Build Coastguard Worker
5146*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
5147*8975f5c5SAndroid Build Coastguard Worker
5148*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(0, texRead, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
5149*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5150*8975f5c5SAndroid Build Coastguard Worker texRead.reset();
5151*8975f5c5SAndroid Build Coastguard Worker
5152*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> results;
5153*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, results.data());
5154*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5155*8975f5c5SAndroid Build Coastguard Worker
5156*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
5157*8975f5c5SAndroid Build Coastguard Worker {
5158*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(colors[i], results[i]);
5159*8975f5c5SAndroid Build Coastguard Worker }
5160*8975f5c5SAndroid Build Coastguard Worker }
5161*8975f5c5SAndroid Build Coastguard Worker
5162*8975f5c5SAndroid Build Coastguard Worker // Tests that bind the same image texture all the time between different dispatch calls.
TEST_P(SimpleStateChangeTestComputeES31,RebindImageTextureDispatchAgain)5163*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestComputeES31, RebindImageTextureDispatchAgain)
5164*8975f5c5SAndroid Build Coastguard Worker {
5165*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colors = {{GLColor::cyan, GLColor::cyan, GLColor::cyan, GLColor::cyan}};
5166*8975f5c5SAndroid Build Coastguard Worker GLTexture texRead;
5167*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texRead);
5168*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
5169*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
5170*8975f5c5SAndroid Build Coastguard Worker
5171*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
5172*8975f5c5SAndroid Build Coastguard Worker
5173*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(0, texRead, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
5174*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5175*8975f5c5SAndroid Build Coastguard Worker
5176*8975f5c5SAndroid Build Coastguard Worker // Bind again
5177*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(0, texRead, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
5178*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5179*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5180*8975f5c5SAndroid Build Coastguard Worker
5181*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, 2, 2, GLColor::cyan);
5182*8975f5c5SAndroid Build Coastguard Worker }
5183*8975f5c5SAndroid Build Coastguard Worker
5184*8975f5c5SAndroid Build Coastguard Worker // Tests that we can dispatch with an image texture, modify the image texture with a texSubImage,
5185*8975f5c5SAndroid Build Coastguard Worker // and then dispatch again correctly.
TEST_P(SimpleStateChangeTestComputeES31,DispatchWithImageTextureTexSubImageThenDispatchAgain)5186*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestComputeES31, DispatchWithImageTextureTexSubImageThenDispatchAgain)
5187*8975f5c5SAndroid Build Coastguard Worker {
5188*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colors = {{GLColor::red, GLColor::red, GLColor::red, GLColor::red}};
5189*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> subColors = {
5190*8975f5c5SAndroid Build Coastguard Worker {GLColor::green, GLColor::green, GLColor::green, GLColor::green}};
5191*8975f5c5SAndroid Build Coastguard Worker
5192*8975f5c5SAndroid Build Coastguard Worker GLTexture texRead;
5193*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texRead);
5194*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
5195*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
5196*8975f5c5SAndroid Build Coastguard Worker
5197*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
5198*8975f5c5SAndroid Build Coastguard Worker
5199*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(0, texRead, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
5200*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5201*8975f5c5SAndroid Build Coastguard Worker
5202*8975f5c5SAndroid Build Coastguard Worker // Update bottom-half of image texture with green.
5203*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texRead);
5204*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 1, GL_RGBA, GL_UNSIGNED_BYTE, subColors.data());
5205*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5206*8975f5c5SAndroid Build Coastguard Worker
5207*8975f5c5SAndroid Build Coastguard Worker // Dispatch again, should still work.
5208*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5209*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5210*8975f5c5SAndroid Build Coastguard Worker
5211*8975f5c5SAndroid Build Coastguard Worker // Validate first half of the image is red and the bottom is green.
5212*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> results;
5213*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, results.data());
5214*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5215*8975f5c5SAndroid Build Coastguard Worker
5216*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, results[0]);
5217*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, results[1]);
5218*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::red, results[2]);
5219*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::red, results[3]);
5220*8975f5c5SAndroid Build Coastguard Worker }
5221*8975f5c5SAndroid Build Coastguard Worker
5222*8975f5c5SAndroid Build Coastguard Worker // Test updating an image texture's contents while in use by GL works as expected.
TEST_P(SimpleStateChangeTestComputeES31,UpdateImageTextureInUse)5223*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestComputeES31, UpdateImageTextureInUse)
5224*8975f5c5SAndroid Build Coastguard Worker {
5225*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> rgby = {{GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
5226*8975f5c5SAndroid Build Coastguard Worker
5227*8975f5c5SAndroid Build Coastguard Worker GLTexture texRead;
5228*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texRead);
5229*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
5230*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, rgby.data());
5231*8975f5c5SAndroid Build Coastguard Worker
5232*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
5233*8975f5c5SAndroid Build Coastguard Worker
5234*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(0, texRead, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
5235*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5236*8975f5c5SAndroid Build Coastguard Worker
5237*8975f5c5SAndroid Build Coastguard Worker // Update the texture to be YBGR, while the Texture is in-use. Should not affect the dispatch.
5238*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> ybgr = {{GLColor::yellow, GLColor::blue, GLColor::green, GLColor::red}};
5239*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, ybgr.data());
5240*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5241*8975f5c5SAndroid Build Coastguard Worker
5242*8975f5c5SAndroid Build Coastguard Worker // Check the Framebuffer. The dispatch call should have completed with the original RGBY data.
5243*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
5244*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::green);
5245*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::blue);
5246*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::yellow);
5247*8975f5c5SAndroid Build Coastguard Worker
5248*8975f5c5SAndroid Build Coastguard Worker // Dispatch again. The second dispatch call should use the updated YBGR data.
5249*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5250*8975f5c5SAndroid Build Coastguard Worker
5251*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
5252*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::blue);
5253*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::green);
5254*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
5255*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5256*8975f5c5SAndroid Build Coastguard Worker }
5257*8975f5c5SAndroid Build Coastguard Worker
5258*8975f5c5SAndroid Build Coastguard Worker // Test that we can alternate between image textures between different dispatchs.
TEST_P(SimpleStateChangeTestComputeES31,DispatchImageTextureAThenTextureBThenTextureA)5259*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestComputeES31, DispatchImageTextureAThenTextureBThenTextureA)
5260*8975f5c5SAndroid Build Coastguard Worker {
5261*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colorsTexA = {
5262*8975f5c5SAndroid Build Coastguard Worker {GLColor::cyan, GLColor::cyan, GLColor::cyan, GLColor::cyan}};
5263*8975f5c5SAndroid Build Coastguard Worker
5264*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colorsTexB = {
5265*8975f5c5SAndroid Build Coastguard Worker {GLColor::magenta, GLColor::magenta, GLColor::magenta, GLColor::magenta}};
5266*8975f5c5SAndroid Build Coastguard Worker
5267*8975f5c5SAndroid Build Coastguard Worker GLTexture texA;
5268*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texA);
5269*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
5270*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, colorsTexA.data());
5271*8975f5c5SAndroid Build Coastguard Worker GLTexture texB;
5272*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texB);
5273*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
5274*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, colorsTexB.data());
5275*8975f5c5SAndroid Build Coastguard Worker
5276*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
5277*8975f5c5SAndroid Build Coastguard Worker
5278*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(0, texA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
5279*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5280*8975f5c5SAndroid Build Coastguard Worker
5281*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
5282*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(0, texB, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
5283*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5284*8975f5c5SAndroid Build Coastguard Worker
5285*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
5286*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(0, texA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
5287*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5288*8975f5c5SAndroid Build Coastguard Worker
5289*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
5290*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, 2, 2, GLColor::cyan);
5291*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5292*8975f5c5SAndroid Build Coastguard Worker }
5293*8975f5c5SAndroid Build Coastguard Worker
5294*8975f5c5SAndroid Build Coastguard Worker // Tests that glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT) after draw works, where the render
5295*8975f5c5SAndroid Build Coastguard Worker // pass is marked as closed.
TEST_P(SimpleStateChangeTestES31,DrawThenChangeFBOThenStorageWrite)5296*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, DrawThenChangeFBOThenStorageWrite)
5297*8975f5c5SAndroid Build Coastguard Worker {
5298*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer for the purpose of switching FBOs
5299*8975f5c5SAndroid Build Coastguard Worker GLTexture clearColor;
5300*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, clearColor);
5301*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
5302*8975f5c5SAndroid Build Coastguard Worker
5303*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer clearFBO;
5304*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, clearFBO);
5305*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, clearColor, 0);
5306*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
5307*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5308*8975f5c5SAndroid Build Coastguard Worker
5309*8975f5c5SAndroid Build Coastguard Worker constexpr char kCS[] = R"(#version 310 es
5310*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=1, local_size_y=1) in;
5311*8975f5c5SAndroid Build Coastguard Worker layout (rgba8, binding = 1) writeonly uniform highp image2D dstImage;
5312*8975f5c5SAndroid Build Coastguard Worker void main()
5313*8975f5c5SAndroid Build Coastguard Worker {
5314*8975f5c5SAndroid Build Coastguard Worker imageStore(dstImage, ivec2(gl_GlobalInvocationID.xy), vec4(0.0f, 1.0f, 1.0f, 1.0f));
5315*8975f5c5SAndroid Build Coastguard Worker })";
5316*8975f5c5SAndroid Build Coastguard Worker
5317*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_COMPUTE_PROGRAM(program, kCS);
5318*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
5319*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5320*8975f5c5SAndroid Build Coastguard Worker
5321*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer texture
5322*8975f5c5SAndroid Build Coastguard Worker GLTexture renderTarget;
5323*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, renderTarget);
5324*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
5325*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(1, renderTarget, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);
5326*8975f5c5SAndroid Build Coastguard Worker
5327*8975f5c5SAndroid Build Coastguard Worker // Write to the texture with compute once. In the Vulkan backend, this will make sure the image
5328*8975f5c5SAndroid Build Coastguard Worker // is already created with STORAGE usage and avoids recreate later.
5329*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5330*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5331*8975f5c5SAndroid Build Coastguard Worker
5332*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
5333*8975f5c5SAndroid Build Coastguard Worker
5334*8975f5c5SAndroid Build Coastguard Worker // Create the framebuffer for this texture
5335*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer drawFBO;
5336*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
5337*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTarget,
5338*8975f5c5SAndroid Build Coastguard Worker 0);
5339*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
5340*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5341*8975f5c5SAndroid Build Coastguard Worker
5342*8975f5c5SAndroid Build Coastguard Worker // Draw to this framebuffer to start a render pass
5343*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawProgram, essl31_shaders::vs::Simple(), essl31_shaders::fs::Red());
5344*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawProgram, essl31_shaders::PositionAttrib(), 0.5f);
5345*8975f5c5SAndroid Build Coastguard Worker
5346*8975f5c5SAndroid Build Coastguard Worker // Change framebuffers and do a clear, making sure the old render pass is marked as closed. In
5347*8975f5c5SAndroid Build Coastguard Worker // the Vulkan backend, the clear is stashed, so the render pass is kept in the hopes of reviving
5348*8975f5c5SAndroid Build Coastguard Worker // it later.
5349*8975f5c5SAndroid Build Coastguard Worker
5350*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, clearFBO);
5351*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
5352*8975f5c5SAndroid Build Coastguard Worker
5353*8975f5c5SAndroid Build Coastguard Worker // Issue a memory barrier before writing to the original image again.
5354*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
5355*8975f5c5SAndroid Build Coastguard Worker
5356*8975f5c5SAndroid Build Coastguard Worker // Write to it with a compute shader
5357*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5358*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5359*8975f5c5SAndroid Build Coastguard Worker
5360*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
5361*8975f5c5SAndroid Build Coastguard Worker
5362*8975f5c5SAndroid Build Coastguard Worker // Bind the original framebuffer and verify that the compute shader wrote the correct value.
5363*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO);
5364*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
5365*8975f5c5SAndroid Build Coastguard Worker }
5366*8975f5c5SAndroid Build Coastguard Worker
5367*8975f5c5SAndroid Build Coastguard Worker // Copied from SimpleStateChangeTestComputeES31::DeleteImageTextureInUse
5368*8975f5c5SAndroid Build Coastguard Worker // Tests that deleting an in-flight image texture does not immediately delete the resource.
TEST_P(SimpleStateChangeTestComputeES31PPO,DeleteImageTextureInUse)5369*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestComputeES31PPO, DeleteImageTextureInUse)
5370*8975f5c5SAndroid Build Coastguard Worker {
5371*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsVulkan());
5372*8975f5c5SAndroid Build Coastguard Worker
5373*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mFramebuffer);
5374*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mTexture);
5375*8975f5c5SAndroid Build Coastguard Worker
5376*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTexture);
5377*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
5378*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5379*8975f5c5SAndroid Build Coastguard Worker
5380*8975f5c5SAndroid Build Coastguard Worker constexpr char kCS[] = R"(#version 310 es
5381*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=2, local_size_y=2) in;
5382*8975f5c5SAndroid Build Coastguard Worker layout (rgba8, binding = 0) readonly uniform highp image2D srcImage;
5383*8975f5c5SAndroid Build Coastguard Worker layout (rgba8, binding = 1) writeonly uniform highp image2D dstImage;
5384*8975f5c5SAndroid Build Coastguard Worker void main()
5385*8975f5c5SAndroid Build Coastguard Worker {
5386*8975f5c5SAndroid Build Coastguard Worker imageStore(dstImage, ivec2(gl_LocalInvocationID.xy),
5387*8975f5c5SAndroid Build Coastguard Worker imageLoad(srcImage, ivec2(gl_LocalInvocationID.xy)));
5388*8975f5c5SAndroid Build Coastguard Worker })";
5389*8975f5c5SAndroid Build Coastguard Worker
5390*8975f5c5SAndroid Build Coastguard Worker bindProgramPipeline(kCS);
5391*8975f5c5SAndroid Build Coastguard Worker
5392*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(1, mTexture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);
5393*8975f5c5SAndroid Build Coastguard Worker
5394*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebuffer);
5395*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
5396*8975f5c5SAndroid Build Coastguard Worker
5397*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5398*8975f5c5SAndroid Build Coastguard Worker
5399*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colors = {
5400*8975f5c5SAndroid Build Coastguard Worker {GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
5401*8975f5c5SAndroid Build Coastguard Worker GLTexture texRead;
5402*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texRead);
5403*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2);
5404*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
5405*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5406*8975f5c5SAndroid Build Coastguard Worker
5407*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(0, texRead, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
5408*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
5409*8975f5c5SAndroid Build Coastguard Worker texRead.reset();
5410*8975f5c5SAndroid Build Coastguard Worker
5411*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> results;
5412*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, results.data());
5413*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5414*8975f5c5SAndroid Build Coastguard Worker
5415*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
5416*8975f5c5SAndroid Build Coastguard Worker {
5417*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(colors[i], results[i]);
5418*8975f5c5SAndroid Build Coastguard Worker }
5419*8975f5c5SAndroid Build Coastguard Worker }
5420*8975f5c5SAndroid Build Coastguard Worker
5421*8975f5c5SAndroid Build Coastguard Worker static constexpr char kColorVS[] = R"(attribute vec2 position;
5422*8975f5c5SAndroid Build Coastguard Worker attribute vec4 color;
5423*8975f5c5SAndroid Build Coastguard Worker varying vec4 vColor;
5424*8975f5c5SAndroid Build Coastguard Worker void main()
5425*8975f5c5SAndroid Build Coastguard Worker {
5426*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
5427*8975f5c5SAndroid Build Coastguard Worker vColor = color;
5428*8975f5c5SAndroid Build Coastguard Worker })";
5429*8975f5c5SAndroid Build Coastguard Worker
5430*8975f5c5SAndroid Build Coastguard Worker static constexpr char kColorFS[] = R"(precision mediump float;
5431*8975f5c5SAndroid Build Coastguard Worker varying vec4 vColor;
5432*8975f5c5SAndroid Build Coastguard Worker void main()
5433*8975f5c5SAndroid Build Coastguard Worker {
5434*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vColor;
5435*8975f5c5SAndroid Build Coastguard Worker })";
5436*8975f5c5SAndroid Build Coastguard Worker
5437*8975f5c5SAndroid Build Coastguard Worker class ValidationStateChangeTest : public ANGLETest<>
5438*8975f5c5SAndroid Build Coastguard Worker {
5439*8975f5c5SAndroid Build Coastguard Worker protected:
ValidationStateChangeTest()5440*8975f5c5SAndroid Build Coastguard Worker ValidationStateChangeTest()
5441*8975f5c5SAndroid Build Coastguard Worker {
5442*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(64);
5443*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(64);
5444*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
5445*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
5446*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
5447*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
5448*8975f5c5SAndroid Build Coastguard Worker }
5449*8975f5c5SAndroid Build Coastguard Worker };
5450*8975f5c5SAndroid Build Coastguard Worker
5451*8975f5c5SAndroid Build Coastguard Worker class WebGL2ValidationStateChangeTest : public ValidationStateChangeTest
5452*8975f5c5SAndroid Build Coastguard Worker {
5453*8975f5c5SAndroid Build Coastguard Worker protected:
WebGL2ValidationStateChangeTest()5454*8975f5c5SAndroid Build Coastguard Worker WebGL2ValidationStateChangeTest() { setWebGLCompatibilityEnabled(true); }
5455*8975f5c5SAndroid Build Coastguard Worker };
5456*8975f5c5SAndroid Build Coastguard Worker
5457*8975f5c5SAndroid Build Coastguard Worker class ValidationStateChangeTestES31 : public ANGLETest<>
5458*8975f5c5SAndroid Build Coastguard Worker {};
5459*8975f5c5SAndroid Build Coastguard Worker
5460*8975f5c5SAndroid Build Coastguard Worker class WebGLComputeValidationStateChangeTest : public ANGLETest<>
5461*8975f5c5SAndroid Build Coastguard Worker {
5462*8975f5c5SAndroid Build Coastguard Worker public:
WebGLComputeValidationStateChangeTest()5463*8975f5c5SAndroid Build Coastguard Worker WebGLComputeValidationStateChangeTest() { setWebGLCompatibilityEnabled(true); }
5464*8975f5c5SAndroid Build Coastguard Worker };
5465*8975f5c5SAndroid Build Coastguard Worker
5466*8975f5c5SAndroid Build Coastguard Worker class RobustBufferAccessWebGL2ValidationStateChangeTest : public WebGL2ValidationStateChangeTest
5467*8975f5c5SAndroid Build Coastguard Worker {
5468*8975f5c5SAndroid Build Coastguard Worker protected:
RobustBufferAccessWebGL2ValidationStateChangeTest()5469*8975f5c5SAndroid Build Coastguard Worker RobustBufferAccessWebGL2ValidationStateChangeTest()
5470*8975f5c5SAndroid Build Coastguard Worker {
5471*8975f5c5SAndroid Build Coastguard Worker // SwS/OSX GL do not support robustness. Mali does not support it.
5472*8975f5c5SAndroid Build Coastguard Worker if (!isSwiftshader() && !IsMac() && !IsIOS() && !IsARM())
5473*8975f5c5SAndroid Build Coastguard Worker {
5474*8975f5c5SAndroid Build Coastguard Worker setRobustAccess(true);
5475*8975f5c5SAndroid Build Coastguard Worker }
5476*8975f5c5SAndroid Build Coastguard Worker }
5477*8975f5c5SAndroid Build Coastguard Worker };
5478*8975f5c5SAndroid Build Coastguard Worker
5479*8975f5c5SAndroid Build Coastguard Worker // Tests that mapping and unmapping an array buffer in various ways causes rendering to fail.
5480*8975f5c5SAndroid Build Coastguard Worker // This isn't guaranteed to produce an error by GL. But we assume ANGLE always errors.
TEST_P(ValidationStateChangeTest,MapBufferAndDraw)5481*8975f5c5SAndroid Build Coastguard Worker TEST_P(ValidationStateChangeTest, MapBufferAndDraw)
5482*8975f5c5SAndroid Build Coastguard Worker {
5483*8975f5c5SAndroid Build Coastguard Worker // Initialize program and set up state.
5484*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kColorVS, kColorFS);
5485*8975f5c5SAndroid Build Coastguard Worker
5486*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
5487*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, "position");
5488*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
5489*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetAttribLocation(program, "color");
5490*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
5491*8975f5c5SAndroid Build Coastguard Worker
5492*8975f5c5SAndroid Build Coastguard Worker const std::array<Vector3, 6> &quadVertices = GetQuadVertices();
5493*8975f5c5SAndroid Build Coastguard Worker const size_t posBufferSize = quadVertices.size() * sizeof(Vector3);
5494*8975f5c5SAndroid Build Coastguard Worker
5495*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
5496*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
5497*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, posBufferSize, quadVertices.data(), GL_STATIC_DRAW);
5498*8975f5c5SAndroid Build Coastguard Worker
5499*8975f5c5SAndroid Build Coastguard Worker // Start with position enabled.
5500*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
5501*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
5502*8975f5c5SAndroid Build Coastguard Worker
5503*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> colorVertices(6, GLColor::blue);
5504*8975f5c5SAndroid Build Coastguard Worker const size_t colorBufferSize = sizeof(GLColor) * 6;
5505*8975f5c5SAndroid Build Coastguard Worker
5506*8975f5c5SAndroid Build Coastguard Worker GLBuffer colorBuffer;
5507*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
5508*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, colorBufferSize, colorVertices.data(), GL_STATIC_DRAW);
5509*8975f5c5SAndroid Build Coastguard Worker
5510*8975f5c5SAndroid Build Coastguard Worker // Start with color disabled.
5511*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
5512*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(colorLoc);
5513*8975f5c5SAndroid Build Coastguard Worker
5514*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5515*8975f5c5SAndroid Build Coastguard Worker
5516*8975f5c5SAndroid Build Coastguard Worker // Draw without a mapped buffer. Should succeed.
5517*8975f5c5SAndroid Build Coastguard Worker glVertexAttrib4f(colorLoc, 0, 1, 0, 1);
5518*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5519*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5520*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5521*8975f5c5SAndroid Build Coastguard Worker
5522*8975f5c5SAndroid Build Coastguard Worker // Map position buffer and draw. Should fail.
5523*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
5524*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_ARRAY_BUFFER, 0, posBufferSize, GL_MAP_READ_BIT);
5525*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5526*8975f5c5SAndroid Build Coastguard Worker
5527*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5528*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Map position buffer and draw should fail.";
5529*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_ARRAY_BUFFER);
5530*8975f5c5SAndroid Build Coastguard Worker
5531*8975f5c5SAndroid Build Coastguard Worker // Map then enable color buffer. Should fail.
5532*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
5533*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_ARRAY_BUFFER, 0, colorBufferSize, GL_MAP_READ_BIT);
5534*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
5535*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5536*8975f5c5SAndroid Build Coastguard Worker
5537*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5538*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Map then enable color buffer should fail.";
5539*8975f5c5SAndroid Build Coastguard Worker
5540*8975f5c5SAndroid Build Coastguard Worker // Unmap then draw. Should succeed.
5541*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_ARRAY_BUFFER);
5542*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5543*8975f5c5SAndroid Build Coastguard Worker
5544*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5545*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5546*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
5547*8975f5c5SAndroid Build Coastguard Worker }
5548*8975f5c5SAndroid Build Coastguard Worker
5549*8975f5c5SAndroid Build Coastguard Worker // Tests that mapping an immutable and persistent buffer after calling glVertexAttribPointer()
5550*8975f5c5SAndroid Build Coastguard Worker // allows rendering to succeed.
TEST_P(ValidationStateChangeTest,MapImmutablePersistentBufferAndDraw)5551*8975f5c5SAndroid Build Coastguard Worker TEST_P(ValidationStateChangeTest, MapImmutablePersistentBufferAndDraw)
5552*8975f5c5SAndroid Build Coastguard Worker {
5553*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_buffer_storage"));
5554*8975f5c5SAndroid Build Coastguard Worker
5555*8975f5c5SAndroid Build Coastguard Worker // Initialize program and set up state.
5556*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kColorVS, kColorFS);
5557*8975f5c5SAndroid Build Coastguard Worker
5558*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
5559*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, "position");
5560*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
5561*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetAttribLocation(program, "color");
5562*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
5563*8975f5c5SAndroid Build Coastguard Worker
5564*8975f5c5SAndroid Build Coastguard Worker const std::array<Vector3, 6> &quadVertices = GetQuadVertices();
5565*8975f5c5SAndroid Build Coastguard Worker const size_t posBufferSize = quadVertices.size() * sizeof(Vector3);
5566*8975f5c5SAndroid Build Coastguard Worker
5567*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
5568*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
5569*8975f5c5SAndroid Build Coastguard Worker glBufferStorageEXT(GL_ARRAY_BUFFER, posBufferSize, quadVertices.data(),
5570*8975f5c5SAndroid Build Coastguard Worker GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT_EXT);
5571*8975f5c5SAndroid Build Coastguard Worker
5572*8975f5c5SAndroid Build Coastguard Worker // Start with position enabled.
5573*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
5574*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
5575*8975f5c5SAndroid Build Coastguard Worker
5576*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> colorVertices(6, GLColor::blue);
5577*8975f5c5SAndroid Build Coastguard Worker const size_t colorBufferSize = sizeof(GLColor) * 6;
5578*8975f5c5SAndroid Build Coastguard Worker
5579*8975f5c5SAndroid Build Coastguard Worker GLBuffer colorBuffer;
5580*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
5581*8975f5c5SAndroid Build Coastguard Worker glBufferStorageEXT(GL_ARRAY_BUFFER, colorBufferSize, colorVertices.data(),
5582*8975f5c5SAndroid Build Coastguard Worker GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT_EXT);
5583*8975f5c5SAndroid Build Coastguard Worker
5584*8975f5c5SAndroid Build Coastguard Worker // Start with color disabled.
5585*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
5586*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(colorLoc);
5587*8975f5c5SAndroid Build Coastguard Worker
5588*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5589*8975f5c5SAndroid Build Coastguard Worker
5590*8975f5c5SAndroid Build Coastguard Worker // Draw without a mapped buffer. Should succeed.
5591*8975f5c5SAndroid Build Coastguard Worker glVertexAttrib4f(colorLoc, 0, 1, 0, 1);
5592*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5593*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5594*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5595*8975f5c5SAndroid Build Coastguard Worker
5596*8975f5c5SAndroid Build Coastguard Worker // Map position buffer and draw. Should succeed.
5597*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
5598*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_ARRAY_BUFFER, 0, posBufferSize,
5599*8975f5c5SAndroid Build Coastguard Worker GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT_EXT);
5600*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5601*8975f5c5SAndroid Build Coastguard Worker
5602*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5603*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5604*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_ARRAY_BUFFER);
5605*8975f5c5SAndroid Build Coastguard Worker
5606*8975f5c5SAndroid Build Coastguard Worker // Map then enable color buffer. Should succeed.
5607*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
5608*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_ARRAY_BUFFER, 0, colorBufferSize,
5609*8975f5c5SAndroid Build Coastguard Worker GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT_EXT);
5610*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
5611*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5612*8975f5c5SAndroid Build Coastguard Worker
5613*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5614*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5615*8975f5c5SAndroid Build Coastguard Worker
5616*8975f5c5SAndroid Build Coastguard Worker // Unmap then draw. Should succeed.
5617*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_ARRAY_BUFFER);
5618*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5619*8975f5c5SAndroid Build Coastguard Worker
5620*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5621*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5622*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
5623*8975f5c5SAndroid Build Coastguard Worker }
5624*8975f5c5SAndroid Build Coastguard Worker
5625*8975f5c5SAndroid Build Coastguard Worker // Tests that mapping an immutable and persistent buffer before calling glVertexAttribPointer()
5626*8975f5c5SAndroid Build Coastguard Worker // allows rendering to succeed. This case is special in that the VertexArray is not observing the
5627*8975f5c5SAndroid Build Coastguard Worker // buffer yet, so it's various cached buffer states aren't updated when the buffer is mapped.
TEST_P(ValidationStateChangeTest,MapImmutablePersistentBufferThenVAPAndDraw)5628*8975f5c5SAndroid Build Coastguard Worker TEST_P(ValidationStateChangeTest, MapImmutablePersistentBufferThenVAPAndDraw)
5629*8975f5c5SAndroid Build Coastguard Worker {
5630*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_buffer_storage"));
5631*8975f5c5SAndroid Build Coastguard Worker
5632*8975f5c5SAndroid Build Coastguard Worker // Initialize program and set up state.
5633*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kColorVS, kColorFS);
5634*8975f5c5SAndroid Build Coastguard Worker
5635*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
5636*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, "position");
5637*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
5638*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetAttribLocation(program, "color");
5639*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
5640*8975f5c5SAndroid Build Coastguard Worker
5641*8975f5c5SAndroid Build Coastguard Worker const std::array<Vector3, 6> &quadVertices = GetQuadVertices();
5642*8975f5c5SAndroid Build Coastguard Worker const size_t posBufferSize = quadVertices.size() * sizeof(Vector3);
5643*8975f5c5SAndroid Build Coastguard Worker
5644*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
5645*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
5646*8975f5c5SAndroid Build Coastguard Worker glBufferStorageEXT(GL_ARRAY_BUFFER, posBufferSize, quadVertices.data(),
5647*8975f5c5SAndroid Build Coastguard Worker GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT_EXT);
5648*8975f5c5SAndroid Build Coastguard Worker
5649*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_ARRAY_BUFFER, 0, posBufferSize,
5650*8975f5c5SAndroid Build Coastguard Worker GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT_EXT);
5651*8975f5c5SAndroid Build Coastguard Worker
5652*8975f5c5SAndroid Build Coastguard Worker // Start with position enabled.
5653*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
5654*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
5655*8975f5c5SAndroid Build Coastguard Worker
5656*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> colorVertices(6, GLColor::blue);
5657*8975f5c5SAndroid Build Coastguard Worker const size_t colorBufferSize = sizeof(GLColor) * 6;
5658*8975f5c5SAndroid Build Coastguard Worker
5659*8975f5c5SAndroid Build Coastguard Worker GLBuffer colorBuffer;
5660*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
5661*8975f5c5SAndroid Build Coastguard Worker glBufferStorageEXT(GL_ARRAY_BUFFER, colorBufferSize, colorVertices.data(),
5662*8975f5c5SAndroid Build Coastguard Worker GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT_EXT);
5663*8975f5c5SAndroid Build Coastguard Worker
5664*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_ARRAY_BUFFER, 0, colorBufferSize,
5665*8975f5c5SAndroid Build Coastguard Worker GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT_EXT);
5666*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5667*8975f5c5SAndroid Build Coastguard Worker
5668*8975f5c5SAndroid Build Coastguard Worker // Start with color disabled.
5669*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
5670*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(colorLoc);
5671*8975f5c5SAndroid Build Coastguard Worker
5672*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5673*8975f5c5SAndroid Build Coastguard Worker
5674*8975f5c5SAndroid Build Coastguard Worker // Draw without a mapped buffer. Should succeed.
5675*8975f5c5SAndroid Build Coastguard Worker glVertexAttrib4f(colorLoc, 0, 1, 0, 1);
5676*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5677*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5678*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5679*8975f5c5SAndroid Build Coastguard Worker
5680*8975f5c5SAndroid Build Coastguard Worker // Unmap then draw. Should succeed.
5681*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_ARRAY_BUFFER);
5682*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
5683*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5684*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5685*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5686*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
5687*8975f5c5SAndroid Build Coastguard Worker }
5688*8975f5c5SAndroid Build Coastguard Worker
5689*8975f5c5SAndroid Build Coastguard Worker // Tests that changing a vertex binding with glVertexAttribDivisor updates the mapped buffer check.
TEST_P(ValidationStateChangeTestES31,MapBufferAndDrawWithDivisor)5690*8975f5c5SAndroid Build Coastguard Worker TEST_P(ValidationStateChangeTestES31, MapBufferAndDrawWithDivisor)
5691*8975f5c5SAndroid Build Coastguard Worker {
5692*8975f5c5SAndroid Build Coastguard Worker // Seems to trigger a GL error in some edge cases. http://anglebug.com/42261462
5693*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && IsNVIDIA());
5694*8975f5c5SAndroid Build Coastguard Worker
5695*8975f5c5SAndroid Build Coastguard Worker // Initialize program and set up state.
5696*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kColorVS, kColorFS);
5697*8975f5c5SAndroid Build Coastguard Worker
5698*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
5699*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, "position");
5700*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
5701*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetAttribLocation(program, "color");
5702*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
5703*8975f5c5SAndroid Build Coastguard Worker
5704*8975f5c5SAndroid Build Coastguard Worker // Create a user vertex array.
5705*8975f5c5SAndroid Build Coastguard Worker GLVertexArray vao;
5706*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(vao);
5707*8975f5c5SAndroid Build Coastguard Worker
5708*8975f5c5SAndroid Build Coastguard Worker const std::array<Vector3, 6> &quadVertices = GetQuadVertices();
5709*8975f5c5SAndroid Build Coastguard Worker const size_t posBufferSize = quadVertices.size() * sizeof(Vector3);
5710*8975f5c5SAndroid Build Coastguard Worker
5711*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
5712*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
5713*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, posBufferSize, quadVertices.data(), GL_STATIC_DRAW);
5714*8975f5c5SAndroid Build Coastguard Worker
5715*8975f5c5SAndroid Build Coastguard Worker // Start with position enabled.
5716*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
5717*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
5718*8975f5c5SAndroid Build Coastguard Worker
5719*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> blueVertices(6, GLColor::blue);
5720*8975f5c5SAndroid Build Coastguard Worker const size_t blueBufferSize = sizeof(GLColor) * 6;
5721*8975f5c5SAndroid Build Coastguard Worker
5722*8975f5c5SAndroid Build Coastguard Worker GLBuffer blueBuffer;
5723*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, blueBuffer);
5724*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, blueBufferSize, blueVertices.data(), GL_STATIC_DRAW);
5725*8975f5c5SAndroid Build Coastguard Worker
5726*8975f5c5SAndroid Build Coastguard Worker // Start with color enabled at an unused binding.
5727*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kUnusedBinding = 3;
5728*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, kUnusedBinding);
5729*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(positionLoc, kUnusedBinding);
5730*8975f5c5SAndroid Build Coastguard Worker glVertexAttribFormat(colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0);
5731*8975f5c5SAndroid Build Coastguard Worker glVertexAttribBinding(colorLoc, kUnusedBinding);
5732*8975f5c5SAndroid Build Coastguard Worker glBindVertexBuffer(kUnusedBinding, blueBuffer, 0, sizeof(GLColor));
5733*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
5734*8975f5c5SAndroid Build Coastguard Worker
5735*8975f5c5SAndroid Build Coastguard Worker // Make binding 'colorLoc' use a mapped buffer.
5736*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> greenVertices(6, GLColor::green);
5737*8975f5c5SAndroid Build Coastguard Worker const size_t greenBufferSize = sizeof(GLColor) * 6;
5738*8975f5c5SAndroid Build Coastguard Worker GLBuffer greenBuffer;
5739*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, greenBuffer);
5740*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, greenBufferSize, greenVertices.data(), GL_STATIC_DRAW);
5741*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_ARRAY_BUFFER, 0, greenBufferSize, GL_MAP_READ_BIT);
5742*8975f5c5SAndroid Build Coastguard Worker glBindVertexBuffer(colorLoc, greenBuffer, 0, sizeof(GLColor));
5743*8975f5c5SAndroid Build Coastguard Worker
5744*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5745*8975f5c5SAndroid Build Coastguard Worker
5746*8975f5c5SAndroid Build Coastguard Worker // Draw without a mapped buffer. Should succeed.
5747*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5748*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5749*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
5750*8975f5c5SAndroid Build Coastguard Worker
5751*8975f5c5SAndroid Build Coastguard Worker // Change divisor with VertexAttribDivisor. Should fail.
5752*8975f5c5SAndroid Build Coastguard Worker glVertexAttribDivisor(colorLoc, 0);
5753*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5754*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5755*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "draw with mapped buffer should fail.";
5756*8975f5c5SAndroid Build Coastguard Worker
5757*8975f5c5SAndroid Build Coastguard Worker // Unmap the buffer. Should succeed.
5758*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_ARRAY_BUFFER);
5759*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5760*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5761*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5762*8975f5c5SAndroid Build Coastguard Worker }
5763*8975f5c5SAndroid Build Coastguard Worker
5764*8975f5c5SAndroid Build Coastguard Worker // Tests that changing a vertex binding with glVertexAttribDivisor updates the buffer size check.
TEST_P(WebGLComputeValidationStateChangeTest,DrawPastEndOfBufferWithDivisor)5765*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGLComputeValidationStateChangeTest, DrawPastEndOfBufferWithDivisor)
5766*8975f5c5SAndroid Build Coastguard Worker {
5767*8975f5c5SAndroid Build Coastguard Worker // Initialize program and set up state.
5768*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kColorVS, kColorFS);
5769*8975f5c5SAndroid Build Coastguard Worker
5770*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
5771*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, "position");
5772*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
5773*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetAttribLocation(program, "color");
5774*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
5775*8975f5c5SAndroid Build Coastguard Worker
5776*8975f5c5SAndroid Build Coastguard Worker // Create a user vertex array.
5777*8975f5c5SAndroid Build Coastguard Worker GLVertexArray vao;
5778*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(vao);
5779*8975f5c5SAndroid Build Coastguard Worker
5780*8975f5c5SAndroid Build Coastguard Worker const std::array<Vector3, 6> &quadVertices = GetQuadVertices();
5781*8975f5c5SAndroid Build Coastguard Worker const size_t posBufferSize = quadVertices.size() * sizeof(Vector3);
5782*8975f5c5SAndroid Build Coastguard Worker
5783*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
5784*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
5785*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, posBufferSize, quadVertices.data(), GL_STATIC_DRAW);
5786*8975f5c5SAndroid Build Coastguard Worker
5787*8975f5c5SAndroid Build Coastguard Worker // Start with position enabled.
5788*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
5789*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
5790*8975f5c5SAndroid Build Coastguard Worker
5791*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> blueVertices(6, GLColor::blue);
5792*8975f5c5SAndroid Build Coastguard Worker const size_t blueBufferSize = sizeof(GLColor) * 6;
5793*8975f5c5SAndroid Build Coastguard Worker
5794*8975f5c5SAndroid Build Coastguard Worker GLBuffer blueBuffer;
5795*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, blueBuffer);
5796*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, blueBufferSize, blueVertices.data(), GL_STATIC_DRAW);
5797*8975f5c5SAndroid Build Coastguard Worker
5798*8975f5c5SAndroid Build Coastguard Worker // Start with color enabled at an unused binding.
5799*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kUnusedBinding = 3;
5800*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, kUnusedBinding);
5801*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(positionLoc, kUnusedBinding);
5802*8975f5c5SAndroid Build Coastguard Worker glVertexAttribFormat(colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0);
5803*8975f5c5SAndroid Build Coastguard Worker glVertexAttribBinding(colorLoc, kUnusedBinding);
5804*8975f5c5SAndroid Build Coastguard Worker glBindVertexBuffer(kUnusedBinding, blueBuffer, 0, sizeof(GLColor));
5805*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
5806*8975f5c5SAndroid Build Coastguard Worker
5807*8975f5c5SAndroid Build Coastguard Worker // Make binding 'colorLoc' use a small buffer.
5808*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> greenVertices(6, GLColor::green);
5809*8975f5c5SAndroid Build Coastguard Worker const size_t greenBufferSize = sizeof(GLColor) * 3;
5810*8975f5c5SAndroid Build Coastguard Worker GLBuffer greenBuffer;
5811*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, greenBuffer);
5812*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, greenBufferSize, greenVertices.data(), GL_STATIC_DRAW);
5813*8975f5c5SAndroid Build Coastguard Worker glBindVertexBuffer(colorLoc, greenBuffer, 0, sizeof(GLColor));
5814*8975f5c5SAndroid Build Coastguard Worker
5815*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5816*8975f5c5SAndroid Build Coastguard Worker
5817*8975f5c5SAndroid Build Coastguard Worker // Draw without a mapped buffer. Should succeed.
5818*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5819*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5820*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
5821*8975f5c5SAndroid Build Coastguard Worker
5822*8975f5c5SAndroid Build Coastguard Worker // Change divisor with VertexAttribDivisor. Should fail.
5823*8975f5c5SAndroid Build Coastguard Worker glVertexAttribDivisor(colorLoc, 0);
5824*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5825*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5826*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "draw with small buffer should fail.";
5827*8975f5c5SAndroid Build Coastguard Worker
5828*8975f5c5SAndroid Build Coastguard Worker // Do a small draw. Should succeed.
5829*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
5830*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5831*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5832*8975f5c5SAndroid Build Coastguard Worker }
5833*8975f5c5SAndroid Build Coastguard Worker
5834*8975f5c5SAndroid Build Coastguard Worker // Tests state changes with uniform block validation.
TEST_P(WebGL2ValidationStateChangeTest,UniformBlockNegativeAPI)5835*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGL2ValidationStateChangeTest, UniformBlockNegativeAPI)
5836*8975f5c5SAndroid Build Coastguard Worker {
5837*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
5838*8975f5c5SAndroid Build Coastguard Worker in vec2 position;
5839*8975f5c5SAndroid Build Coastguard Worker void main()
5840*8975f5c5SAndroid Build Coastguard Worker {
5841*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
5842*8975f5c5SAndroid Build Coastguard Worker })";
5843*8975f5c5SAndroid Build Coastguard Worker
5844*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
5845*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
5846*8975f5c5SAndroid Build Coastguard Worker uniform uni { vec4 vec; };
5847*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
5848*8975f5c5SAndroid Build Coastguard Worker void main()
5849*8975f5c5SAndroid Build Coastguard Worker {
5850*8975f5c5SAndroid Build Coastguard Worker color = vec;
5851*8975f5c5SAndroid Build Coastguard Worker })";
5852*8975f5c5SAndroid Build Coastguard Worker
5853*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
5854*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
5855*8975f5c5SAndroid Build Coastguard Worker
5856*8975f5c5SAndroid Build Coastguard Worker GLuint blockIndex = glGetUniformBlockIndex(program, "uni");
5857*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(GL_INVALID_INDEX, blockIndex);
5858*8975f5c5SAndroid Build Coastguard Worker
5859*8975f5c5SAndroid Build Coastguard Worker glUniformBlockBinding(program, blockIndex, 0);
5860*8975f5c5SAndroid Build Coastguard Worker
5861*8975f5c5SAndroid Build Coastguard Worker GLBuffer uniformBuffer;
5862*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_UNIFORM_BUFFER, uniformBuffer);
5863*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_UNIFORM_BUFFER, sizeof(GLColor32F), &kFloatGreen.R, GL_STATIC_DRAW);
5864*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_UNIFORM_BUFFER, 0, uniformBuffer);
5865*8975f5c5SAndroid Build Coastguard Worker
5866*8975f5c5SAndroid Build Coastguard Worker const auto &quadVertices = GetQuadVertices();
5867*8975f5c5SAndroid Build Coastguard Worker
5868*8975f5c5SAndroid Build Coastguard Worker GLBuffer positionBuffer;
5869*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
5870*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, quadVertices.size() * sizeof(Vector3), quadVertices.data(),
5871*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
5872*8975f5c5SAndroid Build Coastguard Worker
5873*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(program, "position");
5874*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLocation);
5875*8975f5c5SAndroid Build Coastguard Worker
5876*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
5877*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLocation);
5878*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5879*8975f5c5SAndroid Build Coastguard Worker
5880*8975f5c5SAndroid Build Coastguard Worker // First draw should succeed.
5881*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5882*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5883*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5884*8975f5c5SAndroid Build Coastguard Worker
5885*8975f5c5SAndroid Build Coastguard Worker // Change the uniform block binding. Should fail.
5886*8975f5c5SAndroid Build Coastguard Worker glUniformBlockBinding(program, blockIndex, 1);
5887*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5888*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5889*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_OPERATION) << "Invalid uniform block binding should fail";
5890*8975f5c5SAndroid Build Coastguard Worker
5891*8975f5c5SAndroid Build Coastguard Worker // Reset to a correct state.
5892*8975f5c5SAndroid Build Coastguard Worker glUniformBlockBinding(program, blockIndex, 0);
5893*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5894*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5895*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5896*8975f5c5SAndroid Build Coastguard Worker
5897*8975f5c5SAndroid Build Coastguard Worker // Change the buffer binding. Should fail.
5898*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_UNIFORM_BUFFER, 0, 0);
5899*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5900*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5901*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_OPERATION) << "Setting invalid uniform buffer should fail";
5902*8975f5c5SAndroid Build Coastguard Worker
5903*8975f5c5SAndroid Build Coastguard Worker // Reset to a correct state.
5904*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_UNIFORM_BUFFER, 0, uniformBuffer);
5905*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5906*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5907*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5908*8975f5c5SAndroid Build Coastguard Worker
5909*8975f5c5SAndroid Build Coastguard Worker // Resize the buffer to be too small. Should fail.
5910*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_UNIFORM_BUFFER, 1, nullptr, GL_STATIC_DRAW);
5911*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5912*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Invalid buffer size should fail";
5913*8975f5c5SAndroid Build Coastguard Worker }
5914*8975f5c5SAndroid Build Coastguard Worker
5915*8975f5c5SAndroid Build Coastguard Worker // Tests that redefining attachment storage updates the component type mask
TEST_P(WebGL2ValidationStateChangeTest,AttachmentTypeRedefinition)5916*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGL2ValidationStateChangeTest, AttachmentTypeRedefinition)
5917*8975f5c5SAndroid Build Coastguard Worker {
5918*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
5919*8975f5c5SAndroid Build Coastguard Worker
5920*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fb;
5921*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb);
5922*8975f5c5SAndroid Build Coastguard Worker
5923*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rb;
5924*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rb);
5925*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
5926*8975f5c5SAndroid Build Coastguard Worker
5927*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8I, 4, 4);
5928*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
5929*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5930*8975f5c5SAndroid Build Coastguard Worker
5931*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 4, 4);
5932*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
5933*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
5934*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, 4, 4, GLColor::green);
5935*8975f5c5SAndroid Build Coastguard Worker
5936*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8UI, 4, 4);
5937*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
5938*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5939*8975f5c5SAndroid Build Coastguard Worker }
5940*8975f5c5SAndroid Build Coastguard Worker
5941*8975f5c5SAndroid Build Coastguard Worker // Tests various state change effects on draw framebuffer validation.
TEST_P(WebGL2ValidationStateChangeTest,DrawFramebufferNegativeAPI)5942*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGL2ValidationStateChangeTest, DrawFramebufferNegativeAPI)
5943*8975f5c5SAndroid Build Coastguard Worker {
5944*8975f5c5SAndroid Build Coastguard Worker // Set up a simple draw from a Texture to a user Framebuffer.
5945*8975f5c5SAndroid Build Coastguard Worker GLuint program = get2DTexturedQuadProgram();
5946*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(0u, program);
5947*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
5948*8975f5c5SAndroid Build Coastguard Worker
5949*8975f5c5SAndroid Build Coastguard Worker GLint posLoc = glGetAttribLocation(program, "position");
5950*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, posLoc);
5951*8975f5c5SAndroid Build Coastguard Worker
5952*8975f5c5SAndroid Build Coastguard Worker const auto &quadVertices = GetQuadVertices();
5953*8975f5c5SAndroid Build Coastguard Worker
5954*8975f5c5SAndroid Build Coastguard Worker GLBuffer positionBuffer;
5955*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
5956*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(Vector3) * quadVertices.size(), quadVertices.data(),
5957*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
5958*8975f5c5SAndroid Build Coastguard Worker
5959*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
5960*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(posLoc);
5961*8975f5c5SAndroid Build Coastguard Worker
5962*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kSize = 2;
5963*8975f5c5SAndroid Build Coastguard Worker
5964*8975f5c5SAndroid Build Coastguard Worker GLTexture colorBufferTexture;
5965*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorBufferTexture);
5966*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
5967*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5968*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5969*8975f5c5SAndroid Build Coastguard Worker
5970*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
5971*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5972*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTexture,
5973*8975f5c5SAndroid Build Coastguard Worker 0);
5974*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
5975*8975f5c5SAndroid Build Coastguard Worker
5976*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> greenColor(kSize * kSize, GLColor::green);
5977*8975f5c5SAndroid Build Coastguard Worker
5978*8975f5c5SAndroid Build Coastguard Worker GLTexture greenTexture;
5979*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, greenTexture);
5980*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5981*8975f5c5SAndroid Build Coastguard Worker greenColor.data());
5982*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5983*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5984*8975f5c5SAndroid Build Coastguard Worker
5985*8975f5c5SAndroid Build Coastguard Worker // Second framebuffer with a feedback loop. Initially unbound.
5986*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer loopedFramebuffer;
5987*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, loopedFramebuffer);
5988*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, greenTexture, 0);
5989*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
5990*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5991*8975f5c5SAndroid Build Coastguard Worker
5992*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5993*8975f5c5SAndroid Build Coastguard Worker
5994*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
5995*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
5996*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
5997*8975f5c5SAndroid Build Coastguard Worker
5998*8975f5c5SAndroid Build Coastguard Worker // Create a rendering feedback loop. Should fail.
5999*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, colorBufferTexture);
6000*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6001*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6002*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
6003*8975f5c5SAndroid Build Coastguard Worker
6004*8975f5c5SAndroid Build Coastguard Worker // Reset to a valid state.
6005*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, greenTexture);
6006*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6007*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6008*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6009*8975f5c5SAndroid Build Coastguard Worker
6010*8975f5c5SAndroid Build Coastguard Worker // Bind a second framebuffer with a feedback loop.
6011*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, loopedFramebuffer);
6012*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6013*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6014*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
6015*8975f5c5SAndroid Build Coastguard Worker
6016*8975f5c5SAndroid Build Coastguard Worker // Update the framebuffer texture attachment. Should succeed.
6017*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBufferTexture,
6018*8975f5c5SAndroid Build Coastguard Worker 0);
6019*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6020*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6021*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6022*8975f5c5SAndroid Build Coastguard Worker }
6023*8975f5c5SAndroid Build Coastguard Worker
6024*8975f5c5SAndroid Build Coastguard Worker // Tests various state change effects on draw framebuffer validation with MRT.
TEST_P(WebGL2ValidationStateChangeTest,MultiAttachmentDrawFramebufferNegativeAPI)6025*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGL2ValidationStateChangeTest, MultiAttachmentDrawFramebufferNegativeAPI)
6026*8975f5c5SAndroid Build Coastguard Worker {
6027*8975f5c5SAndroid Build Coastguard Worker // Crashes on 64-bit Android. http://anglebug.com/42262522
6028*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsVulkan() && IsAndroid());
6029*8975f5c5SAndroid Build Coastguard Worker
6030*8975f5c5SAndroid Build Coastguard Worker // Set up a program that writes to two outputs: one int and one float.
6031*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
6032*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) in vec2 position;
6033*8975f5c5SAndroid Build Coastguard Worker out vec2 texCoord;
6034*8975f5c5SAndroid Build Coastguard Worker void main()
6035*8975f5c5SAndroid Build Coastguard Worker {
6036*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
6037*8975f5c5SAndroid Build Coastguard Worker texCoord = position * 0.5 + vec2(0.5);
6038*8975f5c5SAndroid Build Coastguard Worker })";
6039*8975f5c5SAndroid Build Coastguard Worker
6040*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
6041*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
6042*8975f5c5SAndroid Build Coastguard Worker in vec2 texCoord;
6043*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out vec4 outFloat;
6044*8975f5c5SAndroid Build Coastguard Worker layout(location = 1) out uvec4 outInt;
6045*8975f5c5SAndroid Build Coastguard Worker void main()
6046*8975f5c5SAndroid Build Coastguard Worker {
6047*8975f5c5SAndroid Build Coastguard Worker outFloat = vec4(0, 1, 0, 1);
6048*8975f5c5SAndroid Build Coastguard Worker outInt = uvec4(0, 1, 0, 1);
6049*8975f5c5SAndroid Build Coastguard Worker })";
6050*8975f5c5SAndroid Build Coastguard Worker
6051*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
6052*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
6053*8975f5c5SAndroid Build Coastguard Worker
6054*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kPosLoc = 0;
6055*8975f5c5SAndroid Build Coastguard Worker
6056*8975f5c5SAndroid Build Coastguard Worker const auto &quadVertices = GetQuadVertices();
6057*8975f5c5SAndroid Build Coastguard Worker
6058*8975f5c5SAndroid Build Coastguard Worker GLBuffer positionBuffer;
6059*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
6060*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(Vector3) * quadVertices.size(), quadVertices.data(),
6061*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
6062*8975f5c5SAndroid Build Coastguard Worker
6063*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(kPosLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
6064*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(kPosLoc);
6065*8975f5c5SAndroid Build Coastguard Worker
6066*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kSize = 2;
6067*8975f5c5SAndroid Build Coastguard Worker
6068*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer floatFramebuffer;
6069*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, floatFramebuffer);
6070*8975f5c5SAndroid Build Coastguard Worker
6071*8975f5c5SAndroid Build Coastguard Worker GLTexture floatTextures[2];
6072*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i)
6073*8975f5c5SAndroid Build Coastguard Worker {
6074*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, floatTextures[i]);
6075*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6076*8975f5c5SAndroid Build Coastguard Worker nullptr);
6077*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D,
6078*8975f5c5SAndroid Build Coastguard Worker floatTextures[i], 0);
6079*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6080*8975f5c5SAndroid Build Coastguard Worker }
6081*8975f5c5SAndroid Build Coastguard Worker
6082*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
6083*8975f5c5SAndroid Build Coastguard Worker
6084*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer intFramebuffer;
6085*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, intFramebuffer);
6086*8975f5c5SAndroid Build Coastguard Worker
6087*8975f5c5SAndroid Build Coastguard Worker GLTexture intTextures[2];
6088*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i)
6089*8975f5c5SAndroid Build Coastguard Worker {
6090*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, intTextures[i]);
6091*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, kSize, kSize, 0, GL_RGBA_INTEGER,
6092*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
6093*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D,
6094*8975f5c5SAndroid Build Coastguard Worker intTextures[i], 0);
6095*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6096*8975f5c5SAndroid Build Coastguard Worker }
6097*8975f5c5SAndroid Build Coastguard Worker
6098*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
6099*8975f5c5SAndroid Build Coastguard Worker
6100*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6101*8975f5c5SAndroid Build Coastguard Worker
6102*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kColor0Enabled[] = {GL_COLOR_ATTACHMENT0, GL_NONE};
6103*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kColor1Enabled[] = {GL_NONE, GL_COLOR_ATTACHMENT1};
6104*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kColor0And1Enabled[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
6105*8975f5c5SAndroid Build Coastguard Worker
6106*8975f5c5SAndroid Build Coastguard Worker // Draw float. Should work.
6107*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, floatFramebuffer);
6108*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, kColor0Enabled);
6109*8975f5c5SAndroid Build Coastguard Worker
6110*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6111*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR() << "Draw to float texture with correct mask";
6112*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6113*8975f5c5SAndroid Build Coastguard Worker
6114*8975f5c5SAndroid Build Coastguard Worker // Set an invalid component write.
6115*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, kColor0And1Enabled);
6116*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR() << "Draw to float texture with invalid mask";
6117*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6118*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
6119*8975f5c5SAndroid Build Coastguard Worker // Set all 4 channels of color mask to false. Validate success.
6120*8975f5c5SAndroid Build Coastguard Worker glColorMask(false, false, false, false);
6121*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6122*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
6123*8975f5c5SAndroid Build Coastguard Worker glColorMask(false, true, false, false);
6124*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6125*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
6126*8975f5c5SAndroid Build Coastguard Worker glColorMask(true, true, true, true);
6127*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6128*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
6129*8975f5c5SAndroid Build Coastguard Worker
6130*8975f5c5SAndroid Build Coastguard Worker // Restore state.
6131*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, kColor0Enabled);
6132*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6133*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR() << "Draw to float texture with correct mask";
6134*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6135*8975f5c5SAndroid Build Coastguard Worker
6136*8975f5c5SAndroid Build Coastguard Worker // Bind an invalid framebuffer. Validate failure.
6137*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, intFramebuffer);
6138*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6139*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6140*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Draw to int texture with default mask";
6141*8975f5c5SAndroid Build Coastguard Worker
6142*8975f5c5SAndroid Build Coastguard Worker // Set draw mask to a valid mask. Validate success.
6143*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, kColor1Enabled);
6144*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6145*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR() << "Draw to int texture with correct mask";
6146*8975f5c5SAndroid Build Coastguard Worker }
6147*8975f5c5SAndroid Build Coastguard Worker
6148*8975f5c5SAndroid Build Coastguard Worker // Tests that switching the program properly syncs the framebuffer implementation
TEST_P(WebGL2ValidationStateChangeTest,IncompatibleDrawFramebufferProgramSwitch)6149*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGL2ValidationStateChangeTest, IncompatibleDrawFramebufferProgramSwitch)
6150*8975f5c5SAndroid Build Coastguard Worker {
6151*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS0[] = R"(#version 300 es
6152*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
6153*8975f5c5SAndroid Build Coastguard Worker in vec2 texCoord;
6154*8975f5c5SAndroid Build Coastguard Worker out ivec4 color;
6155*8975f5c5SAndroid Build Coastguard Worker void main()
6156*8975f5c5SAndroid Build Coastguard Worker {
6157*8975f5c5SAndroid Build Coastguard Worker color = ivec4(1, 0, 1, 1);
6158*8975f5c5SAndroid Build Coastguard Worker })";
6159*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(programInt, essl3_shaders::vs::Simple(), kFS0);
6160*8975f5c5SAndroid Build Coastguard Worker
6161*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS1[] = R"(#version 300 es
6162*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
6163*8975f5c5SAndroid Build Coastguard Worker in vec2 texCoord;
6164*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
6165*8975f5c5SAndroid Build Coastguard Worker void main()
6166*8975f5c5SAndroid Build Coastguard Worker {
6167*8975f5c5SAndroid Build Coastguard Worker color = vec4(0, 1, 0, 1);
6168*8975f5c5SAndroid Build Coastguard Worker })";
6169*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS1);
6170*8975f5c5SAndroid Build Coastguard Worker
6171*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kSize = 2;
6172*8975f5c5SAndroid Build Coastguard Worker
6173*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fb;
6174*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb);
6175*8975f5c5SAndroid Build Coastguard Worker
6176*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rb;
6177*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rb);
6178*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
6179*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
6180*8975f5c5SAndroid Build Coastguard Worker
6181*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6182*8975f5c5SAndroid Build Coastguard Worker
6183*8975f5c5SAndroid Build Coastguard Worker // Incompatible masked-out draw call
6184*8975f5c5SAndroid Build Coastguard Worker // Implementations may internally disable render targets to avoid runtime failures
6185*8975f5c5SAndroid Build Coastguard Worker glColorMask(false, false, false, false);
6186*8975f5c5SAndroid Build Coastguard Worker drawQuad(programInt, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
6187*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6188*8975f5c5SAndroid Build Coastguard Worker
6189*8975f5c5SAndroid Build Coastguard Worker // Clear must not be affected
6190*8975f5c5SAndroid Build Coastguard Worker glColorMask(true, true, true, true);
6191*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 0.0, 0.0, 1.0);
6192*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
6193*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::red);
6194*8975f5c5SAndroid Build Coastguard Worker
6195*8975f5c5SAndroid Build Coastguard Worker // Compatible draw call
6196*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
6197*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6198*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::green);
6199*8975f5c5SAndroid Build Coastguard Worker }
6200*8975f5c5SAndroid Build Coastguard Worker
6201*8975f5c5SAndroid Build Coastguard Worker // Tests that updating the render target storage properly syncs the framebuffer implementation
TEST_P(WebGL2ValidationStateChangeTest,MultiAttachmentIncompatibleDrawFramebufferStorageUpdate)6202*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGL2ValidationStateChangeTest, MultiAttachmentIncompatibleDrawFramebufferStorageUpdate)
6203*8975f5c5SAndroid Build Coastguard Worker {
6204*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
6205*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
6206*8975f5c5SAndroid Build Coastguard Worker in vec2 texCoord;
6207*8975f5c5SAndroid Build Coastguard Worker layout(location = 0) out ivec4 colorInt;
6208*8975f5c5SAndroid Build Coastguard Worker layout(location = 1) out vec4 colorFloat;
6209*8975f5c5SAndroid Build Coastguard Worker void main()
6210*8975f5c5SAndroid Build Coastguard Worker {
6211*8975f5c5SAndroid Build Coastguard Worker colorInt = ivec4(1, 0, 1, 1);
6212*8975f5c5SAndroid Build Coastguard Worker colorFloat = vec4(0, 1, 0, 1);
6213*8975f5c5SAndroid Build Coastguard Worker })";
6214*8975f5c5SAndroid Build Coastguard Worker
6215*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
6216*8975f5c5SAndroid Build Coastguard Worker
6217*8975f5c5SAndroid Build Coastguard Worker // Explicitly set the program here so that
6218*8975f5c5SAndroid Build Coastguard Worker // drawQuad helpers do not switch it
6219*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
6220*8975f5c5SAndroid Build Coastguard Worker
6221*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kSize = 2;
6222*8975f5c5SAndroid Build Coastguard Worker
6223*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fb;
6224*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb);
6225*8975f5c5SAndroid Build Coastguard Worker
6226*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rb0;
6227*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rb0);
6228*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
6229*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb0);
6230*8975f5c5SAndroid Build Coastguard Worker
6231*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rb1;
6232*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rb1);
6233*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8I, kSize, kSize);
6234*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, rb1);
6235*8975f5c5SAndroid Build Coastguard Worker
6236*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6237*8975f5c5SAndroid Build Coastguard Worker
6238*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum bufs[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
6239*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, bufs);
6240*8975f5c5SAndroid Build Coastguard Worker
6241*8975f5c5SAndroid Build Coastguard Worker // Incompatible masked-out draw call
6242*8975f5c5SAndroid Build Coastguard Worker // Implementations may internally disable render targets to avoid runtime failures
6243*8975f5c5SAndroid Build Coastguard Worker glColorMask(false, false, false, false);
6244*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
6245*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6246*8975f5c5SAndroid Build Coastguard Worker
6247*8975f5c5SAndroid Build Coastguard Worker // Redefine storage, swapping numeric types
6248*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rb0);
6249*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8I, kSize, kSize);
6250*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rb1);
6251*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
6252*8975f5c5SAndroid Build Coastguard Worker
6253*8975f5c5SAndroid Build Coastguard Worker // The same draw call should be valid now
6254*8975f5c5SAndroid Build Coastguard Worker glColorMask(true, true, true, true);
6255*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
6256*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6257*8975f5c5SAndroid Build Coastguard Worker
6258*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
6259*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT32I_EQ(0, 0, kSize, kSize, GLColor32I(1, 0, 1, 1));
6260*8975f5c5SAndroid Build Coastguard Worker
6261*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT1);
6262*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, GLColor::green);
6263*8975f5c5SAndroid Build Coastguard Worker }
6264*8975f5c5SAndroid Build Coastguard Worker
6265*8975f5c5SAndroid Build Coastguard Worker // Tests negative API state change cases with Transform Feedback bindings.
TEST_P(WebGL2ValidationStateChangeTest,TransformFeedbackNegativeAPI)6266*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGL2ValidationStateChangeTest, TransformFeedbackNegativeAPI)
6267*8975f5c5SAndroid Build Coastguard Worker {
6268*8975f5c5SAndroid Build Coastguard Worker // TODO(anglebug.com/40096690) This fails after the upgrade to the 26.20.100.7870 driver.
6269*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
6270*8975f5c5SAndroid Build Coastguard Worker
6271*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
6272*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
6273*8975f5c5SAndroid Build Coastguard Worker uniform block { vec4 color; };
6274*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
6275*8975f5c5SAndroid Build Coastguard Worker void main()
6276*8975f5c5SAndroid Build Coastguard Worker {
6277*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
6278*8975f5c5SAndroid Build Coastguard Worker })";
6279*8975f5c5SAndroid Build Coastguard Worker
6280*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> tfVaryings = {"gl_Position"};
6281*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(program, essl3_shaders::vs::Simple(), kFS, tfVaryings,
6282*8975f5c5SAndroid Build Coastguard Worker GL_INTERLEAVED_ATTRIBS);
6283*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
6284*8975f5c5SAndroid Build Coastguard Worker
6285*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector4> positionData;
6286*8975f5c5SAndroid Build Coastguard Worker for (const Vector3 &quadVertex : GetQuadVertices())
6287*8975f5c5SAndroid Build Coastguard Worker {
6288*8975f5c5SAndroid Build Coastguard Worker positionData.emplace_back(quadVertex.x(), quadVertex.y(), quadVertex.z(), 1.0f);
6289*8975f5c5SAndroid Build Coastguard Worker }
6290*8975f5c5SAndroid Build Coastguard Worker
6291*8975f5c5SAndroid Build Coastguard Worker GLBuffer arrayBuffer;
6292*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
6293*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, positionData.size() * sizeof(Vector4), positionData.data(),
6294*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
6295*8975f5c5SAndroid Build Coastguard Worker
6296*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, essl3_shaders::PositionAttrib());
6297*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
6298*8975f5c5SAndroid Build Coastguard Worker
6299*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 4, GL_FLOAT, GL_FALSE, 0, nullptr);
6300*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
6301*8975f5c5SAndroid Build Coastguard Worker
6302*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
6303*8975f5c5SAndroid Build Coastguard Worker
6304*8975f5c5SAndroid Build Coastguard Worker // Set up transform feedback.
6305*8975f5c5SAndroid Build Coastguard Worker GLTransformFeedback transformFeedback;
6306*8975f5c5SAndroid Build Coastguard Worker glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedback);
6307*8975f5c5SAndroid Build Coastguard Worker
6308*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kTransformFeedbackSize = 6 * sizeof(Vector4);
6309*8975f5c5SAndroid Build Coastguard Worker
6310*8975f5c5SAndroid Build Coastguard Worker GLBuffer transformFeedbackBuffer;
6311*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, transformFeedbackBuffer);
6312*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, kTransformFeedbackSize * 2, nullptr, GL_STATIC_DRAW);
6313*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, transformFeedbackBuffer);
6314*8975f5c5SAndroid Build Coastguard Worker
6315*8975f5c5SAndroid Build Coastguard Worker // Set up uniform buffer.
6316*8975f5c5SAndroid Build Coastguard Worker GLBuffer uniformBuffer;
6317*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_UNIFORM_BUFFER, uniformBuffer);
6318*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_UNIFORM_BUFFER, sizeof(GLColor32F), &kFloatGreen.R, GL_STATIC_DRAW);
6319*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_UNIFORM_BUFFER, 0, uniformBuffer);
6320*8975f5c5SAndroid Build Coastguard Worker
6321*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6322*8975f5c5SAndroid Build Coastguard Worker
6323*8975f5c5SAndroid Build Coastguard Worker // Do the draw operation. Should succeed.
6324*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_TRIANGLES);
6325*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6326*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
6327*8975f5c5SAndroid Build Coastguard Worker
6328*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6329*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6330*8975f5c5SAndroid Build Coastguard Worker
6331*8975f5c5SAndroid Build Coastguard Worker const GLvoid *mapPointer =
6332*8975f5c5SAndroid Build Coastguard Worker glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, kTransformFeedbackSize, GL_MAP_READ_BIT);
6333*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6334*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(nullptr, mapPointer);
6335*8975f5c5SAndroid Build Coastguard Worker const Vector4 *typedMapPointer = reinterpret_cast<const Vector4 *>(mapPointer);
6336*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector4> actualData(typedMapPointer, typedMapPointer + 6);
6337*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(positionData, actualData);
6338*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
6339*8975f5c5SAndroid Build Coastguard Worker
6340*8975f5c5SAndroid Build Coastguard Worker // Draw once to update validation cache.
6341*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_TRIANGLES);
6342*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6343*8975f5c5SAndroid Build Coastguard Worker
6344*8975f5c5SAndroid Build Coastguard Worker // Bind transform feedback buffer to another binding point. Should cause a conflict.
6345*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, transformFeedbackBuffer);
6346*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6347*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6348*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
6349*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Simultaneous element buffer binding should fail";
6350*8975f5c5SAndroid Build Coastguard Worker
6351*8975f5c5SAndroid Build Coastguard Worker // Reset to valid state.
6352*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
6353*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_TRIANGLES);
6354*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6355*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
6356*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6357*8975f5c5SAndroid Build Coastguard Worker
6358*8975f5c5SAndroid Build Coastguard Worker // Simultaneous non-vertex-array binding. Should fail.
6359*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_TRIANGLES);
6360*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6361*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6362*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_PIXEL_PACK_BUFFER, transformFeedbackBuffer);
6363*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6364*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6365*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
6366*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Simultaneous pack buffer binding should fail";
6367*8975f5c5SAndroid Build Coastguard Worker }
6368*8975f5c5SAndroid Build Coastguard Worker
6369*8975f5c5SAndroid Build Coastguard Worker // Test sampler format validation caching works.
TEST_P(WebGL2ValidationStateChangeTest,SamplerFormatCache)6370*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGL2ValidationStateChangeTest, SamplerFormatCache)
6371*8975f5c5SAndroid Build Coastguard Worker {
6372*8975f5c5SAndroid Build Coastguard Worker // Crashes in depth data upload due to lack of support for GL_UNSIGNED_INT data when
6373*8975f5c5SAndroid Build Coastguard Worker // DEPTH_COMPONENT24 is emulated with D32_S8X24. http://anglebug.com/42262525
6374*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsVulkan() && IsWindows() && IsAMD());
6375*8975f5c5SAndroid Build Coastguard Worker
6376*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
6377*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
6378*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D sampler;
6379*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
6380*8975f5c5SAndroid Build Coastguard Worker void main()
6381*8975f5c5SAndroid Build Coastguard Worker {
6382*8975f5c5SAndroid Build Coastguard Worker colorOut = texture(sampler, vec2(0));
6383*8975f5c5SAndroid Build Coastguard Worker })";
6384*8975f5c5SAndroid Build Coastguard Worker
6385*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> tfVaryings = {"gl_Position"};
6386*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
6387*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
6388*8975f5c5SAndroid Build Coastguard Worker
6389*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 4> colors = {
6390*8975f5c5SAndroid Build Coastguard Worker {GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
6391*8975f5c5SAndroid Build Coastguard Worker
6392*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
6393*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
6394*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
6395*8975f5c5SAndroid Build Coastguard Worker
6396*8975f5c5SAndroid Build Coastguard Worker const auto &quadVertices = GetQuadVertices();
6397*8975f5c5SAndroid Build Coastguard Worker
6398*8975f5c5SAndroid Build Coastguard Worker GLBuffer arrayBuffer;
6399*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
6400*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, quadVertices.size() * sizeof(Vector3), quadVertices.data(),
6401*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
6402*8975f5c5SAndroid Build Coastguard Worker
6403*8975f5c5SAndroid Build Coastguard Worker GLint samplerLoc = glGetUniformLocation(program, "sampler");
6404*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, samplerLoc);
6405*8975f5c5SAndroid Build Coastguard Worker glUniform1i(samplerLoc, 0);
6406*8975f5c5SAndroid Build Coastguard Worker
6407*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, essl3_shaders::PositionAttrib());
6408*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
6409*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
6410*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
6411*8975f5c5SAndroid Build Coastguard Worker
6412*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6413*8975f5c5SAndroid Build Coastguard Worker
6414*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6415*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6416*8975f5c5SAndroid Build Coastguard Worker
6417*8975f5c5SAndroid Build Coastguard Worker // TexImage2D should update the sampler format cache.
6418*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, 2, 2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE,
6419*8975f5c5SAndroid Build Coastguard Worker colors.data());
6420*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6421*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Sampling integer texture with a float sampler.";
6422*8975f5c5SAndroid Build Coastguard Worker
6423*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 2, 2, 0, GL_DEPTH_COMPONENT,
6424*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_INT, colors.data());
6425*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6426*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR() << "Depth texture with no compare mode.";
6427*8975f5c5SAndroid Build Coastguard Worker
6428*8975f5c5SAndroid Build Coastguard Worker // TexParameteri should update the sampler format cache.
6429*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
6430*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6431*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Depth texture with compare mode set.";
6432*8975f5c5SAndroid Build Coastguard Worker }
6433*8975f5c5SAndroid Build Coastguard Worker
6434*8975f5c5SAndroid Build Coastguard Worker // Tests that we retain the correct draw mode settings with transform feedback changes.
TEST_P(ValidationStateChangeTest,TransformFeedbackDrawModes)6435*8975f5c5SAndroid Build Coastguard Worker TEST_P(ValidationStateChangeTest, TransformFeedbackDrawModes)
6436*8975f5c5SAndroid Build Coastguard Worker {
6437*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> tfVaryings = {"gl_Position"};
6438*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(program, essl3_shaders::vs::Simple(),
6439*8975f5c5SAndroid Build Coastguard Worker essl3_shaders::fs::Red(), tfVaryings,
6440*8975f5c5SAndroid Build Coastguard Worker GL_INTERLEAVED_ATTRIBS);
6441*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
6442*8975f5c5SAndroid Build Coastguard Worker
6443*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector4> positionData;
6444*8975f5c5SAndroid Build Coastguard Worker for (const Vector3 &quadVertex : GetQuadVertices())
6445*8975f5c5SAndroid Build Coastguard Worker {
6446*8975f5c5SAndroid Build Coastguard Worker positionData.emplace_back(quadVertex.x(), quadVertex.y(), quadVertex.z(), 1.0f);
6447*8975f5c5SAndroid Build Coastguard Worker }
6448*8975f5c5SAndroid Build Coastguard Worker
6449*8975f5c5SAndroid Build Coastguard Worker GLBuffer arrayBuffer;
6450*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
6451*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, positionData.size() * sizeof(Vector4), positionData.data(),
6452*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
6453*8975f5c5SAndroid Build Coastguard Worker
6454*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, essl3_shaders::PositionAttrib());
6455*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
6456*8975f5c5SAndroid Build Coastguard Worker
6457*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 4, GL_FLOAT, GL_FALSE, 0, nullptr);
6458*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
6459*8975f5c5SAndroid Build Coastguard Worker
6460*8975f5c5SAndroid Build Coastguard Worker // Set up transform feedback.
6461*8975f5c5SAndroid Build Coastguard Worker GLTransformFeedback transformFeedback;
6462*8975f5c5SAndroid Build Coastguard Worker glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedback);
6463*8975f5c5SAndroid Build Coastguard Worker
6464*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kTransformFeedbackSize = 6 * sizeof(Vector4);
6465*8975f5c5SAndroid Build Coastguard Worker
6466*8975f5c5SAndroid Build Coastguard Worker GLBuffer transformFeedbackBuffer;
6467*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, transformFeedbackBuffer);
6468*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, kTransformFeedbackSize * 2, nullptr, GL_STATIC_DRAW);
6469*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, transformFeedbackBuffer);
6470*8975f5c5SAndroid Build Coastguard Worker
6471*8975f5c5SAndroid Build Coastguard Worker GLTransformFeedback pointsXFB;
6472*8975f5c5SAndroid Build Coastguard Worker glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, pointsXFB);
6473*8975f5c5SAndroid Build Coastguard Worker GLBuffer pointsXFBBuffer;
6474*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, pointsXFBBuffer);
6475*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 1024, nullptr, GL_STREAM_DRAW);
6476*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, pointsXFBBuffer);
6477*8975f5c5SAndroid Build Coastguard Worker
6478*8975f5c5SAndroid Build Coastguard Worker // Begin TRIANGLES, switch to paused POINTS, should be valid.
6479*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_POINTS);
6480*8975f5c5SAndroid Build Coastguard Worker glPauseTransformFeedback();
6481*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR() << "Starting point transform feedback should succeed";
6482*8975f5c5SAndroid Build Coastguard Worker
6483*8975f5c5SAndroid Build Coastguard Worker glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedback);
6484*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_TRIANGLES);
6485*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6486*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR() << "Triangle rendering should succeed";
6487*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 6);
6488*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Point rendering should fail";
6489*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINES, 0, 6);
6490*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Lines rendering should fail";
6491*8975f5c5SAndroid Build Coastguard Worker glPauseTransformFeedback();
6492*8975f5c5SAndroid Build Coastguard Worker glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, pointsXFB);
6493*8975f5c5SAndroid Build Coastguard Worker glResumeTransformFeedback();
6494*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 6);
6495*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR() << "Point rendering should succeed";
6496*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6497*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Triangle rendering should fail";
6498*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINES, 0, 6);
6499*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION) << "Lines rendering should fail";
6500*8975f5c5SAndroid Build Coastguard Worker
6501*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
6502*8975f5c5SAndroid Build Coastguard Worker glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedback);
6503*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
6504*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR() << "Ending transform feeback should pass";
6505*8975f5c5SAndroid Build Coastguard Worker
6506*8975f5c5SAndroid Build Coastguard Worker glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
6507*8975f5c5SAndroid Build Coastguard Worker
6508*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 6);
6509*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR() << "Point rendering should succeed";
6510*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6511*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR() << "Triangle rendering should succeed";
6512*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINES, 0, 6);
6513*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR() << "Line rendering should succeed";
6514*8975f5c5SAndroid Build Coastguard Worker }
6515*8975f5c5SAndroid Build Coastguard Worker
6516*8975f5c5SAndroid Build Coastguard Worker // Tests a valid rendering setup with two textures. Followed by a draw with conflicting samplers.
TEST_P(ValidationStateChangeTest,TextureConflict)6517*8975f5c5SAndroid Build Coastguard Worker TEST_P(ValidationStateChangeTest, TextureConflict)
6518*8975f5c5SAndroid Build Coastguard Worker {
6519*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
6520*8975f5c5SAndroid Build Coastguard Worker
6521*8975f5c5SAndroid Build Coastguard Worker GLint maxTextures = 0;
6522*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextures);
6523*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(maxTextures < 2);
6524*8975f5c5SAndroid Build Coastguard Worker
6525*8975f5c5SAndroid Build Coastguard Worker // Set up state.
6526*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kSize = 2;
6527*8975f5c5SAndroid Build Coastguard Worker
6528*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> greenData(4, GLColor::green);
6529*8975f5c5SAndroid Build Coastguard Worker
6530*8975f5c5SAndroid Build Coastguard Worker GLTexture textureA;
6531*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textureA);
6532*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
6533*8975f5c5SAndroid Build Coastguard Worker greenData.data());
6534*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6535*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6536*8975f5c5SAndroid Build Coastguard Worker
6537*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE1);
6538*8975f5c5SAndroid Build Coastguard Worker
6539*8975f5c5SAndroid Build Coastguard Worker GLTexture textureB;
6540*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, textureB);
6541*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA,
6542*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, greenData.data());
6543*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA,
6544*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, greenData.data());
6545*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA,
6546*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, greenData.data());
6547*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA,
6548*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, greenData.data());
6549*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA,
6550*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, greenData.data());
6551*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA,
6552*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, greenData.data());
6553*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6554*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6555*8975f5c5SAndroid Build Coastguard Worker
6556*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(attribute vec2 position;
6557*8975f5c5SAndroid Build Coastguard Worker varying mediump vec2 texCoord;
6558*8975f5c5SAndroid Build Coastguard Worker void main()
6559*8975f5c5SAndroid Build Coastguard Worker {
6560*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
6561*8975f5c5SAndroid Build Coastguard Worker texCoord = position * 0.5 + vec2(0.5);
6562*8975f5c5SAndroid Build Coastguard Worker })";
6563*8975f5c5SAndroid Build Coastguard Worker
6564*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(varying mediump vec2 texCoord;
6565*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D texA;
6566*8975f5c5SAndroid Build Coastguard Worker uniform samplerCube texB;
6567*8975f5c5SAndroid Build Coastguard Worker void main()
6568*8975f5c5SAndroid Build Coastguard Worker {
6569*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = texture2D(texA, texCoord) + textureCube(texB, vec3(1, 0, 0));
6570*8975f5c5SAndroid Build Coastguard Worker })";
6571*8975f5c5SAndroid Build Coastguard Worker
6572*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
6573*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
6574*8975f5c5SAndroid Build Coastguard Worker
6575*8975f5c5SAndroid Build Coastguard Worker const auto &quadVertices = GetQuadVertices();
6576*8975f5c5SAndroid Build Coastguard Worker
6577*8975f5c5SAndroid Build Coastguard Worker GLBuffer arrayBuffer;
6578*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
6579*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, quadVertices.size() * sizeof(Vector3), quadVertices.data(),
6580*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
6581*8975f5c5SAndroid Build Coastguard Worker
6582*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, "position");
6583*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
6584*8975f5c5SAndroid Build Coastguard Worker
6585*8975f5c5SAndroid Build Coastguard Worker GLint texALoc = glGetUniformLocation(program, "texA");
6586*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, texALoc);
6587*8975f5c5SAndroid Build Coastguard Worker
6588*8975f5c5SAndroid Build Coastguard Worker GLint texBLoc = glGetUniformLocation(program, "texB");
6589*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, texBLoc);
6590*8975f5c5SAndroid Build Coastguard Worker
6591*8975f5c5SAndroid Build Coastguard Worker glUniform1i(texALoc, 0);
6592*8975f5c5SAndroid Build Coastguard Worker glUniform1i(texBLoc, 1);
6593*8975f5c5SAndroid Build Coastguard Worker
6594*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
6595*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
6596*8975f5c5SAndroid Build Coastguard Worker
6597*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6598*8975f5c5SAndroid Build Coastguard Worker
6599*8975f5c5SAndroid Build Coastguard Worker // First draw. Should succeed.
6600*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6601*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6602*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6603*8975f5c5SAndroid Build Coastguard Worker
6604*8975f5c5SAndroid Build Coastguard Worker // Second draw to ensure all state changes are flushed.
6605*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6606*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6607*8975f5c5SAndroid Build Coastguard Worker
6608*8975f5c5SAndroid Build Coastguard Worker // Make the uniform use an invalid texture binding.
6609*8975f5c5SAndroid Build Coastguard Worker glUniform1i(texBLoc, 0);
6610*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6611*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
6612*8975f5c5SAndroid Build Coastguard Worker }
6613*8975f5c5SAndroid Build Coastguard Worker
6614*8975f5c5SAndroid Build Coastguard Worker // Tests that mapping the element array buffer triggers errors.
TEST_P(ValidationStateChangeTest,MapElementArrayBuffer)6615*8975f5c5SAndroid Build Coastguard Worker TEST_P(ValidationStateChangeTest, MapElementArrayBuffer)
6616*8975f5c5SAndroid Build Coastguard Worker {
6617*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
6618*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
6619*8975f5c5SAndroid Build Coastguard Worker
6620*8975f5c5SAndroid Build Coastguard Worker std::array<GLushort, 6> quadIndices = GetQuadIndices();
6621*8975f5c5SAndroid Build Coastguard Worker std::array<Vector3, 4> quadVertices = GetIndexedQuadVertices();
6622*8975f5c5SAndroid Build Coastguard Worker
6623*8975f5c5SAndroid Build Coastguard Worker GLsizei elementBufferSize = sizeof(quadIndices[0]) * quadIndices.size();
6624*8975f5c5SAndroid Build Coastguard Worker
6625*8975f5c5SAndroid Build Coastguard Worker GLBuffer elementArrayBuffer;
6626*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementArrayBuffer);
6627*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementBufferSize, quadIndices.data(), GL_STATIC_DRAW);
6628*8975f5c5SAndroid Build Coastguard Worker
6629*8975f5c5SAndroid Build Coastguard Worker GLBuffer arrayBuffer;
6630*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
6631*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices[0]) * quadVertices.size(),
6632*8975f5c5SAndroid Build Coastguard Worker quadVertices.data(), GL_STATIC_DRAW);
6633*8975f5c5SAndroid Build Coastguard Worker
6634*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, essl3_shaders::PositionAttrib());
6635*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
6636*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
6637*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
6638*8975f5c5SAndroid Build Coastguard Worker
6639*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
6640*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6641*8975f5c5SAndroid Build Coastguard Worker
6642*8975f5c5SAndroid Build Coastguard Worker void *ptr = glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, 0, elementBufferSize, GL_MAP_READ_BIT);
6643*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(nullptr, ptr);
6644*8975f5c5SAndroid Build Coastguard Worker
6645*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
6646*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
6647*8975f5c5SAndroid Build Coastguard Worker
6648*8975f5c5SAndroid Build Coastguard Worker glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
6649*8975f5c5SAndroid Build Coastguard Worker
6650*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
6651*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6652*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6653*8975f5c5SAndroid Build Coastguard Worker }
6654*8975f5c5SAndroid Build Coastguard Worker
6655*8975f5c5SAndroid Build Coastguard Worker // Tests that deleting a non-active texture does not reset the current texture cache.
TEST_P(SimpleStateChangeTest,DeleteNonActiveTextureThenDraw)6656*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DeleteNonActiveTextureThenDraw)
6657*8975f5c5SAndroid Build Coastguard Worker {
6658*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
6659*8975f5c5SAndroid Build Coastguard Worker "uniform sampler2D us; void main() { gl_FragColor = texture2D(us, vec2(0)); }";
6660*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFS);
6661*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
6662*8975f5c5SAndroid Build Coastguard Worker GLint loc = glGetUniformLocation(program, "us");
6663*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0, loc);
6664*8975f5c5SAndroid Build Coastguard Worker
6665*8975f5c5SAndroid Build Coastguard Worker auto quadVertices = GetQuadVertices();
6666*8975f5c5SAndroid Build Coastguard Worker GLint posLoc = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
6667*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0, posLoc);
6668*8975f5c5SAndroid Build Coastguard Worker
6669*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
6670*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, buffer);
6671*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, quadVertices.size() * sizeof(quadVertices[0]),
6672*8975f5c5SAndroid Build Coastguard Worker quadVertices.data(), GL_STATIC_DRAW);
6673*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
6674*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(posLoc);
6675*8975f5c5SAndroid Build Coastguard Worker
6676*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kSize = 2;
6677*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> red(kSize * kSize, GLColor::red);
6678*8975f5c5SAndroid Build Coastguard Worker
6679*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
6680*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
6681*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, red.data());
6682*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6683*8975f5c5SAndroid Build Coastguard Worker glUniform1i(loc, 0);
6684*8975f5c5SAndroid Build Coastguard Worker
6685*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
6686*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6687*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6688*8975f5c5SAndroid Build Coastguard Worker
6689*8975f5c5SAndroid Build Coastguard Worker // Deleting TEXTURE_CUBE_MAP[0] should not affect TEXTURE_2D[0].
6690*8975f5c5SAndroid Build Coastguard Worker GLTexture tex2;
6691*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, tex2);
6692*8975f5c5SAndroid Build Coastguard Worker tex2.reset();
6693*8975f5c5SAndroid Build Coastguard Worker
6694*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
6695*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6696*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6697*8975f5c5SAndroid Build Coastguard Worker
6698*8975f5c5SAndroid Build Coastguard Worker // Deleting TEXTURE_2D[0] should start "sampling" from the default/zero texture.
6699*8975f5c5SAndroid Build Coastguard Worker tex.reset();
6700*8975f5c5SAndroid Build Coastguard Worker
6701*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
6702*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6703*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
6704*8975f5c5SAndroid Build Coastguard Worker }
6705*8975f5c5SAndroid Build Coastguard Worker
6706*8975f5c5SAndroid Build Coastguard Worker // Tests that deleting a texture successfully binds the zero texture.
TEST_P(SimpleStateChangeTest,DeleteTextureThenDraw)6707*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DeleteTextureThenDraw)
6708*8975f5c5SAndroid Build Coastguard Worker {
6709*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
6710*8975f5c5SAndroid Build Coastguard Worker "uniform sampler2D us; void main() { gl_FragColor = texture2D(us, vec2(0)); }";
6711*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFS);
6712*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
6713*8975f5c5SAndroid Build Coastguard Worker GLint loc = glGetUniformLocation(program, "us");
6714*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0, loc);
6715*8975f5c5SAndroid Build Coastguard Worker
6716*8975f5c5SAndroid Build Coastguard Worker auto quadVertices = GetQuadVertices();
6717*8975f5c5SAndroid Build Coastguard Worker GLint posLoc = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
6718*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0, posLoc);
6719*8975f5c5SAndroid Build Coastguard Worker
6720*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
6721*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, buffer);
6722*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, quadVertices.size() * sizeof(quadVertices[0]),
6723*8975f5c5SAndroid Build Coastguard Worker quadVertices.data(), GL_STATIC_DRAW);
6724*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
6725*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(posLoc);
6726*8975f5c5SAndroid Build Coastguard Worker
6727*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kSize = 2;
6728*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> red(kSize * kSize, GLColor::red);
6729*8975f5c5SAndroid Build Coastguard Worker
6730*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
6731*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
6732*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, red.data());
6733*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6734*8975f5c5SAndroid Build Coastguard Worker glUniform1i(loc, 1);
6735*8975f5c5SAndroid Build Coastguard Worker tex.reset();
6736*8975f5c5SAndroid Build Coastguard Worker
6737*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
6738*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6739*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
6740*8975f5c5SAndroid Build Coastguard Worker }
6741*8975f5c5SAndroid Build Coastguard Worker
bindTextureToFbo(GLFramebuffer & fbo,GLTexture & texture)6742*8975f5c5SAndroid Build Coastguard Worker void SimpleStateChangeTest::bindTextureToFbo(GLFramebuffer &fbo, GLTexture &texture)
6743*8975f5c5SAndroid Build Coastguard Worker {
6744*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6745*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
6746*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA,
6747*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
6748*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6749*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6750*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
6751*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
6752*8975f5c5SAndroid Build Coastguard Worker }
6753*8975f5c5SAndroid Build Coastguard Worker
drawToFboWithCulling(const GLenum frontFace,bool earlyFrontFaceDirty)6754*8975f5c5SAndroid Build Coastguard Worker void SimpleStateChangeTest::drawToFboWithCulling(const GLenum frontFace, bool earlyFrontFaceDirty)
6755*8975f5c5SAndroid Build Coastguard Worker {
6756*8975f5c5SAndroid Build Coastguard Worker // Render to an FBO
6757*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo1;
6758*8975f5c5SAndroid Build Coastguard Worker GLTexture texture1;
6759*8975f5c5SAndroid Build Coastguard Worker
6760*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
6761*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(textureProgram, essl1_shaders::vs::Texture2D(),
6762*8975f5c5SAndroid Build Coastguard Worker essl1_shaders::fs::Texture2D());
6763*8975f5c5SAndroid Build Coastguard Worker
6764*8975f5c5SAndroid Build Coastguard Worker bindTextureToFbo(fbo1, texture1);
6765*8975f5c5SAndroid Build Coastguard Worker
6766*8975f5c5SAndroid Build Coastguard Worker // Clear the surface FBO to initialize it to a known value
6767*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
6768*8975f5c5SAndroid Build Coastguard Worker glClearColor(kFloatRed.R, kFloatRed.G, kFloatRed.B, kFloatRed.A);
6769*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
6770*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6771*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6772*8975f5c5SAndroid Build Coastguard Worker glFlush();
6773*8975f5c5SAndroid Build Coastguard Worker
6774*8975f5c5SAndroid Build Coastguard Worker // Draw to FBO 1 to initialize it to a known value
6775*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo1);
6776*8975f5c5SAndroid Build Coastguard Worker
6777*8975f5c5SAndroid Build Coastguard Worker if (earlyFrontFaceDirty)
6778*8975f5c5SAndroid Build Coastguard Worker {
6779*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_CULL_FACE);
6780*8975f5c5SAndroid Build Coastguard Worker // Make sure we don't cull
6781*8975f5c5SAndroid Build Coastguard Worker glCullFace(frontFace == GL_CCW ? GL_BACK : GL_FRONT);
6782*8975f5c5SAndroid Build Coastguard Worker glFrontFace(frontFace);
6783*8975f5c5SAndroid Build Coastguard Worker }
6784*8975f5c5SAndroid Build Coastguard Worker else
6785*8975f5c5SAndroid Build Coastguard Worker {
6786*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_CULL_FACE);
6787*8975f5c5SAndroid Build Coastguard Worker }
6788*8975f5c5SAndroid Build Coastguard Worker
6789*8975f5c5SAndroid Build Coastguard Worker glUseProgram(greenProgram);
6790*8975f5c5SAndroid Build Coastguard Worker drawQuad(greenProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
6791*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6792*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6793*8975f5c5SAndroid Build Coastguard Worker
6794*8975f5c5SAndroid Build Coastguard Worker // Draw into FBO 0 using FBO 1's texture to determine if culling is working or not
6795*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
6796*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture1);
6797*8975f5c5SAndroid Build Coastguard Worker
6798*8975f5c5SAndroid Build Coastguard Worker glCullFace(GL_BACK);
6799*8975f5c5SAndroid Build Coastguard Worker if (!earlyFrontFaceDirty)
6800*8975f5c5SAndroid Build Coastguard Worker {
6801*8975f5c5SAndroid Build Coastguard Worker // Set the culling we want to test
6802*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_CULL_FACE);
6803*8975f5c5SAndroid Build Coastguard Worker glFrontFace(frontFace);
6804*8975f5c5SAndroid Build Coastguard Worker }
6805*8975f5c5SAndroid Build Coastguard Worker
6806*8975f5c5SAndroid Build Coastguard Worker glUseProgram(textureProgram);
6807*8975f5c5SAndroid Build Coastguard Worker drawQuad(textureProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
6808*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6809*8975f5c5SAndroid Build Coastguard Worker
6810*8975f5c5SAndroid Build Coastguard Worker if (frontFace == GL_CCW)
6811*8975f5c5SAndroid Build Coastguard Worker {
6812*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6813*8975f5c5SAndroid Build Coastguard Worker }
6814*8975f5c5SAndroid Build Coastguard Worker else
6815*8975f5c5SAndroid Build Coastguard Worker {
6816*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6817*8975f5c5SAndroid Build Coastguard Worker }
6818*8975f5c5SAndroid Build Coastguard Worker
6819*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
6820*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
6821*8975f5c5SAndroid Build Coastguard Worker }
6822*8975f5c5SAndroid Build Coastguard Worker
6823*8975f5c5SAndroid Build Coastguard Worker // Validates if culling rasterization states work with FBOs using CCW winding.
TEST_P(SimpleStateChangeTest,FboEarlyCullFaceBackCCWState)6824*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, FboEarlyCullFaceBackCCWState)
6825*8975f5c5SAndroid Build Coastguard Worker {
6826*8975f5c5SAndroid Build Coastguard Worker drawToFboWithCulling(GL_CCW, true);
6827*8975f5c5SAndroid Build Coastguard Worker }
6828*8975f5c5SAndroid Build Coastguard Worker
6829*8975f5c5SAndroid Build Coastguard Worker // Validates if culling rasterization states work with FBOs using CW winding.
TEST_P(SimpleStateChangeTest,FboEarlyCullFaceBackCWState)6830*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, FboEarlyCullFaceBackCWState)
6831*8975f5c5SAndroid Build Coastguard Worker {
6832*8975f5c5SAndroid Build Coastguard Worker drawToFboWithCulling(GL_CW, true);
6833*8975f5c5SAndroid Build Coastguard Worker }
6834*8975f5c5SAndroid Build Coastguard Worker
TEST_P(SimpleStateChangeTest,FboLateCullFaceBackCCWState)6835*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, FboLateCullFaceBackCCWState)
6836*8975f5c5SAndroid Build Coastguard Worker {
6837*8975f5c5SAndroid Build Coastguard Worker drawToFboWithCulling(GL_CCW, false);
6838*8975f5c5SAndroid Build Coastguard Worker }
6839*8975f5c5SAndroid Build Coastguard Worker
6840*8975f5c5SAndroid Build Coastguard Worker // Validates if culling rasterization states work with FBOs using CW winding.
TEST_P(SimpleStateChangeTest,FboLateCullFaceBackCWState)6841*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, FboLateCullFaceBackCWState)
6842*8975f5c5SAndroid Build Coastguard Worker {
6843*8975f5c5SAndroid Build Coastguard Worker drawToFboWithCulling(GL_CW, false);
6844*8975f5c5SAndroid Build Coastguard Worker }
6845*8975f5c5SAndroid Build Coastguard Worker
6846*8975f5c5SAndroid Build Coastguard Worker // Test that vertex attribute translation is still kept after binding it to another buffer then
6847*8975f5c5SAndroid Build Coastguard Worker // binding back to the previous buffer.
TEST_P(SimpleStateChangeTest,RebindTranslatedAttribute)6848*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, RebindTranslatedAttribute)
6849*8975f5c5SAndroid Build Coastguard Worker {
6850*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263918
6851*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan());
6852*8975f5c5SAndroid Build Coastguard Worker
6853*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(attribute vec4 a_position;
6854*8975f5c5SAndroid Build Coastguard Worker attribute float a_attrib;
6855*8975f5c5SAndroid Build Coastguard Worker varying float v_attrib;
6856*8975f5c5SAndroid Build Coastguard Worker void main()
6857*8975f5c5SAndroid Build Coastguard Worker {
6858*8975f5c5SAndroid Build Coastguard Worker v_attrib = a_attrib;
6859*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
6860*8975f5c5SAndroid Build Coastguard Worker })";
6861*8975f5c5SAndroid Build Coastguard Worker
6862*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision mediump float;
6863*8975f5c5SAndroid Build Coastguard Worker varying float v_attrib;
6864*8975f5c5SAndroid Build Coastguard Worker void main()
6865*8975f5c5SAndroid Build Coastguard Worker {
6866*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(v_attrib, 0, 0, 1);
6867*8975f5c5SAndroid Build Coastguard Worker })";
6868*8975f5c5SAndroid Build Coastguard Worker
6869*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
6870*8975f5c5SAndroid Build Coastguard Worker glBindAttribLocation(program, 0, "a_position");
6871*8975f5c5SAndroid Build Coastguard Worker glBindAttribLocation(program, 1, "a_attrib");
6872*8975f5c5SAndroid Build Coastguard Worker glLinkProgram(program);
6873*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
6874*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6875*8975f5c5SAndroid Build Coastguard Worker
6876*8975f5c5SAndroid Build Coastguard Worker // Set up color data so red is drawn
6877*8975f5c5SAndroid Build Coastguard Worker std::vector<GLushort> data(1000, 0xffff);
6878*8975f5c5SAndroid Build Coastguard Worker
6879*8975f5c5SAndroid Build Coastguard Worker GLBuffer redBuffer;
6880*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, redBuffer);
6881*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(GLushort) * data.size(), data.data(), GL_STATIC_DRAW);
6882*8975f5c5SAndroid Build Coastguard Worker // Use offset not multiple of 4 GLushorts, this could force vertex translation in Metal backend.
6883*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(1, 4, GL_UNSIGNED_SHORT, GL_TRUE, 0,
6884*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<const void *>(sizeof(GLushort) * 97));
6885*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
6886*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(1);
6887*8975f5c5SAndroid Build Coastguard Worker
6888*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "a_position", 0.5f);
6889*8975f5c5SAndroid Build Coastguard Worker // Verify red was drawn
6890*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6891*8975f5c5SAndroid Build Coastguard Worker
6892*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 1, 0, 1);
6893*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
6894*8975f5c5SAndroid Build Coastguard Worker // Verify that green was drawn
6895*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6896*8975f5c5SAndroid Build Coastguard Worker
6897*8975f5c5SAndroid Build Coastguard Worker // Bind black color buffer to the same attribute with zero offset
6898*8975f5c5SAndroid Build Coastguard Worker std::vector<GLfloat> black(6, 0.0f);
6899*8975f5c5SAndroid Build Coastguard Worker GLBuffer blackBuffer;
6900*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, blackBuffer);
6901*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * black.size(), black.data(), GL_STATIC_DRAW);
6902*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, 0);
6903*8975f5c5SAndroid Build Coastguard Worker
6904*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "a_position", 0.5f);
6905*8975f5c5SAndroid Build Coastguard Worker // Verify black was drawn
6906*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
6907*8975f5c5SAndroid Build Coastguard Worker
6908*8975f5c5SAndroid Build Coastguard Worker // Rebind the old buffer & offset
6909*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, redBuffer);
6910*8975f5c5SAndroid Build Coastguard Worker // Use offset not multiple of 4 GLushorts
6911*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(1, 4, GL_UNSIGNED_SHORT, GL_TRUE, 0,
6912*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<const void *>(sizeof(GLushort) * 97));
6913*8975f5c5SAndroid Build Coastguard Worker
6914*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "a_position", 0.5f);
6915*8975f5c5SAndroid Build Coastguard Worker // Verify red was drawn
6916*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6917*8975f5c5SAndroid Build Coastguard Worker }
6918*8975f5c5SAndroid Build Coastguard Worker
6919*8975f5c5SAndroid Build Coastguard Worker // Test that switching between programs that only contain default uniforms is correct.
TEST_P(SimpleStateChangeTest,TwoProgramsWithOnlyDefaultUniforms)6920*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, TwoProgramsWithOnlyDefaultUniforms)
6921*8975f5c5SAndroid Build Coastguard Worker {
6922*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(attribute vec4 a_position;
6923*8975f5c5SAndroid Build Coastguard Worker varying float v_attrib;
6924*8975f5c5SAndroid Build Coastguard Worker uniform float u_value;
6925*8975f5c5SAndroid Build Coastguard Worker void main()
6926*8975f5c5SAndroid Build Coastguard Worker {
6927*8975f5c5SAndroid Build Coastguard Worker v_attrib = u_value;
6928*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
6929*8975f5c5SAndroid Build Coastguard Worker })";
6930*8975f5c5SAndroid Build Coastguard Worker
6931*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision mediump float;
6932*8975f5c5SAndroid Build Coastguard Worker varying float v_attrib;
6933*8975f5c5SAndroid Build Coastguard Worker void main()
6934*8975f5c5SAndroid Build Coastguard Worker {
6935*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(v_attrib, 0, 0, 1);
6936*8975f5c5SAndroid Build Coastguard Worker })";
6937*8975f5c5SAndroid Build Coastguard Worker
6938*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program1, kVS, kFS);
6939*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program2, kVS, kFS);
6940*8975f5c5SAndroid Build Coastguard Worker
6941*8975f5c5SAndroid Build Coastguard Worker // Don't use drawQuad so there's no state changes between the draw calls other than the program
6942*8975f5c5SAndroid Build Coastguard Worker // binding.
6943*8975f5c5SAndroid Build Coastguard Worker
6944*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kProgramCount = 2;
6945*8975f5c5SAndroid Build Coastguard Worker GLuint programs[kProgramCount] = {program1, program2};
6946*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < kProgramCount; ++i)
6947*8975f5c5SAndroid Build Coastguard Worker {
6948*8975f5c5SAndroid Build Coastguard Worker glUseProgram(programs[i]);
6949*8975f5c5SAndroid Build Coastguard Worker GLint uniformLoc = glGetUniformLocation(programs[i], "u_value");
6950*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(uniformLoc, -1);
6951*8975f5c5SAndroid Build Coastguard Worker
6952*8975f5c5SAndroid Build Coastguard Worker glUniform1f(uniformLoc, static_cast<float>(i + 1) / static_cast<float>(kProgramCount));
6953*8975f5c5SAndroid Build Coastguard Worker
6954*8975f5c5SAndroid Build Coastguard Worker // Ensure position is at location 0 in both programs.
6955*8975f5c5SAndroid Build Coastguard Worker GLint positionLocation = glGetAttribLocation(programs[i], "a_position");
6956*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(positionLocation, 0);
6957*8975f5c5SAndroid Build Coastguard Worker }
6958*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6959*8975f5c5SAndroid Build Coastguard Worker
6960*8975f5c5SAndroid Build Coastguard Worker std::array<Vector3, 6> quadVertices = GetQuadVertices();
6961*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, quadVertices.data());
6962*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(0);
6963*8975f5c5SAndroid Build Coastguard Worker
6964*8975f5c5SAndroid Build Coastguard Worker // Draw once with each so their uniforms are updated.
6965*8975f5c5SAndroid Build Coastguard Worker // The first draw will clear the screen to 255, 0, 0, 255
6966*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program2);
6967*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6968*8975f5c5SAndroid Build Coastguard Worker // The second draw will clear the screen to 127, 0, 0, 255
6969*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program1);
6970*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6971*8975f5c5SAndroid Build Coastguard Worker
6972*8975f5c5SAndroid Build Coastguard Worker // Draw with the previous program again, to make sure its default uniforms are bound again.
6973*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program2);
6974*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
6975*8975f5c5SAndroid Build Coastguard Worker
6976*8975f5c5SAndroid Build Coastguard Worker // Verify red was drawn
6977*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
6978*8975f5c5SAndroid Build Coastguard Worker }
6979*8975f5c5SAndroid Build Coastguard Worker
6980*8975f5c5SAndroid Build Coastguard Worker // Test that glDrawArrays when an empty-sized element array buffer is bound doesn't crash.
6981*8975f5c5SAndroid Build Coastguard Worker // Regression test for crbug.com/1172577.
TEST_P(SimpleStateChangeTest,DrawArraysWithZeroSizedElementArrayBuffer)6982*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, DrawArraysWithZeroSizedElementArrayBuffer)
6983*8975f5c5SAndroid Build Coastguard Worker {
6984*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
6985*8975f5c5SAndroid Build Coastguard Worker
6986*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
6987*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
6988*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, 0, nullptr, GL_DYNAMIC_DRAW);
6989*8975f5c5SAndroid Build Coastguard Worker drawQuad(greenProgram, essl1_shaders::PositionAttrib(), 0.0f);
6990*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
6991*8975f5c5SAndroid Build Coastguard Worker
6992*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
6993*8975f5c5SAndroid Build Coastguard Worker }
6994*8975f5c5SAndroid Build Coastguard Worker
6995*8975f5c5SAndroid Build Coastguard Worker // Validates GL_RASTERIZER_DISCARD state is tracked correctly
TEST_P(SimpleStateChangeTestES3,RasterizerDiscardState)6996*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, RasterizerDiscardState)
6997*8975f5c5SAndroid Build Coastguard Worker {
6998*8975f5c5SAndroid Build Coastguard Worker glClearColor(kFloatRed.R, kFloatRed.G, kFloatRed.B, kFloatRed.A);
6999*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
7000*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7001*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
7002*8975f5c5SAndroid Build Coastguard Worker
7003*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
7004*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
7005*8975f5c5SAndroid Build Coastguard Worker
7006*8975f5c5SAndroid Build Coastguard Worker // The drawQuad() should have no effect with GL_RASTERIZER_DISCARD enabled
7007*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_RASTERIZER_DISCARD);
7008*8975f5c5SAndroid Build Coastguard Worker glUseProgram(greenProgram);
7009*8975f5c5SAndroid Build Coastguard Worker drawQuad(greenProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
7010*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7011*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
7012*8975f5c5SAndroid Build Coastguard Worker
7013*8975f5c5SAndroid Build Coastguard Worker // The drawQuad() should draw something with GL_RASTERIZER_DISCARD disabled
7014*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_RASTERIZER_DISCARD);
7015*8975f5c5SAndroid Build Coastguard Worker glUseProgram(greenProgram);
7016*8975f5c5SAndroid Build Coastguard Worker drawQuad(greenProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
7017*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7018*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
7019*8975f5c5SAndroid Build Coastguard Worker
7020*8975f5c5SAndroid Build Coastguard Worker // The drawQuad() should have no effect with GL_RASTERIZER_DISCARD enabled
7021*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_RASTERIZER_DISCARD);
7022*8975f5c5SAndroid Build Coastguard Worker glUseProgram(blueProgram);
7023*8975f5c5SAndroid Build Coastguard Worker drawQuad(blueProgram, std::string(essl1_shaders::PositionAttrib()), 0.0f);
7024*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7025*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
7026*8975f5c5SAndroid Build Coastguard Worker }
7027*8975f5c5SAndroid Build Coastguard Worker
7028*8975f5c5SAndroid Build Coastguard Worker // Test that early return on binding the same texture is functional
TEST_P(SimpleStateChangeTestES3,BindingSameTexture)7029*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, BindingSameTexture)
7030*8975f5c5SAndroid Build Coastguard Worker {
7031*8975f5c5SAndroid Build Coastguard Worker // Create two 1x1 textures
7032*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 2;
7033*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, kSize> colors = {GLColor::yellow, GLColor::cyan};
7034*8975f5c5SAndroid Build Coastguard Worker
7035*8975f5c5SAndroid Build Coastguard Worker GLTexture tex[kSize];
7036*8975f5c5SAndroid Build Coastguard Worker // Bind texture 0 and 1 to active textures 0 and 1 and set data
7037*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
7038*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex[0]);
7039*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors[0].data());
7040*8975f5c5SAndroid Build Coastguard Worker
7041*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE1);
7042*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex[1]);
7043*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors[1].data());
7044*8975f5c5SAndroid Build Coastguard Worker
7045*8975f5c5SAndroid Build Coastguard Worker // Create simple program and query sampler location
7046*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
7047*8975f5c5SAndroid Build Coastguard Worker ASSERT(program.valid());
7048*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
7049*8975f5c5SAndroid Build Coastguard Worker GLint textureLocation = glGetUniformLocation(program, essl1_shaders::Texture2DUniform());
7050*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, textureLocation);
7051*8975f5c5SAndroid Build Coastguard Worker
7052*8975f5c5SAndroid Build Coastguard Worker // Draw using active texture 0.
7053*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
7054*8975f5c5SAndroid Build Coastguard Worker glUniform1i(textureLocation, 0);
7055*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex[0]);
7056*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
7057*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7058*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, colors[0]);
7059*8975f5c5SAndroid Build Coastguard Worker
7060*8975f5c5SAndroid Build Coastguard Worker // Draw using active texture 1.
7061*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE1);
7062*8975f5c5SAndroid Build Coastguard Worker glUniform1i(textureLocation, 1);
7063*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex[1]);
7064*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
7065*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7066*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, colors[1]);
7067*8975f5c5SAndroid Build Coastguard Worker
7068*8975f5c5SAndroid Build Coastguard Worker // Rebind the same texture to texture unit 1 and expect same color
7069*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex[1]);
7070*8975f5c5SAndroid Build Coastguard Worker glUniform1i(textureLocation, 1);
7071*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
7072*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7073*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, colors[1]);
7074*8975f5c5SAndroid Build Coastguard Worker
7075*8975f5c5SAndroid Build Coastguard Worker // Rebind the same texture to texture unit 0 and expect same color
7076*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
7077*8975f5c5SAndroid Build Coastguard Worker glUniform1i(textureLocation, 0);
7078*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex[0]);
7079*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
7080*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7081*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, colors[0]);
7082*8975f5c5SAndroid Build Coastguard Worker }
7083*8975f5c5SAndroid Build Coastguard Worker
7084*8975f5c5SAndroid Build Coastguard Worker // Test that early return on binding the same sampler is functional
TEST_P(SimpleStateChangeTestES3,BindingSameSampler)7085*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, BindingSameSampler)
7086*8975f5c5SAndroid Build Coastguard Worker {
7087*8975f5c5SAndroid Build Coastguard Worker // Create 2 samplers with different filtering.
7088*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kNumSamplers = 2;
7089*8975f5c5SAndroid Build Coastguard Worker GLSampler samplers[kNumSamplers];
7090*8975f5c5SAndroid Build Coastguard Worker
7091*8975f5c5SAndroid Build Coastguard Worker // Init sampler0
7092*8975f5c5SAndroid Build Coastguard Worker glBindSampler(0, samplers[0]);
7093*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[0], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7094*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[0], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7095*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7096*8975f5c5SAndroid Build Coastguard Worker
7097*8975f5c5SAndroid Build Coastguard Worker // Init sampler1
7098*8975f5c5SAndroid Build Coastguard Worker glBindSampler(1, samplers[1]);
7099*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[1], GL_TEXTURE_MIN_FILTER, GL_LINEAR);
7100*8975f5c5SAndroid Build Coastguard Worker glSamplerParameteri(samplers[1], GL_TEXTURE_MAG_FILTER, GL_LINEAR);
7101*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7102*8975f5c5SAndroid Build Coastguard Worker
7103*8975f5c5SAndroid Build Coastguard Worker // Create a simple 2x1 texture with black and white colors
7104*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 2> colors = {{GLColor::black, GLColor::white}};
7105*8975f5c5SAndroid Build Coastguard Worker
7106*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
7107*8975f5c5SAndroid Build Coastguard Worker // Bind the same texture to texture units 0 and 1
7108*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
7109*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
7110*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE1);
7111*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
7112*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
7113*8975f5c5SAndroid Build Coastguard Worker
7114*8975f5c5SAndroid Build Coastguard Worker // Create a program that uses 2 samplers.
7115*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision mediump float;
7116*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
7117*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D baseSampler;
7118*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D overrideSampler;
7119*8975f5c5SAndroid Build Coastguard Worker void main()
7120*8975f5c5SAndroid Build Coastguard Worker {
7121*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = texture2D(baseSampler, v_texCoord);
7122*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = texture2D(overrideSampler, v_texCoord);
7123*8975f5c5SAndroid Build Coastguard Worker })";
7124*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), kFS);
7125*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
7126*8975f5c5SAndroid Build Coastguard Worker GLint baseSamplerLoc = glGetUniformLocation(program, "baseSampler");
7127*8975f5c5SAndroid Build Coastguard Worker GLint overrideSamplerLoc = glGetUniformLocation(program, "overrideSampler");
7128*8975f5c5SAndroid Build Coastguard Worker
7129*8975f5c5SAndroid Build Coastguard Worker // Bind samplers to texture units 0 and 1
7130*8975f5c5SAndroid Build Coastguard Worker glBindSampler(0, samplers[0]);
7131*8975f5c5SAndroid Build Coastguard Worker glBindSampler(1, samplers[1]);
7132*8975f5c5SAndroid Build Coastguard Worker glUniform1i(baseSamplerLoc, 0);
7133*8975f5c5SAndroid Build Coastguard Worker glUniform1i(overrideSamplerLoc, 1);
7134*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.5f);
7135*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7136*8975f5c5SAndroid Build Coastguard Worker // A gradient should have been rendered since "overrideSampler" has linear filter,
7137*8975f5c5SAndroid Build Coastguard Worker // we should not expect a solid black or white color.
7138*8975f5c5SAndroid Build Coastguard Worker EXPECT_NE(angle::ReadColor(getWindowWidth() / 2, getWindowHeight() / 2), GLColor::black);
7139*8975f5c5SAndroid Build Coastguard Worker EXPECT_NE(angle::ReadColor(getWindowWidth() / 2, getWindowHeight() / 2), GLColor::white);
7140*8975f5c5SAndroid Build Coastguard Worker
7141*8975f5c5SAndroid Build Coastguard Worker // Switch sampler bindings
7142*8975f5c5SAndroid Build Coastguard Worker glBindSampler(1, samplers[0]);
7143*8975f5c5SAndroid Build Coastguard Worker glBindSampler(0, samplers[1]);
7144*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.5f);
7145*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7146*8975f5c5SAndroid Build Coastguard Worker // Now that "overrideSampler" has nearest filter expect solid colors.
7147*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
7148*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, 0, GLColor::white);
7149*8975f5c5SAndroid Build Coastguard Worker
7150*8975f5c5SAndroid Build Coastguard Worker // Rebind the same samplers again and expect same output
7151*8975f5c5SAndroid Build Coastguard Worker glBindSampler(1, samplers[0]);
7152*8975f5c5SAndroid Build Coastguard Worker glBindSampler(0, samplers[1]);
7153*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.5f);
7154*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7155*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
7156*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, 0, GLColor::white);
7157*8975f5c5SAndroid Build Coastguard Worker }
7158*8975f5c5SAndroid Build Coastguard Worker
7159*8975f5c5SAndroid Build Coastguard Worker // Test that early return on binding the same buffer is functional
TEST_P(SimpleStateChangeTestES3,BindingSameBuffer)7160*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, BindingSameBuffer)
7161*8975f5c5SAndroid Build Coastguard Worker {
7162*8975f5c5SAndroid Build Coastguard Worker GLushort indexData[] = {0, 1, 2, 3};
7163*8975f5c5SAndroid Build Coastguard Worker
7164*8975f5c5SAndroid Build Coastguard Worker GLBuffer elementArrayBuffer;
7165*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementArrayBuffer);
7166*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData, GL_STATIC_DRAW);
7167*8975f5c5SAndroid Build Coastguard Worker
7168*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kZeroVertexShaderForPoints, essl1_shaders::fs::Red());
7169*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
7170*8975f5c5SAndroid Build Coastguard Worker
7171*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_POINTS, 4, GL_UNSIGNED_SHORT, 0);
7172*8975f5c5SAndroid Build Coastguard Worker
7173*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> colors0(kWindowSize * kWindowSize);
7174*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, kWindowSize, kWindowSize, GL_RGBA, GL_UNSIGNED_BYTE, colors0.data());
7175*8975f5c5SAndroid Build Coastguard Worker
7176*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementArrayBuffer);
7177*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_POINTS, 4, GL_UNSIGNED_SHORT, 0);
7178*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> colors1(kWindowSize * kWindowSize);
7179*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, kWindowSize, kWindowSize, GL_RGBA, GL_UNSIGNED_BYTE, colors1.data());
7180*8975f5c5SAndroid Build Coastguard Worker
7181*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(colors0, colors1);
7182*8975f5c5SAndroid Build Coastguard Worker }
7183*8975f5c5SAndroid Build Coastguard Worker
7184*8975f5c5SAndroid Build Coastguard Worker class ImageRespecificationTest : public ANGLETest<>
7185*8975f5c5SAndroid Build Coastguard Worker {
7186*8975f5c5SAndroid Build Coastguard Worker protected:
ImageRespecificationTest()7187*8975f5c5SAndroid Build Coastguard Worker ImageRespecificationTest()
7188*8975f5c5SAndroid Build Coastguard Worker {
7189*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(128);
7190*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(128);
7191*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
7192*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
7193*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
7194*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
7195*8975f5c5SAndroid Build Coastguard Worker setConfigDepthBits(24);
7196*8975f5c5SAndroid Build Coastguard Worker }
7197*8975f5c5SAndroid Build Coastguard Worker
testSetUp()7198*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
7199*8975f5c5SAndroid Build Coastguard Worker {
7200*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(precision highp float;
7201*8975f5c5SAndroid Build Coastguard Worker attribute vec4 position;
7202*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
7203*8975f5c5SAndroid Build Coastguard Worker
7204*8975f5c5SAndroid Build Coastguard Worker void main()
7205*8975f5c5SAndroid Build Coastguard Worker {
7206*8975f5c5SAndroid Build Coastguard Worker gl_Position = position;
7207*8975f5c5SAndroid Build Coastguard Worker texcoord = (position.xy * 0.5) + 0.5;
7208*8975f5c5SAndroid Build Coastguard Worker })";
7209*8975f5c5SAndroid Build Coastguard Worker
7210*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision highp float;
7211*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
7212*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
7213*8975f5c5SAndroid Build Coastguard Worker
7214*8975f5c5SAndroid Build Coastguard Worker void main()
7215*8975f5c5SAndroid Build Coastguard Worker {
7216*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = texture2D(tex, texcoord);
7217*8975f5c5SAndroid Build Coastguard Worker })";
7218*8975f5c5SAndroid Build Coastguard Worker
7219*8975f5c5SAndroid Build Coastguard Worker mProgram = CompileProgram(kVS, kFS);
7220*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(0u, mProgram);
7221*8975f5c5SAndroid Build Coastguard Worker
7222*8975f5c5SAndroid Build Coastguard Worker mTextureUniformLocation = glGetUniformLocation(mProgram, "tex");
7223*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, mTextureUniformLocation);
7224*8975f5c5SAndroid Build Coastguard Worker
7225*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
7226*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7227*8975f5c5SAndroid Build Coastguard Worker }
7228*8975f5c5SAndroid Build Coastguard Worker
testTearDown()7229*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override
7230*8975f5c5SAndroid Build Coastguard Worker {
7231*8975f5c5SAndroid Build Coastguard Worker if (mProgram != 0)
7232*8975f5c5SAndroid Build Coastguard Worker {
7233*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mProgram);
7234*8975f5c5SAndroid Build Coastguard Worker }
7235*8975f5c5SAndroid Build Coastguard Worker }
7236*8975f5c5SAndroid Build Coastguard Worker
7237*8975f5c5SAndroid Build Coastguard Worker template <typename T>
init2DSourceTexture(GLenum internalFormat,GLenum dataFormat,GLenum dataType,const T * data)7238*8975f5c5SAndroid Build Coastguard Worker void init2DSourceTexture(GLenum internalFormat,
7239*8975f5c5SAndroid Build Coastguard Worker GLenum dataFormat,
7240*8975f5c5SAndroid Build Coastguard Worker GLenum dataType,
7241*8975f5c5SAndroid Build Coastguard Worker const T *data)
7242*8975f5c5SAndroid Build Coastguard Worker {
7243*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mSourceTexture);
7244*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
7245*8975f5c5SAndroid Build Coastguard Worker
7246*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7247*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7248*8975f5c5SAndroid Build Coastguard Worker
7249*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
7250*8975f5c5SAndroid Build Coastguard Worker }
7251*8975f5c5SAndroid Build Coastguard Worker
attachTargetTextureToFramebuffer()7252*8975f5c5SAndroid Build Coastguard Worker void attachTargetTextureToFramebuffer()
7253*8975f5c5SAndroid Build Coastguard Worker {
7254*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
7255*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTargetTexture,
7256*8975f5c5SAndroid Build Coastguard Worker 0);
7257*8975f5c5SAndroid Build Coastguard Worker
7258*8975f5c5SAndroid Build Coastguard Worker ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
7259*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7260*8975f5c5SAndroid Build Coastguard Worker
7261*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
7262*8975f5c5SAndroid Build Coastguard Worker }
7263*8975f5c5SAndroid Build Coastguard Worker
renderToTargetTexture()7264*8975f5c5SAndroid Build Coastguard Worker void renderToTargetTexture()
7265*8975f5c5SAndroid Build Coastguard Worker {
7266*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
7267*8975f5c5SAndroid Build Coastguard Worker
7268*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
7269*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mSourceTexture);
7270*8975f5c5SAndroid Build Coastguard Worker
7271*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
7272*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mTextureUniformLocation, 0);
7273*8975f5c5SAndroid Build Coastguard Worker
7274*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
7275*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7276*8975f5c5SAndroid Build Coastguard Worker
7277*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
7278*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
7279*8975f5c5SAndroid Build Coastguard Worker glUseProgram(0);
7280*8975f5c5SAndroid Build Coastguard Worker }
7281*8975f5c5SAndroid Build Coastguard Worker
renderToDefaultFramebuffer(GLColor * expectedData)7282*8975f5c5SAndroid Build Coastguard Worker void renderToDefaultFramebuffer(GLColor *expectedData)
7283*8975f5c5SAndroid Build Coastguard Worker {
7284*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
7285*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
7286*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTargetTexture);
7287*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mTextureUniformLocation, 0);
7288*8975f5c5SAndroid Build Coastguard Worker
7289*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
7290*8975f5c5SAndroid Build Coastguard Worker drawQuad(mProgram, "position", 0.5f);
7291*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7292*8975f5c5SAndroid Build Coastguard Worker
7293*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, *expectedData);
7294*8975f5c5SAndroid Build Coastguard Worker
7295*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
7296*8975f5c5SAndroid Build Coastguard Worker glUseProgram(0);
7297*8975f5c5SAndroid Build Coastguard Worker }
7298*8975f5c5SAndroid Build Coastguard Worker
7299*8975f5c5SAndroid Build Coastguard Worker GLuint mProgram;
7300*8975f5c5SAndroid Build Coastguard Worker GLint mTextureUniformLocation;
7301*8975f5c5SAndroid Build Coastguard Worker
7302*8975f5c5SAndroid Build Coastguard Worker GLTexture mSourceTexture;
7303*8975f5c5SAndroid Build Coastguard Worker GLTexture mTargetTexture;
7304*8975f5c5SAndroid Build Coastguard Worker
7305*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer mFramebuffer;
7306*8975f5c5SAndroid Build Coastguard Worker };
7307*8975f5c5SAndroid Build Coastguard Worker
7308*8975f5c5SAndroid Build Coastguard Worker // Verify that a swizzle on an active sampler is handled appropriately
TEST_P(ImageRespecificationTest,Swizzle)7309*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageRespecificationTest, Swizzle)
7310*8975f5c5SAndroid Build Coastguard Worker {
7311*8975f5c5SAndroid Build Coastguard Worker GLubyte data[] = {1, 64, 128, 200};
7312*8975f5c5SAndroid Build Coastguard Worker GLColor expectedData(data[0], data[1], data[2], data[3]);
7313*8975f5c5SAndroid Build Coastguard Worker
7314*8975f5c5SAndroid Build Coastguard Worker // Create the source and target texture
7315*8975f5c5SAndroid Build Coastguard Worker init2DSourceTexture(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, data);
7316*8975f5c5SAndroid Build Coastguard Worker
7317*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTargetTexture);
7318*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
7319*8975f5c5SAndroid Build Coastguard Worker
7320*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7321*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7322*8975f5c5SAndroid Build Coastguard Worker
7323*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
7324*8975f5c5SAndroid Build Coastguard Worker
7325*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer and the target texture is attached to the framebuffer.
7326*8975f5c5SAndroid Build Coastguard Worker attachTargetTextureToFramebuffer();
7327*8975f5c5SAndroid Build Coastguard Worker
7328*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
7329*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
7330*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
7331*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
7332*8975f5c5SAndroid Build Coastguard Worker
7333*8975f5c5SAndroid Build Coastguard Worker // Render content of source texture to target texture
7334*8975f5c5SAndroid Build Coastguard Worker // This command triggers the creation of -
7335*8975f5c5SAndroid Build Coastguard Worker // - draw imageviews of the texture
7336*8975f5c5SAndroid Build Coastguard Worker // - VkFramebuffer object of the framebuffer
7337*8975f5c5SAndroid Build Coastguard Worker renderToTargetTexture();
7338*8975f5c5SAndroid Build Coastguard Worker
7339*8975f5c5SAndroid Build Coastguard Worker // This swizzle operation should cause the read imageviews of the texture to be released
7340*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTargetTexture);
7341*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
7342*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
7343*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
7344*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
7345*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
7346*8975f5c5SAndroid Build Coastguard Worker
7347*8975f5c5SAndroid Build Coastguard Worker // Draw using the newly created read imageviews
7348*8975f5c5SAndroid Build Coastguard Worker renderToDefaultFramebuffer(&expectedData);
7349*8975f5c5SAndroid Build Coastguard Worker
7350*8975f5c5SAndroid Build Coastguard Worker // Render content of source texture to target texture, again
7351*8975f5c5SAndroid Build Coastguard Worker renderToTargetTexture();
7352*8975f5c5SAndroid Build Coastguard Worker
7353*8975f5c5SAndroid Build Coastguard Worker // Make sure the content rendered to target texture is correct
7354*8975f5c5SAndroid Build Coastguard Worker renderToDefaultFramebuffer(&expectedData);
7355*8975f5c5SAndroid Build Coastguard Worker }
7356*8975f5c5SAndroid Build Coastguard Worker
7357*8975f5c5SAndroid Build Coastguard Worker // Verify that when a texture is respecified through glEGLImageTargetTexture2DOES,
7358*8975f5c5SAndroid Build Coastguard Worker // the Framebuffer that has the texture as a color attachment is recreated before next use.
TEST_P(ImageRespecificationTest,ImageTarget2DOESSwitch)7359*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageRespecificationTest, ImageTarget2DOESSwitch)
7360*8975f5c5SAndroid Build Coastguard Worker {
7361*8975f5c5SAndroid Build Coastguard Worker // This is the specific problem on the Vulkan backend and needs some extensions
7362*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(
7363*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_OES_EGL_image_external") ||
7364*8975f5c5SAndroid Build Coastguard Worker !IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(), "EGL_KHR_gl_texture_2D_image"));
7365*8975f5c5SAndroid Build Coastguard Worker
7366*8975f5c5SAndroid Build Coastguard Worker GLubyte data[] = {1, 64, 128, 200};
7367*8975f5c5SAndroid Build Coastguard Worker GLColor expectedData(data[0], data[1], data[2], data[3]);
7368*8975f5c5SAndroid Build Coastguard Worker
7369*8975f5c5SAndroid Build Coastguard Worker // Create the source texture
7370*8975f5c5SAndroid Build Coastguard Worker init2DSourceTexture(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, data);
7371*8975f5c5SAndroid Build Coastguard Worker
7372*8975f5c5SAndroid Build Coastguard Worker // Create the first EGL image to attach the framebuffer through the texture
7373*8975f5c5SAndroid Build Coastguard Worker GLTexture firstTexture;
7374*8975f5c5SAndroid Build Coastguard Worker
7375*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, firstTexture);
7376*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
7377*8975f5c5SAndroid Build Coastguard Worker
7378*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7379*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7380*8975f5c5SAndroid Build Coastguard Worker
7381*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
7382*8975f5c5SAndroid Build Coastguard Worker
7383*8975f5c5SAndroid Build Coastguard Worker EGLWindow *window = getEGLWindow();
7384*8975f5c5SAndroid Build Coastguard Worker EGLint attribs[] = {
7385*8975f5c5SAndroid Build Coastguard Worker EGL_IMAGE_PRESERVED,
7386*8975f5c5SAndroid Build Coastguard Worker EGL_TRUE,
7387*8975f5c5SAndroid Build Coastguard Worker EGL_NONE,
7388*8975f5c5SAndroid Build Coastguard Worker };
7389*8975f5c5SAndroid Build Coastguard Worker EGLImageKHR firstEGLImage = eglCreateImageKHR(
7390*8975f5c5SAndroid Build Coastguard Worker window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
7391*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<EGLClientBuffer>(static_cast<uintptr_t>(firstTexture)), attribs);
7392*8975f5c5SAndroid Build Coastguard Worker ASSERT_EGL_SUCCESS();
7393*8975f5c5SAndroid Build Coastguard Worker
7394*8975f5c5SAndroid Build Coastguard Worker // Create the target texture and attach it to the framebuffer
7395*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTargetTexture);
7396*8975f5c5SAndroid Build Coastguard Worker glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, firstEGLImage);
7397*8975f5c5SAndroid Build Coastguard Worker
7398*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7399*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7400*8975f5c5SAndroid Build Coastguard Worker
7401*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
7402*8975f5c5SAndroid Build Coastguard Worker
7403*8975f5c5SAndroid Build Coastguard Worker attachTargetTextureToFramebuffer();
7404*8975f5c5SAndroid Build Coastguard Worker
7405*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
7406*8975f5c5SAndroid Build Coastguard Worker
7407*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
7408*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
7409*8975f5c5SAndroid Build Coastguard Worker
7410*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
7411*8975f5c5SAndroid Build Coastguard Worker
7412*8975f5c5SAndroid Build Coastguard Worker // Render content of source texture to target texture
7413*8975f5c5SAndroid Build Coastguard Worker // This command triggers the creation of -
7414*8975f5c5SAndroid Build Coastguard Worker // - draw imageviews of the texture
7415*8975f5c5SAndroid Build Coastguard Worker // - VkFramebuffer object of the framebuffer
7416*8975f5c5SAndroid Build Coastguard Worker renderToTargetTexture();
7417*8975f5c5SAndroid Build Coastguard Worker
7418*8975f5c5SAndroid Build Coastguard Worker // Make sure the content rendered to target texture is correct
7419*8975f5c5SAndroid Build Coastguard Worker renderToDefaultFramebuffer(&expectedData);
7420*8975f5c5SAndroid Build Coastguard Worker
7421*8975f5c5SAndroid Build Coastguard Worker // Create the second EGL image
7422*8975f5c5SAndroid Build Coastguard Worker GLTexture secondTexture;
7423*8975f5c5SAndroid Build Coastguard Worker
7424*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, secondTexture);
7425*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
7426*8975f5c5SAndroid Build Coastguard Worker
7427*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7428*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7429*8975f5c5SAndroid Build Coastguard Worker
7430*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
7431*8975f5c5SAndroid Build Coastguard Worker
7432*8975f5c5SAndroid Build Coastguard Worker EGLImageKHR secondEGLImage = eglCreateImageKHR(
7433*8975f5c5SAndroid Build Coastguard Worker window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
7434*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<EGLClientBuffer>(static_cast<uintptr_t>(secondTexture)), attribs);
7435*8975f5c5SAndroid Build Coastguard Worker ASSERT_EGL_SUCCESS();
7436*8975f5c5SAndroid Build Coastguard Worker
7437*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTargetTexture);
7438*8975f5c5SAndroid Build Coastguard Worker // This will release all the imageviews related to the first EGL image
7439*8975f5c5SAndroid Build Coastguard Worker glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, secondEGLImage);
7440*8975f5c5SAndroid Build Coastguard Worker
7441*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7442*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7443*8975f5c5SAndroid Build Coastguard Worker
7444*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
7445*8975f5c5SAndroid Build Coastguard Worker
7446*8975f5c5SAndroid Build Coastguard Worker // Attach the first EGL image to the target texture again
7447*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTargetTexture);
7448*8975f5c5SAndroid Build Coastguard Worker glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, firstEGLImage);
7449*8975f5c5SAndroid Build Coastguard Worker
7450*8975f5c5SAndroid Build Coastguard Worker // This is for checking this code can deal with the problem even if both ORPHAN and
7451*8975f5c5SAndroid Build Coastguard Worker // COLOR_ATTACHMENT dirty bits are set.
7452*8975f5c5SAndroid Build Coastguard Worker GLTexture tempTexture;
7453*8975f5c5SAndroid Build Coastguard Worker
7454*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tempTexture);
7455*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
7456*8975f5c5SAndroid Build Coastguard Worker
7457*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
7458*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7459*8975f5c5SAndroid Build Coastguard Worker
7460*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
7461*8975f5c5SAndroid Build Coastguard Worker
7462*8975f5c5SAndroid Build Coastguard Worker // This sets COLOR_ATTACHMENT dirty bit
7463*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
7464*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tempTexture, 0);
7465*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
7466*8975f5c5SAndroid Build Coastguard Worker
7467*8975f5c5SAndroid Build Coastguard Worker // The released imageviews related to "secondEGLImage" will be garbage collected
7468*8975f5c5SAndroid Build Coastguard Worker renderToDefaultFramebuffer(&expectedData);
7469*8975f5c5SAndroid Build Coastguard Worker
7470*8975f5c5SAndroid Build Coastguard Worker // Process both OPPHAN and COLOR_ATTACHMENT dirty bits
7471*8975f5c5SAndroid Build Coastguard Worker renderToTargetTexture();
7472*8975f5c5SAndroid Build Coastguard Worker
7473*8975f5c5SAndroid Build Coastguard Worker // Make sure the content rendered to target texture is correct
7474*8975f5c5SAndroid Build Coastguard Worker renderToDefaultFramebuffer(&expectedData);
7475*8975f5c5SAndroid Build Coastguard Worker
7476*8975f5c5SAndroid Build Coastguard Worker // Render content of source texture to target texture
7477*8975f5c5SAndroid Build Coastguard Worker attachTargetTextureToFramebuffer();
7478*8975f5c5SAndroid Build Coastguard Worker renderToTargetTexture();
7479*8975f5c5SAndroid Build Coastguard Worker
7480*8975f5c5SAndroid Build Coastguard Worker // Make sure the content rendered to target texture is correct
7481*8975f5c5SAndroid Build Coastguard Worker renderToDefaultFramebuffer(&expectedData);
7482*8975f5c5SAndroid Build Coastguard Worker
7483*8975f5c5SAndroid Build Coastguard Worker eglDestroyImageKHR(window->getDisplay(), firstEGLImage);
7484*8975f5c5SAndroid Build Coastguard Worker eglDestroyImageKHR(window->getDisplay(), secondEGLImage);
7485*8975f5c5SAndroid Build Coastguard Worker }
7486*8975f5c5SAndroid Build Coastguard Worker
7487*8975f5c5SAndroid Build Coastguard Worker // Covers a bug where sometimes we wouldn't catch invalid element buffer sizes.
TEST_P(WebGL2ValidationStateChangeTest,DeleteElementArrayBufferValidation)7488*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGL2ValidationStateChangeTest, DeleteElementArrayBufferValidation)
7489*8975f5c5SAndroid Build Coastguard Worker {
7490*8975f5c5SAndroid Build Coastguard Worker GLushort indexData[] = {0, 1, 2, 3};
7491*8975f5c5SAndroid Build Coastguard Worker
7492*8975f5c5SAndroid Build Coastguard Worker GLBuffer elementArrayBuffer;
7493*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementArrayBuffer);
7494*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData, GL_STATIC_DRAW);
7495*8975f5c5SAndroid Build Coastguard Worker
7496*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Zero(), essl1_shaders::fs::Red());
7497*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
7498*8975f5c5SAndroid Build Coastguard Worker
7499*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_POINTS, 4, GL_UNSIGNED_SHORT, 0);
7500*8975f5c5SAndroid Build Coastguard Worker
7501*8975f5c5SAndroid Build Coastguard Worker elementArrayBuffer.reset();
7502*8975f5c5SAndroid Build Coastguard Worker
7503*8975f5c5SAndroid Build Coastguard Worker // Must use a non-0 offset and a multiple of the type size.
7504*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_POINTS, 4, GL_UNSIGNED_SHORT, reinterpret_cast<const void *>(0x4));
7505*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
7506*8975f5c5SAndroid Build Coastguard Worker }
7507*8975f5c5SAndroid Build Coastguard Worker
7508*8975f5c5SAndroid Build Coastguard Worker // Covers a bug in the D3D11 back-end related to how buffers are translated.
TEST_P(RobustBufferAccessWebGL2ValidationStateChangeTest,BindZeroSizeBufferThenDeleteBufferBug)7509*8975f5c5SAndroid Build Coastguard Worker TEST_P(RobustBufferAccessWebGL2ValidationStateChangeTest, BindZeroSizeBufferThenDeleteBufferBug)
7510*8975f5c5SAndroid Build Coastguard Worker {
7511*8975f5c5SAndroid Build Coastguard Worker // SwiftShader does not currently support robustness.
7512*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(isSwiftshader());
7513*8975f5c5SAndroid Build Coastguard Worker
7514*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263447
7515*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAndroid() && IsVulkan());
7516*8975f5c5SAndroid Build Coastguard Worker
7517*8975f5c5SAndroid Build Coastguard Worker // no intent to follow up on this failure.
7518*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGL());
7519*8975f5c5SAndroid Build Coastguard Worker
7520*8975f5c5SAndroid Build Coastguard Worker // no intent to follow up on this failure.
7521*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL());
7522*8975f5c5SAndroid Build Coastguard Worker
7523*8975f5c5SAndroid Build Coastguard Worker // no intent to follow up on this failure.
7524*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsMac());
7525*8975f5c5SAndroid Build Coastguard Worker
7526*8975f5c5SAndroid Build Coastguard Worker // Mali does not support robustness now.
7527*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsARM());
7528*8975f5c5SAndroid Build Coastguard Worker
7529*8975f5c5SAndroid Build Coastguard Worker std::vector<GLubyte> data(48, 1);
7530*8975f5c5SAndroid Build Coastguard Worker
7531*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Red());
7532*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
7533*8975f5c5SAndroid Build Coastguard Worker
7534*8975f5c5SAndroid Build Coastguard Worker // First bind and draw with a buffer with a format we know to be "Direct" in D3D11.
7535*8975f5c5SAndroid Build Coastguard Worker GLBuffer arrayBuffer;
7536*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
7537*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, 48, data.data(), GL_STATIC_DRAW);
7538*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
7539*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(0);
7540*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
7541*8975f5c5SAndroid Build Coastguard Worker
7542*8975f5c5SAndroid Build Coastguard Worker // Then bind a zero size buffer and draw.
7543*8975f5c5SAndroid Build Coastguard Worker GLBuffer secondBuffer;
7544*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, secondBuffer);
7545*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(0, 4, GL_UNSIGNED_BYTE, GL_FALSE, 1, 0);
7546*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
7547*8975f5c5SAndroid Build Coastguard Worker
7548*8975f5c5SAndroid Build Coastguard Worker // Finally delete the original buffer. This triggers the bug.
7549*8975f5c5SAndroid Build Coastguard Worker arrayBuffer.reset();
7550*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
7551*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7552*8975f5c5SAndroid Build Coastguard Worker }
7553*8975f5c5SAndroid Build Coastguard Worker
7554*8975f5c5SAndroid Build Coastguard Worker // Tests DrawElements with an empty buffer using a VAO.
TEST_P(WebGL2ValidationStateChangeTest,DrawElementsEmptyVertexArray)7555*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGL2ValidationStateChangeTest, DrawElementsEmptyVertexArray)
7556*8975f5c5SAndroid Build Coastguard Worker {
7557*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
7558*8975f5c5SAndroid Build Coastguard Worker
7559*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
7560*8975f5c5SAndroid Build Coastguard Worker
7561*8975f5c5SAndroid Build Coastguard Worker // Draw with empty buffer. Out of range but valid.
7562*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
7563*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
7564*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT, reinterpret_cast<const GLvoid *>(0x1000));
7565*8975f5c5SAndroid Build Coastguard Worker
7566*8975f5c5SAndroid Build Coastguard Worker // Switch VAO. No buffer bound, should be an error.
7567*8975f5c5SAndroid Build Coastguard Worker GLVertexArray vao;
7568*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(vao);
7569*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_LINE_STRIP, 0x1000, GL_UNSIGNED_SHORT,
7570*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<const GLvoid *>(0x1000));
7571*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
7572*8975f5c5SAndroid Build Coastguard Worker }
7573*8975f5c5SAndroid Build Coastguard Worker
7574*8975f5c5SAndroid Build Coastguard Worker // Test that closing the render pass due to an update to UBO data then drawing non-indexed followed
7575*8975f5c5SAndroid Build Coastguard Worker // by indexed works.
TEST_P(SimpleStateChangeTestES31,DrawThenUpdateUBOThenDrawThenDrawIndexed)7576*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, DrawThenUpdateUBOThenDrawThenDrawIndexed)
7577*8975f5c5SAndroid Build Coastguard Worker {
7578*8975f5c5SAndroid Build Coastguard Worker // First, create the index buffer and issue an indexed draw call. This clears the index dirty
7579*8975f5c5SAndroid Build Coastguard Worker // bit.
7580*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
7581*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
7582*8975f5c5SAndroid Build Coastguard Worker
7583*8975f5c5SAndroid Build Coastguard Worker const std::array<GLuint, 4> kIndexData = {0, 1, 2, 0};
7584*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(kIndexData), kIndexData.data(), GL_STATIC_DRAW);
7585*8975f5c5SAndroid Build Coastguard Worker
7586*8975f5c5SAndroid Build Coastguard Worker // Setup vertices.
7587*8975f5c5SAndroid Build Coastguard Worker const std::array<GLfloat, 6> kVertices = {
7588*8975f5c5SAndroid Build Coastguard Worker -1, -1, 3, -1, -1, 3,
7589*8975f5c5SAndroid Build Coastguard Worker };
7590*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
7591*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
7592*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(kVertices), kVertices.data(), GL_STATIC_DRAW);
7593*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
7594*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(0);
7595*8975f5c5SAndroid Build Coastguard Worker
7596*8975f5c5SAndroid Build Coastguard Worker // Create a uniform buffer that will get modified. This is used to break the render pass.
7597*8975f5c5SAndroid Build Coastguard Worker const std::array<GLuint, 4> kUboData1 = {0x12345678u, 0, 0, 0};
7598*8975f5c5SAndroid Build Coastguard Worker
7599*8975f5c5SAndroid Build Coastguard Worker GLBuffer ubo;
7600*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_UNIFORM_BUFFER, ubo);
7601*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_UNIFORM_BUFFER, 0, ubo);
7602*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_UNIFORM_BUFFER, sizeof(kUboData1), kUboData1.data(), GL_DYNAMIC_DRAW);
7603*8975f5c5SAndroid Build Coastguard Worker
7604*8975f5c5SAndroid Build Coastguard Worker // Set up a program. The same program is used for all draw calls to avoid state change due to
7605*8975f5c5SAndroid Build Coastguard Worker // program change.
7606*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
7607*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
7608*8975f5c5SAndroid Build Coastguard Worker uniform block { uint data; } ubo;
7609*8975f5c5SAndroid Build Coastguard Worker uniform uint expect;
7610*8975f5c5SAndroid Build Coastguard Worker uniform vec4 successColor;
7611*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
7612*8975f5c5SAndroid Build Coastguard Worker void main()
7613*8975f5c5SAndroid Build Coastguard Worker {
7614*8975f5c5SAndroid Build Coastguard Worker colorOut = ubo.data == expect ? successColor : colorOut = vec4(0, 0, 0, 0);
7615*8975f5c5SAndroid Build Coastguard Worker })";
7616*8975f5c5SAndroid Build Coastguard Worker
7617*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
7618*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
7619*8975f5c5SAndroid Build Coastguard Worker
7620*8975f5c5SAndroid Build Coastguard Worker const GLint positionLoc = glGetAttribLocation(program, essl3_shaders::PositionAttrib());
7621*8975f5c5SAndroid Build Coastguard Worker const GLint expectLoc = glGetUniformLocation(program, "expect");
7622*8975f5c5SAndroid Build Coastguard Worker const GLint successLoc = glGetUniformLocation(program, "successColor");
7623*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
7624*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, expectLoc);
7625*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, successLoc);
7626*8975f5c5SAndroid Build Coastguard Worker
7627*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, 0);
7628*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
7629*8975f5c5SAndroid Build Coastguard Worker
7630*8975f5c5SAndroid Build Coastguard Worker glUniform1ui(expectLoc, kUboData1[0]);
7631*8975f5c5SAndroid Build Coastguard Worker glUniform4f(successLoc, 0, 0, 0, 1);
7632*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
7633*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
7634*8975f5c5SAndroid Build Coastguard Worker
7635*8975f5c5SAndroid Build Coastguard Worker // Then upload data to the UBO so on next use the render pass has to break. This draw call is
7636*8975f5c5SAndroid Build Coastguard Worker // not indexed.
7637*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint kUboData2 = 0x87654321u;
7638*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(kUboData2), &kUboData2);
7639*8975f5c5SAndroid Build Coastguard Worker
7640*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
7641*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
7642*8975f5c5SAndroid Build Coastguard Worker glUniform1ui(expectLoc, kUboData2);
7643*8975f5c5SAndroid Build Coastguard Worker glUniform4f(successLoc, 0, 1, 0, 0);
7644*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
7645*8975f5c5SAndroid Build Coastguard Worker
7646*8975f5c5SAndroid Build Coastguard Worker // Issue another draw call that is indexed. The index buffer should be bound correctly on the
7647*8975f5c5SAndroid Build Coastguard Worker // new render pass.
7648*8975f5c5SAndroid Build Coastguard Worker glUniform4f(successLoc, 0, 0, 1, 0);
7649*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
7650*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
7651*8975f5c5SAndroid Build Coastguard Worker
7652*8975f5c5SAndroid Build Coastguard Worker // Ensure correct rendering.
7653*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
7654*8975f5c5SAndroid Build Coastguard Worker }
7655*8975f5c5SAndroid Build Coastguard Worker
7656*8975f5c5SAndroid Build Coastguard Worker // Test that switching framebuffers then a non-indexed draw followed by an indexed one works.
TEST_P(SimpleStateChangeTestES31,DrawThenChangeFBOThenDrawThenDrawIndexed)7657*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, DrawThenChangeFBOThenDrawThenDrawIndexed)
7658*8975f5c5SAndroid Build Coastguard Worker {
7659*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer, and make sure it and the default framebuffer are fully synced.
7660*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
7661*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
7662*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
7663*8975f5c5SAndroid Build Coastguard Worker
7664*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
7665*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
7666*8975f5c5SAndroid Build Coastguard Worker
7667*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
7668*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7669*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16);
7670*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
7671*8975f5c5SAndroid Build Coastguard Worker
7672*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
7673*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
7674*8975f5c5SAndroid Build Coastguard Worker
7675*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
7676*8975f5c5SAndroid Build Coastguard Worker
7677*8975f5c5SAndroid Build Coastguard Worker // First, create the index buffer and issue an indexed draw call. This clears the index dirty
7678*8975f5c5SAndroid Build Coastguard Worker // bit.
7679*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
7680*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
7681*8975f5c5SAndroid Build Coastguard Worker
7682*8975f5c5SAndroid Build Coastguard Worker const std::array<GLuint, 4> kIndexData = {0, 1, 2, 0};
7683*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(kIndexData), kIndexData.data(), GL_STATIC_DRAW);
7684*8975f5c5SAndroid Build Coastguard Worker
7685*8975f5c5SAndroid Build Coastguard Worker // Setup vertices.
7686*8975f5c5SAndroid Build Coastguard Worker const std::array<GLfloat, 6> kVertices = {
7687*8975f5c5SAndroid Build Coastguard Worker -1, -1, 3, -1, -1, 3,
7688*8975f5c5SAndroid Build Coastguard Worker };
7689*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
7690*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
7691*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(kVertices), kVertices.data(), GL_STATIC_DRAW);
7692*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
7693*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(0);
7694*8975f5c5SAndroid Build Coastguard Worker
7695*8975f5c5SAndroid Build Coastguard Worker // Set up a program. The same program is used for all draw calls to avoid state change due to
7696*8975f5c5SAndroid Build Coastguard Worker // program change.
7697*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
7698*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
7699*8975f5c5SAndroid Build Coastguard Worker uniform vec4 colorIn;
7700*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
7701*8975f5c5SAndroid Build Coastguard Worker void main()
7702*8975f5c5SAndroid Build Coastguard Worker {
7703*8975f5c5SAndroid Build Coastguard Worker colorOut = colorIn;
7704*8975f5c5SAndroid Build Coastguard Worker })";
7705*8975f5c5SAndroid Build Coastguard Worker
7706*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
7707*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
7708*8975f5c5SAndroid Build Coastguard Worker
7709*8975f5c5SAndroid Build Coastguard Worker const GLint positionLoc = glGetAttribLocation(program, essl3_shaders::PositionAttrib());
7710*8975f5c5SAndroid Build Coastguard Worker const GLint colorLoc = glGetUniformLocation(program, "colorIn");
7711*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
7712*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
7713*8975f5c5SAndroid Build Coastguard Worker
7714*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, 0);
7715*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
7716*8975f5c5SAndroid Build Coastguard Worker
7717*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
7718*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
7719*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
7720*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
7721*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
7722*8975f5c5SAndroid Build Coastguard Worker
7723*8975f5c5SAndroid Build Coastguard Worker // Then switch to fbo and issue a non-indexed draw call followed by an indexed one.
7724*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7725*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 0);
7726*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
7727*8975f5c5SAndroid Build Coastguard Worker
7728*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 0);
7729*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
7730*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
7731*8975f5c5SAndroid Build Coastguard Worker
7732*8975f5c5SAndroid Build Coastguard Worker // Ensure correct rendering.
7733*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
7734*8975f5c5SAndroid Build Coastguard Worker
7735*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
7736*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
7737*8975f5c5SAndroid Build Coastguard Worker }
7738*8975f5c5SAndroid Build Coastguard Worker
7739*8975f5c5SAndroid Build Coastguard Worker // Test that switching framebuffers then a non-indexed draw followed by an indexed one works, with
7740*8975f5c5SAndroid Build Coastguard Worker // another context flushing work in between the two draw calls.
TEST_P(SimpleStateChangeTestES31,DrawThenChangeFBOThenDrawThenFlushInAnotherThreadThenDrawIndexed)7741*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, DrawThenChangeFBOThenDrawThenFlushInAnotherThreadThenDrawIndexed)
7742*8975f5c5SAndroid Build Coastguard Worker {
7743*8975f5c5SAndroid Build Coastguard Worker // Create a framebuffer, and make sure it and the default framebuffer are fully synced.
7744*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
7745*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
7746*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
7747*8975f5c5SAndroid Build Coastguard Worker
7748*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
7749*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
7750*8975f5c5SAndroid Build Coastguard Worker
7751*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
7752*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7753*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16);
7754*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
7755*8975f5c5SAndroid Build Coastguard Worker
7756*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
7757*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
7758*8975f5c5SAndroid Build Coastguard Worker
7759*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
7760*8975f5c5SAndroid Build Coastguard Worker
7761*8975f5c5SAndroid Build Coastguard Worker // First, create the index buffer and issue an indexed draw call. This clears the index dirty
7762*8975f5c5SAndroid Build Coastguard Worker // bit.
7763*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
7764*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
7765*8975f5c5SAndroid Build Coastguard Worker
7766*8975f5c5SAndroid Build Coastguard Worker const std::array<GLuint, 4> kIndexData = {0, 1, 2, 0};
7767*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(kIndexData), kIndexData.data(), GL_STATIC_DRAW);
7768*8975f5c5SAndroid Build Coastguard Worker
7769*8975f5c5SAndroid Build Coastguard Worker // Setup vertices.
7770*8975f5c5SAndroid Build Coastguard Worker const std::array<GLfloat, 6> kVertices = {
7771*8975f5c5SAndroid Build Coastguard Worker -1, -1, 3, -1, -1, 3,
7772*8975f5c5SAndroid Build Coastguard Worker };
7773*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
7774*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
7775*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(kVertices), kVertices.data(), GL_STATIC_DRAW);
7776*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
7777*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(0);
7778*8975f5c5SAndroid Build Coastguard Worker
7779*8975f5c5SAndroid Build Coastguard Worker // Set up a program. The same program is used for all draw calls to avoid state change due to
7780*8975f5c5SAndroid Build Coastguard Worker // program change.
7781*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
7782*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
7783*8975f5c5SAndroid Build Coastguard Worker uniform vec4 colorIn;
7784*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
7785*8975f5c5SAndroid Build Coastguard Worker void main()
7786*8975f5c5SAndroid Build Coastguard Worker {
7787*8975f5c5SAndroid Build Coastguard Worker colorOut = colorIn;
7788*8975f5c5SAndroid Build Coastguard Worker })";
7789*8975f5c5SAndroid Build Coastguard Worker
7790*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
7791*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
7792*8975f5c5SAndroid Build Coastguard Worker
7793*8975f5c5SAndroid Build Coastguard Worker const GLint positionLoc = glGetAttribLocation(program, essl3_shaders::PositionAttrib());
7794*8975f5c5SAndroid Build Coastguard Worker const GLint colorLoc = glGetUniformLocation(program, "colorIn");
7795*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, positionLoc);
7796*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
7797*8975f5c5SAndroid Build Coastguard Worker
7798*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, 0);
7799*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
7800*8975f5c5SAndroid Build Coastguard Worker
7801*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 0, 1);
7802*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
7803*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
7804*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
7805*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
7806*8975f5c5SAndroid Build Coastguard Worker
7807*8975f5c5SAndroid Build Coastguard Worker // Then switch to fbo and issue a non-indexed draw call followed by an indexed one.
7808*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7809*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 0);
7810*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
7811*8975f5c5SAndroid Build Coastguard Worker
7812*8975f5c5SAndroid Build Coastguard Worker // In between the two calls, make sure the first render pass is submitted, so the primary
7813*8975f5c5SAndroid Build Coastguard Worker // command buffer is reset.
7814*8975f5c5SAndroid Build Coastguard Worker {
7815*8975f5c5SAndroid Build Coastguard Worker EGLWindow *window = getEGLWindow();
7816*8975f5c5SAndroid Build Coastguard Worker EGLDisplay dpy = window->getDisplay();
7817*8975f5c5SAndroid Build Coastguard Worker EGLConfig config = window->getConfig();
7818*8975f5c5SAndroid Build Coastguard Worker EGLint pbufferAttributes[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE, EGL_NONE};
7819*8975f5c5SAndroid Build Coastguard Worker EGLSurface surface = eglCreatePbufferSurface(dpy, config, pbufferAttributes);
7820*8975f5c5SAndroid Build Coastguard Worker EGLContext ctx = window->createContext(EGL_NO_CONTEXT, nullptr);
7821*8975f5c5SAndroid Build Coastguard Worker EXPECT_EGL_SUCCESS();
7822*8975f5c5SAndroid Build Coastguard Worker std::thread flushThread = std::thread([&]() {
7823*8975f5c5SAndroid Build Coastguard Worker EXPECT_EGL_TRUE(eglMakeCurrent(dpy, surface, surface, ctx));
7824*8975f5c5SAndroid Build Coastguard Worker EXPECT_EGL_SUCCESS();
7825*8975f5c5SAndroid Build Coastguard Worker
7826*8975f5c5SAndroid Build Coastguard Worker glClearColor(1, 0, 0, 1);
7827*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
7828*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
7829*8975f5c5SAndroid Build Coastguard Worker
7830*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
7831*8975f5c5SAndroid Build Coastguard Worker });
7832*8975f5c5SAndroid Build Coastguard Worker flushThread.join();
7833*8975f5c5SAndroid Build Coastguard Worker
7834*8975f5c5SAndroid Build Coastguard Worker eglDestroySurface(dpy, surface);
7835*8975f5c5SAndroid Build Coastguard Worker eglDestroyContext(dpy, ctx);
7836*8975f5c5SAndroid Build Coastguard Worker }
7837*8975f5c5SAndroid Build Coastguard Worker
7838*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 0);
7839*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
7840*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
7841*8975f5c5SAndroid Build Coastguard Worker
7842*8975f5c5SAndroid Build Coastguard Worker // Ensure correct rendering.
7843*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
7844*8975f5c5SAndroid Build Coastguard Worker }
7845*8975f5c5SAndroid Build Coastguard Worker
7846*8975f5c5SAndroid Build Coastguard Worker // Negative test for EXT_primitive_bounding_box
TEST_P(SimpleStateChangeTestES31,PrimitiveBoundingBoxEXTNegativeTest)7847*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, PrimitiveBoundingBoxEXTNegativeTest)
7848*8975f5c5SAndroid Build Coastguard Worker {
7849*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsGLExtensionEnabled("GL_EXT_primitive_bounding_box"));
7850*8975f5c5SAndroid Build Coastguard Worker
7851*8975f5c5SAndroid Build Coastguard Worker glPrimitiveBoundingBoxEXT(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
7852*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
7853*8975f5c5SAndroid Build Coastguard Worker
7854*8975f5c5SAndroid Build Coastguard Worker GLfloat boundingBox[8] = {0};
7855*8975f5c5SAndroid Build Coastguard Worker glGetFloatv(GL_PRIMITIVE_BOUNDING_BOX_EXT, boundingBox);
7856*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
7857*8975f5c5SAndroid Build Coastguard Worker }
7858*8975f5c5SAndroid Build Coastguard Worker
7859*8975f5c5SAndroid Build Coastguard Worker // Negative test for OES_primitive_bounding_box
TEST_P(SimpleStateChangeTestES31,PrimitiveBoundingBoxOESNegativeTest)7860*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES31, PrimitiveBoundingBoxOESNegativeTest)
7861*8975f5c5SAndroid Build Coastguard Worker {
7862*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsGLExtensionEnabled("GL_OES_primitive_bounding_box"));
7863*8975f5c5SAndroid Build Coastguard Worker
7864*8975f5c5SAndroid Build Coastguard Worker glPrimitiveBoundingBoxEXT(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
7865*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
7866*8975f5c5SAndroid Build Coastguard Worker
7867*8975f5c5SAndroid Build Coastguard Worker GLfloat boundingBox[8] = {0};
7868*8975f5c5SAndroid Build Coastguard Worker glGetFloatv(GL_PRIMITIVE_BOUNDING_BOX_OES, boundingBox);
7869*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
7870*8975f5c5SAndroid Build Coastguard Worker }
7871*8975f5c5SAndroid Build Coastguard Worker
7872*8975f5c5SAndroid Build Coastguard Worker // Update an element array buffer that is already in use.
TEST_P(SimpleStateChangeTest,UpdateBoundElementArrayBuffer)7873*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTest, UpdateBoundElementArrayBuffer)
7874*8975f5c5SAndroid Build Coastguard Worker {
7875*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(attribute vec4 position;
7876*8975f5c5SAndroid Build Coastguard Worker attribute float color;
7877*8975f5c5SAndroid Build Coastguard Worker varying float colorVarying;
7878*8975f5c5SAndroid Build Coastguard Worker void main()
7879*8975f5c5SAndroid Build Coastguard Worker {
7880*8975f5c5SAndroid Build Coastguard Worker gl_Position = position;
7881*8975f5c5SAndroid Build Coastguard Worker colorVarying = color;
7882*8975f5c5SAndroid Build Coastguard Worker })";
7883*8975f5c5SAndroid Build Coastguard Worker
7884*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision mediump float;
7885*8975f5c5SAndroid Build Coastguard Worker varying float colorVarying;
7886*8975f5c5SAndroid Build Coastguard Worker void main()
7887*8975f5c5SAndroid Build Coastguard Worker {
7888*8975f5c5SAndroid Build Coastguard Worker if (colorVarying == 1.0)
7889*8975f5c5SAndroid Build Coastguard Worker {
7890*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
7891*8975f5c5SAndroid Build Coastguard Worker }
7892*8975f5c5SAndroid Build Coastguard Worker else
7893*8975f5c5SAndroid Build Coastguard Worker {
7894*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
7895*8975f5c5SAndroid Build Coastguard Worker }
7896*8975f5c5SAndroid Build Coastguard Worker })";
7897*8975f5c5SAndroid Build Coastguard Worker
7898*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(testProgram, kVS, kFS);
7899*8975f5c5SAndroid Build Coastguard Worker glUseProgram(testProgram);
7900*8975f5c5SAndroid Build Coastguard Worker
7901*8975f5c5SAndroid Build Coastguard Worker GLint posLoc = glGetAttribLocation(testProgram, "position");
7902*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, posLoc);
7903*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetAttribLocation(testProgram, "color");
7904*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
7905*8975f5c5SAndroid Build Coastguard Worker
7906*8975f5c5SAndroid Build Coastguard Worker std::array<GLushort, 6> quadIndices = GetQuadIndices();
7907*8975f5c5SAndroid Build Coastguard Worker
7908*8975f5c5SAndroid Build Coastguard Worker std::vector<GLubyte> indices;
7909*8975f5c5SAndroid Build Coastguard Worker for (GLushort index : quadIndices)
7910*8975f5c5SAndroid Build Coastguard Worker {
7911*8975f5c5SAndroid Build Coastguard Worker indices.push_back(static_cast<GLubyte>(index));
7912*8975f5c5SAndroid Build Coastguard Worker }
7913*8975f5c5SAndroid Build Coastguard Worker
7914*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
7915*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
7916*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(indices[0]), indices.data(),
7917*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
7918*8975f5c5SAndroid Build Coastguard Worker
7919*8975f5c5SAndroid Build Coastguard Worker std::array<Vector3, 4> quadVertices = GetIndexedQuadVertices();
7920*8975f5c5SAndroid Build Coastguard Worker
7921*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector3> positionVertices;
7922*8975f5c5SAndroid Build Coastguard Worker for (Vector3 vertex : quadVertices)
7923*8975f5c5SAndroid Build Coastguard Worker {
7924*8975f5c5SAndroid Build Coastguard Worker positionVertices.push_back(vertex);
7925*8975f5c5SAndroid Build Coastguard Worker }
7926*8975f5c5SAndroid Build Coastguard Worker for (Vector3 vertex : quadVertices)
7927*8975f5c5SAndroid Build Coastguard Worker {
7928*8975f5c5SAndroid Build Coastguard Worker positionVertices.push_back(vertex);
7929*8975f5c5SAndroid Build Coastguard Worker }
7930*8975f5c5SAndroid Build Coastguard Worker
7931*8975f5c5SAndroid Build Coastguard Worker GLBuffer positionVertexBuffer;
7932*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, positionVertexBuffer);
7933*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, positionVertices.size() * sizeof(positionVertices[0]),
7934*8975f5c5SAndroid Build Coastguard Worker positionVertices.data(), GL_STATIC_DRAW);
7935*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
7936*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(posLoc);
7937*8975f5c5SAndroid Build Coastguard Worker
7938*8975f5c5SAndroid Build Coastguard Worker std::vector<float> colorVertices = {1, 1, 1, 1, 0, 0, 0, 0};
7939*8975f5c5SAndroid Build Coastguard Worker
7940*8975f5c5SAndroid Build Coastguard Worker GLBuffer colorVertexBuffer;
7941*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, colorVertexBuffer);
7942*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, colorVertices.size() * sizeof(colorVertices[0]),
7943*8975f5c5SAndroid Build Coastguard Worker colorVertices.data(), GL_STATIC_DRAW);
7944*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 1, GL_FLOAT, GL_FALSE, 0, nullptr);
7945*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
7946*8975f5c5SAndroid Build Coastguard Worker
7947*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, nullptr);
7948*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7949*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
7950*8975f5c5SAndroid Build Coastguard Worker
7951*8975f5c5SAndroid Build Coastguard Worker indices.clear();
7952*8975f5c5SAndroid Build Coastguard Worker for (GLushort index : quadIndices)
7953*8975f5c5SAndroid Build Coastguard Worker {
7954*8975f5c5SAndroid Build Coastguard Worker indices.push_back(static_cast<GLubyte>(index + 4));
7955*8975f5c5SAndroid Build Coastguard Worker }
7956*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indices.size() * sizeof(indices[0]),
7957*8975f5c5SAndroid Build Coastguard Worker indices.data());
7958*8975f5c5SAndroid Build Coastguard Worker
7959*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, nullptr);
7960*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7961*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
7962*8975f5c5SAndroid Build Coastguard Worker }
7963*8975f5c5SAndroid Build Coastguard Worker
7964*8975f5c5SAndroid Build Coastguard Worker // Covers a bug where we would use a stale cache variable in the Vulkan back-end.
TEST_P(SimpleStateChangeTestES3,DeleteFramebufferBeforeQuery)7965*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, DeleteFramebufferBeforeQuery)
7966*8975f5c5SAndroid Build Coastguard Worker {
7967*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(testProgram, essl1_shaders::vs::Zero(), essl1_shaders::fs::Red());
7968*8975f5c5SAndroid Build Coastguard Worker glUseProgram(testProgram);
7969*8975f5c5SAndroid Build Coastguard Worker
7970*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
7971*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
7972*8975f5c5SAndroid Build Coastguard Worker
7973*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo;
7974*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
7975*8975f5c5SAndroid Build Coastguard Worker
7976*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH32F_STENCIL8, 16, 16);
7977*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);
7978*8975f5c5SAndroid Build Coastguard Worker
7979*8975f5c5SAndroid Build Coastguard Worker GLfloat floatArray[] = {1, 2, 3, 4};
7980*8975f5c5SAndroid Build Coastguard Worker
7981*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
7982*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
7983*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLfloat) * 4, floatArray, GL_DYNAMIC_COPY);
7984*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLE_FAN, 5, GL_UNSIGNED_SHORT, 0);
7985*8975f5c5SAndroid Build Coastguard Worker
7986*8975f5c5SAndroid Build Coastguard Worker fbo.reset();
7987*8975f5c5SAndroid Build Coastguard Worker
7988*8975f5c5SAndroid Build Coastguard Worker GLQuery query2;
7989*8975f5c5SAndroid Build Coastguard Worker glBeginQuery(GL_ANY_SAMPLES_PASSED_CONSERVATIVE, query2);
7990*8975f5c5SAndroid Build Coastguard Worker
7991*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
7992*8975f5c5SAndroid Build Coastguard Worker }
7993*8975f5c5SAndroid Build Coastguard Worker
7994*8975f5c5SAndroid Build Coastguard Worker // Covers an edge case
TEST_P(SimpleStateChangeTestES3,TextureTypeConflictAfterDraw)7995*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, TextureTypeConflictAfterDraw)
7996*8975f5c5SAndroid Build Coastguard Worker {
7997*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(precision highp float;
7998*8975f5c5SAndroid Build Coastguard Worker attribute vec4 a_position;
7999*8975f5c5SAndroid Build Coastguard Worker void main()
8000*8975f5c5SAndroid Build Coastguard Worker {
8001*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
8002*8975f5c5SAndroid Build Coastguard Worker }
8003*8975f5c5SAndroid Build Coastguard Worker )";
8004*8975f5c5SAndroid Build Coastguard Worker
8005*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision highp float;
8006*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D u_2d1;
8007*8975f5c5SAndroid Build Coastguard Worker uniform samplerCube u_Cube1;
8008*8975f5c5SAndroid Build Coastguard Worker void main()
8009*8975f5c5SAndroid Build Coastguard Worker {
8010*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = texture2D(u_2d1, vec2(0.0, 0.0)) + textureCube(u_Cube1, vec3(0.0, 0.0, 0.0));
8011*8975f5c5SAndroid Build Coastguard Worker }
8012*8975f5c5SAndroid Build Coastguard Worker )";
8013*8975f5c5SAndroid Build Coastguard Worker
8014*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(testProgram, kVS, kFS);
8015*8975f5c5SAndroid Build Coastguard Worker glUseProgram(testProgram);
8016*8975f5c5SAndroid Build Coastguard Worker
8017*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
8018*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
8019*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 4, GL_SRGB8, 1268, 614);
8020*8975f5c5SAndroid Build Coastguard Worker
8021*8975f5c5SAndroid Build Coastguard Worker GLint uniformloc = glGetUniformLocation(testProgram, "u_Cube1");
8022*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, uniformloc);
8023*8975f5c5SAndroid Build Coastguard Worker glUniform1i(uniformloc, 1);
8024*8975f5c5SAndroid Build Coastguard Worker
8025*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 1);
8026*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8027*8975f5c5SAndroid Build Coastguard Worker
8028*8975f5c5SAndroid Build Coastguard Worker // Trigger the state update.
8029*8975f5c5SAndroid Build Coastguard Worker glLinkProgram(testProgram);
8030*8975f5c5SAndroid Build Coastguard Worker texture.reset();
8031*8975f5c5SAndroid Build Coastguard Worker
8032*8975f5c5SAndroid Build Coastguard Worker // The texture types are now conflicting, and draws should fail.
8033*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 1);
8034*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
8035*8975f5c5SAndroid Build Coastguard Worker }
8036*8975f5c5SAndroid Build Coastguard Worker
8037*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug where a mutable texture is used with non-zero base level then rebased
8038*8975f5c5SAndroid Build Coastguard Worker // to zero but made incomplete and attached to the framebuffer. The texture's image is not
8039*8975f5c5SAndroid Build Coastguard Worker // recreated with level 0, leading to errors when drawing to the framebuffer.
TEST_P(SimpleStateChangeTestES3,NonZeroBaseMutableTextureThenZeroBaseButIncompleteBug)8040*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, NonZeroBaseMutableTextureThenZeroBaseButIncompleteBug)
8041*8975f5c5SAndroid Build Coastguard Worker {
8042*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
8043*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
8044*8975f5c5SAndroid Build Coastguard Worker
8045*8975f5c5SAndroid Build Coastguard Worker const std::array<GLColor, 4> kMip0Data = {GLColor::red, GLColor::red, GLColor::red,
8046*8975f5c5SAndroid Build Coastguard Worker GLColor::red};
8047*8975f5c5SAndroid Build Coastguard Worker const std::array<GLColor, 2> kMip1Data = {GLColor::green, GLColor::green};
8048*8975f5c5SAndroid Build Coastguard Worker
8049*8975f5c5SAndroid Build Coastguard Worker // Create two textures.
8050*8975f5c5SAndroid Build Coastguard Worker GLTexture immutableTex;
8051*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, immutableTex);
8052*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
8053*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kMip0Data.data());
8054*8975f5c5SAndroid Build Coastguard Worker
8055*8975f5c5SAndroid Build Coastguard Worker GLTexture mutableTex;
8056*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mutableTex);
8057*8975f5c5SAndroid Build Coastguard Worker for (uint32_t mip = 0; mip < 2; ++mip)
8058*8975f5c5SAndroid Build Coastguard Worker {
8059*8975f5c5SAndroid Build Coastguard Worker const uint32_t size = 4 >> mip;
8060*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, mip, GL_RGBA8, size, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
8061*8975f5c5SAndroid Build Coastguard Worker mip == 0 ? kMip0Data.data() : kMip1Data.data());
8062*8975f5c5SAndroid Build Coastguard Worker }
8063*8975f5c5SAndroid Build Coastguard Worker
8064*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
8065*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
8066*8975f5c5SAndroid Build Coastguard Worker
8067*8975f5c5SAndroid Build Coastguard Worker // Sample from the mutable texture at non-zero base level.
8068*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
8069*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
8070*8975f5c5SAndroid Build Coastguard Worker
8071*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, immutableTex, 0);
8072*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.0f);
8073*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, kMip1Data[0]);
8074*8975f5c5SAndroid Build Coastguard Worker
8075*8975f5c5SAndroid Build Coastguard Worker // Rebase the mutable texture to zero, but enable mipmapping which makes it incomplete.
8076*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
8077*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
8078*8975f5c5SAndroid Build Coastguard Worker
8079*8975f5c5SAndroid Build Coastguard Worker // Remove feedback loop for good measure.
8080*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, immutableTex);
8081*8975f5c5SAndroid Build Coastguard Worker
8082*8975f5c5SAndroid Build Coastguard Worker // Draw into base zero of the texture.
8083*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mutableTex, 0);
8084*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.0f);
8085*8975f5c5SAndroid Build Coastguard Worker
8086*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, kMip1Data[1]);
8087*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8088*8975f5c5SAndroid Build Coastguard Worker }
8089*8975f5c5SAndroid Build Coastguard Worker
8090*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug where the framebuffer binding was not synced during invalidate when a
8091*8975f5c5SAndroid Build Coastguard Worker // clear operation was deferred.
TEST_P(SimpleStateChangeTestES3,ChangeFramebufferThenInvalidateWithClear)8092*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, ChangeFramebufferThenInvalidateWithClear)
8093*8975f5c5SAndroid Build Coastguard Worker {
8094*8975f5c5SAndroid Build Coastguard Worker // Clear the default framebuffer.
8095*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
8096*8975f5c5SAndroid Build Coastguard Worker
8097*8975f5c5SAndroid Build Coastguard Worker // Start rendering to another framebuffer
8098*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
8099*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
8100*8975f5c5SAndroid Build Coastguard Worker
8101*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo;
8102*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
8103*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16);
8104*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
8105*8975f5c5SAndroid Build Coastguard Worker
8106*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Red());
8107*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
8108*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
8109*8975f5c5SAndroid Build Coastguard Worker
8110*8975f5c5SAndroid Build Coastguard Worker // Switch back to the default framebuffer
8111*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
8112*8975f5c5SAndroid Build Coastguard Worker
8113*8975f5c5SAndroid Build Coastguard Worker // Invalidate it. Don't invalidate color, as that's the one being cleared.
8114*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kAttachment = GL_DEPTH;
8115*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, &kAttachment);
8116*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
8117*8975f5c5SAndroid Build Coastguard Worker }
8118*8975f5c5SAndroid Build Coastguard Worker
8119*8975f5c5SAndroid Build Coastguard Worker // Test that clear / invalidate / clear works. The invalidate is for a target that's not cleared.
8120*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug where invalidate() would start a render pass to perform the first
8121*8975f5c5SAndroid Build Coastguard Worker // clear, while the second clear didn't expect a render pass opened without any draw calls in it.
TEST_P(SimpleStateChangeTestES3,ClearColorInvalidateDepthClearColor)8122*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, ClearColorInvalidateDepthClearColor)
8123*8975f5c5SAndroid Build Coastguard Worker {
8124*8975f5c5SAndroid Build Coastguard Worker // Clear color.
8125*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
8126*8975f5c5SAndroid Build Coastguard Worker
8127*8975f5c5SAndroid Build Coastguard Worker // Invalidate depth.
8128*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kAttachment = GL_DEPTH;
8129*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, &kAttachment);
8130*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
8131*8975f5c5SAndroid Build Coastguard Worker
8132*8975f5c5SAndroid Build Coastguard Worker // Clear color again.
8133*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
8134*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8135*8975f5c5SAndroid Build Coastguard Worker }
8136*8975f5c5SAndroid Build Coastguard Worker
8137*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug where glInvalidateFramebuffer(GL_FRAMEBUFFER, ...) was invalidating
8138*8975f5c5SAndroid Build Coastguard Worker // both the draw and read framebuffers.
TEST_P(SimpleStateChangeTestES3,InvalidateFramebufferShouldntInvalidateReadFramebuffer)8139*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, InvalidateFramebufferShouldntInvalidateReadFramebuffer)
8140*8975f5c5SAndroid Build Coastguard Worker {
8141*8975f5c5SAndroid Build Coastguard Worker // Create an invalid read framebuffer.
8142*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
8143*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
8144*8975f5c5SAndroid Build Coastguard Worker
8145*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
8146*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
8147*8975f5c5SAndroid Build Coastguard Worker glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_R8, 1, 1, 1);
8148*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, tex, 0, 5);
8149*8975f5c5SAndroid Build Coastguard Worker
8150*8975f5c5SAndroid Build Coastguard Worker // Invalidate using GL_FRAMEBUFFER. If GL_READ_FRAMEBUFFER was used, validation would fail due
8151*8975f5c5SAndroid Build Coastguard Worker // to the framebuffer not being complete. A bug here was attempting to invalidate the read
8152*8975f5c5SAndroid Build Coastguard Worker // framebuffer given GL_FRAMEBUFFER anyway.
8153*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<GLenum, 2> kAttachments = {GL_DEPTH, GL_STENCIL};
8154*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 2, kAttachments.data());
8155*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
8156*8975f5c5SAndroid Build Coastguard Worker }
8157*8975f5c5SAndroid Build Coastguard Worker
8158*8975f5c5SAndroid Build Coastguard Worker // Test that respecifies a buffer after we start XFB.
TEST_P(SimpleStateChangeTestES3,RespecifyBufferAfterBeginTransformFeedback)8159*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, RespecifyBufferAfterBeginTransformFeedback)
8160*8975f5c5SAndroid Build Coastguard Worker {
8161*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> tfVaryings = {"gl_Position"};
8162*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(testProgram, essl3_shaders::vs::Simple(),
8163*8975f5c5SAndroid Build Coastguard Worker essl3_shaders::fs::Green(), tfVaryings,
8164*8975f5c5SAndroid Build Coastguard Worker GL_INTERLEAVED_ATTRIBS);
8165*8975f5c5SAndroid Build Coastguard Worker
8166*8975f5c5SAndroid Build Coastguard Worker glUseProgram(testProgram);
8167*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
8168*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffer);
8169*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(float) * 3 * 2 * 7, nullptr, GL_STREAM_DRAW);
8170*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffer);
8171*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_TRIANGLES);
8172*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(float) * 3 * 4 * 6, nullptr, GL_STREAM_DRAW);
8173*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
8174*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
8175*8975f5c5SAndroid Build Coastguard Worker }
8176*8975f5c5SAndroid Build Coastguard Worker
8177*8975f5c5SAndroid Build Coastguard Worker // Test a bug angleproject:6998 in TransformFeedback code path by allocating paddingBuffer first and
8178*8975f5c5SAndroid Build Coastguard Worker // then allocate another buffer and then deallocate paddingBuffer and then allocate buffer again.
8179*8975f5c5SAndroid Build Coastguard Worker // This new buffer will be allocated in the space where paddingBuffer was allocated which causing
8180*8975f5c5SAndroid Build Coastguard Worker // XFB generate VVL error.
TEST_P(SimpleStateChangeTestES3,RespecifyBufferAfterBeginTransformFeedbackInDeletedPaddingBuffer)8181*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, RespecifyBufferAfterBeginTransformFeedbackInDeletedPaddingBuffer)
8182*8975f5c5SAndroid Build Coastguard Worker {
8183*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> tfVaryings = {"gl_Position"};
8184*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(testProgram, essl3_shaders::vs::Simple(),
8185*8975f5c5SAndroid Build Coastguard Worker essl3_shaders::fs::Green(), tfVaryings,
8186*8975f5c5SAndroid Build Coastguard Worker GL_INTERLEAVED_ATTRIBS);
8187*8975f5c5SAndroid Build Coastguard Worker glUseProgram(testProgram);
8188*8975f5c5SAndroid Build Coastguard Worker
8189*8975f5c5SAndroid Build Coastguard Worker GLuint paddingBuffer;
8190*8975f5c5SAndroid Build Coastguard Worker glGenBuffers(1, &paddingBuffer);
8191*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, paddingBuffer);
8192*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 256, nullptr, GL_STREAM_DRAW);
8193*8975f5c5SAndroid Build Coastguard Worker
8194*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
8195*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffer);
8196*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(float) * 3 * 2 * 7, nullptr, GL_STREAM_DRAW);
8197*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffer);
8198*8975f5c5SAndroid Build Coastguard Worker // Delete padding buffer, expecting the next bufferData call will reuse the space of
8199*8975f5c5SAndroid Build Coastguard Worker // paddingBuffer whose offset is smaller than buffer's offset, which triggers the bug.
8200*8975f5c5SAndroid Build Coastguard Worker glDeleteBuffers(1, &paddingBuffer);
8201*8975f5c5SAndroid Build Coastguard Worker glBeginTransformFeedback(GL_TRIANGLES);
8202*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(float) * 3 * 4 * 6, nullptr, GL_STREAM_DRAW);
8203*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
8204*8975f5c5SAndroid Build Coastguard Worker glEndTransformFeedback();
8205*8975f5c5SAndroid Build Coastguard Worker }
8206*8975f5c5SAndroid Build Coastguard Worker
8207*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug in the Vulkan backend where a draw-based copy after a deferred flush
8208*8975f5c5SAndroid Build Coastguard Worker // would lead to an image view being destroyed too early.
TEST_P(SimpleStateChangeTestES3,DrawFlushThenCopyTexImage)8209*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, DrawFlushThenCopyTexImage)
8210*8975f5c5SAndroid Build Coastguard Worker {
8211*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
8212*8975f5c5SAndroid Build Coastguard Worker
8213*8975f5c5SAndroid Build Coastguard Worker // Issue a cheap draw call and a flush
8214*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
8215*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, 1, 1);
8216*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.0f);
8217*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
8218*8975f5c5SAndroid Build Coastguard Worker glFlush();
8219*8975f5c5SAndroid Build Coastguard Worker
8220*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 32;
8221*8975f5c5SAndroid Build Coastguard Worker
8222*8975f5c5SAndroid Build Coastguard Worker // Then an expensive copy tex image
8223*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
8224*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_3D, texture);
8225*8975f5c5SAndroid Build Coastguard Worker glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGB8, kSize, kSize, kSize);
8226*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, kSize, kSize);
8227*8975f5c5SAndroid Build Coastguard Worker glFlush();
8228*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8229*8975f5c5SAndroid Build Coastguard Worker }
8230*8975f5c5SAndroid Build Coastguard Worker
TEST_P(SimpleStateChangeTestES3,DrawFlushThenBlit)8231*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, DrawFlushThenBlit)
8232*8975f5c5SAndroid Build Coastguard Worker {
8233*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 256;
8234*8975f5c5SAndroid Build Coastguard Worker const std::vector<GLColor> data(kSize * kSize, GLColor::red);
8235*8975f5c5SAndroid Build Coastguard Worker
8236*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
8237*8975f5c5SAndroid Build Coastguard Worker
8238*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
8239*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
8240*8975f5c5SAndroid Build Coastguard Worker
8241*8975f5c5SAndroid Build Coastguard Worker GLTexture readColor;
8242*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, readColor);
8243*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
8244*8975f5c5SAndroid Build Coastguard Worker data.data());
8245*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, readColor, 0);
8246*8975f5c5SAndroid Build Coastguard Worker
8247*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
8248*8975f5c5SAndroid Build Coastguard Worker
8249*8975f5c5SAndroid Build Coastguard Worker // Issue a cheap draw call and a flush
8250*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
8251*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
8252*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, 1, 1);
8253*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.0f);
8254*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
8255*8975f5c5SAndroid Build Coastguard Worker glFlush();
8256*8975f5c5SAndroid Build Coastguard Worker
8257*8975f5c5SAndroid Build Coastguard Worker // Then an expensive blit
8258*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, kSize + 2, kSize, 0, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
8259*8975f5c5SAndroid Build Coastguard Worker glFlush();
8260*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8261*8975f5c5SAndroid Build Coastguard Worker }
8262*8975f5c5SAndroid Build Coastguard Worker
8263*8975f5c5SAndroid Build Coastguard Worker class VertexAttribArrayStateChangeTest : public ANGLETest<>
8264*8975f5c5SAndroid Build Coastguard Worker {
8265*8975f5c5SAndroid Build Coastguard Worker protected:
VertexAttribArrayStateChangeTest()8266*8975f5c5SAndroid Build Coastguard Worker VertexAttribArrayStateChangeTest()
8267*8975f5c5SAndroid Build Coastguard Worker {
8268*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(128);
8269*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(128);
8270*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
8271*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
8272*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
8273*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
8274*8975f5c5SAndroid Build Coastguard Worker setConfigDepthBits(24);
8275*8975f5c5SAndroid Build Coastguard Worker }
8276*8975f5c5SAndroid Build Coastguard Worker
testSetUp()8277*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
8278*8975f5c5SAndroid Build Coastguard Worker {
8279*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(precision highp float;
8280*8975f5c5SAndroid Build Coastguard Worker attribute vec4 position;
8281*8975f5c5SAndroid Build Coastguard Worker attribute vec4 color;
8282*8975f5c5SAndroid Build Coastguard Worker varying vec4 colorOut;
8283*8975f5c5SAndroid Build Coastguard Worker
8284*8975f5c5SAndroid Build Coastguard Worker void main()
8285*8975f5c5SAndroid Build Coastguard Worker {
8286*8975f5c5SAndroid Build Coastguard Worker gl_Position = position;
8287*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
8288*8975f5c5SAndroid Build Coastguard Worker })";
8289*8975f5c5SAndroid Build Coastguard Worker
8290*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision highp float;
8291*8975f5c5SAndroid Build Coastguard Worker varying vec4 colorOut;
8292*8975f5c5SAndroid Build Coastguard Worker
8293*8975f5c5SAndroid Build Coastguard Worker void main()
8294*8975f5c5SAndroid Build Coastguard Worker {
8295*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = colorOut;
8296*8975f5c5SAndroid Build Coastguard Worker })";
8297*8975f5c5SAndroid Build Coastguard Worker
8298*8975f5c5SAndroid Build Coastguard Worker mProgram = CompileProgram(kVS, kFS);
8299*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(0u, mProgram);
8300*8975f5c5SAndroid Build Coastguard Worker
8301*8975f5c5SAndroid Build Coastguard Worker mPosAttribLocation = glGetAttribLocation(mProgram, "position");
8302*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, mPosAttribLocation);
8303*8975f5c5SAndroid Build Coastguard Worker mColorAttribLocation = glGetAttribLocation(mProgram, "color");
8304*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, mColorAttribLocation);
8305*8975f5c5SAndroid Build Coastguard Worker
8306*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
8307*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8308*8975f5c5SAndroid Build Coastguard Worker
8309*8975f5c5SAndroid Build Coastguard Worker glGenBuffers(1, &mVertexBuffer);
8310*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
8311*8975f5c5SAndroid Build Coastguard Worker
8312*8975f5c5SAndroid Build Coastguard Worker const float posAttribData[] = {
8313*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,
8314*8975f5c5SAndroid Build Coastguard Worker };
8315*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(posAttribData), posAttribData, GL_STATIC_DRAW);
8316*8975f5c5SAndroid Build Coastguard Worker
8317*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
8318*8975f5c5SAndroid Build Coastguard Worker }
8319*8975f5c5SAndroid Build Coastguard Worker
testTearDown()8320*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override
8321*8975f5c5SAndroid Build Coastguard Worker {
8322*8975f5c5SAndroid Build Coastguard Worker if (mVertexBuffer != 0)
8323*8975f5c5SAndroid Build Coastguard Worker {
8324*8975f5c5SAndroid Build Coastguard Worker glDeleteBuffers(1, &mVertexBuffer);
8325*8975f5c5SAndroid Build Coastguard Worker }
8326*8975f5c5SAndroid Build Coastguard Worker
8327*8975f5c5SAndroid Build Coastguard Worker if (mProgram != 0)
8328*8975f5c5SAndroid Build Coastguard Worker {
8329*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mProgram);
8330*8975f5c5SAndroid Build Coastguard Worker }
8331*8975f5c5SAndroid Build Coastguard Worker }
8332*8975f5c5SAndroid Build Coastguard Worker
8333*8975f5c5SAndroid Build Coastguard Worker GLuint mProgram;
8334*8975f5c5SAndroid Build Coastguard Worker GLint mPosAttribLocation;
8335*8975f5c5SAndroid Build Coastguard Worker GLint mColorAttribLocation;
8336*8975f5c5SAndroid Build Coastguard Worker GLuint mVertexBuffer;
8337*8975f5c5SAndroid Build Coastguard Worker };
8338*8975f5c5SAndroid Build Coastguard Worker
TEST_P(VertexAttribArrayStateChangeTest,Basic)8339*8975f5c5SAndroid Build Coastguard Worker TEST_P(VertexAttribArrayStateChangeTest, Basic)
8340*8975f5c5SAndroid Build Coastguard Worker {
8341*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
8342*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
8343*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
8344*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
8345*8975f5c5SAndroid Build Coastguard Worker
8346*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(mPosAttribLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
8347*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(mPosAttribLocation);
8348*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(mColorAttribLocation);
8349*8975f5c5SAndroid Build Coastguard Worker glVertexAttrib4f(mColorAttribLocation, 1.0f, 0.0f, 0.0f, 1.0f);
8350*8975f5c5SAndroid Build Coastguard Worker // Don't try to verify the color of this draw as red here because it might
8351*8975f5c5SAndroid Build Coastguard Worker // hide the bug
8352*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
8353*8975f5c5SAndroid Build Coastguard Worker glVertexAttrib4f(mColorAttribLocation, 0.0f, 1.0f, 0.0f, 1.0f);
8354*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
8355*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8356*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
8357*8975f5c5SAndroid Build Coastguard Worker
8358*8975f5c5SAndroid Build Coastguard Worker glUseProgram(0);
8359*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
8360*8975f5c5SAndroid Build Coastguard Worker }
8361*8975f5c5SAndroid Build Coastguard Worker
TEST_P(SimpleStateChangeTestES3,DepthOnlyToColorAttachmentPreservesBlendState)8362*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, DepthOnlyToColorAttachmentPreservesBlendState)
8363*8975f5c5SAndroid Build Coastguard Worker {
8364*8975f5c5SAndroid Build Coastguard Worker
8365*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(precision highp float;
8366*8975f5c5SAndroid Build Coastguard Worker attribute vec4 position;
8367*8975f5c5SAndroid Build Coastguard Worker attribute vec4 color;
8368*8975f5c5SAndroid Build Coastguard Worker varying vec4 colorOut;
8369*8975f5c5SAndroid Build Coastguard Worker
8370*8975f5c5SAndroid Build Coastguard Worker void main()
8371*8975f5c5SAndroid Build Coastguard Worker {
8372*8975f5c5SAndroid Build Coastguard Worker gl_Position = position;
8373*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
8374*8975f5c5SAndroid Build Coastguard Worker })";
8375*8975f5c5SAndroid Build Coastguard Worker
8376*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision highp float;
8377*8975f5c5SAndroid Build Coastguard Worker varying vec4 colorOut;
8378*8975f5c5SAndroid Build Coastguard Worker
8379*8975f5c5SAndroid Build Coastguard Worker void main()
8380*8975f5c5SAndroid Build Coastguard Worker {
8381*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = colorOut;
8382*8975f5c5SAndroid Build Coastguard Worker })";
8383*8975f5c5SAndroid Build Coastguard Worker
8384*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
8385*8975f5c5SAndroid Build Coastguard Worker
8386*8975f5c5SAndroid Build Coastguard Worker GLint posAttribLocation = glGetAttribLocation(program, "position");
8387*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, posAttribLocation);
8388*8975f5c5SAndroid Build Coastguard Worker GLint colorAttribLocation = glGetAttribLocation(program, "color");
8389*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorAttribLocation);
8390*8975f5c5SAndroid Build Coastguard Worker
8391*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
8392*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
8393*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
8394*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthRenderbuffer;
8395*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer depthFramebuffer;
8396*8975f5c5SAndroid Build Coastguard Worker
8397*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
8398*8975f5c5SAndroid Build Coastguard Worker
8399*8975f5c5SAndroid Build Coastguard Worker const float posAttribData[] = {
8400*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,
8401*8975f5c5SAndroid Build Coastguard Worker };
8402*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(posAttribData), posAttribData, GL_STATIC_DRAW);
8403*8975f5c5SAndroid Build Coastguard Worker
8404*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
8405*8975f5c5SAndroid Build Coastguard Worker
8406*8975f5c5SAndroid Build Coastguard Worker constexpr int kWidth = 1;
8407*8975f5c5SAndroid Build Coastguard Worker constexpr int kHeight = 1;
8408*8975f5c5SAndroid Build Coastguard Worker
8409*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
8410*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
8411*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, 0);
8412*8975f5c5SAndroid Build Coastguard Worker
8413*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
8414*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
8415*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
8416*8975f5c5SAndroid Build Coastguard Worker
8417*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
8418*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, kWidth, kHeight);
8419*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, 0);
8420*8975f5c5SAndroid Build Coastguard Worker
8421*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, depthFramebuffer);
8422*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
8423*8975f5c5SAndroid Build Coastguard Worker depthRenderbuffer);
8424*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
8425*8975f5c5SAndroid Build Coastguard Worker
8426*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
8427*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
8428*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(posAttribLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
8429*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(posAttribLocation);
8430*8975f5c5SAndroid Build Coastguard Worker glDisableVertexAttribArray(colorAttribLocation);
8431*8975f5c5SAndroid Build Coastguard Worker glVertexAttrib4f(colorAttribLocation, 1.0f, 0.0f, 0.0f, 1.0f);
8432*8975f5c5SAndroid Build Coastguard Worker
8433*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
8434*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
8435*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
8436*8975f5c5SAndroid Build Coastguard Worker glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ONE);
8437*8975f5c5SAndroid Build Coastguard Worker glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
8438*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
8439*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
8440*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
8441*8975f5c5SAndroid Build Coastguard Worker
8442*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, depthFramebuffer);
8443*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
8444*8975f5c5SAndroid Build Coastguard Worker
8445*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
8446*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
8447*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
8448*8975f5c5SAndroid Build Coastguard Worker
8449*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
8450*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
8451*8975f5c5SAndroid Build Coastguard Worker glUseProgram(0);
8452*8975f5c5SAndroid Build Coastguard Worker }
8453*8975f5c5SAndroid Build Coastguard Worker
8454*8975f5c5SAndroid Build Coastguard Worker // Tests a bug where we wouldn't update our cached base/max levels in Vulkan.
TEST_P(SimpleStateChangeTestES3,MaxLevelChange)8455*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, MaxLevelChange)
8456*8975f5c5SAndroid Build Coastguard Worker {
8457*8975f5c5SAndroid Build Coastguard Worker // Initialize an immutable texture with 2 levels.
8458*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> bluePixels(4, GLColor::blue);
8459*8975f5c5SAndroid Build Coastguard Worker
8460*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
8461*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
8462*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
8463*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
8464*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
8465*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 2, 2);
8466*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, bluePixels.data());
8467*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::yellow);
8468*8975f5c5SAndroid Build Coastguard Worker
8469*8975f5c5SAndroid Build Coastguard Worker // Set up draw resources.
8470*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(testProgram, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
8471*8975f5c5SAndroid Build Coastguard Worker glUseProgram(testProgram);
8472*8975f5c5SAndroid Build Coastguard Worker
8473*8975f5c5SAndroid Build Coastguard Worker GLint posLoc = glGetAttribLocation(testProgram, essl1_shaders::PositionAttrib());
8474*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, posLoc);
8475*8975f5c5SAndroid Build Coastguard Worker
8476*8975f5c5SAndroid Build Coastguard Worker std::array<Vector3, 6> quadVerts = GetQuadVertices();
8477*8975f5c5SAndroid Build Coastguard Worker
8478*8975f5c5SAndroid Build Coastguard Worker GLBuffer vao;
8479*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vao);
8480*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, quadVerts.size() * sizeof(quadVerts[0]), quadVerts.data(),
8481*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
8482*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
8483*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(posLoc);
8484*8975f5c5SAndroid Build Coastguard Worker
8485*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8486*8975f5c5SAndroid Build Coastguard Worker
8487*8975f5c5SAndroid Build Coastguard Worker // Draw with the 2x2 mip / max level 1.
8488*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, 2, 2);
8489*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
8490*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
8491*8975f5c5SAndroid Build Coastguard Worker
8492*8975f5c5SAndroid Build Coastguard Worker // Draw with the 1x1 mip / max level 2.
8493*8975f5c5SAndroid Build Coastguard Worker glViewport(2, 0, 1, 1);
8494*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
8495*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
8496*8975f5c5SAndroid Build Coastguard Worker
8497*8975f5c5SAndroid Build Coastguard Worker // Draw with the 2x2 mip / max level 1.
8498*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 2, 2, 2);
8499*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
8500*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
8501*8975f5c5SAndroid Build Coastguard Worker
8502*8975f5c5SAndroid Build Coastguard Worker // Draw with the 1x1 mip / max level 2.
8503*8975f5c5SAndroid Build Coastguard Worker glViewport(2, 2, 1, 1);
8504*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
8505*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
8506*8975f5c5SAndroid Build Coastguard Worker
8507*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8508*8975f5c5SAndroid Build Coastguard Worker
8509*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
8510*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(2, 0, GLColor::yellow);
8511*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 2, GLColor::blue);
8512*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(2, 2, GLColor::yellow);
8513*8975f5c5SAndroid Build Coastguard Worker }
8514*8975f5c5SAndroid Build Coastguard Worker
8515*8975f5c5SAndroid Build Coastguard Worker // Tests a bug when removing an element array buffer bound to two vertex arrays.
TEST_P(SimpleStateChangeTestES3,DeleteDoubleBoundBufferAndVertexArray)8516*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, DeleteDoubleBoundBufferAndVertexArray)
8517*8975f5c5SAndroid Build Coastguard Worker {
8518*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> bufData(100, 0);
8519*8975f5c5SAndroid Build Coastguard Worker GLBuffer buffer;
8520*8975f5c5SAndroid Build Coastguard Worker GLVertexArray vao;
8521*8975f5c5SAndroid Build Coastguard Worker
8522*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
8523*8975f5c5SAndroid Build Coastguard Worker glBindVertexArray(vao);
8524*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
8525*8975f5c5SAndroid Build Coastguard Worker buffer.reset();
8526*8975f5c5SAndroid Build Coastguard Worker vao.reset();
8527*8975f5c5SAndroid Build Coastguard Worker
8528*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufData.size(), bufData.data(), GL_STATIC_DRAW);
8529*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufData.size(), bufData.data(), GL_STATIC_DRAW);
8530*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8531*8975f5c5SAndroid Build Coastguard Worker }
8532*8975f5c5SAndroid Build Coastguard Worker
8533*8975f5c5SAndroid Build Coastguard Worker // Tests state change for glLineWidth.
TEST_P(StateChangeTestES3,LineWidth)8534*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, LineWidth)
8535*8975f5c5SAndroid Build Coastguard Worker {
8536*8975f5c5SAndroid Build Coastguard Worker // According to the spec, the minimum value for the line width range limits is one.
8537*8975f5c5SAndroid Build Coastguard Worker GLfloat range[2] = {1};
8538*8975f5c5SAndroid Build Coastguard Worker glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, range);
8539*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
8540*8975f5c5SAndroid Build Coastguard Worker EXPECT_GE(range[0], 1.0f);
8541*8975f5c5SAndroid Build Coastguard Worker EXPECT_GE(range[1], 1.0f);
8542*8975f5c5SAndroid Build Coastguard Worker
8543*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(range[1] < 5.0);
8544*8975f5c5SAndroid Build Coastguard Worker
8545*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
8546*8975f5c5SAndroid Build Coastguard Worker precision highp float;
8547*8975f5c5SAndroid Build Coastguard Worker uniform float height;
8548*8975f5c5SAndroid Build Coastguard Worker void main()
8549*8975f5c5SAndroid Build Coastguard Worker {
8550*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(gl_VertexID == 0 ? -1 : 1, height * 2. - 1., 0, 1);
8551*8975f5c5SAndroid Build Coastguard Worker })";
8552*8975f5c5SAndroid Build Coastguard Worker
8553*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
8554*8975f5c5SAndroid Build Coastguard Worker precision highp float;
8555*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
8556*8975f5c5SAndroid Build Coastguard Worker uniform vec4 color;
8557*8975f5c5SAndroid Build Coastguard Worker void main()
8558*8975f5c5SAndroid Build Coastguard Worker {
8559*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
8560*8975f5c5SAndroid Build Coastguard Worker })";
8561*8975f5c5SAndroid Build Coastguard Worker
8562*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
8563*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
8564*8975f5c5SAndroid Build Coastguard Worker
8565*8975f5c5SAndroid Build Coastguard Worker GLint heightLoc = glGetUniformLocation(program, "height");
8566*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, "color");
8567*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, heightLoc);
8568*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
8569*8975f5c5SAndroid Build Coastguard Worker
8570*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
8571*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
8572*8975f5c5SAndroid Build Coastguard Worker
8573*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
8574*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
8575*8975f5c5SAndroid Build Coastguard Worker const float halfPixelHeight = 0.5 / h;
8576*8975f5c5SAndroid Build Coastguard Worker
8577*8975f5c5SAndroid Build Coastguard Worker glUniform1f(heightLoc, 0.25f + halfPixelHeight);
8578*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
8579*8975f5c5SAndroid Build Coastguard Worker glLineWidth(3);
8580*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINES, 0, 2);
8581*8975f5c5SAndroid Build Coastguard Worker
8582*8975f5c5SAndroid Build Coastguard Worker glUniform1f(heightLoc, 0.5f + halfPixelHeight);
8583*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
8584*8975f5c5SAndroid Build Coastguard Worker glLineWidth(5);
8585*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINES, 0, 2);
8586*8975f5c5SAndroid Build Coastguard Worker
8587*8975f5c5SAndroid Build Coastguard Worker glUniform1f(heightLoc, 0.75f + halfPixelHeight);
8588*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 1);
8589*8975f5c5SAndroid Build Coastguard Worker glLineWidth(1);
8590*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINES, 0, 2);
8591*8975f5c5SAndroid Build Coastguard Worker
8592*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 4 - 2, w, 1, GLColor::black);
8593*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 4 - 1, w, 3, GLColor::red);
8594*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 4 + 2, w, 1, GLColor::black);
8595*8975f5c5SAndroid Build Coastguard Worker
8596*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2 - 3, w, 1, GLColor::black);
8597*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2 - 2, w, 5, GLColor::green);
8598*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2 + 3, w, 1, GLColor::black);
8599*8975f5c5SAndroid Build Coastguard Worker
8600*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 3 * h / 4 - 1, w, 1, GLColor::black);
8601*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 3 * h / 4, w, 1, GLColor::blue);
8602*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 3 * h / 4 + 1, w, 1, GLColor::black);
8603*8975f5c5SAndroid Build Coastguard Worker
8604*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8605*8975f5c5SAndroid Build Coastguard Worker }
8606*8975f5c5SAndroid Build Coastguard Worker
8607*8975f5c5SAndroid Build Coastguard Worker // Tests state change for out-of-range value for glLineWidth. The expectation
8608*8975f5c5SAndroid Build Coastguard Worker // here is primarily that rendering backends do not crash with invalid line
8609*8975f5c5SAndroid Build Coastguard Worker // width values.
TEST_P(StateChangeTestES3,LineWidthOutOfRangeDoesntCrash)8610*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, LineWidthOutOfRangeDoesntCrash)
8611*8975f5c5SAndroid Build Coastguard Worker {
8612*8975f5c5SAndroid Build Coastguard Worker GLfloat range[2] = {1};
8613*8975f5c5SAndroid Build Coastguard Worker glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, range);
8614*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
8615*8975f5c5SAndroid Build Coastguard Worker
8616*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
8617*8975f5c5SAndroid Build Coastguard Worker precision highp float;
8618*8975f5c5SAndroid Build Coastguard Worker void main()
8619*8975f5c5SAndroid Build Coastguard Worker {
8620*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(gl_VertexID == 0 ? -1.0 : 1.0, -1.0, 0.0, 1.0);
8621*8975f5c5SAndroid Build Coastguard Worker })";
8622*8975f5c5SAndroid Build Coastguard Worker
8623*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
8624*8975f5c5SAndroid Build Coastguard Worker precision highp float;
8625*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
8626*8975f5c5SAndroid Build Coastguard Worker void main()
8627*8975f5c5SAndroid Build Coastguard Worker {
8628*8975f5c5SAndroid Build Coastguard Worker colorOut = vec4(1.0);
8629*8975f5c5SAndroid Build Coastguard Worker })";
8630*8975f5c5SAndroid Build Coastguard Worker
8631*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
8632*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
8633*8975f5c5SAndroid Build Coastguard Worker
8634*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
8635*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
8636*8975f5c5SAndroid Build Coastguard Worker
8637*8975f5c5SAndroid Build Coastguard Worker glLineWidth(range[1] + 1.0f);
8638*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINES, 0, 2);
8639*8975f5c5SAndroid Build Coastguard Worker
8640*8975f5c5SAndroid Build Coastguard Worker glFinish();
8641*8975f5c5SAndroid Build Coastguard Worker
8642*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8643*8975f5c5SAndroid Build Coastguard Worker }
8644*8975f5c5SAndroid Build Coastguard Worker
8645*8975f5c5SAndroid Build Coastguard Worker // Tests state change for glPolygonOffset.
TEST_P(StateChangeTestES3,PolygonOffset)8646*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, PolygonOffset)
8647*8975f5c5SAndroid Build Coastguard Worker {
8648*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
8649*8975f5c5SAndroid Build Coastguard Worker precision highp float;
8650*8975f5c5SAndroid Build Coastguard Worker void main()
8651*8975f5c5SAndroid Build Coastguard Worker {
8652*8975f5c5SAndroid Build Coastguard Worker // gl_VertexID x y
8653*8975f5c5SAndroid Build Coastguard Worker // 0 -1 -1
8654*8975f5c5SAndroid Build Coastguard Worker // 1 1 -1
8655*8975f5c5SAndroid Build Coastguard Worker // 2 -1 1
8656*8975f5c5SAndroid Build Coastguard Worker // 3 1 1
8657*8975f5c5SAndroid Build Coastguard Worker int bit0 = gl_VertexID & 1;
8658*8975f5c5SAndroid Build Coastguard Worker int bit1 = gl_VertexID >> 1;
8659*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, gl_VertexID % 2 == 0 ? -1 : 1, 1);
8660*8975f5c5SAndroid Build Coastguard Worker })";
8661*8975f5c5SAndroid Build Coastguard Worker
8662*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
8663*8975f5c5SAndroid Build Coastguard Worker precision highp float;
8664*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
8665*8975f5c5SAndroid Build Coastguard Worker uniform vec4 color;
8666*8975f5c5SAndroid Build Coastguard Worker void main()
8667*8975f5c5SAndroid Build Coastguard Worker {
8668*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
8669*8975f5c5SAndroid Build Coastguard Worker })";
8670*8975f5c5SAndroid Build Coastguard Worker
8671*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_POLYGON_OFFSET_FILL);
8672*8975f5c5SAndroid Build Coastguard Worker
8673*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
8674*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
8675*8975f5c5SAndroid Build Coastguard Worker
8676*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, "color");
8677*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
8678*8975f5c5SAndroid Build Coastguard Worker
8679*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
8680*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0);
8681*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
8682*8975f5c5SAndroid Build Coastguard Worker
8683*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
8684*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
8685*8975f5c5SAndroid Build Coastguard Worker
8686*8975f5c5SAndroid Build Coastguard Worker // The shader creates a depth slope from left (0) to right (1).
8687*8975f5c5SAndroid Build Coastguard Worker //
8688*8975f5c5SAndroid Build Coastguard Worker // This test issues three draw calls:
8689*8975f5c5SAndroid Build Coastguard Worker //
8690*8975f5c5SAndroid Build Coastguard Worker // Draw 2 (green): factor width/2, offset 0, depth test: Greater
8691*8975f5c5SAndroid Build Coastguard Worker // ^ | __________________
8692*8975f5c5SAndroid Build Coastguard Worker // | | __/__/ __/
8693*8975f5c5SAndroid Build Coastguard Worker // | V __/__/ __/ <--- Draw 1 (red): factor width/4, offset 0
8694*8975f5c5SAndroid Build Coastguard Worker // | __/__/ ^ __/
8695*8975f5c5SAndroid Build Coastguard Worker // | __/__/ _|/
8696*8975f5c5SAndroid Build Coastguard Worker // |/__/ __/ |
8697*8975f5c5SAndroid Build Coastguard Worker // |/ __/ |
8698*8975f5c5SAndroid Build Coastguard Worker // | __/ Draw 3 (blue): factor width/2, offset -2, depth test: Less
8699*8975f5c5SAndroid Build Coastguard Worker // |/
8700*8975f5c5SAndroid Build Coastguard Worker // |
8701*8975f5c5SAndroid Build Coastguard Worker // |
8702*8975f5c5SAndroid Build Coastguard Worker // +------------------------------->
8703*8975f5c5SAndroid Build Coastguard Worker //
8704*8975f5c5SAndroid Build Coastguard Worker // Result: <----blue-----><-green-><--red-->
8705*8975f5c5SAndroid Build Coastguard Worker
8706*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
8707*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
8708*8975f5c5SAndroid Build Coastguard Worker
8709*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
8710*8975f5c5SAndroid Build Coastguard Worker glPolygonOffset(getWindowWidth() / 4, 0);
8711*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
8712*8975f5c5SAndroid Build Coastguard Worker
8713*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
8714*8975f5c5SAndroid Build Coastguard Worker glPolygonOffset(getWindowWidth() / 2, 0);
8715*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
8716*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
8717*8975f5c5SAndroid Build Coastguard Worker
8718*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 1);
8719*8975f5c5SAndroid Build Coastguard Worker glPolygonOffset(getWindowWidth() / 2, -2);
8720*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
8721*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
8722*8975f5c5SAndroid Build Coastguard Worker
8723*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2 - 1, h, GLColor::blue);
8724*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2 + 1, 0, w / 4 - 1, h, GLColor::green);
8725*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(3 * w / 4 + 1, 0, w / 4 - 1, h, GLColor::red);
8726*8975f5c5SAndroid Build Coastguard Worker
8727*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8728*8975f5c5SAndroid Build Coastguard Worker }
8729*8975f5c5SAndroid Build Coastguard Worker
8730*8975f5c5SAndroid Build Coastguard Worker // Tests state change for glPolygonOffsetClampEXT.
TEST_P(StateChangeTestES3,PolygonOffsetClamp)8731*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, PolygonOffsetClamp)
8732*8975f5c5SAndroid Build Coastguard Worker {
8733*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_polygon_offset_clamp"));
8734*8975f5c5SAndroid Build Coastguard Worker
8735*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
8736*8975f5c5SAndroid Build Coastguard Worker precision highp float;
8737*8975f5c5SAndroid Build Coastguard Worker void main()
8738*8975f5c5SAndroid Build Coastguard Worker {
8739*8975f5c5SAndroid Build Coastguard Worker // gl_VertexID x y
8740*8975f5c5SAndroid Build Coastguard Worker // 0 -1 -1
8741*8975f5c5SAndroid Build Coastguard Worker // 1 1 -1
8742*8975f5c5SAndroid Build Coastguard Worker // 2 -1 1
8743*8975f5c5SAndroid Build Coastguard Worker // 3 1 1
8744*8975f5c5SAndroid Build Coastguard Worker int bit0 = gl_VertexID & 1;
8745*8975f5c5SAndroid Build Coastguard Worker int bit1 = gl_VertexID >> 1;
8746*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, gl_VertexID % 2 == 0 ? -1 : 1, 1);
8747*8975f5c5SAndroid Build Coastguard Worker })";
8748*8975f5c5SAndroid Build Coastguard Worker
8749*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
8750*8975f5c5SAndroid Build Coastguard Worker precision highp float;
8751*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
8752*8975f5c5SAndroid Build Coastguard Worker uniform vec4 color;
8753*8975f5c5SAndroid Build Coastguard Worker void main()
8754*8975f5c5SAndroid Build Coastguard Worker {
8755*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
8756*8975f5c5SAndroid Build Coastguard Worker })";
8757*8975f5c5SAndroid Build Coastguard Worker
8758*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_POLYGON_OFFSET_FILL);
8759*8975f5c5SAndroid Build Coastguard Worker
8760*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
8761*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
8762*8975f5c5SAndroid Build Coastguard Worker
8763*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, "color");
8764*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
8765*8975f5c5SAndroid Build Coastguard Worker
8766*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
8767*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0);
8768*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
8769*8975f5c5SAndroid Build Coastguard Worker
8770*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
8771*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
8772*8975f5c5SAndroid Build Coastguard Worker
8773*8975f5c5SAndroid Build Coastguard Worker // The shader creates a depth slope from left (0) to right (1).
8774*8975f5c5SAndroid Build Coastguard Worker //
8775*8975f5c5SAndroid Build Coastguard Worker // This test issues two draw calls:
8776*8975f5c5SAndroid Build Coastguard Worker //
8777*8975f5c5SAndroid Build Coastguard Worker // Draw 2 (green): factor width, offset 0, clamp 0.5, depth test: Greater
8778*8975f5c5SAndroid Build Coastguard Worker // ^ | __________________
8779*8975f5c5SAndroid Build Coastguard Worker // | | __/ __/
8780*8975f5c5SAndroid Build Coastguard Worker // | V __/ __/ <--- Draw 1 (red): factor width, offset 0, clamp 0.25
8781*8975f5c5SAndroid Build Coastguard Worker // | __/ __/
8782*8975f5c5SAndroid Build Coastguard Worker // | __/ __/
8783*8975f5c5SAndroid Build Coastguard Worker // |/ __/
8784*8975f5c5SAndroid Build Coastguard Worker // | __/
8785*8975f5c5SAndroid Build Coastguard Worker // | __/
8786*8975f5c5SAndroid Build Coastguard Worker // |/
8787*8975f5c5SAndroid Build Coastguard Worker // |
8788*8975f5c5SAndroid Build Coastguard Worker // |
8789*8975f5c5SAndroid Build Coastguard Worker // +------------------------------->
8790*8975f5c5SAndroid Build Coastguard Worker //
8791*8975f5c5SAndroid Build Coastguard Worker // Result: <---------green--------><--red-->
8792*8975f5c5SAndroid Build Coastguard Worker
8793*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
8794*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
8795*8975f5c5SAndroid Build Coastguard Worker
8796*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
8797*8975f5c5SAndroid Build Coastguard Worker glPolygonOffsetClampEXT(getWindowWidth(), 0, 0.25);
8798*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
8799*8975f5c5SAndroid Build Coastguard Worker
8800*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
8801*8975f5c5SAndroid Build Coastguard Worker glPolygonOffsetClampEXT(getWindowWidth(), 0, 0.5);
8802*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
8803*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
8804*8975f5c5SAndroid Build Coastguard Worker
8805*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, 3 * w / 4 - 1, h, GLColor::green);
8806*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(3 * w / 4 + 1, 0, w / 4 - 1, h, GLColor::red);
8807*8975f5c5SAndroid Build Coastguard Worker
8808*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8809*8975f5c5SAndroid Build Coastguard Worker }
8810*8975f5c5SAndroid Build Coastguard Worker
8811*8975f5c5SAndroid Build Coastguard Worker // Tests state change for glBlendColor.
TEST_P(StateChangeTestES3,BlendColor)8812*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, BlendColor)
8813*8975f5c5SAndroid Build Coastguard Worker {
8814*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
8815*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
8816*8975f5c5SAndroid Build Coastguard Worker
8817*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
8818*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
8819*8975f5c5SAndroid Build Coastguard Worker
8820*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
8821*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_CONSTANT_COLOR, GL_ZERO);
8822*8975f5c5SAndroid Build Coastguard Worker glBlendColor(0.498, 0.498, 0, 1);
8823*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 1, 1, 1);
8824*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8825*8975f5c5SAndroid Build Coastguard Worker
8826*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
8827*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
8828*8975f5c5SAndroid Build Coastguard Worker
8829*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
8830*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, w / 2, h);
8831*8975f5c5SAndroid Build Coastguard Worker glBlendColor(0, 1, 0.498, 1);
8832*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0.247, 1, 1);
8833*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8834*8975f5c5SAndroid Build Coastguard Worker
8835*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h, GLColor(0, 63, 127, 255));
8836*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h, GLColor(127, 127, 0, 255));
8837*8975f5c5SAndroid Build Coastguard Worker
8838*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8839*8975f5c5SAndroid Build Coastguard Worker }
8840*8975f5c5SAndroid Build Coastguard Worker
8841*8975f5c5SAndroid Build Coastguard Worker // Tests state change for ref and mask in glStencilFuncSeparate.
TEST_P(StateChangeTestES3,StencilReferenceAndCompareMask)8842*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, StencilReferenceAndCompareMask)
8843*8975f5c5SAndroid Build Coastguard Worker {
8844*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
8845*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
8846*8975f5c5SAndroid Build Coastguard Worker
8847*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
8848*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
8849*8975f5c5SAndroid Build Coastguard Worker
8850*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
8851*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x3A);
8852*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
8853*8975f5c5SAndroid Build Coastguard Worker
8854*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
8855*8975f5c5SAndroid Build Coastguard Worker
8856*8975f5c5SAndroid Build Coastguard Worker glStencilMaskSeparate(GL_FRONT, 0xF0);
8857*8975f5c5SAndroid Build Coastguard Worker glStencilMaskSeparate(GL_BACK, 0x0F);
8858*8975f5c5SAndroid Build Coastguard Worker
8859*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_FRONT, GL_EQUAL, 0xB9, 0x7C);
8860*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_REPLACE);
8861*8975f5c5SAndroid Build Coastguard Worker
8862*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_BACK, GL_EQUAL, 0x99, 0xAC);
8863*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_BACK, GL_REPLACE, GL_KEEP, GL_KEEP);
8864*8975f5c5SAndroid Build Coastguard Worker
8865*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
8866*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
8867*8975f5c5SAndroid Build Coastguard Worker
8868*8975f5c5SAndroid Build Coastguard Worker // Draw front-facing. Front stencil test should pass, replacing the top bits with 0xB:
8869*8975f5c5SAndroid Build Coastguard Worker //
8870*8975f5c5SAndroid Build Coastguard Worker // Current value of stencil buffer: 0x3A, mask: 0x7C, writing 0xB9
8871*8975f5c5SAndroid Build Coastguard Worker //
8872*8975f5c5SAndroid Build Coastguard Worker // B9 & 7C == 38 == 3A & 7C
8873*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
8874*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8875*8975f5c5SAndroid Build Coastguard Worker
8876*8975f5c5SAndroid Build Coastguard Worker // Draw back-facing. Back stencil test should fail, replacing the bottom bits with 0x9:
8877*8975f5c5SAndroid Build Coastguard Worker //
8878*8975f5c5SAndroid Build Coastguard Worker // Current value of stencil buffer: 0xBA, mask: 0xAC, writing 0x99
8879*8975f5c5SAndroid Build Coastguard Worker //
8880*8975f5c5SAndroid Build Coastguard Worker // 99 & AC == 88 != A8 == BA & AC
8881*8975f5c5SAndroid Build Coastguard Worker glFrontFace(GL_CW);
8882*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_CULL_FACE);
8883*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
8884*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, w / 2, h);
8885*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
8886*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8887*8975f5c5SAndroid Build Coastguard Worker
8888*8975f5c5SAndroid Build Coastguard Worker // The left half of image should now have a value of B9, the right half should have BA
8889*8975f5c5SAndroid Build Coastguard Worker //
8890*8975f5c5SAndroid Build Coastguard Worker // Change the masks such that if the old masks are used, stencil test would fail, but if the new
8891*8975f5c5SAndroid Build Coastguard Worker // mask is used it would pass.
8892*8975f5c5SAndroid Build Coastguard Worker //
8893*8975f5c5SAndroid Build Coastguard Worker // Left: B9 & 7C == 38 != 3C == 3D & 7C
8894*8975f5c5SAndroid Build Coastguard Worker // B9 & 33 == 31 == 3D & 33
8895*8975f5c5SAndroid Build Coastguard Worker //
8896*8975f5c5SAndroid Build Coastguard Worker // Right: BA & AC == A8 != 28 == 3A & AC
8897*8975f5c5SAndroid Build Coastguard Worker // BA & 59 == 18 == 3A & 59
8898*8975f5c5SAndroid Build Coastguard Worker //
8899*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_FRONT, GL_EQUAL, 0x3D, 0x33);
8900*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_BACK, GL_EQUAL, 0x3A, 0x59);
8901*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP);
8902*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP);
8903*8975f5c5SAndroid Build Coastguard Worker
8904*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, w, h / 2);
8905*8975f5c5SAndroid Build Coastguard Worker
8906*8975f5c5SAndroid Build Coastguard Worker // Draw front-facing, coloring the top-left
8907*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 1, 0, 1);
8908*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8909*8975f5c5SAndroid Build Coastguard Worker glFrontFace(GL_CCW);
8910*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 1);
8911*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8912*8975f5c5SAndroid Build Coastguard Worker
8913*8975f5c5SAndroid Build Coastguard Worker // Verify results
8914*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::blue);
8915*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::yellow);
8916*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::red);
8917*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::red);
8918*8975f5c5SAndroid Build Coastguard Worker
8919*8975f5c5SAndroid Build Coastguard Worker // Verify stencil exactly
8920*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
8921*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0xB9, 0xFF);
8922*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 1, 1);
8923*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8924*8975f5c5SAndroid Build Coastguard Worker
8925*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0xBA, 0xFF);
8926*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 1, 1);
8927*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8928*8975f5c5SAndroid Build Coastguard Worker
8929*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h, GLColor::cyan);
8930*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h, GLColor::magenta);
8931*8975f5c5SAndroid Build Coastguard Worker
8932*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
8933*8975f5c5SAndroid Build Coastguard Worker }
8934*8975f5c5SAndroid Build Coastguard Worker
8935*8975f5c5SAndroid Build Coastguard Worker // Tests state change for mask in glStencilMaskSeparate.
TEST_P(StateChangeTestES3,StencilWriteMask)8936*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, StencilWriteMask)
8937*8975f5c5SAndroid Build Coastguard Worker {
8938*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
8939*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
8940*8975f5c5SAndroid Build Coastguard Worker
8941*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
8942*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
8943*8975f5c5SAndroid Build Coastguard Worker
8944*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
8945*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x00);
8946*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
8947*8975f5c5SAndroid Build Coastguard Worker
8948*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
8949*8975f5c5SAndroid Build Coastguard Worker
8950*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_REPLACE);
8951*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_BACK, GL_REPLACE, GL_KEEP, GL_REPLACE);
8952*8975f5c5SAndroid Build Coastguard Worker
8953*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
8954*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
8955*8975f5c5SAndroid Build Coastguard Worker
8956*8975f5c5SAndroid Build Coastguard Worker // Draw front-facing to the left half, replacing the top four bits, and back-facing to the right
8957*8975f5c5SAndroid Build Coastguard Worker // half, replacing the bottom four bits.
8958*8975f5c5SAndroid Build Coastguard Worker glStencilMaskSeparate(GL_FRONT, 0xF0);
8959*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_FRONT, GL_ALWAYS, 0x39, 0xFF);
8960*8975f5c5SAndroid Build Coastguard Worker glStencilMaskSeparate(GL_BACK, 0x0F);
8961*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0x2A, 0xFF);
8962*8975f5c5SAndroid Build Coastguard Worker
8963*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
8964*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, w / 2, h);
8965*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
8966*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8967*8975f5c5SAndroid Build Coastguard Worker
8968*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_CULL_FACE);
8969*8975f5c5SAndroid Build Coastguard Worker glFrontFace(GL_CW);
8970*8975f5c5SAndroid Build Coastguard Worker glScissor(w / 2, 0, w / 2, h);
8971*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
8972*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8973*8975f5c5SAndroid Build Coastguard Worker
8974*8975f5c5SAndroid Build Coastguard Worker // Draw back-facing to the top-left quarter, replacing the top two bits, and front-facing to the
8975*8975f5c5SAndroid Build Coastguard Worker // top-right quarter, replacing the bottom two bits.
8976*8975f5c5SAndroid Build Coastguard Worker glStencilMaskSeparate(GL_FRONT, 0xC0);
8977*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_FRONT, GL_ALWAYS, 0x81, 0xFF);
8978*8975f5c5SAndroid Build Coastguard Worker glStencilMaskSeparate(GL_BACK, 0x03);
8979*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0x53, 0xFF);
8980*8975f5c5SAndroid Build Coastguard Worker
8981*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, w / 2, h / 2);
8982*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 1);
8983*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8984*8975f5c5SAndroid Build Coastguard Worker
8985*8975f5c5SAndroid Build Coastguard Worker glFrontFace(GL_CCW);
8986*8975f5c5SAndroid Build Coastguard Worker glScissor(w / 2, 0, w / 2, h / 2);
8987*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 1, 0, 1);
8988*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
8989*8975f5c5SAndroid Build Coastguard Worker
8990*8975f5c5SAndroid Build Coastguard Worker // Verify results
8991*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::blue);
8992*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::yellow);
8993*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::red);
8994*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::green);
8995*8975f5c5SAndroid Build Coastguard Worker
8996*8975f5c5SAndroid Build Coastguard Worker // Verify stencil exactly. Stencil has the following values:
8997*8975f5c5SAndroid Build Coastguard Worker //
8998*8975f5c5SAndroid Build Coastguard Worker // +------+------+
8999*8975f5c5SAndroid Build Coastguard Worker // | | |
9000*8975f5c5SAndroid Build Coastguard Worker // | 33 | 8A |
9001*8975f5c5SAndroid Build Coastguard Worker // | | |
9002*8975f5c5SAndroid Build Coastguard Worker // +------+------+
9003*8975f5c5SAndroid Build Coastguard Worker // | | |
9004*8975f5c5SAndroid Build Coastguard Worker // | 30 | 0A |
9005*8975f5c5SAndroid Build Coastguard Worker // | | |
9006*8975f5c5SAndroid Build Coastguard Worker // +------+------+
9007*8975f5c5SAndroid Build Coastguard Worker //
9008*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
9009*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x33, 0xFF);
9010*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 1, 1);
9011*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
9012*8975f5c5SAndroid Build Coastguard Worker
9013*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x8A, 0xFF);
9014*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 1, 1);
9015*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
9016*8975f5c5SAndroid Build Coastguard Worker
9017*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x30, 0xFF);
9018*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 1, 1, 1);
9019*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
9020*8975f5c5SAndroid Build Coastguard Worker
9021*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x0A, 0xFF);
9022*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 0, 1);
9023*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
9024*8975f5c5SAndroid Build Coastguard Worker
9025*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::cyan);
9026*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::magenta);
9027*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::white);
9028*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::black);
9029*8975f5c5SAndroid Build Coastguard Worker
9030*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9031*8975f5c5SAndroid Build Coastguard Worker }
9032*8975f5c5SAndroid Build Coastguard Worker
9033*8975f5c5SAndroid Build Coastguard Worker // Tests that |discard| works with stencil write mask
TEST_P(StateChangeTestES3,StencilWriteMaskVsDiscard)9034*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, StencilWriteMaskVsDiscard)
9035*8975f5c5SAndroid Build Coastguard Worker {
9036*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
9037*8975f5c5SAndroid Build Coastguard Worker precision highp float;
9038*8975f5c5SAndroid Build Coastguard Worker void main()
9039*8975f5c5SAndroid Build Coastguard Worker {
9040*8975f5c5SAndroid Build Coastguard Worker // gl_VertexID x y
9041*8975f5c5SAndroid Build Coastguard Worker // 0 -1 -1
9042*8975f5c5SAndroid Build Coastguard Worker // 1 1 -1
9043*8975f5c5SAndroid Build Coastguard Worker // 2 -1 1
9044*8975f5c5SAndroid Build Coastguard Worker // 3 1 1
9045*8975f5c5SAndroid Build Coastguard Worker int bit0 = gl_VertexID & 1;
9046*8975f5c5SAndroid Build Coastguard Worker int bit1 = gl_VertexID >> 1;
9047*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, gl_VertexID % 2 == 0 ? -1 : 1, 1);
9048*8975f5c5SAndroid Build Coastguard Worker })";
9049*8975f5c5SAndroid Build Coastguard Worker
9050*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
9051*8975f5c5SAndroid Build Coastguard Worker precision highp float;
9052*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
9053*8975f5c5SAndroid Build Coastguard Worker uniform vec4 color;
9054*8975f5c5SAndroid Build Coastguard Worker uniform int flag;
9055*8975f5c5SAndroid Build Coastguard Worker void main()
9056*8975f5c5SAndroid Build Coastguard Worker {
9057*8975f5c5SAndroid Build Coastguard Worker if (flag > 0)
9058*8975f5c5SAndroid Build Coastguard Worker {
9059*8975f5c5SAndroid Build Coastguard Worker discard;
9060*8975f5c5SAndroid Build Coastguard Worker }
9061*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
9062*8975f5c5SAndroid Build Coastguard Worker })";
9063*8975f5c5SAndroid Build Coastguard Worker
9064*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
9065*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
9066*8975f5c5SAndroid Build Coastguard Worker
9067*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, "color");
9068*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
9069*8975f5c5SAndroid Build Coastguard Worker
9070*8975f5c5SAndroid Build Coastguard Worker GLint flagLoc = glGetUniformLocation(program, "flag");
9071*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(flagLoc, -1);
9072*8975f5c5SAndroid Build Coastguard Worker
9073*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
9074*8975f5c5SAndroid Build Coastguard Worker
9075*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
9076*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(1);
9077*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x00);
9078*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
9079*8975f5c5SAndroid Build Coastguard Worker
9080*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LEQUAL);
9081*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_FALSE);
9082*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
9083*8975f5c5SAndroid Build Coastguard Worker
9084*8975f5c5SAndroid Build Coastguard Worker // Enable stencil write, but issue a draw call where all fragments are discarded.
9085*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 128, 128);
9086*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
9087*8975f5c5SAndroid Build Coastguard Worker glStencilMask(128);
9088*8975f5c5SAndroid Build Coastguard Worker
9089*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
9090*8975f5c5SAndroid Build Coastguard Worker glUniform1i(flagLoc, 1);
9091*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
9092*8975f5c5SAndroid Build Coastguard Worker
9093*8975f5c5SAndroid Build Coastguard Worker // At this point, the stencil buffer should be unmodified. Verify it with another draw call.
9094*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_NOTEQUAL, 128, 128);
9095*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
9096*8975f5c5SAndroid Build Coastguard Worker glStencilMask(128);
9097*8975f5c5SAndroid Build Coastguard Worker
9098*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
9099*8975f5c5SAndroid Build Coastguard Worker glUniform1i(flagLoc, 0);
9100*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
9101*8975f5c5SAndroid Build Coastguard Worker
9102*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
9103*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
9104*8975f5c5SAndroid Build Coastguard Worker
9105*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::green);
9106*8975f5c5SAndroid Build Coastguard Worker
9107*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9108*8975f5c5SAndroid Build Coastguard Worker }
9109*8975f5c5SAndroid Build Coastguard Worker
9110*8975f5c5SAndroid Build Coastguard Worker // Tests state change for glCullFace and glEnable(GL_CULL_FACE) as well as glFrontFace
TEST_P(StateChangeTestES3,CullFaceAndFrontFace)9111*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, CullFaceAndFrontFace)
9112*8975f5c5SAndroid Build Coastguard Worker {
9113*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
9114*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
9115*8975f5c5SAndroid Build Coastguard Worker
9116*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
9117*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
9118*8975f5c5SAndroid Build Coastguard Worker
9119*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
9120*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
9121*8975f5c5SAndroid Build Coastguard Worker
9122*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
9123*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
9124*8975f5c5SAndroid Build Coastguard Worker
9125*8975f5c5SAndroid Build Coastguard Worker // Draw red back-facing. Face culling is initially disabled
9126*8975f5c5SAndroid Build Coastguard Worker glFrontFace(GL_CW);
9127*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
9128*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
9129*8975f5c5SAndroid Build Coastguard Worker
9130*8975f5c5SAndroid Build Coastguard Worker // Draw green back-facing, but enable face culling. Default cull face is back.
9131*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_CULL_FACE);
9132*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
9133*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, w / 2, h / 2);
9134*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
9135*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
9136*8975f5c5SAndroid Build Coastguard Worker
9137*8975f5c5SAndroid Build Coastguard Worker // Draw blue front-facing.
9138*8975f5c5SAndroid Build Coastguard Worker glFrontFace(GL_CCW);
9139*8975f5c5SAndroid Build Coastguard Worker glScissor(w / 2, 0, w / 2, h / 2);
9140*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 1);
9141*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
9142*8975f5c5SAndroid Build Coastguard Worker
9143*8975f5c5SAndroid Build Coastguard Worker // Draw magenta front-facing, but change cull face to front
9144*8975f5c5SAndroid Build Coastguard Worker glCullFace(GL_FRONT);
9145*8975f5c5SAndroid Build Coastguard Worker glScissor(0, h / 2, w / 2, h / 2);
9146*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 1, 1);
9147*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
9148*8975f5c5SAndroid Build Coastguard Worker
9149*8975f5c5SAndroid Build Coastguard Worker // Draw cyan front-facing, with face culling disabled
9150*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_CULL_FACE);
9151*8975f5c5SAndroid Build Coastguard Worker glScissor(w / 2, h / 2, w / 2, h / 2);
9152*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 1, 1);
9153*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
9154*8975f5c5SAndroid Build Coastguard Worker
9155*8975f5c5SAndroid Build Coastguard Worker // Draw yellow front-facing, with cull face set to front and back
9156*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_CULL_FACE);
9157*8975f5c5SAndroid Build Coastguard Worker glCullFace(GL_FRONT_AND_BACK);
9158*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
9159*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 1, 0, 1);
9160*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
9161*8975f5c5SAndroid Build Coastguard Worker
9162*8975f5c5SAndroid Build Coastguard Worker // Verify results
9163*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::red);
9164*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::blue);
9165*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::red);
9166*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::cyan);
9167*8975f5c5SAndroid Build Coastguard Worker
9168*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9169*8975f5c5SAndroid Build Coastguard Worker }
9170*8975f5c5SAndroid Build Coastguard Worker
9171*8975f5c5SAndroid Build Coastguard Worker // Tests state change for draw primitive mode
TEST_P(StateChangeTestES3,PrimitiveMode)9172*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, PrimitiveMode)
9173*8975f5c5SAndroid Build Coastguard Worker {
9174*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
9175*8975f5c5SAndroid Build Coastguard Worker precision highp float;
9176*8975f5c5SAndroid Build Coastguard Worker
9177*8975f5c5SAndroid Build Coastguard Worker // Hardcoded positions for a number of draw modes, using different vertex offsets.
9178*8975f5c5SAndroid Build Coastguard Worker const vec2 kVertices[35] = vec2[35](
9179*8975f5c5SAndroid Build Coastguard Worker // Two triangle
9180*8975f5c5SAndroid Build Coastguard Worker vec2(-1, -1), vec2(1, -1), vec2(-1, 1),
9181*8975f5c5SAndroid Build Coastguard Worker vec2(-1, 1), vec2(1, -1), vec2( 1, 1),
9182*8975f5c5SAndroid Build Coastguard Worker // A triangle strip with 8 triangles
9183*8975f5c5SAndroid Build Coastguard Worker vec2( -1, -0.5), vec2( -1, 0.5),
9184*8975f5c5SAndroid Build Coastguard Worker vec2(-0.75, -0.5), vec2(-0.75, 0.5),
9185*8975f5c5SAndroid Build Coastguard Worker vec2( -0.5, -0.5), vec2( -0.5, 0.5),
9186*8975f5c5SAndroid Build Coastguard Worker vec2(-0.25, -0.5), vec2(-0.25, 0.5),
9187*8975f5c5SAndroid Build Coastguard Worker vec2( 0, -0.5), vec2( 0, 0.5),
9188*8975f5c5SAndroid Build Coastguard Worker // A triangle fan with 4 triangles
9189*8975f5c5SAndroid Build Coastguard Worker vec2(0.5, 0), vec2(1, -0.5), vec2(1, 0.5), vec2(0, 0.5), vec2(0, -0.5), vec2(1, -0.5),
9190*8975f5c5SAndroid Build Coastguard Worker // One line
9191*8975f5c5SAndroid Build Coastguard Worker vec2(-1, -0.49), vec2(1, -0.49),
9192*8975f5c5SAndroid Build Coastguard Worker // One line strip
9193*8975f5c5SAndroid Build Coastguard Worker vec2(-1, 0.51), vec2(0, 0.51), vec2(1, 0.51),
9194*8975f5c5SAndroid Build Coastguard Worker // One line loop
9195*8975f5c5SAndroid Build Coastguard Worker vec2(-.99, -.99), vec2(0.99, -.99), vec2(0.99, 0.99), vec2(-.99, 0.99),
9196*8975f5c5SAndroid Build Coastguard Worker // Four points
9197*8975f5c5SAndroid Build Coastguard Worker vec2(-.99, -.99), vec2(0.99, -.99), vec2(0.99, 0.99), vec2(-.99, 0.99)
9198*8975f5c5SAndroid Build Coastguard Worker );
9199*8975f5c5SAndroid Build Coastguard Worker
9200*8975f5c5SAndroid Build Coastguard Worker void main()
9201*8975f5c5SAndroid Build Coastguard Worker {
9202*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(kVertices[gl_VertexID], 0, 1);
9203*8975f5c5SAndroid Build Coastguard Worker gl_PointSize = 1.;
9204*8975f5c5SAndroid Build Coastguard Worker })";
9205*8975f5c5SAndroid Build Coastguard Worker
9206*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
9207*8975f5c5SAndroid Build Coastguard Worker precision highp float;
9208*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
9209*8975f5c5SAndroid Build Coastguard Worker uniform vec4 color;
9210*8975f5c5SAndroid Build Coastguard Worker void main()
9211*8975f5c5SAndroid Build Coastguard Worker {
9212*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
9213*8975f5c5SAndroid Build Coastguard Worker })";
9214*8975f5c5SAndroid Build Coastguard Worker
9215*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
9216*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
9217*8975f5c5SAndroid Build Coastguard Worker
9218*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, "color");
9219*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
9220*8975f5c5SAndroid Build Coastguard Worker
9221*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
9222*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
9223*8975f5c5SAndroid Build Coastguard Worker
9224*8975f5c5SAndroid Build Coastguard Worker // Draw the following:
9225*8975f5c5SAndroid Build Coastguard Worker //
9226*8975f5c5SAndroid Build Coastguard Worker // 1. Red with two triangles
9227*8975f5c5SAndroid Build Coastguard Worker // 2. Green with a triangle strip
9228*8975f5c5SAndroid Build Coastguard Worker // 3. Blue with a triangle fan
9229*8975f5c5SAndroid Build Coastguard Worker // 4. Yellow with a line
9230*8975f5c5SAndroid Build Coastguard Worker // 5. Cyan with a line strip
9231*8975f5c5SAndroid Build Coastguard Worker // 6. Magenta with a line loop
9232*8975f5c5SAndroid Build Coastguard Worker // 7. White with four points
9233*8975f5c5SAndroid Build Coastguard Worker //
9234*8975f5c5SAndroid Build Coastguard Worker //
9235*8975f5c5SAndroid Build Coastguard Worker // +---------------------------+ <-- 7: corners
9236*8975f5c5SAndroid Build Coastguard Worker // | |
9237*8975f5c5SAndroid Build Coastguard Worker // | 1 |
9238*8975f5c5SAndroid Build Coastguard Worker // | |
9239*8975f5c5SAndroid Build Coastguard Worker // +-------------+-------------+ <-- 5: horizontal line
9240*8975f5c5SAndroid Build Coastguard Worker // | | |
9241*8975f5c5SAndroid Build Coastguard Worker // | | |
9242*8975f5c5SAndroid Build Coastguard Worker // | | |
9243*8975f5c5SAndroid Build Coastguard Worker // | 2 | 3 | <-- 6: border around image
9244*8975f5c5SAndroid Build Coastguard Worker // | | |
9245*8975f5c5SAndroid Build Coastguard Worker // | | |
9246*8975f5c5SAndroid Build Coastguard Worker // | | |
9247*8975f5c5SAndroid Build Coastguard Worker // +-------------+-------------+ <-- 4: horizontal line
9248*8975f5c5SAndroid Build Coastguard Worker // | |
9249*8975f5c5SAndroid Build Coastguard Worker // | 1 |
9250*8975f5c5SAndroid Build Coastguard Worker // | |
9251*8975f5c5SAndroid Build Coastguard Worker // +---------------------------+
9252*8975f5c5SAndroid Build Coastguard Worker
9253*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
9254*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
9255*8975f5c5SAndroid Build Coastguard Worker
9256*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
9257*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 6, 10);
9258*8975f5c5SAndroid Build Coastguard Worker
9259*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 1);
9260*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_FAN, 16, 6);
9261*8975f5c5SAndroid Build Coastguard Worker
9262*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 1, 0, 1);
9263*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINES, 22, 2);
9264*8975f5c5SAndroid Build Coastguard Worker
9265*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 1, 1);
9266*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINE_STRIP, 24, 3);
9267*8975f5c5SAndroid Build Coastguard Worker
9268*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 1, 1);
9269*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_LINE_LOOP, 27, 4);
9270*8975f5c5SAndroid Build Coastguard Worker
9271*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 1, 1, 1);
9272*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 31, 4);
9273*8975f5c5SAndroid Build Coastguard Worker
9274*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
9275*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
9276*8975f5c5SAndroid Build Coastguard Worker
9277*8975f5c5SAndroid Build Coastguard Worker // Verify results
9278*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(1, 1, w - 2, h / 4 - 2, GLColor::red);
9279*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(1, 3 * h / 4 + 1, w - 2, h / 4 - 2, GLColor::red);
9280*8975f5c5SAndroid Build Coastguard Worker
9281*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(1, h / 4 + 1, w / 2 - 2, h / 2 - 2, GLColor::green);
9282*8975f5c5SAndroid Build Coastguard Worker
9283*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2 + 1, h / 4 + 1, w / 2 - 2, h / 2 - 2, GLColor::blue);
9284*8975f5c5SAndroid Build Coastguard Worker
9285*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(1, h / 4, w / 2 - 2, 1, GLColor::yellow);
9286*8975f5c5SAndroid Build Coastguard Worker
9287*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(1, 3 * h / 4, w / 2 - 2, 1, GLColor::cyan);
9288*8975f5c5SAndroid Build Coastguard Worker
9289*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(1, 0, w - 2, 1, GLColor::magenta);
9290*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 1, 1, h - 2, GLColor::magenta);
9291*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w - 1, 1, 1, h - 2, GLColor::magenta);
9292*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(1, h - 1, w - 2, 1, GLColor::magenta);
9293*8975f5c5SAndroid Build Coastguard Worker
9294*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
9295*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w - 1, 0, GLColor::white);
9296*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, h - 1, GLColor::white);
9297*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w - 1, h - 1, GLColor::white);
9298*8975f5c5SAndroid Build Coastguard Worker
9299*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9300*8975f5c5SAndroid Build Coastguard Worker }
9301*8975f5c5SAndroid Build Coastguard Worker
9302*8975f5c5SAndroid Build Coastguard Worker // Tests that vertex attributes are correctly bound after a masked clear. In the Vulkan backend,
9303*8975f5c5SAndroid Build Coastguard Worker // the masked clear is done with an internal shader that doesn't use vertex attributes.
TEST_P(StateChangeTestES3,DrawMaskedClearDraw)9304*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, DrawMaskedClearDraw)
9305*8975f5c5SAndroid Build Coastguard Worker {
9306*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
9307*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
9308*8975f5c5SAndroid Build Coastguard Worker
9309*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
9310*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
9311*8975f5c5SAndroid Build Coastguard Worker
9312*8975f5c5SAndroid Build Coastguard Worker GLint posAttrib = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
9313*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0, posAttrib);
9314*8975f5c5SAndroid Build Coastguard Worker
9315*8975f5c5SAndroid Build Coastguard Worker std::array<GLfloat, 3 * 4> positionData = {
9316*8975f5c5SAndroid Build Coastguard Worker -1, -1, 0, 1, -1, 0, -1, 1, 0, 1, 1, 0,
9317*8975f5c5SAndroid Build Coastguard Worker };
9318*8975f5c5SAndroid Build Coastguard Worker
9319*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
9320*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
9321*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(positionData), positionData.data(), GL_STATIC_DRAW);
9322*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
9323*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(posAttrib);
9324*8975f5c5SAndroid Build Coastguard Worker
9325*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
9326*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
9327*8975f5c5SAndroid Build Coastguard Worker
9328*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
9329*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
9330*8975f5c5SAndroid Build Coastguard Worker
9331*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
9332*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
9333*8975f5c5SAndroid Build Coastguard Worker
9334*8975f5c5SAndroid Build Coastguard Worker // Draw to red and alpha channels, with garbage in green and blue
9335*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0.123f, 0.456f, 0.5f);
9336*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
9337*8975f5c5SAndroid Build Coastguard Worker
9338*8975f5c5SAndroid Build Coastguard Worker // Clear the green and blue channels
9339*8975f5c5SAndroid Build Coastguard Worker glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE);
9340*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.333f, 0.5, 0, 0.888f);
9341*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
9342*8975f5c5SAndroid Build Coastguard Worker
9343*8975f5c5SAndroid Build Coastguard Worker // Blend in to saturate green and alpha
9344*8975f5c5SAndroid Build Coastguard Worker glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
9345*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0.6f, 0, 0.6f);
9346*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
9347*8975f5c5SAndroid Build Coastguard Worker
9348*8975f5c5SAndroid Build Coastguard Worker // Verify results
9349*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::yellow);
9350*8975f5c5SAndroid Build Coastguard Worker
9351*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9352*8975f5c5SAndroid Build Coastguard Worker }
9353*8975f5c5SAndroid Build Coastguard Worker
9354*8975f5c5SAndroid Build Coastguard Worker // Tests state change for vertex attribute stride
TEST_P(StateChangeTestES3,VertexStride)9355*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, VertexStride)
9356*8975f5c5SAndroid Build Coastguard Worker {
9357*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] =
9358*8975f5c5SAndroid Build Coastguard Worker R"(#version 300 es
9359*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
9360*8975f5c5SAndroid Build Coastguard Worker in vec4 position;
9361*8975f5c5SAndroid Build Coastguard Worker layout(location = 1) in vec4 test;
9362*8975f5c5SAndroid Build Coastguard Worker layout(location = 5) in vec4 expected;
9363*8975f5c5SAndroid Build Coastguard Worker out vec4 result;
9364*8975f5c5SAndroid Build Coastguard Worker void main(void)
9365*8975f5c5SAndroid Build Coastguard Worker {
9366*8975f5c5SAndroid Build Coastguard Worker gl_Position = position;
9367*8975f5c5SAndroid Build Coastguard Worker if (any(equal(test, vec4(0))) || any(equal(expected, vec4(0))))
9368*8975f5c5SAndroid Build Coastguard Worker {
9369*8975f5c5SAndroid Build Coastguard Worker result = vec4(0);
9370*8975f5c5SAndroid Build Coastguard Worker }
9371*8975f5c5SAndroid Build Coastguard Worker else
9372*8975f5c5SAndroid Build Coastguard Worker {
9373*8975f5c5SAndroid Build Coastguard Worker vec4 threshold = max(abs(expected) * 0.01, 1.0 / 64.0);
9374*8975f5c5SAndroid Build Coastguard Worker result = vec4(lessThanEqual(abs(test - expected), threshold));
9375*8975f5c5SAndroid Build Coastguard Worker }
9376*8975f5c5SAndroid Build Coastguard Worker })";
9377*8975f5c5SAndroid Build Coastguard Worker
9378*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
9379*8975f5c5SAndroid Build Coastguard Worker R"(#version 300 es
9380*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
9381*8975f5c5SAndroid Build Coastguard Worker in vec4 result;
9382*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
9383*8975f5c5SAndroid Build Coastguard Worker void main()
9384*8975f5c5SAndroid Build Coastguard Worker {
9385*8975f5c5SAndroid Build Coastguard Worker colorOut = vec4(greaterThanEqual(result, vec4(0.999)));
9386*8975f5c5SAndroid Build Coastguard Worker })";
9387*8975f5c5SAndroid Build Coastguard Worker
9388*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
9389*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
9390*8975f5c5SAndroid Build Coastguard Worker
9391*8975f5c5SAndroid Build Coastguard Worker // Every draw call consists of 4 vertices. The vertex attributes are laid out as follows:
9392*8975f5c5SAndroid Build Coastguard Worker //
9393*8975f5c5SAndroid Build Coastguard Worker // Position: No gaps
9394*8975f5c5SAndroid Build Coastguard Worker // test: 4 unorm vertices with stride 20, simultaneously 4 vertices with stride 16
9395*8975f5c5SAndroid Build Coastguard Worker // expected: 4 float vertices with stride 80, simultaneously 4 vertices with stride 48
9396*8975f5c5SAndroid Build Coastguard Worker
9397*8975f5c5SAndroid Build Coastguard Worker const std::array<GLubyte, 7 * 4> kData = {{1, 2, 3, 4, 5, 6, 7, 8, 125, 126,
9398*8975f5c5SAndroid Build Coastguard Worker 127, 128, 129, 250, 251, 252, 78, 79, 80, 81,
9399*8975f5c5SAndroid Build Coastguard Worker 155, 156, 157, 158, 20, 21, 22, 23}};
9400*8975f5c5SAndroid Build Coastguard Worker
9401*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kTestStride1 = 20;
9402*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kTestStride2 = 16;
9403*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kExpectedStride1 = 20;
9404*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kExpectedStride2 = 12;
9405*8975f5c5SAndroid Build Coastguard Worker
9406*8975f5c5SAndroid Build Coastguard Worker std::array<GLubyte, kTestStride1 * 3 + 4> testInitData = {};
9407*8975f5c5SAndroid Build Coastguard Worker std::array<GLfloat, kExpectedStride1 * 3 + 4> expectedInitData = {};
9408*8975f5c5SAndroid Build Coastguard Worker
9409*8975f5c5SAndroid Build Coastguard Worker for (uint32_t vertex = 0; vertex < 7; ++vertex)
9410*8975f5c5SAndroid Build Coastguard Worker {
9411*8975f5c5SAndroid Build Coastguard Worker size_t testOffset = vertex * kTestStride1;
9412*8975f5c5SAndroid Build Coastguard Worker size_t expectedOffset = vertex * kExpectedStride1;
9413*8975f5c5SAndroid Build Coastguard Worker if (vertex >= 4)
9414*8975f5c5SAndroid Build Coastguard Worker {
9415*8975f5c5SAndroid Build Coastguard Worker testOffset = (vertex - 3) * kTestStride2;
9416*8975f5c5SAndroid Build Coastguard Worker expectedOffset = (vertex - 3) * kExpectedStride2;
9417*8975f5c5SAndroid Build Coastguard Worker }
9418*8975f5c5SAndroid Build Coastguard Worker
9419*8975f5c5SAndroid Build Coastguard Worker for (uint32_t channel = 0; channel < 4; ++channel)
9420*8975f5c5SAndroid Build Coastguard Worker {
9421*8975f5c5SAndroid Build Coastguard Worker // The strides are chosen such that the two streams don't collide
9422*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(testInitData[testOffset + channel], 0);
9423*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(expectedInitData[expectedOffset + channel], 0);
9424*8975f5c5SAndroid Build Coastguard Worker
9425*8975f5c5SAndroid Build Coastguard Worker GLubyte data = kData[vertex * 4 + channel];
9426*8975f5c5SAndroid Build Coastguard Worker testInitData[testOffset + channel] = data;
9427*8975f5c5SAndroid Build Coastguard Worker expectedInitData[expectedOffset + channel] = data;
9428*8975f5c5SAndroid Build Coastguard Worker }
9429*8975f5c5SAndroid Build Coastguard Worker
9430*8975f5c5SAndroid Build Coastguard Worker // For the first 4 vertices, expect perfect match (i.e. get white). For the last 3
9431*8975f5c5SAndroid Build Coastguard Worker // vertices, expect the green channel test to fail (i.e. get magenta).
9432*8975f5c5SAndroid Build Coastguard Worker if (vertex >= 4)
9433*8975f5c5SAndroid Build Coastguard Worker {
9434*8975f5c5SAndroid Build Coastguard Worker expectedInitData[expectedOffset + 1] += 2;
9435*8975f5c5SAndroid Build Coastguard Worker }
9436*8975f5c5SAndroid Build Coastguard Worker }
9437*8975f5c5SAndroid Build Coastguard Worker
9438*8975f5c5SAndroid Build Coastguard Worker std::array<GLfloat, 3 * 4> positionData = {
9439*8975f5c5SAndroid Build Coastguard Worker -1, -1, 0, 1, -1, 0, -1, 1, 0, 1, 1, 0,
9440*8975f5c5SAndroid Build Coastguard Worker };
9441*8975f5c5SAndroid Build Coastguard Worker
9442*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
9443*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
9444*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(positionData), positionData.data(), GL_STATIC_DRAW);
9445*8975f5c5SAndroid Build Coastguard Worker
9446*8975f5c5SAndroid Build Coastguard Worker GLBuffer testBuffer;
9447*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, testBuffer);
9448*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(testInitData), testInitData.data(), GL_STATIC_DRAW);
9449*8975f5c5SAndroid Build Coastguard Worker
9450*8975f5c5SAndroid Build Coastguard Worker GLBuffer expectedBuffer;
9451*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, expectedBuffer);
9452*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(expectedInitData), expectedInitData.data(),
9453*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
9454*8975f5c5SAndroid Build Coastguard Worker
9455*8975f5c5SAndroid Build Coastguard Worker GLint posAttrib = glGetAttribLocation(program, "position");
9456*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0, posAttrib);
9457*8975f5c5SAndroid Build Coastguard Worker GLint testAttrib = glGetAttribLocation(program, "test");
9458*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(1, testAttrib);
9459*8975f5c5SAndroid Build Coastguard Worker GLint expectedAttrib = glGetAttribLocation(program, "expected");
9460*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(5, expectedAttrib);
9461*8975f5c5SAndroid Build Coastguard Worker
9462*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
9463*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
9464*8975f5c5SAndroid Build Coastguard Worker
9465*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
9466*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
9467*8975f5c5SAndroid Build Coastguard Worker
9468*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(posAttrib);
9469*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(testAttrib);
9470*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(expectedAttrib);
9471*8975f5c5SAndroid Build Coastguard Worker
9472*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
9473*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
9474*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, testBuffer);
9475*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(testAttrib, 4, GL_UNSIGNED_BYTE, GL_FALSE, kTestStride1 * sizeof(GLubyte),
9476*8975f5c5SAndroid Build Coastguard Worker nullptr);
9477*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, expectedBuffer);
9478*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(expectedAttrib, 4, GL_FLOAT, GL_FALSE, kExpectedStride1 * sizeof(GLfloat),
9479*8975f5c5SAndroid Build Coastguard Worker nullptr);
9480*8975f5c5SAndroid Build Coastguard Worker
9481*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
9482*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, w / 2, h);
9483*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
9484*8975f5c5SAndroid Build Coastguard Worker
9485*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, testBuffer);
9486*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(testAttrib, 4, GL_UNSIGNED_BYTE, GL_FALSE, kTestStride2 * sizeof(GLubyte),
9487*8975f5c5SAndroid Build Coastguard Worker nullptr);
9488*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, expectedBuffer);
9489*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(expectedAttrib, 4, GL_FLOAT, GL_FALSE, kExpectedStride2 * sizeof(GLfloat),
9490*8975f5c5SAndroid Build Coastguard Worker nullptr);
9491*8975f5c5SAndroid Build Coastguard Worker
9492*8975f5c5SAndroid Build Coastguard Worker glScissor(w / 2, 0, w / 2, h);
9493*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
9494*8975f5c5SAndroid Build Coastguard Worker
9495*8975f5c5SAndroid Build Coastguard Worker // Verify results
9496*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h, GLColor::white);
9497*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h, GLColor::magenta);
9498*8975f5c5SAndroid Build Coastguard Worker
9499*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9500*8975f5c5SAndroid Build Coastguard Worker }
9501*8975f5c5SAndroid Build Coastguard Worker
9502*8975f5c5SAndroid Build Coastguard Worker // Tests state change for vertex attribute format
TEST_P(StateChangeTestES3,VertexFormat)9503*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, VertexFormat)
9504*8975f5c5SAndroid Build Coastguard Worker {
9505*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(precision highp float;
9506*8975f5c5SAndroid Build Coastguard Worker attribute vec3 position;
9507*8975f5c5SAndroid Build Coastguard Worker attribute vec4 color;
9508*8975f5c5SAndroid Build Coastguard Worker varying vec4 colorOut;
9509*8975f5c5SAndroid Build Coastguard Worker
9510*8975f5c5SAndroid Build Coastguard Worker void main()
9511*8975f5c5SAndroid Build Coastguard Worker {
9512*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 1.0);
9513*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
9514*8975f5c5SAndroid Build Coastguard Worker })";
9515*8975f5c5SAndroid Build Coastguard Worker
9516*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision highp float;
9517*8975f5c5SAndroid Build Coastguard Worker varying vec4 colorOut;
9518*8975f5c5SAndroid Build Coastguard Worker
9519*8975f5c5SAndroid Build Coastguard Worker void main()
9520*8975f5c5SAndroid Build Coastguard Worker {
9521*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = colorOut;
9522*8975f5c5SAndroid Build Coastguard Worker })";
9523*8975f5c5SAndroid Build Coastguard Worker
9524*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
9525*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
9526*8975f5c5SAndroid Build Coastguard Worker
9527*8975f5c5SAndroid Build Coastguard Worker GLint positionLoc = glGetAttribLocation(program, "position");
9528*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(positionLoc, -1);
9529*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetAttribLocation(program, "color");
9530*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
9531*8975f5c5SAndroid Build Coastguard Worker
9532*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
9533*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
9534*8975f5c5SAndroid Build Coastguard Worker
9535*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector4> colorAttribDataFloat(6, Vector4(255.0f, 0.0f, 0.0f, 255.0f));
9536*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> colorAttribDataUnsignedByte(6, GLColor::green);
9537*8975f5c5SAndroid Build Coastguard Worker
9538*8975f5c5SAndroid Build Coastguard Worker // Setup position attribute
9539*8975f5c5SAndroid Build Coastguard Worker std::array<Vector3, 6> quadVertices = GetQuadVertices();
9540*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexLocationBuffer;
9541*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexLocationBuffer);
9542*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(Vector3) * 6, quadVertices.data(), GL_STATIC_DRAW);
9543*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, 0);
9544*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(positionLoc);
9545*8975f5c5SAndroid Build Coastguard Worker
9546*8975f5c5SAndroid Build Coastguard Worker // Setup color attribute with float data
9547*8975f5c5SAndroid Build Coastguard Worker GLBuffer floatBuffer;
9548*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, floatBuffer);
9549*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(Vector4) * 6, colorAttribDataFloat.data(), GL_STATIC_DRAW);
9550*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 4, GL_FLOAT, GL_FALSE, 0, 0);
9551*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
9552*8975f5c5SAndroid Build Coastguard Worker
9553*8975f5c5SAndroid Build Coastguard Worker // Draw red using float attribute
9554*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
9555*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9556*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
9557*8975f5c5SAndroid Build Coastguard Worker
9558*8975f5c5SAndroid Build Coastguard Worker // Setup color attribute with unsigned byte data
9559*8975f5c5SAndroid Build Coastguard Worker GLBuffer unsignedByteBuffer;
9560*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, unsignedByteBuffer);
9561*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(GLColor) * 6, colorAttribDataUnsignedByte.data(),
9562*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
9563*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(colorLoc, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0);
9564*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(colorLoc);
9565*8975f5c5SAndroid Build Coastguard Worker
9566*8975f5c5SAndroid Build Coastguard Worker // Draw green using unsigned byte attribute
9567*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
9568*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9569*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
9570*8975f5c5SAndroid Build Coastguard Worker
9571*8975f5c5SAndroid Build Coastguard Worker glUseProgram(0);
9572*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
9573*8975f5c5SAndroid Build Coastguard Worker }
9574*8975f5c5SAndroid Build Coastguard Worker
9575*8975f5c5SAndroid Build Coastguard Worker // Tests state change for depth test, write and function
TEST_P(StateChangeTestES3,DepthTestWriteAndFunc)9576*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, DepthTestWriteAndFunc)
9577*8975f5c5SAndroid Build Coastguard Worker {
9578*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
9579*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
9580*8975f5c5SAndroid Build Coastguard Worker
9581*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
9582*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
9583*8975f5c5SAndroid Build Coastguard Worker
9584*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
9585*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
9586*8975f5c5SAndroid Build Coastguard Worker
9587*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
9588*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.5);
9589*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
9590*8975f5c5SAndroid Build Coastguard Worker
9591*8975f5c5SAndroid Build Coastguard Worker // Initialize the depth buffer:
9592*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
9593*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
9594*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
9595*8975f5c5SAndroid Build Coastguard Worker
9596*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
9597*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, w / 2, h / 2);
9598*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 0, 1);
9599*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.8f);
9600*8975f5c5SAndroid Build Coastguard Worker glScissor(w / 2, 0, w / 2, h / 2);
9601*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.2f);
9602*8975f5c5SAndroid Build Coastguard Worker glScissor(0, h / 2, w / 2, h / 2);
9603*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.4f);
9604*8975f5c5SAndroid Build Coastguard Worker glScissor(w / 2, h / 2, w / 2, h / 2);
9605*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.6f);
9606*8975f5c5SAndroid Build Coastguard Worker
9607*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
9608*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
9609*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_FALSE);
9610*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
9611*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9612*8975f5c5SAndroid Build Coastguard Worker
9613*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::red);
9614*8975f5c5SAndroid Build Coastguard Worker
9615*8975f5c5SAndroid Build Coastguard Worker // Make draw calls that test depth or not, write depth or not, and use different functions
9616*8975f5c5SAndroid Build Coastguard Worker
9617*8975f5c5SAndroid Build Coastguard Worker // Write green to one half
9618*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
9619*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
9620*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
9621*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.35f);
9622*8975f5c5SAndroid Build Coastguard Worker
9623*8975f5c5SAndroid Build Coastguard Worker // Write blue to another half
9624*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
9625*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 1);
9626*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.15f);
9627*8975f5c5SAndroid Build Coastguard Worker
9628*8975f5c5SAndroid Build Coastguard Worker // Write yellow to a corner, overriding depth
9629*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
9630*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 1, 0, 1);
9631*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.6f);
9632*8975f5c5SAndroid Build Coastguard Worker
9633*8975f5c5SAndroid Build Coastguard Worker // Write magenta to another corner, overriding depth
9634*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
9635*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 1, 1);
9636*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
9637*8975f5c5SAndroid Build Coastguard Worker
9638*8975f5c5SAndroid Build Coastguard Worker // No-op write
9639*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_NEVER);
9640*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 1, 1);
9641*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9642*8975f5c5SAndroid Build Coastguard Worker
9643*8975f5c5SAndroid Build Coastguard Worker // Verify results
9644*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::yellow);
9645*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::blue);
9646*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::green);
9647*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::magenta);
9648*8975f5c5SAndroid Build Coastguard Worker
9649*8975f5c5SAndroid Build Coastguard Worker // Verify the depth buffer
9650*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_FALSE);
9651*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
9652*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
9653*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.61f);
9654*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 0, 1);
9655*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.59f);
9656*8975f5c5SAndroid Build Coastguard Worker
9657*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::red);
9658*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::black);
9659*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::black);
9660*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::black);
9661*8975f5c5SAndroid Build Coastguard Worker
9662*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
9663*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 1, 1);
9664*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.51f);
9665*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 0, 1);
9666*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.49f);
9667*8975f5c5SAndroid Build Coastguard Worker
9668*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::black);
9669*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::black);
9670*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::black);
9671*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::cyan);
9672*8975f5c5SAndroid Build Coastguard Worker
9673*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
9674*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
9675*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.21f);
9676*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 1, 1, 1);
9677*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.19f);
9678*8975f5c5SAndroid Build Coastguard Worker
9679*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::black);
9680*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::green);
9681*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::white);
9682*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::white);
9683*8975f5c5SAndroid Build Coastguard Worker
9684*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
9685*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 1);
9686*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.41f);
9687*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 1, 1);
9688*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.39f);
9689*8975f5c5SAndroid Build Coastguard Worker
9690*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::magenta);
9691*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::magenta);
9692*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::blue);
9693*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::white);
9694*8975f5c5SAndroid Build Coastguard Worker
9695*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9696*8975f5c5SAndroid Build Coastguard Worker }
9697*8975f5c5SAndroid Build Coastguard Worker
9698*8975f5c5SAndroid Build Coastguard Worker // Tests state change for depth test while depth write is enabled
TEST_P(StateChangeTestES3,DepthTestToggleWithDepthWrite)9699*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, DepthTestToggleWithDepthWrite)
9700*8975f5c5SAndroid Build Coastguard Worker {
9701*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
9702*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
9703*8975f5c5SAndroid Build Coastguard Worker
9704*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
9705*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
9706*8975f5c5SAndroid Build Coastguard Worker
9707*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
9708*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
9709*8975f5c5SAndroid Build Coastguard Worker
9710*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
9711*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.5);
9712*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
9713*8975f5c5SAndroid Build Coastguard Worker
9714*8975f5c5SAndroid Build Coastguard Worker // Enable depth write, but keep depth test disabled. Internally, depth write may be disabled
9715*8975f5c5SAndroid Build Coastguard Worker // because of the depth test.
9716*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
9717*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
9718*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
9719*8975f5c5SAndroid Build Coastguard Worker
9720*8975f5c5SAndroid Build Coastguard Worker // Draw with a different depth, but because depth test is disabled, depth is not actually
9721*8975f5c5SAndroid Build Coastguard Worker // changed.
9722*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
9723*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.3f);
9724*8975f5c5SAndroid Build Coastguard Worker
9725*8975f5c5SAndroid Build Coastguard Worker // Enable depth test, but don't change state otherwise. The following draw must change depth.
9726*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
9727*8975f5c5SAndroid Build Coastguard Worker
9728*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
9729*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.2f);
9730*8975f5c5SAndroid Build Coastguard Worker
9731*8975f5c5SAndroid Build Coastguard Worker // Verify that depth was changed in the last draw call.
9732*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::green);
9733*8975f5c5SAndroid Build Coastguard Worker
9734*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
9735*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 1);
9736*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.1f);
9737*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::blue);
9738*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9739*8975f5c5SAndroid Build Coastguard Worker }
9740*8975f5c5SAndroid Build Coastguard Worker
9741*8975f5c5SAndroid Build Coastguard Worker // Tests state change for stencil test and function
TEST_P(StateChangeTestES3,StencilTestAndFunc)9742*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, StencilTestAndFunc)
9743*8975f5c5SAndroid Build Coastguard Worker {
9744*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
9745*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
9746*8975f5c5SAndroid Build Coastguard Worker
9747*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
9748*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
9749*8975f5c5SAndroid Build Coastguard Worker
9750*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
9751*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
9752*8975f5c5SAndroid Build Coastguard Worker
9753*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
9754*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0.5);
9755*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0x55);
9756*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
9757*8975f5c5SAndroid Build Coastguard Worker
9758*8975f5c5SAndroid Build Coastguard Worker // Initialize the depth and stencil buffers
9759*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
9760*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
9761*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
9762*8975f5c5SAndroid Build Coastguard Worker
9763*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
9764*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
9765*8975f5c5SAndroid Build Coastguard Worker
9766*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
9767*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, w / 2, h / 2);
9768*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 0, 1);
9769*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x3E, 0xFF);
9770*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.8f);
9771*8975f5c5SAndroid Build Coastguard Worker glScissor(w / 2, 0, w / 2, h / 2);
9772*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0xA7, 0xFF);
9773*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.2f);
9774*8975f5c5SAndroid Build Coastguard Worker glScissor(0, h / 2, w / 2, h / 2);
9775*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x6C, 0xFF);
9776*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.4f);
9777*8975f5c5SAndroid Build Coastguard Worker glScissor(w / 2, h / 2, w / 2, h / 2);
9778*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_ALWAYS, 0x5B, 0xFF);
9779*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.6f);
9780*8975f5c5SAndroid Build Coastguard Worker
9781*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
9782*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
9783*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_STENCIL_TEST);
9784*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_FALSE);
9785*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
9786*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
9787*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9788*8975f5c5SAndroid Build Coastguard Worker
9789*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::red);
9790*8975f5c5SAndroid Build Coastguard Worker
9791*8975f5c5SAndroid Build Coastguard Worker // Make draw calls that manipulate stencil and use different functions and ops.
9792*8975f5c5SAndroid Build Coastguard Worker
9793*8975f5c5SAndroid Build Coastguard Worker // Current color/depth/stencil in the four sections of the image:
9794*8975f5c5SAndroid Build Coastguard Worker //
9795*8975f5c5SAndroid Build Coastguard Worker // red/-0.8/3E red/-0.2/A7
9796*8975f5c5SAndroid Build Coastguard Worker // red/ 0.4/6C red/0.6/5B
9797*8975f5c5SAndroid Build Coastguard Worker //
9798*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
9799*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_LESS);
9800*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
9801*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_FRONT, GL_EQUAL, 0x2C, 0x2C);
9802*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_FRONT, GL_INCR, GL_DECR, GL_INVERT);
9803*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_BACK, GL_GREATER, 0x7B, 0xFF);
9804*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_BACK, GL_INCR, GL_ZERO, GL_REPLACE);
9805*8975f5c5SAndroid Build Coastguard Worker
9806*8975f5c5SAndroid Build Coastguard Worker // Draw green front-facing to get:
9807*8975f5c5SAndroid Build Coastguard Worker //
9808*8975f5c5SAndroid Build Coastguard Worker // red/-0.8/3D red/-0.2/A8
9809*8975f5c5SAndroid Build Coastguard Worker // green/ 0.4/93 red/ 0.6/5C
9810*8975f5c5SAndroid Build Coastguard Worker //
9811*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
9812*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9813*8975f5c5SAndroid Build Coastguard Worker
9814*8975f5c5SAndroid Build Coastguard Worker // Draw blue back-facing to get:
9815*8975f5c5SAndroid Build Coastguard Worker //
9816*8975f5c5SAndroid Build Coastguard Worker // red/-0.8/00 red/-0.2/A9
9817*8975f5c5SAndroid Build Coastguard Worker // green/ 0.4/94 blue/ 0.6/7B
9818*8975f5c5SAndroid Build Coastguard Worker //
9819*8975f5c5SAndroid Build Coastguard Worker glFrontFace(GL_CW);
9820*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 1);
9821*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9822*8975f5c5SAndroid Build Coastguard Worker
9823*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_FRONT, GL_LEQUAL, 0x42, 0x42);
9824*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_DECR, GL_INCR_WRAP);
9825*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0x00, 0x00);
9826*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_BACK, GL_KEEP, GL_INCR, GL_INVERT);
9827*8975f5c5SAndroid Build Coastguard Worker
9828*8975f5c5SAndroid Build Coastguard Worker // Draw yellow back-facing to get:
9829*8975f5c5SAndroid Build Coastguard Worker //
9830*8975f5c5SAndroid Build Coastguard Worker // yellow/-0.8/FF yellow/-0.2/56
9831*8975f5c5SAndroid Build Coastguard Worker // green/ 0.4/95 blue/ 0.6/7C
9832*8975f5c5SAndroid Build Coastguard Worker //
9833*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
9834*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 1, 0, 1);
9835*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9836*8975f5c5SAndroid Build Coastguard Worker
9837*8975f5c5SAndroid Build Coastguard Worker // Draw cyan front-facing to get:
9838*8975f5c5SAndroid Build Coastguard Worker //
9839*8975f5c5SAndroid Build Coastguard Worker // cyan/-0.8/00 yellow/-0.2/55
9840*8975f5c5SAndroid Build Coastguard Worker // green/ 0.4/95 blue/ 0.6/7C
9841*8975f5c5SAndroid Build Coastguard Worker //
9842*8975f5c5SAndroid Build Coastguard Worker glFrontFace(GL_CCW);
9843*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 1, 1);
9844*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), -0.5);
9845*8975f5c5SAndroid Build Coastguard Worker
9846*8975f5c5SAndroid Build Coastguard Worker // No-op draw
9847*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_FRONT, GL_NEVER, 0x00, 0x00);
9848*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_INVERT, GL_INVERT);
9849*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 1, 1);
9850*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9851*8975f5c5SAndroid Build Coastguard Worker
9852*8975f5c5SAndroid Build Coastguard Worker // Verify results
9853*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::cyan);
9854*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::yellow);
9855*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::green);
9856*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::blue);
9857*8975f5c5SAndroid Build Coastguard Worker
9858*8975f5c5SAndroid Build Coastguard Worker // Verify the stencil buffer
9859*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
9860*8975f5c5SAndroid Build Coastguard Worker glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP);
9861*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_FRONT, GL_EQUAL, 0x00, 0xFF);
9862*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
9863*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9864*8975f5c5SAndroid Build Coastguard Worker
9865*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::red);
9866*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::yellow);
9867*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::green);
9868*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::blue);
9869*8975f5c5SAndroid Build Coastguard Worker
9870*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_FRONT, GL_EQUAL, 0x55, 0xFF);
9871*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 1, 1);
9872*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9873*8975f5c5SAndroid Build Coastguard Worker
9874*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::red);
9875*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::magenta);
9876*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::green);
9877*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::blue);
9878*8975f5c5SAndroid Build Coastguard Worker
9879*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_FRONT, GL_EQUAL, 0x95, 0xFF);
9880*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 1, 1, 1);
9881*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9882*8975f5c5SAndroid Build Coastguard Worker
9883*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::red);
9884*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::magenta);
9885*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::white);
9886*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::blue);
9887*8975f5c5SAndroid Build Coastguard Worker
9888*8975f5c5SAndroid Build Coastguard Worker glStencilFuncSeparate(GL_FRONT, GL_EQUAL, 0x7C, 0xFF);
9889*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 0, 1);
9890*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9891*8975f5c5SAndroid Build Coastguard Worker
9892*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2, h / 2, GLColor::red);
9893*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::magenta);
9894*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, h / 2, w / 2, h / 2, GLColor::white);
9895*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2, h / 2, w / 2, h / 2, GLColor::black);
9896*8975f5c5SAndroid Build Coastguard Worker
9897*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9898*8975f5c5SAndroid Build Coastguard Worker }
9899*8975f5c5SAndroid Build Coastguard Worker
9900*8975f5c5SAndroid Build Coastguard Worker // Tests state change for rasterizer discard
TEST_P(StateChangeTestES3,RasterizerDiscard)9901*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, RasterizerDiscard)
9902*8975f5c5SAndroid Build Coastguard Worker {
9903*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
9904*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
9905*8975f5c5SAndroid Build Coastguard Worker
9906*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
9907*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
9908*8975f5c5SAndroid Build Coastguard Worker
9909*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
9910*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
9911*8975f5c5SAndroid Build Coastguard Worker
9912*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 0);
9913*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
9914*8975f5c5SAndroid Build Coastguard Worker
9915*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
9916*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
9917*8975f5c5SAndroid Build Coastguard Worker
9918*8975f5c5SAndroid Build Coastguard Worker // Start a render pass and issue three draw calls with the middle one having rasterizer discard
9919*8975f5c5SAndroid Build Coastguard Worker // enabled.
9920*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 0);
9921*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9922*8975f5c5SAndroid Build Coastguard Worker
9923*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_RASTERIZER_DISCARD);
9924*8975f5c5SAndroid Build Coastguard Worker
9925*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 1, 0);
9926*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9927*8975f5c5SAndroid Build Coastguard Worker
9928*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_RASTERIZER_DISCARD);
9929*8975f5c5SAndroid Build Coastguard Worker
9930*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 0, 1);
9931*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9932*8975f5c5SAndroid Build Coastguard Worker
9933*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::red);
9934*8975f5c5SAndroid Build Coastguard Worker
9935*8975f5c5SAndroid Build Coastguard Worker // Enable rasterizer discard and make sure the state is effective.
9936*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_RASTERIZER_DISCARD);
9937*8975f5c5SAndroid Build Coastguard Worker
9938*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
9939*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9940*8975f5c5SAndroid Build Coastguard Worker
9941*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::red);
9942*8975f5c5SAndroid Build Coastguard Worker
9943*8975f5c5SAndroid Build Coastguard Worker // Start a render pass and issue three draw calls with the first and last ones having rasterizer
9944*8975f5c5SAndroid Build Coastguard Worker // discard enabled.
9945*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 0);
9946*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9947*8975f5c5SAndroid Build Coastguard Worker
9948*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_RASTERIZER_DISCARD);
9949*8975f5c5SAndroid Build Coastguard Worker
9950*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 0);
9951*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9952*8975f5c5SAndroid Build Coastguard Worker
9953*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_RASTERIZER_DISCARD);
9954*8975f5c5SAndroid Build Coastguard Worker
9955*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
9956*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0);
9957*8975f5c5SAndroid Build Coastguard Worker
9958*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::magenta);
9959*8975f5c5SAndroid Build Coastguard Worker
9960*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
9961*8975f5c5SAndroid Build Coastguard Worker }
9962*8975f5c5SAndroid Build Coastguard Worker
9963*8975f5c5SAndroid Build Coastguard Worker // Tests state change for GL_POLYGON_OFFSET_FILL.
TEST_P(StateChangeTestES3,PolygonOffsetFill)9964*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, PolygonOffsetFill)
9965*8975f5c5SAndroid Build Coastguard Worker {
9966*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
9967*8975f5c5SAndroid Build Coastguard Worker precision highp float;
9968*8975f5c5SAndroid Build Coastguard Worker void main()
9969*8975f5c5SAndroid Build Coastguard Worker {
9970*8975f5c5SAndroid Build Coastguard Worker // gl_VertexID x y
9971*8975f5c5SAndroid Build Coastguard Worker // 0 -1 -1
9972*8975f5c5SAndroid Build Coastguard Worker // 1 1 -1
9973*8975f5c5SAndroid Build Coastguard Worker // 2 -1 1
9974*8975f5c5SAndroid Build Coastguard Worker // 3 1 1
9975*8975f5c5SAndroid Build Coastguard Worker int bit0 = gl_VertexID & 1;
9976*8975f5c5SAndroid Build Coastguard Worker int bit1 = gl_VertexID >> 1;
9977*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, gl_VertexID % 2 == 0 ? -1 : 1, 1);
9978*8975f5c5SAndroid Build Coastguard Worker })";
9979*8975f5c5SAndroid Build Coastguard Worker
9980*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
9981*8975f5c5SAndroid Build Coastguard Worker precision highp float;
9982*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
9983*8975f5c5SAndroid Build Coastguard Worker uniform vec4 color;
9984*8975f5c5SAndroid Build Coastguard Worker void main()
9985*8975f5c5SAndroid Build Coastguard Worker {
9986*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
9987*8975f5c5SAndroid Build Coastguard Worker })";
9988*8975f5c5SAndroid Build Coastguard Worker
9989*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
9990*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
9991*8975f5c5SAndroid Build Coastguard Worker
9992*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, "color");
9993*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
9994*8975f5c5SAndroid Build Coastguard Worker
9995*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
9996*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0);
9997*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
9998*8975f5c5SAndroid Build Coastguard Worker
9999*8975f5c5SAndroid Build Coastguard Worker // The shader creates a depth slope from left (0) to right (1).
10000*8975f5c5SAndroid Build Coastguard Worker //
10001*8975f5c5SAndroid Build Coastguard Worker // This test issues three draw calls:
10002*8975f5c5SAndroid Build Coastguard Worker //
10003*8975f5c5SAndroid Build Coastguard Worker //
10004*8975f5c5SAndroid Build Coastguard Worker // Draw 3 (blue): factor width/2, enabled, depth test: Greater
10005*8975f5c5SAndroid Build Coastguard Worker // ^ | __________________
10006*8975f5c5SAndroid Build Coastguard Worker // | | __/ __/ __/
10007*8975f5c5SAndroid Build Coastguard Worker // | V __/ __/ __/
10008*8975f5c5SAndroid Build Coastguard Worker // | __/ __/ __/
10009*8975f5c5SAndroid Build Coastguard Worker // | __/ __/ __/
10010*8975f5c5SAndroid Build Coastguard Worker // |/ __/^ __/
10011*8975f5c5SAndroid Build Coastguard Worker // | __/ | __/ <--- Draw 2: factor width/2, disabled, depth test: Greater
10012*8975f5c5SAndroid Build Coastguard Worker // | __/ _\/
10013*8975f5c5SAndroid Build Coastguard Worker // |/ __/ \
10014*8975f5c5SAndroid Build Coastguard Worker // | __/ Draw 1 (red): factor width/4, enabled
10015*8975f5c5SAndroid Build Coastguard Worker // | __/
10016*8975f5c5SAndroid Build Coastguard Worker // +/------------------------------>
10017*8975f5c5SAndroid Build Coastguard Worker //
10018*8975f5c5SAndroid Build Coastguard Worker // Result: <-------magenta-------><--red-->
10019*8975f5c5SAndroid Build Coastguard Worker
10020*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
10021*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
10022*8975f5c5SAndroid Build Coastguard Worker
10023*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
10024*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_ALWAYS);
10025*8975f5c5SAndroid Build Coastguard Worker
10026*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_POLYGON_OFFSET_FILL);
10027*8975f5c5SAndroid Build Coastguard Worker
10028*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
10029*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
10030*8975f5c5SAndroid Build Coastguard Worker
10031*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 1);
10032*8975f5c5SAndroid Build Coastguard Worker glPolygonOffset(getWindowWidth() / 4, 0);
10033*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10034*8975f5c5SAndroid Build Coastguard Worker
10035*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
10036*8975f5c5SAndroid Build Coastguard Worker glPolygonOffset(getWindowWidth() / 2, 0);
10037*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
10038*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_POLYGON_OFFSET_FILL);
10039*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10040*8975f5c5SAndroid Build Coastguard Worker
10041*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 1);
10042*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_POLYGON_OFFSET_FILL);
10043*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10044*8975f5c5SAndroid Build Coastguard Worker
10045*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, 3 * w / 4 - 1, h, GLColor::magenta);
10046*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(3 * w / 4 + 1, 0, w / 4 - 1, h, GLColor::red);
10047*8975f5c5SAndroid Build Coastguard Worker
10048*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10049*8975f5c5SAndroid Build Coastguard Worker }
10050*8975f5c5SAndroid Build Coastguard Worker
10051*8975f5c5SAndroid Build Coastguard Worker // Tests state change for GL_PRIMITIVE_RESTART.
TEST_P(StateChangeTestES3,PrimitiveRestart)10052*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, PrimitiveRestart)
10053*8975f5c5SAndroid Build Coastguard Worker {
10054*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
10055*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
10056*8975f5c5SAndroid Build Coastguard Worker
10057*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, angle::essl1_shaders::ColorUniform());
10058*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorLoc, -1);
10059*8975f5c5SAndroid Build Coastguard Worker
10060*8975f5c5SAndroid Build Coastguard Worker GLint posAttrib = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
10061*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0, posAttrib);
10062*8975f5c5SAndroid Build Coastguard Worker
10063*8975f5c5SAndroid Build Coastguard Worker // Arrange the vertices as such:
10064*8975f5c5SAndroid Build Coastguard Worker //
10065*8975f5c5SAndroid Build Coastguard Worker // 1 3 4
10066*8975f5c5SAndroid Build Coastguard Worker // +-----+-----+
10067*8975f5c5SAndroid Build Coastguard Worker // | | |
10068*8975f5c5SAndroid Build Coastguard Worker // | | |
10069*8975f5c5SAndroid Build Coastguard Worker // | | |
10070*8975f5c5SAndroid Build Coastguard Worker // | | |
10071*8975f5c5SAndroid Build Coastguard Worker // | | |
10072*8975f5c5SAndroid Build Coastguard Worker // | | |
10073*8975f5c5SAndroid Build Coastguard Worker // +-----+-----+
10074*8975f5c5SAndroid Build Coastguard Worker // 0 2 FF
10075*8975f5c5SAndroid Build Coastguard Worker //
10076*8975f5c5SAndroid Build Coastguard Worker // Drawing a triangle strip, without primitive restart, the whole framebuffer is rendered, while
10077*8975f5c5SAndroid Build Coastguard Worker // with primitive restart only the left half is.
10078*8975f5c5SAndroid Build Coastguard Worker std::vector<Vector3> positionData(256, {0, 0, 0});
10079*8975f5c5SAndroid Build Coastguard Worker
10080*8975f5c5SAndroid Build Coastguard Worker positionData[0] = Vector3(-1, -1, 0);
10081*8975f5c5SAndroid Build Coastguard Worker positionData[1] = Vector3(-1, 1, 0);
10082*8975f5c5SAndroid Build Coastguard Worker positionData[2] = Vector3(0, -1, 0);
10083*8975f5c5SAndroid Build Coastguard Worker positionData[3] = Vector3(0, 1, 0);
10084*8975f5c5SAndroid Build Coastguard Worker positionData[0xFF] = Vector3(1, -1, 0);
10085*8975f5c5SAndroid Build Coastguard Worker positionData[4] = Vector3(1, 1, 0);
10086*8975f5c5SAndroid Build Coastguard Worker
10087*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<GLubyte, 6> indices = {0, 1, 2, 3, 0xFF, 4};
10088*8975f5c5SAndroid Build Coastguard Worker
10089*8975f5c5SAndroid Build Coastguard Worker GLBuffer posBuffer;
10090*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
10091*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, positionData.size() * sizeof(positionData[0]),
10092*8975f5c5SAndroid Build Coastguard Worker positionData.data(), GL_STATIC_DRAW);
10093*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
10094*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(posAttrib);
10095*8975f5c5SAndroid Build Coastguard Worker
10096*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
10097*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
10098*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices.data(), GL_STATIC_DRAW);
10099*8975f5c5SAndroid Build Coastguard Worker
10100*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
10101*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
10102*8975f5c5SAndroid Build Coastguard Worker
10103*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
10104*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
10105*8975f5c5SAndroid Build Coastguard Worker
10106*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
10107*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
10108*8975f5c5SAndroid Build Coastguard Worker
10109*8975f5c5SAndroid Build Coastguard Worker // Draw red with primitive restart enabled
10110*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
10111*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1, 0, 0, 0);
10112*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_BYTE, nullptr);
10113*8975f5c5SAndroid Build Coastguard Worker
10114*8975f5c5SAndroid Build Coastguard Worker // Draw green with primitive restart disabled
10115*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
10116*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
10117*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_BYTE, nullptr);
10118*8975f5c5SAndroid Build Coastguard Worker
10119*8975f5c5SAndroid Build Coastguard Worker // Draw blue with primitive restart enabled again
10120*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
10121*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 0, 1, 0);
10122*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_BYTE, nullptr);
10123*8975f5c5SAndroid Build Coastguard Worker
10124*8975f5c5SAndroid Build Coastguard Worker // Verify results
10125*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w / 2 - 1, h, GLColor::white);
10126*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(w / 2 + 1, 0, w / 2 - 1, h, GLColor::green);
10127*8975f5c5SAndroid Build Coastguard Worker
10128*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10129*8975f5c5SAndroid Build Coastguard Worker }
10130*8975f5c5SAndroid Build Coastguard Worker
10131*8975f5c5SAndroid Build Coastguard Worker // Tests that primitive restart for patches can be queried when tessellation shaders are available,
10132*8975f5c5SAndroid Build Coastguard Worker // and that its value is independent of whether primitive restart is enabled.
TEST_P(StateChangeTestES31,PrimitiveRestartForPatchQuery)10133*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES31, PrimitiveRestartForPatchQuery)
10134*8975f5c5SAndroid Build Coastguard Worker {
10135*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_tessellation_shader"));
10136*8975f5c5SAndroid Build Coastguard Worker
10137*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
10138*8975f5c5SAndroid Build Coastguard Worker GLint primitiveRestartForPatchesWhenEnabled = -1;
10139*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED,
10140*8975f5c5SAndroid Build Coastguard Worker &primitiveRestartForPatchesWhenEnabled);
10141*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10142*8975f5c5SAndroid Build Coastguard Worker EXPECT_GE(primitiveRestartForPatchesWhenEnabled, 0);
10143*8975f5c5SAndroid Build Coastguard Worker
10144*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
10145*8975f5c5SAndroid Build Coastguard Worker GLint primitiveRestartForPatchesWhenDisabled = -1;
10146*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED,
10147*8975f5c5SAndroid Build Coastguard Worker &primitiveRestartForPatchesWhenDisabled);
10148*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10149*8975f5c5SAndroid Build Coastguard Worker EXPECT_GE(primitiveRestartForPatchesWhenDisabled, 0);
10150*8975f5c5SAndroid Build Coastguard Worker
10151*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(primitiveRestartForPatchesWhenEnabled, primitiveRestartForPatchesWhenDisabled);
10152*8975f5c5SAndroid Build Coastguard Worker }
10153*8975f5c5SAndroid Build Coastguard Worker
10154*8975f5c5SAndroid Build Coastguard Worker // Tests state change for GL_COLOR_LOGIC_OP and glLogicOp.
TEST_P(StateChangeTestES3,LogicOp)10155*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, LogicOp)
10156*8975f5c5SAndroid Build Coastguard Worker {
10157*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_logic_op"));
10158*8975f5c5SAndroid Build Coastguard Worker
10159*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
10160*8975f5c5SAndroid Build Coastguard Worker precision highp float;
10161*8975f5c5SAndroid Build Coastguard Worker void main()
10162*8975f5c5SAndroid Build Coastguard Worker {
10163*8975f5c5SAndroid Build Coastguard Worker // gl_VertexID x y
10164*8975f5c5SAndroid Build Coastguard Worker // 0 -1 -1
10165*8975f5c5SAndroid Build Coastguard Worker // 1 1 -1
10166*8975f5c5SAndroid Build Coastguard Worker // 2 -1 1
10167*8975f5c5SAndroid Build Coastguard Worker // 3 1 1
10168*8975f5c5SAndroid Build Coastguard Worker int bit0 = gl_VertexID & 1;
10169*8975f5c5SAndroid Build Coastguard Worker int bit1 = gl_VertexID >> 1;
10170*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, gl_VertexID % 2 == 0 ? -1 : 1, 1);
10171*8975f5c5SAndroid Build Coastguard Worker })";
10172*8975f5c5SAndroid Build Coastguard Worker
10173*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
10174*8975f5c5SAndroid Build Coastguard Worker precision highp float;
10175*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
10176*8975f5c5SAndroid Build Coastguard Worker uniform vec4 color;
10177*8975f5c5SAndroid Build Coastguard Worker void main()
10178*8975f5c5SAndroid Build Coastguard Worker {
10179*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
10180*8975f5c5SAndroid Build Coastguard Worker })";
10181*8975f5c5SAndroid Build Coastguard Worker
10182*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
10183*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
10184*8975f5c5SAndroid Build Coastguard Worker
10185*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, "color");
10186*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, colorLoc);
10187*8975f5c5SAndroid Build Coastguard Worker
10188*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 1);
10189*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0);
10190*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
10191*8975f5c5SAndroid Build Coastguard Worker
10192*8975f5c5SAndroid Build Coastguard Worker auto unorm8 = [](uint8_t value) { return (value + 0.1f) / 255.0f; };
10193*8975f5c5SAndroid Build Coastguard Worker
10194*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kInitRed = 0xA4;
10195*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kInitGreen = 0x1E;
10196*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kInitBlue = 0x97;
10197*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kInitAlpha = 0x65;
10198*8975f5c5SAndroid Build Coastguard Worker
10199*8975f5c5SAndroid Build Coastguard Worker // Initialize with logic op enabled, but using the default GL_COPY op.
10200*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_COLOR_LOGIC_OP_ANGLE);
10201*8975f5c5SAndroid Build Coastguard Worker
10202*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, unorm8(kInitRed), unorm8(kInitGreen), unorm8(kInitBlue),
10203*8975f5c5SAndroid Build Coastguard Worker unorm8(kInitAlpha));
10204*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10205*8975f5c5SAndroid Build Coastguard Worker
10206*8975f5c5SAndroid Build Coastguard Worker // Set logic op to GL_XOR and draw again.
10207*8975f5c5SAndroid Build Coastguard Worker glLogicOpANGLE(GL_LOGIC_OP_XOR_ANGLE);
10208*8975f5c5SAndroid Build Coastguard Worker
10209*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kXorRed = 0x4C;
10210*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kXorGreen = 0x7D;
10211*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kXorBlue = 0xB3;
10212*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kXorAlpha = 0x0F;
10213*8975f5c5SAndroid Build Coastguard Worker
10214*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, unorm8(kXorRed), unorm8(kXorGreen), unorm8(kXorBlue), unorm8(kXorAlpha));
10215*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10216*8975f5c5SAndroid Build Coastguard Worker
10217*8975f5c5SAndroid Build Coastguard Worker // Set logic op to GL_INVERT and draw again.
10218*8975f5c5SAndroid Build Coastguard Worker glLogicOpANGLE(GL_LOGIC_OP_INVERT_ANGLE);
10219*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0.123f, 0.234f, 0.345f, 0.456f);
10220*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10221*8975f5c5SAndroid Build Coastguard Worker
10222*8975f5c5SAndroid Build Coastguard Worker const int w = getWindowWidth();
10223*8975f5c5SAndroid Build Coastguard Worker const int h = getWindowHeight();
10224*8975f5c5SAndroid Build Coastguard Worker
10225*8975f5c5SAndroid Build Coastguard Worker // Verify results
10226*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpect(static_cast<uint8_t>(~(kInitRed ^ kXorRed)),
10227*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(~(kInitGreen ^ kXorGreen)),
10228*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(~(kInitBlue ^ kXorBlue)),
10229*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(~(kInitAlpha ^ kXorAlpha)));
10230*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, kExpect);
10231*8975f5c5SAndroid Build Coastguard Worker
10232*8975f5c5SAndroid Build Coastguard Worker // Render again with logic op enabled, this time with GL_COPY_INVERTED
10233*8975f5c5SAndroid Build Coastguard Worker glLogicOpANGLE(GL_LOGIC_OP_COPY_INVERTED_ANGLE);
10234*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0.123f, 0.234f, 0.345f, 0.456f);
10235*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10236*8975f5c5SAndroid Build Coastguard Worker
10237*8975f5c5SAndroid Build Coastguard Worker // Disable logic op and render again
10238*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_COLOR_LOGIC_OP_ANGLE);
10239*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0, 1, 0, 1);
10240*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10241*8975f5c5SAndroid Build Coastguard Worker
10242*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::green);
10243*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10244*8975f5c5SAndroid Build Coastguard Worker }
10245*8975f5c5SAndroid Build Coastguard Worker
10246*8975f5c5SAndroid Build Coastguard Worker // Test for a bug with the VK_EXT_graphics_pipeline_library implementation in a scenario such as
10247*8975f5c5SAndroid Build Coastguard Worker // this:
10248*8975f5c5SAndroid Build Coastguard Worker //
10249*8975f5c5SAndroid Build Coastguard Worker // - Use blend function A, draw <-- a new pipeline is created
10250*8975f5c5SAndroid Build Coastguard Worker // - Use blend function B, draw <-- a new pipeline is created,
10251*8975f5c5SAndroid Build Coastguard Worker // new transition from A to B
10252*8975f5c5SAndroid Build Coastguard Worker // - Switch to program 2
10253*8975f5c5SAndroid Build Coastguard Worker // - Use blend function A, draw <-- a new pipeline is created
10254*8975f5c5SAndroid Build Coastguard Worker // - Switch to program 1
10255*8975f5c5SAndroid Build Coastguard Worker // - draw <-- the first pipeline is retrieved from cache,
10256*8975f5c5SAndroid Build Coastguard Worker // new transition from B to A
10257*8975f5c5SAndroid Build Coastguard Worker // - Use blend function B, draw <-- the second pipeline is retrieved from transition
10258*8975f5c5SAndroid Build Coastguard Worker // - Switch to program 3
10259*8975f5c5SAndroid Build Coastguard Worker // - draw <-- a new pipeline is created
10260*8975f5c5SAndroid Build Coastguard Worker //
10261*8975f5c5SAndroid Build Coastguard Worker // With graphics pipeline library, the fragment output partial pipeline changes as follows:
10262*8975f5c5SAndroid Build Coastguard Worker //
10263*8975f5c5SAndroid Build Coastguard Worker // - Use blend function A, draw <-- a new fragment output pipeline is created
10264*8975f5c5SAndroid Build Coastguard Worker // - Use blend function B, draw <-- a new fragment output pipeline is created,
10265*8975f5c5SAndroid Build Coastguard Worker // new transition from A to B
10266*8975f5c5SAndroid Build Coastguard Worker // - Switch to program 2
10267*8975f5c5SAndroid Build Coastguard Worker // - Use blend function A, draw <-- the first fragment output pipeline is retrieved from cache
10268*8975f5c5SAndroid Build Coastguard Worker // - Switch to program 1
10269*8975f5c5SAndroid Build Coastguard Worker // - draw <-- the first monolithic pipeline is retrieved from cache
10270*8975f5c5SAndroid Build Coastguard Worker // - Use blend function B, draw <-- the second monolithic pipeline is retrieved from transition
10271*8975f5c5SAndroid Build Coastguard Worker // - Switch to program 3
10272*8975f5c5SAndroid Build Coastguard Worker // - draw <-- the second fragment output pipeline is retrieved from cache
10273*8975f5c5SAndroid Build Coastguard Worker //
10274*8975f5c5SAndroid Build Coastguard Worker // The bug was that the dirty blend state was discarded when the monolithic pipeline was retrieved
10275*8975f5c5SAndroid Build Coastguard Worker // through the transition graph, and the last draw call used a stale fragment output pipeline (from
10276*8975f5c5SAndroid Build Coastguard Worker // the last draw call with function A)
10277*8975f5c5SAndroid Build Coastguard Worker //
TEST_P(StateChangeTestES3,FragmentOutputStateChangeAfterCachedPipelineTransition)10278*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, FragmentOutputStateChangeAfterCachedPipelineTransition)
10279*8975f5c5SAndroid Build Coastguard Worker {
10280*8975f5c5SAndroid Build Coastguard Worker // Program 1
10281*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
10282*8975f5c5SAndroid Build Coastguard Worker // Program 2
10283*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawColor2, essl3_shaders::vs::Simple(), R"(#version 300 es
10284*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
10285*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
10286*8975f5c5SAndroid Build Coastguard Worker uniform vec4 colorIn;
10287*8975f5c5SAndroid Build Coastguard Worker void main()
10288*8975f5c5SAndroid Build Coastguard Worker {
10289*8975f5c5SAndroid Build Coastguard Worker colorOut = colorIn;
10290*8975f5c5SAndroid Build Coastguard Worker }
10291*8975f5c5SAndroid Build Coastguard Worker )");
10292*8975f5c5SAndroid Build Coastguard Worker // Program 3
10293*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
10294*8975f5c5SAndroid Build Coastguard Worker
10295*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor2);
10296*8975f5c5SAndroid Build Coastguard Worker GLint color2UniformLocation = glGetUniformLocation(drawColor2, "colorIn");
10297*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(color2UniformLocation, -1);
10298*8975f5c5SAndroid Build Coastguard Worker
10299*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
10300*8975f5c5SAndroid Build Coastguard Worker GLint colorUniformLocation =
10301*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
10302*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(colorUniformLocation, -1);
10303*8975f5c5SAndroid Build Coastguard Worker
10304*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
10305*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
10306*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 0);
10307*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
10308*8975f5c5SAndroid Build Coastguard Worker // Framebuffer color is now (0, 0, 0, 0)
10309*8975f5c5SAndroid Build Coastguard Worker
10310*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0, 0, 1, 0.25f);
10311*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
10312*8975f5c5SAndroid Build Coastguard Worker // Framebuffer color is now (0, 0, 0.25, 0.25*0.25)
10313*8975f5c5SAndroid Build Coastguard Worker
10314*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
10315*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0, 0, 0.25, 0.5 - 0.0625);
10316*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
10317*8975f5c5SAndroid Build Coastguard Worker // Framebuffer color is now (0, 0, 0.5, 0.5)
10318*8975f5c5SAndroid Build Coastguard Worker
10319*8975f5c5SAndroid Build Coastguard Worker // Draw with a different program, but same fragment output state. The fragment output pipeline
10320*8975f5c5SAndroid Build Coastguard Worker // is retrieved from cache.
10321*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
10322*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor2);
10323*8975f5c5SAndroid Build Coastguard Worker glUniform4f(color2UniformLocation, 1, 0, 0, 0.5);
10324*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor2, essl1_shaders::PositionAttrib(), 0.5f);
10325*8975f5c5SAndroid Build Coastguard Worker // Framebuffer color is now (0.5, 0, 0.25, 0.5)
10326*8975f5c5SAndroid Build Coastguard Worker
10327*8975f5c5SAndroid Build Coastguard Worker // Draw with the original program and the first fragment output state, so it's retrieved from
10328*8975f5c5SAndroid Build Coastguard Worker // cache.
10329*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
10330*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawColor);
10331*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0, 0, 0.5, 0.25);
10332*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
10333*8975f5c5SAndroid Build Coastguard Worker // Framebuffer color is now (0.25, 0, 0.25, 0.25+0.25*0.25)
10334*8975f5c5SAndroid Build Coastguard Worker
10335*8975f5c5SAndroid Build Coastguard Worker // Change to the second fragment output state, so it's retrieved through the transition graph.
10336*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
10337*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUniformLocation, 0, 0, 0.5, 0.25 - 0.25 * 0.25);
10338*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
10339*8975f5c5SAndroid Build Coastguard Worker // Framebuffer color is now (0.25, 0, 0.75, 0.5)
10340*8975f5c5SAndroid Build Coastguard Worker
10341*8975f5c5SAndroid Build Coastguard Worker // Draw with the third program, not changing the fragment output state.
10342*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.5f);
10343*8975f5c5SAndroid Build Coastguard Worker // Framebuffer color is now (0.25, 1, 0.75, 1)
10344*8975f5c5SAndroid Build Coastguard Worker
10345*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(64, 255, 192, 255), 1);
10346*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10347*8975f5c5SAndroid Build Coastguard Worker }
10348*8975f5c5SAndroid Build Coastguard Worker
10349*8975f5c5SAndroid Build Coastguard Worker // Tests a specific case for multiview and queries.
TEST_P(SimpleStateChangeTestES3,MultiviewAndQueries)10350*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, MultiviewAndQueries)
10351*8975f5c5SAndroid Build Coastguard Worker {
10352*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_OVR_multiview"));
10353*8975f5c5SAndroid Build Coastguard Worker
10354*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(prog, kZeroVertexShaderForPoints, essl1_shaders::fs::Red());
10355*8975f5c5SAndroid Build Coastguard Worker glUseProgram(prog);
10356*8975f5c5SAndroid Build Coastguard Worker
10357*8975f5c5SAndroid Build Coastguard Worker const int PRE_QUERY_CNT = 63;
10358*8975f5c5SAndroid Build Coastguard Worker
10359*8975f5c5SAndroid Build Coastguard Worker GLQuery qry;
10360*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
10361*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fb;
10362*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fb2;
10363*8975f5c5SAndroid Build Coastguard Worker glBeginQuery(GL_ANY_SAMPLES_PASSED, qry);
10364*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < PRE_QUERY_CNT; i++)
10365*8975f5c5SAndroid Build Coastguard Worker {
10366*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 1);
10367*8975f5c5SAndroid Build Coastguard Worker
10368*8975f5c5SAndroid Build Coastguard Worker GLColor color;
10369*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &color);
10370*8975f5c5SAndroid Build Coastguard Worker }
10371*8975f5c5SAndroid Build Coastguard Worker glEndQuery(GL_ANY_SAMPLES_PASSED);
10372*8975f5c5SAndroid Build Coastguard Worker glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE);
10373*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
10374*8975f5c5SAndroid Build Coastguard Worker glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 2, 2, 2);
10375*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb);
10376*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0, 2);
10377*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
10378*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb2);
10379*8975f5c5SAndroid Build Coastguard Worker glBeginQuery(GL_ANY_SAMPLES_PASSED, qry);
10380*8975f5c5SAndroid Build Coastguard Worker }
10381*8975f5c5SAndroid Build Coastguard Worker
10382*8975f5c5SAndroid Build Coastguard Worker // Tests a bug related to an ordering of certain commands.
TEST_P(SimpleStateChangeTestES3,ClearQuerySwapClear)10383*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleStateChangeTestES3, ClearQuerySwapClear)
10384*8975f5c5SAndroid Build Coastguard Worker {
10385*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
10386*8975f5c5SAndroid Build Coastguard Worker {
10387*8975f5c5SAndroid Build Coastguard Worker GLQuery query;
10388*8975f5c5SAndroid Build Coastguard Worker glBeginQuery(GL_ANY_SAMPLES_PASSED, query);
10389*8975f5c5SAndroid Build Coastguard Worker glEndQuery(GL_ANY_SAMPLES_PASSED);
10390*8975f5c5SAndroid Build Coastguard Worker }
10391*8975f5c5SAndroid Build Coastguard Worker swapBuffers();
10392*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
10393*8975f5c5SAndroid Build Coastguard Worker }
10394*8975f5c5SAndroid Build Coastguard Worker
10395*8975f5c5SAndroid Build Coastguard Worker // Tests a bug around sampler2D swap and uniform locations.
TEST_P(StateChangeTestES3,SamplerSwap)10396*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, SamplerSwap)
10397*8975f5c5SAndroid Build Coastguard Worker {
10398*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
10399*8975f5c5SAndroid Build Coastguard Worker precision highp float;
10400*8975f5c5SAndroid Build Coastguard Worker void main()
10401*8975f5c5SAndroid Build Coastguard Worker {
10402*8975f5c5SAndroid Build Coastguard Worker // gl_VertexID x y
10403*8975f5c5SAndroid Build Coastguard Worker // 0 -1 -1
10404*8975f5c5SAndroid Build Coastguard Worker // 1 1 -1
10405*8975f5c5SAndroid Build Coastguard Worker // 2 -1 1
10406*8975f5c5SAndroid Build Coastguard Worker // 3 1 1
10407*8975f5c5SAndroid Build Coastguard Worker int bit0 = gl_VertexID & 1;
10408*8975f5c5SAndroid Build Coastguard Worker int bit1 = gl_VertexID >> 1;
10409*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, gl_VertexID % 2 == 0 ? -1 : 1, 1);
10410*8975f5c5SAndroid Build Coastguard Worker })";
10411*8975f5c5SAndroid Build Coastguard Worker
10412*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS1[] = R"(#version 300 es
10413*8975f5c5SAndroid Build Coastguard Worker precision highp float;
10414*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D A;
10415*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D B;
10416*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
10417*8975f5c5SAndroid Build Coastguard Worker void main()
10418*8975f5c5SAndroid Build Coastguard Worker {
10419*8975f5c5SAndroid Build Coastguard Worker float a = texture(A, vec2(0)).x;
10420*8975f5c5SAndroid Build Coastguard Worker float b = texture(B, vec2(0)).x;
10421*8975f5c5SAndroid Build Coastguard Worker colorOut = vec4(a, b, 0, 1);
10422*8975f5c5SAndroid Build Coastguard Worker })";
10423*8975f5c5SAndroid Build Coastguard Worker
10424*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS2[] = R"(#version 300 es
10425*8975f5c5SAndroid Build Coastguard Worker precision highp float;
10426*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D B;
10427*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D A;
10428*8975f5c5SAndroid Build Coastguard Worker const vec2 multiplier = vec2(0.5, 0.5);
10429*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
10430*8975f5c5SAndroid Build Coastguard Worker void main()
10431*8975f5c5SAndroid Build Coastguard Worker {
10432*8975f5c5SAndroid Build Coastguard Worker float a = texture(A, vec2(0)).x;
10433*8975f5c5SAndroid Build Coastguard Worker float b = texture(B, vec2(0)).x;
10434*8975f5c5SAndroid Build Coastguard Worker colorOut = vec4(a, b, 0, 1);
10435*8975f5c5SAndroid Build Coastguard Worker })";
10436*8975f5c5SAndroid Build Coastguard Worker
10437*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(prog1, kVS, kFS1);
10438*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(prog2, kVS, kFS2);
10439*8975f5c5SAndroid Build Coastguard Worker
10440*8975f5c5SAndroid Build Coastguard Worker const GLColor kColorA(123, 0, 0, 0);
10441*8975f5c5SAndroid Build Coastguard Worker const GLColor kColorB(157, 0, 0, 0);
10442*8975f5c5SAndroid Build Coastguard Worker
10443*8975f5c5SAndroid Build Coastguard Worker GLTexture texA;
10444*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
10445*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texA);
10446*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
10447*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &kColorA);
10448*8975f5c5SAndroid Build Coastguard Worker
10449*8975f5c5SAndroid Build Coastguard Worker GLTexture texB;
10450*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE1);
10451*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texB);
10452*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
10453*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &kColorB);
10454*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
10455*8975f5c5SAndroid Build Coastguard Worker
10456*8975f5c5SAndroid Build Coastguard Worker glUseProgram(prog1);
10457*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog1, "A"), 0);
10458*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog1, "B"), 1);
10459*8975f5c5SAndroid Build Coastguard Worker
10460*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10461*8975f5c5SAndroid Build Coastguard Worker
10462*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpect(kColorA.R, kColorB.R, 0, 255);
10463*8975f5c5SAndroid Build Coastguard Worker
10464*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpect, 1);
10465*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10466*8975f5c5SAndroid Build Coastguard Worker
10467*8975f5c5SAndroid Build Coastguard Worker // The same with the second program that has sampler2D (definitions) swapped which should have
10468*8975f5c5SAndroid Build Coastguard Worker // no effect on the result.
10469*8975f5c5SAndroid Build Coastguard Worker glUseProgram(prog2);
10470*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog2, "A"), 0);
10471*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog2, "B"), 1);
10472*8975f5c5SAndroid Build Coastguard Worker
10473*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10474*8975f5c5SAndroid Build Coastguard Worker
10475*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpect, 1);
10476*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10477*8975f5c5SAndroid Build Coastguard Worker }
10478*8975f5c5SAndroid Build Coastguard Worker
10479*8975f5c5SAndroid Build Coastguard Worker // Tests a bug around sampler2D reordering and uniform locations.
TEST_P(StateChangeTestES3,SamplerReordering)10480*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, SamplerReordering)
10481*8975f5c5SAndroid Build Coastguard Worker {
10482*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
10483*8975f5c5SAndroid Build Coastguard Worker precision highp float;
10484*8975f5c5SAndroid Build Coastguard Worker void main()
10485*8975f5c5SAndroid Build Coastguard Worker {
10486*8975f5c5SAndroid Build Coastguard Worker // gl_VertexID x y
10487*8975f5c5SAndroid Build Coastguard Worker // 0 -1 -1
10488*8975f5c5SAndroid Build Coastguard Worker // 1 1 -1
10489*8975f5c5SAndroid Build Coastguard Worker // 2 -1 1
10490*8975f5c5SAndroid Build Coastguard Worker // 3 1 1
10491*8975f5c5SAndroid Build Coastguard Worker int bit0 = gl_VertexID & 1;
10492*8975f5c5SAndroid Build Coastguard Worker int bit1 = gl_VertexID >> 1;
10493*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, gl_VertexID % 2 == 0 ? -1 : 1, 1);
10494*8975f5c5SAndroid Build Coastguard Worker })";
10495*8975f5c5SAndroid Build Coastguard Worker
10496*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS1[] = R"(#version 300 es
10497*8975f5c5SAndroid Build Coastguard Worker precision highp float;
10498*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D A;
10499*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D B;
10500*8975f5c5SAndroid Build Coastguard Worker //uniform vec2 multiplier;
10501*8975f5c5SAndroid Build Coastguard Worker const vec2 multiplier = vec2(0.5, 0.5);
10502*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
10503*8975f5c5SAndroid Build Coastguard Worker void main()
10504*8975f5c5SAndroid Build Coastguard Worker {
10505*8975f5c5SAndroid Build Coastguard Worker float a = texture(A, vec2(0)).x;
10506*8975f5c5SAndroid Build Coastguard Worker float b = texture(B, vec2(0)).x;
10507*8975f5c5SAndroid Build Coastguard Worker colorOut = vec4(vec2(a, b) * multiplier, 0, 1);
10508*8975f5c5SAndroid Build Coastguard Worker })";
10509*8975f5c5SAndroid Build Coastguard Worker
10510*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS2[] = R"(#version 300 es
10511*8975f5c5SAndroid Build Coastguard Worker precision highp float;
10512*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D S;
10513*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D P;
10514*8975f5c5SAndroid Build Coastguard Worker //uniform vec2 multiplier;
10515*8975f5c5SAndroid Build Coastguard Worker const vec2 multiplier = vec2(0.5, 0.5);
10516*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
10517*8975f5c5SAndroid Build Coastguard Worker void main()
10518*8975f5c5SAndroid Build Coastguard Worker {
10519*8975f5c5SAndroid Build Coastguard Worker float a = texture(P, vec2(0)).x;
10520*8975f5c5SAndroid Build Coastguard Worker float b = texture(S, vec2(0)).x;
10521*8975f5c5SAndroid Build Coastguard Worker colorOut = vec4(vec2(a, b) * multiplier, 0, 1);
10522*8975f5c5SAndroid Build Coastguard Worker })";
10523*8975f5c5SAndroid Build Coastguard Worker
10524*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS3[] = R"(#version 300 es
10525*8975f5c5SAndroid Build Coastguard Worker precision highp float;
10526*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D R;
10527*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D S;
10528*8975f5c5SAndroid Build Coastguard Worker //uniform vec2 multiplier;
10529*8975f5c5SAndroid Build Coastguard Worker const vec2 multiplier = vec2(0.5, 0.5);
10530*8975f5c5SAndroid Build Coastguard Worker out vec4 colorOut;
10531*8975f5c5SAndroid Build Coastguard Worker void main()
10532*8975f5c5SAndroid Build Coastguard Worker {
10533*8975f5c5SAndroid Build Coastguard Worker float a = texture(R, vec2(0)).x;
10534*8975f5c5SAndroid Build Coastguard Worker float b = texture(S, vec2(0)).x;
10535*8975f5c5SAndroid Build Coastguard Worker colorOut = vec4(vec2(a, b) * multiplier, 0, 1);
10536*8975f5c5SAndroid Build Coastguard Worker })";
10537*8975f5c5SAndroid Build Coastguard Worker
10538*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(prog1, kVS, kFS1);
10539*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(prog2, kVS, kFS2);
10540*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(prog3, kVS, kFS3);
10541*8975f5c5SAndroid Build Coastguard Worker
10542*8975f5c5SAndroid Build Coastguard Worker const GLColor kColorA(123, 0, 0, 0);
10543*8975f5c5SAndroid Build Coastguard Worker const GLColor kColorB(157, 0, 0, 0);
10544*8975f5c5SAndroid Build Coastguard Worker
10545*8975f5c5SAndroid Build Coastguard Worker GLTexture texA;
10546*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
10547*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texA);
10548*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
10549*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &kColorA);
10550*8975f5c5SAndroid Build Coastguard Worker
10551*8975f5c5SAndroid Build Coastguard Worker GLTexture texB;
10552*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE1);
10553*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texB);
10554*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
10555*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &kColorB);
10556*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
10557*8975f5c5SAndroid Build Coastguard Worker
10558*8975f5c5SAndroid Build Coastguard Worker glUseProgram(prog1);
10559*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog1, "A"), 0);
10560*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog1, "B"), 1);
10561*8975f5c5SAndroid Build Coastguard Worker
10562*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10563*8975f5c5SAndroid Build Coastguard Worker
10564*8975f5c5SAndroid Build Coastguard Worker glUseProgram(prog2);
10565*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog2, "S"), 0);
10566*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog2, "P"), 1);
10567*8975f5c5SAndroid Build Coastguard Worker
10568*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
10569*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
10570*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10571*8975f5c5SAndroid Build Coastguard Worker
10572*8975f5c5SAndroid Build Coastguard Worker constexpr float kXMultiplier = 0.5;
10573*8975f5c5SAndroid Build Coastguard Worker constexpr float kYMultiplier = 0.5;
10574*8975f5c5SAndroid Build Coastguard Worker
10575*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpect(static_cast<uint8_t>((kColorA.R + kColorB.R) * kXMultiplier),
10576*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>((kColorA.R + kColorB.R) * kYMultiplier), 0, 255);
10577*8975f5c5SAndroid Build Coastguard Worker
10578*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpect, 1);
10579*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10580*8975f5c5SAndroid Build Coastguard Worker
10581*8975f5c5SAndroid Build Coastguard Worker // Do the same thing again, but with the second shader having its samplers specified in the
10582*8975f5c5SAndroid Build Coastguard Worker // opposite order. The difference between kFS2 and kFS3 is that S is now the second
10583*8975f5c5SAndroid Build Coastguard Worker // declaration, and P is renamed to R. The reason for the rename is that even if the samplers
10584*8975f5c5SAndroid Build Coastguard Worker // get sorted by name, they would still result in the two shaders declaring them in different
10585*8975f5c5SAndroid Build Coastguard Worker // orders.
10586*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_BLEND);
10587*8975f5c5SAndroid Build Coastguard Worker
10588*8975f5c5SAndroid Build Coastguard Worker glUseProgram(prog1);
10589*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog1, "A"), 0);
10590*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog1, "B"), 1);
10591*8975f5c5SAndroid Build Coastguard Worker
10592*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10593*8975f5c5SAndroid Build Coastguard Worker
10594*8975f5c5SAndroid Build Coastguard Worker glUseProgram(prog3);
10595*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog3, "S"), 0);
10596*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(prog3, "R"), 1);
10597*8975f5c5SAndroid Build Coastguard Worker
10598*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
10599*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
10600*8975f5c5SAndroid Build Coastguard Worker
10601*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpect, 1);
10602*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10603*8975f5c5SAndroid Build Coastguard Worker }
10604*8975f5c5SAndroid Build Coastguard Worker
10605*8975f5c5SAndroid Build Coastguard Worker // Test that switching FBO attachments affects sample coverage
TEST_P(StateChangeTestES3,SampleCoverageFramebufferAttachmentSwitch)10606*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, SampleCoverageFramebufferAttachmentSwitch)
10607*8975f5c5SAndroid Build Coastguard Worker {
10608*8975f5c5SAndroid Build Coastguard Worker // Keep this state unchanged during the test
10609*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SAMPLE_COVERAGE);
10610*8975f5c5SAndroid Build Coastguard Worker glSampleCoverage(0.0f, false);
10611*8975f5c5SAndroid Build Coastguard Worker
10612*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
10613*8975f5c5SAndroid Build Coastguard Worker
10614*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
10615*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
10616*8975f5c5SAndroid Build Coastguard Worker
10617*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo;
10618*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
10619*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 0, GL_RGBA8, 1, 1);
10620*8975f5c5SAndroid Build Coastguard Worker
10621*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
10622*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10623*8975f5c5SAndroid Build Coastguard Worker
10624*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
10625*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10626*8975f5c5SAndroid Build Coastguard Worker
10627*8975f5c5SAndroid Build Coastguard Worker // Sample coverage must have no effect
10628*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
10629*8975f5c5SAndroid Build Coastguard Worker
10630*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rboMS;
10631*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rboMS);
10632*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 1, 1);
10633*8975f5c5SAndroid Build Coastguard Worker
10634*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rboMS);
10635*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10636*8975f5c5SAndroid Build Coastguard Worker
10637*8975f5c5SAndroid Build Coastguard Worker glClearColor(1, 0, 0, 1);
10638*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
10639*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
10640*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10641*8975f5c5SAndroid Build Coastguard Worker
10642*8975f5c5SAndroid Build Coastguard Worker // Use a temporary FBO to resolve
10643*8975f5c5SAndroid Build Coastguard Worker {
10644*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboResolve;
10645*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboResolve);
10646*8975f5c5SAndroid Build Coastguard Worker
10647*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rboResolve;
10648*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rboResolve);
10649*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
10650*8975f5c5SAndroid Build Coastguard Worker
10651*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
10652*8975f5c5SAndroid Build Coastguard Worker rboResolve);
10653*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10654*8975f5c5SAndroid Build Coastguard Worker
10655*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
10656*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboResolve);
10657*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
10658*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10659*8975f5c5SAndroid Build Coastguard Worker
10660*8975f5c5SAndroid Build Coastguard Worker // Nothing was drawn because of zero coverage
10661*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fboResolve);
10662*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
10663*8975f5c5SAndroid Build Coastguard Worker }
10664*8975f5c5SAndroid Build Coastguard Worker
10665*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
10666*8975f5c5SAndroid Build Coastguard Worker
10667*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
10668*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10669*8975f5c5SAndroid Build Coastguard Worker
10670*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 1, 1);
10671*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
10672*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
10673*8975f5c5SAndroid Build Coastguard Worker
10674*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
10675*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10676*8975f5c5SAndroid Build Coastguard Worker
10677*8975f5c5SAndroid Build Coastguard Worker // Sample coverage must have no effect
10678*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
10679*8975f5c5SAndroid Build Coastguard Worker }
10680*8975f5c5SAndroid Build Coastguard Worker
10681*8975f5c5SAndroid Build Coastguard Worker // Test that switching FBO attachments affects alpha-to-coverage
TEST_P(StateChangeTestES3,AlphaToCoverageFramebufferAttachmentSwitch)10682*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, AlphaToCoverageFramebufferAttachmentSwitch)
10683*8975f5c5SAndroid Build Coastguard Worker {
10684*8975f5c5SAndroid Build Coastguard Worker // Keep this state unchanged during the test
10685*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
10686*8975f5c5SAndroid Build Coastguard Worker
10687*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
10688*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
10689*8975f5c5SAndroid Build Coastguard Worker glUniform4f(glGetUniformLocation(program, essl1_shaders::ColorUniform()), 0, 1, 0, 0);
10690*8975f5c5SAndroid Build Coastguard Worker
10691*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
10692*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
10693*8975f5c5SAndroid Build Coastguard Worker
10694*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo;
10695*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
10696*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 0, GL_RGBA8, 1, 1);
10697*8975f5c5SAndroid Build Coastguard Worker
10698*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
10699*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10700*8975f5c5SAndroid Build Coastguard Worker
10701*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
10702*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10703*8975f5c5SAndroid Build Coastguard Worker
10704*8975f5c5SAndroid Build Coastguard Worker // A2C must have no effect
10705*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(0, 255, 0, 0));
10706*8975f5c5SAndroid Build Coastguard Worker
10707*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rboMS;
10708*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rboMS);
10709*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 1, 1);
10710*8975f5c5SAndroid Build Coastguard Worker
10711*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rboMS);
10712*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10713*8975f5c5SAndroid Build Coastguard Worker
10714*8975f5c5SAndroid Build Coastguard Worker glClearColor(1, 0, 0, 1);
10715*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
10716*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
10717*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10718*8975f5c5SAndroid Build Coastguard Worker
10719*8975f5c5SAndroid Build Coastguard Worker // Use a temporary FBO to resolve
10720*8975f5c5SAndroid Build Coastguard Worker {
10721*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fboResolve;
10722*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fboResolve);
10723*8975f5c5SAndroid Build Coastguard Worker
10724*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rboResolve;
10725*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rboResolve);
10726*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
10727*8975f5c5SAndroid Build Coastguard Worker
10728*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
10729*8975f5c5SAndroid Build Coastguard Worker rboResolve);
10730*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10731*8975f5c5SAndroid Build Coastguard Worker
10732*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
10733*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboResolve);
10734*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
10735*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10736*8975f5c5SAndroid Build Coastguard Worker
10737*8975f5c5SAndroid Build Coastguard Worker // Nothing was drawn because of zero alpha
10738*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fboResolve);
10739*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
10740*8975f5c5SAndroid Build Coastguard Worker }
10741*8975f5c5SAndroid Build Coastguard Worker
10742*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
10743*8975f5c5SAndroid Build Coastguard Worker
10744*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
10745*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10746*8975f5c5SAndroid Build Coastguard Worker
10747*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 1, 1);
10748*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
10749*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
10750*8975f5c5SAndroid Build Coastguard Worker
10751*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
10752*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10753*8975f5c5SAndroid Build Coastguard Worker
10754*8975f5c5SAndroid Build Coastguard Worker // A2C must have no effect
10755*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(0, 255, 0, 0));
10756*8975f5c5SAndroid Build Coastguard Worker }
10757*8975f5c5SAndroid Build Coastguard Worker
10758*8975f5c5SAndroid Build Coastguard Worker // Test that switching FBO attachments affects depth test
TEST_P(StateChangeTestES3,DepthTestFramebufferAttachmentSwitch)10759*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, DepthTestFramebufferAttachmentSwitch)
10760*8975f5c5SAndroid Build Coastguard Worker {
10761*8975f5c5SAndroid Build Coastguard Worker // Keep this state unchanged during the test
10762*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
10763*8975f5c5SAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
10764*8975f5c5SAndroid Build Coastguard Worker glDepthFunc(GL_GREATER);
10765*8975f5c5SAndroid Build Coastguard Worker
10766*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
10767*8975f5c5SAndroid Build Coastguard Worker precision highp float;
10768*8975f5c5SAndroid Build Coastguard Worker uniform float u_depth;
10769*8975f5c5SAndroid Build Coastguard Worker void main()
10770*8975f5c5SAndroid Build Coastguard Worker {
10771*8975f5c5SAndroid Build Coastguard Worker // gl_VertexID x y
10772*8975f5c5SAndroid Build Coastguard Worker // 0 -1 -1
10773*8975f5c5SAndroid Build Coastguard Worker // 1 1 -1
10774*8975f5c5SAndroid Build Coastguard Worker // 2 -1 1
10775*8975f5c5SAndroid Build Coastguard Worker // 3 1 1
10776*8975f5c5SAndroid Build Coastguard Worker int bit0 = gl_VertexID & 1;
10777*8975f5c5SAndroid Build Coastguard Worker int bit1 = gl_VertexID >> 1;
10778*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, u_depth * 2. - 1., 1);
10779*8975f5c5SAndroid Build Coastguard Worker })";
10780*8975f5c5SAndroid Build Coastguard Worker
10781*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
10782*8975f5c5SAndroid Build Coastguard Worker uniform mediump vec4 u_color;
10783*8975f5c5SAndroid Build Coastguard Worker out mediump vec4 color;
10784*8975f5c5SAndroid Build Coastguard Worker void main(void)
10785*8975f5c5SAndroid Build Coastguard Worker {
10786*8975f5c5SAndroid Build Coastguard Worker color = u_color;
10787*8975f5c5SAndroid Build Coastguard Worker })";
10788*8975f5c5SAndroid Build Coastguard Worker
10789*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
10790*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
10791*8975f5c5SAndroid Build Coastguard Worker GLint depthUni = glGetUniformLocation(program, "u_depth");
10792*8975f5c5SAndroid Build Coastguard Worker GLint colorUni = glGetUniformLocation(program, "u_color");
10793*8975f5c5SAndroid Build Coastguard Worker
10794*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kWidth = 17;
10795*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kHeight = 23;
10796*8975f5c5SAndroid Build Coastguard Worker
10797*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo;
10798*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
10799*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kWidth, kHeight);
10800*8975f5c5SAndroid Build Coastguard Worker
10801*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer depthStencil;
10802*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, depthStencil);
10803*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, kWidth, kHeight);
10804*8975f5c5SAndroid Build Coastguard Worker
10805*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
10806*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
10807*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
10808*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
10809*8975f5c5SAndroid Build Coastguard Worker depthStencil);
10810*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10811*8975f5c5SAndroid Build Coastguard Worker
10812*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
10813*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
10814*8975f5c5SAndroid Build Coastguard Worker
10815*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 0);
10816*8975f5c5SAndroid Build Coastguard Worker glClearDepthf(0);
10817*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
10818*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10819*8975f5c5SAndroid Build Coastguard Worker
10820*8975f5c5SAndroid Build Coastguard Worker // Draw with the depth buffer attached, set depth to 0.5. Should succeed and the color buffer
10821*8975f5c5SAndroid Build Coastguard Worker // becomes red.
10822*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUni, 1, 0, 0, 0);
10823*8975f5c5SAndroid Build Coastguard Worker glUniform1f(depthUni, 0.5);
10824*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
10825*8975f5c5SAndroid Build Coastguard Worker
10826*8975f5c5SAndroid Build Coastguard Worker // Detach the depth buffer and draw with a smaller depth. Should still succeed because there is
10827*8975f5c5SAndroid Build Coastguard Worker // no depth buffer test against. Green should be added.
10828*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
10829*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUni, 0, 0.2, 0, 0.6);
10830*8975f5c5SAndroid Build Coastguard Worker glUniform1f(depthUni, 0.3);
10831*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
10832*8975f5c5SAndroid Build Coastguard Worker // Higher depth should also pass
10833*8975f5c5SAndroid Build Coastguard Worker glUniform1f(depthUni, 0.9);
10834*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
10835*8975f5c5SAndroid Build Coastguard Worker
10836*8975f5c5SAndroid Build Coastguard Worker // Reattach the depth buffer and draw with a depth in between. Should fail the depth. Blue
10837*8975f5c5SAndroid Build Coastguard Worker // should not be added.
10838*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
10839*8975f5c5SAndroid Build Coastguard Worker depthStencil);
10840*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUni, 0, 0, 1, 1);
10841*8975f5c5SAndroid Build Coastguard Worker glUniform1f(depthUni, 0.4);
10842*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
10843*8975f5c5SAndroid Build Coastguard Worker
10844*8975f5c5SAndroid Build Coastguard Worker // Reattach the depth buffer and draw with a depth larger than 0.5. Should pass the depth test.
10845*8975f5c5SAndroid Build Coastguard Worker // Blue should be added.
10846*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUni, 0, 0.8, 0, 0);
10847*8975f5c5SAndroid Build Coastguard Worker glUniform1f(depthUni, 0.6);
10848*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
10849*8975f5c5SAndroid Build Coastguard Worker
10850*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::yellow);
10851*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10852*8975f5c5SAndroid Build Coastguard Worker }
10853*8975f5c5SAndroid Build Coastguard Worker
10854*8975f5c5SAndroid Build Coastguard Worker // Test that switching FBO attachments affects blend state
TEST_P(StateChangeTestES3,BlendFramebufferAttachmentSwitch)10855*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, BlendFramebufferAttachmentSwitch)
10856*8975f5c5SAndroid Build Coastguard Worker {
10857*8975f5c5SAndroid Build Coastguard Worker // Keep this state unchanged during the test
10858*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
10859*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
10860*8975f5c5SAndroid Build Coastguard Worker
10861*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
10862*8975f5c5SAndroid Build Coastguard Worker precision highp float;
10863*8975f5c5SAndroid Build Coastguard Worker void main()
10864*8975f5c5SAndroid Build Coastguard Worker {
10865*8975f5c5SAndroid Build Coastguard Worker // gl_VertexID x y
10866*8975f5c5SAndroid Build Coastguard Worker // 0 -1 -1
10867*8975f5c5SAndroid Build Coastguard Worker // 1 1 -1
10868*8975f5c5SAndroid Build Coastguard Worker // 2 -1 1
10869*8975f5c5SAndroid Build Coastguard Worker // 3 1 1
10870*8975f5c5SAndroid Build Coastguard Worker int bit0 = gl_VertexID & 1;
10871*8975f5c5SAndroid Build Coastguard Worker int bit1 = gl_VertexID >> 1;
10872*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(bit0 * 2 - 1, bit1 * 2 - 1, 0, 1);
10873*8975f5c5SAndroid Build Coastguard Worker })";
10874*8975f5c5SAndroid Build Coastguard Worker
10875*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
10876*8975f5c5SAndroid Build Coastguard Worker uniform mediump vec4 u_color;
10877*8975f5c5SAndroid Build Coastguard Worker layout(location=0) out mediump vec4 color0;
10878*8975f5c5SAndroid Build Coastguard Worker layout(location=1) out mediump vec4 color1;
10879*8975f5c5SAndroid Build Coastguard Worker void main(void)
10880*8975f5c5SAndroid Build Coastguard Worker {
10881*8975f5c5SAndroid Build Coastguard Worker color0 = u_color;
10882*8975f5c5SAndroid Build Coastguard Worker color1 = u_color;
10883*8975f5c5SAndroid Build Coastguard Worker })";
10884*8975f5c5SAndroid Build Coastguard Worker
10885*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
10886*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
10887*8975f5c5SAndroid Build Coastguard Worker GLint colorUni = glGetUniformLocation(program, "u_color");
10888*8975f5c5SAndroid Build Coastguard Worker
10889*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kWidth = 17;
10890*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kHeight = 23;
10891*8975f5c5SAndroid Build Coastguard Worker
10892*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer color0;
10893*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, color0);
10894*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kWidth, kHeight);
10895*8975f5c5SAndroid Build Coastguard Worker
10896*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer color1;
10897*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, color1);
10898*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kWidth, kHeight);
10899*8975f5c5SAndroid Build Coastguard Worker
10900*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
10901*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
10902*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color0);
10903*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10904*8975f5c5SAndroid Build Coastguard Worker
10905*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kDrawBuffers[2] = {
10906*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_ATTACHMENT0,
10907*8975f5c5SAndroid Build Coastguard Worker GL_COLOR_ATTACHMENT1,
10908*8975f5c5SAndroid Build Coastguard Worker };
10909*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(2, kDrawBuffers);
10910*8975f5c5SAndroid Build Coastguard Worker
10911*8975f5c5SAndroid Build Coastguard Worker // Clear the first attachment to transparent green
10912*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 1, 0, 0);
10913*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
10914*8975f5c5SAndroid Build Coastguard Worker
10915*8975f5c5SAndroid Build Coastguard Worker // Clear the second attachment to transparent blue
10916*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color1);
10917*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 1, 0);
10918*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
10919*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10920*8975f5c5SAndroid Build Coastguard Worker
10921*8975f5c5SAndroid Build Coastguard Worker // Draw with only one attachment. Attachment 0 is now transparent yellow-ish.
10922*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color0);
10923*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUni, 0.6, 0, 0, 0);
10924*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
10925*8975f5c5SAndroid Build Coastguard Worker
10926*8975f5c5SAndroid Build Coastguard Worker // Attach the second renderbuffer and draw to both. Attachment 0 is now yellow-ish, while
10927*8975f5c5SAndroid Build Coastguard Worker // attachment 1 is blue.
10928*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, color1);
10929*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUni, 0, 0, 0, 1);
10930*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
10931*8975f5c5SAndroid Build Coastguard Worker
10932*8975f5c5SAndroid Build Coastguard Worker // Detach the second renderbuffer again and draw. Attachment 0 is now yellow.
10933*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, 0);
10934*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorUni, 0.6, 0, 0, 0);
10935*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
10936*8975f5c5SAndroid Build Coastguard Worker
10937*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::yellow);
10938*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color1);
10939*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::blue);
10940*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10941*8975f5c5SAndroid Build Coastguard Worker }
10942*8975f5c5SAndroid Build Coastguard Worker
10943*8975f5c5SAndroid Build Coastguard Worker // Tests state change for sample shading.
TEST_P(StateChangeTestES31,SampleShading)10944*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES31, SampleShading)
10945*8975f5c5SAndroid Build Coastguard Worker {
10946*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_sample_shading"));
10947*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_sample_variables"));
10948*8975f5c5SAndroid Build Coastguard Worker
10949*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 1;
10950*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSampleCount = 4;
10951*8975f5c5SAndroid Build Coastguard Worker
10952*8975f5c5SAndroid Build Coastguard Worker // Create a single sampled texture and framebuffer for verifying results
10953*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
10954*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
10955*8975f5c5SAndroid Build Coastguard Worker
10956*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
10957*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
10958*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
10959*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
10960*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10961*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10962*8975f5c5SAndroid Build Coastguard Worker
10963*8975f5c5SAndroid Build Coastguard Worker // Create a multisampled texture and framebuffer.
10964*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer msaaFBO;
10965*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
10966*8975f5c5SAndroid Build Coastguard Worker
10967*8975f5c5SAndroid Build Coastguard Worker GLTexture msaaTexture;
10968*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaTexture);
10969*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, kSampleCount, GL_RGBA8, kSize, kSize,
10970*8975f5c5SAndroid Build Coastguard Worker false);
10971*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
10972*8975f5c5SAndroid Build Coastguard Worker msaaTexture, 0);
10973*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
10974*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
10975*8975f5c5SAndroid Build Coastguard Worker
10976*8975f5c5SAndroid Build Coastguard Worker // Create a fragment shader whose _resolved_ output is different based on whether sample shading
10977*8975f5c5SAndroid Build Coastguard Worker // is enabled or not, but which doesn't use gl_SampleID (which implicitly enables sample
10978*8975f5c5SAndroid Build Coastguard Worker // shading).
10979*8975f5c5SAndroid Build Coastguard Worker //
10980*8975f5c5SAndroid Build Coastguard Worker // This is done by non-linearly transforming a varying, resulting in a different color average
10981*8975f5c5SAndroid Build Coastguard Worker // based on the location in which the varying is sampled. The framebuffer is 1x1 and the vertex
10982*8975f5c5SAndroid Build Coastguard Worker // shader outputs the following triangle:
10983*8975f5c5SAndroid Build Coastguard Worker //
10984*8975f5c5SAndroid Build Coastguard Worker // (-3, 3)
10985*8975f5c5SAndroid Build Coastguard Worker // |\
10986*8975f5c5SAndroid Build Coastguard Worker // | \
10987*8975f5c5SAndroid Build Coastguard Worker // | \
10988*8975f5c5SAndroid Build Coastguard Worker // | \
10989*8975f5c5SAndroid Build Coastguard Worker // | \
10990*8975f5c5SAndroid Build Coastguard Worker // | \
10991*8975f5c5SAndroid Build Coastguard Worker // +-----------+ <----- position evaluates as (1, 1)
10992*8975f5c5SAndroid Build Coastguard Worker // | X | \
10993*8975f5c5SAndroid Build Coastguard Worker // | W | \
10994*8975f5c5SAndroid Build Coastguard Worker // | C | \
10995*8975f5c5SAndroid Build Coastguard Worker // | Z | \
10996*8975f5c5SAndroid Build Coastguard Worker // | Y | \
10997*8975f5c5SAndroid Build Coastguard Worker // +-----------+-----------\
10998*8975f5c5SAndroid Build Coastguard Worker // (-1, -1) (3, -1)
10999*8975f5c5SAndroid Build Coastguard Worker //
11000*8975f5c5SAndroid Build Coastguard Worker // The varying |gradient| is output as position. This means that:
11001*8975f5c5SAndroid Build Coastguard Worker //
11002*8975f5c5SAndroid Build Coastguard Worker // - At the center of the pixel (C), the |gradient| value is (0,0)
11003*8975f5c5SAndroid Build Coastguard Worker // - At sample positions W, X, Y and Z, the |gradient| has 0.75 and 0.25 (positive or negative)
11004*8975f5c5SAndroid Build Coastguard Worker // in its components. Most importantly, its length^2 (i.e. gradient.gradient) is:
11005*8975f5c5SAndroid Build Coastguard Worker //
11006*8975f5c5SAndroid Build Coastguard Worker // 0.25^2 + 0.75^2 = 0.625
11007*8975f5c5SAndroid Build Coastguard Worker //
11008*8975f5c5SAndroid Build Coastguard Worker // The fragment shader outputs gradient.gradient + (0.1, 0) as color. Without sample shading,
11009*8975f5c5SAndroid Build Coastguard Worker // this outputs (0.1, 0, 0, 1) in the color. With sample shading, it outputs
11010*8975f5c5SAndroid Build Coastguard Worker // (0.725, 0.625, 0, 1) (for all samples). By using additive blending, we can verify that when
11011*8975f5c5SAndroid Build Coastguard Worker // only sample shading state is modified, that sample shading is indeed toggled.
11012*8975f5c5SAndroid Build Coastguard Worker //
11013*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
11014*8975f5c5SAndroid Build Coastguard Worker
11015*8975f5c5SAndroid Build Coastguard Worker out mediump vec2 gradient;
11016*8975f5c5SAndroid Build Coastguard Worker
11017*8975f5c5SAndroid Build Coastguard Worker void main()
11018*8975f5c5SAndroid Build Coastguard Worker {
11019*8975f5c5SAndroid Build Coastguard Worker vec2 position = vec2(-1, -1);
11020*8975f5c5SAndroid Build Coastguard Worker if (gl_VertexID == 1)
11021*8975f5c5SAndroid Build Coastguard Worker position = vec2(3, -1);
11022*8975f5c5SAndroid Build Coastguard Worker else if (gl_VertexID == 2)
11023*8975f5c5SAndroid Build Coastguard Worker position = vec2(-1, 3);
11024*8975f5c5SAndroid Build Coastguard Worker
11025*8975f5c5SAndroid Build Coastguard Worker gradient = position;
11026*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(position, 0, 1);
11027*8975f5c5SAndroid Build Coastguard Worker })";
11028*8975f5c5SAndroid Build Coastguard Worker
11029*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
11030*8975f5c5SAndroid Build Coastguard Worker
11031*8975f5c5SAndroid Build Coastguard Worker in mediump vec2 gradient;
11032*8975f5c5SAndroid Build Coastguard Worker out mediump vec4 color;
11033*8975f5c5SAndroid Build Coastguard Worker
11034*8975f5c5SAndroid Build Coastguard Worker uniform mediump vec2 offset;
11035*8975f5c5SAndroid Build Coastguard Worker
11036*8975f5c5SAndroid Build Coastguard Worker void main()
11037*8975f5c5SAndroid Build Coastguard Worker {
11038*8975f5c5SAndroid Build Coastguard Worker mediump float len = dot(gradient, gradient);
11039*8975f5c5SAndroid Build Coastguard Worker color = vec4(vec2(len, len) + offset, 0, 1);
11040*8975f5c5SAndroid Build Coastguard Worker })";
11041*8975f5c5SAndroid Build Coastguard Worker
11042*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
11043*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
11044*8975f5c5SAndroid Build Coastguard Worker GLint offsetLoc = glGetUniformLocation(program, "offset");
11045*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(offsetLoc, -1);
11046*8975f5c5SAndroid Build Coastguard Worker
11047*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 0);
11048*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
11049*8975f5c5SAndroid Build Coastguard Worker
11050*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
11051*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
11052*8975f5c5SAndroid Build Coastguard Worker
11053*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
11054*8975f5c5SAndroid Build Coastguard Worker
11055*8975f5c5SAndroid Build Coastguard Worker // Issue 2 draw calls, with sample shading enabled then disabled.
11056*8975f5c5SAndroid Build Coastguard Worker glUniform2f(offsetLoc, 0.1f, 0);
11057*8975f5c5SAndroid Build Coastguard Worker
11058*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SAMPLE_SHADING_OES);
11059*8975f5c5SAndroid Build Coastguard Worker glMinSampleShadingOES(1.0f);
11060*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
11061*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SAMPLE_SHADING_OES);
11062*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
11063*8975f5c5SAndroid Build Coastguard Worker
11064*8975f5c5SAndroid Build Coastguard Worker // Verify results
11065*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
11066*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_LINEAR);
11067*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
11068*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(210, 159, 0, 255), 1);
11069*8975f5c5SAndroid Build Coastguard Worker
11070*8975f5c5SAndroid Build Coastguard Worker // Do the same test in opposite order (sample shading disabled first, then enabled).
11071*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
11072*8975f5c5SAndroid Build Coastguard Worker
11073*8975f5c5SAndroid Build Coastguard Worker glUniform2f(offsetLoc, 0, 0.1f);
11074*8975f5c5SAndroid Build Coastguard Worker
11075*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
11076*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
11077*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SAMPLE_SHADING_OES);
11078*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
11079*8975f5c5SAndroid Build Coastguard Worker
11080*8975f5c5SAndroid Build Coastguard Worker // Verify results
11081*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
11082*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_LINEAR);
11083*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
11084*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(159, 210, 0, 255), 1);
11085*8975f5c5SAndroid Build Coastguard Worker
11086*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
11087*8975f5c5SAndroid Build Coastguard Worker }
11088*8975f5c5SAndroid Build Coastguard Worker
11089*8975f5c5SAndroid Build Coastguard Worker // Tests value change for MinSampleShadingOES.
TEST_P(StateChangeTestES31,MinSampleShadingOES)11090*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES31, MinSampleShadingOES)
11091*8975f5c5SAndroid Build Coastguard Worker {
11092*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_sample_shading"));
11093*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled("GL_OES_sample_variables"));
11094*8975f5c5SAndroid Build Coastguard Worker
11095*8975f5c5SAndroid Build Coastguard Worker GLfloat value = 0.0f;
11096*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SAMPLE_SHADING_OES);
11097*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_TRUE(glIsEnabled(GL_SAMPLE_SHADING_OES));
11098*8975f5c5SAndroid Build Coastguard Worker glGetFloatv(GL_MIN_SAMPLE_SHADING_VALUE_OES, &value);
11099*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(value, 0); // initial value should be 0.
11100*8975f5c5SAndroid Build Coastguard Worker
11101*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SAMPLE_SHADING_OES);
11102*8975f5c5SAndroid Build Coastguard Worker glGetFloatv(GL_MIN_SAMPLE_SHADING_VALUE_OES, &value);
11103*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(value, 0);
11104*8975f5c5SAndroid Build Coastguard Worker
11105*8975f5c5SAndroid Build Coastguard Worker glMinSampleShadingOES(0.5);
11106*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FALSE(glIsEnabled(GL_SAMPLE_SHADING_OES));
11107*8975f5c5SAndroid Build Coastguard Worker glGetFloatv(GL_MIN_SAMPLE_SHADING_VALUE_OES, &value);
11108*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(value, 0.5);
11109*8975f5c5SAndroid Build Coastguard Worker
11110*8975f5c5SAndroid Build Coastguard Worker glMinSampleShadingOES(1.5);
11111*8975f5c5SAndroid Build Coastguard Worker glGetFloatv(GL_MIN_SAMPLE_SHADING_VALUE_OES, &value);
11112*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(value, 1); // clamped to 1.
11113*8975f5c5SAndroid Build Coastguard Worker
11114*8975f5c5SAndroid Build Coastguard Worker glMinSampleShadingOES(-0.5);
11115*8975f5c5SAndroid Build Coastguard Worker glGetFloatv(GL_MIN_SAMPLE_SHADING_VALUE_OES, &value);
11116*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(value, 0); // clamped to 0.
11117*8975f5c5SAndroid Build Coastguard Worker }
11118*8975f5c5SAndroid Build Coastguard Worker
11119*8975f5c5SAndroid Build Coastguard Worker // Tests state changes with uniform block binding.
TEST_P(StateChangeTestES3,UniformBlockBinding)11120*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTestES3, UniformBlockBinding)
11121*8975f5c5SAndroid Build Coastguard Worker {
11122*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(#version 300 es
11123*8975f5c5SAndroid Build Coastguard Worker void main()
11124*8975f5c5SAndroid Build Coastguard Worker {
11125*8975f5c5SAndroid Build Coastguard Worker vec2 pos = vec2(0.0);
11126*8975f5c5SAndroid Build Coastguard Worker switch (gl_VertexID) {
11127*8975f5c5SAndroid Build Coastguard Worker case 0: pos = vec2(-1.0, -1.0); break;
11128*8975f5c5SAndroid Build Coastguard Worker case 1: pos = vec2(3.0, -1.0); break;
11129*8975f5c5SAndroid Build Coastguard Worker case 2: pos = vec2(-1.0, 3.0); break;
11130*8975f5c5SAndroid Build Coastguard Worker };
11131*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(pos, 0.0, 1.0);
11132*8975f5c5SAndroid Build Coastguard Worker })";
11133*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(#version 300 es
11134*8975f5c5SAndroid Build Coastguard Worker out mediump vec4 colorOut;
11135*8975f5c5SAndroid Build Coastguard Worker
11136*8975f5c5SAndroid Build Coastguard Worker layout(std140) uniform buffer { mediump vec4 color; };
11137*8975f5c5SAndroid Build Coastguard Worker
11138*8975f5c5SAndroid Build Coastguard Worker void main()
11139*8975f5c5SAndroid Build Coastguard Worker {
11140*8975f5c5SAndroid Build Coastguard Worker colorOut = color;
11141*8975f5c5SAndroid Build Coastguard Worker })";
11142*8975f5c5SAndroid Build Coastguard Worker
11143*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
11144*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
11145*8975f5c5SAndroid Build Coastguard Worker const GLint uniformBufferIndex = glGetUniformBlockIndex(program, "buffer");
11146*8975f5c5SAndroid Build Coastguard Worker
11147*8975f5c5SAndroid Build Coastguard Worker // Create buffers bound to bindings 1 and 2
11148*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<float, 4> kRed = {1, 0, 0, 1};
11149*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<float, 4> kTransparentGreen = {0, 1, 0, 0};
11150*8975f5c5SAndroid Build Coastguard Worker GLBuffer red, transparentGreen;
11151*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_UNIFORM_BUFFER, red);
11152*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_UNIFORM_BUFFER, sizeof(kRed), kRed.data(), GL_STATIC_DRAW);
11153*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_UNIFORM_BUFFER, transparentGreen);
11154*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_UNIFORM_BUFFER, sizeof(kTransparentGreen), kTransparentGreen.data(),
11155*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
11156*8975f5c5SAndroid Build Coastguard Worker
11157*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_UNIFORM_BUFFER, 1, transparentGreen);
11158*8975f5c5SAndroid Build Coastguard Worker glBindBufferBase(GL_UNIFORM_BUFFER, 2, red);
11159*8975f5c5SAndroid Build Coastguard Worker glUniformBlockBinding(program, uniformBufferIndex, 2);
11160*8975f5c5SAndroid Build Coastguard Worker
11161*8975f5c5SAndroid Build Coastguard Worker // Issue a draw call. The buffer should be transparent green now
11162*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 0);
11163*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
11164*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
11165*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
11166*8975f5c5SAndroid Build Coastguard Worker
11167*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
11168*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
11169*8975f5c5SAndroid Build Coastguard Worker
11170*8975f5c5SAndroid Build Coastguard Worker // Change the binding
11171*8975f5c5SAndroid Build Coastguard Worker glUniformBlockBinding(program, uniformBufferIndex, 1);
11172*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
11173*8975f5c5SAndroid Build Coastguard Worker
11174*8975f5c5SAndroid Build Coastguard Worker // Draw again, it should accumulate blue and the buffer should become magenta.
11175*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3);
11176*8975f5c5SAndroid Build Coastguard Worker
11177*8975f5c5SAndroid Build Coastguard Worker // Verify results
11178*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
11179*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
11180*8975f5c5SAndroid Build Coastguard Worker }
11181*8975f5c5SAndroid Build Coastguard Worker
11182*8975f5c5SAndroid Build Coastguard Worker // Tests that viewport changes within a render pass are correct. WebGPU sets a default viewport,
11183*8975f5c5SAndroid Build Coastguard Worker // cover the omission of setViewport in the backend.
TEST_P(StateChangeTest,ViewportChangeWithinRenderPass)11184*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, ViewportChangeWithinRenderPass)
11185*8975f5c5SAndroid Build Coastguard Worker {
11186*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 0);
11187*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
11188*8975f5c5SAndroid Build Coastguard Worker
11189*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
11190*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
11191*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, essl1_shaders::ColorUniform());
11192*8975f5c5SAndroid Build Coastguard Worker
11193*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, 10, 10);
11194*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1.0f, 0.0f, 0.0f, 1.0f);
11195*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
11196*8975f5c5SAndroid Build Coastguard Worker
11197*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, getWindowWidth(), getWindowHeight()); // "default" size
11198*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0.0f, 1.0f, 0.0f, 1.0f);
11199*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
11200*8975f5c5SAndroid Build Coastguard Worker
11201*8975f5c5SAndroid Build Coastguard Worker // Verify that the first draw is covered by the second "full" draw
11202*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5, 5, GLColor::green);
11203*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(12, 12, GLColor::green);
11204*8975f5c5SAndroid Build Coastguard Worker
11205*8975f5c5SAndroid Build Coastguard Worker // Go the other way, start with a full size viewport and change it to 10x10 for the second draw
11206*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, getWindowWidth(), getWindowHeight()); // "default" size
11207*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0.0f, 0.0f, 1.0f, 1.0f);
11208*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
11209*8975f5c5SAndroid Build Coastguard Worker
11210*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, 10, 10);
11211*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1.0f, 0.0f, 0.0f, 1.0f);
11212*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
11213*8975f5c5SAndroid Build Coastguard Worker
11214*8975f5c5SAndroid Build Coastguard Worker // Verify that the first draw is covered by the second "full" draw
11215*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5, 5, GLColor::red);
11216*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(12, 12, GLColor::blue);
11217*8975f5c5SAndroid Build Coastguard Worker }
11218*8975f5c5SAndroid Build Coastguard Worker
11219*8975f5c5SAndroid Build Coastguard Worker // Tests that scissor changes within a render pass are correct. WebGPU sets a default scissor, cover
11220*8975f5c5SAndroid Build Coastguard Worker // the omission of setScissorRect in the backend.
TEST_P(StateChangeTest,ScissortChangeWithinRenderPass)11221*8975f5c5SAndroid Build Coastguard Worker TEST_P(StateChangeTest, ScissortChangeWithinRenderPass)
11222*8975f5c5SAndroid Build Coastguard Worker {
11223*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 0);
11224*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
11225*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
11226*8975f5c5SAndroid Build Coastguard Worker
11227*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
11228*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
11229*8975f5c5SAndroid Build Coastguard Worker GLint colorLoc = glGetUniformLocation(program, essl1_shaders::ColorUniform());
11230*8975f5c5SAndroid Build Coastguard Worker
11231*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, 10, 10);
11232*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1.0f, 0.0f, 0.0f, 1.0f);
11233*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
11234*8975f5c5SAndroid Build Coastguard Worker
11235*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, getWindowWidth(), getWindowHeight()); // "default" size
11236*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0.0f, 1.0f, 0.0f, 1.0f);
11237*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
11238*8975f5c5SAndroid Build Coastguard Worker
11239*8975f5c5SAndroid Build Coastguard Worker // Verify that the first draw is covered by the second "full" draw
11240*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5, 5, GLColor::green);
11241*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(12, 12, GLColor::green);
11242*8975f5c5SAndroid Build Coastguard Worker
11243*8975f5c5SAndroid Build Coastguard Worker // Go the other way, start with a full size scissor and change it to 10x10 for the second draw
11244*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, getWindowWidth(), getWindowHeight()); // "default" size
11245*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 0.0f, 0.0f, 1.0f, 1.0f);
11246*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
11247*8975f5c5SAndroid Build Coastguard Worker
11248*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, 10, 10);
11249*8975f5c5SAndroid Build Coastguard Worker glUniform4f(colorLoc, 1.0f, 0.0f, 0.0f, 1.0f);
11250*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
11251*8975f5c5SAndroid Build Coastguard Worker
11252*8975f5c5SAndroid Build Coastguard Worker // Verify that the first draw is covered by the second "full" draw
11253*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(5, 5, GLColor::red);
11254*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(12, 12, GLColor::blue);
11255*8975f5c5SAndroid Build Coastguard Worker }
11256*8975f5c5SAndroid Build Coastguard Worker
11257*8975f5c5SAndroid Build Coastguard Worker } // anonymous namespace
11258*8975f5c5SAndroid Build Coastguard Worker
11259*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(StateChangeTest);
11260*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(LineLoopStateChangeTest);
11261*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(StateChangeRenderTest);
11262*8975f5c5SAndroid Build Coastguard Worker
11263*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(StateChangeTestES3);
11264*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(
11265*8975f5c5SAndroid Build Coastguard Worker StateChangeTestES3,
11266*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::SupportsIndexTypeUint8),
11267*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::UseDepthWriteEnableDynamicState),
11268*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN()
11269*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState)
11270*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState2),
11271*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::SupportsExtendedDynamicState2),
11272*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN()
11273*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState2)
11274*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsGraphicsPipelineLibrary),
11275*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::UseVertexInputBindingStrideDynamicState),
11276*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().disable(Feature::UsePrimitiveRestartEnableDynamicState));
11277*8975f5c5SAndroid Build Coastguard Worker
11278*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(StateChangeTestES31);
11279*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31_AND(
11280*8975f5c5SAndroid Build Coastguard Worker StateChangeTestES31,
11281*8975f5c5SAndroid Build Coastguard Worker ES31_VULKAN().disable(Feature::SupportsIndexTypeUint8),
11282*8975f5c5SAndroid Build Coastguard Worker ES31_VULKAN()
11283*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState)
11284*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState2),
11285*8975f5c5SAndroid Build Coastguard Worker ES31_VULKAN().disable(Feature::SupportsExtendedDynamicState2),
11286*8975f5c5SAndroid Build Coastguard Worker ES31_VULKAN()
11287*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsExtendedDynamicState2)
11288*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsGraphicsPipelineLibrary),
11289*8975f5c5SAndroid Build Coastguard Worker ES31_VULKAN().disable(Feature::UseVertexInputBindingStrideDynamicState),
11290*8975f5c5SAndroid Build Coastguard Worker ES31_VULKAN().disable(Feature::UsePrimitiveRestartEnableDynamicState));
11291*8975f5c5SAndroid Build Coastguard Worker
11292*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(StateChangeTestWebGL2);
11293*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_COMBINE_1(StateChangeTestWebGL2,
11294*8975f5c5SAndroid Build Coastguard Worker StateChangeTestWebGL2Print,
11295*8975f5c5SAndroid Build Coastguard Worker testing::Bool(),
11296*8975f5c5SAndroid Build Coastguard Worker ANGLE_ALL_TEST_PLATFORMS_ES3);
11297*8975f5c5SAndroid Build Coastguard Worker
11298*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(StateChangeRenderTestES3);
11299*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(StateChangeRenderTestES3);
11300*8975f5c5SAndroid Build Coastguard Worker
11301*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(SimpleStateChangeTest);
11302*8975f5c5SAndroid Build Coastguard Worker
11303*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SimpleStateChangeTestES3);
11304*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(SimpleStateChangeTestES3,
11305*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN().enable(Feature::AllocateNonZeroMemory));
11306*8975f5c5SAndroid Build Coastguard Worker
11307*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ImageRespecificationTest);
11308*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ImageRespecificationTest);
11309*8975f5c5SAndroid Build Coastguard Worker
11310*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SimpleStateChangeTestES31);
11311*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(SimpleStateChangeTestES31);
11312*8975f5c5SAndroid Build Coastguard Worker
11313*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SimpleStateChangeTestComputeES31);
11314*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(SimpleStateChangeTestComputeES31);
11315*8975f5c5SAndroid Build Coastguard Worker
11316*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SimpleStateChangeTestComputeES31PPO);
11317*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(SimpleStateChangeTestComputeES31PPO);
11318*8975f5c5SAndroid Build Coastguard Worker
11319*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ValidationStateChangeTest);
11320*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ValidationStateChangeTest);
11321*8975f5c5SAndroid Build Coastguard Worker
11322*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WebGL2ValidationStateChangeTest);
11323*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(WebGL2ValidationStateChangeTest);
11324*8975f5c5SAndroid Build Coastguard Worker
11325*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(RobustBufferAccessWebGL2ValidationStateChangeTest);
11326*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(RobustBufferAccessWebGL2ValidationStateChangeTest);
11327*8975f5c5SAndroid Build Coastguard Worker
11328*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ValidationStateChangeTestES31);
11329*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(ValidationStateChangeTestES31);
11330*8975f5c5SAndroid Build Coastguard Worker
11331*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WebGLComputeValidationStateChangeTest);
11332*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(WebGLComputeValidationStateChangeTest);
11333*8975f5c5SAndroid Build Coastguard Worker
11334*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VertexAttribArrayStateChangeTest);
11335*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(VertexAttribArrayStateChangeTest);
11336