Vulkan: Fix for framebuffer blit and Y flip
- The depth/stencil related tests are now disabled since I found out
that the tests are too simple to find issues if there is a flip since
they use only a single color and no gradient / checked board.
This is left to implement in the Vulkan backend later on.
Bug: angleproject:2673
Change-Id: I8f7091d4b9c8c3bec0353ebab28304b6209ea350
Reviewed-on: https://chromium-review.googlesource.com/1129629
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Luc Ferron <lucferron@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 8207cf2..015ebff 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -387,10 +387,14 @@
UNIMPLEMENTED();
}
-bool ContextVk::isViewportFlipEnabled() const
+bool ContextVk::isViewportFlipEnabledForDrawFBO() const
{
- gl::Framebuffer *framebuffer = mState.getState().getDrawFramebuffer();
- return framebuffer->isDefault() && mFlipYForCurrentSurface;
+ return mFlipViewportForDrawFramebuffer && mFlipYForCurrentSurface;
+}
+
+bool ContextVk::isViewportFlipEnabledForReadFBO() const
+{
+ return mFlipViewportForReadFramebuffer;
}
void ContextVk::updateColorMask(const gl::BlendState &blendState)
@@ -412,14 +416,16 @@
if (glState.isScissorTestEnabled())
{
- mPipelineDesc->updateScissor(glState.getScissor(), isViewportFlipEnabled(), renderArea);
+ mPipelineDesc->updateScissor(glState.getScissor(), isViewportFlipEnabledForDrawFBO(),
+ renderArea);
}
else
{
// If the scissor test isn't enabled, we can simply use a really big scissor that's
// certainly larger than the current surface using the maximum size of a 2D texture
// for the width and height.
- mPipelineDesc->updateScissor(kMaxSizedScissor, isViewportFlipEnabled(), renderArea);
+ mPipelineDesc->updateScissor(kMaxSizedScissor, isViewportFlipEnabledForDrawFBO(),
+ renderArea);
}
}
@@ -448,7 +454,7 @@
FramebufferVk *framebufferVk = vk::GetImpl(glState.getDrawFramebuffer());
mPipelineDesc->updateViewport(framebufferVk, glState.getViewport(),
glState.getNearPlane(), glState.getFarPlane(),
- isViewportFlipEnabled());
+ isViewportFlipEnabledForDrawFBO());
ANGLE_TRY(updateDriverUniforms());
break;
}
@@ -519,9 +525,11 @@
break;
case gl::State::DIRTY_BIT_CULL_FACE_ENABLED:
case gl::State::DIRTY_BIT_CULL_FACE:
+ {
mPipelineDesc->updateCullMode(glState.getRasterizerState(),
- isViewportFlipEnabled());
+ isViewportFlipEnabledForDrawFBO());
break;
+ }
case gl::State::DIRTY_BIT_FRONT_FACE:
mPipelineDesc->updateFrontFace(glState.getRasterizerState());
break;
@@ -577,17 +585,18 @@
WARN() << "DIRTY_BIT_SHADER_DERIVATIVE_HINT unimplemented";
break;
case gl::State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING:
- WARN() << "DIRTY_BIT_READ_FRAMEBUFFER_BINDING unimplemented";
+ updateFlipViewportReadFramebuffer(context->getGLState());
break;
case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
{
+ updateFlipViewportDrawFramebuffer(context->getGLState());
FramebufferVk *framebufferVk = vk::GetImpl(glState.getDrawFramebuffer());
mPipelineDesc->updateViewport(framebufferVk, glState.getViewport(),
glState.getNearPlane(), glState.getFarPlane(),
- isViewportFlipEnabled());
+ isViewportFlipEnabledForDrawFBO());
updateColorMask(glState.getBlendState());
mPipelineDesc->updateCullMode(glState.getRasterizerState(),
- isViewportFlipEnabled());
+ isViewportFlipEnabledForDrawFBO());
updateScissor(glState);
break;
}
@@ -689,6 +698,24 @@
mFlipYForCurrentSurface =
drawSurface != nullptr && mRenderer->getFeatures().flipViewportY &&
!IsMaskFlagSet(drawSurface->getOrientation(), EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE);
+
+ const gl::State &glState = context->getGLState();
+ updateFlipViewportDrawFramebuffer(glState);
+ updateFlipViewportReadFramebuffer(glState);
+}
+
+void ContextVk::updateFlipViewportDrawFramebuffer(const gl::State &glState)
+{
+ gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer();
+ mFlipViewportForDrawFramebuffer =
+ drawFramebuffer->isDefault() && mRenderer->getFeatures().flipViewportY;
+}
+
+void ContextVk::updateFlipViewportReadFramebuffer(const gl::State &glState)
+{
+ gl::Framebuffer *readFramebuffer = glState.getReadFramebuffer();
+ mFlipViewportForReadFramebuffer =
+ readFramebuffer->isDefault() && mRenderer->getFeatures().flipViewportY;
}
gl::Caps ContextVk::getNativeCaps() const