GL_ANGLE_multiview has been renamed to GL_OVR_multiview2.

changes include:
1) GL_OVR_multiview to GL_OVR_multiview2 extension directive change
2) Removal of all references to side by side. We no longer support multiple views in a single 2DTexture. Only 2DTextureArray's are supported
3) WebGL 2 (ES3) is required for multiview

Bug: angleproject:3341
Change-Id: Ie0c1d21d7610f8feebdb2e4d01c6947f57e69328
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1552023
Commit-Queue: Rafael Cintron <rafael.cintron@microsoft.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/tests/gl_tests/MultiviewDrawTest.cpp b/src/tests/gl_tests/MultiviewDrawTest.cpp
index 489e1e3..3a71ea9 100644
--- a/src/tests/gl_tests/MultiviewDrawTest.cpp
+++ b/src/tests/gl_tests/MultiviewDrawTest.cpp
@@ -36,17 +36,10 @@
 
 struct MultiviewRenderTestParams final : public MultiviewImplementationParams
 {
-    MultiviewRenderTestParams(GLenum multiviewLayout,
-                              int samples,
+    MultiviewRenderTestParams(int samples,
                               const MultiviewImplementationParams &implementationParams)
-        : MultiviewImplementationParams(implementationParams),
-          mMultiviewLayout(multiviewLayout),
-          mSamples(samples)
-    {
-        EXPECT_TRUE(multiviewLayout == GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE ||
-                    multiviewLayout == GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE);
-    }
-    GLenum mMultiviewLayout;
+        : MultiviewImplementationParams(implementationParams), mSamples(samples)
+    {}
     int mSamples;
 };
 
@@ -55,18 +48,8 @@
     const MultiviewImplementationParams &base =
         static_cast<const MultiviewImplementationParams &>(params);
     os << base;
-    switch (params.mMultiviewLayout)
-    {
-        case GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE:
-            os << "_layered";
-            break;
-        case GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE:
-            os << "_side_by_side";
-            break;
-        default:
-            os << "_error";
-            break;
-    }
+    os << "_layered";
+
     if (params.mSamples > 0)
     {
         os << "_samples_" << params.mSamples;
@@ -77,9 +60,7 @@
 class MultiviewFramebufferTestBase : public MultiviewTestBase
 {
   protected:
-    MultiviewFramebufferTestBase(const PlatformParameters &params,
-                                 GLenum multiviewLayout,
-                                 int samples)
+    MultiviewFramebufferTestBase(const PlatformParameters &params, int samples)
         : MultiviewTestBase(params),
           mViewWidth(0),
           mViewHeight(0),
@@ -87,7 +68,6 @@
           mColorTexture(0u),
           mDepthTexture(0u),
           mDrawFramebuffer(0u),
-          mMultiviewLayout(multiviewLayout),
           mSamples(samples),
           mResolveTexture(0u)
     {}
@@ -113,56 +93,33 @@
         glGenTextures(1, &mColorTexture);
         glGenTextures(1, &mDepthTexture);
 
-        CreateMultiviewBackingTextures(mMultiviewLayout, mSamples, viewWidth, height, numLayers,
-                                       mColorTexture, mDepthTexture, 0u);
+        CreateMultiviewBackingTextures(mSamples, viewWidth, height, numLayers, mColorTexture,
+                                       mDepthTexture, 0u);
 
         glGenFramebuffers(1, &mDrawFramebuffer);
 
         // Create draw framebuffer to be used for multiview rendering.
         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mDrawFramebuffer);
-        AttachMultiviewTextures(GL_DRAW_FRAMEBUFFER, mMultiviewLayout, viewWidth, numViews,
-                                baseViewIndex, mColorTexture, mDepthTexture, 0u);
+        AttachMultiviewTextures(GL_DRAW_FRAMEBUFFER, viewWidth, numViews, baseViewIndex,
+                                mColorTexture, mDepthTexture, 0u);
 
         ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
 
         // Create read framebuffer to be used to retrieve the pixel information for testing
         // purposes.
-        switch (mMultiviewLayout)
+        mReadFramebuffer.resize(numLayers);
+        glGenFramebuffers(static_cast<GLsizei>(mReadFramebuffer.size()), mReadFramebuffer.data());
+        for (int i = 0; i < numLayers; ++i)
         {
-            case GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE:
-                mReadFramebuffer.resize(1);
-                glGenFramebuffers(1, mReadFramebuffer.data());
-                glBindFramebuffer(GL_READ_FRAMEBUFFER, mReadFramebuffer[0]);
-                glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
-                                       mColorTexture, 0);
-                ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE,
-                                 glCheckFramebufferStatus(GL_READ_FRAMEBUFFER));
-                break;
-            case GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE:
-                mReadFramebuffer.resize(numLayers);
-                glGenFramebuffers(static_cast<GLsizei>(mReadFramebuffer.size()),
-                                  mReadFramebuffer.data());
-                for (int i = 0; i < numLayers; ++i)
-                {
-                    glBindFramebuffer(GL_READ_FRAMEBUFFER, mReadFramebuffer[i]);
-                    glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-                                              mColorTexture, 0, i);
-                    ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE,
-                                     glCheckFramebufferStatus(GL_READ_FRAMEBUFFER));
-                }
-                break;
-            default:
-                ASSERT_TRUE(false);
+            glBindFramebuffer(GL_READ_FRAMEBUFFER, mReadFramebuffer[i]);
+            glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mColorTexture, 0,
+                                      i);
+            ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE,
+                             glCheckFramebufferStatus(GL_READ_FRAMEBUFFER));
         }
 
         // Clear the buffers.
         glViewport(0, 0, viewWidth, height);
