Example #1
0
            void InitVulkanInstance()
            {
                instance = VulkanInitUtility.CreateInstance(true);

                cleanupStack.Push(() => {
                    instance.Destroy();
                    instance = null;
                });
            }
Example #2
0
        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));
        }
Example #3
0
            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;
                });
            }
Example #4
0
        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);
        }
Example #5
0
            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;
                });
            }