Vulkan: Implement command re-ordering.

This introduces a new CommandBufferNode class. Nodes are linked
together to form a graph based on their dependencies. When the app
triggers a readback or swap, the graph is flushed entirely. This
sends the queued ANGLE Vulkan work to the Vulkan queue which is
then processed on the GPU with the right dependencies.

This design allows us to save on some unnecessary RenderPass creation
and also allows us to know what load/store ops to use. It also allows
us to take advantage of the Vulkan automatic RenderPass transitions
for performance. Load/Store ops and automatic transitions will be
implemented in later patches.

Bug: angleproject:2264
Change-Id: I0e729c719e38254202c6fedcede4e63125eb4810
Reviewed-on: https://chromium-review.googlesource.com/780849
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.cpp b/src/libANGLE/renderer/vulkan/TextureVk.cpp
index 8fea0ac..1239775 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.cpp
+++ b/src/libANGLE/renderer/vulkan/TextureVk.cpp
@@ -177,7 +177,6 @@
     mRenderTarget.resource  = this;
 
     // Handle initial data.
-    // TODO(jmadill): Consider re-using staging texture.
     if (pixels)
     {
         ANGLE_TRY(setSubImageImpl(contextVk, formatInfo, unpack, type, pixels));
@@ -258,13 +257,8 @@
 
     stagingImage.getDeviceMemory().unmap(device);
 
-    vk::CommandBufferAndState *commandBuffer = nullptr;
-    ANGLE_TRY(contextVk->getStartedCommandBuffer(&commandBuffer));
-    setQueueSerial(renderer->getCurrentQueueSerial());
-
-    // Ensure we aren't in a render pass.
-    // TODO(jmadill): Command reordering.
-    renderer->endRenderPass();
+    vk::CommandBuffer *commandBuffer = nullptr;
+    ANGLE_TRY(recordWriteCommands(renderer, &commandBuffer));
 
     stagingImage.getImage().changeLayoutWithStages(
         VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
@@ -277,7 +271,8 @@
     commandBuffer->copySingleImage(stagingImage.getImage(), mImage, wholeRegion,
                                    VK_IMAGE_ASPECT_COLOR_BIT);
 
-    // TODO(jmadill): Re-use staging images.
+    // Immediately release staging image.
+    // TODO(jmadill): Staging image re-use.
     renderer->releaseObject(renderer->getCurrentQueueSerial(), &stagingImage);
     return gl::NoError();
 }