Vulkan: Handle VK_ERROR_DEVICE_LOST

By notifying egl::Display that the device is lost,
which marks all gl::Context as lost,
turning all future GL commands to no-ops.

Also clear CommandGraph and destroy in flight resources,
making sure no more commands are executed on the lost device.

Bug: angleproject:2657

Change-Id: I3a1e3646c8ebb37faff507a3c5cec7582a7e05fc
Reviewed-on: https://chromium-review.googlesource.com/c/1323849
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Yuly Novikov <ynovikov@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/CommandGraph.cpp b/src/libANGLE/renderer/vulkan/CommandGraph.cpp
index b1d9ad1..658560e 100644
--- a/src/libANGLE/renderer/vulkan/CommandGraph.cpp
+++ b/src/libANGLE/renderer/vulkan/CommandGraph.cpp
@@ -650,8 +650,6 @@
             previousBarrier, &mNodes[previousBarrierIndex + 1], afterNodesCount);
     }
 
-    mLastBarrierIndex = kInvalidNodeIndex;
-
     VkCommandBufferAllocateInfo primaryInfo = {};
     primaryInfo.sType                       = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
     primaryInfo.commandPool                 = commandPool->getHandle();
@@ -715,12 +713,7 @@
 
     ANGLE_VK_TRY(context, primaryCommandBufferOut->end());
 
-    // TODO(jmadill): Use pool allocation so we don't need to deallocate command graph.
-    for (CommandGraphNode *node : mNodes)
-    {
-        delete node;
-    }
-    mNodes.clear();
+    clear();
 
     return angle::Result::Continue();
 }
@@ -730,6 +723,18 @@
     return mNodes.empty();
 }
 
+void CommandGraph::clear()
+{
+    mLastBarrierIndex = kInvalidNodeIndex;
+
+    // TODO(jmadill): Use pool allocator for performance. http://anglebug.com/2951
+    for (CommandGraphNode *node : mNodes)
+    {
+        delete node;
+    }
+    mNodes.clear();
+}
+
 // Dumps the command graph into a dot file that works with graphviz.
 void CommandGraph::dumpGraphDotFile(std::ostream &out) const
 {