-        if (mMultiviewLayout == GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE)
-        {
-            // Enable the scissor test only for side-by-side framebuffers.
-            glEnable(GL_SCISSOR_TEST);
-            glScissor(0, 0, viewWidth, height);
-        }
     }
 
     void updateFBOs(int viewWidth, int height, int numViews)
@@ -185,8 +142,8 @@
         {
             ASSERT_TRUE(mResolveTexture == 0u);
             glGenTextures(1, &mResolveTexture);
-            CreateMultiviewBackingTextures(mMultiviewLayout, 0, mViewWidth, mViewHeight, numLayers,
-                                           mResolveTexture, 0u, 0u);
+            CreateMultiviewBackingTextures(0, mViewWidth, mViewHeight, numLayers, mResolveTexture,
+                                           0u, 0u);
 
             mResolveFramebuffer.resize(numLayers);
             glGenFramebuffers(static_cast<GLsizei>(mResolveFramebuffer.size()),
@@ -211,27 +168,17 @@
 
     GLColor GetViewColor(int x, int y, int view)
     {
-        switch (mMultiviewLayout)
+        EXPECT_TRUE(static_cast<size_t>(view) < mReadFramebuffer.size());
+        if (mSamples > 0)
         {
-            case GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE:
-                glBindFramebuffer(GL_READ_FRAMEBUFFER, mReadFramebuffer[0]);
-                return ReadColor(view * mViewWidth + x, y);
-            case GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE:
-                EXPECT_TRUE(static_cast<size_t>(view) < mReadFramebuffer.size());
-                if (mSamples > 0)
-                {
-                    EXPECT_TRUE(static_cast<size_t>(view) < mResolveFramebuffer.size());
-                    glBindFramebuffer(GL_READ_FRAMEBUFFER, mResolveFramebuffer[view]);
-                }
-                else
-                {
-                    glBindFramebuffer(GL_READ_FRAMEBUFFER, mReadFramebuffer[view]);
-                }
-                return ReadColor(x, y);
-            default:
-                EXPECT_TRUE(false);
+            EXPECT_TRUE(static_cast<size_t>(view) < mResolveFramebuffer.size());
+            glBindFramebuffer(GL_READ_FRAMEBUFFER, mResolveFramebuffer[view]);
         }
-        return GLColor(0, 0, 0, 0);
+        else
+        {
+            glBindFramebuffer(GL_READ_FRAMEBUFFER, mReadFramebuffer[view]);
+        }
+        return ReadColor(x, y);
     }
 
     bool isMultisampled() { return mSamples > 0; }
@@ -246,7 +193,6 @@
   private:
     GLuint mDrawFramebuffer;
     std::vector<GLuint> mReadFramebuffer;
-    GLenum mMultiviewLayout;
     int mSamples;
 
     // For reading back multisampled framebuffer.
@@ -294,9 +240,7 @@
                             public ::testing::TestWithParam<MultiviewRenderTestParams>
 {
   protected:
-    MultiviewRenderTest()
-        : MultiviewFramebufferTestBase(GetParam(), GetParam().mMultiviewLayout, GetParam().mSamples)
-    {}
+    MultiviewRenderTest() : MultiviewFramebufferTestBase(GetParam(), GetParam().mSamples) {}
     void SetUp() override { MultiviewFramebufferTestBase::FramebufferTestSetUp(); }
     void TearDown() override { MultiviewFramebufferTestBase::FramebufferTestTearDown(); }
 
@@ -307,7 +251,7 @@
 };
 
 constexpr char kDualViewVSSource[] = R"(#version 300 es
-#extension GL_OVR_multiview : require
+#extension GL_OVR_multiview2 : require
 layout(num_views = 2) in;
 in vec4 vPosition;
 void main()
@@ -317,7 +261,7 @@
 })";
 
 constexpr char kDualViewFSSource[] = R"(#version 300 es
