void InitVulkanInstance() { instance = VulkanInitUtility.CreateInstance(true); cleanupStack.Push(() => { instance.Destroy(); instance = null; }); }
public static Device CreateDevice(PhysicalDevice physicalDevice, bool createDefaultQueue = true, bool includeCommonDebug = false) { IEnumerable <InitRequest> initRequest = null; if (includeCommonDebug) { initRequest = InitRequestCommonDebug; } DeviceCreateInfo deviceCreateInfo = VulkanInitUtility.CreateDeviceCreateInfo(physicalDevice, createDefaultQueue, initRequest); return(physicalDevice.CreateDevice(deviceCreateInfo)); }
void InitVulkanDevice() { physicalDevice = VulkanInitUtility.SelectPhysicalDevice(instance); device = VulkanInitUtility.CreateDevice(physicalDevice, true, true); mainQueue = device.GetQueue(0, 0); cleanupStack.Push(() => { mainQueue = null; device.Destroy(); device = null; physicalDevice = null; }); }
public static DeviceCreateInfo CreateDeviceCreateInfo(PhysicalDevice physicalDevice, bool createDefaultQueue, IEnumerable <InitRequest> initRequest = null) { string[] layers; string[] extentions; if (initRequest != null) { layers = GetDeviceExtention(physicalDevice, initRequest); extentions = GetDeviceExtention(physicalDevice, initRequest); } else { layers = new string[0]; extentions = new string[0]; } List <DeviceQueueCreateInfo> queus = new List <DeviceQueueCreateInfo>(); if (createDefaultQueue) { uint selectedQueue; // TODO : this needs to be a single step in order to correctly partition // TODO : on default we should look for a present queue if (VulkanInitUtility.TrySelectQueue(physicalDevice, QueueFlags.Compute | QueueFlags.Graphics | QueueFlags.Transfer, true, out selectedQueue)) { queus.Add(new DeviceQueueCreateInfo { QueueCount = 1, QueueFamilyIndex = selectedQueue, QueuePriorities = new float[] { 1.0f }, }); } ; } DeviceCreateInfo deviceCreateInfo = new DeviceCreateInfo { EnabledLayerNames = layers, EnabledExtensionNames = extentions, QueueCreateInfos = queus.ToArray(), }; return(deviceCreateInfo); }
void InitSwapChain() { surface = VulkanInitUtility.CreateSurface(instance, window); // TODO : try to use a linear format // TODO : dount just guest the queue surfaceFormat = Format.B8G8R8A8Unorm; surfaceSize = window.Size; if (!VulkanInitUtility.TryCreateSwapChain(instance, physicalDevice, device, surface, (uint)0, ref surfaceSize, surfaceFormat, ColorSpaceKhr.SrgbNonlinear, PresentModeKhr.Fifo, ref swapChain)) { throw new Exception("Failed to create swap chain"); } swapChainSemphore = device.CreateSemaphore(new SemaphoreCreateInfo { }); // create Images and Image Views swapchainImages = device.GetSwapchainImagesKHR(swapChain); swapchainImageViews = new ImageView[swapchainImages.Length]; int i = 0; foreach (Image image in swapchainImages) { ImageView view = device.CreateImageView(new ImageViewCreateInfo { Image = image, Format = surfaceFormat, ViewType = ImageViewType.View2D, Components = new ComponentMapping { R = ComponentSwizzle.Identity, G = ComponentSwizzle.Identity, B = ComponentSwizzle.Identity, A = ComponentSwizzle.Identity, }, SubresourceRange = new ImageSubresourceRange { AspectMask = ImageAspectFlags.Color, LayerCount = 1, LevelCount = 1, BaseMipLevel = 0, BaseArrayLayer = 0, }, }); swapchainImageViews[i] = view; i++; } cleanupStack.Push(() => { foreach (ImageView imageView in swapchainImageViews) { device.DestroyImageView(imageView); } device.DestroySemaphore(swapChainSemphore); swapChainSemphore = null; device.DestroySwapchainKHR(swapChain); swapChain = null; instance.DestroySurfaceKHR(surface); surface = null; }); }