Vulkan: Add RenderTargetVk::getImageForRead.

This helper method will also transition the Image to the correct read
layout. We will need to revisit the implementation when working on
simulatenous read.

Bug: angleproject:2539
Change-Id: Id61404460f3ef0dbb054e6ac2dfc0b59adb78402
Reviewed-on: https://chromium-review.googlesource.com/1108378
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index e879569..e5f2873 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -110,7 +110,6 @@
 {
     ContextVk *contextVk = vk::GetImpl(context);
     RendererVk *renderer = contextVk->getRenderer();
-    Serial currentSerial = renderer->getCurrentQueueSerial();
 
     // This command buffer is only started once.
     vk::CommandBuffer *commandBuffer = nullptr;
@@ -180,7 +179,7 @@
         const angle::Format &format          = renderTarget->getImageFormat().textureFormat();
         const VkImageAspectFlags aspectFlags = vk::GetDepthStencilAspectFlags(format);
 
-        vk::ImageHelper *image       = renderTarget->getImageForWrite(currentSerial, this);
+        vk::ImageHelper *image = renderTarget->getImageForWrite(this);
         image->clearDepthStencil(aspectFlags, clearDepthStencilValue, commandBuffer);
     }
 
@@ -214,7 +213,7 @@
         }
 
         ASSERT(colorRenderTarget);
-        vk::ImageHelper *image = colorRenderTarget->getImageForWrite(currentSerial, this);
+        vk::ImageHelper *image = colorRenderTarget->getImageForWrite(this);
         GLint mipLevelToClear  = (attachment->type() == GL_TEXTURE) ? attachment->mipLevel() : 0;
         image->clearColor(modifiedClearColorValue, mipLevelToClear, 1, commandBuffer);
     }
@@ -797,9 +796,8 @@
     RenderTargetVk *renderTarget = getColorReadRenderTarget();
 
     // Note that although we're reading from the image, we need to update the layout below.
-    // TODO(jmadill): Clearify read/write semantics. http://anglebug.com/2539
-    vk::ImageHelper *srcImage =
-        renderTarget->getImageForWrite(renderer->getCurrentQueueSerial(), this);
+    vk::ImageHelper *srcImage = renderTarget->getImageForRead(
+        this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT, commandBuffer);
 
     const angle::Format &angleFormat = srcImage->getFormat().textureFormat();
     VkBuffer bufferHandle            = VK_NULL_HANDLE;
@@ -826,10 +824,6 @@
     region.imageSubresource.layerCount     = 1;
     region.imageSubresource.mipLevel       = 0;
 
-    srcImage->changeLayoutWithStages(
-        VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
-        VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, commandBuffer);
-
     commandBuffer->copyImageToBuffer(srcImage->getImage(), srcImage->getCurrentLayout(),
                                      bufferHandle, 1, &region);