Implement disconnect function for GrVkGpu
Apparently this was not added to Vk when it was added to GL. It may be
the cause of a flutter error they are seeing.
Bug: skia:
Change-Id: I4d4e9d1817b308b6c4f01e83f712eb3437e2ad71
Reviewed-on: https://skia-review.googlesource.com/15887
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Jim Van Verth <jvanverth@google.com>
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index c271133..23c7094 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -97,7 +97,8 @@
: INHERITED(context)
, fDevice(backendCtx->fDevice)
, fQueue(backendCtx->fQueue)
- , fResourceProvider(this) {
+ , fResourceProvider(this)
+ , fDisconnected(false) {
fBackendContext.reset(backendCtx);
#ifdef SK_ENABLE_VK_LAYERS
@@ -157,9 +158,11 @@
fHeaps[kCopyWriteBuffer_Heap].reset(new GrVkHeap(this, GrVkHeap::kSubAlloc_Strategy, 16*1024*1024));
}
-GrVkGpu::~GrVkGpu() {
- fCurrentCmdBuffer->end(this);
- fCurrentCmdBuffer->unref(this);
+void GrVkGpu::destroyResources() {
+ if (fCurrentCmdBuffer) {
+ fCurrentCmdBuffer->end(this);
+ fCurrentCmdBuffer->unref(this);
+ }
// wait for all commands to finish
fResourceProvider.checkCommandBuffers();
@@ -193,16 +196,49 @@
// must call this just before we destroy the command pool and VkDevice
fResourceProvider.destroyResources(VK_ERROR_DEVICE_LOST == res);
- VK_CALL(DestroyCommandPool(fDevice, fCmdPool, nullptr));
-
- delete fCompiler;
+ if (fCmdPool != VK_NULL_HANDLE) {
+ VK_CALL(DestroyCommandPool(fDevice, fCmdPool, nullptr));
+ }
#ifdef SK_ENABLE_VK_LAYERS
if (fCallback) {
VK_CALL(DestroyDebugReportCallbackEXT(fBackendContext->fInstance, fCallback, nullptr));
- fCallback = VK_NULL_HANDLE;
}
#endif
+
+}
+
+GrVkGpu::~GrVkGpu() {
+ if (!fDisconnected) {
+ this->destroyResources();
+ }
+ delete fCompiler;
+}
+
+
+void GrVkGpu::disconnect(DisconnectType type) {
+ INHERITED::disconnect(type);
+ if (!fDisconnected) {
+ if (DisconnectType::kCleanup == type) {
+ this->destroyResources();
+ } else {
+ fCurrentCmdBuffer->unrefAndAbandon();
+ for (int i = 0; i < fSemaphoresToWaitOn.count(); ++i) {
+ fSemaphoresToWaitOn[i]->unrefAndAbandon();
+ }
+ fCopyManager.abandonResources();
+
+ // must call this just before we destroy the command pool and VkDevice
+ fResourceProvider.abandonResources();
+ }
+ fSemaphoresToWaitOn.reset();
+#ifdef SK_ENABLE_VK_LAYERS
+ fCallback = VK_NULL_HANDLE;
+#endif
+ fCurrentCmdBuffer = nullptr;
+ fCmdPool = VK_NULL_HANDLE;
+ fDisconnected = true;
+ }
}
///////////////////////////////////////////////////////////////////////////////