Vulkan: Fix circular dependency with resource updates.

The old implementation would try to keep recording draw commands to
the same framebuffer write operation even if the vertex array buffer
data changed. This would lead to a broken dependency graph. Fix this
by forcing any current render operations to create a new node in this
case, giving a correct command graph.

Old design:

- render (creates a CommandBufferNode A)
- update buffer (creates a CommandBufferNode B which happens after A)
- render (to CommandBuffer A, and gives a circular dependency with B)

New design

- render (CommandBufferNode A)
- update buffer (CommandBufferNode B, happens after A)
- render (CommandBufferNode C, happens after B)

This also renames some methods to try to clarify them.

Bug: angleproject:2350

Change-Id: I6559bed4ed3f58f68771662422c5bef6a505282b
Reviewed-on: https://chromium-review.googlesource.com/907416
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index b12ab24..60c05ff 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -153,7 +153,7 @@
     RendererVk *renderer = vk::GetImpl(context)->getRenderer();
 
     vk::CommandBuffer *commandBuffer = nullptr;
-    ANGLE_TRY(recordWriteCommands(renderer, &commandBuffer));
+    ANGLE_TRY(beginWriteOperation(renderer, &commandBuffer));
 
     Serial currentSerial = renderer->getCurrentQueueSerial();
 
@@ -164,7 +164,8 @@
             RenderTargetVk *renderTarget = nullptr;
             ANGLE_TRY(colorAttachment.getRenderTarget(context, &renderTarget));
 
-            renderTarget->resource->setWriteNode(getCurrentWriteNode(currentSerial), currentSerial);
+            renderTarget->resource->onWriteResource(getCurrentWriteOperation(currentSerial),
+                                                    currentSerial);
 
             renderTarget->image->changeLayoutWithStages(
                 VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
@@ -267,7 +268,7 @@
                                 renderTarget->extents, vk::StagingUsage::Read));
 
     vk::CommandBuffer *commandBuffer = nullptr;
-    ANGLE_TRY(recordWriteCommands(renderer, &commandBuffer));
+    ANGLE_TRY(beginWriteOperation(renderer, &commandBuffer));
 
     stagingImage.getImage().changeLayoutTop(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL,
                                             commandBuffer);
@@ -478,9 +479,9 @@
     RendererVk *renderer = contextVk->getRenderer();
     Serial currentSerial = renderer->getCurrentQueueSerial();
 
-    if (isCurrentlyRecording(currentSerial) && mLastRenderNodeSerial == currentSerial)
+    if (hasCurrentWriteOperation(currentSerial) && mLastRenderNodeSerial == currentSerial)
     {
-        *nodeOut = getCurrentWriteNode(currentSerial);
+        *nodeOut = getCurrentWriteOperation(currentSerial);
         ASSERT((*nodeOut)->getInsideRenderPassCommands()->valid());
         return gl::NoError();
     }