1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2017 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // Framebuffer multiview tests:
7*8975f5c5SAndroid Build Coastguard Worker // The tests modify and examine the multiview state.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/MultiviewTest.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Worker namespace
16*8975f5c5SAndroid Build Coastguard Worker {
GetDrawBufferRange(size_t numColorAttachments)17*8975f5c5SAndroid Build Coastguard Worker std::vector<GLenum> GetDrawBufferRange(size_t numColorAttachments)
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker std::vector<GLenum> drawBuffers(numColorAttachments);
20*8975f5c5SAndroid Build Coastguard Worker const size_t kBase = static_cast<size_t>(GL_COLOR_ATTACHMENT0);
21*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0u; i < drawBuffers.size(); ++i)
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker drawBuffers[i] = static_cast<GLenum>(kBase + i);
24*8975f5c5SAndroid Build Coastguard Worker }
25*8975f5c5SAndroid Build Coastguard Worker return drawBuffers;
26*8975f5c5SAndroid Build Coastguard Worker }
27*8975f5c5SAndroid Build Coastguard Worker } // namespace
28*8975f5c5SAndroid Build Coastguard Worker
29*8975f5c5SAndroid Build Coastguard Worker // Base class for tests that care mostly about draw call validity and not rendering results.
30*8975f5c5SAndroid Build Coastguard Worker class FramebufferMultiviewTest : public MultiviewTest
31*8975f5c5SAndroid Build Coastguard Worker {
32*8975f5c5SAndroid Build Coastguard Worker protected:
FramebufferMultiviewTest()33*8975f5c5SAndroid Build Coastguard Worker FramebufferMultiviewTest() : MultiviewTest() {}
34*8975f5c5SAndroid Build Coastguard Worker };
35*8975f5c5SAndroid Build Coastguard Worker
36*8975f5c5SAndroid Build Coastguard Worker class FramebufferMultiviewLayeredClearTest : public FramebufferMultiviewTest
37*8975f5c5SAndroid Build Coastguard Worker {
38*8975f5c5SAndroid Build Coastguard Worker protected:
FramebufferMultiviewLayeredClearTest()39*8975f5c5SAndroid Build Coastguard Worker FramebufferMultiviewLayeredClearTest() : mMultiviewFBO(0), mDepthTex(0), mDepthStencilTex(0) {}
40*8975f5c5SAndroid Build Coastguard Worker
testTearDown()41*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker if (mMultiviewFBO != 0)
44*8975f5c5SAndroid Build Coastguard Worker {
45*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mMultiviewFBO);
46*8975f5c5SAndroid Build Coastguard Worker mMultiviewFBO = 0u;
47*8975f5c5SAndroid Build Coastguard Worker }
48*8975f5c5SAndroid Build Coastguard Worker if (!mNonMultiviewFBO.empty())
49*8975f5c5SAndroid Build Coastguard Worker {
50*8975f5c5SAndroid Build Coastguard Worker GLsizei textureCount = static_cast<GLsizei>(mNonMultiviewFBO.size());
51*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(textureCount, mNonMultiviewFBO.data());
52*8975f5c5SAndroid Build Coastguard Worker mNonMultiviewFBO.clear();
53*8975f5c5SAndroid Build Coastguard Worker }
54*8975f5c5SAndroid Build Coastguard Worker if (!mColorTex.empty())
55*8975f5c5SAndroid Build Coastguard Worker {
56*8975f5c5SAndroid Build Coastguard Worker GLsizei textureCount = static_cast<GLsizei>(mColorTex.size());
57*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(textureCount, mColorTex.data());
58*8975f5c5SAndroid Build Coastguard Worker mColorTex.clear();
59*8975f5c5SAndroid Build Coastguard Worker }
60*8975f5c5SAndroid Build Coastguard Worker if (mDepthStencilTex != 0u)
61*8975f5c5SAndroid Build Coastguard Worker {
62*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mDepthStencilTex);
63*8975f5c5SAndroid Build Coastguard Worker mDepthStencilTex = 0u;
64*8975f5c5SAndroid Build Coastguard Worker }
65*8975f5c5SAndroid Build Coastguard Worker if (mDepthTex != 0u)
66*8975f5c5SAndroid Build Coastguard Worker {
67*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mDepthTex);
68*8975f5c5SAndroid Build Coastguard Worker mDepthTex = 0u;
69*8975f5c5SAndroid Build Coastguard Worker }
70*8975f5c5SAndroid Build Coastguard Worker MultiviewTest::testTearDown();
71*8975f5c5SAndroid Build Coastguard Worker }
72*8975f5c5SAndroid Build Coastguard Worker
initializeFBOs(int width,int height,int numLayers,int baseViewIndex,int numViews,int numColorAttachments,bool stencil,bool depth)73*8975f5c5SAndroid Build Coastguard Worker void initializeFBOs(int width,
74*8975f5c5SAndroid Build Coastguard Worker int height,
75*8975f5c5SAndroid Build Coastguard Worker int numLayers,
76*8975f5c5SAndroid Build Coastguard Worker int baseViewIndex,
77*8975f5c5SAndroid Build Coastguard Worker int numViews,
78*8975f5c5SAndroid Build Coastguard Worker int numColorAttachments,
79*8975f5c5SAndroid Build Coastguard Worker bool stencil,
80*8975f5c5SAndroid Build Coastguard Worker bool depth)
81*8975f5c5SAndroid Build Coastguard Worker {
82*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(mColorTex.empty());
83*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0u, mDepthStencilTex);
84*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(0u, mDepthTex);
85*8975f5c5SAndroid Build Coastguard Worker ASSERT_LE(baseViewIndex + numViews, numLayers);
86*8975f5c5SAndroid Build Coastguard Worker
87*8975f5c5SAndroid Build Coastguard Worker // Generate textures.
88*8975f5c5SAndroid Build Coastguard Worker mColorTex.resize(numColorAttachments);
89*8975f5c5SAndroid Build Coastguard Worker GLsizei textureCount = static_cast<GLsizei>(mColorTex.size());
90*8975f5c5SAndroid Build Coastguard Worker glGenTextures(textureCount, mColorTex.data());
91*8975f5c5SAndroid Build Coastguard Worker if (stencil)
92*8975f5c5SAndroid Build Coastguard Worker {
93*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mDepthStencilTex);
94*8975f5c5SAndroid Build Coastguard Worker }
95*8975f5c5SAndroid Build Coastguard Worker else if (depth)
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mDepthTex);
98*8975f5c5SAndroid Build Coastguard Worker }
99*8975f5c5SAndroid Build Coastguard Worker
100*8975f5c5SAndroid Build Coastguard Worker CreateMultiviewBackingTextures(0, width, height, numLayers, mColorTex, mDepthTex,
101*8975f5c5SAndroid Build Coastguard Worker mDepthStencilTex);
102*8975f5c5SAndroid Build Coastguard Worker
103*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mMultiviewFBO);
104*8975f5c5SAndroid Build Coastguard Worker
105*8975f5c5SAndroid Build Coastguard Worker // Generate multiview FBO and attach textures.
106*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
107*8975f5c5SAndroid Build Coastguard Worker AttachMultiviewTextures(GL_FRAMEBUFFER, width, numViews, baseViewIndex, mColorTex,
108*8975f5c5SAndroid Build Coastguard Worker mDepthTex, mDepthStencilTex);
109*8975f5c5SAndroid Build Coastguard Worker
110*8975f5c5SAndroid Build Coastguard Worker const auto &drawBuffers = GetDrawBufferRange(numColorAttachments);
111*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(numColorAttachments, drawBuffers.data());
112*8975f5c5SAndroid Build Coastguard Worker
113*8975f5c5SAndroid Build Coastguard Worker // Generate non-multiview FBOs and attach textures.
114*8975f5c5SAndroid Build Coastguard Worker mNonMultiviewFBO.resize(numLayers);
115*8975f5c5SAndroid Build Coastguard Worker GLsizei framebufferCount = static_cast<GLsizei>(mNonMultiviewFBO.size());
116*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(framebufferCount, mNonMultiviewFBO.data());
117*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < numLayers; ++i)
118*8975f5c5SAndroid Build Coastguard Worker {
119*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mNonMultiviewFBO[i]);
120*8975f5c5SAndroid Build Coastguard Worker for (int j = 0; j < numColorAttachments; ++j)
121*8975f5c5SAndroid Build Coastguard Worker {
122*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER,
123*8975f5c5SAndroid Build Coastguard Worker static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + j),
124*8975f5c5SAndroid Build Coastguard Worker mColorTex[j], 0, i);
125*8975f5c5SAndroid Build Coastguard Worker }
126*8975f5c5SAndroid Build Coastguard Worker if (stencil)
127*8975f5c5SAndroid Build Coastguard Worker {
128*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
129*8975f5c5SAndroid Build Coastguard Worker mDepthStencilTex, 0, i);
130*8975f5c5SAndroid Build Coastguard Worker }
131*8975f5c5SAndroid Build Coastguard Worker else if (depth)
132*8975f5c5SAndroid Build Coastguard Worker {
133*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, mDepthTex, 0, i);
134*8975f5c5SAndroid Build Coastguard Worker }
135*8975f5c5SAndroid Build Coastguard Worker glDrawBuffers(numColorAttachments, drawBuffers.data());
136*8975f5c5SAndroid Build Coastguard Worker }
137*8975f5c5SAndroid Build Coastguard Worker
138*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
139*8975f5c5SAndroid Build Coastguard Worker }
140*8975f5c5SAndroid Build Coastguard Worker
getLayerColor(size_t layer,GLenum attachment,GLint x,GLint y)141*8975f5c5SAndroid Build Coastguard Worker GLColor getLayerColor(size_t layer, GLenum attachment, GLint x, GLint y)
142*8975f5c5SAndroid Build Coastguard Worker {
143*8975f5c5SAndroid Build Coastguard Worker EXPECT_LT(layer, mNonMultiviewFBO.size());
144*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mNonMultiviewFBO[layer]);
145*8975f5c5SAndroid Build Coastguard Worker glReadBuffer(attachment);
146*8975f5c5SAndroid Build Coastguard Worker return angle::ReadColor(x, y);
147*8975f5c5SAndroid Build Coastguard Worker }
148*8975f5c5SAndroid Build Coastguard Worker
getLayerColor(size_t layer,GLenum attachment)149*8975f5c5SAndroid Build Coastguard Worker GLColor getLayerColor(size_t layer, GLenum attachment)
150*8975f5c5SAndroid Build Coastguard Worker {
151*8975f5c5SAndroid Build Coastguard Worker return getLayerColor(layer, attachment, 0, 0);
152*8975f5c5SAndroid Build Coastguard Worker }
153*8975f5c5SAndroid Build Coastguard Worker
154*8975f5c5SAndroid Build Coastguard Worker GLuint mMultiviewFBO;
155*8975f5c5SAndroid Build Coastguard Worker std::vector<GLuint> mNonMultiviewFBO;
156*8975f5c5SAndroid Build Coastguard Worker
157*8975f5c5SAndroid Build Coastguard Worker private:
158*8975f5c5SAndroid Build Coastguard Worker std::vector<GLuint> mColorTex;
159*8975f5c5SAndroid Build Coastguard Worker GLuint mDepthTex;
160*8975f5c5SAndroid Build Coastguard Worker GLuint mDepthStencilTex;
161*8975f5c5SAndroid Build Coastguard Worker };
162*8975f5c5SAndroid Build Coastguard Worker
163*8975f5c5SAndroid Build Coastguard Worker // Test that the framebuffer tokens introduced by OVR_multiview2 can be used to query the
164*8975f5c5SAndroid Build Coastguard Worker // framebuffer state and that their corresponding default values are correctly set.
TEST_P(FramebufferMultiviewTest,DefaultState)165*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewTest, DefaultState)
166*8975f5c5SAndroid Build Coastguard Worker {
167*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
168*8975f5c5SAndroid Build Coastguard Worker
169*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
170*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
171*8975f5c5SAndroid Build Coastguard Worker
172*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
173*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
174*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
175*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
176*8975f5c5SAndroid Build Coastguard Worker
177*8975f5c5SAndroid Build Coastguard Worker GLint numViews = -1;
178*8975f5c5SAndroid Build Coastguard Worker glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
179*8975f5c5SAndroid Build Coastguard Worker GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR,
180*8975f5c5SAndroid Build Coastguard Worker &numViews);
181*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
182*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(1, numViews);
183*8975f5c5SAndroid Build Coastguard Worker
184*8975f5c5SAndroid Build Coastguard Worker GLint baseViewIndex = -1;
185*8975f5c5SAndroid Build Coastguard Worker glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
186*8975f5c5SAndroid Build Coastguard Worker GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR,
187*8975f5c5SAndroid Build Coastguard Worker &baseViewIndex);
188*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
189*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(0, baseViewIndex);
190*8975f5c5SAndroid Build Coastguard Worker }
191*8975f5c5SAndroid Build Coastguard Worker
192*8975f5c5SAndroid Build Coastguard Worker // Test that without having the OVR_multiview2 extension, querying for the framebuffer state using
193*8975f5c5SAndroid Build Coastguard Worker // the OVR_multiview2 tokens results in an INVALID_ENUM error.
TEST_P(FramebufferMultiviewTest,NegativeFramebufferStateQueries)194*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewTest, NegativeFramebufferStateQueries)
195*8975f5c5SAndroid Build Coastguard Worker {
196*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
197*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
198*8975f5c5SAndroid Build Coastguard Worker
199*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
200*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
201*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
202*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
203*8975f5c5SAndroid Build Coastguard Worker
204*8975f5c5SAndroid Build Coastguard Worker GLint numViews = -1;
205*8975f5c5SAndroid Build Coastguard Worker glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
206*8975f5c5SAndroid Build Coastguard Worker GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR,
207*8975f5c5SAndroid Build Coastguard Worker &numViews);
208*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
209*8975f5c5SAndroid Build Coastguard Worker
210*8975f5c5SAndroid Build Coastguard Worker GLint baseViewIndex = -1;
211*8975f5c5SAndroid Build Coastguard Worker glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
212*8975f5c5SAndroid Build Coastguard Worker GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR,
213*8975f5c5SAndroid Build Coastguard Worker &baseViewIndex);
214*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
215*8975f5c5SAndroid Build Coastguard Worker }
216*8975f5c5SAndroid Build Coastguard Worker
217*8975f5c5SAndroid Build Coastguard Worker // Test that the correct errors are generated whenever glFramebufferTextureMultiviewOVR is
218*8975f5c5SAndroid Build Coastguard Worker // called with invalid arguments.
TEST_P(FramebufferMultiviewTest,InvalidMultiviewLayeredArguments)219*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewTest, InvalidMultiviewLayeredArguments)
220*8975f5c5SAndroid Build Coastguard Worker {
221*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
222*8975f5c5SAndroid Build Coastguard Worker
223*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
224*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
225*8975f5c5SAndroid Build Coastguard Worker
226*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
227*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
228*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 1, 1, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
229*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
230*8975f5c5SAndroid Build Coastguard Worker
231*8975f5c5SAndroid Build Coastguard Worker // Negative base view index.
232*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, -1, 1);
233*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
234*8975f5c5SAndroid Build Coastguard Worker
235*8975f5c5SAndroid Build Coastguard Worker // baseViewIndex + numViews is greater than MAX_TEXTURE_LAYERS.
236*8975f5c5SAndroid Build Coastguard Worker GLint maxTextureLayers = 0;
237*8975f5c5SAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxTextureLayers);
238*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, maxTextureLayers,
239*8975f5c5SAndroid Build Coastguard Worker 1);
240*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
241*8975f5c5SAndroid Build Coastguard Worker }
242*8975f5c5SAndroid Build Coastguard Worker
243*8975f5c5SAndroid Build Coastguard Worker // Test that an INVALID_OPERATION error is generated whenever the OVR_multiview2 extension is not
244*8975f5c5SAndroid Build Coastguard Worker // available.
TEST_P(FramebufferMultiviewTest,ExtensionNotAvailableCheck)245*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewTest, ExtensionNotAvailableCheck)
246*8975f5c5SAndroid Build Coastguard Worker {
247*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
248*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
249*8975f5c5SAndroid Build Coastguard Worker
250*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
251*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
252*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
253*8975f5c5SAndroid Build Coastguard Worker
254*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
255*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 1, 1);
256*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
257*8975f5c5SAndroid Build Coastguard Worker }
258*8975f5c5SAndroid Build Coastguard Worker
259*8975f5c5SAndroid Build Coastguard Worker // Test that the active read framebuffer can be read with glCopyTex* if it only has one layered
260*8975f5c5SAndroid Build Coastguard Worker // view.
TEST_P(FramebufferMultiviewTest,CopyTex)261*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewTest, CopyTex)
262*8975f5c5SAndroid Build Coastguard Worker {
263*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
264*8975f5c5SAndroid Build Coastguard Worker
265*8975f5c5SAndroid Build Coastguard Worker // glCopyTexImage2D generates GL_INVALID_FRAMEBUFFER_OPERATION. http://anglebug.com/42262501
266*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsOpenGL());
267*8975f5c5SAndroid Build Coastguard Worker
268*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
269*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
270*8975f5c5SAndroid Build Coastguard Worker
271*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
272*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
273*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 1, 1, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
274*8975f5c5SAndroid Build Coastguard Worker
275*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0, 1);
276*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
277*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
278*8975f5c5SAndroid Build Coastguard Worker
279*8975f5c5SAndroid Build Coastguard Worker // Test glCopyTexImage2D and glCopyTexSubImage2D.
280*8975f5c5SAndroid Build Coastguard Worker {
281*8975f5c5SAndroid Build Coastguard Worker GLTexture tex2;
282*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex2);
283*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
284*8975f5c5SAndroid Build Coastguard Worker
285*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
286*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
287*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
288*8975f5c5SAndroid Build Coastguard Worker
289*8975f5c5SAndroid Build Coastguard Worker glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, 1, 1, 0);
290*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
291*8975f5c5SAndroid Build Coastguard Worker
292*8975f5c5SAndroid Build Coastguard Worker // Test texture contents.
293*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
294*8975f5c5SAndroid Build Coastguard Worker draw2DTexturedQuad(0.0f, 1.0f, true);
295*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
296*8975f5c5SAndroid Build Coastguard Worker
297*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
298*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
299*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
300*8975f5c5SAndroid Build Coastguard Worker
301*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
302*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
303*8975f5c5SAndroid Build Coastguard Worker
304*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
305*8975f5c5SAndroid Build Coastguard Worker draw2DTexturedQuad(0.0f, 1.0f, true);
306*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
307*8975f5c5SAndroid Build Coastguard Worker }
308*8975f5c5SAndroid Build Coastguard Worker
309*8975f5c5SAndroid Build Coastguard Worker // Test glCopyTexSubImage3D.
310*8975f5c5SAndroid Build Coastguard Worker {
311*8975f5c5SAndroid Build Coastguard Worker GLTexture tex2;
312*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_3D, tex2);
313*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
314*8975f5c5SAndroid Build Coastguard Worker
315*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
316*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
317*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
318*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 1, 1);
319*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
320*8975f5c5SAndroid Build Coastguard Worker
321*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
322*8975f5c5SAndroid Build Coastguard Worker draw3DTexturedQuad(0.0f, 1.0f, true, 0.0f);
323*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
324*8975f5c5SAndroid Build Coastguard Worker }
325*8975f5c5SAndroid Build Coastguard Worker }
326*8975f5c5SAndroid Build Coastguard Worker
327*8975f5c5SAndroid Build Coastguard Worker // Test that glBlitFramebuffer succeeds if the current read framebuffer has just one layered view.
TEST_P(FramebufferMultiviewTest,Blit)328*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewTest, Blit)
329*8975f5c5SAndroid Build Coastguard Worker {
330*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
331*8975f5c5SAndroid Build Coastguard Worker
332*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
333*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
334*8975f5c5SAndroid Build Coastguard Worker
335*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
336*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
337*8975f5c5SAndroid Build Coastguard Worker
338*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
339*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
340*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 1, 1, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
341*8975f5c5SAndroid Build Coastguard Worker
342*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0, 1);
343*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
344*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
345*8975f5c5SAndroid Build Coastguard Worker
346*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
347*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
348*8975f5c5SAndroid Build Coastguard Worker
349*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
350*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
351*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
352*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
353*8975f5c5SAndroid Build Coastguard Worker
354*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
355*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
356*8975f5c5SAndroid Build Coastguard Worker }
357*8975f5c5SAndroid Build Coastguard Worker
358*8975f5c5SAndroid Build Coastguard Worker // Test that glReadPixels succeeds from a layered multiview framebuffer with just one view.
TEST_P(FramebufferMultiviewTest,ReadPixels)359*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewTest, ReadPixels)
360*8975f5c5SAndroid Build Coastguard Worker {
361*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
362*8975f5c5SAndroid Build Coastguard Worker
363*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
364*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
365*8975f5c5SAndroid Build Coastguard Worker
366*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
367*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
368*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 1, 1, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
369*8975f5c5SAndroid Build Coastguard Worker
370*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0, 1);
371*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
372*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
373*8975f5c5SAndroid Build Coastguard Worker
374*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
375*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
376*8975f5c5SAndroid Build Coastguard Worker
377*8975f5c5SAndroid Build Coastguard Worker GLColor pixelColor;
378*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixelColor.R);
379*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
380*8975f5c5SAndroid Build Coastguard Worker EXPECT_COLOR_NEAR(GLColor::green, pixelColor, 2);
381*8975f5c5SAndroid Build Coastguard Worker }
382*8975f5c5SAndroid Build Coastguard Worker
383*8975f5c5SAndroid Build Coastguard Worker // Test that glFramebufferTextureMultiviewOVR modifies the internal multiview state.
TEST_P(FramebufferMultiviewTest,ModifyLayeredState)384*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewTest, ModifyLayeredState)
385*8975f5c5SAndroid Build Coastguard Worker {
386*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
387*8975f5c5SAndroid Build Coastguard Worker
388*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer multiviewFBO;
389*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, multiviewFBO);
390*8975f5c5SAndroid Build Coastguard Worker
391*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
392*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
393*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 1, 1, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
394*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
395*8975f5c5SAndroid Build Coastguard Worker
396*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 1, 2);
397*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
398*8975f5c5SAndroid Build Coastguard Worker
399*8975f5c5SAndroid Build Coastguard Worker GLint numViews = -1;
400*8975f5c5SAndroid Build Coastguard Worker glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
401*8975f5c5SAndroid Build Coastguard Worker GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR,
402*8975f5c5SAndroid Build Coastguard Worker &numViews);
403*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
404*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(2, numViews);
405*8975f5c5SAndroid Build Coastguard Worker
406*8975f5c5SAndroid Build Coastguard Worker GLint baseViewIndex = -1;
407*8975f5c5SAndroid Build Coastguard Worker glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
408*8975f5c5SAndroid Build Coastguard Worker GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR,
409*8975f5c5SAndroid Build Coastguard Worker &baseViewIndex);
410*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
411*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(1, baseViewIndex);
412*8975f5c5SAndroid Build Coastguard Worker }
413*8975f5c5SAndroid Build Coastguard Worker
414*8975f5c5SAndroid Build Coastguard Worker // Test framebuffer completeness status of a layered framebuffer with color attachments.
TEST_P(FramebufferMultiviewTest,IncompleteViewTargetsLayered)415*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewTest, IncompleteViewTargetsLayered)
416*8975f5c5SAndroid Build Coastguard Worker {
417*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
418*8975f5c5SAndroid Build Coastguard Worker
419*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
420*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
421*8975f5c5SAndroid Build Coastguard Worker
422*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
423*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
424*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 1, 1, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
425*8975f5c5SAndroid Build Coastguard Worker
426*8975f5c5SAndroid Build Coastguard Worker // Set the 0th attachment and keep it as it is till the end of the test. The 1st color
427*8975f5c5SAndroid Build Coastguard Worker // attachment will be modified to change the framebuffer's status.
428*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0, 2);
429*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
430*8975f5c5SAndroid Build Coastguard Worker
431*8975f5c5SAndroid Build Coastguard Worker GLTexture otherTexLayered;
432*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, otherTexLayered);
433*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 1, 1, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
434*8975f5c5SAndroid Build Coastguard Worker
435*8975f5c5SAndroid Build Coastguard Worker // Test framebuffer completeness when the 1st attachment has a non-multiview layout.
436*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, otherTexLayered, 0, 0);
437*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
438*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR,
439*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
440*8975f5c5SAndroid Build Coastguard Worker
441*8975f5c5SAndroid Build Coastguard Worker // Test that framebuffer is complete when the base view index differs.
442*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, otherTexLayered, 0, 1,
443*8975f5c5SAndroid Build Coastguard Worker 2);
444*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
445*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
446*8975f5c5SAndroid Build Coastguard Worker
447*8975f5c5SAndroid Build Coastguard Worker // Test framebuffer completeness when an attachment's base+count layers is beyond the texture
448*8975f5c5SAndroid Build Coastguard Worker // layers.
449*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, otherTexLayered, 0, 3,
450*8975f5c5SAndroid Build Coastguard Worker 2);
451*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
452*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR,
453*8975f5c5SAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER));
454*8975f5c5SAndroid Build Coastguard Worker
455*8975f5c5SAndroid Build Coastguard Worker // Test that framebuffer is complete when the number of views, base view index and layouts are
456*8975f5c5SAndroid Build Coastguard Worker // the same.
457*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, otherTexLayered, 0, 0,
458*8975f5c5SAndroid Build Coastguard Worker 2);
459*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
460*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
461*8975f5c5SAndroid Build Coastguard Worker }
462*8975f5c5SAndroid Build Coastguard Worker
463*8975f5c5SAndroid Build Coastguard Worker // Test that glClear clears the contents of the color buffer for only the attached layers to a
464*8975f5c5SAndroid Build Coastguard Worker // layered FBO.
TEST_P(FramebufferMultiviewLayeredClearTest,ColorBufferClear)465*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewLayeredClearTest, ColorBufferClear)
466*8975f5c5SAndroid Build Coastguard Worker {
467*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
468*8975f5c5SAndroid Build Coastguard Worker
469*8975f5c5SAndroid Build Coastguard Worker initializeFBOs(1, 1, 4, 1, 2, 1, false, false);
470*8975f5c5SAndroid Build Coastguard Worker
471*8975f5c5SAndroid Build Coastguard Worker // Bind and specify viewport/scissor dimensions for each view.
472*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
473*8975f5c5SAndroid Build Coastguard Worker
474*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 1, 0, 1);
475*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
476*8975f5c5SAndroid Build Coastguard Worker
477*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(0, GL_COLOR_ATTACHMENT0));
478*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(1, GL_COLOR_ATTACHMENT0));
479*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(2, GL_COLOR_ATTACHMENT0));
480*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(3, GL_COLOR_ATTACHMENT0));
481*8975f5c5SAndroid Build Coastguard Worker }
482*8975f5c5SAndroid Build Coastguard Worker
483*8975f5c5SAndroid Build Coastguard Worker // Test that glClearBufferfv can be used to clear individual color buffers of a layered FBO.
TEST_P(FramebufferMultiviewLayeredClearTest,ClearIndividualColorBuffer)484*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewLayeredClearTest, ClearIndividualColorBuffer)
485*8975f5c5SAndroid Build Coastguard Worker {
486*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
487*8975f5c5SAndroid Build Coastguard Worker
488*8975f5c5SAndroid Build Coastguard Worker initializeFBOs(1, 1, 4, 1, 2, 2, false, false);
489*8975f5c5SAndroid Build Coastguard Worker
490*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i)
491*8975f5c5SAndroid Build Coastguard Worker {
492*8975f5c5SAndroid Build Coastguard Worker for (int layer = 0; layer < 4; ++layer)
493*8975f5c5SAndroid Build Coastguard Worker {
494*8975f5c5SAndroid Build Coastguard Worker GLenum colorAttachment = static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + i);
495*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(layer, colorAttachment));
496*8975f5c5SAndroid Build Coastguard Worker }
497*8975f5c5SAndroid Build Coastguard Worker }
498*8975f5c5SAndroid Build Coastguard Worker
499*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
500*8975f5c5SAndroid Build Coastguard Worker
501*8975f5c5SAndroid Build Coastguard Worker float clearValues0[4] = {0.f, 0.f, 1.f, 1.f};
502*8975f5c5SAndroid Build Coastguard Worker glClearBufferfv(GL_COLOR, 0, clearValues0);
503*8975f5c5SAndroid Build Coastguard Worker
504*8975f5c5SAndroid Build Coastguard Worker float clearValues1[4] = {0.f, 1.f, 0.f, 1.f};
505*8975f5c5SAndroid Build Coastguard Worker glClearBufferfv(GL_COLOR, 1, clearValues1);
506*8975f5c5SAndroid Build Coastguard Worker
507*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(0, GL_COLOR_ATTACHMENT0));
508*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::blue, getLayerColor(1, GL_COLOR_ATTACHMENT0));
509*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::blue, getLayerColor(2, GL_COLOR_ATTACHMENT0));
510*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(3, GL_COLOR_ATTACHMENT0));
511*8975f5c5SAndroid Build Coastguard Worker
512*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(0, GL_COLOR_ATTACHMENT1));
513*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(1, GL_COLOR_ATTACHMENT1));
514*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(2, GL_COLOR_ATTACHMENT1));
515*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(3, GL_COLOR_ATTACHMENT1));
516*8975f5c5SAndroid Build Coastguard Worker }
517*8975f5c5SAndroid Build Coastguard Worker
518*8975f5c5SAndroid Build Coastguard Worker // Test that glClearBufferfi clears the contents of the stencil buffer for only the attached layers
519*8975f5c5SAndroid Build Coastguard Worker // to a layered FBO.
TEST_P(FramebufferMultiviewLayeredClearTest,ClearBufferfi)520*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewLayeredClearTest, ClearBufferfi)
521*8975f5c5SAndroid Build Coastguard Worker {
522*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
523*8975f5c5SAndroid Build Coastguard Worker
524*8975f5c5SAndroid Build Coastguard Worker // Create program to draw a quad.
525*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] =
526*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
527*8975f5c5SAndroid Build Coastguard Worker "in vec3 vPos;\n"
528*8975f5c5SAndroid Build Coastguard Worker "void main(){\n"
529*8975f5c5SAndroid Build Coastguard Worker " gl_Position = vec4(vPos, 1.);\n"
530*8975f5c5SAndroid Build Coastguard Worker "}\n";
531*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
532*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
533*8975f5c5SAndroid Build Coastguard Worker "precision mediump float;\n"
534*8975f5c5SAndroid Build Coastguard Worker "uniform vec3 uCol;\n"
535*8975f5c5SAndroid Build Coastguard Worker "out vec4 col;\n"
536*8975f5c5SAndroid Build Coastguard Worker "void main(){\n"
537*8975f5c5SAndroid Build Coastguard Worker " col = vec4(uCol,1.);\n"
538*8975f5c5SAndroid Build Coastguard Worker "}\n";
539*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
540*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
541*8975f5c5SAndroid Build Coastguard Worker GLuint mColorUniformLoc = glGetUniformLocation(program, "uCol");
542*8975f5c5SAndroid Build Coastguard Worker
543*8975f5c5SAndroid Build Coastguard Worker initializeFBOs(1, 1, 4, 1, 2, 1, true, false);
544*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
545*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
546*8975f5c5SAndroid Build Coastguard Worker
547*8975f5c5SAndroid Build Coastguard Worker // Set clear values.
548*8975f5c5SAndroid Build Coastguard Worker glClearColor(1, 0, 0, 1);
549*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0xFF);
550*8975f5c5SAndroid Build Coastguard Worker
551*8975f5c5SAndroid Build Coastguard Worker // Clear the color and stencil buffers of each layer.
552*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0u; i < mNonMultiviewFBO.size(); ++i)
553*8975f5c5SAndroid Build Coastguard Worker {
554*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mNonMultiviewFBO[i]);
555*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
556*8975f5c5SAndroid Build Coastguard Worker }
557*8975f5c5SAndroid Build Coastguard Worker
558*8975f5c5SAndroid Build Coastguard Worker // Switch to multiview framebuffer and clear portions of the texture.
559*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
560*8975f5c5SAndroid Build Coastguard Worker glClearBufferfi(GL_DEPTH_STENCIL, 0, 0.0f, 0);
561*8975f5c5SAndroid Build Coastguard Worker
562*8975f5c5SAndroid Build Coastguard Worker // Draw a fullscreen quad, but adjust the stencil function so that only the cleared regions pass
563*8975f5c5SAndroid Build Coastguard Worker // the test.
564*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
565*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x00, 0xFF);
566*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0u; i < mNonMultiviewFBO.size(); ++i)
567*8975f5c5SAndroid Build Coastguard Worker {
568*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mNonMultiviewFBO[i]);
569*8975f5c5SAndroid Build Coastguard Worker glUniform3f(mColorUniformLoc, 0.0f, 1.0f, 0.0f);
570*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "vPos", 0.0f, 1.0f, true);
571*8975f5c5SAndroid Build Coastguard Worker }
572*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::red, getLayerColor(0, GL_COLOR_ATTACHMENT0));
573*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(1, GL_COLOR_ATTACHMENT0));
574*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(2, GL_COLOR_ATTACHMENT0));
575*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::red, getLayerColor(3, GL_COLOR_ATTACHMENT0));
576*8975f5c5SAndroid Build Coastguard Worker }
577*8975f5c5SAndroid Build Coastguard Worker
578*8975f5c5SAndroid Build Coastguard Worker // Test that glClear does not clear the content of a detached texture.
TEST_P(FramebufferMultiviewLayeredClearTest,UnmodifiedDetachedTexture)579*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewLayeredClearTest, UnmodifiedDetachedTexture)
580*8975f5c5SAndroid Build Coastguard Worker {
581*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
582*8975f5c5SAndroid Build Coastguard Worker
583*8975f5c5SAndroid Build Coastguard Worker initializeFBOs(1, 1, 4, 1, 2, 2, false, false);
584*8975f5c5SAndroid Build Coastguard Worker
585*8975f5c5SAndroid Build Coastguard Worker // Clear all attachments.
586*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
587*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 1, 0, 1);
588*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
589*8975f5c5SAndroid Build Coastguard Worker
590*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i)
591*8975f5c5SAndroid Build Coastguard Worker {
592*8975f5c5SAndroid Build Coastguard Worker GLenum colorAttachment = static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + i);
593*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(0, colorAttachment));
594*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(1, colorAttachment));
595*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(2, colorAttachment));
596*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(3, colorAttachment));
597*8975f5c5SAndroid Build Coastguard Worker }
598*8975f5c5SAndroid Build Coastguard Worker
599*8975f5c5SAndroid Build Coastguard Worker // Detach and clear again.
600*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
601*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, 0, 0, 1, 2);
602*8975f5c5SAndroid Build Coastguard Worker glClearColor(1, 1, 0, 1);
603*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
604*8975f5c5SAndroid Build Coastguard Worker
605*8975f5c5SAndroid Build Coastguard Worker // Check that color attachment 0 is modified.
606*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(0, GL_COLOR_ATTACHMENT0));
607*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::yellow, getLayerColor(1, GL_COLOR_ATTACHMENT0));
608*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::yellow, getLayerColor(2, GL_COLOR_ATTACHMENT0));
609*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(3, GL_COLOR_ATTACHMENT0));
610*8975f5c5SAndroid Build Coastguard Worker
611*8975f5c5SAndroid Build Coastguard Worker // Check that color attachment 1 is unmodified.
612*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(0, GL_COLOR_ATTACHMENT1));
613*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(1, GL_COLOR_ATTACHMENT1));
614*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(2, GL_COLOR_ATTACHMENT1));
615*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(3, GL_COLOR_ATTACHMENT1));
616*8975f5c5SAndroid Build Coastguard Worker }
617*8975f5c5SAndroid Build Coastguard Worker
618*8975f5c5SAndroid Build Coastguard Worker // Test that glClear clears only the contents within the scissor rectangle of the attached layers.
TEST_P(FramebufferMultiviewLayeredClearTest,ScissoredClear)619*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewLayeredClearTest, ScissoredClear)
620*8975f5c5SAndroid Build Coastguard Worker {
621*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
622*8975f5c5SAndroid Build Coastguard Worker
623*8975f5c5SAndroid Build Coastguard Worker initializeFBOs(2, 1, 4, 1, 2, 1, false, false);
624*8975f5c5SAndroid Build Coastguard Worker
625*8975f5c5SAndroid Build Coastguard Worker // Bind and specify viewport/scissor dimensions for each view.
626*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
627*8975f5c5SAndroid Build Coastguard Worker
628*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
629*8975f5c5SAndroid Build Coastguard Worker glScissor(1, 0, 1, 1);
630*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 1, 0, 1);
631*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
632*8975f5c5SAndroid Build Coastguard Worker
633*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(0, GL_COLOR_ATTACHMENT0, 0, 0));
634*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(0, GL_COLOR_ATTACHMENT0, 1, 0));
635*8975f5c5SAndroid Build Coastguard Worker
636*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(1, GL_COLOR_ATTACHMENT0, 0, 0));
637*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(1, GL_COLOR_ATTACHMENT0, 1, 0));
638*8975f5c5SAndroid Build Coastguard Worker
639*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(2, GL_COLOR_ATTACHMENT0, 0, 0));
640*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(2, GL_COLOR_ATTACHMENT0, 1, 0));
641*8975f5c5SAndroid Build Coastguard Worker
642*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(3, GL_COLOR_ATTACHMENT0, 0, 0));
643*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::transparentBlack, getLayerColor(3, GL_COLOR_ATTACHMENT0, 1, 0));
644*8975f5c5SAndroid Build Coastguard Worker }
645*8975f5c5SAndroid Build Coastguard Worker
646*8975f5c5SAndroid Build Coastguard Worker // Test that glClearBufferfi clears the contents of the stencil buffer for only the attached layers
647*8975f5c5SAndroid Build Coastguard Worker // to a layered FBO.
TEST_P(FramebufferMultiviewLayeredClearTest,ScissoredClearBufferfi)648*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewLayeredClearTest, ScissoredClearBufferfi)
649*8975f5c5SAndroid Build Coastguard Worker {
650*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
651*8975f5c5SAndroid Build Coastguard Worker
652*8975f5c5SAndroid Build Coastguard Worker // Create program to draw a quad.
653*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] =
654*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
655*8975f5c5SAndroid Build Coastguard Worker "in vec3 vPos;\n"
656*8975f5c5SAndroid Build Coastguard Worker "void main(){\n"
657*8975f5c5SAndroid Build Coastguard Worker " gl_Position = vec4(vPos, 1.);\n"
658*8975f5c5SAndroid Build Coastguard Worker "}\n";
659*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
660*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
661*8975f5c5SAndroid Build Coastguard Worker "precision mediump float;\n"
662*8975f5c5SAndroid Build Coastguard Worker "uniform vec3 uCol;\n"
663*8975f5c5SAndroid Build Coastguard Worker "out vec4 col;\n"
664*8975f5c5SAndroid Build Coastguard Worker "void main(){\n"
665*8975f5c5SAndroid Build Coastguard Worker " col = vec4(uCol,1.);\n"
666*8975f5c5SAndroid Build Coastguard Worker "}\n";
667*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
668*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
669*8975f5c5SAndroid Build Coastguard Worker GLuint mColorUniformLoc = glGetUniformLocation(program, "uCol");
670*8975f5c5SAndroid Build Coastguard Worker
671*8975f5c5SAndroid Build Coastguard Worker initializeFBOs(1, 2, 4, 1, 2, 1, true, false);
672*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
673*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
674*8975f5c5SAndroid Build Coastguard Worker
675*8975f5c5SAndroid Build Coastguard Worker // Set clear values.
676*8975f5c5SAndroid Build Coastguard Worker glClearColor(1, 0, 0, 1);
677*8975f5c5SAndroid Build Coastguard Worker glClearStencil(0xFF);
678*8975f5c5SAndroid Build Coastguard Worker
679*8975f5c5SAndroid Build Coastguard Worker // Clear the color and stencil buffers of each layer.
680*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0u; i < mNonMultiviewFBO.size(); ++i)
681*8975f5c5SAndroid Build Coastguard Worker {
682*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mNonMultiviewFBO[i]);
683*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
684*8975f5c5SAndroid Build Coastguard Worker }
685*8975f5c5SAndroid Build Coastguard Worker
686*8975f5c5SAndroid Build Coastguard Worker // Switch to multiview framebuffer and clear portions of the texture.
687*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
688*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
689*8975f5c5SAndroid Build Coastguard Worker glScissor(0, 0, 1, 1);
690*8975f5c5SAndroid Build Coastguard Worker glClearBufferfi(GL_DEPTH_STENCIL, 0, 0.0f, 0);
691*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
692*8975f5c5SAndroid Build Coastguard Worker
693*8975f5c5SAndroid Build Coastguard Worker // Draw a fullscreen quad, but adjust the stencil function so that only the cleared regions pass
694*8975f5c5SAndroid Build Coastguard Worker // the test.
695*8975f5c5SAndroid Build Coastguard Worker glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
696*8975f5c5SAndroid Build Coastguard Worker glStencilFunc(GL_EQUAL, 0x00, 0xFF);
697*8975f5c5SAndroid Build Coastguard Worker glUniform3f(mColorUniformLoc, 0.0f, 1.0f, 0.0f);
698*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0u; i < mNonMultiviewFBO.size(); ++i)
699*8975f5c5SAndroid Build Coastguard Worker {
700*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mNonMultiviewFBO[i]);
701*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "vPos", 0.0f, 1.0f, true);
702*8975f5c5SAndroid Build Coastguard Worker }
703*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::red, getLayerColor(0, GL_COLOR_ATTACHMENT0, 0, 0));
704*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::red, getLayerColor(0, GL_COLOR_ATTACHMENT0, 0, 1));
705*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(1, GL_COLOR_ATTACHMENT0, 0, 0));
706*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::red, getLayerColor(1, GL_COLOR_ATTACHMENT0, 0, 1));
707*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(2, GL_COLOR_ATTACHMENT0, 0, 0));
708*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::red, getLayerColor(2, GL_COLOR_ATTACHMENT0, 0, 1));
709*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::red, getLayerColor(3, GL_COLOR_ATTACHMENT0, 0, 0));
710*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::red, getLayerColor(3, GL_COLOR_ATTACHMENT0, 0, 1));
711*8975f5c5SAndroid Build Coastguard Worker }
712*8975f5c5SAndroid Build Coastguard Worker
713*8975f5c5SAndroid Build Coastguard Worker // Test that detaching an attachment does not generate an error whenever the multi-view related
714*8975f5c5SAndroid Build Coastguard Worker // arguments are invalid.
TEST_P(FramebufferMultiviewTest,InvalidMultiviewArgumentsOnDetach)715*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewTest, InvalidMultiviewArgumentsOnDetach)
716*8975f5c5SAndroid Build Coastguard Worker {
717*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
718*8975f5c5SAndroid Build Coastguard Worker
719*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
720*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
721*8975f5c5SAndroid Build Coastguard Worker
722*8975f5c5SAndroid Build Coastguard Worker // Invalid base view index.
723*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 0, 0, -1, 1);
724*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
725*8975f5c5SAndroid Build Coastguard Worker
726*8975f5c5SAndroid Build Coastguard Worker // Invalid number of views.
727*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 0, 0, 0, 0);
728*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
729*8975f5c5SAndroid Build Coastguard Worker }
730*8975f5c5SAndroid Build Coastguard Worker
731*8975f5c5SAndroid Build Coastguard Worker // Test that glClear clears the contents of the color buffer whenever all layers of a 2D texture
732*8975f5c5SAndroid Build Coastguard Worker // array are attached. The test is added because a special fast code path is used for this case.
TEST_P(FramebufferMultiviewLayeredClearTest,ColorBufferClearAllLayersAttached)733*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewLayeredClearTest, ColorBufferClearAllLayersAttached)
734*8975f5c5SAndroid Build Coastguard Worker {
735*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
736*8975f5c5SAndroid Build Coastguard Worker
737*8975f5c5SAndroid Build Coastguard Worker initializeFBOs(1, 1, 2, 0, 2, 1, false, false);
738*8975f5c5SAndroid Build Coastguard Worker
739*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
740*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 1, 0, 1);
741*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
742*8975f5c5SAndroid Build Coastguard Worker
743*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(0, GL_COLOR_ATTACHMENT0));
744*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GLColor::green, getLayerColor(1, GL_COLOR_ATTACHMENT0));
745*8975f5c5SAndroid Build Coastguard Worker }
746*8975f5c5SAndroid Build Coastguard Worker
747*8975f5c5SAndroid Build Coastguard Worker // Test that attaching a multisampled texture array is not possible if all the required extensions
748*8975f5c5SAndroid Build Coastguard Worker // are not enabled.
TEST_P(FramebufferMultiviewTest,NegativeMultisampledFramebufferTest)749*8975f5c5SAndroid Build Coastguard Worker TEST_P(FramebufferMultiviewTest, NegativeMultisampledFramebufferTest)
750*8975f5c5SAndroid Build Coastguard Worker {
751*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
752*8975f5c5SAndroid Build Coastguard Worker
753*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array"));
754*8975f5c5SAndroid Build Coastguard Worker
755*8975f5c5SAndroid Build Coastguard Worker // We don't enable OVR_multiview2_multisample
756*8975f5c5SAndroid Build Coastguard Worker
757*8975f5c5SAndroid Build Coastguard Worker GLTexture multisampleTexture;
758*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, multisampleTexture);
759*8975f5c5SAndroid Build Coastguard Worker
760*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
761*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
762*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, multisampleTexture, 0, 0,
763*8975f5c5SAndroid Build Coastguard Worker 2);
764*8975f5c5SAndroid Build Coastguard Worker // From the extension spec: "An INVALID_OPERATION error is generated if texture is not zero, and
765*8975f5c5SAndroid Build Coastguard Worker // does not name an existing texture object of type TEXTURE_2D_ARRAY."
766*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
767*8975f5c5SAndroid Build Coastguard Worker }
768*8975f5c5SAndroid Build Coastguard Worker
769*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferMultiviewTest);
770*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(FramebufferMultiviewTest,
771*8975f5c5SAndroid Build Coastguard Worker VertexShaderOpenGL(3, 0, ExtensionName::multiview),
772*8975f5c5SAndroid Build Coastguard Worker VertexShaderVulkan(3, 0, ExtensionName::multiview),
773*8975f5c5SAndroid Build Coastguard Worker GeomShaderD3D11(3, 0, ExtensionName::multiview),
774*8975f5c5SAndroid Build Coastguard Worker VertexShaderOpenGL(3, 0, ExtensionName::multiview2),
775*8975f5c5SAndroid Build Coastguard Worker VertexShaderVulkan(3, 0, ExtensionName::multiview2),
776*8975f5c5SAndroid Build Coastguard Worker GeomShaderD3D11(3, 0, ExtensionName::multiview2));
777*8975f5c5SAndroid Build Coastguard Worker
778*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferMultiviewLayeredClearTest);
779*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(FramebufferMultiviewLayeredClearTest,
780*8975f5c5SAndroid Build Coastguard Worker VertexShaderOpenGL(3, 0, ExtensionName::multiview),
781*8975f5c5SAndroid Build Coastguard Worker VertexShaderVulkan(3, 0, ExtensionName::multiview),
782*8975f5c5SAndroid Build Coastguard Worker GeomShaderD3D11(3, 0, ExtensionName::multiview),
783*8975f5c5SAndroid Build Coastguard Worker VertexShaderOpenGL(3, 0, ExtensionName::multiview2),
784*8975f5c5SAndroid Build Coastguard Worker VertexShaderVulkan(3, 0, ExtensionName::multiview2),
785*8975f5c5SAndroid Build Coastguard Worker GeomShaderD3D11(3, 0, ExtensionName::multiview2));
786