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());
}
}