void CreateDevice() { var features = new Native <VkPhysicalDeviceFeatures>(); VK.GetPhysicalDeviceFeatures(physicalDevice, features.Address); HashSet <uint> uniqueIndices = new HashSet <uint> { graphicsIndex, presentIndex }; var queueInfos = new NativeArray <VkDeviceQueueCreateInfo>(uniqueIndices.Count); var priorities = new Native <float>(1); int i = 0; foreach (var ind in uniqueIndices) { var queueInfo = new VkDeviceQueueCreateInfo(); queueInfo.sType = CSGL.Vulkan.VkStructureType.DeviceQueueCreateInfo; queueInfo.queueFamilyIndex = ind; queueInfo.queueCount = 1; queueInfo.pQueuePriorities = priorities.Address; queueInfos[i] = queueInfo; i++; } var info = new VkDeviceCreateInfo(); info.sType = CSGL.Vulkan.VkStructureType.DeviceCreateInfo; info.pQueueCreateInfos = queueInfos.Address; info.queueCreateInfoCount = (uint)uniqueIndices.Count; info.pEnabledFeatures = features.Address; var extensionsNative = new NativeStringArray(deviceExtensions); info.ppEnabledExtensionNames = extensionsNative.Address; info.enabledExtensionCount = (uint)deviceExtensions.Length; var result = VK.CreateDevice(physicalDevice, ref info, alloc, out device); VK.GetDeviceQueue(device, graphicsIndex, 0, out graphicsQueue); VK.GetDeviceQueue(device, presentIndex, 0, out presentQueue); features.Dispose(); priorities.Dispose(); queueInfos.Dispose(); extensionsNative.Dispose(); }