Vulkan: Implement scissor test and add a simple test for it

Bug: angleproject:2338

Change-Id: I699189fcd41feca1656c8553fdf4c1078421524d
Reviewed-on: https://chromium-review.googlesource.com/904861
Commit-Queue: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 835e058..cf6a62f 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -416,14 +416,34 @@
         switch (dirtyBit)
         {
             case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED:
-                WARN() << "DIRTY_BIT_SCISSOR_TEST_ENABLED unimplemented";
+                if (glState.isScissorTestEnabled())
+                {
+                    mPipelineDesc->updateScissor(glState.getScissor());
+                }
+                else
+                {
+                    mPipelineDesc->updateScissor(glState.getViewport());
+                }
                 break;
             case gl::State::DIRTY_BIT_SCISSOR:
-                WARN() << "DIRTY_BIT_SCISSOR unimplemented";
+                // Only modify the scissor region if the test is enabled, otherwise we want to keep
+                // the viewport size as the scissor region.
+                if (glState.isScissorTestEnabled())
+                {
+                    mPipelineDesc->updateScissor(glState.getScissor());
+                }
                 break;
             case gl::State::DIRTY_BIT_VIEWPORT:
                 mPipelineDesc->updateViewport(glState.getViewport(), glState.getNearPlane(),
                                               glState.getFarPlane());
+
+                // If the scissor test isn't enabled, we have to also update the scissor to
+                // be equal to the viewport to make sure we keep rendering everything in the
+                // viewport.
+                if (!glState.isScissorTestEnabled())
+                {
+                    mPipelineDesc->updateScissor(glState.getViewport());
+                }
                 break;
             case gl::State::DIRTY_BIT_DEPTH_RANGE:
                 WARN() << "DIRTY_BIT_DEPTH_RANGE unimplemented";