void CreateInstance() { //LayerProperties[] available_layers = DelegateUtility.EnumerateToArray<LayerProperties> ( vk.EnumerateInstanceLayerProperties ); ExtensionProperties[] available_extensions = DelegateUtility.EnumerateToArray <ExtensionProperties> (vk.EnumerateInstanceExtensionProperties, IntPtr.Zero); List <string> extensions = new List <string> { KhrWin32Surface.EXTENSION_NAME, KhrSurface.EXTENSION_NAME }; for (int i = 0; i < extensions.Count; ++i) { if (!CheckExtensionAvailability(extensions[i], available_extensions)) { //std::cout << "Could not find instance extension named \"" << extensions[i] << "\"!" << std::endl; return; } } if (CheckExtensionAvailability(ExtDebugReport.EXTENSION_NAME, available_extensions)) { extensions.Add(ExtDebugReport.EXTENSION_NAME); supportDebugReport = true; } var exPtr = MarshalUtility.AllocateString(extensions); ApplicationInfo application_info = new ApplicationInfo { sType = StructureType.ApplicationInfo, pNext = IntPtr.Zero, pApplicationName = (byte *)Marshal.StringToHGlobalAnsi("Vulkan Window"), applicationVersion = new Version(1, 0, 0), pEngineName = (byte *)Marshal.StringToHGlobalAnsi("Vulkan Tutorial"), engineVersion = new Version(1, 0, 0), apiVersion = new Version(1, 0, 0), }; InstanceCreateInfo instance_create_info = new InstanceCreateInfo { sType = StructureType.InstanceCreateInfo, pNext = IntPtr.Zero, flags = 0, pApplicationInfo = &application_info, enabledLayerCount = 0, ppEnabledLayerNames = (byte *)0, enabledExtensionCount = (uint)extensions.Count, ppEnabledExtensionNames = (byte *)exPtr, }; vk.CreateInstance(ref instance_create_info, (AllocationCallbacks *)0, out vulkan.Instance).CheckError(); MarshalUtility.FreeString(exPtr, extensions.Count); Marshal.FreeHGlobal((IntPtr)application_info.pApplicationName); Marshal.FreeHGlobal((IntPtr)application_info.pEngineName); }
void CreateDevice() { PhysicalDevice[] physical_devices = DelegateUtility.EnumerateToArray <PhysicalDevice> (vk.EnumeratePhysicalDevices, (IntPtr)vulkan.Instance); if (physical_devices == null) { //std::cout << "Error occurred during physical devices enumeration!" << std::endl; return; } uint selected_graphics_queue_family_index = uint.MaxValue; uint selected_present_queue_family_index = uint.MaxValue; for (int i = 0; i < physical_devices.Length; ++i) { if (CheckPhysicalDeviceProperties(physical_devices[i], out selected_graphics_queue_family_index, out selected_present_queue_family_index)) { vulkan.PhysicalDevice = physical_devices[i]; } } if (vulkan.PhysicalDevice.IsZero || selected_graphics_queue_family_index == uint.MaxValue || selected_present_queue_family_index == uint.MaxValue) { //std::cout << "Could not select physical device based on the chosen properties!" << std::endl; return; } var queue_create_infos = stackalloc DeviceQueueCreateInfo[2]; uint count = 1; float *queue_priorities = stackalloc float[1]; queue_priorities[0] = 1.0f; queue_create_infos[0] = new DeviceQueueCreateInfo { sType = StructureType.DeviceQueueCreateInfo, // VkStructureType sType pNext = IntPtr.Zero, // const void *pNext flags = 0, // VkDeviceQueueCreateFlagBits flags queueFamilyIndex = selected_graphics_queue_family_index, // uint32_t queueFamilyIndex queueCount = 1, // uint32_t queueCount pQueuePriorities = queue_priorities // const float *pQueuePriorities }; if (selected_graphics_queue_family_index != selected_present_queue_family_index) { queue_create_infos[1] = new DeviceQueueCreateInfo { sType = StructureType.DeviceQueueCreateInfo, // VkStructureType sType pNext = IntPtr.Zero, // const void *pNext flags = 0, // VkDeviceQueueCreateFlagBits flags queueFamilyIndex = selected_present_queue_family_index, // uint32_t queueFamilyIndex queueCount = 1, // uint32_t queueCount pQueuePriorities = queue_priorities // const float *pQueuePriorities }; count++; } const uint exCount = 1; var exPtr = MarshalUtility.AllocateString(new string[] { KhrSwapchain.EXTENSION_NAME }); DeviceCreateInfo device_create_info = new DeviceCreateInfo { sType = StructureType.DeviceCreateInfo, // VkStructureType sType pNext = IntPtr.Zero, // const void *pNext flags = 0, // VkDeviceCreateFlagBits flags queueCreateInfoCount = count, // uint32_t queueCreateInfoCount pQueueCreateInfos = queue_create_infos, // const VkDeviceQueueCreateInfo *pQueueCreateInfos enabledLayerCount = 0, // uint32_t enabledLayerCount ppEnabledLayerNames = (byte *)0, // const char * const *ppEnabledLayerNames enabledExtensionCount = exCount, // uint32_t enabledExtensionCount ppEnabledExtensionNames = (byte *)exPtr, // const char * const *ppEnabledExtensionNames pEnabledFeatures = (PhysicalDeviceFeatures *)0 // const VkPhysicalDeviceFeatures *pEnabledFeatures }; vk.CreateDevice(vulkan.PhysicalDevice, ref device_create_info, (AllocationCallbacks *)0, out vulkan.Device).CheckError(); MarshalUtility.FreeString(exPtr, (int)exCount); }