private void createLogicalDevice() { QueueFamilyIndices indices = findQueueFamilies(physicalDevice); List <VkDeviceQueueCreateInfo> queueCreateInfos = new List <VkDeviceQueueCreateInfo>(); HashSet <int> uniqueQueueFamilies = new HashSet <int>() { indices.graphicsFamily, indices.presentFamily }; float[] queuePriorities = new float[] { 1.0f }; foreach (var queueFamily in uniqueQueueFamilies) { VkDeviceQueueCreateInfo queueCreateInfo = new VkDeviceQueueCreateInfo(); queueCreateInfo.sType = VkStructureType.VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; queueCreateInfo.queueFamilyIndex = queueFamily; queueCreateInfo.queueCount = 1; queueCreateInfo.pQueuePriorities = queuePriorities; queueCreateInfos.Add(queueCreateInfo); } VkPhysicalDeviceFeatures deviceFeatures = new VkPhysicalDeviceFeatures(); VkDeviceCreateInfo createInfo = new VkDeviceCreateInfo(); createInfo.sType = VkStructureType.VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; createInfo.queueCreateInfoCount = queueCreateInfos.Count; createInfo.pQueueCreateInfos = queueCreateInfos.ToArray(); createInfo.pEnabledFeatures = new VkPhysicalDeviceFeatures[] { deviceFeatures }; createInfo.enabledExtensionCount = deviceExtensions.Length; createInfo.ppEnabledExtensionNames = deviceExtensions; if (enableValidationLayers) { createInfo.enabledLayerCount = validationLayers.Length; createInfo.ppEnabledLayerNames = validationLayers; } else { createInfo.enabledLayerCount = 0; } VkResult result = Vulkan.vkCreateDevice(physicalDevice, createInfo, null, out device); if (result != VkResult.VK_SUCCESS) { throw Program.Throw("failed to create logical device!", result); } Vulkan.vkGetDeviceQueue(device, indices.graphicsFamily, 0, out graphicsQueue); Vulkan.vkGetDeviceQueue(device, indices.presentFamily, 0, out presentQueue); }