VK error handling

This commit is contained in:
N00MKRAD
2024-01-23 23:16:54 +01:00
parent e8338f3159
commit 73dcbe619a

View File

@@ -26,26 +26,35 @@ namespace Flowframes.Os
{
var sw = new NmkdStopwatch();
VkDevices = new List<VkDevice>();
Instance vkInstance = new Instance(new InstanceCreateInfo());
PhysicalDevice[] physicalDevices = vkInstance.EnumeratePhysicalDevices();
for (int idx = 0; idx < physicalDevices.Length; idx++)
try
{
PhysicalDevice device = physicalDevices[idx];
Instance vkInstance = new Instance(new InstanceCreateInfo());
PhysicalDevice[] physicalDevices = vkInstance.EnumeratePhysicalDevices();
// Get queue families and find the one with Compute support but no Graphics support. This is the one that gives us the correct thread count to use for NCNN etc.
QueueFamilyProperties[] queueFamilies = device.GetQueueFamilyProperties();
var validQueueFamilies = queueFamilies.Where(q => q.QueueFlags.HasFlag(QueueFlags.Compute) && !q.QueueFlags.HasFlag(QueueFlags.Graphics));
int compQueues = validQueueFamilies.Any() ? (int)validQueueFamilies.First().QueueCount : 0;
for (int idx = 0; idx < physicalDevices.Length; idx++)
{
PhysicalDevice device = physicalDevices[idx];
string name = device.GetProperties().DeviceName;
VkDevices.Add(new VkDevice { Id = idx, Name = name, ComputeQueueCount = compQueues });
Logger.Log($"[VK] Found Vulkan device: {VkDevices.Last()}", true);
// Get queue families and find the one with Compute support but no Graphics support. This is the one that gives us the correct thread count to use for NCNN etc.
QueueFamilyProperties[] queueFamilies = device.GetQueueFamilyProperties();
var validQueueFamilies = queueFamilies.Where(q => q.QueueFlags.HasFlag(QueueFlags.Compute) && !q.QueueFlags.HasFlag(QueueFlags.Graphics));
int compQueues = validQueueFamilies.Any() ? (int)validQueueFamilies.First().QueueCount : 0;
string name = device.GetProperties().DeviceName;
VkDevices.Add(new VkDevice { Id = idx, Name = name, ComputeQueueCount = compQueues });
Logger.Log($"[VK] Found Vulkan device: {VkDevices.Last()}", true);
}
// Clean up Vulkan resources
vkInstance.Destroy();
Logger.Log($"[VK] Vulkan device check took {sw.ElapsedMs} ms", true);
}
catch(Exception ex)
{
Logger.Log($"Vulkan Error: {ex.Message}", true);
Logger.Log($"Vulkan initialization failed. NCNN implementations might not work, or run on the CPU.");
}
// Clean up Vulkan resources
vkInstance.Destroy();
Logger.Log($"[VK] Vulkan device check took {sw.ElapsedMs} ms", true);
}
public static int GetMaxNcnnThreads(int deviceId)