Fix resource init/teardown in FramebufferMultiviewTest

GL RAII classes can't be used as test class members since the GL
objects need to be deleted before the test class TearDown is called.

BUG=angleproject:2765
TEST=angle_end2end_tests

Change-Id: If19d33bd044c9e74e46f35183e8ca1bc6a96d6cf
Reviewed-on: https://chromium-review.googlesource.com/1179159
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/tests/gl_tests/FramebufferMultiviewTest.cpp b/src/tests/gl_tests/FramebufferMultiviewTest.cpp
index b8e4aea..6ba4321 100644
--- a/src/tests/gl_tests/FramebufferMultiviewTest.cpp
+++ b/src/tests/gl_tests/FramebufferMultiviewTest.cpp
@@ -36,14 +36,58 @@
 class FramebufferMultiviewSideBySideClearTest : public FramebufferMultiviewTest
 {
   protected:
-    FramebufferMultiviewSideBySideClearTest() {}
+    FramebufferMultiviewSideBySideClearTest()
+        : mMultiviewFBO(0u), mNonMultiviewFBO(0u), mDepthTex(0u), mDepthStencilTex(0u)
+    {
+    }
+
+    void TearDown() override
+    {
+        if (mMultiviewFBO != 0)
+        {
+            glDeleteFramebuffers(1, &mMultiviewFBO);
+            mMultiviewFBO = 0u;
+        }
+        if (mNonMultiviewFBO != 0)
+        {
+            glDeleteTextures(1, &mNonMultiviewFBO);
+            mNonMultiviewFBO = 0u;
+        }
+        if (!mColorTex.empty())
+        {
+            glDeleteTextures(mColorTex.size(), mColorTex.data());
+            mColorTex.clear();
+        }
+        if (mDepthStencilTex != 0u)
+        {
+            glDeleteTextures(1, &mDepthStencilTex);
+            mDepthStencilTex = 0u;
+        }
+        if (mDepthTex != 0u)
+        {
+            glDeleteTextures(1, &mDepthTex);
+            mDepthTex = 0u;
+        }
+        MultiviewTest::TearDown();
+    }
 
     void initializeFBOs(size_t numColorBuffers, bool stencil, bool depth)
     {
         const std::vector<GLenum> &drawBuffers = GetDrawBufferRange(2);
 
         // Generate textures.
+        // Generate textures.
         mColorTex.resize(numColorBuffers);
+        glGenTextures(mColorTex.size(), mColorTex.data());
+        if (stencil)
+        {
+            glGenTextures(1, &mDepthStencilTex);
+        }
+        else if (depth)
+        {
+            glGenTextures(1, &mDepthTex);
+        }
+
         for (size_t i = 0u; i < numColorBuffers; ++i)
         {
             glBindTexture(GL_TEXTURE_2D, mColorTex[i]);
@@ -52,7 +96,7 @@
 
         if (stencil)
         {
-            glBindTexture(GL_TEXTURE_2D, mStencilTex);
+            glBindTexture(GL_TEXTURE_2D, mDepthStencilTex);
             glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 4, 2, 0, GL_DEPTH_STENCIL,
                          GL_UNSIGNED_INT_24_8, nullptr);
         }
@@ -63,6 +107,9 @@
                          GL_FLOAT, nullptr);
         }
 
+        glGenFramebuffers(1, &mMultiviewFBO);
+        glGenFramebuffers(1, &mNonMultiviewFBO);
+
         // Generate multiview fbo and attach textures.
         const GLint kViewportOffsets[4] = {1, 0, 3, 0};
         glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
@@ -76,9 +123,9 @@
 
         if (stencil)
         {
-            glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER,
-                                                         GL_DEPTH_STENCIL_ATTACHMENT, mStencilTex,
-                                                         0, 2, &kViewportOffsets[0]);
+            glFramebufferTextureMultiviewSideBySideANGLE(
+                GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, mDepthStencilTex, 0, 2,
+                &kViewportOffsets[0]);
         }
         else if (depth)
         {
@@ -97,7 +144,7 @@
         if (stencil)
         {
             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
-                                   mStencilTex, 0);
+                                   mDepthStencilTex, 0);
         }
         else if (depth)
         {
@@ -128,17 +175,49 @@
         EXPECT_PIXEL_COLOR_EQ(3, 1, GLColor::green);
     }
 
