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