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/ProgramGL.cpp b/src/libANGLE/renderer/gl/ProgramGL.cpp
index 2ea74e2..3c1fe40 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -35,6 +35,7 @@
mWorkarounds(workarounds),
mStateManager(stateManager),
mEnablePathRendering(enablePathRendering),
+ mMultiviewBaseViewLayerIndexUniformLocation(-1),
mProgramID(0)
{
ASSERT(mFunctions);
@@ -590,6 +591,8 @@
mUniformRealLocationMap.clear();
mUniformBlockRealLocationMap.clear();
mPathRenderingFragmentInputs.clear();
+
+ mMultiviewBaseViewLayerIndexUniformLocation = -1;
}
bool ProgramGL::checkLinkStatus(gl::InfoLog &infoLog)
@@ -658,6 +661,13 @@
mUniformRealLocationMap[uniformLocation] = realLocation;
}
+ if (mState.usesMultiview())
+ {
+ mMultiviewBaseViewLayerIndexUniformLocation =
+ mFunctions->getUniformLocation(mProgramID, "webgl_angle_multiviewBaseViewLayerIndex");
+ ASSERT(mMultiviewBaseViewLayerIndexUniformLocation != -1);
+ }
+
// Discover CHROMIUM_path_rendering fragment inputs if enabled.
if (!mEnablePathRendering)
return;
@@ -724,4 +734,23 @@
}
}
+void ProgramGL::enableSideBySideRenderingPath() const
+{
+ ASSERT(mState.usesMultiview());
+ ASSERT(mMultiviewBaseViewLayerIndexUniformLocation != -1);
+
+ ASSERT(mFunctions->programUniform1i != nullptr);
+ mFunctions->programUniform1i(mProgramID, mMultiviewBaseViewLayerIndexUniformLocation, -1);
+}
+
+void ProgramGL::enableLayeredRenderingPath(int baseViewIndex) const
+{
+ ASSERT(mState.usesMultiview());
+ ASSERT(mMultiviewBaseViewLayerIndexUniformLocation != -1);
+
+ ASSERT(mFunctions->programUniform1i != nullptr);
+ mFunctions->programUniform1i(mProgramID, mMultiviewBaseViewLayerIndexUniformLocation,
+ baseViewIndex);
+}
+
} // namespace rx