-#extension GL_OVR_multiview : require
+#extension GL_OVR_multiview2 : require
 precision mediump float;
 out vec4 col;
 void main()
@@ -375,10 +319,18 @@
   protected:
     MultiviewDrawValidationTest() : MultiviewTest() {}
 
-    void initOnePixelColorTexture2D(GLuint texId)
+    void initOnePixelColorTexture2DSingleLayered(GLuint texId)
     {
-        glBindTexture(GL_TEXTURE_2D, texId);
-        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+        glBindTexture(GL_TEXTURE_2D_ARRAY, texId);
+        glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                     nullptr);
+    }
+
+    void initOnePixelColorTexture2DMultiLayered(GLuint texId)
+    {
+        glBindTexture(GL_TEXTURE_2D_ARRAY, texId);
+        glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 1, 1, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                     nullptr);
     }
 
     // This initializes a simple VAO with a valid vertex buffer and index buffer with three
@@ -488,29 +440,11 @@
     GLuint mVBO;
 };
 
-class MultiviewSideBySideRenderTest : public MultiviewFramebufferTestBase,
-                                      public ::testing::TestWithParam<MultiviewImplementationParams>
-{
-  protected:
-    MultiviewSideBySideRenderTest()
-        : MultiviewFramebufferTestBase(GetParam(), GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, 0)
-    {}
-
-    void SetUp() final { MultiviewFramebufferTestBase::FramebufferTestSetUp(); }
-    void TearDown() final { MultiviewFramebufferTestBase::FramebufferTestTearDown(); }
-    void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) final
-    {
-        workarounds->selectViewInGeometryShader = GetParam().mForceUseGeometryShaderOnD3D;
-    }
-};
-
 class MultiviewLayeredRenderTest : public MultiviewFramebufferTestBase,
                                    public ::testing::TestWithParam<MultiviewImplementationParams>
 {
   protected:
-    MultiviewLayeredRenderTest()
-        : MultiviewFramebufferTestBase(GetParam(), GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE, 0)
-    {}
+    MultiviewLayeredRenderTest() : MultiviewFramebufferTestBase(GetParam(), 0) {}
     void SetUp() final { MultiviewFramebufferTestBase::FramebufferTestSetUp(); }
     void TearDown() final { MultiviewFramebufferTestBase::FramebufferTestTearDown(); }
     void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) final
@@ -519,19 +453,14 @@
     }
 };
 
-// The test verifies that glDraw*Indirect:
-// 1) generates an INVALID_OPERATION error if the number of views in the draw framebuffer is greater
-// than 1.
-// 2) does not generate any error if the draw framebuffer has exactly 1 view.
+// The test verifies that glDraw*Indirect works for any number of views.
 TEST_P(MultiviewDrawValidationTest, IndirectDraw)
 {
     ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
 
-    const GLint viewportOffsets[4] = {0, 0, 2, 0};
-
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "void main()\n"
         "{}\n";
@@ -550,43 +479,44 @@
     glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(GLuint) * 5u, &commandData[0], GL_STATIC_DRAW);
     ASSERT_GL_NO_ERROR();
 
-    GLTexture tex2D;
-    initOnePixelColorTexture2D(tex2D);
-
-    // Check for a GL_INVALID_OPERATION error with the framebuffer having 2 views.
+    // Check that no errors are generated with the framebuffer having 2 views.
     {
         constexpr char kVS[] =
             "#version 300 es\n"
-            "#extension GL_OVR_multiview : require\n"
+            "#extension GL_OVR_multiview2 : require\n"
             "layout(num_views = 2) in;\n"
             "void main()\n"
             "{}\n";
         ANGLE_GL_PROGRAM(program, kVS, kFS);
         glUseProgram(program);
 
-        glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
-                                                     2, &viewportOffsets[0]);
+        GLTexture tex2DArray;
+        initOnePixelColorTexture2DMultiLayered(tex2DArray);
+
+        glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, 0, 0, 2);
 
         glDrawArraysIndirect(GL_TRIANGLES, nullptr);
