xref: /aosp_15_r20/external/angle/src/tests/gl_tests/FramebufferMultiviewTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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