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
{