Vulkan: Support Texture redefinition.

Because initializing the texture can queue a copy from a staging
vk::Image, we must ensure we're not in a render pass. To make this
easier we move the current render pass tracking into the RendererVk
from the FramebufferVk class. (Note: in the future we will have
deferred command submission and this will become unnecessary.)

BUG=angleproject:2200

Change-Id: Ide8d4d70b50efbd79bbfa7006ad75cbc57cdf4c7
Reviewed-on: https://chromium-review.googlesource.com/741549
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index c868ce9..cd9013b 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -81,20 +81,12 @@
 }
 
 FramebufferVk::FramebufferVk(const gl::FramebufferState &state)
-    : FramebufferImpl(state),
-      mBackbuffer(nullptr),
-      mRenderPass(),
-      mFramebuffer(),
-      mInRenderPass(false)
+    : FramebufferImpl(state), mBackbuffer(nullptr), mRenderPass(), mFramebuffer()
 {
 }
 
 FramebufferVk::FramebufferVk(const gl::FramebufferState &state, WindowSurfaceVk *backbuffer)
-    : FramebufferImpl(state),
-      mBackbuffer(backbuffer),
-      mRenderPass(),
-      mFramebuffer(),
-      mInRenderPass(false)
+    : FramebufferImpl(state), mBackbuffer(backbuffer), mRenderPass(), mFramebuffer()
 {
 }
 
@@ -104,10 +96,9 @@
 
 void FramebufferVk::destroy(const gl::Context *context)
 {
-    ASSERT(!mInRenderPass);
-
     VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
 
+    // TODO(jmadill): Deferred deletion.
     mRenderPass.destroy(device);
     mFramebuffer.destroy(device);
 }
@@ -290,7 +281,7 @@
     ANGLE_TRY(contextVk->getStartedCommandBuffer(&commandBuffer));
 
     // End render pass if we're in one.
-    endRenderPass(commandBuffer);
+    renderer->endRenderPass();
 
     stagingImage.getImage().changeLayoutTop(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL,
                                             commandBuffer);
@@ -557,19 +548,11 @@
     return gl::InternalError() << "getSamplePosition is unimplemented.";
 }
 
-gl::Error FramebufferVk::ensureInRenderPass(const gl::Context *context,
-                                            VkDevice device,
-                                            vk::CommandBuffer *commandBuffer,
-                                            Serial queueSerial,
-                                            const gl::State &glState)
+gl::Error FramebufferVk::beginRenderPass(const gl::Context *context,
+                                         VkDevice device,
+                                         vk::CommandBuffer *commandBuffer,
+                                         Serial queueSerial)
 {
-    if (mInRenderPass)
-    {
-        return gl::NoError();
-    }
-
-    mInRenderPass = true;
-
     // TODO(jmadill): Cache render targets.
     for (const auto &colorAttachment : mState.getColorAttachments())
     {
@@ -598,6 +581,7 @@
     ASSERT(renderPass && renderPass->valid());
 
     // TODO(jmadill): Proper clear value implementation.
+    const gl::State &glState = context->getGLState();
     VkClearColorValue colorClear;
     memset(&colorClear, 0, sizeof(VkClearColorValue));
     colorClear.float32[0] = glState.getColorClearValue().red;
@@ -627,13 +611,4 @@
     return gl::NoError();
 }
 
-void FramebufferVk::endRenderPass(vk::CommandBuffer *commandBuffer)
-{
-    if (mInRenderPass)
-    {
-        commandBuffer->endRenderPass();
-        mInRenderPass = false;
-    }
-}
-
 }  // namespace rx