/// <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); }
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); }
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); }