private unsafe void ReleaseDevice() { EmptyTexelBufferInt.Dispose(); EmptyTexelBufferInt = null; EmptyTexelBufferFloat.Dispose(); EmptyTexelBufferFloat = null; EmptyTexture.Dispose(); EmptyTexture = null; // Wait for all queues to be idle nativeDevice.WaitIdle(); // Destroy all remaining fences GetCompletedValue(); // Mark upload buffer for destruction if (nativeUploadBuffer != SharpVulkan.Buffer.Null) { NativeDevice.UnmapMemory(nativeUploadBufferMemory); nativeResourceCollector.Add(lastCompletedFence, nativeUploadBuffer); nativeResourceCollector.Add(lastCompletedFence, nativeUploadBufferMemory); nativeUploadBuffer = SharpVulkan.Buffer.Null; nativeUploadBufferMemory = DeviceMemory.Null; } // Release fenced resources nativeResourceCollector.Dispose(); DescriptorPools.Dispose(); nativeDevice.DestroyCommandPool(NativeCopyCommandPool); nativeDevice.Destroy(); }
private unsafe void ReleaseDevice() { EmptyTexelBufferInt.Dispose(); EmptyTexelBufferInt = null; EmptyTexelBufferFloat.Dispose(); EmptyTexelBufferFloat = null; EmptyTexture.Dispose(); EmptyTexture = null; // Wait for all queues to be idle vkDeviceWaitIdle(nativeDevice); // Destroy all remaining fences GetCompletedValue(); // Mark upload buffer for destruction if (nativeUploadBuffer != VkBuffer.Null) { vkUnmapMemory(NativeDevice, nativeUploadBufferMemory); nativeResourceCollector.Add(lastCompletedFence, nativeUploadBuffer); nativeResourceCollector.Add(lastCompletedFence, nativeUploadBufferMemory); nativeUploadBuffer = VkBuffer.Null; nativeUploadBufferMemory = VkDeviceMemory.Null; } // Release fenced resources nativeResourceCollector.Dispose(); DescriptorPools.Dispose(); foreach (var nativeCopyCommandPool in NativeCopyCommandPools.Values) { vkDestroyCommandPool(nativeDevice, nativeCopyCommandPool, null); } NativeCopyCommandPools.Dispose(); NativeCopyCommandPools = null; vkDestroyDevice(nativeDevice, null); }