-        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+        EXPECT_GL_NO_ERROR();
 
         glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, nullptr);
-        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+        EXPECT_GL_NO_ERROR();
     }
 
     // Check that no errors are generated if the number of views is 1.
     {
         constexpr char kVS[] =
             "#version 300 es\n"
-            "#extension GL_OVR_multiview : require\n"
+            "#extension GL_OVR_multiview2 : require\n"
             "layout(num_views = 1) in;\n"
             "void main()\n"
             "{}\n";
         ANGLE_GL_PROGRAM(program, kVS, kFS);
         glUseProgram(program);
 
-        glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
-                                                     1, &viewportOffsets[0]);
+        GLTexture tex2D;
+        initOnePixelColorTexture2DSingleLayered(tex2D);
+
+        glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0, 0, 1);
 
         glDrawArraysIndirect(GL_TRIANGLES, nullptr);
         EXPECT_GL_NO_ERROR();
@@ -604,17 +534,15 @@
 {
     ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
 
-    const GLint viewportOffsets[4] = {0, 0, 2, 0};
-
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "void main()\n"
         "{}\n";
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "void main()\n"
         "{}\n";
@@ -629,15 +557,14 @@
     GLFramebuffer fbo;
     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 
-    GLTexture tex2D;
-    initOnePixelColorTexture2D(tex2D);
-
     // Check for a GL_INVALID_OPERATION error with the framebuffer and program having different
     // number of views.
     {
+        GLTexture tex2D;
+        initOnePixelColorTexture2DSingleLayered(tex2D);
+
         // The framebuffer has only 1 view.
-        glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
-                                                     1, &viewportOffsets[0]);
+        glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0, 0, 1);
 
         glDrawArrays(GL_TRIANGLES, 0, 3);
         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
@@ -649,8 +576,10 @@
     // Check that no errors are generated if the number of views in both program and draw
     // framebuffer matches.
     {
-        glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
-                                                     2, &viewportOffsets[0]);
+        GLTexture tex2DArray;
+        initOnePixelColorTexture2DMultiLayered(tex2DArray);
+
+        glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, 0, 0, 2);
 
         glDrawArrays(GL_TRIANGLES, 0, 3);
         EXPECT_GL_NO_ERROR();
@@ -689,12 +618,10 @@
     GLFramebuffer fbo;
     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 
-    GLTexture tex2D;
-    initOnePixelColorTexture2D(tex2D);
+    GLTexture tex2DArray;
+    initOnePixelColorTexture2DMultiLayered(tex2DArray);
 
-    const GLint viewportOffsets[4] = {0, 0, 2, 0};
-    glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0, 2,
-                                                 &viewportOffsets[0]);
+    glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, 0, 0, 2);
 
     glDrawArrays(GL_TRIANGLES, 0, 3);
     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
@@ -711,8 +638,6 @@
 {
     ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
 
-    const GLint viewportOffsets[4] = {0, 0, 2, 0};
-
     constexpr char kVS[] = R"(#version 300 es
 out float tfVarying;
 void main()
@@ -756,14 +681,13 @@
     GLFramebuffer fbo;
     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 
-    GLTexture tex2D;
-    initOnePixelColorTexture2D(tex2D);
+    GLTexture tex2DArray;
+    initOnePixelColorTexture2DMultiLayered(tex2DArray);
 
     // Check that drawArrays generates an error when there is an active transform feedback object
     // and the number of views in the draw framebuffer is greater than 1.
     {
-        glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
-                                                     2, &viewportOffsets[0]);
+        glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, 0, 0, 2);
         glDrawArrays(GL_TRIANGLES, 0, 3);
         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
     }
@@ -801,11 +725,13 @@
     glBeginTransformFeedback(GL_TRIANGLES);
     ASSERT_GL_NO_ERROR();
 
+    GLTexture tex2D;
+    initOnePixelColorTexture2DSingleLayered(tex2D);
+
     // Check that drawArrays does not generate an error when the number of views in the draw
     // framebuffer is 1.
     {
-        glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
-                                                     1, &viewportOffsets[0]);
+        glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0, 0, 1);
         glDrawArrays(GL_TRIANGLES, 0, 3);
         EXPECT_GL_NO_ERROR();
     }
@@ -824,7 +750,6 @@
 
     ANGLE_GL_PROGRAM(dualViewProgram, kDualViewVSSource, kDualViewFSSource);
 
-    const GLint viewportOffsets[4] = {0, 0, 2, 0};
     constexpr char kVS[] =
         "#version 300 es\n"
         "void main()\n"
@@ -849,25 +774,26 @@
     GLFramebuffer fbo;
     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 
-    GLTexture tex2D;
-    initOnePixelColorTexture2D(tex2D);
+    GLTexture tex2DArr;
+    initOnePixelColorTexture2DMultiLayered(tex2DArr);
 
     // Check first case.
     {
         glUseProgram(dualViewProgram);
-        glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
-                                                     2, &viewportOffsets[0]);
+        glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArr, 0, 0, 2);
         glClear(GL_COLOR_BUFFER_BIT);
         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
         glDrawArrays(GL_TRIANGLES, 0, 3);
         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
     }
 
+    GLTexture tex2D;
+    initOnePixelColorTexture2DSingleLayered(tex2D);
+
     // Check second case.
     {
         glUseProgram(singleViewProgram);
-        glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
-                                                     1, &viewportOffsets[0]);
+        glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0, 0, 1);
         glClear(GL_COLOR_BUFFER_BIT);
         EXPECT_GL_NO_ERROR();
         glDrawArrays(GL_TRIANGLES, 0, 3);
@@ -880,8 +806,7 @@
     // Check starting a query after a successful draw.
     {
         glUseProgram(dualViewProgram);
-        glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
-                                                     2, &viewportOffsets[0]);
+        glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArr, 0, 0, 2);
         glClear(GL_COLOR_BUFFER_BIT);
         EXPECT_GL_NO_ERROR();
         glDrawArrays(GL_TRIANGLES, 0, 3);
@@ -941,7 +866,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 4) in;\n"
         "in vec4 vPosition;\n"
         "void main()\n"
@@ -960,7 +885,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "out vec4 col;\n"
         "void main()\n"
@@ -999,7 +924,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "in vec4 vPosition;\n"
         "void main()\n"
@@ -1016,7 +941,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "out vec4 col;\n"
         "void main()\n"
@@ -1072,7 +997,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "in vec3 vPosition;\n"
         "in float offsetX;\n"
@@ -1087,7 +1012,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "out vec4 col;\n"
         "void main()\n"
@@ -1152,7 +1077,7 @@
     // Create multiview program.
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "layout(location = 0) in vec2 vPosition;\n"
         "layout(location = 1) in float offsetX;\n"
@@ -1165,7 +1090,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "out vec4 col;\n"
         "void main()\n"
@@ -1312,7 +1237,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "in vec3 vPosition;\n"
         "void main()\n"
@@ -1323,7 +1248,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "out vec4 col;\n"
         "void main()\n"
@@ -1347,7 +1272,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "in vec3 vPosition;\n"
         "void main()\n"
@@ -1358,7 +1283,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "out vec4 col;\n"
         "void main()\n"
@@ -1382,7 +1307,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "in vec3 vPosition;\n"
         "void main()\n"
@@ -1393,7 +1318,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "out vec4 col;\n"
         "void main()\n"
@@ -1419,7 +1344,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "void main()\n"
         "{\n"
@@ -1427,7 +1352,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "void main()\n"
         "{\n"
@@ -1450,7 +1375,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "void main()\n"
         "{\n"
@@ -1463,7 +1388,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "void main()\n"
         "{\n"
@@ -1486,7 +1411,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "void main()\n"
         "{\n"
@@ -1494,7 +1419,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "out vec4 col;\n"
         "void main()\n"
@@ -1525,7 +1450,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "layout(location=0) in vec2 vPosition;\n"
         "void main()\n"
@@ -1536,7 +1461,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "out vec4 col;\n"
         "void main()\n"
@@ -1738,97 +1663,6 @@
     glDeleteProgram(program);
 }
 
-// Test that rendering enlarged points and lines does not leak fragments outside of the views'
-// bounds. The test does not rely on the actual line width being greater than 1.0.
-TEST_P(MultiviewSideBySideRenderTest, NoLeakingFragments)
-{
-    if (!requestMultiviewExtension())
-    {
-        return;
-    }
-
-    GLTexture colorTexture;
-
-    CreateMultiviewBackingTextures(GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, 0, 2, 1, 2,
-                                   colorTexture, 0u, 0u);
-
-    GLFramebuffer drawFramebuffer;
-    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFramebuffer);
-    GLint viewportOffsets[4] = {1, 0, 3, 0};
-    glFramebufferTextureMultiviewSideBySideANGLE(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-                                                 colorTexture, 0, 2, &viewportOffsets[0]);
-
-    GLFramebuffer readFramebuffer;
-    glBindFramebuffer(GL_READ_FRAMEBUFFER, readFramebuffer);
-    glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture,
-                           0);
-
-    ASSERT_GL_NO_ERROR();
-
-    glViewport(0, 0, 1, 1);
-    glScissor(0, 0, 1, 1);
-    glEnable(GL_SCISSOR_TEST);
-
-    constexpr char kVS[] =
-        "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
-        "layout(num_views = 2) in;\n"
-        "layout(location=0) in vec2 vPosition;\n"
-        "void main()\n"
-        "{\n"
-        "   gl_PointSize = 10.0;\n"
-        "   gl_Position = vec4(vPosition.xy, 0.0, 1.0);\n"
-        "}\n";
-
-    constexpr char kFS[] =
-        "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
-        "precision mediump float;\n"
-        "out vec4 col;\n"
-        "void main()\n"
-        "{\n"
-        "   if (gl_ViewID_OVR == 0u) {\n"
-        "       col = vec4(1,0,0,1);\n"
-        "   } else {\n"
-        "       col = vec4(0,1,0,1);\n"
-        "   }\n"
-        "}\n";
-    ANGLE_GL_PROGRAM(program, kVS, kFS);
-    glUseProgram(program);
-
-    const std::vector<Vector2I> &windowCoordinates = {Vector2I(0, 0), Vector2I(2, 0)};
-    const std::vector<Vector2> &vertexDataInClipSpace =
-        ConvertPixelCoordinatesToClipSpace(windowCoordinates, 1, 1);
-
-    GLBuffer vbo;
-    glBindBuffer(GL_ARRAY_BUFFER, vbo);
-    glBufferData(GL_ARRAY_BUFFER, vertexDataInClipSpace.size() * sizeof(Vector2),
-                 vertexDataInClipSpace.data(), GL_STATIC_DRAW);
-    glEnableVertexAttribArray(0);
-    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
-
-    // Test rendering points.
-    {
-        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-        glDrawArrays(GL_POINTS, 0, 2);
-        EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
-        EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::red);
-        EXPECT_PIXEL_COLOR_EQ(2, 0, GLColor::transparentBlack);
-        EXPECT_PIXEL_COLOR_EQ(3, 0, GLColor::green);
-    }
-
-    // Test rendering lines.
-    {
-        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-        glLineWidth(10.f);
-        glDrawArrays(GL_LINES, 0, 2);
-        EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
-        EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::red);
-        EXPECT_PIXEL_COLOR_EQ(2, 0, GLColor::transparentBlack);
-        EXPECT_PIXEL_COLOR_EQ(3, 0, GLColor::green);
-    }
-}
-
 // Verify that re-linking a program adjusts the attribute divisor.
 // The test uses instacing to draw for each view a strips of two red quads and two blue quads next
 // to each other. The quads' position and color depend on the corresponding attribute divisors.
@@ -1852,7 +1686,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "in vec4 oColor;\n"
         "out vec4 col;\n"
@@ -1864,7 +1698,7 @@
     auto generateVertexShaderSource = [](int numViews) -> std::string {
         std::string source =
             "#version 300 es\n"
-            "#extension GL_OVR_multiview : require\n"
+            "#extension GL_OVR_multiview2 : require\n"
             "layout(num_views = " +
             ToString(numViews) +
             ") in;\n"
@@ -2047,7 +1881,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 3) in;\n"
         "in vec3 vPosition;\n"
         "void main()\n"
@@ -2057,7 +1891,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "out vec4 col;\n"
         "void main()\n"
@@ -2096,7 +1930,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "in vec3 vPosition;\n"
         "void main()\n"
@@ -2106,7 +1940,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "out vec4 col;\n"
         "void main()\n"
@@ -2142,7 +1976,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "in vec3 vPosition;\n"
         "flat out int oInstanceID;\n"
@@ -2154,7 +1988,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "flat in int oInstanceID;\n"
         "out vec4 col;\n"
@@ -2192,7 +2026,7 @@
 
     constexpr char kVS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "layout(num_views = 2) in;\n"
         "in vec3 vPosition;\n"
         "flat out int flatVarying;\n"
@@ -2204,7 +2038,7 @@
 
     constexpr char kFS[] =
         "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
+        "#extension GL_OVR_multiview2 : require\n"
         "precision mediump float;\n"
         "flat in int flatVarying;\n"
         "out vec4 col;\n"
@@ -2228,149 +2062,56 @@
     EXPECT_EQ(GLColor::green, GetViewColor(0, 0, 1));
 }
 
-// The test is added to cover a bug which resulted in the viewport/scissor and viewport offsets not
-// being correctly applied.
-TEST_P(MultiviewSideBySideRenderTest, ViewportOffsetsAppliedBugCoverage)
+MultiviewRenderTestParams VertexShaderOpenGL()
 {
-    if (!requestMultiviewExtension())
-    {
-        return;
-    }
-
-    updateFBOs(1, 1, 2);
-
-    // Create multiview program.
-    constexpr char kVS[] =
-        "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
-        "layout(num_views = 2) in;\n"
-        "layout(location = 0) in vec3 vPosition;\n"
-        "void main()\n"
-        "{\n"
-        "       gl_Position = vec4(vPosition, 1.0);\n"
-        "}\n";
-
-    constexpr char kFS[] =
-        "#version 300 es\n"
-        "#extension GL_OVR_multiview : require\n"
-        "precision mediump float;\n"
-        "out vec4 col;\n"
-        "void main()\n"
-        "{\n"
-        "    col = vec4(0,1,0,1);\n"
-        "}\n";
-
-    ANGLE_GL_PROGRAM(program, kVS, kFS);
-
-    glViewport(0, 0, 1, 1);
-    glScissor(0, 0, 1, 1);
-    glEnable(GL_SCISSOR_TEST);
-    glClearColor(0, 0, 0, 1);
-
-    // Bind the default FBO and make sure that the state is synchronized.
-    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-    ASSERT_GL_NO_ERROR();
-
-    // Draw and check that both views are rendered to.
-    bindMemberDrawFramebuffer();
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-    drawQuad(program, "vPosition", 0.0f, 1.0f, true);
-    EXPECT_EQ(GLColor::green, GetViewColor(0, 0, 0));
-    EXPECT_EQ(GLColor::green, GetViewColor(0, 0, 1));
+    return MultiviewRenderTestParams(0, VertexShaderOpenGL(3, 0));
 }
 
-MultiviewRenderTestParams SideBySideVertexShaderOpenGL(GLint majorVersion = 3,
-                                                       GLint minorVersion = 0)
+MultiviewRenderTestParams GeomShaderD3D11()
 {
-    return MultiviewRenderTestParams(GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, 0,
-                                     VertexShaderOpenGL(majorVersion, minorVersion));
+    return MultiviewRenderTestParams(0, GeomShaderD3D11(3, 0));
 }
 
-MultiviewRenderTestParams LayeredVertexShaderOpenGL()
+MultiviewRenderTestParams VertexShaderD3D11()
 {
-    return MultiviewRenderTestParams(GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE, 0,
-                                     VertexShaderOpenGL(3, 0));
+    return MultiviewRenderTestParams(0, VertexShaderD3D11(3, 0));
 }
 
-MultiviewRenderTestParams SideBySideGeomShaderD3D11()
+MultiviewRenderTestParams MultisampledVertexShaderOpenGL()
 {
-    return MultiviewRenderTestParams(GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, 0,
-                                     GeomShaderD3D11(3, 0));
+    return MultiviewRenderTestParams(2, VertexShaderOpenGL(3, 1));
 }
 
-MultiviewRenderTestParams LayeredGeomShaderD3D11()
+MultiviewRenderTestParams MultisampledVertexShaderD3D11()
 {
-    return MultiviewRenderTestParams(GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE, 0,
-                                     GeomShaderD3D11(3, 0));
-}
-
-MultiviewRenderTestParams SideBySideVertexShaderD3D11(GLint majorVersion = 3,
-                                                      GLint minorVersion = 0)
-{
-    return MultiviewRenderTestParams(GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, 0,
-                                     VertexShaderD3D11(majorVersion, minorVersion));
-}
-
-MultiviewRenderTestParams LayeredVertexShaderD3D11()
-{
-    return MultiviewRenderTestParams(GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE, 0,
-                                     VertexShaderD3D11(3, 0));
-}
-
-MultiviewRenderTestParams LayeredMultisampledVertexShaderOpenGL()
-{
-    return MultiviewRenderTestParams(GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE, 2,
-                                     VertexShaderOpenGL(3, 1));
-}
-
-MultiviewRenderTestParams LayeredMultisampledVertexShaderD3D11()
-{
-    return MultiviewRenderTestParams(GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE, 2,
-                                     VertexShaderD3D11(3, 1));
+    return MultiviewRenderTestParams(2, VertexShaderD3D11(3, 1));
 }
 
 ANGLE_INSTANTIATE_TEST(MultiviewDrawValidationTest,
                        VertexShaderOpenGL(3, 1),
                        VertexShaderD3D11(3, 1));
 ANGLE_INSTANTIATE_TEST(MultiviewRenderDualViewTest,
-                       SideBySideVertexShaderOpenGL(),
-                       LayeredVertexShaderOpenGL(),
-                       LayeredMultisampledVertexShaderOpenGL(),
-                       SideBySideGeomShaderD3D11(),
-                       SideBySideVertexShaderD3D11(),
-                       LayeredGeomShaderD3D11(),
-                       LayeredVertexShaderD3D11(),
-                       LayeredMultisampledVertexShaderD3D11());
+                       VertexShaderOpenGL(),
+                       MultisampledVertexShaderOpenGL(),
+                       GeomShaderD3D11(),
+                       VertexShaderD3D11(),
+                       MultisampledVertexShaderD3D11());
 ANGLE_INSTANTIATE_TEST(MultiviewRenderTest,
-                       SideBySideVertexShaderOpenGL(),
-                       LayeredVertexShaderOpenGL(),
-                       LayeredMultisampledVertexShaderOpenGL(),
-                       SideBySideGeomShaderD3D11(),
-                       SideBySideVertexShaderD3D11(),
-                       LayeredGeomShaderD3D11(),
-                       LayeredVertexShaderD3D11(),
-                       LayeredMultisampledVertexShaderD3D11());
+                       VertexShaderOpenGL(),
+                       MultisampledVertexShaderOpenGL(),
+                       GeomShaderD3D11(),
+                       VertexShaderD3D11(),
+                       MultisampledVertexShaderD3D11());
 ANGLE_INSTANTIATE_TEST(MultiviewOcclusionQueryTest,
-                       SideBySideVertexShaderOpenGL(),
-                       LayeredVertexShaderOpenGL(),
-                       SideBySideGeomShaderD3D11(),
-                       SideBySideVertexShaderD3D11(),
-                       LayeredGeomShaderD3D11(),
-                       LayeredVertexShaderD3D11());
+                       VertexShaderOpenGL(),
+                       GeomShaderD3D11(),
+                       VertexShaderD3D11());
 ANGLE_INSTANTIATE_TEST(MultiviewProgramGenerationTest,
                        VertexShaderOpenGL(3, 0),
                        GeomShaderD3D11(3, 0),
                        VertexShaderD3D11(3, 0));
 ANGLE_INSTANTIATE_TEST(MultiviewRenderPrimitiveTest,
-                       SideBySideVertexShaderOpenGL(),
-                       LayeredVertexShaderOpenGL(),
-                       SideBySideGeomShaderD3D11(),
-                       SideBySideVertexShaderD3D11(),
-                       LayeredGeomShaderD3D11(),
-                       LayeredVertexShaderD3D11());
-ANGLE_INSTANTIATE_TEST(MultiviewSideBySideRenderTest,
-                       VertexShaderOpenGL(3, 0),
-                       GeomShaderD3D11(3, 0));
+                       VertexShaderOpenGL(),
+                       GeomShaderD3D11(),
+                       VertexShaderD3D11());
 ANGLE_INSTANTIATE_TEST(MultiviewLayeredRenderTest, VertexShaderOpenGL(3, 0), GeomShaderD3D11(3, 0));