public DeviceBuilder WithQueueFamily(VkQueueFlag preferredFlags, VkQueueFlag requiredFlags, Func <PhysicalDevice, uint, bool> preferredPred, Func <PhysicalDevice, uint, bool> requiredPred, params float[] priorities) { var family = _physicalDevice.FindQueueFamily(preferredFlags, requiredFlags, preferredPred, requiredPred); _queueInfo.Add(new Device.QueueCreateInfo(family, priorities)); return(this); }
/// <summary> /// Finds all queue families with the given options /// </summary> /// <param name="flags">Require these options</param> /// <param name="pred">Predicate that is required to be true, or null to ignore</param> /// <returns>the queue family indices</returns> public IEnumerable <uint> FindQueueFamilies(VkQueueFlag flags, Func <PhysicalDevice, uint, bool> pred = null) { var queues = Handle.GetQueueFamilyProperties(); for (var i = 0; i < queues.Length; i++) { if ((queues[i].QueueFlags & flags) == flags && (pred == null || pred.Invoke(this, (uint)i))) { yield return((uint)i); } } }
public DeviceBuilder WithQueueFamily(VkQueueFlag preferredFlags, VkQueueFlag requiredFlags, params float[] priorities) { return(WithQueueFamily(preferredFlags, requiredFlags, null, null, priorities)); }
/// <summary> /// Finds the queue family index with the given options /// </summary> /// <param name="preferredFlags">Prefer to have these options</param> /// <param name="requiredFlags">Require these options</param> /// <param name="preferredPred">Predicate that is preferred to be true, or null to ignore</param> /// <param name="requiredPred">Predicate that is required to be true, or null to ignore</param> /// <returns>the queue family index</returns> /// <exception cref="NotSupportedException">no such queue family exists</exception> public uint FindQueueFamily(VkQueueFlag preferredFlags, VkQueueFlag requiredFlags, Func <PhysicalDevice, uint, bool> preferredPred = null, Func <PhysicalDevice, uint, bool> requiredPred = null) { uint BitDelta(VkQueueFlag a, VkQueueFlag b) { var score = 0u; for (uint j = 1; j < Math.Max((uint)a, (uint)b); j <<= 1) { var flag = (VkQueueFlag)j; if ((a & flag) != (b & flag)) { score++; } } return(score); } var queues = Handle.GetQueueFamilyProperties(); var both = preferredFlags | requiredFlags; uint bestQueue = uint.MaxValue; uint bestScore = uint.MaxValue; for (var i = 0; i < queues.Length; i++) { if ((queues[i].QueueFlags & both) == both && (preferredPred == null || preferredPred.Invoke(this, (uint)i)) && (requiredPred == null || requiredPred.Invoke(this, (uint)i))) { var score = BitDelta(queues[i].QueueFlags, both); if (score >= bestScore) { continue; } bestQueue = (uint)i; bestScore = score; } } if (bestQueue != uint.MaxValue) { return(bestQueue); } for (var i = 0; i < queues.Length; i++) { if ((queues[i].QueueFlags & requiredFlags) == requiredFlags && (requiredPred == null || requiredPred.Invoke(this, (uint)i))) { var score = BitDelta(queues[i].QueueFlags, requiredFlags); if (score >= bestScore) { continue; } bestQueue = (uint)i; bestScore = score; } } if (bestQueue != uint.MaxValue) { return(bestQueue); } throw new NotSupportedException($"Queue family with flags {requiredFlags} isn't supported"); }