-    GLFramebuffer mMultiviewFBO;
-    GLFramebuffer mNonMultiviewFBO;
-    std::vector<GLTexture> mColorTex;
-    GLTexture mDepthTex;
-    GLTexture mStencilTex;
+    GLuint mMultiviewFBO;
+    GLuint mNonMultiviewFBO;
+
+  private:
+    std::vector<GLuint> mColorTex;
+    GLuint mDepthTex;
+    GLuint mDepthStencilTex;
 };
 
 class FramebufferMultiviewLayeredClearTest : public FramebufferMultiviewTest
 {
   protected:
-    FramebufferMultiviewLayeredClearTest() {}
+    FramebufferMultiviewLayeredClearTest() : mMultiviewFBO(0), mDepthTex(0), mDepthStencilTex(0) {}
+
+    void TearDown() override
+    {
+        if (mMultiviewFBO != 0)
+        {
+            glDeleteFramebuffers(1, &mMultiviewFBO);
+            mMultiviewFBO = 0u;
+        }
+        if (!mNonMultiviewFBO.empty())
+        {
+            glDeleteTextures(mNonMultiviewFBO.size(), mNonMultiviewFBO.data());
+            mNonMultiviewFBO.clear();
+        }
+        if (!mColorTex.empty())
+        {
+            glDeleteTextures(mColorTex.size(), mColorTex.data());
+            mColorTex.clear();
+        }
+        if (mDepthStencilTex != 0u)
+        {
+            glDeleteTextures(1, &mDepthStencilTex);
+            mDepthStencilTex = 0u;
+        }
+        if (mDepthTex != 0u)
+        {
+            glDeleteTextures(1, &mDepthTex);
+            mDepthTex = 0u;
+        }
+        MultiviewTest::TearDown();
+    }
 
     void initializeFBOs(int width,
                         int height,
@@ -153,6 +232,16 @@
 
         // Generate textures.
         mColorTex.resize(numColorAttachments);
+        glGenTextures(mColorTex.size(), mColorTex.data());
+        if (stencil)
+        {
+            glGenTextures(1, &mDepthStencilTex);
+        }
+        else if (depth)
+        {
+            glGenTextures(1, &mDepthTex);
+        }
+
         for (int i = 0; i < numColorAttachments; ++i)
         {
             glBindTexture(GL_TEXTURE_2D_ARRAY, mColorTex[i]);
@@ -162,7 +251,7 @@
 
         if (stencil)
         {
-            glBindTexture(GL_TEXTURE_2D_ARRAY, mStencilTex);
+            glBindTexture(GL_TEXTURE_2D_ARRAY, mDepthStencilTex);
             glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_DEPTH24_STENCIL8, width, height, numLayers, 0,
                          GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, nullptr);
         }
@@ -173,6 +262,8 @@
                          GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
         }
 
+        glGenFramebuffers(1, &mMultiviewFBO);
+
         // Generate multiview FBO and attach textures.
         glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
         for (int i = 0; i < numColorAttachments; ++i)
@@ -185,7 +276,7 @@
         if (stencil)
         {
             glFramebufferTextureMultiviewLayeredANGLE(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
-                                                      mStencilTex, 0, baseViewIndex, numViews);
+                                                      mDepthStencilTex, 0, baseViewIndex, numViews);
         }
         else if (depth)
         {
@@ -196,6 +287,9 @@
         const auto &drawBuffers = GetDrawBufferRange(numColorAttachments);
         glDrawBuffers(numColorAttachments, drawBuffers.data());
 
+        mNonMultiviewFBO.resize(numLayers);
+        glGenFramebuffers(mNonMultiviewFBO.size(), mNonMultiviewFBO.data());
+
         // Generate non-multiview FBOs and attach textures.
         mNonMultiviewFBO.resize(numLayers);
         for (int i = 0; i < numLayers; ++i)
@@ -209,8 +303,8 @@
             }
             if (stencil)
             {
-                glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, mStencilTex,
-                                          0, i);
+                glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
+                                          mDepthStencilTex, 0, i);
             }
             else if (depth)
             {
@@ -238,11 +332,13 @@
         return getLayerColor(layer, attachment, 0, 0);
     }
 
-    GLFramebuffer mMultiviewFBO;
-    std::vector<GLFramebuffer> mNonMultiviewFBO;
-    std::vector<GLTexture> mColorTex;
-    GLTexture mDepthTex;
-    GLTexture mStencilTex;
+    GLuint mMultiviewFBO;
+    std::vector<GLuint> mNonMultiviewFBO;
+
+  private:
+    std::vector<GLuint> mColorTex;
+    GLuint mDepthTex;
+    GLuint mDepthStencilTex;
 };
 
 // Test that the framebuffer tokens introduced by ANGLE_multiview can be used to query the