Commit 265a6d43 by Martin Radev Committed by Commit Bot

Fix viewport and scissor multiview updates in StatemanagerGL

The patch fixes a bug with the viewport and scissor state not being correctly updated for side-by-side framebuffers. BUG=angleproject:2062 TEST=angle_end2end_tests Change-Id: I5f85b8146174d78a363316a66e2761e37305cffe Reviewed-on: https://chromium-review.googlesource.com/663260 Commit-Queue: Martin Radev <mradev@nvidia.com> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent a16a84f3
...@@ -2146,14 +2146,8 @@ void StateManagerGL::applyViewportOffsetsAndSetScissors(const gl::Rectangle &sci ...@@ -2146,14 +2146,8 @@ void StateManagerGL::applyViewportOffsetsAndSetScissors(const gl::Rectangle &sci
attachmentViewportOffsets != nullptr attachmentViewportOffsets != nullptr
? *attachmentViewportOffsets ? *attachmentViewportOffsets
: gl::FramebufferAttachment::GetDefaultViewportOffsetVector(); : gl::FramebufferAttachment::GetDefaultViewportOffsetVector();
if (!AllRectanglesMatch(scissor, mScissors) || const std::vector<gl::Rectangle> &scissorArray = ApplyOffsets(scissor, viewportOffsets);
!std::equal(viewportOffsets.cbegin(), viewportOffsets.cend(), mViewportOffsets.cbegin())) setScissorArrayv(0u, scissorArray);
{
const std::vector<gl::Rectangle> &scissorArray = ApplyOffsets(scissor, viewportOffsets);
std::copy(viewportOffsets.begin(), viewportOffsets.end(), mViewportOffsets.begin());
setScissorArrayv(0u, scissorArray);
mMultiviewDirtyBits.set(MULTIVIEW_DIRTY_BIT_VIEWPORT_OFFSETS);
}
} }
void StateManagerGL::applyViewportOffsetsAndSetViewports(const gl::Rectangle &viewport, void StateManagerGL::applyViewportOffsetsAndSetViewports(const gl::Rectangle &viewport,
...@@ -2164,14 +2158,8 @@ void StateManagerGL::applyViewportOffsetsAndSetViewports(const gl::Rectangle &vi ...@@ -2164,14 +2158,8 @@ void StateManagerGL::applyViewportOffsetsAndSetViewports(const gl::Rectangle &vi
attachmentViewportOffsets != nullptr attachmentViewportOffsets != nullptr
? *attachmentViewportOffsets ? *attachmentViewportOffsets
: gl::FramebufferAttachment::GetDefaultViewportOffsetVector(); : gl::FramebufferAttachment::GetDefaultViewportOffsetVector();
if (!AllRectanglesMatch(viewport, mViewports) || const std::vector<gl::Rectangle> &viewportArray = ApplyOffsets(viewport, viewportOffsets);
!std::equal(viewportOffsets.cbegin(), viewportOffsets.cend(), mViewportOffsets.cbegin())) setViewportArrayv(0u, viewportArray);
{
const std::vector<gl::Rectangle> &viewportArray = ApplyOffsets(viewport, viewportOffsets);
std::copy(viewportOffsets.begin(), viewportOffsets.end(), mViewportOffsets.begin());
setViewportArrayv(0u, viewportArray);
mMultiviewDirtyBits.set(MULTIVIEW_DIRTY_BIT_VIEWPORT_OFFSETS);
}
} }
void StateManagerGL::propagateNumViewsToVAO(const gl::Program *program, VertexArrayGL *vao) void StateManagerGL::propagateNumViewsToVAO(const gl::Program *program, VertexArrayGL *vao)
......
...@@ -2032,6 +2032,59 @@ TEST_P(MultiviewRenderTest, FlatInterpolation) ...@@ -2032,6 +2032,59 @@ TEST_P(MultiviewRenderTest, FlatInterpolation)
EXPECT_EQ(GLColor::green, GetViewColor(0, 0, 1)); 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)
{
if (!requestMultiviewExtension())
{
return;
}
createFBO(1, 1, 2);
// Create multiview program.
const std::string &vs =
"#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";
const std::string &fs =
"#version 300 es\n"
"#extension GL_OVR_multiview : require\n"
"precision mediump float;\n"
"out vec4 col;\n"
"void main()\n"
"{\n"
" col = vec4(1,0,0,1);\n"
"}\n";
ANGLE_GL_PROGRAM(program, vs, fs);
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.
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mDrawFramebuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(program);
drawQuad(program, "vPosition", 0.0f, 1.0f, true);
EXPECT_EQ(GLColor::red, GetViewColor(0, 0, 0));
EXPECT_EQ(GLColor::red, GetViewColor(0, 0, 1));
}
MultiviewImplementationParams VertexShaderOpenGL() MultiviewImplementationParams VertexShaderOpenGL()
{ {
return MultiviewImplementationParams(false, egl_platform::OPENGL()); return MultiviewImplementationParams(false, egl_platform::OPENGL());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment