D3D11: Select view in vertex shader

View selection can happen in the vertex shader through the optional
feature VPAndRTArrayIndexFromAnyShaderFeedingRasterizer.

BUG=angleproject:2062
TEST=angle_end2end_tests

Change-Id: Iaf65685e04f828b0936295fea867f6f6cbe69bee
Reviewed-on: https://chromium-review.googlesource.com/628419
Commit-Queue: Martin Radev <mradev@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index 2875000..b41df35 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -377,6 +377,7 @@
       mUsesViewScale(renderer->presentPathFastEnabled()),
       mHasANGLEMultiviewEnabled(vertexShader->hasANGLEMultiviewEnabled()),
       mUsesViewID(fragmentShader->usesViewID()),
+      mCanSelectViewInVertexShader(renderer->canSelectViewInVertexShader()),
       mVertexShader(vertexShader),
       mFragmentShader(fragmentShader)
 {
@@ -434,6 +435,11 @@
     return mUsesViewID;
 }
 
+bool ProgramD3DMetadata::canSelectViewInVertexShader() const
+{
+    return mCanSelectViewInVertexShader;
+}
+
 bool ProgramD3DMetadata::addsPointCoordToVertexShader() const
 {
     // PointSprite emulation requiress that gl_PointCoord is present in the vertex shader
@@ -601,7 +607,7 @@
 
 bool ProgramD3D::usesGeometryShader(GLenum drawMode) const
 {
-    if (mHasANGLEMultiviewEnabled)
+    if (mHasANGLEMultiviewEnabled && !mRenderer->canSelectViewInVertexShader())
     {
         return true;
     }
@@ -1322,8 +1328,8 @@
 
     std::string geometryHLSL = mDynamicHLSL->generateGeometryShaderHLSL(
         geometryShaderType, data, mState, mRenderer->presentPathFastEnabled(),
-        mHasANGLEMultiviewEnabled, usesGeometryShaderForPointSpriteEmulation(),
-        mGeometryShaderPreamble);
+        mHasANGLEMultiviewEnabled, mRenderer->canSelectViewInVertexShader(),
+        usesGeometryShaderForPointSpriteEmulation(), mGeometryShaderPreamble);
 
     gl::InfoLog tempInfoLog;
     gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog;
@@ -1623,7 +1629,8 @@
         if (mRenderer->getMajorShaderModel() >= 4)
         {
             mGeometryShaderPreamble = mDynamicHLSL->generateGeometryShaderPreamble(
-                packing, builtins, mHasANGLEMultiviewEnabled);
+                packing, builtins, mHasANGLEMultiviewEnabled,
+                metadata.canSelectViewInVertexShader());
         }
 
         initAttribLocationsToD3DSemantic(context);