コード例 #1
0
        /// <summary>
        ///     VulkanSharp provides no way to make a SurfaceKhr given a pointer
        ///     to one, so there was no way to use GLFW's Vulkan compatibility
        ///     surface creation.
        ///
        ///     The solution is this awful thing.
        /// </summary>
        public static Vk.SurfaceKhr CreateSurfaceFromHandle(IntPtr handle)
        {
            Type surfaceType = typeof(Vk.SurfaceKhr);

            Vk.SurfaceKhr surface     = (Vk.SurfaceKhr)FormatterServices.GetUninitializedObject(surfaceType);
            FieldInfo     handleField = surfaceType.GetField("m", BindingFlags.FlattenHierarchy |
                                                             BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            handleField.SetValue(surface, (ulong)handle.ToInt64());
            return(surface);
        }
コード例 #2
0
        public static SwapchainSupportDetails QuerySwapchainSupport(Vk.PhysicalDevice device, Vk.SurfaceKhr surface)
        {
            SwapchainSupportDetails support = new SwapchainSupportDetails();

            support.capabilities = device.GetSurfaceCapabilitiesKHR(surface);
            support.formats      = device.GetSurfaceFormatsKHR(surface);
            support.presentModes = device.GetSurfacePresentModesKHR(surface);

            return(support);
        }
コード例 #3
0
        public static bool CheckPhysicalDeviceQueueFamilySupport(Vk.PhysicalDevice device,
                                                                 Vk.QueueFlags flags, Vk.SurfaceKhr surface, out QueueFamilyIndices queueFamilies)
        {
            Vk.QueueFamilyProperties[] props = device.GetQueueFamilyProperties();
            queueFamilies = new QueueFamilyIndices();

            for (uint i = 0; i < props.Length; i++)
            {
                Vk.QueueFamilyProperties family = props[i];
                if (family.QueueCount > 0)
                {
                    if (family.QueueFlags.HasFlag(flags))
                    {
                        queueFamilies.GraphicsFamily = i;
                    }

                    if (device.GetSurfaceSupportKHR(i, surface))
                    {
                        queueFamilies.PresentFamily = i;
                    }

                    if (queueFamilies.AllFamiliesExist())
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }