Add branch for viewport or layer selection in VS

The patch extends the behavior of
SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER so that either the viewport
or layer is selected based on the value of the internal uniform variable
MultiviewRenderPath.

BUG=angleproject:2062
TEST=angle_end2end_tests
TEST=angle_unittests

Change-Id: Ia311b12b1fed642dac78eba8732e2535242f34fd
Reviewed-on: https://chromium-review.googlesource.com/615260
Commit-Queue: Martin Radev <mradev@nvidia.com>
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/gl/FramebufferGL.cpp b/src/libANGLE/renderer/gl/FramebufferGL.cpp
index 7b6a258..ffd1a60 100644
--- a/src/libANGLE/renderer/gl/FramebufferGL.cpp
+++ b/src/libANGLE/renderer/gl/FramebufferGL.cpp
@@ -95,12 +95,14 @@
 
 void RetrieveMultiviewFieldsFromAttachment(const gl::FramebufferAttachment *attachment,
                                            const std::vector<gl::Offset> **viewportOffsets,
-                                           GLenum *multiviewLayout)
+                                           GLenum *multiviewLayout,
+                                           int *baseViewIndex)
 {
     if (attachment)
     {
         *viewportOffsets = &attachment->getMultiviewViewportOffsets();
         *multiviewLayout = attachment->getMultiviewLayout();
+        *baseViewIndex   = attachment->getBaseViewIndex();
     }
 }
 
@@ -596,6 +598,7 @@
 
     const std::vector<gl::Offset> *attachmentViewportOffsets = nullptr;
     GLenum multiviewLayout                                   = GL_NONE;
+    int baseViewIndex                                        = -1;
     bool isAttachmentModified                                = false;
 
     for (auto dirtyBit : dirtyBits)
@@ -606,14 +609,16 @@
                 BindFramebufferAttachment(mFunctions, GL_DEPTH_ATTACHMENT,
                                           mState.getDepthAttachment());
                 RetrieveMultiviewFieldsFromAttachment(mState.getDepthAttachment(),
-                                                      &attachmentViewportOffsets, &multiviewLayout);
+                                                      &attachmentViewportOffsets, &multiviewLayout,
+                                                      &baseViewIndex);
                 isAttachmentModified = true;
                 break;
             case Framebuffer::DIRTY_BIT_STENCIL_ATTACHMENT:
                 BindFramebufferAttachment(mFunctions, GL_STENCIL_ATTACHMENT,
                                           mState.getStencilAttachment());
                 RetrieveMultiviewFieldsFromAttachment(mState.getStencilAttachment(),
-                                                      &attachmentViewportOffsets, &multiviewLayout);
+                                                      &attachmentViewportOffsets, &multiviewLayout,
+                                                      &baseViewIndex);
                 isAttachmentModified = true;
                 break;
             case Framebuffer::DIRTY_BIT_DRAW_BUFFERS:
@@ -654,7 +659,8 @@
                                           static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + index),
                                           mState.getColorAttachment(index));
                 RetrieveMultiviewFieldsFromAttachment(mState.getColorAttachment(index),
-                                                      &attachmentViewportOffsets, &multiviewLayout);
+                                                      &attachmentViewportOffsets, &multiviewLayout,
+                                                      &baseViewIndex);
                 isAttachmentModified = true;
                 break;
             }
@@ -674,6 +680,9 @@
             mStateManager->setViewportOffsets(
                 FramebufferAttachment::GetDefaultViewportOffsetVector());
         }
+
+        mStateManager->updateMultiviewBaseViewLayerIndexUniform(context->getGLState().getProgram(),
+                                                                getState());
     }
 }