private QueueFamilyIndices FindQueueFamilies(PhysicalDevice device) { QueueFamilyIndices indices = new QueueFamilyIndices(); var queueFamilies = device.GetQueueFamilyProperties(); for (uint index = 0; index < queueFamilies.Length && !indices.IsComplete; index++) { if (queueFamilies[index].QueueFlags.HasFlag(QueueFlags.Graphics)) { indices.GraphicsFamily = index; } if (device.GetSurfaceSupport(index, this.surface)) { indices.PresentFamily = index; } if (queueFamilies[index].QueueFlags.HasFlag(QueueFlags.Transfer) && !queueFamilies[index].QueueFlags.HasFlag(QueueFlags.Graphics)) { indices.TransferFamily = index; } } if (!indices.TransferFamily.HasValue) { indices.TransferFamily = indices.GraphicsFamily; } return(indices); }
private (uint, uint) FindQueueFamilies() { var queueFamilyProperties = PhysicalDevice.GetQueueFamilyProperties(); var graphicsFamily = queueFamilyProperties .Select((properties, index) => new { properties, index }) .SkipWhile(pair => !pair.properties.QueueFlags.HasFlag(QueueFlags.Graphics)) .FirstOrDefault(); if (graphicsFamily == null) { throw new Exception("Unable to find graphics queue"); } uint?presentFamily = default; for (uint i = 0; i < queueFamilyProperties.Length; ++i) { if (PhysicalDevice.GetSurfaceSupport(i, Surface)) { presentFamily = i; } } if (!presentFamily.HasValue) { throw new Exception("Unable to find present queue"); } return((uint)graphicsFamily.index, presentFamily.Value); }
public Queue CreateQueue(Surface surface) { var queueNodeIndex = _physicalDevice.QueueFamilyProperties. Where((properties, index) => (properties.QueueFlags & QueueFlags.Graphics) != 0 && _physicalDevice.GetSurfaceSupport((uint)index, surface)). Select((properties, index) => index).First(); return(_device.GetQueue(0, (uint)queueNodeIndex)); }
public static QueueFamilyIndices _FindQueueFamilies(PhysicalDevice device, Surface surface) { QueueFamilyIndices indices = new QueueFamilyIndices(); var queueFamilies = device.GetQueueFamilyProperties(); for (uint index = 0; index < queueFamilies.Length && !indices.IsComplete; index++) { if (queueFamilies[index].QueueFlags.HasFlag(QueueFlags.Graphics)) { indices.GraphicsFamily = index; } if (device.GetSurfaceSupport(index, surface)) { indices.PresentFamily = index; } } return(indices); }
protected virtual void CreateDevice() { uint queuePriorities = 0; var queueCreateInfo = new DeviceQueueCreateInfo { StructureType = StructureType.DeviceQueueCreateInfo, QueueFamilyIndex = 0, QueueCount = 1, QueuePriorities = new IntPtr(&queuePriorities) }; var enabledLayerNames = new[] { Marshal.StringToHGlobalAnsi("VK_LAYER_LUNARG_standard_validation"), }; var enabledExtensionNames = new[] { Marshal.StringToHGlobalAnsi("VK_KHR_swapchain"), }; try { fixed(void *enabledLayerNamesPointer = &enabledLayerNames[0]) fixed(void *enabledExtensionNamesPointer = &enabledExtensionNames[0]) { var enabledFeatures = new PhysicalDeviceFeatures { ShaderClipDistance = true, }; var deviceCreateInfo = new DeviceCreateInfo { StructureType = StructureType.DeviceCreateInfo, QueueCreateInfoCount = 1, QueueCreateInfos = new IntPtr(&queueCreateInfo), EnabledExtensionCount = (uint)enabledExtensionNames.Length, EnabledExtensionNames = new IntPtr(enabledExtensionNamesPointer), EnabledFeatures = new IntPtr(&enabledFeatures) }; if (validate) { deviceCreateInfo.EnabledLayerCount = (uint)enabledLayerNames.Length; deviceCreateInfo.EnabledLayerNames = new IntPtr(enabledLayerNamesPointer); } device = physicalDevice.CreateDevice(ref deviceCreateInfo); } } finally { foreach (var enabledExtensionName in enabledExtensionNames) { Marshal.FreeHGlobal(enabledExtensionName); } foreach (var enabledLayerName in enabledLayerNames) { Marshal.FreeHGlobal(enabledLayerName); } } var queueNodeIndex = physicalDevice.QueueFamilyProperties. Where((properties, index) => (properties.QueueFlags & QueueFlags.Graphics) != 0 && physicalDevice.GetSurfaceSupport((uint)index, surface)). Select((properties, index) => index).First(); queue = device.GetQueue(0, (uint)queueNodeIndex); }