private unsafe QueueFamilyIndices FindQueueFamilies(PhysicalDevice device) { var indices = new QueueFamilyIndices(); uint queueFamilyCount = 0; _vk.GetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, (QueueFamilyProperties *)null); QueueFamilyProperties *queueFamilies = stackalloc QueueFamilyProperties[(int)queueFamilyCount]; _vk.GetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies); for (uint i = 0; i < queueFamilyCount; i++) { QueueFamilyProperties queueFamily = queueFamilies[i]; if (queueFamily.QueueFlags.HasFlag(QueueFlags.QueueGraphicsBit)) { indices.GraphicsFamily = i; } _vkSurface.GetPhysicalDeviceSurfaceSupport(device, i, _surface, out Bool32 presentSupport); if (presentSupport == Vk.True) { indices.PresentFamily = i; } if (indices.IsComplete) { break; } } return(indices); }
/// <summary> /// Reports properties of the queues of the specified physical device. /// </summary> public QueueFamilyProperties[] GetQueueFamilyProperties() { unsafe { try { QueueFamilyProperties[] result = default(QueueFamilyProperties[]); uint queueFamilyPropertyCount; QueueFamilyProperties *marshalledQueueFamilyProperties = null; Interop.Commands.vkGetPhysicalDeviceQueueFamilyProperties(this.handle, &queueFamilyPropertyCount, null); marshalledQueueFamilyProperties = (QueueFamilyProperties *)Interop.HeapUtil.Allocate <QueueFamilyProperties>((uint)queueFamilyPropertyCount); Interop.Commands.vkGetPhysicalDeviceQueueFamilyProperties(this.handle, &queueFamilyPropertyCount, marshalledQueueFamilyProperties); result = new QueueFamilyProperties[(uint)queueFamilyPropertyCount]; for (int index = 0; index < (uint)queueFamilyPropertyCount; index++) { result[index] = marshalledQueueFamilyProperties[index]; } return(result); } finally { Interop.HeapUtil.FreeLog(); } } }
public static extern unsafe void vkGetPhysicalDeviceQueueFamilyProperties(IntPtr physicalDevice, uint *pQueueFamilyPropertyCount, QueueFamilyProperties *pQueueFamilyProperties);
internal static unsafe extern void vkGetPhysicalDeviceQueueFamilyProperties(PhysicalDevice physicalDevice, out UInt32 *QueueFamilyPropertyCount, QueueFamilyProperties *QueueFamilyProperties);
internal static unsafe extern void vkGetPhysicalDeviceQueueFamilyProperties(IntPtr physicalDevice, UInt32 *pQueueFamilyPropertyCount, QueueFamilyProperties *pQueueFamilyProperties);