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); }
private unsafe void CreateLogicalDevice() { QueueFamilyIndices indices = FindQueueFamilies(_physicalDevice); uint[] uniqueQueueFamilies = new[] { indices.GraphicsFamily.Value, indices.PresentFamily.Value }; var queueCreateInfos = stackalloc DeviceQueueCreateInfo[uniqueQueueFamilies.Length]; float queuePriority = 1.0f; for (int i = 0; i < uniqueQueueFamilies.Length; i++) { uint queueFamily = uniqueQueueFamilies[i]; var queueCreateInfo = new DeviceQueueCreateInfo { SType = StructureType.DeviceQueueCreateInfo, QueueFamilyIndex = queueFamily, QueueCount = 1, PQueuePriorities = &queuePriority }; queueCreateInfos[i] = queueCreateInfo; } var deviceFeatures = new PhysicalDeviceFeatures(); var createInfo = new DeviceCreateInfo { SType = StructureType.DeviceCreateInfo, PQueueCreateInfos = queueCreateInfos, QueueCreateInfoCount = (uint)uniqueQueueFamilies.Length, PEnabledFeatures = &deviceFeatures, EnabledExtensionCount = 0 }; if (EnableValidationLayers) { createInfo.EnabledLayerCount = (uint)_validationLayers.Length; createInfo.PpEnabledLayerNames = (byte **)SilkMarshal.MarshalStringArrayToPtr(_validationLayers); } else { createInfo.EnabledLayerCount = 0; } fixed(Device *device = &_device) { Result result = _vk.CreateDevice(_physicalDevice, &createInfo, (AllocationCallbacks *)null, device); if (result != Result.Success) { throw new Exception("Failed to create logical device!"); } } fixed(Queue *graphicsQueue = &_graphicsQueue) { _vk.GetDeviceQueue(_device, indices.GraphicsFamily.Value, 0, graphicsQueue); } fixed(Queue *presentQueue = &_presentQueue) { _vk.GetDeviceQueue(_device, indices.PresentFamily.Value, 0, presentQueue); } }
private unsafe bool IsDeviceSuitable(PhysicalDevice device) { QueueFamilyIndices indices = FindQueueFamilies(device); return(indices.IsComplete); }